view libgui/src/documentation.h @ 31619:ad014fc78bd6

use individual local gui_settings objects Previously, we created a single gui_settings object (derived from QSettings) and accessed it from the resource_manager object. That design is not necessary and is not the way QSettings was designed to be used. Instead of managing a single object, we should be using individual QSettings objects where needed. Each individual QSettings object manages thread-safe access to a single global collection of settings. The Qt docs say that operations on QSettings are not thread safe, but that means that you can't create a QSettings object in one thread and use it in another without some locking. I'm not sure whether we were doing that correctly, but with this change it no longer matters. Each QSettings object does perform locking when reading or writing the underlying global data. * resource-manager.h, resource-manager.cc (resource_manager::m_settings): Delete data member. (resource_manager::get_settings): Delete. * annotation-dialog.cc, QTerminal.cc, QTerminal.h, command-widget.cc, command-widget.h, community-news.cc, dialog.cc, documentation-bookmarks.cc, documentation-bookmarks.h, documentation-dock-widget.cc, documentation-dock-widget.h, documentation.cc, documentation.h, dw-main-window.cc, dw-main-window.h, external-editor-interface.cc, files-dock-widget.cc, files-dock-widget.h, find-files-dialog.cc, history-dock-widget.cc, history-dock-widget.h, file-editor-interface.h, file-editor-tab.cc, file-editor-tab.h, file-editor.cc, file-editor.h, find-dialog.cc, octave-qscintilla.cc, main-window.cc, main-window.h, news-reader.cc, octave-dock-widget.cc, octave-dock-widget.h, qt-interpreter-events.cc, qt-interpreter-events.h, release-notes.cc, resource-manager.cc, resource-manager.h, set-path-dialog.cc, settings-dialog.cc, settings-dialog.h, shortcut-manager.cc, shortcut-manager.h, terminal-dock-widget.cc, terminal-dock-widget.h, variable-editor.cc, variable-editor.h, welcome-wizard.cc, workspace-model.cc, workspace-model.h, workspace-view.cc: Use local gui_settings objects instead of accessing a pointer to a single gui_settings object owned by the resource_manager object.
author John W. Eaton <jwe@octave.org>
date Fri, 02 Dec 2022 14:23:53 -0500
parents 796f54d4ddbf
children 431f80aba37a
line wrap: on
line source

////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2018-2022 The Octave Project Developers
//
// See the file COPYRIGHT.md in the top-level directory of this
// distribution or <https://octave.org/copyright/>.
//
// 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 <QMenu>
#include <QShortcut>
#include <QSplitter>
#include <QTextBrowser>
#include <QToolBar>
#include <QListWidget>
#include <QToolButton>
#include <QWidget>
#include <QtHelp/QHelpEngine>

namespace octave
{
  class base_qobject;
  class documentation;
  class documentation_bookmarks;

  //! Documentation browser derived from Textbrowser

  class documentation_browser : public QTextBrowser
  {
    Q_OBJECT

  public:

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

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

  public slots:

    void handle_index_clicked (const QUrl& url,
                               const QString& keyword = QString ());
    void notice_settings (void);
    void save_settings (void);

    //! Zooming in and out while taking care of the zoom level
    //!@{
    void zoom_in (void);
    void zoom_out (void);
    void zoom_original (void);
    //!@}

  protected:

    void wheelEvent (QWheelEvent *we);

  private:

    QHelpEngine *m_help_engine;

    //! Store the current zoom level
    int m_zoom_level;

    //! Minimal and maximal zoom level avoiding calling
    //! zoom_in and zoom_out without actually zooming but
    //! with changing the stored zoom level
    enum
    {
      min_zoom_level = -5,
      max_zoom_level = 10
    };
  };


  //! The documentation main class derived from QSplitter

  class documentation : public QSplitter
  {
    Q_OBJECT

  public:

    documentation (QWidget *parent, base_qobject& oct_qobj);
    ~documentation (void);

    /*!
        Generate a string with page name @p title and current anchor
        from @p url for using in prev/next or bookmarks menu:

          @param title current title of the page as QString
          @param url   current url  as QUrl

          @return QString "title: anchor"
    */
    QString title_and_anchor (const QString& title, const QUrl& url);

  signals:

    void show_single_result (const QUrl&);

  public slots:

    void notice_settings (void);
    void save_settings (void);

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

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

  private slots:

    void activate_find (void);
    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 (bool backward = false);
    void find_backward (void);
    void find_forward_from_anchor (const QString& text);
    void record_anchor_position (void);
    void handle_cursor_position_change (void);
    void handle_search_result_clicked (const QUrl& url);

    void update_history_menus (void);
    void open_hist_url (QAction *a);

  private:

    void construct_tool_bar (void);
    QAction * add_action (const QIcon& icon, const QString& text,
                          const char *member, QWidget *receiver = nullptr,
                          QToolBar *tool_bar = nullptr);
    void update_history (int new_count, QAction **actions);

    //! Select all occurrences of a string in the doc browser
    void select_all_occurrences (const QString& text);

    base_qobject& m_octave_qobj;

    QHelpEngine *m_help_engine;
    QString m_internal_search;
    documentation_browser *m_doc_browser;
    documentation_bookmarks *m_bookmarks;
    QLineEdit *m_find_line_edit;
    int m_search_anchor_position;
    QComboBox *m_filter;
    QString m_collection;

    QWidget *m_doc_widget;
    QToolBar *m_tool_bar;
    QString m_query_string;

    bool m_indexed;
    QString m_current_ref_name;

    QAction *m_action_go_home;
    QAction *m_action_go_prev;
    QAction *m_action_go_next;
    QMenu *m_prev_pages_menu;
    QMenu *m_next_pages_menu;
    int m_prev_pages_count;
    int m_next_pages_count;

    enum { max_history_entries = 10 };
    QAction *m_prev_pages_actions[max_history_entries];
    QAction *m_next_pages_actions[max_history_entries];

    QAction *m_action_bookmark;

    QAction *m_action_find;
    QShortcut *m_findnext_shortcut;
    QShortcut *m_findprev_shortcut;

    QAction *m_action_zoom_in;
    QAction *m_action_zoom_out;
    QAction *m_action_zoom_original;
  };

}

#endif