]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
PyEditor: implement Find/Replace feature V8_3_asterstudy_v0.8.3
authorvsr <vsr@opencascade.com>
Tue, 13 Jun 2017 06:37:06 +0000 (09:37 +0300)
committervsr <vsr@opencascade.com>
Tue, 13 Jun 2017 08:40:15 +0000 (11:40 +0300)
- Show Find and Replace items in popup menu
+ Export set/get settings in PyEditor_Widget class
+ Properly handle <Escape> key press event
+ Export set / get font preference option into Python API (SalomePyQt)
+ Change shortcuts for File/Preferences and File/Properties actions

14 files changed:
src/LightApp/LightApp_Application.cxx
src/PyViewer/PyViewer_ViewWindow.cxx
src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx
src/SALOME_PYQT/SalomePyQt/SalomePyQt.h
src/SALOME_PYQT/SalomePyQt/SalomePyQt.sip
src/SalomeApp/SalomeApp_Application.cxx
tools/PyEditor/src/PyEditor_Editor.cxx
tools/PyEditor/src/PyEditor_Editor.h
tools/PyEditor/src/PyEditor_FindTool.cxx
tools/PyEditor/src/PyEditor_FindTool.h
tools/PyEditor/src/PyEditor_Widget.cxx
tools/PyEditor/src/PyEditor_Widget.h
tools/PyEditor/src/PyEditor_Window.cxx
tools/PyEditor/src/python/PyEditorPy.sip

index 1005ae4f4b87f9c9fc2da90fbcafb1991976bdd0..5f71544ba55aa5175d8563210696522916a1064a 100644 (file)
@@ -586,7 +586,7 @@ void LightApp_Application::createActions()
   // Preferences
   createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
                 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
-                Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
+                Qt::CTRL+Qt::Key_P, desk, false, this, SLOT( onPreferences() ) );
 
   // Help menu:
 
index a9e6c79c2a040c9690c827ecd7595f818f9f0b92..bb8320a115edd60f71b1087ac67f2c3c52096119 100644 (file)
@@ -190,7 +190,7 @@ PyViewer_ViewWindow::PyViewer_ViewWindow( SUIT_Desktop* desktop ) :
                           resMgr->loadPixmap( "PyViewer", tr( "ICON_REPLACE" ) ),
                           tr( "ACT_REPLACE" ), 0, this );
   action->setStatusTip( tr( "DSC_REPLACE" ) );
-  action->setShortcut( QKeySequence::Replace );
+  action->setShortcuts( QList<QKeySequence>() << QKeySequence( "Ctrl+H" ) << QKeySequence( QKeySequence::Replace ) );
   action->setShortcutContext( Qt::WidgetShortcut );
   connect( action, SIGNAL( triggered( bool ) ), myEditor, SLOT( replace() ) );
   toolMgr()->registerAction( action, ReplaceId );
index 699ce585fe5122057558b27bed50a58d235c49e7..04074001c49a9dfe05d0d07a5d7c38b8f74576c1 100644 (file)
@@ -1398,6 +1398,34 @@ void SalomePyQt::addSetting( const QString& section, const QString& name, const
   ProcessVoidEvent( new TEvent( section, name, value ) );
 }
 
