changeset 25155:17387d4edd1d stable

Add standard key bindings and actions to in-page Documentation find (bug #53006) * documentation.cc (documentation::documentation): Connect m_doc_browser cursor position change signal to slot that records position. Connect m_find_line_edit text-edited signal to find_forward_from_anchor() to provide search-while-type. Replace QKeySequence "Ctrl+F" definition with Qt's pre-defined QKeySequence::Find. Change the context of the key press from Qt::WidgetWithChildrenShortcut to the broader Qt::WindowShortcut and rename the sequence show_shortcut. Connect show_shortcut object's activated() signal to parent widget's show() slot and to m_find_line_edit's selectAll() and setFocus() slots. Create a hide_shortcut QShortcut with QKeySequence "Escape" and connect its activated() signal to parent widget's hide() slot and m_doc_browser's setFocus() slot. Create a findnext_shortcut and connect its activated() signal to the documentation class's find_forward() slot. Create a findnext_shortcut and connect its activated() signal to the documentation class's find_backward() slot. Set m_search_anchor_position to zero. (documentation::find_forward): After doing the find operation, record the current "anchor" position of the QTextEdit's cursor position. (documentation::find_backward): Ditto. (documentation::toggle_hidden_find): Removed. (documentation::find_forward_from_anchor): Added. For search-while-type, set the QTextEdit's cursor position back to the anchor position before calling the find() routine and allow "undoing" the search-while-type. (documentation::record_anchor_position): Added. Record the QTextEdit cursor's current position. (documentation::handle_cursor_position_change): Added. Upon the QTextEdit's cursor change, call record_anchor_position() but only if that position change was due to user action within the window. * documentation.h (documentation:public QSplitter): Add new integer member variable m_search_anchor_position. (documentation::find_forward_from_anchor): Added. Slot declaration. (documentation::record_anchor_position): Ditto. (documentation::handle_cursor_position_change): Ditto.
author Daniel J Sebald <daniel.sebald@ieee.org>
date Thu, 05 Apr 2018 11:35:58 -0500
parents 7f9a6e04df31
children c578827b2eaf
files libgui/src/documentation.cc libgui/src/documentation.h
diffstat 2 files changed, 55 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/documentation.cc	Sat Apr 07 15:08:15 2018 -0700
+++ b/libgui/src/documentation.cc	Thu Apr 05 11:35:58 2018 -0500
@@ -98,12 +98,16 @@
     // The browser
     QWidget *browser_find = new QWidget (this);
     m_doc_browser = new documentation_browser (m_help_engine, browser_find);
+    connect (m_doc_browser, SIGNAL (cursorPositionChanged (void)),
+             this, SLOT(handle_cursor_position_change (void)));
 
     QWidget *find_footer = new QWidget (browser_find);
     QLabel *find_label = new QLabel (tr ("Find:"), find_footer);
     m_find_line_edit = new QLineEdit (find_footer);
     connect (m_find_line_edit, SIGNAL (returnPressed (void)),
              this, SLOT(find_forward (void)));
+    connect (m_find_line_edit, SIGNAL (textEdited (const QString&)),
+             this, SLOT(find_forward_from_anchor (const QString&)));
     QToolButton *forward_button = new QToolButton (find_footer);
     forward_button->setText (tr ("Search forward"));
     forward_button->setToolTip (tr ("Search forward"));
@@ -129,11 +133,30 @@
     v_box_browser_find->addWidget (find_footer);
     browser_find->setLayout (v_box_browser_find);
 
-    QShortcut *shortcut = new QShortcut(QKeySequence(tr("Ctrl+F")), browser_find);
-    shortcut->setContext(Qt::WidgetWithChildrenShortcut);
-    connect (shortcut, SIGNAL (activated (void)),
-             this, SLOT(toggle_hidden_find (void)));
+    QShortcut *show_shortcut = new QShortcut (QKeySequence (QKeySequence::Find), browser_find);
+    show_shortcut->setContext(Qt::WindowShortcut);
+    connect (show_shortcut, SIGNAL (activated (void)),
+             m_find_line_edit->parentWidget (), SLOT (show (void)));
+    connect (show_shortcut, SIGNAL (activated (void)),
+             m_find_line_edit, SLOT (selectAll (void)));
+    connect (show_shortcut, SIGNAL (activated (void)),
+             m_find_line_edit, SLOT (setFocus (void)));
+    QShortcut *hide_shortcut = new QShortcut (QKeySequence (tr ("Escape")), m_find_line_edit);
+    hide_shortcut->setContext(Qt::WindowShortcut);
+    connect (hide_shortcut, SIGNAL (activated (void)),
+             m_find_line_edit->parentWidget (), SLOT(hide (void)));
+    connect (hide_shortcut, SIGNAL (activated (void)),
+             m_doc_browser, SLOT (setFocus (void)));
+    QShortcut *findnext_shortcut = new QShortcut (QKeySequence (QKeySequence::FindNext), browser_find);
+    findnext_shortcut->setContext(Qt::WindowShortcut);
+    connect (findnext_shortcut, SIGNAL (activated (void)),
+             this, SLOT(find_forward (void)));
+    QShortcut *findprev_shortcut = new QShortcut (QKeySequence (QKeySequence::FindPrevious), browser_find);
+    findprev_shortcut->setContext(Qt::WindowShortcut);
+    connect (findprev_shortcut, SIGNAL (activated (void)),
+             this, SLOT(find_backward (void)));
     find_footer->hide ();
+    m_search_anchor_position = 0;
 
     // Layout contents, index and search
     QTabWidget *navi = new QTabWidget (this);
@@ -321,6 +344,7 @@
       return;
 
     m_doc_browser->find (m_find_line_edit->text ());
+    record_anchor_position ();
   }
 
   void documentation::find_backward (void)
