view libgui/src/documentation.h @ 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 9578133ca03e
children 41bbdf17f51a
line wrap: on
line source

/*

Copyright (C) 2018 Torsten <mttl@maibox.org>

This file is part of Octave.

Octave is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Octave is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Octave; see the file COPYING.  If not, see
<https://www.gnu.org/licenses/>.

*/

#if ! defined (octave_documentation_h)
#define octave_documentation_h 1

#include <QComboBox>
#include <QWidget>
#include <QSettings>
#include <QSplitter>
#include <QTextBrowser>
#include <QtHelp/QHelpEngine>

namespace octave
{
  // The documentation browser
  class documentation_browser : public QTextBrowser
  {
    Q_OBJECT

  public:

    documentation_browser (QHelpEngine *help_engine, QWidget *parent = nullptr);
    ~documentation_browser (void);

    virtual QVariant loadResource (int type, const QUrl &url);

  public slots:

    void handle_index_clicked (const QUrl& url,
                               const QString& keyword = QString ());
    void notice_settings (const QSettings *settings);

  private:

    QHelpEngine *m_help_engine;

  };


  // The documentaiton main class (splitter)
  class documentation : public QSplitter
  {
    Q_OBJECT

  public:

    documentation (QWidget *parent = nullptr);
    ~documentation (void);

  public slots:

    void notice_settings (const QSettings *settings);

    void copyClipboard (void);
    void pasteClipboard (void);
    void selectAll (void);

    void load_ref (const QString & name);
    void registerDoc (const QString & name);
    void unregisterDoc (const QString & name);

  private slots:

    void global_search (void);
    void global_search_started (void);
    void global_search_finished (int hits);
    void filter_update (const QString& expression);
    void filter_update_history (void);
    void find_forward (void);
    void find_backward (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;

  };

}

#endif