From 997f952b868cc86971d4beaaebe363ea4cb18da0 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Wed, 12 Jul 2017 15:01:14 +0200 Subject: [PATCH] ui: Show recent bookmarks in bookmarks menu (issue #414) bug id = 414 --- src/lib/Application.cpp | 5 ++ src/lib/Application.h | 2 + .../controller/BookmarkController.cpp | 2 + src/lib/component/view/BookmarkView.cpp | 14 +++++ src/lib/component/view/MainView.h | 2 + src/lib_gui/qt/view/QtMainView.cpp | 10 ++++ src/lib_gui/qt/view/QtMainView.h | 2 + src/lib_gui/qt/window/QtMainWindow.cpp | 53 +++++++++++++++++-- src/lib_gui/qt/window/QtMainWindow.h | 6 +++ .../QtProjectWizzardContentPaths.h | 2 +- 10 files changed, 93 insertions(+), 5 deletions(-) diff --git a/src/lib/Application.cpp b/src/lib/Application.cpp index 1beb83e3..763f59af 100644 --- a/src/lib/Application.cpp +++ b/src/lib/Application.cpp @@ -166,6 +166,11 @@ void Application::updateHistory(const std::vector& history) m_mainView->updateHistoryMenu(history); } +void Application::updateBookmarks(const std::vector>& bookmarks) +{ + m_mainView->updateBookmarksMenu(bookmarks); +} + void Application::createAndLoadProject(const FilePath& projectSettingsFilePath) { MessageStatus("Loading Project: " + projectSettingsFilePath.str(), false, true).dispatch(); diff --git a/src/lib/Application.h b/src/lib/Application.h index 40e1b36a..d454075c 100644 --- a/src/lib/Application.h +++ b/src/lib/Application.h @@ -13,6 +13,7 @@ #include "utility/messaging/type/MessageRefresh.h" #include "utility/messaging/type/MessageSwitchColorScheme.h" +class Bookmark; class DialogView; class IDECommunicationController; class MainView; @@ -54,6 +55,7 @@ public: bool isInTrial() const; void updateHistory(const std::vector& history); + void updateBookmarks(const std::vector>& bookmarks); private: static std::shared_ptr s_instance; diff --git a/src/lib/component/controller/BookmarkController.cpp b/src/lib/component/controller/BookmarkController.cpp index 92d89ddc..43609acb 100644 --- a/src/lib/component/controller/BookmarkController.cpp +++ b/src/lib/component/controller/BookmarkController.cpp @@ -361,6 +361,8 @@ void BookmarkController::handleMessage(MessageFinishedParsing* message) { m_bookmarkCache.clear(); getView()->enableDisplayBookmarks(true); + + getView()->update(); } void BookmarkController::handleMessage(MessageShowErrors* message) diff --git a/src/lib/component/view/BookmarkView.cpp b/src/lib/component/view/BookmarkView.cpp index ee79e2b8..d5549d5f 100644 --- a/src/lib/component/view/BookmarkView.cpp +++ b/src/lib/component/view/BookmarkView.cpp @@ -1,5 +1,6 @@ #include "component/view/BookmarkView.h" +#include "Application.h" #include "component/controller/BookmarkController.h" BookmarkView::BookmarkView(ViewLayout* viewLayout) @@ -24,6 +25,19 @@ void BookmarkView::update() { displayBookmarks(getController()->getBookmarks(m_filter, m_order)); } + + std::vector> bookmarks = getController()->getBookmarks( + MessageDisplayBookmarks::BookmarkFilter::ALL, + MessageDisplayBookmarks::BookmarkOrder::DATE_DESCENDING + ); + + const size_t maxBookmarkMenuCount = 20; + if (bookmarks.size() > maxBookmarkMenuCount) + { + bookmarks.resize(maxBookmarkMenuCount); + } + + Application::getInstance()->updateBookmarks(bookmarks); } BookmarkController* BookmarkView::getController() diff --git a/src/lib/component/view/MainView.h b/src/lib/component/view/MainView.h index cbb70362..b17a3995 100644 --- a/src/lib/component/view/MainView.h +++ b/src/lib/component/view/MainView.h @@ -7,6 +7,7 @@ #include "component/view/ViewLayout.h" struct SearchMatch; +class Bookmark; class MainView : public ViewLayout @@ -24,6 +25,7 @@ public: virtual void updateRecentProjectMenu() = 0; virtual void updateHistoryMenu(const std::vector& history) = 0; + virtual void updateBookmarksMenu(const std::vector>& bookmarks) = 0; }; #endif // MAIN_VIEW_H diff --git a/src/lib_gui/qt/view/QtMainView.cpp b/src/lib_gui/qt/view/QtMainView.cpp index ce3c8cfd..b4639e92 100644 --- a/src/lib_gui/qt/view/QtMainView.cpp +++ b/src/lib_gui/qt/view/QtMainView.cpp @@ -128,6 +128,16 @@ void QtMainView::updateHistoryMenu(const std::vector& history) ); } +void QtMainView::updateBookmarksMenu(const std::vector>& bookmarks) +{ + m_onQtThread( + [=]() + { + m_window->updateBookmarksMenu(bookmarks); + } + ); +} + void QtMainView::handleMessage(MessageForceEnterLicense* message) { bool expired = message->licenseExpired; diff --git a/src/lib_gui/qt/view/QtMainView.h b/src/lib_gui/qt/view/QtMainView.h index 2c645ad4..46ba4fb7 100644 --- a/src/lib_gui/qt/view/QtMainView.h +++ b/src/lib_gui/qt/view/QtMainView.h @@ -48,8 +48,10 @@ public: virtual void hideStartScreen(); virtual void setTitle(const std::string& title); virtual void activateWindow(); + virtual void updateRecentProjectMenu(); virtual void updateHistoryMenu(const std::vector& history); + virtual void updateBookmarksMenu(const std::vector>& bookmarks); private: void handleMessage(MessageForceEnterLicense* message); diff --git a/src/lib_gui/qt/window/QtMainWindow.cpp b/src/lib_gui/qt/window/QtMainWindow.cpp index defd1b36..f2637d61 100644 --- a/src/lib_gui/qt/window/QtMainWindow.cpp +++ b/src/lib_gui/qt/window/QtMainWindow.cpp @@ -15,6 +15,7 @@ #include "component/view/CompositeView.h" #include "component/view/TabbedView.h" #include "component/view/View.h" +#include "data/bookmark/Bookmark.h" #include "LicenseChecker.h" #include "qt/utility/QtContextMenu.h" #include "qt/utility/utilityQt.h" @@ -30,6 +31,7 @@ #include "settings/ApplicationSettings.h" #include "utility/file/FileSystem.h" #include "utility/logging/logging.h" +#include "utility/messaging/type/MessageActivateBookmark.h" #include "utility/messaging/type/MessageCodeReference.h" #include "utility/messaging/type/MessageDisplayBookmarkCreator.h" #include "utility/messaging/type/MessageDisplayBookmarks.h" @@ -98,6 +100,7 @@ bool MouseReleaseFilter::eventFilter(QObject* obj, QEvent* event) QtMainWindow::QtMainWindow() : m_historyMenu(nullptr) + , m_bookmarksMenu(nullptr) , m_showDockWidgetTitleBars(true) , m_windowStack(this) { @@ -269,6 +272,12 @@ void QtMainWindow::updateHistoryMenu(const std::vector& history) setupHistoryMenu(); } +void QtMainWindow::updateBookmarksMenu(const std::vector>& bookmarks) +{ + m_bookmarks = bookmarks; + setupBookmarksMenu(); +} + void QtMainWindow::setContentEnabled(bool enabled) { foreach (QAction *action, menuBar()->actions()) @@ -673,6 +682,16 @@ void QtMainWindow::openHistoryAction() } } +void QtMainWindow::activateBookmarkAction() +{ + QAction* action = qobject_cast(sender()); + if (action) + { + std::shared_ptr bookmark = m_bookmarks[action->data().toInt()]; + MessageActivateBookmark(bookmark).dispatch(); + } +} + void QtMainWindow::setupProjectMenu() { QMenu *menu = new QMenu(tr("&Project"), this); @@ -805,11 +824,37 @@ void QtMainWindow::setupHistoryMenu() void QtMainWindow::setupBookmarksMenu() { - QMenu *menu = new QMenu(tr("&Bookmarks"), this); - menuBar()->addMenu(menu); + if (!m_bookmarksMenu) + { + m_bookmarksMenu = new QMenu(tr("&Bookmarks"), this); + menuBar()->addMenu(m_bookmarksMenu); + } + else + { + m_bookmarksMenu->clear(); + } - menu->addAction(tr("Bookmark Active Symbol..."), this, SLOT(showBookmarkCreator()), QKeySequence(Qt::CTRL + Qt::Key_D)); - menu->addAction(tr("Bookmark Manager"), this, SLOT(showBookmarkBrowser()), QKeySequence(Qt::CTRL + Qt::Key_B)); + m_bookmarksMenu->addAction(tr("Bookmark Active Symbol..."), this, SLOT(showBookmarkCreator()), QKeySequence(Qt::CTRL + Qt::Key_D)); + m_bookmarksMenu->addAction(tr("Bookmark Manager"), this, SLOT(showBookmarkBrowser()), QKeySequence(Qt::CTRL + Qt::Key_B)); + + m_bookmarksMenu->addSeparator(); + + QAction* title = new QAction(tr("Recent Bookmarks")); + title->setEnabled(false); + m_bookmarksMenu->addAction(title); + + for (size_t i = 0; i < m_bookmarks.size(); i++) + { + Bookmark* bookmark = m_bookmarks[i].get(); + std::string name = utility::elide(bookmark->getName(), utility::ELIDE_RIGHT, 50); + + QAction* action = new QAction(); + action->setText(name.c_str()); + action->setData(QVariant(int(i))); + + connect(action, SIGNAL(triggered()), this, SLOT(activateBookmarkAction())); + m_bookmarksMenu->addAction(action); + } } void QtMainWindow::setupHelpMenu() diff --git a/src/lib_gui/qt/window/QtMainWindow.h b/src/lib_gui/qt/window/QtMainWindow.h index 9b615f2b..2a8bc9ed 100644 --- a/src/lib_gui/qt/window/QtMainWindow.h +++ b/src/lib_gui/qt/window/QtMainWindow.h @@ -10,6 +10,7 @@ #include "data/search/SearchMatch.h" #include "qt/window/QtWindowStack.h" +class Bookmark; class QDockWidget; class View; @@ -70,6 +71,7 @@ public: void forceEnterLicense(bool expired); void updateHistoryMenu(const std::vector& history); + void updateBookmarksMenu(const std::vector>& bookmarks); void setContentEnabled(bool enabled); @@ -133,6 +135,7 @@ private slots: void showBookmarkBrowser(); void openHistoryAction(); + void activateBookmarkAction(); private: struct DockWidget @@ -166,6 +169,9 @@ private: QMenu* m_historyMenu; std::vector m_history; + QMenu* m_bookmarksMenu; + std::vector> m_bookmarks; + QAction** m_recentProjectAction; QAction* m_showTitleBarsAction; diff --git a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPaths.h b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPaths.h index 466b2cfb..02ad6e23 100644 --- a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPaths.h +++ b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPaths.h @@ -154,7 +154,7 @@ public: QtProjectWizzardContentPathsClassJava(std::shared_ptr settings, QtProjectWizzardWindow* window); // QtProjectWizzardContent implementation - virtual void populate(QGridLayout* layout, int& row); + virtual void populate(QGridLayout* layout, int& row) override; virtual void load() override; virtual void save() override;