Browse Source

completed basic samples

pull/2/head
Skycoder42 7 years ago
parent
commit
316d62201e
  1. 12
      examples/mvvmwidgets/SampleWidgets/SampleWidgets.pro
  2. 4
      examples/mvvmwidgets/SampleWidgets/main.cpp
  3. 2
      examples/mvvmwidgets/SampleWidgets/sampleview.cpp
  4. 7
      examples/mvvmwidgets/SampleWidgets/sampleview.ui
  5. 25
      examples/mvvmwidgets/SampleWidgets/tabitemview.cpp
  6. 26
      examples/mvvmwidgets/SampleWidgets/tabitemview.h
  7. 84
      examples/mvvmwidgets/SampleWidgets/tabitemview.ui
  8. 40
      examples/mvvmwidgets/SampleWidgets/tabview.cpp
  9. 31
      examples/mvvmwidgets/SampleWidgets/tabview.h
  10. 16
      examples/mvvmwidgets/SampleWidgets/tabview.ui
  11. 1
      src/mvvmquick/quickpresenter.cpp
  12. 3
      src/mvvmwidgets/ipresentingview.h
  13. 11
      src/mvvmwidgets/widgetspresenter.cpp
  14. 8
      src/mvvmwidgets/widgetspresenter.h

12
examples/mvvmwidgets/SampleWidgets/SampleWidgets.pro

@ -7,17 +7,23 @@ TARGET = SampleWidgets
HEADERS += \
widgetseventservice.h \
sampleview.h \
resultdialog.h
resultdialog.h \
tabview.h \
tabitemview.h
SOURCES += \
main.cpp \
widgetseventservice.cpp \
sampleview.cpp \
resultdialog.cpp
resultdialog.cpp \
tabview.cpp \
tabitemview.cpp
FORMS += \
sampleview.ui \
resultdialog.ui
resultdialog.ui \
tabview.ui \
tabitemview.ui
target.path = $$[QT_INSTALL_EXAMPLES]/mvvmwidgets/$$TARGET
INSTALLS += target

4
examples/mvvmwidgets/SampleWidgets/main.cpp

@ -6,6 +6,8 @@
#include "widgetseventservice.h"
#include "sampleview.h"
#include "resultdialog.h"
#include "tabview.h"
#include "tabitemview.h"
#define TEST_DIRECT 0
#define TEST_FN 1
@ -21,6 +23,8 @@ int main(int argc, char *argv[])
QtMvvm::WidgetsPresenter::registerAsPresenter();
QtMvvm::WidgetsPresenter::registerView<SampleView>();
QtMvvm::WidgetsPresenter::registerView<ResultDialog>();
QtMvvm::WidgetsPresenter::registerView<TabView>();
QtMvvm::WidgetsPresenter::registerView<TabItemView>();
if(TEST_CURRENT == TEST_DIRECT)
QtMvvm::ServiceRegistry::instance()->registerObject<EchoService>();

2
examples/mvvmwidgets/SampleWidgets/sampleview.cpp

@ -28,6 +28,8 @@ SampleView::SampleView(QtMvvm::ViewModel *viewModel, QWidget *parent) :
_viewModel, &SampleViewModel::getInput);
connect(ui->actionAdd_Files, &QAction::triggered,
_viewModel, &SampleViewModel::getFiles);
connect(ui->actionShow_Tabs, &QAction::triggered,
_viewModel, &SampleViewModel::showTabs);
}
SampleView::~SampleView()

7
examples/mvvmwidgets/SampleWidgets/sampleview.ui

@ -106,6 +106,8 @@
<property name="title">
<string>&amp;Actions</string>
</property>
<addaction name="actionShow_Tabs"/>
<addaction name="separator"/>
<addaction name="actionUseless_Input"/>
<addaction name="actionAdd_Files"/>
</widget>
@ -128,6 +130,11 @@
<string>Add &amp;Files</string>
</property>
</action>
<action name="actionShow_Tabs">
<property name="text">
<string>Show &amp;Tabs</string>
</property>
</action>
</widget>
<resources/>
<connections/>

25
examples/mvvmwidgets/SampleWidgets/tabitemview.cpp

@ -0,0 +1,25 @@
#include "tabitemview.h"
#include "ui_tabitemview.h"
#include <QtMvvmCore/Binding>
TabItemView::TabItemView(QtMvvm::ViewModel *viewModel, QWidget *parent) :
QWidget(parent),
_viewModel(static_cast<TabItemViewModel*>(viewModel)),
ui(new Ui::TabItemView)
{
ui->setupUi(this);
QtMvvm::bind(_viewModel, "title",
ui->checkBox, "text",
QtMvvm::Binding::OneWayToView);
}
TabItemView::~TabItemView()
{
delete ui;
}
TabItemViewModel *TabItemView::viewModel() const
{
return _viewModel;
}

26
examples/mvvmwidgets/SampleWidgets/tabitemview.h

@ -0,0 +1,26 @@
#ifndef TABITEMVIEW_H
#define TABITEMVIEW_H
#include <QWidget>
#include <tabviewmodel.h>
namespace Ui {
class TabItemView;
}
class TabItemView : public QWidget
{
Q_OBJECT
public:
Q_INVOKABLE explicit TabItemView(QtMvvm::ViewModel *viewModel, QWidget *parent = nullptr);
~TabItemView();
TabItemViewModel *viewModel() const;
private:
TabItemViewModel *_viewModel;
Ui::TabItemView *ui;
};
#endif // TABITEMVIEW_H