+/*!
+  \brief Add font setting to the application preferences.
+  \param section resources file section name 
+  \param name setting name
+  \param value new setting value
+*/
+void SalomePyQt::addSetting( const QString& section, const QString& name, const QFont& value )
+{
+  class TEvent: public SALOME_Event 
+  {
+    QString    mySection;
+    QString    myName;
+    QFont      myValue;
+  public:
+    TEvent( const QString& section, const QString& name, const QFont& value ) 
+      : mySection( section ), myName( name ), myValue( value ) {}
+    virtual void Execute() 
+    {
+      if ( SUIT_Session::session() ) {
+        SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+        if ( !mySection.isEmpty() && !myName.isEmpty() )
+          resMgr->setValue( mySection, myName, myValue );
+      }
+    }
+  };
+  ProcessVoidEvent( new TEvent( section, name, value ) );
+}
+
 /*!
   \fn int SalomePyQt::integerSetting( const QString& section, 
                                       const QString& name, 
@@ -1574,7 +1602,7 @@ QColor SalomePyQt::colorSetting ( const QString& section, const QString& name, c
 /*!
   \fn QByteArray SalomePyQt::byteArraySetting( const QString& section, 
                                                const QString& name, 
-                                               const QByteArray def );
+                                               const QByteArray& def );
   \brief Get byte array setting from the application preferences.
   \param section resources file section name 
   \param name setting name
@@ -1605,6 +1633,40 @@ QByteArray SalomePyQt::byteArraySetting ( const QString& section, const QString&
   return ProcessEvent( new TGetByteArraySettingEvent( section, name, def ) );
 }
 
+/*!
+  \fn QByteArray SalomePyQt::fontSetting( const QString& section, 
+                                          const QString& name, 
+                                          const QFont& def );
+  \brief Get font setting from the application preferences.
+  \param section resources file section name 
+  \param name setting name
+  \param def default value which is returned if the setting is not found
+  \return setting value
+*/
+
+class TGetFontSettingEvent: public SALOME_Event 
+{
+public:
+  typedef QFont TResult;
+  TResult myResult;
+  QString mySection;
+  QString myName;
+  TResult myDefault;
+  TGetFontSettingEvent( const QString& section, const QString& name, const QFont& def ) 
+    : mySection( section ), myName( name ), myDefault( def ) {}
+  virtual void Execute() 
+  {
+    if ( SUIT_Session::session() ) {
+      SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+      myResult = ( !mySection.isEmpty() && !myName.isEmpty() ) ? resMgr->fontValue( mySection, myName, myDefault ) : myDefault;
+    }
+  }
+};
+QFont SalomePyQt::fontSetting ( const QString& section, const QString& name, const QFont& def )
+{
+  return ProcessEvent( new TGetFontSettingEvent( section, name, def ) );
+}
+
 /*!
   \brief Remove setting from the application preferences.
   \param section resources file section name 
index a64b01e897527e70aaa2049c7c76440ec33fad1a..201e1b315a8f9de7a15bf87c79947ceca27dee2e 100644 (file)
@@ -275,12 +275,14 @@ public:
   static void              addSetting    ( const QString&, const QString&, const QString& );
   static void              addSetting    ( const QString&, const QString&, const QColor& );
   static void              addSetting    ( const QString&, const QString&, const QByteArray& );
+  static void              addSetting    ( const QString&, const QString&, const QFont& );
   static int               integerSetting( const QString&, const QString&, const int = 0 );
   static double            doubleSetting ( const QString&, const QString&, const double = 0 );
   static bool              boolSetting   ( const QString&, const QString&, const bool = 0 );
   static QString           stringSetting ( const QString&, const QString&, const QString& = QString(""), const bool = true );
   static QColor            colorSetting  ( const QString&, const QString&, const QColor& = QColor() );
   static QByteArray        byteArraySetting( const QString&, const QString&, const QByteArray& = QByteArray() );
+  static QFont             fontSetting( const QString&, const QString&, const QFont& = QFont() );
   static void              removeSetting ( const QString&, const QString& );
   static bool              hasSetting    ( const QString&, const QString& );
   static QStringList       parameters    ( const QString& );
index ca70e94c574d53085f758500c7bd885902332afd..e684602e5e2aeba5399b6b8cbc7ea6287b6bb033 100644 (file)
@@ -388,12 +388,14 @@ public:
   static void              addSetting    ( const QString&, const QString&, const QString& ) /ReleaseGIL/ ;
   static void              addSetting    ( const QString&, const QString&, const QColor& ) /ReleaseGIL/ ;
   static void              addSetting    ( const QString&, const QString&, const QByteArray& ) /ReleaseGIL/ ;
+  static void              addSetting    ( const QString&, const QString&, const QFont& ) /ReleaseGIL/ ;
   static int               integerSetting( const QString&, const QString&, const int = 0 ) /ReleaseGIL/ ;
   static double            doubleSetting ( const QString&, const QString&, const double = 0 ) /ReleaseGIL/ ;
   static bool              boolSetting   ( const QString&, const QString&, const bool = false ) /ReleaseGIL/ ;
   static QString           stringSetting ( const QString&, const QString&, const QString& = QString(""), const bool = true ) /ReleaseGIL/ ;
   static QColor            colorSetting  ( const QString&, const QString&, const QColor& = QColor() ) /ReleaseGIL/ ;
   static QByteArray        byteArraySetting( const QString&, const QString&, const QByteArray& = QByteArray() ) /ReleaseGIL/ ;
+  static QFont             fontSetting( const QString&, const QString&, const QFont& = QFont() ) /ReleaseGIL/ ;
   static void              removeSetting ( const QString&, const QString& ) /ReleaseGIL/ ;
   static bool              hasSetting    ( const QString&, const QString& ) /ReleaseGIL/ ;
   static QStringList       parameters    ( const QString& ) /ReleaseGIL/ ;
index 12a733584f9f9a98abad23a815311544ccee5f4e..95c0e878b0d6869688e76da003da25b1ef5a4c93 100644 (file)
@@ -320,7 +320,7 @@ void SalomeApp_Application::createActions()
   //! Properties
   createAction( PropertiesId, tr( "TOT_DESK_PROPERTIES" ), QIcon(),
                 tr( "MEN_DESK_PROPERTIES" ), tr( "PRP_DESK_PROPERTIES" ),
-                Qt::CTRL+Qt::Key_P, desk, false, this, SLOT( onProperties() ) );
+                0, desk, false, this, SLOT( onProperties() ) );
 
   //! Catalog Generator
   createAction( CatalogGenId, tr( "TOT_DESK_CATALOG_GENERATOR" ),  QIcon(),
index 6fe34f1960928ee616d6aa81d686922843803007..7e62c6f7bf2205c8b8170a35baff3a9a9c58d02c 100644 (file)
@@ -27,6 +27,7 @@
 #include "PyEditor_Settings.h"
 #include "PyEditor_Keywords.h"
 
+#include <QMenu>
 #include <QPainter>
 #include <QTextBlock>
 
@@ -355,6 +356,14 @@ void PyEditor_Editor::paintEvent( QPaintEvent* event )
   }
 }
 
+void PyEditor_Editor::contextMenuEvent( QContextMenuEvent* event )
+{
+  QMenu* menu = createStandardContextMenu();
+  emit customizeMenu( menu );
+  menu->exec( event->globalPos() );
+  delete menu;
+}
+
 /*!
   \brief Indent and tab text.
   \param isShift flag defines reverse tab direction
index d37c1a86056da70e36382c2ea4b9278727ff4b44..8ec6883667b78d8dc66b3797d5f3de399eb3b391 100644 (file)
@@ -31,6 +31,7 @@
 class PyEditor_Keywords;
 class PyEditor_Completer;
 class PyEditor_PyHighlighter;
+class QMenu;
 
 class PYEDITOR_EXPORT PyEditor_Editor : public QPlainTextEdit
 {
@@ -63,6 +64,7 @@ protected:
   virtual void keyPressEvent( QKeyEvent* );
   virtual void resizeEvent( QResizeEvent* );
   virtual void paintEvent( QPaintEvent* );
+  virtual void contextMenuEvent( QContextMenuEvent* );
 
   PyEditor_Keywords* userKeywords() const;
   PyEditor_Keywords* standardKeywords() const;
@@ -74,6 +76,9 @@ private Q_SLOTS:
   void updateLineNumberAreaWidth( int );
   void updateLineNumberArea( const QRect&, int );
   
+Q_SIGNALS:
+  void customizeMenu( QMenu* );
+
 private:
   bool matchLeftParenthesis( const QTextBlock&, int, int );
   bool matchRightParenthesis( const QTextBlock&, int, int );
index b91000ab17bb6d2a1462fc1ab7b8682a8bbdfb65..0e41bfe65efa455bc7f51168951398830d371c62 100644 (file)
@@ -110,10 +110,10 @@ PyEditor_FindTool::PyEditor_FindTool( PyEditor_Editor* editor, QWidget* parent )
   addAction( new QAction( tr( "CASE_SENSITIVE_CHECK" ), this ) );
   addAction( new QAction( tr( "WHOLE_WORDS_CHECK" ), this ) );
   addAction( new QAction( tr( "REGEX_CHECK" ), this ) );
-  addAction( new QAction( tr( "Find" ), this ) );
+  addAction( new QAction( QIcon( ":/images/py_find.png" ), tr( "Find" ), this ) );
   addAction( new QAction( tr( "FindPrevious" ), this ) );
   addAction( new QAction( tr( "FindNext" ), this ) );
-  addAction( new QAction( tr( "Replace" ), this ) );
+  addAction( new QAction( QIcon( ":/images/py_replace.png" ), tr( "Replace" ), this ) );
 
   foreach ( QAction* action, actions().mid( CaseSensitive, RegExp+1 ) )
   {
@@ -135,6 +135,7 @@ PyEditor_FindTool::PyEditor_FindTool( PyEditor_Editor* editor, QWidget* parent )
   }
 
   myEditor->installEventFilter( this );
+  connect( myEditor, SIGNAL( customizeMenu( QMenu* ) ), this, SLOT( customizeMenu( QMenu* ) ) );
 
   hide();
 }
@@ -221,7 +222,10 @@ bool PyEditor_FindTool::eventFilter( QObject* o, QEvent* e )
       {
       case Qt::Key_Escape:
         if ( isVisible() )
+        {
           hide();
+          return true;
+        }
         break;
       default:
         break;
@@ -239,6 +243,16 @@ void PyEditor_FindTool::activateFind()
   activate( Find );
 }
 
+/*!
+  \brief Customize menu for editor.
+*/
+void PyEditor_FindTool::customizeMenu( QMenu* menu )
+{
+  menu->addSeparator();
+  menu->addAction( actions()[Find] );
+  menu->addAction( actions()[Replace] );
+}
+
 /*!
   \brief Slot: activate 'Replace' dialog.
 */
