Skip to content

Commit

Permalink
feat: support set combobox data with QMap
Browse files Browse the repository at this point in the history
 * support init items with QMap<QString,QVariant> that actually data is:

  {
    "keys": ["key1", "key2", "keyN"],
    "values": ["value1", "value2", "valueN"]
  }

Change-Id: I923b62732ceef8dd291f06fece5c6ba21a57a1e3
  • Loading branch information
Iceyer committed Feb 8, 2018
1 parent 43de05f commit bdad10f
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 27 deletions.
24 changes: 21 additions & 3 deletions examples/dwidget-examples/collections/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
#include "simplelistviewtab.h"
#include "dtoast.h"

DTK_USE_NAMESPACE
DCORE_USE_NAMESPACE
DWIDGET_USE_NAMESPACE

MainWindow::MainWindow(QWidget *parent)
Expand Down Expand Up @@ -190,8 +190,26 @@ void MainWindow::menuItemInvoked(QAction *action)

QFontDatabase fontDatabase;
auto fontFamliy = settings->option("base.font.family");
fontFamliy->setData("items", fontDatabase.families());
fontFamliy->setValue(0);
QMap<QString, QVariant> fontDatas;

QStringList values = fontDatabase.families();
QStringList keys;
for (auto &v : values) {
keys << v.toLower().trimmed();
}
fontDatas.insert("keys", keys);
fontDatas.insert("values", values);
fontFamliy->setData("items", fontDatas);

// or you can set default value by json
if (fontFamliy->value().toString().isEmpty()) {
fontFamliy->setValue("droid serif");
}

connect(fontFamliy, &DSettingsOption::valueChanged,
this, [](QVariant value) {
qDebug() << "fontFamliy change" << value;
});

QStringList codings;
for (auto coding : QTextCodec::availableCodecs()) {
Expand Down
80 changes: 56 additions & 24 deletions src/widgets/dsettingswidgetfactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,41 +181,73 @@ QWidget *createComboBoxOptionHandle(QObject *opt)
rightWidget->setFocusPolicy(Qt::StrongFocus);
rightWidget->setFixedHeight(24);
rightWidget->setObjectName("OptionLineEdit");
auto optionWidget = DSettingsWidgetFactory::createTwoColumWidget(option, rightWidget);

auto data = option->data("items").toStringList();
for (auto item : data) {
auto trName = QObject::tr(item.toStdString().c_str());
rightWidget->addItem(trName);
}
auto initComboxList = [ = ](const QStringList & data) {
for (auto item : data) {
auto trName = QObject::tr(item.toStdString().c_str());
rightWidget->addItem(trName);
}
auto current = option->value().toInt();
rightWidget->setCurrentIndex(current);
option->connect(rightWidget, static_cast<void (QComboBox::*)(int index)>(&QComboBox::currentIndexChanged),
option, [ = ](int index) {
option->setValue(index);
});

auto current = option->value().toInt();
rightWidget->setCurrentIndex(current);
option->connect(option, &DTK_CORE_NAMESPACE::DSettingsOption::valueChanged,
rightWidget, [ = ](const QVariant & value) {
rightWidget->setCurrentIndex(value.toInt());
});
};

auto optionWidget = DSettingsWidgetFactory::createTwoColumWidget(option, rightWidget);
auto initComboxMap = [ = ](const QMap<QString, QVariant> &data) {
auto keys = data.value("keys").toStringList();
auto values = data.value("values").toStringList();

option->connect(rightWidget, static_cast<void (QComboBox::*)(int index)>(&QComboBox::currentIndexChanged),
option, [ = ](int index) {
option->setValue(index);
});
option->connect(option, &DTK_CORE_NAMESPACE::DSettingsOption::valueChanged,
rightWidget, [ = ](const QVariant & value) {
rightWidget->setCurrentIndex(value.toInt());
});
option->connect(option, &DTK_CORE_NAMESPACE::DSettingsOption::dataChanged,
rightWidget, [ = ](const QString & dataType, const QVariant & value) {
for (int i = 0; i < keys.length(); ++i) {
auto trName = QObject::tr(values.value(i).toStdString().c_str());
rightWidget->addItem(trName, keys.value(i));
}

auto currentData = option->value().toString();
auto currentIndex = rightWidget->findData(currentData);
rightWidget->setCurrentIndex(currentIndex);

option->connect(rightWidget, static_cast<void (QComboBox::*)(int index)>(&QComboBox::currentIndexChanged),
option, [ = ](int index) {
option->setValue(keys.value(index));
});

option->connect(option, &DTK_CORE_NAMESPACE::DSettingsOption::valueChanged,
rightWidget, [ = ](const QVariant & value) {
auto currentIndex = rightWidget->findData(value.toString());
rightWidget->setCurrentIndex(currentIndex);
});
};

auto updateData = [ = ](const QString & dataType, const QVariant & data) {
if ("items" != dataType) {
return;
}

rightWidget->clear();
auto data = value.toStringList();
for (auto item : data) {
rightWidget->addItem(item);
if (data.type() == QVariant::StringList) {
initComboxList(data.toStringList());
}
if (data.type() == QVariant::Map) {
initComboxMap(data.toMap());
}

auto current = option->value().toInt();
rightWidget->setCurrentIndex(current);
rightWidget->update();
};

auto initData = option->data("items");
qDebug() << initData.type() << (QVariant::Map == initData.type()) << initData.typeName();
updateData("items", initData);

option->connect(option, &DTK_CORE_NAMESPACE::DSettingsOption::dataChanged,
rightWidget, [ = ](const QString & dataType, const QVariant & value) {
updateData(dataType, value);
});

return optionWidget;
Expand Down

0 comments on commit bdad10f

Please sign in to comment.