From a1737ecbd0aaea0aa8ce34557663cf0b4cdb8910 Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Fri, 30 May 2014 22:15:28 +0200 Subject: Unified and simplified the widget creation api. --- form.hpp | 27 ++++++++------------------- main.cpp | 11 +++++------ qt_adapter.hpp | 37 ++++++++++++++++++++++++++++++++++--- 3 files changed, 47 insertions(+), 28 deletions(-) diff --git a/form.hpp b/form.hpp index e90a3da..66a798e 100644 --- a/form.hpp +++ b/form.hpp @@ -144,7 +144,7 @@ private slots: //This base is required because an QObject may not be templated and Form is a class template. //Slots can be virtual however. -class QtFormBase : public QObject +class QtFormBase : public QMdiArea { Q_OBJECT @@ -159,12 +159,12 @@ template struct Form : public QtFormBase, public FusionModelObserver { std::shared_ptr model; - QMdiArea* area; QVBoxLayout* layout; QFormLayout* form_layout; QHBoxLayout* button_layout; QPushButton* prev; QLineEdit* jump_edit; + QLabel* label; QPushButton* next; std::vector> updatehandlers; std::map line_edits; @@ -173,12 +173,12 @@ struct Form : public QtFormBase, public FusionModelObserver { Form(std::shared_ptr model) : model(model) - , area(new QMdiArea()) , layout(new QVBoxLayout()) , form_layout(new QFormLayout()) , button_layout(new QHBoxLayout()) , prev(new QPushButton("&Previous")) , jump_edit(new QLineEdit()) + , label(new QLabel()) , next(new QPushButton("&Next")) , updatehandlers() , line_edits() @@ -196,18 +196,20 @@ struct Form : public QtFormBase, public FusionModelObserver { layout->addLayout(form_layout); layout->addLayout(button_layout); + label->setText("/" + QString::number(model->row_count())); + label->setMaximumWidth(100); + button_layout->addWidget(prev); button_layout->addWidget(jump_edit); + button_layout->addWidget(label); button_layout->addWidget(next); button_layout->setAlignment(Qt::AlignHCenter); - area->setLayout(layout); + setLayout(layout); setup_gui(); fill_data(); - area->updateGeometry(); - set_button_state(); connect( prev, SIGNAL(clicked()), @@ -310,17 +312,4 @@ struct Form : public QtFormBase, public FusionModelObserver { int i = clamp_index(current_index + 1); set_current_index(i); } - - QWidget* get_widget() - { - return area; - } }; - -template -std::shared_ptr> make_form(std::shared_ptr model) -{ - auto ret = std::make_shared>(model); - model->add_observer(ret); - return ret; -} diff --git a/main.cpp b/main.cpp index b631722..2adb4e8 100644 --- a/main.cpp +++ b/main.cpp @@ -85,16 +85,15 @@ int main() MainWindow w; - auto widget1 = std::make_shared(model); - auto widget2 = make_qt_widget(model); - auto widget3 = make_qt_widget(mapping); + auto widget1 = make_qt_widget(model); + auto widget2 = make_qt_widget(model); + auto widget3 = make_qt_widget(mapping); + auto widget4 = make_qt_widget(model); - auto form = make_form(model); - - w.add_widget(form->get_widget()); w.add_widget(widget1.get()); w.add_widget(widget2.get()); w.add_widget(widget3.get()); + w.add_widget(widget4.get());; int ret = w.show_and_run(); diff --git a/qt_adapter.hpp b/qt_adapter.hpp index 9a5c383..405f4f9 100644 --- a/qt_adapter.hpp +++ b/qt_adapter.hpp @@ -4,6 +4,7 @@ #include "boost_any_qvariant_convert.hpp" #include "meta_types.hpp" #include "gui_item_delegate.hpp" +#include "form.hpp" #include #include @@ -16,6 +17,12 @@ #include #include +namespace Gui +{ + struct Table{}; + struct Form{}; +} + template struct QtModelType { @@ -215,9 +222,33 @@ struct WidgetType { typedef typename AdapterType::type::widget type; }; -template -std::shared_ptr::type> make_qt_widget(std::shared_ptr x) +//Generate a default Table-based widget. +template +typename std::enable_if::value, std::shared_ptr::type>>::type +make_qt_widget(std::shared_ptr model, Args... args) { - auto widget_ptr = std::make_shared::type>(x); + auto widget_ptr = std::make_shared::type>(model, args...); return widget_ptr; } + +//Generate a default Form based widget. +template +typename std::enable_if::value, std::shared_ptr>>::type +make_qt_widget(std::shared_ptr model, Args... args) +{ + auto widget_ptr = std::make_shared>(model, args...); + return widget_ptr; +} + +//Generate a custom widget thats is neither a default Form or Table, for total specialisation of the function. +template +typename std::enable_if< + !std::is_same::value && + !std::is_same::value, std::shared_ptr +>::type +make_qt_widget(std::shared_ptr model, Args... args) +{ + auto widget_ptr = std::make_shared(model, args...); + return widget_ptr; +} + -- cgit v1.2.3-70-g09d2