ui: basic search view

- Added a basic SearchView (+ controller and qt implementation)
- SearchView can set the active element of other views by dispatching a message.
- SearchView adjusts its text when the active element is changed by other views.
- Added wrappers for Button and EditBox that allow the usage of simple callback functions.
This commit is contained in:
malte_langkabel
2014-07-04 13:43:27 +02:00
parent 9297ea6d6d
commit b1023ba4ac
22 changed files with 356 additions and 6 deletions
+6
View File
@@ -3,8 +3,12 @@ add_files(
qt/element/QtCodeFile.cpp
qt/element/QtCodeFile.h
qt/element/QtButton.cpp
qt/element/QtButton.h
qt/element/QtCodeSnippet.cpp
qt/element/QtCodeSnippet.h
qt/element/QtEditBox.cpp
qt/element/QtEditBox.h
qt/element/QtMainWindow.cpp
qt/element/QtMainWindow.h
@@ -23,6 +27,8 @@ add_files(
qt/view/QtGraphView.h
qt/view/QtMainView.cpp
qt/view/QtMainView.h
qt/view/QtSearchView.cpp
qt/view/QtSearchView.h
qt/QtGuiFactory.cpp
qt/QtGuiFactory.h
+6
View File
@@ -3,6 +3,7 @@
#include "qt/view/QtCodeView.h"
#include "qt/view/QtGraphView.h"
#include "qt/view/QtMainView.h"
#include "qt/view/QtSearchView.h"
QtGuiFactory::QtGuiFactory()
{
@@ -26,3 +27,8 @@ std::shared_ptr<GraphView> QtGuiFactory::createGraphView(ViewLayout* viewLayout)
{
return View::create<QtGraphView>(viewLayout);
}
std::shared_ptr<SearchView> QtGuiFactory::createSearchView(ViewLayout* viewLayout) const
{
return View::create<QtSearchView>(viewLayout);
}
+1
View File
@@ -12,6 +12,7 @@ public:
virtual std::shared_ptr<MainView> createMainView() const;
virtual std::shared_ptr<CodeView> createCodeView(ViewLayout* viewLayout) const;
virtual std::shared_ptr<GraphView> createGraphView(ViewLayout* viewLayout) const;
virtual std::shared_ptr<SearchView> createSearchView(ViewLayout* viewLayout) const;
};
#endif // QT_GUI_FACTORY_H
+23
View File
@@ -0,0 +1,23 @@
#include "qt/element/QtButton.h"
QtButton::QtButton(QWidget *parent)
: QPushButton(parent)
, m_onClick(nullptr)
{
connect(this, SIGNAL(clicked()), this, SLOT(slotOnClick()));
}
QtButton::~QtButton()
{
}
void QtButton::setCallbackOnClick(std::function<void(void)> callback)
{
m_onClick = callback;
}
void QtButton::slotOnClick()
{
if (m_onClick)
m_onClick();
}
+25
View File
@@ -0,0 +1,25 @@
#ifndef QT_BUTTON_H
#define QT_BUTTON_H
#include <functional>
#include <QPushButton>
class QtButton: public QPushButton
{
Q_OBJECT
public:
QtButton(QWidget *parent);
~QtButton();
void setCallbackOnClick(std::function<void(void)> callback);
private slots:
void slotOnClick();
private:
std::function<void(void)> m_onClick;
};
#endif // QT_BUTTON_H
+23
View File
@@ -0,0 +1,23 @@
#include "qt/element/QtEditBox.h"
QtEditBox::QtEditBox(QWidget *parent)
: QLineEdit(parent)
, m_onReturnPressed(nullptr)
{
connect(this, SIGNAL(returnPressed()), this, SLOT(slotOnReturnPressed()));
}
QtEditBox::~QtEditBox()
{
}
void QtEditBox::setCallbackOnReturnPressed(std::function<void(void)> callback)
{
m_onReturnPressed = callback;
}
void QtEditBox::slotOnReturnPressed()
{
if (m_onReturnPressed)
m_onReturnPressed();
}
+25
View File
@@ -0,0 +1,25 @@
#ifndef QT_EDIT_BOX_H
#define QT_EDIT_BOX_H
#include <functional>
#include <QLineEdit>
class QtEditBox: public QLineEdit
{
Q_OBJECT
public:
QtEditBox(QWidget *parent);
~QtEditBox();
void setCallbackOnReturnPressed(std::function<void(void)> callback);
private slots:
void slotOnReturnPressed();
private:
std::function<void(void)> m_onReturnPressed;
};
#endif // QT_EDIT_BOX_H
+58
View File
@@ -0,0 +1,58 @@
#include "qt/view/QtSearchView.h"
#include <QtWidgets>
#include "qt/element/QtButton.h"
#include "qt/element/QtEditBox.h"
#include "qt/QtWidgetWrapper.h"
#include "qt/utility/utilityQt.h"
#include "component/controller/SearchController.h"
QtSearchView::QtSearchView(ViewLayout* viewLayout)
: SearchView(viewLayout)
{
}
QtSearchView::~QtSearchView()
{
}
void QtSearchView::createWidgetWrapper()
{
setWidgetWrapper(std::make_shared<QtWidgetWrapper>(std::make_shared<QFrame>()));
}
void QtSearchView::initGui()
{
QWidget* widget = QtWidgetWrapper::getWidgetOfView(this);
utility::setWidgetBackgroundColor(widget, Colori(190, 190, 190, 255));
QBoxLayout* layout = new QBoxLayout(QBoxLayout::LeftToRight);
layout->setSpacing(3);
layout->setContentsMargins(3, 3, 3, 3);
widget->setLayout(layout);
m_searchBox = new QtEditBox(widget);
m_searchBox->setPlaceholderText("Please enter your search string.");
m_searchBox->setCallbackOnReturnPressed(std::bind(&QtSearchView::onSeachButtonClick, this));
m_searchButton = new QtButton(widget);
m_searchButton->setText("Search");
m_searchButton->setCallbackOnClick(std::bind(&QtSearchView::onSeachButtonClick, this));
widget->layout()->addWidget(m_searchBox);
widget->layout()->addWidget(m_searchButton);
}
void QtSearchView::setText(const std::string& s) const
{
if (m_searchBox->text() != s.c_str())
{
m_searchBox->setText(s.c_str());
}
}
void QtSearchView::onSeachButtonClick()
{
getController()->search(m_searchBox->text().toStdString());
}
+29
View File
@@ -0,0 +1,29 @@
#ifndef QT_SEARCH_VIEW_H
#define QT_SEARCH_VIEW_H
#include "component/view/SearchView.h"
class QtEditBox;
class QtButton;
class QtSearchView: public SearchView
{
public:
QtSearchView(ViewLayout* viewLayout);
~QtSearchView();
// View implementation
virtual void createWidgetWrapper();
virtual void initGui();
// SearchView implementation
virtual void setText(const std::string& s) const;
private:
void onSeachButtonClick();
QtEditBox* m_searchBox;
QtButton* m_searchButton;
};
# endif // QT_SEARCH_VIEW_H
+4
View File
@@ -22,6 +22,8 @@ add_files(
component/controller/Controller.h
component/controller/GraphController.cpp
component/controller/GraphController.h
component/controller/SearchController.cpp
component/controller/SearchController.h
component/view/graphElements/GraphNode.cpp
component/view/graphElements/GraphNode.h
@@ -32,6 +34,8 @@ add_files(
component/view/GraphView.h
component/view/MainView.cpp
component/view/MainView.h
component/view/SearchView.cpp
component/view/SearchView.h
component/view/View.cpp
component/view/View.h
component/view/ViewLayout.cpp
+11
View File
@@ -3,8 +3,10 @@
#include "component/Component.h"
#include "component/controller/CodeController.h"
#include "component/controller/GraphController.h"
#include "component/controller/SearchController.h"
#include "component/view/CodeView.h"
#include "component/view/GraphView.h"
#include "component/view/SearchView.h"
#include "component/view/ViewLayout.h"
#include "gui/GuiFactory.h"
@@ -44,6 +46,15 @@ std::shared_ptr<Component> ComponentFactory::createGraphComponent()
return component;
}
std::shared_ptr<Component> ComponentFactory::createSearchComponent()
{
std::shared_ptr<SearchView> view = m_guiFactory->createSearchView(m_viewLayout);
std::shared_ptr<SearchController> controller = std::make_shared<SearchController>(m_graphAccess);
std::shared_ptr<Component> component = std::make_shared<Component>(view, controller);
return component;
}
ComponentFactory::ComponentFactory()
{
}
+1
View File
@@ -23,6 +23,7 @@ public:
std::shared_ptr<Component> createCodeComponent();
std::shared_ptr<Component> createGraphComponent();
std::shared_ptr<Component> createSearchComponent();
private:
ComponentFactory();
+3 -1
View File
@@ -28,11 +28,13 @@ void ComponentManager::setup()
GraphView* graphView = graphComponent->getView<GraphView>();
graphView->addNode(Vec2i(-100, -100), "foo");
graphView->addNode(Vec2i(50, 50), "bar");
m_components.push_back(graphComponent);
std::shared_ptr<Component> codeComponent = m_componentFactory->createCodeComponent();
m_components.push_back(codeComponent);
std::shared_ptr<Component> searchComponent = m_componentFactory->createSearchComponent();
m_components.push_back(searchComponent);
}
ComponentManager::ComponentManager()
@@ -17,7 +17,9 @@ struct AnnotatedText
Id tokenId;
};
class CodeController: public Controller, public MessageListener<MessageActivateToken>
class CodeController
: public Controller
, public MessageListener<MessageActivateToken>
{
public:
CodeController(std::shared_ptr<LocationAccess> locationAccess);
@@ -0,0 +1,40 @@
#include "component/controller/SearchController.h"
#include "component/view/SearchView.h"
#include "data/access/GraphAccess.h"
#include "utility/messaging/type/MessageActivateToken.h"
SearchController::SearchController(std::shared_ptr<GraphAccess> graphAccess)
: m_graphAccess(graphAccess)
{
}
SearchController::~SearchController()
{
}
void SearchController::search(const std::string& s)
{
LOG_INFO("searching string: \"" + s + "\"");
Id nodeId = m_graphAccess->getIdForNodeWithName(s);
if (nodeId > 0)
{
LOG_INFO("Node with name \"" + s + "\" found.");
MessageActivateToken message(nodeId);
message.dispatch();
}
else
{
LOG_INFO("Node with name \"" + s + "\" not found.");
}
}
void SearchController::handleMessage(MessageActivateToken* message)
{
getView()->setText(m_graphAccess->getNameForNodeWithId(message->tokenId));
}
SearchView* SearchController::getView()
{
return Controller::getView<SearchView>();
}
@@ -0,0 +1,31 @@
#ifndef SEARCH_CONTROLLER_H
#define SEARCH_CONTROLLER_H
#include <string>
#include "component/controller/Controller.h"
#include "utility/messaging/MessageListener.h"
#include "utility/messaging/type/MessageActivateToken.h"
class GraphAccess;
class SearchView;
class SearchController
: public Controller
, public MessageListener<MessageActivateToken>
{
public:
SearchController(std::shared_ptr<GraphAccess> graphAccess);
~SearchController();
void search(const std::string& s);
//void autocomplete(const std::string& s);
private:
virtual void handleMessage(MessageActivateToken* message);
SearchView* getView();
std::shared_ptr<GraphAccess> m_graphAccess;
};
#endif // SEARCH_CONTROLLER_H
+22
View File
@@ -0,0 +1,22 @@
#include "component/view/SearchView.h"
#include "component/controller/SearchController.h"
SearchView::SearchView(ViewLayout* viewLayout)
: View(viewLayout, Vec2i(100, 100))
{
}
SearchView::~SearchView()
{
}
std::string SearchView::getName() const
{
return "SearchView";
}
SearchController* SearchView::getController()
{
return View::getController<SearchController>();
}
+22
View File
@@ -0,0 +1,22 @@
#ifndef SEARCH_VIEW_H
#define SEARCH_VIEW_H
#include "component/view/View.h"
class SearchController;
class SearchView : public View
{
public:
SearchView(ViewLayout* viewLayout);
virtual ~SearchView();
virtual std::string getName() const;
virtual void setText(const std::string& s) const = 0;
protected:
SearchController* getController();
};
#endif // SEARCH_VIEW_H
+13 -2
View File
@@ -175,9 +175,20 @@ void Storage::logLocations() const
LOG_INFO(str.str());
}
Token* Storage::getToken(Id tokenId) const
Id Storage::getIdForNodeWithName(const std::string& name) const
{
return m_graph.getTokenById(tokenId); // Todo: copy information.
Node* node = m_graph.findNode([&](Node* node){
return node->getName() == name;
});
return (node ? node->getId() : 0);
}
std::string Storage::getNameForNodeWithId(Id id) const
{
Node* node = m_graph.getNodeById(id);
return (node ? node->getName() : "");
}
TokenLocationCollection Storage::getTokenLocationsForTokenId(Id id) const
+4 -1
View File
@@ -45,8 +45,11 @@ public:
void logGraph() const;
void logLocations() const;
virtual Token* getToken(Id tokenId) const;
// GraphAccess implementation
virtual Id getIdForNodeWithName(const std::string& name) const;
virtual std::string getNameForNodeWithId(Id id) const;
// LocationAccess implementation
virtual TokenLocationCollection getTokenLocationsForTokenId(Id locationId) const;
virtual TokenLocationFile getTokenLocationsForLinesInFile(
const std::string& fileName, unsigned int firstLineNumber, unsigned int lastLineNumber
+4 -1
View File
@@ -1,6 +1,8 @@
#ifndef GRAPH_ACCESS_H
#define GRAPH_ACCESS_H
#include <string>
#include "utility/types.h"
class Token;
@@ -10,7 +12,8 @@ class GraphAccess
public:
virtual ~GraphAccess();
virtual Token* getToken(Id tokenId) const = 0;
virtual Id getIdForNodeWithName(const std::string& name) const = 0;
virtual std::string getNameForNodeWithId(Id id) const = 0;
};
+2
View File
@@ -6,6 +6,7 @@
class CodeView;
class GraphView;
class MainView;
class SearchView;
class ViewLayout;
class GuiFactory
@@ -17,6 +18,7 @@ public:
virtual std::shared_ptr<MainView> createMainView() const = 0;
virtual std::shared_ptr<CodeView> createCodeView(ViewLayout* viewLayout) const = 0;
virtual std::shared_ptr<GraphView> createGraphView(ViewLayout* viewLayout) const = 0;
virtual std::shared_ptr<SearchView> createSearchView(ViewLayout* viewLayout) const = 0;
};
#endif // GUI_FACTORY_H