@@ -406,8 +420,8 @@ QList<QKeySequence> PyEditor_FindTool::shortcuts( int action ) const
     bindings << QKeySequence( QKeySequence::FindNext );
     break;
   case Replace:
-    bindings << QKeySequence( QKeySequence::Replace );
     bindings << QKeySequence( "Ctrl+H" );
+    bindings << QKeySequence( QKeySequence::Replace );
     break;
   default:
     break;
index e6501700e85e917e2e3607fbcd4d730ff4c2c661..2eab236ecdd63c1bbe9a3d9c53caa8441850642a 100644 (file)
@@ -33,6 +33,7 @@ class PyEditor_Editor;
 class QAction;
 class QLabel;
 class QLineEdit;
+class QMenu;
 
 class PYEDITOR_EXPORT PyEditor_FindTool : public QWidget
 {
@@ -60,6 +61,7 @@ private slots:
   void replaceAll();
   void update();
   void activate( int );
+  void customizeMenu( QMenu* );
 
 private:
   QList<QKeySequence> shortcuts( int ) const;
index badf97329b7cbab284f9a7b7c51f79be67fca80a..58d4c285c6ab3df391fa3651c479e4fdacf4a649 100644 (file)
@@ -249,3 +249,21 @@ QString PyEditor_Widget::text() const
 {
   return myEditor->toPlainText();
 }
+
+/*!
+  \brief Set editor's settings.
+  \param settings Settings object.
+*/
+void PyEditor_Widget::setSettings( const PyEditor_Settings& settings )
+{
+  myEditor->setSettings( settings );
+}
+
+/*!
+  \brief Get editor's settings.
+  \return Settings object.
+*/
+const PyEditor_Settings& PyEditor_Widget::settings() const
+{
+  return myEditor->settings();
+}
index 0927a9fe8f8e4e7870e223f2b56415594a0901cf..f7ba959773adb48998441ea295893b44c070b8e1 100644 (file)
@@ -24,6 +24,7 @@
 #define PYEDITOR_WIDGET_H
 
 #include "PyEditor.h"
+#include "PyEditor_Settings.h"
 
 #include <QWidget>
 
@@ -40,6 +41,9 @@ public:
   PyEditor_Editor* editor();
   PyEditor_FindTool* findTool();
 
+  void setSettings( const PyEditor_Settings& );
+  const PyEditor_Settings& settings() const;
+
   bool isModified();
 
   QString text() const;
index 125a27b818a4e8f119166ea39adeabdc8fe4bde6..cfeebe2bdc60a7efdc203a49bde4034461851fbc 100644 (file)
@@ -197,7 +197,7 @@ PyEditor_Window::PyEditor_Window( QWidget* parent ) :
                         tr( "ACT_REPLACE" ), this );
   action->setToolTip( tr( "TTP_REPLACE" ) );
   action->setStatusTip( tr( "DSC_REPLACE" ) );
-  action->setShortcut( QKeySequence::Replace );
+  action->setShortcuts( QList<QKeySequence>() << QKeySequence( "Ctrl+H" ) << QKeySequence( QKeySequence::Replace ) );
   action->setShortcutContext( Qt::WidgetShortcut );
   connect( action, SIGNAL( triggered( bool ) ), myEditor, SLOT( replace() ) );
   myActions[ ReplaceId ] = action;
index d6b530be9ca28e79e624d1f9f9d843a0b467021b..854e7a86b54a01d9e70aea88f2febf7b3f02b807 100644 (file)
@@ -134,6 +134,9 @@ public:
   PyEditor_Editor* editor();
   PyEditor_FindTool* findTool();
 
+  void setSettings( const PyEditor_Settings& );
+  const PyEditor_Settings& settings() const;
+
   bool isModified();
 
   QString text() const;