From 5ecc4fb39a9dd80b310803c3ee8072ad325bdee3 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Mon, 9 Feb 2015 16:27:23 +0100 Subject: [PATCH] logic/ui: added CompositeView for combining Views to one DockWidget Added CompositView, which implements both View and ViewLayout, for combining Views to one Widget. The layout can be set to either horizontal or vertical. SearchView, RefreshView and UndoRedoView are combined to one DockWidget by the ComponentManager now. fortune cookie message = You'll get more secure and confident with your relationship with your co-workers. --- .../data/gui/refresh_view/refresh_view.css | 8 ++- bin/app/data/gui/search_view/search_view.css | 4 ++ .../data/gui/undoredo_view/undoredo_view.css | 10 ++- src/app/CMakeLists.txt | 2 + src/app/qt/element/QtMainWindow.cpp | 14 +++- src/app/qt/element/QtMainWindow.h | 2 +- src/app/qt/element/QtRefreshBar.cpp | 8 +-- src/app/qt/element/QtRefreshBar.h | 2 - src/app/qt/element/QtSearchBar.cpp | 2 + src/app/qt/element/QtUndoRedo.cpp | 3 +- src/app/qt/view/QtCodeView.cpp | 5 +- src/app/qt/view/QtCodeView.h | 2 +- src/app/qt/view/QtCompositeView.cpp | 52 +++++++++++++++ src/app/qt/view/QtCompositeView.h | 27 ++++++++ src/app/qt/view/QtGraphView.cpp | 2 +- src/app/qt/view/QtRefreshView.cpp | 2 +- src/app/qt/view/QtRefreshView.h | 2 +- src/app/qt/view/QtSearchView.cpp | 2 +- src/app/qt/view/QtSearchView.h | 2 +- src/app/qt/view/QtUndoRedoView.cpp | 2 +- src/app/qt/view/QtUndoRedoView.h | 2 +- src/app/qt/view/QtViewFactory.cpp | 22 +++++-- src/app/qt/view/QtViewFactory.h | 3 + src/app/qt/view/QtViewWidgetWrapper.cpp | 4 +- src/app/qt/view/QtViewWidgetWrapper.h | 6 +- src/lib/Application.cpp | 6 +- src/lib/CMakeLists.txt | 2 + src/lib/component/Component.h | 1 - src/lib/component/ComponentFactory.cpp | 54 ++++++++-------- src/lib/component/ComponentFactory.h | 18 +++--- src/lib/component/ComponentManager.cpp | 28 +++++--- src/lib/component/ComponentManager.h | 8 ++- src/lib/component/view/CodeView.cpp | 2 +- src/lib/component/view/CompositeView.cpp | 64 +++++++++++++++++++ src/lib/component/view/CompositeView.h | 46 +++++++++++++ src/lib/component/view/GraphView.cpp | 2 +- src/lib/component/view/RefreshView.cpp | 2 +- src/lib/component/view/SearchView.cpp | 2 +- src/lib/component/view/StatusBarView.cpp | 2 +- src/lib/component/view/UndoRedoView.cpp | 2 +- src/lib/component/view/View.cpp | 34 +++++----- src/lib/component/view/View.h | 31 ++++----- src/lib/component/view/ViewFactory.h | 5 ++ 43 files changed, 360 insertions(+), 139 deletions(-) create mode 100644 src/app/qt/view/QtCompositeView.cpp create mode 100644 src/app/qt/view/QtCompositeView.h create mode 100644 src/lib/component/view/CompositeView.cpp create mode 100644 src/lib/component/view/CompositeView.h diff --git a/bin/app/data/gui/refresh_view/refresh_view.css b/bin/app/data/gui/refresh_view/refresh_view.css index 8c649a0d..92b91c02 100644 --- a/bin/app/data/gui/refresh_view/refresh_view.css +++ b/bin/app/data/gui/refresh_view/refresh_view.css @@ -14,13 +14,17 @@ QPushButton:hover, QPushButton:checked { background: #B2B2B2; } -QPushButton#refresh_button { +QPushButton:pressed { + background: #626262; +} + +#refresh_button { border-bottom-left-radius: 12px; border-top-left-radius: 12px; margin-right: 2px; } -QPushButton#auto_refresh_button { +#auto_refresh_button { border-bottom-right-radius: 12px; border-top-right-radius: 12px; } diff --git a/bin/app/data/gui/search_view/search_view.css b/bin/app/data/gui/search_view/search_view.css index 6cdbbf92..e0fa4f14 100644 --- a/bin/app/data/gui/search_view/search_view.css +++ b/bin/app/data/gui/search_view/search_view.css @@ -49,6 +49,10 @@ QPushButton#search_button { background: #B2B2B2; } +#search_button:pressed { + background: #626262; +} + /*QPushButton#case_sensitive_button { border: none; border-image: url(data/gui/search_view/images/button_case_sensitive_inactive.png); diff --git a/bin/app/data/gui/undoredo_view/undoredo_view.css b/bin/app/data/gui/undoredo_view/undoredo_view.css index a5fc2ddf..6d853e58 100644 --- a/bin/app/data/gui/undoredo_view/undoredo_view.css +++ b/bin/app/data/gui/undoredo_view/undoredo_view.css @@ -13,6 +13,7 @@ QPushButton { #undo_button { border-bottom-left-radius: 12px; border-top-left-radius: 12px; + margin-right: 2px; } #redo_button { @@ -20,18 +21,15 @@ QPushButton { border-top-right-radius: 12px; } -#undo_button:disabled, -#redo_button:disabled { +QPushButton:disabled { background: #F4F4F4; } -#undo_button:hover, -#redo_button:hover { +QPushButton:hover { background: #B2B2B2; } -#undo_button:pressed, -#redo_button:pressed { +QPushButton:pressed { background: #626262; } diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index 2574d379..93b88d55 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -54,6 +54,8 @@ add_files( qt/view/QtCodeView.cpp qt/view/QtCodeView.h + qt/view/QtCompositeView.cpp + qt/view/QtCompositeView.h qt/view/QtGraphView.cpp qt/view/QtGraphView.h qt/view/QtMainView.cpp diff --git a/src/app/qt/element/QtMainWindow.cpp b/src/app/qt/element/QtMainWindow.cpp index 36548920..619ba398 100644 --- a/src/app/qt/element/QtMainWindow.cpp +++ b/src/app/qt/element/QtMainWindow.cpp @@ -8,6 +8,7 @@ #include #include "component/view/View.h" +#include "component/view/CompositeView.h" #include "qt/view/QtViewWidgetWrapper.h" #include "utility/logging/logging.h" #include "utility/messaging/type/MessageFind.h" @@ -270,7 +271,18 @@ QDockWidget* QtMainWindow::getDockWidgetForView(View* view) const { for (size_t i = 0; i < m_dockWidgets.size(); i++) { - if (m_dockWidgets[i].first == view) + CompositeView* compositeView = dynamic_cast(m_dockWidgets[i].first); + if (compositeView) + { + for (View* v : compositeView->getViews()) + { + if (v == view) + { + return m_dockWidgets[i].second; + } + } + } + else if (m_dockWidgets[i].first == view) { return m_dockWidgets[i].second; } diff --git a/src/app/qt/element/QtMainWindow.h b/src/app/qt/element/QtMainWindow.h index bdf2099a..c5ea0c64 100644 --- a/src/app/qt/element/QtMainWindow.h +++ b/src/app/qt/element/QtMainWindow.h @@ -50,7 +50,7 @@ private: QDockWidget* getDockWidgetForView(View* view) const; - std::vector > m_dockWidgets; + std::vector> m_dockWidgets; }; #endif // QT_MAIN_WINDOW_H diff --git a/src/app/qt/element/QtRefreshBar.cpp b/src/app/qt/element/QtRefreshBar.cpp index 7c3b86e1..229cca41 100644 --- a/src/app/qt/element/QtRefreshBar.cpp +++ b/src/app/qt/element/QtRefreshBar.cpp @@ -12,6 +12,7 @@ QtRefreshBar::QtRefreshBar() QBoxLayout* layout = new QHBoxLayout(); layout->setSpacing(0); + layout->setContentsMargins(0, 0, 0, 0); layout->setAlignment(Qt::AlignTop); setLayout(layout); @@ -20,7 +21,6 @@ QtRefreshBar::QtRefreshBar() m_refreshButton->setToolTip("refresh"); m_refreshButton->setAttribute(Qt::WA_LayoutUsesWidgetRect); // fixes layouting on Mac m_refreshButton->setIcon(QIcon("data/gui/refresh_view/images/refresh.png")); - m_refreshButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); layout->addWidget(m_refreshButton); m_autoRefreshButton = new QPushButton(this); @@ -29,7 +29,6 @@ QtRefreshBar::QtRefreshBar() m_autoRefreshButton->setToolTip("automatic refresh on window focus"); m_autoRefreshButton->setAttribute(Qt::WA_LayoutUsesWidgetRect); // fixes layouting on Mac m_autoRefreshButton->setIcon(QIcon("data/gui/refresh_view/images/auto_refresh.png")); - m_autoRefreshButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); layout->addWidget(m_autoRefreshButton); connect(m_refreshButton, SIGNAL(clicked()), this, SLOT(refreshClicked())); @@ -40,11 +39,6 @@ QtRefreshBar::~QtRefreshBar() { } -QSize QtRefreshBar::sizeHint() const -{ - return QSize(150, 100); -} - void QtRefreshBar::refreshClicked() { MessageRefresh().dispatch(); diff --git a/src/app/qt/element/QtRefreshBar.h b/src/app/qt/element/QtRefreshBar.h index 2fb37c21..e0b2c17c 100644 --- a/src/app/qt/element/QtRefreshBar.h +++ b/src/app/qt/element/QtRefreshBar.h @@ -14,8 +14,6 @@ public: QtRefreshBar(); virtual ~QtRefreshBar(); - virtual QSize sizeHint() const; - private slots: void refreshClicked(); void autoRefreshClicked(); diff --git a/src/app/qt/element/QtSearchBar.cpp b/src/app/qt/element/QtSearchBar.cpp index dc702ad6..accb27d1 100644 --- a/src/app/qt/element/QtSearchBar.cpp +++ b/src/app/qt/element/QtSearchBar.cpp @@ -12,6 +12,7 @@ QtSearchBar::QtSearchBar() QBoxLayout* layout = new QHBoxLayout(); layout->setSpacing(0); + layout->setContentsMargins(0, 0, 0, 0); layout->setAlignment(Qt::AlignTop); setLayout(layout); @@ -29,6 +30,7 @@ QtSearchBar::QtSearchBar() m_searchBox->setObjectName("search_box"); m_searchBox->setAttribute(Qt::WA_LayoutUsesWidgetRect); // fixes layouting on Mac m_searchBox->setAttribute(Qt::WA_MacShowFocusRect, 0); // remove blue focus box on Mac + m_searchBox->setMinimumWidth(100); m_searchBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); innerLayout->addWidget(m_searchBox); diff --git a/src/app/qt/element/QtUndoRedo.cpp b/src/app/qt/element/QtUndoRedo.cpp index 32b714a0..6e6b3700 100644 --- a/src/app/qt/element/QtUndoRedo.cpp +++ b/src/app/qt/element/QtUndoRedo.cpp @@ -25,12 +25,11 @@ QtUndoRedo::QtUndoRedo() QBoxLayout* layout = new QHBoxLayout(); layout->setSpacing(0); + layout->setContentsMargins(0, 0, 0, 0); layout->setAlignment(Qt::AlignTop); setLayout(layout); layout->addWidget(m_undoButton); - layout->addSpacing(2); layout->addWidget(m_redoButton); - layout->addStretch(); connect(m_undoButton, SIGNAL(clicked()), this, SLOT(undo())); connect(m_redoButton, SIGNAL(clicked()), this, SLOT(redo())); diff --git a/src/app/qt/view/QtCodeView.cpp b/src/app/qt/view/QtCodeView.cpp index ba19ee88..b9d9bbf4 100644 --- a/src/app/qt/view/QtCodeView.cpp +++ b/src/app/qt/view/QtCodeView.cpp @@ -13,7 +13,8 @@ QtCodeView::QtCodeView(ViewLayout* viewLayout) , m_showCodeSnippetsFunctor(std::bind(&QtCodeView::doShowCodeSnippets, this, std::placeholders::_1)) , m_showCodeFileFunctor(std::bind(&QtCodeView::doShowCodeFile, this, std::placeholders::_1)) { - m_widget = createQtCodeFileList(); + m_widget = new QtCodeFileList(); + setStyleSheet(m_widget); } QtCodeView::~QtCodeView() @@ -56,7 +57,7 @@ void QtCodeView::showCodeFile(const CodeSnippetParams& params) void QtCodeView::doRefreshView() { - setStyleSheet(m_widget.get()); + setStyleSheet(m_widget); clearClosedWindows(); for (std::shared_ptr window: m_windows) diff --git a/src/app/qt/view/QtCodeView.h b/src/app/qt/view/QtCodeView.h index 5f9ce3dd..2c93b552 100644 --- a/src/app/qt/view/QtCodeView.h +++ b/src/app/qt/view/QtCodeView.h @@ -44,7 +44,7 @@ private: QtThreadedFunctor&> m_showCodeSnippetsFunctor; QtThreadedFunctor m_showCodeFileFunctor; - std::shared_ptr m_widget; + QtCodeFileList* m_widget; std::vector> m_windows; std::vector m_activeTokenIds; diff --git a/src/app/qt/view/QtCompositeView.cpp b/src/app/qt/view/QtCompositeView.cpp new file mode 100644 index 00000000..51444f97 --- /dev/null +++ b/src/app/qt/view/QtCompositeView.cpp @@ -0,0 +1,52 @@ +#include "qt/view/QtCompositeView.h" + +#include + +#include "qt/utility/utilityQt.h" +#include "qt/view/QtViewWidgetWrapper.h" + +QtCompositeView::QtCompositeView(ViewLayout* viewLayout, CompositeDirection direction) + : CompositeView(viewLayout, direction) +{ + QBoxLayout* layout; + if (getDirection() == CompositeView::DIRECTION_HORIZONTAL) + { + layout = new QHBoxLayout(); + } + else + { + layout = new QVBoxLayout(); + } + + layout->setSpacing(5); + layout->setContentsMargins(5, 5, 5, 5); + layout->setAlignment(Qt::AlignTop); + + m_widget = new QWidget(); + m_widget->setLayout(layout); + utility::setWidgetBackgroundColor(m_widget, Colori(255, 255, 255, 255)); +} + +QtCompositeView::~QtCompositeView() +{ +} + +void QtCompositeView::createWidgetWrapper() +{ + setWidgetWrapper(std::make_shared(m_widget)); +} + +void QtCompositeView::initView() +{ + +} + +void QtCompositeView::refreshView() +{ + +} + +void QtCompositeView::addViewWidget(View* view) +{ + m_widget->layout()->addWidget(QtViewWidgetWrapper::getWidgetOfView(view)); +} diff --git a/src/app/qt/view/QtCompositeView.h b/src/app/qt/view/QtCompositeView.h new file mode 100644 index 00000000..6dc764c6 --- /dev/null +++ b/src/app/qt/view/QtCompositeView.h @@ -0,0 +1,27 @@ +#ifndef QT_COMPOSITE_VIEW +#define QT_COMPOSITE_VIEW + +#include + +#include "component/view/CompositeView.h" + +class QtCompositeView + : public CompositeView +{ +public: + QtCompositeView(ViewLayout* viewLayout, CompositeDirection direction); + ~QtCompositeView(); + + // View implementation + virtual void createWidgetWrapper(); + virtual void initView(); + virtual void refreshView(); + + // CompositeView implementation + virtual void addViewWidget(View* view); + +private: + QWidget* m_widget; +}; + +#endif // QT_COMPOSITE_VIEW diff --git a/src/app/qt/view/QtGraphView.cpp b/src/app/qt/view/QtGraphView.cpp index fe9e0af2..81d4b207 100644 --- a/src/app/qt/view/QtGraphView.cpp +++ b/src/app/qt/view/QtGraphView.cpp @@ -29,7 +29,7 @@ QtGraphView::~QtGraphView() void QtGraphView::createWidgetWrapper() { - setWidgetWrapper(std::make_shared(std::make_shared())); + setWidgetWrapper(std::make_shared(new QFrame())); } void QtGraphView::initView() diff --git a/src/app/qt/view/QtRefreshView.cpp b/src/app/qt/view/QtRefreshView.cpp index 5594fbe8..abbd803b 100644 --- a/src/app/qt/view/QtRefreshView.cpp +++ b/src/app/qt/view/QtRefreshView.cpp @@ -8,7 +8,7 @@ QtRefreshView::QtRefreshView(ViewLayout* viewLayout) : RefreshView(viewLayout) , m_refreshViewFunctor(std::bind(&QtRefreshView::doRefreshView, this)) { - m_widget = std::make_shared(); + m_widget = new QtRefreshBar(); setStyleSheet(); } diff --git a/src/app/qt/view/QtRefreshView.h b/src/app/qt/view/QtRefreshView.h index 16811347..597e3692 100644 --- a/src/app/qt/view/QtRefreshView.h +++ b/src/app/qt/view/QtRefreshView.h @@ -28,7 +28,7 @@ private: QtThreadedFunctor<> m_refreshViewFunctor; - std::shared_ptr m_widget; + QtRefreshBar* m_widget; }; # endif // QT_REFRESH_VIEW_H diff --git a/src/app/qt/view/QtSearchView.cpp b/src/app/qt/view/QtSearchView.cpp index dc545f01..bbde5c8e 100644 --- a/src/app/qt/view/QtSearchView.cpp +++ b/src/app/qt/view/QtSearchView.cpp @@ -11,7 +11,7 @@ QtSearchView::QtSearchView(ViewLayout* viewLayout) , m_setFocusFunctor(std::bind(&QtSearchView::doSetFocus, this)) , m_setAutocompletionListFunctor(std::bind(&QtSearchView::doSetAutocompletionList, this, std::placeholders::_1)) { - m_widget = std::make_shared(); + m_widget = new QtSearchBar(); setStyleSheet(); } diff --git a/src/app/qt/view/QtSearchView.h b/src/app/qt/view/QtSearchView.h index 1bac8359..01f639f4 100644 --- a/src/app/qt/view/QtSearchView.h +++ b/src/app/qt/view/QtSearchView.h @@ -36,7 +36,7 @@ private: QtThreadedFunctor<> m_setFocusFunctor; QtThreadedFunctor&> m_setAutocompletionListFunctor; - std::shared_ptr m_widget; + QtSearchBar* m_widget; }; # endif // QT_SEARCH_VIEW_H diff --git a/src/app/qt/view/QtUndoRedoView.cpp b/src/app/qt/view/QtUndoRedoView.cpp index e123bdff..14ce118c 100644 --- a/src/app/qt/view/QtUndoRedoView.cpp +++ b/src/app/qt/view/QtUndoRedoView.cpp @@ -9,7 +9,7 @@ QtUndoRedoView::QtUndoRedoView(ViewLayout* viewLayout) , m_setRedoButtonEnabledFunctor(std::bind(&QtUndoRedoView::doSetRedoButtonEnabled, this, std::placeholders::_1)) , m_setUndoButtonEnabledFunctor(std::bind(&QtUndoRedoView::doSetUndoButtonEnabled, this, std::placeholders::_1)) { - m_widget = std::make_shared(); + m_widget = new QtUndoRedo(); setStyleSheet(); } diff --git a/src/app/qt/view/QtUndoRedoView.h b/src/app/qt/view/QtUndoRedoView.h index 101cbb17..62889320 100644 --- a/src/app/qt/view/QtUndoRedoView.h +++ b/src/app/qt/view/QtUndoRedoView.h @@ -31,7 +31,7 @@ private: QtThreadedFunctor m_setUndoButtonEnabledFunctor; void setStyleSheet(); - std::shared_ptr m_widget; + QtUndoRedo* m_widget; }; #endif // !QT_UNDO_REDO_VIEW_H diff --git a/src/app/qt/view/QtViewFactory.cpp b/src/app/qt/view/QtViewFactory.cpp index 42413763..81cb8735 100644 --- a/src/app/qt/view/QtViewFactory.cpp +++ b/src/app/qt/view/QtViewFactory.cpp @@ -1,6 +1,7 @@ #include "qt/view/QtViewFactory.h" #include "qt/view/QtCodeView.h" +#include "qt/view/QtCompositeView.h" #include "qt/view/QtGraphView.h" #include "qt/view/QtMainView.h" #include "qt/view/QtRefreshView.h" @@ -21,32 +22,41 @@ std::shared_ptr QtViewFactory::createMainView() const return std::make_shared(); } +std::shared_ptr QtViewFactory::createCompositeView( + ViewLayout* viewLayout, CompositeView::CompositeDirection direction +) const { + std::shared_ptr ptr = std::make_shared(viewLayout, direction); + ptr->init(); + ptr->addToLayout(); + return ptr; +} + std::shared_ptr QtViewFactory::createCodeView(ViewLayout* viewLayout) const { - return View::create(viewLayout); + return View::createInitAndAddToLayout(viewLayout); } std::shared_ptr QtViewFactory::createGraphView(ViewLayout* viewLayout) const { - return View::create(viewLayout); + return View::createInitAndAddToLayout(viewLayout); } std::shared_ptr QtViewFactory::createRefreshView(ViewLayout* viewLayout) const { - return View::create(viewLayout); + return View::createInitAndAddToLayout(viewLayout); } std::shared_ptr QtViewFactory::createSearchView(ViewLayout* viewLayout) const { - return View::create(viewLayout); + return View::createInitAndAddToLayout(viewLayout); } std::shared_ptr QtViewFactory::createStatusBarView(ViewLayout* viewLayout) const { - return View::createAndDontAddToLayout(viewLayout); + return View::createAndInit(viewLayout); } std::shared_ptr QtViewFactory::createUndoRedoView(ViewLayout* viewLayout) const { - return View::create(viewLayout); + return View::createInitAndAddToLayout(viewLayout); } diff --git a/src/app/qt/view/QtViewFactory.h b/src/app/qt/view/QtViewFactory.h index 62ca74f0..9fd83001 100644 --- a/src/app/qt/view/QtViewFactory.h +++ b/src/app/qt/view/QtViewFactory.h @@ -10,6 +10,9 @@ public: virtual ~QtViewFactory(); virtual std::shared_ptr createMainView() const; + virtual std::shared_ptr createCompositeView( + ViewLayout* viewLayout, CompositeView::CompositeDirection direction) const; + virtual std::shared_ptr createCodeView(ViewLayout* viewLayout) const; virtual std::shared_ptr createGraphView(ViewLayout* viewLayout) const; virtual std::shared_ptr createRefreshView(ViewLayout* viewLayout) const; diff --git a/src/app/qt/view/QtViewWidgetWrapper.cpp b/src/app/qt/view/QtViewWidgetWrapper.cpp index 4c66e1ac..baf6c4ff 100644 --- a/src/app/qt/view/QtViewWidgetWrapper.cpp +++ b/src/app/qt/view/QtViewWidgetWrapper.cpp @@ -22,7 +22,7 @@ QWidget* QtViewWidgetWrapper::getWidgetOfView(const View* view) return widgetWrapper->getWidget(); } -QtViewWidgetWrapper::QtViewWidgetWrapper(std::shared_ptr widget) +QtViewWidgetWrapper::QtViewWidgetWrapper(QWidget* widget) : m_widget(widget) { } @@ -33,5 +33,5 @@ QtViewWidgetWrapper::~QtViewWidgetWrapper() QWidget* QtViewWidgetWrapper::getWidget() { - return m_widget.get(); + return m_widget; } diff --git a/src/app/qt/view/QtViewWidgetWrapper.h b/src/app/qt/view/QtViewWidgetWrapper.h index 9d52a36f..1935c0e1 100644 --- a/src/app/qt/view/QtViewWidgetWrapper.h +++ b/src/app/qt/view/QtViewWidgetWrapper.h @@ -1,8 +1,6 @@ #ifndef QT_VIEW_WIDGET_WRAPPER_H #define QT_VIEW_WIDGET_WRAPPER_H -#include - #include #include "component/view/ViewWidgetWrapper.h" @@ -14,13 +12,13 @@ class QtViewWidgetWrapper: public ViewWidgetWrapper public: static QWidget* getWidgetOfView(const View* view); - QtViewWidgetWrapper(std::shared_ptr widget); + QtViewWidgetWrapper(QWidget* widget); virtual ~QtViewWidgetWrapper(); QWidget* getWidget(); private: - std::shared_ptr m_widget; + QWidget* m_widget; }; #endif // QT_VIEW_WIDGET_WRAPPER_H diff --git a/src/lib/Application.cpp b/src/lib/Application.cpp index 759b0980..c6772979 100644 --- a/src/lib/Application.cpp +++ b/src/lib/Application.cpp @@ -18,11 +18,11 @@ std::shared_ptr Application::create(ViewFactory* viewFactory) ptr->m_graphAccessProxy = std::make_shared(); ptr->m_locationAccessProxy = std::make_shared(); - ptr->m_mainView = viewFactory->createMainView(); ptr->m_componentManager = ComponentManager::create( - viewFactory, ptr->m_mainView.get(), ptr->m_graphAccessProxy.get(), ptr->m_locationAccessProxy.get()); + viewFactory, ptr->m_graphAccessProxy.get(), ptr->m_locationAccessProxy.get()); - ptr->m_componentManager->setup(); + ptr->m_mainView = viewFactory->createMainView(); + ptr->m_componentManager->setup(ptr->m_mainView.get()); ptr->m_mainView->loadLayout(); MessageLoadProject("data/ProjectSettings.xml").dispatch(); diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 7fadc607..ee215dd8 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -48,6 +48,8 @@ add_files( component/view/CodeView.cpp component/view/CodeView.h + component/view/CompositeView.cpp + component/view/CompositeView.h component/view/GraphView.cpp component/view/GraphView.h component/view/MainView.cpp diff --git a/src/lib/component/Component.h b/src/lib/component/Component.h index 2c3037fa..c6d6c5fa 100644 --- a/src/lib/component/Component.h +++ b/src/lib/component/Component.h @@ -36,5 +36,4 @@ ViewType* Component::getView() const return dynamic_cast(m_view.get()); } - #endif // COMPONENT_H diff --git a/src/lib/component/ComponentFactory.cpp b/src/lib/component/ComponentFactory.cpp index ee632b62..fb599a18 100644 --- a/src/lib/component/ComponentFactory.cpp +++ b/src/lib/component/ComponentFactory.cpp @@ -14,16 +14,16 @@ #include "component/view/StatusBarView.h" #include "component/view/UndoRedoView.h" #include "component/view/ViewFactory.h" -#include "component/view/ViewLayout.h" std::shared_ptr ComponentFactory::create( - ViewFactory* viewFactory, ViewLayout* viewLayout, GraphAccess* graphAccess, LocationAccess* locationAccess + ViewFactory* viewFactory, GraphAccess* graphAccess, LocationAccess* locationAccess ){ std::shared_ptr ptr(new ComponentFactory()); + ptr->m_viewFactory = viewFactory; - ptr->m_viewLayout = viewLayout; ptr->m_graphAccess = graphAccess; ptr->m_locationAccess = locationAccess; + return ptr; } @@ -31,61 +31,59 @@ ComponentFactory::~ComponentFactory() { } -std::shared_ptr ComponentFactory::createCodeComponent() +ViewFactory* ComponentFactory::getViewFactory() const { - std::shared_ptr view = m_viewFactory->createCodeView(m_viewLayout); + return m_viewFactory; +} + +std::shared_ptr ComponentFactory::createCodeComponent(ViewLayout* viewLayout) +{ + std::shared_ptr view = m_viewFactory->createCodeView(viewLayout); std::shared_ptr controller = std::make_shared(m_graphAccess, m_locationAccess); - std::shared_ptr component = std::make_shared(view, controller); - return component; + return std::make_shared(view, controller); } -std::shared_ptr ComponentFactory::createGraphComponent() +std::shared_ptr ComponentFactory::createGraphComponent(ViewLayout* viewLayout) { - std::shared_ptr view = m_viewFactory->createGraphView(m_viewLayout); + std::shared_ptr view = m_viewFactory->createGraphView(viewLayout); std::shared_ptr controller = std::make_shared(m_graphAccess); - std::shared_ptr component = std::make_shared(view, controller); - return component; + return std::make_shared(view, controller); } -std::shared_ptr ComponentFactory::createRefreshComponent() +std::shared_ptr ComponentFactory::createRefreshComponent(ViewLayout* viewLayout) { - std::shared_ptr view = m_viewFactory->createRefreshView(m_viewLayout); + std::shared_ptr view = m_viewFactory->createRefreshView(viewLayout); std::shared_ptr controller = std::make_shared(); - std::shared_ptr component = std::make_shared(view, controller); - return component; + return std::make_shared(view, controller); } -std::shared_ptr ComponentFactory::createSearchComponent() +std::shared_ptr ComponentFactory::createSearchComponent(ViewLayout* viewLayout) { - std::shared_ptr view = m_viewFactory->createSearchView(m_viewLayout); + std::shared_ptr view = m_viewFactory->createSearchView(viewLayout); std::shared_ptr controller = std::make_shared(m_graphAccess); - std::shared_ptr component = std::make_shared(view, controller); - return component; + return std::make_shared(view, controller); } -std::shared_ptr ComponentFactory::createUndoRedoComponent() +std::shared_ptr ComponentFactory::createUndoRedoComponent(ViewLayout* viewLayout) { - std::shared_ptr view = m_viewFactory->createUndoRedoView(m_viewLayout); + std::shared_ptr view = m_viewFactory->createUndoRedoView(viewLayout); std::shared_ptr controller = std::make_shared(); - std::shared_ptr component = std::make_shared(view, controller); - return component; + return std::make_shared(view, controller); } -std::shared_ptr ComponentFactory::createStatusBarComponent() +std::shared_ptr ComponentFactory::createStatusBarComponent(ViewLayout* viewLayout) { - std::shared_ptr view = m_viewFactory->createStatusBarView(m_viewLayout); + std::shared_ptr view = m_viewFactory->createStatusBarView(viewLayout); std::shared_ptr controller = std::make_shared(); - std::shared_ptr component = std::make_shared(view,controller); - return component; + return std::make_shared(view, controller); } ComponentFactory::ComponentFactory() { } - diff --git a/src/lib/component/ComponentFactory.h b/src/lib/component/ComponentFactory.h index 61e81333..26a1707d 100644 --- a/src/lib/component/ComponentFactory.h +++ b/src/lib/component/ComponentFactory.h @@ -14,28 +14,28 @@ class ComponentFactory { public: static std::shared_ptr create( - ViewFactory* viewFactory, ViewLayout* viewLayout, GraphAccess* graphAccess, LocationAccess* locationAccess + ViewFactory* viewFactory, GraphAccess* graphAccess, LocationAccess* locationAccess ); ~ComponentFactory(); - std::shared_ptr createCodeComponent(); - std::shared_ptr createGraphComponent(); - std::shared_ptr createRefreshComponent(); - std::shared_ptr createSearchComponent(); - std::shared_ptr createStatusBarComponent(); - std::shared_ptr createUndoRedoComponent(); + ViewFactory* getViewFactory() const; + + std::shared_ptr createCodeComponent(ViewLayout* viewLayout); + std::shared_ptr createGraphComponent(ViewLayout* viewLayout); + std::shared_ptr createRefreshComponent(ViewLayout* viewLayout); + std::shared_ptr createSearchComponent(ViewLayout* viewLayout); + std::shared_ptr createStatusBarComponent(ViewLayout* viewLayout); + std::shared_ptr createUndoRedoComponent(ViewLayout* viewLayout); private: ComponentFactory(); ComponentFactory(const ComponentFactory&); ViewFactory* m_viewFactory; - ViewLayout* m_viewLayout; GraphAccess* m_graphAccess; LocationAccess* m_locationAccess; }; - #endif // COMPONENT_FACTORY_H diff --git a/src/lib/component/ComponentManager.cpp b/src/lib/component/ComponentManager.cpp index 42ad9c16..47e078f9 100644 --- a/src/lib/component/ComponentManager.cpp +++ b/src/lib/component/ComponentManager.cpp @@ -1,13 +1,19 @@ #include "component/ComponentManager.h" #include "component/view/CodeView.h" +#include "component/view/CompositeView.h" #include "component/view/GraphView.h" +#include "component/view/RefreshView.h" +#include "component/view/SearchView.h" +#include "component/view/UndoRedoView.h" +#include "component/view/ViewFactory.h" std::shared_ptr ComponentManager::create( - ViewFactory* viewFactory, ViewLayout* viewLayout, GraphAccess* graphAccess, LocationAccess* locationAccess + ViewFactory* viewFactory, GraphAccess* graphAccess, LocationAccess* locationAccess ){ std::shared_ptr ptr(new ComponentManager()); - ptr->m_componentFactory = ComponentFactory::create(viewFactory, viewLayout, graphAccess, locationAccess); + + ptr->m_componentFactory = ComponentFactory::create(viewFactory, graphAccess, locationAccess); return ptr; } @@ -16,24 +22,28 @@ ComponentManager::~ComponentManager() { } -void ComponentManager::setup() +void ComponentManager::setup(ViewLayout* viewLayout) { - std::shared_ptr graphComponent = m_componentFactory->createGraphComponent(); + std::shared_ptr graphComponent = m_componentFactory->createGraphComponent(viewLayout); m_components.push_back(graphComponent); - std::shared_ptr codeComponent = m_componentFactory->createCodeComponent(); + std::shared_ptr codeComponent = m_componentFactory->createCodeComponent(viewLayout); m_components.push_back(codeComponent); - std::shared_ptr undoRedoComponent = m_componentFactory->createUndoRedoComponent(); + std::shared_ptr compositeView = + m_componentFactory->getViewFactory()->createCompositeView(viewLayout, CompositeView::DIRECTION_HORIZONTAL); + m_views.push_back(compositeView); + + std::shared_ptr undoRedoComponent = m_componentFactory->createUndoRedoComponent(compositeView.get()); m_components.push_back(undoRedoComponent); - std::shared_ptr refreshComponent = m_componentFactory->createRefreshComponent(); + std::shared_ptr refreshComponent = m_componentFactory->createRefreshComponent(compositeView.get()); m_components.push_back(refreshComponent); - std::shared_ptr searchComponent = m_componentFactory->createSearchComponent(); + std::shared_ptr searchComponent = m_componentFactory->createSearchComponent(compositeView.get()); m_components.push_back(searchComponent); - std::shared_ptr statusBarComponent = m_componentFactory->createStatusBarComponent(); + std::shared_ptr statusBarComponent = m_componentFactory->createStatusBarComponent(viewLayout); m_components.push_back(statusBarComponent); } diff --git a/src/lib/component/ComponentManager.h b/src/lib/component/ComponentManager.h index 71cdbbc6..14c83e4e 100644 --- a/src/lib/component/ComponentManager.h +++ b/src/lib/component/ComponentManager.h @@ -9,6 +9,7 @@ #include "data/access/LocationAccess.h" #include "data/access/GraphAccess.h" +class View; class ViewFactory; class ViewLayout; @@ -16,12 +17,12 @@ class ComponentManager { public: static std::shared_ptr create( - ViewFactory* viewFactory, ViewLayout* viewLayout, GraphAccess* graphAccess, LocationAccess* locationAccess + ViewFactory* viewFactory, GraphAccess* graphAccess, LocationAccess* locationAccess ); ~ComponentManager(); - void setup(); + void setup(ViewLayout* viewLayout); private: ComponentManager(); @@ -29,7 +30,8 @@ private: std::shared_ptr m_componentFactory; - std::vector > m_components; + std::vector> m_components; + std::vector> m_views; }; #endif // COMPONENT_MANAGER_H diff --git a/src/lib/component/view/CodeView.cpp b/src/lib/component/view/CodeView.cpp index 21ff0ef1..3f9d374a 100644 --- a/src/lib/component/view/CodeView.cpp +++ b/src/lib/component/view/CodeView.cpp @@ -62,7 +62,7 @@ bool CodeView::CodeSnippetParams::sort(const CodeSnippetParams& a, const CodeSni } CodeView::CodeView(ViewLayout* viewLayout) - : View(viewLayout, Vec2i(100, 100)) + : View(viewLayout) { } diff --git a/src/lib/component/view/CompositeView.cpp b/src/lib/component/view/CompositeView.cpp new file mode 100644 index 00000000..ffa53cd6 --- /dev/null +++ b/src/lib/component/view/CompositeView.cpp @@ -0,0 +1,64 @@ +#include "component/view/CompositeView.h" + +CompositeView::CompositeView(ViewLayout* viewLayout, CompositeDirection direction) + : View(viewLayout) + , m_direction(direction) +{ +} + +CompositeView::~CompositeView() +{ +} + +CompositeView::CompositeDirection CompositeView::getDirection() const +{ + return m_direction; +} + +const std::vector& CompositeView::getViews() const +{ + return m_views; +} + +std::string CompositeView::getName() const +{ + return "CompositeView"; +} + +void CompositeView::addView(View* view) +{ + m_views.push_back(view); + + addViewWidget(view); +} + +void CompositeView::removeView(View* view) +{ + std::vector::iterator it = std::find(m_views.begin(), m_views.end(), view); + if (it == m_views.end()) + { + return; + } + + m_views.erase(it); +} + +void CompositeView::showView(View* view) +{ + getViewLayout()->showView(view); +} + +void CompositeView::hideView(View* view) +{ + getViewLayout()->hideView(view); +} + +void CompositeView::loadLayout() +{ + getViewLayout()->loadLayout(); +} + +void CompositeView::saveLayout() +{ + getViewLayout()->saveLayout(); +} diff --git a/src/lib/component/view/CompositeView.h b/src/lib/component/view/CompositeView.h new file mode 100644 index 00000000..892579c6 --- /dev/null +++ b/src/lib/component/view/CompositeView.h @@ -0,0 +1,46 @@ +#ifndef COMPOSITE_VIEW_H +#define COMPOSITE_VIEW_H + +#include + +#include "component/view/View.h" +#include "component/view/ViewLayout.h" + +class CompositeView + : public View + , public ViewLayout +{ +public: + enum CompositeDirection + { + DIRECTION_HORIZONTAL, + DIRECTION_VERTICAL + }; + + CompositeView(ViewLayout* viewLayout, CompositeDirection direction); + virtual ~CompositeView(); + + CompositeDirection getDirection() const; + const std::vector& getViews() const; + + virtual void addViewWidget(View* view) = 0; + + // View implementation + virtual std::string getName() const; + + // ViewLayout implementation + 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(); + +private: + std::vector m_views; + CompositeDirection m_direction; +}; + +#endif // COMPOSITE_VIEW_H diff --git a/src/lib/component/view/GraphView.cpp b/src/lib/component/view/GraphView.cpp index 5da420c2..265f3da2 100644 --- a/src/lib/component/view/GraphView.cpp +++ b/src/lib/component/view/GraphView.cpp @@ -10,7 +10,7 @@ GraphView::Metrics::Metrics() } GraphView::GraphView(ViewLayout* viewLayout) - : View(viewLayout, Vec2i(100, 100)) + : View(viewLayout) { } diff --git a/src/lib/component/view/RefreshView.cpp b/src/lib/component/view/RefreshView.cpp index 368eef47..67924815 100644 --- a/src/lib/component/view/RefreshView.cpp +++ b/src/lib/component/view/RefreshView.cpp @@ -3,7 +3,7 @@ #include "component/controller/RefreshController.h" RefreshView::RefreshView(ViewLayout* viewLayout) - : View(viewLayout, Vec2i(100, 100)) + : View(viewLayout) { } diff --git a/src/lib/component/view/SearchView.cpp b/src/lib/component/view/SearchView.cpp index e111ff02..b5a2c3b6 100644 --- a/src/lib/component/view/SearchView.cpp +++ b/src/lib/component/view/SearchView.cpp @@ -3,7 +3,7 @@ #include "component/controller/SearchController.h" SearchView::SearchView(ViewLayout* viewLayout) - : View(viewLayout, Vec2i(100, 100)) + : View(viewLayout) { } diff --git a/src/lib/component/view/StatusBarView.cpp b/src/lib/component/view/StatusBarView.cpp index 69f89106..885b0c35 100644 --- a/src/lib/component/view/StatusBarView.cpp +++ b/src/lib/component/view/StatusBarView.cpp @@ -3,7 +3,7 @@ #include "component/controller/StatusBarController.h" StatusBarView::StatusBarView(ViewLayout* viewLayout) - : View(viewLayout, Vec2i(100,100)) + : View(viewLayout) { } diff --git a/src/lib/component/view/UndoRedoView.cpp b/src/lib/component/view/UndoRedoView.cpp index 8441b3db..50aae9bf 100644 --- a/src/lib/component/view/UndoRedoView.cpp +++ b/src/lib/component/view/UndoRedoView.cpp @@ -3,7 +3,7 @@ #include "component/controller/UndoRedoController.h" UndoRedoView::UndoRedoView(ViewLayout* viewLayout) - : View(viewLayout, Vec2i(100,100)) + : View(viewLayout) { } diff --git a/src/lib/component/view/View.cpp b/src/lib/component/view/View.cpp index 13faea36..d4ed7363 100644 --- a/src/lib/component/view/View.cpp +++ b/src/lib/component/view/View.cpp @@ -2,10 +2,9 @@ #include "component/view/ViewWidgetWrapper.h" -View::View(ViewLayout* viewLayout, const Vec2i& minSize) +View::View(ViewLayout* viewLayout) : m_viewLayout(viewLayout) , m_widgetWrapper(nullptr) - , m_minSize(minSize) { } @@ -14,9 +13,16 @@ View::~View() m_viewLayout->removeView(this); } -void View::setWidgetWrapper(std::shared_ptr widgetWrapper) +void View::init() { - m_widgetWrapper = widgetWrapper; + createWidgetWrapper(); + + initView(); +} + +void View::addToLayout() +{ + m_viewLayout->addView(this); } ViewWidgetWrapper* View::getWidgetWrapper() const @@ -29,22 +35,12 @@ void View::setComponent(Component* component) m_component = component; } -int View::getMinWidth() const -{ - return m_minSize.x; -} - -int View::getMinHeight() const -{ - return m_minSize.y; -} - -Vec2i View::getMinSize() const -{ - return m_minSize; -} - ViewLayout* View::getViewLayout() const { return m_viewLayout; } + +void View::setWidgetWrapper(std::shared_ptr widgetWrapper) +{ + m_widgetWrapper = widgetWrapper; +} diff --git a/src/lib/component/view/View.h b/src/lib/component/view/View.h index 8a280435..170b5d69 100644 --- a/src/lib/component/view/View.h +++ b/src/lib/component/view/View.h @@ -14,12 +14,12 @@ class View { public: template - static std::shared_ptr create(ViewLayout* viewLayout); + static std::shared_ptr createInitAndAddToLayout(ViewLayout* viewLayout); template - static std::shared_ptr createAndDontAddToLayout(ViewLayout* viewLayout); + static std::shared_ptr createAndInit(ViewLayout* viewLayout); - View(ViewLayout* viewLayout, const Vec2i& minSize); + View(ViewLayout* viewLayout); virtual ~View(); virtual std::string getName() const = 0; @@ -28,48 +28,43 @@ public: virtual void initView() = 0; virtual void refreshView() = 0; + void init(); + void addToLayout(); + void setComponent(Component* component); - void setWidgetWrapper(std::shared_ptr widgetWrapper); ViewWidgetWrapper* getWidgetWrapper() const; - int getMinWidth() const; - int getMinHeight() const; - Vec2i getMinSize() const; - protected: template ControllerType* getController(); ViewLayout* getViewLayout() const; + void setWidgetWrapper(std::shared_ptr widgetWrapper); + private: Component* m_component; ViewLayout* const m_viewLayout; std::shared_ptr m_widgetWrapper; - Vec2i m_minSize; }; template -std::shared_ptr View::create(ViewLayout* viewLayout) +std::shared_ptr View::createInitAndAddToLayout(ViewLayout* viewLayout) { - std::shared_ptr ptr = std::make_shared(viewLayout); + std::shared_ptr ptr = View::createAndInit(viewLayout); - ptr->createWidgetWrapper(); - ptr->initView(); - - viewLayout->addView(ptr.get()); + ptr->addToLayout(); return ptr; } template -std::shared_ptr View::createAndDontAddToLayout(ViewLayout* viewLayout) +std::shared_ptr View::createAndInit(ViewLayout* viewLayout) { std::shared_ptr ptr = std::make_shared(viewLayout); - ptr->createWidgetWrapper(); - ptr->initView(); + ptr->init(); return ptr; } diff --git a/src/lib/component/view/ViewFactory.h b/src/lib/component/view/ViewFactory.h index 880aa385..cd8c7d8b 100644 --- a/src/lib/component/view/ViewFactory.h +++ b/src/lib/component/view/ViewFactory.h @@ -3,6 +3,8 @@ #include +#include "component/view/CompositeView.h" + class CodeView; class GraphView; class MainView; @@ -19,6 +21,9 @@ public: virtual ~ViewFactory(); virtual std::shared_ptr createMainView() const = 0; + virtual std::shared_ptr createCompositeView( + ViewLayout* viewLayout, CompositeView::CompositeDirection direction) const = 0; + virtual std::shared_ptr createCodeView(ViewLayout* viewLayout) const = 0; virtual std::shared_ptr createGraphView(ViewLayout* viewLayout) const = 0; virtual std::shared_ptr createRefreshView(ViewLayout* viewLayout) const = 0;