From f4c390712ea835cc04a3da13b0fff59db66cf359 Mon Sep 17 00:00:00 2001 From: Guillaume Munch Date: Wed, 28 Sep 2016 21:33:44 +0200 Subject: [PATCH] New virtual method frontend::Dialog::on_BufferViewChanged() This is called anytime the buffer view attached to the GuiView changes. --- src/frontends/qt4/Dialog.h | 2 ++ src/frontends/qt4/DialogView.cpp | 51 +++++++++++++++++++++++++++++ src/frontends/qt4/DialogView.h | 28 +++++----------- src/frontends/qt4/DockView.cpp | 54 +++++++++++++++++++++++++++++++ src/frontends/qt4/DockView.h | 42 ++++++++---------------- src/frontends/qt4/GuiDialog.cpp | 3 ++ src/frontends/qt4/GuiDialog.h | 3 ++ src/frontends/qt4/GuiView.cpp | 35 ++++++++++---------- src/frontends/qt4/GuiView.h | 2 ++ src/frontends/qt4/GuiWorkArea.cpp | 1 + src/frontends/qt4/GuiWorkArea.h | 2 ++ src/frontends/qt4/Makefile.am | 6 ++-- 12 files changed, 161 insertions(+), 68 deletions(-) create mode 100644 src/frontends/qt4/DialogView.cpp create mode 100644 src/frontends/qt4/DockView.cpp diff --git a/src/frontends/qt4/Dialog.h b/src/frontends/qt4/Dialog.h index f3f9c1d474..bf4a313114 100644 --- a/src/frontends/qt4/Dialog.h +++ b/src/frontends/qt4/Dialog.h @@ -264,6 +264,8 @@ protected: void setTitle(QString const & title) { title_ = title; } /// virtual void apply(); + /// To be called when the buffer view has changed + virtual void on_bufferViewChanged() = 0; private: /** The Dialog's name is the means by which a dialog identifies diff --git a/src/frontends/qt4/DialogView.cpp b/src/frontends/qt4/DialogView.cpp new file mode 100644 index 0000000000..7b9ee9c503 --- /dev/null +++ b/src/frontends/qt4/DialogView.cpp @@ -0,0 +1,51 @@ +// -*- C++ -*- +/** + * \file DialogView.cpp + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Abdelrazak Younes + * + * Full author contact details are available in file CREDITS. + */ + +#include + +#include "DialogView.h" + + +namespace lyx { +namespace frontend { + +DialogView::DialogView(GuiView & lv, QString const & name, QString const & title) + : QDialog(&lv), Dialog(lv, name, "LyX: " + title) +{ + connect(&lv, SIGNAL(bufferViewChanged()), + this, SLOT(on_bufferViewChanged())); + + // remove question marks from Windows dialogs + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +} + + +void DialogView::closeEvent(QCloseEvent * ev) +{ + clearParams(); + Dialog::disconnect(); + ev->accept(); +} + + +void DialogView::hideEvent(QHideEvent * ev) +{ + if (!ev->spontaneous()) { + clearParams(); + Dialog::disconnect(); + ev->accept(); + } +} + +} // namespace frontend +} // namespace lyx + +#include "moc_DialogView.cpp" diff --git a/src/frontends/qt4/DialogView.h b/src/frontends/qt4/DialogView.h index 520a1e8979..180bcb1082 100644 --- a/src/frontends/qt4/DialogView.h +++ b/src/frontends/qt4/DialogView.h @@ -23,17 +23,14 @@ namespace frontend { class DialogView : public QDialog, public Dialog { + Q_OBJECT + public: /// \param lv is the access point for the dialog to the LyX kernel. /// \param name is the identifier given to the dialog by its parent /// container. /// \param title is the window title used for decoration. - DialogView(GuiView & lv, QString const & name, QString const & title) - : QDialog(&lv), Dialog(lv, name, "LyX: " + title) - { - // remove question marks from Windows dialogs - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); - } + DialogView(GuiView & lv, QString const & name, QString const & title); virtual QWidget * asQWidget() { return this; } virtual QWidget const * asQWidget() const { return this; } @@ -47,21 +44,12 @@ protected: bool needBufferOpen() const { return isBufferDependent(); } //@} /// Any dialog that overrides this method should make sure to call it. - void closeEvent(QCloseEvent * ev) - { - clearParams(); - Dialog::disconnect(); - ev->accept(); - } + void closeEvent(QCloseEvent * ev); /// Any dialog that overrides this method should make sure to call it. - void hideEvent(QHideEvent * ev) - { - if (!ev->spontaneous()) { - clearParams(); - Dialog::disconnect(); - ev->accept(); - } - } + void hideEvent(QHideEvent * ev); + +protected Q_SLOTS: + void on_bufferViewChanged() {}; }; } // namespace frontend diff --git a/src/frontends/qt4/DockView.cpp b/src/frontends/qt4/DockView.cpp new file mode 100644 index 0000000000..ea385eece7 --- /dev/null +++ b/src/frontends/qt4/DockView.cpp @@ -0,0 +1,54 @@ +// -*- C++ -*- +/** + * \file DockView.cpp + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Abdelrazak Younes + * + * Full author contact details are available in file CREDITS. + */ + +#include + +#include "DockView.h" + + +namespace lyx { +namespace frontend { + + +DockView::DockView(GuiView & parent, QString const & name, + QString const & title, Qt::DockWidgetArea area, + Qt::WindowFlags flags) + : QDockWidget(&parent, flags), Dialog(parent, name, title) +{ + setObjectName(name); + parent.addDockWidget(area, this); + hide(); + connect(&parent, SIGNAL(bufferViewChanged()), + this, SLOT(on_bufferViewChanged())); +} + + +void DockView::keyPressEvent(QKeyEvent * ev) +{ + if (ev->key() == Qt::Key_Escape) { + QMainWindow * mw = static_cast(parent()); + if (!mw) { + ev->ignore(); + return; + } + mw->activateWindow(); + mw->setFocus(); + if (isFloating()) + hide(); + ev->accept(); + } +} + + +} // frontend +} // lyx + +#include "moc_DockView.cpp" diff --git a/src/frontends/qt4/DockView.h b/src/frontends/qt4/DockView.h index d71b75b0fc..3c5f764522 100644 --- a/src/frontends/qt4/DockView.h +++ b/src/frontends/qt4/DockView.h @@ -29,20 +29,16 @@ namespace frontend { **/ class DockView : public QDockWidget, public Dialog { + Q_OBJECT + public: - DockView( - GuiView & parent, ///< the main window where to dock. - QString const & name, ///< dialog identifier. - QString const & title, ///< dialog title. - Qt::DockWidgetArea area = Qt::LeftDockWidgetArea, ///< Position of the dock (and also drawer) - Qt::WindowFlags flags = 0 - ) - : QDockWidget(&parent, flags), Dialog(parent, name, title) - { - setObjectName(name); - parent.addDockWidget(area, this); - hide(); - } + DockView(GuiView & parent, ///< the main window where to dock. + QString const & name, ///< dialog identifier. + QString const & title, ///< dialog title. + Qt::DockWidgetArea area = Qt::LeftDockWidgetArea, ///< Position of + ///the dock (and + ///also drawer) + Qt::WindowFlags flags = 0); virtual ~DockView() {} @@ -52,27 +48,17 @@ public: /// We don't want to restore geometry session for dock widgets. void restoreSession() {} - void keyPressEvent(QKeyEvent * ev) - { - if (ev->key() == Qt::Key_Escape) { - QMainWindow * mw = static_cast(parent()); - if (!mw) { - ev->ignore(); - return; - } - mw->activateWindow(); - mw->setFocus(); - if (isFloating()) - hide(); - ev->accept(); - } - } + void keyPressEvent(QKeyEvent * ev); + /// Dialog inherited methods //@{ void applyView() {} bool isClosing() const { return false; } bool needBufferOpen() const { return false; } //@} + +protected Q_SLOTS: + void on_bufferViewChanged() {} //override }; } // frontend diff --git a/src/frontends/qt4/GuiDialog.cpp b/src/frontends/qt4/GuiDialog.cpp index 8f8a872f98..91ee667dab 100644 --- a/src/frontends/qt4/GuiDialog.cpp +++ b/src/frontends/qt4/GuiDialog.cpp @@ -28,6 +28,9 @@ GuiDialog::GuiDialog(GuiView & lv, QString const & name, QString const & title) : QDialog(&lv), Dialog(lv, name, "LyX: " + title), updating_(false), is_closing_(false) { + connect(&lv, SIGNAL(bufferViewChanged()), + this, SLOT(on_bufferViewChanged())); + // remove question marks from Windows dialogs setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); } diff --git a/src/frontends/qt4/GuiDialog.h b/src/frontends/qt4/GuiDialog.h index 1e95fc5e37..20ffde046c 100644 --- a/src/frontends/qt4/GuiDialog.h +++ b/src/frontends/qt4/GuiDialog.h @@ -59,6 +59,9 @@ public Q_SLOTS: /// void closeEvent(QCloseEvent * e); +protected Q_SLOTS: + void on_bufferViewChanged() {};//override + public: /** Check whether we may apply our data. * diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index cb06f34b1d..b6c27811e3 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -15,7 +15,6 @@ #include "GuiView.h" -#include "Dialog.h" #include "DispatchResult.h" #include "FileDialog.h" #include "FontLoader.h" @@ -1194,25 +1193,31 @@ void GuiView::updateWindowTitle(GuiWorkArea * wa) void GuiView::on_currentWorkAreaChanged(GuiWorkArea * wa) { if (d.current_work_area_) - QObject::disconnect(d.current_work_area_, SIGNAL(busy(bool)), - this, SLOT(setBusy(bool))); + // disconnect the current work area from all slots + QObject::disconnect(d.current_work_area_, 0, this, 0); disconnectBuffer(); disconnectBufferView(); connectBufferView(wa->bufferView()); connectBuffer(wa->bufferView().buffer()); d.current_work_area_ = wa; QObject::connect(wa, SIGNAL(titleChanged(GuiWorkArea *)), - this, SLOT(updateWindowTitle(GuiWorkArea *))); - QObject::connect(wa, SIGNAL(busy(bool)), this, SLOT(setBusy(bool))); - updateWindowTitle(wa); + this, SLOT(updateWindowTitle(GuiWorkArea *))); + QObject::connect(wa, SIGNAL(busy(bool)), + this, SLOT(setBusy(bool))); + QObject::connect(wa, SIGNAL(bufferViewChanged()), + this, SIGNAL(bufferViewChanged())); + Q_EMIT updateWindowTitle(wa); + Q_EMIT bufferViewChanged(); structureChanged(); // The document settings needs to be reinitialised. + // TODO: no longer needed now there is bufferViewChanged? updateDialog("document", ""); // Buffer-dependent dialogs must be updated. This is done here because // some dialogs require buffer()->text. + // TODO: no longer needed now there is bufferViewChanged? updateDialogs(); } @@ -1228,6 +1233,8 @@ void GuiView::on_lastWorkAreaRemoved() return; // Reset and updates the dialogs. + Q_EMIT bufferViewChanged(); + // TODO: no longer needed now there is bufferViewChanged? d.toc_models_.reset(0); updateDialog("document", ""); updateDialogs(); @@ -1310,19 +1317,10 @@ bool GuiView::event(QEvent * e) cap::saveSelection(old_view->currentBufferView()->cursor()); } guiApp->setCurrentView(this); - if (d.current_work_area_) { - BufferView & bv = d.current_work_area_->bufferView(); - connectBufferView(bv); - connectBuffer(bv.buffer()); - // The document structure, name and dialogs might have - // changed in another view. - structureChanged(); - // The document settings needs to be reinitialised. - updateDialog("document", ""); - updateDialogs(); - } else { + if (d.current_work_area_) + on_currentWorkAreaChanged(d.current_work_area_); + else resetWindowTitle(); - } setFocus(); return QMainWindow::event(e); } @@ -1477,6 +1475,7 @@ void GuiView::setCurrentWorkArea(GuiWorkArea * wa) if (!wa) { d.current_work_area_ = 0; d.setBackground(); + Q_EMIT bufferViewChanged(); return; } diff --git a/src/frontends/qt4/GuiView.h b/src/frontends/qt4/GuiView.h index d396421a61..c71b1f691d 100644 --- a/src/frontends/qt4/GuiView.h +++ b/src/frontends/qt4/GuiView.h @@ -214,6 +214,8 @@ public: Q_SIGNALS: void closing(int); void triggerShowDialog(QString const & qname, QString const & qdata, Inset * inset); + // emitted when the work area or its buffer view changed + void bufferViewChanged(); public Q_SLOTS: /// diff --git a/src/frontends/qt4/GuiWorkArea.cpp b/src/frontends/qt4/GuiWorkArea.cpp index a0f57fe062..31df06b8a9 100644 --- a/src/frontends/qt4/GuiWorkArea.cpp +++ b/src/frontends/qt4/GuiWorkArea.cpp @@ -392,6 +392,7 @@ void GuiWorkArea::setBuffer(Buffer & buffer) if (buffer.text().paragraphs().size() > 4) setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); QTimer::singleShot(50, this, SLOT(fixVerticalScrollBar())); + Q_EMIT bufferViewChanged(); } diff --git a/src/frontends/qt4/GuiWorkArea.h b/src/frontends/qt4/GuiWorkArea.h index a039f0e9b5..a8b7c5a64d 100644 --- a/src/frontends/qt4/GuiWorkArea.h +++ b/src/frontends/qt4/GuiWorkArea.h @@ -100,6 +100,8 @@ Q_SIGNALS: void titleChanged(GuiWorkArea *); /// void busy(bool); + /// + void bufferViewChanged(); private Q_SLOTS: /// Scroll the BufferView. diff --git a/src/frontends/qt4/Makefile.am b/src/frontends/qt4/Makefile.am index 190e8881ee..299e3c69f2 100644 --- a/src/frontends/qt4/Makefile.am +++ b/src/frontends/qt4/Makefile.am @@ -61,6 +61,8 @@ SOURCEFILES = \ CategorizedCombo.cpp \ ColorCache.cpp \ CustomizedWidgets.cpp \ + DialogView.cpp \ + DockView.cpp \ EmptyTable.cpp \ FancyLineEdit.cpp \ FileDialog.cpp \ @@ -159,8 +161,6 @@ SOURCEFILES = \ NOMOCHEADER = \ ButtonController.h \ ColorCache.h \ - DialogView.h \ - DockView.h \ FileDialog.h \ GuiFontExample.h \ GuiFontLoader.h \ @@ -180,6 +180,8 @@ MOCHEADER = \ BulletsModule.h \ CategorizedCombo.h \ CustomizedWidgets.h \ + DialogView.h \ + DockView.h \ EmptyTable.h \ FancyLineEdit.h \ FindAndReplace.h \ -- 2.39.2