playground QskDataControlMapper
This commit is contained in:
parent
87c16d453b
commit
7e8ef3296c
|
@ -0,0 +1,8 @@
|
|||
############################################################################
|
||||
# QSkinny - Copyright (C) The authors
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
############################################################################
|
||||
|
||||
qsk_add_example(models Window.h Window.cpp QskDataControlMapper.cpp QskDataControlMapper.h main.cpp)
|
||||
|
||||
target_link_libraries(models PRIVATE Qt::Sql)
|
|
@ -0,0 +1,78 @@
|
|||
//
|
||||
// Created by aldo on 27/01/21.
|
||||
//
|
||||
|
||||
#include "QskDataControlMapper.h"
|
||||
|
||||
QskDataControlMapper::QskDataControlMapper() : m(nullptr){
|
||||
|
||||
}
|
||||
|
||||
void QskDataControlMapper::addMapping(QskControl *widget, int section) {
|
||||
if(widget)
|
||||
addMapping(widget,section,widget->metaObject()->userProperty().name());
|
||||
}
|
||||
|
||||
void QskDataControlMapper::addMapping(QskControl *widget, int section, const QByteArray &propertyName) {
|
||||
Item item;
|
||||
item.control=widget;
|
||||
item.section=section;
|
||||
item.property=propertyName;
|
||||
item.index=m->index(currentIndex.row(),section);
|
||||
items.append(item);
|
||||
}
|
||||
|
||||
void QskDataControlMapper::setModel(QAbstractItemModel *model) {
|
||||
m=model;
|
||||
currentIndex=QModelIndex();
|
||||
if(m) {
|
||||
connect(m,&QAbstractItemModel::dataChanged,this,
|
||||
&QskDataControlMapper::_dataChanged);
|
||||
}
|
||||
}
|
||||
|
||||
bool QskDataControlMapper::qContainsIndex(const QModelIndex & idx, const QModelIndex & topLeft, const QModelIndex & bottomRight)
|
||||
{
|
||||
return idx.row() >= topLeft.row() && idx.row() <= bottomRight.row()
|
||||
&& idx.column() >= topLeft.column() && idx.column() <= bottomRight.column();
|
||||
}
|
||||
|
||||
void QskDataControlMapper::_dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight, const QVector<int> &)
|
||||
{
|
||||
for (auto& x : items) {
|
||||
if (qContainsIndex(x.index, topLeft, bottomRight)) {
|
||||
populate(x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QskDataControlMapper::populate(QskDataControlMapper::Item & x)
|
||||
{
|
||||
x.control->setProperty(x.property,
|
||||
m->index(currentIndex.row(),x.section).data(Qt::EditRole));
|
||||
}
|
||||
|
||||
void QskDataControlMapper::populate()
|
||||
{
|
||||
for (auto& x : items) {
|
||||
populate(x);
|
||||
}
|
||||
}
|
||||
|
||||
void QskDataControlMapper::submit() {
|
||||
if(!m)
|
||||
return;
|
||||
for(auto & x : items) {
|
||||
m->setData(m->index(currentIndex.row(), x.section),
|
||||
x.control->property(x.property));
|
||||
}
|
||||
}
|
||||
|
||||
void QskDataControlMapper::setCurrentIndex(int index) {
|
||||
if(!m)
|
||||
return;
|
||||
currentIndex=m->index(index,0);
|
||||
populate();
|
||||
}
|
||||
|
||||
#include "moc_QskDataControlMapper.cpp"
|
|
@ -0,0 +1,54 @@
|
|||
#ifndef QSKDATACONTROLMAPPER_H
|
||||
#define QSKDATACONTROLMAPPER_H
|
||||
|
||||
#include <QskControl.h>
|
||||
#include <QAbstractItemModel>
|
||||
|
||||
class QskDataControlMapper : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
private:
|
||||
|
||||
struct Item;
|
||||
|
||||
public:
|
||||
|
||||
QskDataControlMapper();
|
||||
|
||||
void addMapping(QskControl* widget, int section);
|
||||
void addMapping(QskControl* widget, int section, const QByteArray &propertyName);
|
||||
|
||||
void setModel(QAbstractItemModel* model);
|
||||
|
||||
static bool qContainsIndex(const QModelIndex &idx, const QModelIndex &topLeft,
|
||||
const QModelIndex &bottomRight);
|
||||
|
||||
void _dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &);
|
||||
|
||||
void populate(QskDataControlMapper::Item & x);
|
||||
|
||||
void populate ();
|
||||
|
||||
void submit();
|
||||
|
||||
void setCurrentIndex(int index);
|
||||
|
||||
private:
|
||||
|
||||
QList<Item> items;
|
||||
|
||||
QAbstractItemModel* m;
|
||||
QPersistentModelIndex currentIndex;
|
||||
|
||||
struct Item {
|
||||
QPointer<QskControl> control;
|
||||
int section;
|
||||
QByteArray property;
|
||||
QPersistentModelIndex index;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif //QSKDATACONTROLMAPPER_H
|
|
@ -0,0 +1,67 @@
|
|||
/******************************************************************************
|
||||
* QSkinny - Copyright (C) The authors
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*****************************************************************************/
|
||||
|
||||
#include "Window.h"
|
||||
|
||||
#include "QskSpinBox.h"
|
||||
|
||||
#include <QskDialogButtonBox.h>
|
||||
#include <QskLinearBox.h>
|
||||
#include <QskPushButton.h>
|
||||
#include <QskTextInput.h>
|
||||
|
||||
#include <QskDataControlMapper.h>
|
||||
|
||||
#include <QSqlTableModel>
|
||||
#include <QSqlDatabase>
|
||||
#include <QSqlQuery>
|
||||
|
||||
Window::Window( )
|
||||
|
||||
{
|
||||
auto db = QSqlDatabase::addDatabase("QSQLITE");
|
||||
db.setDatabaseName(":memory:");
|
||||
db.open();
|
||||
QSqlQuery q(db);
|
||||
q.exec("create table test(id integer,value text);");
|
||||
q.exec("insert into test (id,value) values (1,'HELLO');");
|
||||
q.exec("insert into test (id,value) values (2,'WORLD');");
|
||||
|
||||
auto table = new QSqlTableModel (nullptr,db);
|
||||
table->setTable( "test" );
|
||||
table->select();
|
||||
|
||||
auto txt = new QskTextInput();
|
||||
auto spin = new QskSpinBox();
|
||||
|
||||
auto mapper = new QskDataControlMapper();
|
||||
mapper->setModel(table);
|
||||
/*
|
||||
Not needed if we set USER true for the corresponding Q_PROPERTY in QskBoundedInput and QskTextInput
|
||||
maybe could be done also for other controls
|
||||
mapper->addMapping(spin, 0,"value");
|
||||
mapper->addMapping(txt, 1, "text");
|
||||
*/
|
||||
mapper->addMapping(spin, 0); // needs USER=true for value in QskBoundedInput
|
||||
mapper->addMapping(txt, 1); // needs USER=true for text in QskTextInput
|
||||
|
||||
mapper->setCurrentIndex(0);
|
||||
|
||||
auto v = new QskLinearBox(Qt::Vertical);
|
||||
v->addSpacer( 0,100 );
|
||||
v->addItem( spin );
|
||||
v->addItem( txt );
|
||||
addItem(v);
|
||||
auto h = new QskLinearBox(Qt::Horizontal);
|
||||
auto prev = new QskPushButton("<",h);
|
||||
auto next = new QskPushButton(">",h);
|
||||
connect(prev,&QskPushButton::clicked,[=]() { mapper->setCurrentIndex( 0 ); });
|
||||
connect(next,&QskPushButton::clicked,[=]() { mapper->setCurrentIndex( 1 ); });
|
||||
v->addItem(h);
|
||||
v->addSpacer( 0,100 );
|
||||
}
|
||||
|
||||
|
||||
#include "moc_Window.cpp"
|
|
@ -0,0 +1,22 @@
|
|||
/******************************************************************************
|
||||
* QSkinny - Copyright (C) The authors
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*****************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QskDialog.h>
|
||||
#include <QskWindow.h>
|
||||
|
||||
class QskDialogButtonBox;
|
||||
class QskLinearBox;
|
||||
|
||||
class Window : public QskWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
Window();
|
||||
|
||||
|
||||
};
|
|
@ -0,0 +1,35 @@
|
|||
/******************************************************************************
|
||||
* QSkinny - Copyright (C) The authors
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*****************************************************************************/
|
||||
|
||||
#include "Window.h"
|
||||
|
||||
#include <SkinnyShortcut.h>
|
||||
|
||||
#include <QskFocusIndicator.h>
|
||||
#include <QskObjectCounter.h>
|
||||
|
||||
#include <QGuiApplication>
|
||||
|
||||
int main( int argc, char* argv[] )
|
||||
{
|
||||
#ifdef ITEM_STATISTICS
|
||||
QskObjectCounter counter( true );
|
||||
#endif
|
||||
|
||||
QGuiApplication app( argc, argv );
|
||||
|
||||
SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts );
|
||||
|
||||
Window window;
|
||||
window.resize( 600, 400 );
|
||||
|
||||
auto focusIndicator = new QskFocusIndicator();
|
||||
focusIndicator->setObjectName( "FocusIndicator" );
|
||||
|
||||
window.addItem( focusIndicator );
|
||||
window.show();
|
||||
|
||||
return app.exec();
|
||||
}
|
Loading…
Reference in New Issue