84
examples/mvvmwidgets/SampleWidgets/tabitemview.ui

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>TabItemView</class>
<widget class="QWidget" name="TabItemView">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>119</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="checkBox">
<property name="text">
<string>CheckBox</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>119</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

40
examples/mvvmwidgets/SampleWidgets/tabview.cpp

@ -0,0 +1,40 @@
#include "tabview.h"
#include "ui_tabview.h"
#include "tabitemview.h"
TabView::TabView(QtMvvm::ViewModel *viewModel, QWidget *parent) :
QTabWidget(parent),
IPresentingView(),
_viewModel(static_cast<TabViewModel*>(viewModel)),
ui(new Ui::TabView)
{
setWindowFlags(windowFlags() | Qt::Window);
ui->setupUi(this);
tabBar()->addTab(QStringLiteral("+"));
connect(tabBar(), &QTabBar::tabBarClicked,
this, &TabView::trigger);
}
TabView::~TabView()
{
delete ui;
}
bool TabView::tryPresent(QWidget *view)
{
auto itemView = qobject_cast<TabItemView*>(view);
if(itemView) {
insertTab(count() - 1, itemView, itemView->viewModel()->title());
tabBar()->setCurrentIndex(tabBar()->count() - 2);
return true;
} else
return true;
}
void TabView::trigger(int index)
{
tabBar()->setCurrentIndex(tabBar()->count() - 1);
if(index == tabBar()->count() - 1)
_viewModel->addTab();
}

31
examples/mvvmwidgets/SampleWidgets/tabview.h

@ -0,0 +1,31 @@
#ifndef TABVIEW_H
#define TABVIEW_H
#include <QtWidgets/QTabWidget>
#include <QtMvvmWidgets/IPresentingView>
#include <tabviewmodel.h>
namespace Ui {
class TabView;
}
class TabView : public QTabWidget, public QtMvvm::IPresentingView
{
Q_OBJECT
Q_INTERFACES(QtMvvm::IPresentingView)
public:
Q_INVOKABLE explicit TabView(QtMvvm::ViewModel *viewModel, QWidget *parent = nullptr);
~TabView();
bool tryPresent(QWidget *view) override;
private Q_SLOTS:
void trigger(int index);
private:
TabViewModel *_viewModel;
Ui::TabView *ui;
};
#endif // TABVIEW_H

16
examples/mvvmwidgets/SampleWidgets/tabview.ui

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>TabView</class>
<widget class="QTabWidget" name="TabView">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
</widget>
<resources/>
<connections/>
</ui>

1
src/mvvmquick/quickpresenter.cpp

@ -103,6 +103,7 @@ QUrl QuickPresenter::findViewUrl(const QMetaObject *viewModelType)
while(iterator.hasNext()) {
iterator.next();
if(iterator.fileName().size() < shortest) {
shortest = iterator.fileName().size();
if(dir.startsWith(QStringLiteral(":"))) {
resUrl.clear();
resUrl.setScheme(QStringLiteral("qrc"));

3
src/mvvmwidgets/ipresentingview.h

@ -17,4 +17,7 @@ public:
}
#define QtMvvm_IPresentingViewIid "de.skycoder42.qtmvvm.widgets.IPresentingView"
Q_DECLARE_INTERFACE(QtMvvm::IPresentingView, QtMvvm_IPresentingViewIid)
#endif // QTMVVM_IPRESENTINGVIEW_H

11
src/mvvmwidgets/widgetspresenter.cpp

@ -121,11 +121,18 @@ const QMetaObject *WidgetsPresenter::findWidgetMetaObject(const QMetaObject *vie
auto lIndex = cName.lastIndexOf("ViewModel");
if(lIndex > 0)
cName.truncate(lIndex);
auto shortest = std::numeric_limits<int>::max();
const QMetaObject *res = nullptr;
for(auto metaObject : d->implicitMappings) {
QByteArray vName = metaObject->className();
if(vName.startsWith(cName))
return metaObject;
if(vName.startsWith(cName) && vName.size() < shortest) {
shortest = vName.size();
res = metaObject;
}
}
if(res)
return res;
}
currentMeta = currentMeta->superClass();

8
src/mvvmwidgets/widgetspresenter.h

@ -77,6 +77,10 @@ template<typename TView>
void WidgetsPresenter::registerView()
{
static_assert(std::is_base_of<QWidget, TView>::value, "TWidget must inherit QWidget!");
if(false) { //compile time check for the constructor
Q_UNREACHABLE();
Q_UNUSED(new TView(static_cast<ViewModel*>(nullptr), static_cast<QWidget*>(nullptr)))
}
registerView(&TView::staticMetaObject);
}
@ -85,6 +89,10 @@ void WidgetsPresenter::registerViewExplicitly()
{
static_assert(std::is_base_of<QWidget, TView>::value, "TWidget must inherit QWidget!");
static_assert(std::is_base_of<ViewModel, TViewModel>::value, "TViewModel must inherit ViewModel!");
if(false) { //compile time check for the constructor
Q_UNREACHABLE();
Q_UNUSED(new TView(static_cast<ViewModel*>(nullptr), static_cast<QWidget*>(nullptr)))
}
registerViewExplicitly(&TViewModel::staticMetaObject, &TView::staticMetaObject);
}

Loading…
Cancel
Save