@@ -329,19 +353,35 @@
       return;
 
     m_doc_browser->find (m_find_line_edit->text (), QTextDocument::FindBackward);
+    record_anchor_position ();
   }
 
-  void documentation::toggle_hidden_find (void)
+  void documentation::find_forward_from_anchor (const QString& text)
   {
     if (! m_help_engine)
       return;
 
-    m_find_line_edit->parentWidget ()->
-        setHidden (! m_find_line_edit->parentWidget ()->isHidden ());
-    if (m_find_line_edit->parentWidget ()->isHidden ())
-      m_doc_browser->setFocus ();
-    else
-      m_find_line_edit->setFocus ();
+    QTextCursor textcur = m_doc_browser->textCursor ();
+    textcur.setPosition (m_search_anchor_position);
+    m_doc_browser->setTextCursor (textcur);
+    m_doc_browser->find (text);
+  }
+
+  void documentation::record_anchor_position (void)
+  {
+    if (! m_help_engine)
+      return;
+
+    m_search_anchor_position = m_doc_browser->textCursor ().position ();
+  }
+
+  void documentation::handle_cursor_position_change (void)
+  {
+    if (! m_help_engine)
+      return;
+
+    if (m_doc_browser->hasFocus ())
+      record_anchor_position ();
   }
 
   void documentation::registerDoc (const QString& qch)
--- a/libgui/src/documentation.h	Sat Apr 07 15:08:15 2018 -0700
+++ b/libgui/src/documentation.h	Thu Apr 05 11:35:58 2018 -0500
@@ -88,13 +88,16 @@
     void filter_update_history (void);
     void find_forward (void);
     void find_backward (void);
-    void toggle_hidden_find (void);
+    void find_forward_from_anchor (const QString& text);
+    void record_anchor_position (void);
+    void handle_cursor_position_change (void);
 
   private:
 
     QHelpEngine *m_help_engine;
     documentation_browser *m_doc_browser;
     QLineEdit *m_find_line_edit;
+    int m_search_anchor_position;
     QComboBox *m_filter;
     QString m_collection;