From 7598c22441b357d8bdb768f4ec31deb0cb6655e9 Mon Sep 17 00:00:00 2001 From: kh1 Date: Mon, 11 Feb 2013 13:26:07 +0100 Subject: [PATCH] Ctrl+W shortcut on last open tab causes Assistant to crash. Task-number: QTBUG-29499 This happend as nobody did inform the menu about the page changes, the shortcut remained active even for the last viewer. Also make some constructors and functions private, so we can no longer mess from the outside with the viewers, except thru OpenPagesManager. Change-Id: I2675996d4b30ab8b1db657e5157b497a73b96196 Reviewed-by: Christian Kandeler --- src/assistant/assistant/centralwidget.h | 16 ++++++++++------ src/assistant/assistant/mainwindow.cpp | 16 ++++++---------- src/assistant/assistant/mainwindow.h | 2 +- src/assistant/assistant/openpagesmanager.cpp | 8 ++++++++ src/assistant/assistant/openpagesmanager.h | 7 +++++++ src/assistant/assistant/openpagesmodel.h | 8 ++++++-- 6 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/assistant/assistant/centralwidget.h b/src/assistant/assistant/centralwidget.h index c3ef835..f0d524b 100644 --- a/src/assistant/assistant/centralwidget.h +++ b/src/assistant/assistant/centralwidget.h @@ -57,8 +57,9 @@ class QPrinter; class TabBar : public QTabBar { Q_OBJECT + friend class CentralWidget; + public: - TabBar(QWidget *parent = 0); ~TabBar(); int addNewTab(const QString &title); @@ -72,6 +73,9 @@ signals: void currentTabChanged(HelpViewer *viewer); void addBookmark(const QString &title, const QString &url); +private: + TabBar(QWidget *parent = 0); + private slots: void slotCurrentChanged(int index); void slotTabCloseRequested(int index); @@ -81,6 +85,7 @@ private slots: class CentralWidget : public QWidget { Q_OBJECT + friend class OpenPagesManager; public: CentralWidget(QWidget *parent = 0); @@ -97,12 +102,7 @@ public: HelpViewer *viewerAt(int index) const; HelpViewer *currentHelpViewer() const; - - void addPage(HelpViewer *page, bool fromSearch = false); - void removePage(int index); - int currentIndex() const; - void setCurrentPage(HelpViewer *page); void connectTabBar(); @@ -162,6 +162,10 @@ private: void connectSignals(HelpViewer *page); bool eventFilter(QObject *object, QEvent *e); + void removePage(int index); + void setCurrentPage(HelpViewer *page); + void addPage(HelpViewer *page, bool fromSearch = false); + private: #ifndef QT_NO_PRINTER QPrinter *m_printer; diff --git a/src/assistant/assistant/mainwindow.cpp b/src/assistant/assistant/mainwindow.cpp index 6f20e82..0bffe93 100644 --- a/src/assistant/assistant/mainwindow.cpp +++ b/src/assistant/assistant/mainwindow.cpp @@ -473,15 +473,15 @@ void MainWindow::setupActions() #endif QMenu *menu = menuBar()->addMenu(tr("&File")); - connect(menu, SIGNAL(aboutToShow()), this, SLOT(aboutToShowFileMenu())); - OpenPagesManager * const openPages = OpenPagesManager::instance(); - m_newTabAction - = menu->addAction(tr("New &Tab"), openPages, SLOT(createPage())); + m_newTabAction = menu->addAction(tr("New &Tab"), openPages, SLOT(createPage())); m_newTabAction->setShortcut(QKeySequence::AddTab); m_closeTabAction = menu->addAction(tr("&Close Tab"), openPages, SLOT(closeCurrentPage())); m_closeTabAction->setShortcuts(QKeySequence::Close); + m_closeTabAction->setEnabled(openPages->pageCount() > 1); + connect(openPages, SIGNAL(pageClosed()), this, SLOT(handlePageCountChanged())); + connect(openPages, SIGNAL(pageAdded(int)), this, SLOT(handlePageCountChanged())); menu->addSeparator(); @@ -1129,13 +1129,9 @@ void MainWindow::registerDocumentation(const QString &component, } } -void MainWindow::aboutToShowFileMenu() +void MainWindow::handlePageCountChanged() { - OpenPagesManager * const openPages = OpenPagesManager::instance(); - if (openPages->pageCount() > 1) - m_closeTabAction->setEnabled(true); - else - m_closeTabAction->setEnabled(false); + m_closeTabAction->setEnabled(OpenPagesManager::instance()->pageCount() > 1); } QT_END_NAMESPACE diff --git a/src/assistant/assistant/mainwindow.h b/src/assistant/assistant/mainwindow.h index ec35cf4..891a041 100644 --- a/src/assistant/assistant/mainwindow.h +++ b/src/assistant/assistant/mainwindow.h @@ -136,7 +136,7 @@ private: private slots: void showBookmarksDockWidget(); void hideBookmarksDockWidget(); - void aboutToShowFileMenu(); + void handlePageCountChanged(); private: QWidget *m_bookmarkWidget; diff --git a/src/assistant/assistant/openpagesmanager.cpp b/src/assistant/assistant/openpagesmanager.cpp index f86927c..0d8f71b 100644 --- a/src/assistant/assistant/openpagesmanager.cpp +++ b/src/assistant/assistant/openpagesmanager.cpp @@ -196,11 +196,15 @@ HelpViewer *OpenPagesManager::createPage(const QUrl &url, bool fromSearch) if (HelpViewer::launchWithExternalApp(url)) return 0; + emit aboutToAddPage(); + m_model->addPage(url); const int index = m_model->rowCount() - 1; HelpViewer * const page = m_model->pageAt(index); CentralWidget::instance()->addPage(page, fromSearch); setCurrentPage(index); + + emit pageAdded(index); return page; } @@ -289,9 +293,13 @@ void OpenPagesManager::setCurrentPage(HelpViewer *page) void OpenPagesManager::removePage(int index) { TRACE_OBJ + emit aboutToClosePage(index); + CentralWidget::instance()->removePage(index); m_model->removePage(index); m_openPagesWidget->selectCurrentPage(); + + emit pageClosed(); } diff --git a/src/assistant/assistant/openpagesmanager.h b/src/assistant/assistant/openpagesmanager.h index 6565b6a..b14b49b 100644 --- a/src/assistant/assistant/openpagesmanager.h +++ b/src/assistant/assistant/openpagesmanager.h @@ -86,6 +86,13 @@ public slots: void closePage(HelpViewer *page); void setCurrentPage(HelpViewer *page); +signals: + void aboutToAddPage(); + void pageAdded(int index); + + void pageClosed(); + void aboutToClosePage(int index); + private slots: void setCurrentPage(const QModelIndex &index); void closePage(const QModelIndex &index); diff --git a/src/assistant/assistant/openpagesmodel.h b/src/assistant/assistant/openpagesmodel.h index 2d95512..a64bdd9 100644 --- a/src/assistant/assistant/openpagesmodel.h +++ b/src/assistant/assistant/openpagesmodel.h @@ -42,6 +42,8 @@ #ifndef OPENPAGESMODEL_H #define OPENPAGESMODEL_H +#include "openpagesmanager.h" + #include #include @@ -53,9 +55,8 @@ class QUrl; class OpenPagesModel : public QAbstractTableModel { Q_OBJECT + friend class OpenPagesManager; public: - OpenPagesModel(QObject *parent); - virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; virtual int columnCount(const QModelIndex &parent = QModelIndex()) const; virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; @@ -68,6 +69,9 @@ private slots: void handleTitleChanged(); private: + OpenPagesModel(QObject *parent); + +private: QList m_pages; }; -- 2.7.4