From 4578c109ece9fab52a1de9305efce0ada48b26ae Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Thu, 17 Jul 2014 14:38:18 +0200 Subject: [PATCH] ui: added find shortcut to set focus in search view The shortcut is added to the new Find menubar item and dispatches a MessageFind, which is handled by the SearchController. QtSearchView assures via the ViewLayout that the view is visible when setting focus on the search box. --- src/app/qt/element/QtMainWindow.cpp | 40 +++++++++++++++++++ src/app/qt/element/QtMainWindow.h | 17 +++++--- src/app/qt/view/QtMainView.cpp | 10 +++++ src/app/qt/view/QtMainView.h | 7 +++- src/app/qt/view/QtSearchView.cpp | 12 ++++++ src/app/qt/view/QtSearchView.h | 3 ++ src/lib/CMakeLists.txt | 2 + .../component/controller/SearchController.cpp | 5 +++ .../component/controller/SearchController.h | 3 ++ src/lib/component/view/SearchView.h | 1 + src/lib/component/view/View.cpp | 14 ++++--- src/lib/component/view/View.h | 6 +-- src/lib/component/view/ViewLayout.h | 3 ++ src/lib/utility/messaging/type/MessageFind.h | 20 ++++++++++ 14 files changed, 128 insertions(+), 15 deletions(-) create mode 100644 src/lib/utility/messaging/type/MessageFind.h diff --git a/src/app/qt/element/QtMainWindow.cpp b/src/app/qt/element/QtMainWindow.cpp index 43810fb6..ac23c3e3 100644 --- a/src/app/qt/element/QtMainWindow.cpp +++ b/src/app/qt/element/QtMainWindow.cpp @@ -9,6 +9,8 @@ #include "component/view/View.h" #include "qt/QtWidgetWrapper.h" +#include "utility/logging/logging.h" +#include "utility/messaging/type/MessageFind.h" #include "utility/messaging/type/MessageLoadProject.h" #include "utility/messaging/type/MessageLoadSource.h" @@ -18,6 +20,7 @@ QtMainWindow::QtMainWindow() setCentralWidget(nullptr); setupProjectMenu(); + setupFindMenu(); setupHelpMenu(); } @@ -66,6 +69,11 @@ void QtMainWindow::openProject(const QString &path) } } +void QtMainWindow::find() +{ + MessageFind().dispatch(); +} + void QtMainWindow::addView(View* view) { QDockWidget* dock = new QDockWidget(tr(view->getName().c_str()), this); @@ -87,6 +95,16 @@ void QtMainWindow::removeView(View* view) } } +void QtMainWindow::showView(View* view) +{ + getDockWidgetForView(view)->setHidden(false); +} + +void QtMainWindow::hideView(View* view) +{ + getDockWidgetForView(view)->setHidden(true); +} + void QtMainWindow::loadLayout() { QSettings settings("data/window_settings.ini", QSettings::IniFormat); @@ -151,6 +169,14 @@ void QtMainWindow::setupProjectMenu() menu->addAction(tr("E&xit"), QCoreApplication::instance(), SLOT(quit()), QKeySequence::Quit); } +void QtMainWindow::setupFindMenu() +{ + QMenu *menu = new QMenu(tr("&Find"), this); + menuBar()->addMenu(menu); + + menu->addAction(tr("&Find"), this, SLOT(find()), QKeySequence::Find); +} + void QtMainWindow::setupHelpMenu() { QMenu *menu = new QMenu(tr("&Help"), this); @@ -159,3 +185,17 @@ void QtMainWindow::setupHelpMenu() menu->addAction(tr("&About"), this, SLOT(about())); menu->addAction(tr("About &Qt"), QCoreApplication::instance(), SLOT(aboutQt())); } + +QDockWidget* QtMainWindow::getDockWidgetForView(View* view) const +{ + for (size_t i = 0; i < m_dockWidgets.size(); i++) + { + if (m_dockWidgets[i].first == view) + { + return m_dockWidgets[i].second; + } + } + + LOG_ERROR("DockWidget was not found for view."); + return nullptr; +} diff --git a/src/app/qt/element/QtMainWindow.h b/src/app/qt/element/QtMainWindow.h index 45b8aaa4..47885223 100644 --- a/src/app/qt/element/QtMainWindow.h +++ b/src/app/qt/element/QtMainWindow.h @@ -20,17 +20,24 @@ public: void addView(View* view); void removeView(View* view); + void showView(View* view); + void hideView(View* view); + void loadLayout(); void saveLayout(); public slots: - void about(); - void newProject(); - void openProject(const QString &path = QString()); + void about(); + void newProject(); + void openProject(const QString &path = QString()); + void find(); private: - void setupProjectMenu(); - void setupHelpMenu(); + void setupProjectMenu(); + void setupFindMenu(); + void setupHelpMenu(); + + QDockWidget* getDockWidgetForView(View* view) const; std::vector > m_dockWidgets; }; diff --git a/src/app/qt/view/QtMainView.cpp b/src/app/qt/view/QtMainView.cpp index ab87f773..34fb2ee7 100644 --- a/src/app/qt/view/QtMainView.cpp +++ b/src/app/qt/view/QtMainView.cpp @@ -32,6 +32,16 @@ void QtMainView::removeView(View* view) m_views.erase(it); } +void QtMainView::showView(View* view) +{ + m_window->showView(view); +} + +void QtMainView::hideView(View* view) +{ + m_window->hideView(view); +} + void QtMainView::loadLayout() { m_window->loadLayout(); diff --git a/src/app/qt/view/QtMainView.h b/src/app/qt/view/QtMainView.h index cf610601..905f06ed 100644 --- a/src/app/qt/view/QtMainView.h +++ b/src/app/qt/view/QtMainView.h @@ -16,8 +16,11 @@ public: virtual ~QtMainView(); // ViewLayout implementation - void addView(View* view); - void removeView(View* view); + virtual void addView(View* view); + virtual void removeView(View* view); + + virtual void showView(View* view); + virtual void hideView(View* view); virtual void loadLayout(); virtual void saveLayout(); diff --git a/src/app/qt/view/QtSearchView.cpp b/src/app/qt/view/QtSearchView.cpp index 1973f805..41d74b3d 100644 --- a/src/app/qt/view/QtSearchView.cpp +++ b/src/app/qt/view/QtSearchView.cpp @@ -12,6 +12,7 @@ QtSearchView::QtSearchView(ViewLayout* viewLayout) : SearchView(viewLayout) , m_setTextFunctor(std::bind(&QtSearchView::doSetText, this, std::placeholders::_1)) + , m_setFocusFunctor(std::bind(&QtSearchView::doSetFocus, this)) , m_setAutocompletionListFunctor(std::bind(&QtSearchView::doSetAutocompletionList, this, std::placeholders::_1)) { } @@ -59,6 +60,11 @@ void QtSearchView::setText(const std::string& s) m_setTextFunctor(s); } +void QtSearchView::setFocus() +{ + m_setFocusFunctor(); +} + void QtSearchView::setAutocompletionList(const std::vector& autocompletionList) { m_setAutocompletionListFunctor(autocompletionList); @@ -81,6 +87,12 @@ void QtSearchView::doSetText(const std::string& s) } } +void QtSearchView::doSetFocus() +{ + getViewLayout()->showView(this); + m_searchBox->setFocus(Qt::ShortcutFocusReason); +} + void QtSearchView::doSetAutocompletionList(const std::vector& autocompletionList) { QStringList wordList; diff --git a/src/app/qt/view/QtSearchView.h b/src/app/qt/view/QtSearchView.h index 38b8a21a..0a4a6ba2 100644 --- a/src/app/qt/view/QtSearchView.h +++ b/src/app/qt/view/QtSearchView.h @@ -21,18 +21,21 @@ public: // SearchView implementation virtual void setText(const std::string& s); + virtual void setFocus(); virtual void setAutocompletionList(const std::vector& autocompletionList); private: void onSearchButtonClick(); void doSetText(const std::string& s); + void doSetFocus(); void doSetAutocompletionList(const std::vector& autocompletionList); QtEditBox* m_searchBox; QtButton* m_searchButton; QtButton* m_caseSensitiveButton; QtThreadedFunctor m_setTextFunctor; + QtThreadedFunctor<> m_setFocusFunctor; QtThreadedFunctor&> m_setAutocompletionListFunctor; }; diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 9048d9db..05ef856f 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -150,8 +150,10 @@ add_files( utility/math/VectorBase.h utility/messaging/type/MessageActivateToken.h + utility/messaging/type/MessageFind.h utility/messaging/type/MessageFinishedParsing.h utility/messaging/type/MessageLoadProject.h + utility/messaging/type/MessageLoadSource.h utility/messaging/Message.h utility/messaging/MessageBase.h diff --git a/src/lib/component/controller/SearchController.cpp b/src/lib/component/controller/SearchController.cpp index 0125caa3..8204469c 100644 --- a/src/lib/component/controller/SearchController.cpp +++ b/src/lib/component/controller/SearchController.cpp @@ -33,6 +33,11 @@ void SearchController::handleMessage(MessageActivateToken* message) getView()->setText(m_graphAccess->getNameForNodeWithId(message->tokenId)); } +void SearchController::handleMessage(MessageFind* message) +{ + getView()->setFocus(); +} + void SearchController::handleMessage(MessageFinishedParsing* message) { getView()->setAutocompletionList(m_graphAccess->getNamesForNodesWithNamePrefix("")); diff --git a/src/lib/component/controller/SearchController.h b/src/lib/component/controller/SearchController.h index 6a47aa2b..993538b5 100644 --- a/src/lib/component/controller/SearchController.h +++ b/src/lib/component/controller/SearchController.h @@ -6,6 +6,7 @@ #include "component/controller/Controller.h" #include "utility/messaging/MessageListener.h" #include "utility/messaging/type/MessageActivateToken.h" +#include "utility/messaging/type/MessageFind.h" #include "utility/messaging/type/MessageFinishedParsing.h" class GraphAccess; @@ -14,6 +15,7 @@ class SearchView; class SearchController : public Controller , public MessageListener + , public MessageListener , public MessageListener { public: @@ -25,6 +27,7 @@ public: private: virtual void handleMessage(MessageActivateToken* message); + virtual void handleMessage(MessageFind* message); virtual void handleMessage(MessageFinishedParsing* message); SearchView* getView(); diff --git a/src/lib/component/view/SearchView.h b/src/lib/component/view/SearchView.h index 298c5da0..1bc55d02 100644 --- a/src/lib/component/view/SearchView.h +++ b/src/lib/component/view/SearchView.h @@ -14,6 +14,7 @@ public: virtual std::string getName() const; virtual void setText(const std::string& s) = 0; + virtual void setFocus() = 0; virtual void setAutocompletionList(const std::vector& autocompletionList) = 0; protected: diff --git a/src/lib/component/view/View.cpp b/src/lib/component/view/View.cpp index d133a1e3..15fc9abd 100644 --- a/src/lib/component/view/View.cpp +++ b/src/lib/component/view/View.cpp @@ -1,8 +1,14 @@ #include "component/view/View.h" -#include "component/view/ViewLayout.h" #include "gui/GuiWidgetWrapper.h" +View::View(ViewLayout* viewLayout, const Vec2i& minSize) + : m_viewLayout(viewLayout) + , m_widgetWrapper(nullptr) + , m_minSize(minSize) +{ +} + View::~View() { m_viewLayout->removeView(this); @@ -38,9 +44,7 @@ Vec2i View::getMinSize() const return m_minSize; } -View::View(ViewLayout* viewLayout, const Vec2i& minSize) - : m_viewLayout(viewLayout) - , m_widgetWrapper(nullptr) - , m_minSize(minSize) +ViewLayout* View::getViewLayout() const { + return m_viewLayout; } diff --git a/src/lib/component/view/View.h b/src/lib/component/view/View.h index a263b41a..ba296525 100644 --- a/src/lib/component/view/View.h +++ b/src/lib/component/view/View.h @@ -9,7 +9,6 @@ #include "utility/math/Vector2.h" class GuiWidgetWrapper; -class ViewLayout; class View { @@ -17,6 +16,7 @@ public: template static std::shared_ptr create(ViewLayout* viewLayout); + View(ViewLayout* viewLayout, const Vec2i& minSize); virtual ~View(); virtual std::string getName() const = 0; @@ -34,11 +34,11 @@ public: Vec2i getMinSize() const; protected: - View(ViewLayout* viewLayout, const Vec2i& minSize); // make public - template ControllerType* getController(); + ViewLayout* getViewLayout() const; + private: Component* m_component; ViewLayout* const m_viewLayout; diff --git a/src/lib/component/view/ViewLayout.h b/src/lib/component/view/ViewLayout.h index d9a0e2ba..488e8eb9 100644 --- a/src/lib/component/view/ViewLayout.h +++ b/src/lib/component/view/ViewLayout.h @@ -12,6 +12,9 @@ public: virtual void addView(View* view) = 0; virtual void removeView(View* view) = 0; + virtual void showView(View* view) = 0; + virtual void hideView(View* view) = 0; + virtual void loadLayout() = 0; virtual void saveLayout() = 0; }; diff --git a/src/lib/utility/messaging/type/MessageFind.h b/src/lib/utility/messaging/type/MessageFind.h new file mode 100644 index 00000000..3d3b2b37 --- /dev/null +++ b/src/lib/utility/messaging/type/MessageFind.h @@ -0,0 +1,20 @@ +#ifndef MESSAGE_FIND_H +#define MESSAGE_FIND_H + +#include "utility/messaging/Message.h" +#include "utility/types.h" + +class MessageFind: public Message +{ +public: + MessageFind() + { + } + + static const std::string getStaticType() + { + return "MessageFind"; + } +}; + +#endif // MESSAGE_FIND_H