Window size improvements. Added promoted widgets but seems to be require signal filters for disabled widgets to receive mouse events.

deque
cc9cii 10 years ago
parent ca80a2b856
commit 62d2811285

@ -109,6 +109,8 @@ opencs_units (view/settings
rangeview
resizeablestackedwidget
spinbox
clickspinbox
clickcombobox
)
opencs_units_noqt (view/settings
@ -166,7 +168,7 @@ qt4_wrap_ui(OPENCS_UI_HDR ${OPENCS_UI})
qt4_wrap_cpp(OPENCS_MOC_SRC ${OPENCS_HDR_QT})
qt4_add_resources(OPENCS_RES_SRC ${OPENCS_RES})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
include_directories(${CMAKE_CURRENT_BINARY_DIR} view/settings)
if(APPLE)
set (OPENCS_MAC_ICON ${CMAKE_SOURCE_DIR}/files/mac/opencs.icns)

@ -297,7 +297,7 @@ std::auto_ptr<sh::Factory> CS::Editor::setupGraphics()
std::auto_ptr<sh::Factory> factory (new sh::Factory (platform));
std::string shLang = mUserSettings.settingValue("Shiny/language").toStdString();
std::string shLang = mUserSettings.settingValue("Shader/language").toStdString();
enum sh::Language lang;
if(shLang == "CG") lang = sh::Language_CG;
else if(shLang == "HLSL") lang = sh::Language_HLSL;

@ -5,9 +5,12 @@
#include <components/files/configurationmanager.hpp>
#include <components/settings/settings.hpp>
#include <components/contentselector/model/naturalsort.hpp>
#include <boost/version.hpp>
#include <OgreRoot.h>
#include "setting.hpp"
#include "support.hpp"
#include <QTextCodec>
@ -344,17 +347,76 @@ void CSMSettings::UserSettings::loadSettings (const QString &fileName)
#endif
}
mSettingCfgDefinitions->setValue("Video/render system", renderSystem.c_str());
// force shiny language based on render system
// force shader language based on render system
if(renderSystem == "Direct3D9 Rendering Subsystem")
mSettingDefinitions->setValue("Shiny/language", "CG");
mSettingDefinitions->setValue("Shader/language", "CG");
else
mSettingDefinitions->setValue("Shiny/language", "GLSL");
mSettingDefinitions->setValue("Shader/language", "GLSL");
// check if override entry exists (default: override)
if(!mSettingDefinitions->childGroups().contains("Video", Qt::CaseInsensitive))
mSettingDefinitions->setValue("Video/use settings.cfg", "true");
}
QStringList CSMSettings::UserSettings::getOgreOptions(const QString &key, const QString &renderer)
{
QStringList result;
Ogre::ConfigOptionMap& renderOpt =
//Ogre::Root::getSingleton().getRenderSystem()->getConfigOptions();
Ogre::Root::getSingleton().getRenderSystemByName(renderer.toStdString())->getConfigOptions();
Ogre::ConfigOptionMap::iterator it = renderOpt.begin();
uint row = 0;
for(; it != renderOpt.end(); ++it, ++row)
{
Ogre::StringVector::iterator opt_it = it->second.possibleValues.begin();
uint idx = 0;
for(; opt_it != it->second.possibleValues.end(); ++opt_it, ++idx)
{
if(strcmp (key.toStdString().c_str(), it->first.c_str()) == 0)
{
result << ((key == "FSAA") ? QString("MSAA ") : QString(""))
+ QString::fromStdString((*opt_it).c_str()).simplified();
}
}
}
// Sort ascending
qSort(result.begin(), result.end(), naturalSortLessThanCI);
// Replace the zero option with Off
int index = result.indexOf("MSAA 0");
if(index != -1)
result.replace(index, QObject::tr("Off"));
return result;
}
QStringList CSMSettings::UserSettings::getShaderLanguageByRenderer(const QString &renderer)
{
QStringList result;
if(renderer == "Direct3D9 Rendering Subsystem")
{
result.append("CG");
result.append("HLSL");
result.append("None");
}
else if(renderer == "OpenGL Rendering Subsystem")
{
result.append("GLSL");
result.append("GLSLES");
result.append("None");
}
else
result.append("None");
return result;
}
bool CSMSettings::UserSettings::hasSettingDefinitions
(const QString &viewKey) const
{

@ -76,6 +76,9 @@ namespace CSMSettings {
///Save any unsaved changes in the QSettings object
void saveDefinitions() const;
QStringList getShaderLanguageByRenderer(const QString &renderer);
QStringList getOgreOptions(const QString &key, const QString &renderer);
private:
void buildSettingModelDefaults();

@ -32,6 +32,14 @@ void CSVDoc::View::closeEvent (QCloseEvent *event)
event->ignore();
else
{
// save window size first
CSMSettings::UserSettings::instance().setDefinitions(
"Window Size/Width",
QStringList(QString::number(frameGeometry().width())));
CSMSettings::UserSettings::instance().setDefinitions(
"Window Size/Height",
QStringList(QString::number(frameGeometry().height())));
CSMSettings::UserSettings::instance().saveDefinitions();
// closeRequest() returns true if last document
mViewManager.removeDocAndView(mDocument);
}

@ -0,0 +1,9 @@
#include "clickcombobox.hpp"
#include <QMouseEvent>
void ClickComboBox::mouseReleaseEvent(QMouseEvent *e)
{
emit mouseReleased();
}

@ -0,0 +1,20 @@
#ifndef CSVSETTINGS_CLICKCOMBOBOX_H
#define CSVSETTINGS_CLICKCOMBOBOX_H
#include <QComboBox>
#include <QMouseEvent>
class ClickComboBox : public QComboBox
{
Q_OBJECT
public:
explicit ClickComboBox(QWidget *parent = 0) { }
void mouseReleaseEvent(QMouseEvent *e);
signals:
void mouseReleased();
};
#endif /* CSVSETTINGS_CLICKCOMBOBOX_H */

@ -0,0 +1,11 @@
#include "clickspinbox.hpp"
#include <QMouseEvent>
#include <iostream>
void ClickSpinBox::mouseReleaseEvent(QMouseEvent *e)
{
std::cout << "emit" << std::endl;
emit mouseReleased();
}

@ -0,0 +1,20 @@
#ifndef CSVSETTINGS_CLICKSPINBOX_H
#define CSVSETTINGS_CLICKSPINBOX_H
#include <QSpinBox>
#include <QMouseEvent>
class ClickSpinBox : public QSpinBox
{
Q_OBJECT
public:
explicit ClickSpinBox(QWidget *parent = 0) { }
void mouseReleaseEvent(QMouseEvent *e);
signals:
void mouseReleased();
};
#endif /* CSVSETTINGS_CLICKSPINBOX_H */

@ -5,7 +5,6 @@
#include <QDesktopWidget>
#include <components/contentselector/model/naturalsort.hpp>
#include "../../model/settings/usersettings.hpp"
namespace
@ -49,14 +48,35 @@ QString getCurrentOgreResolution()
if(it->first == "Video Mode" )
{
QRegExp re("^(\\d+ x \\d+)");
int pos = re.indexIn(it->second.currentValue.c_str(), 0);
if (pos > -1)
if (re.indexIn(it->second.currentValue.c_str(), 0) > -1)
return re.cap(1);
}
}
return QString(); // found nothing
}
bool customCompare(const QString &s1, const QString &s2)
{
int x1, x2, y1, y2;
QRegExp re("^(\\d+) x (\\d+)");
if(re.indexIn(s1) > -1)
{
x1 = re.cap(1).toInt();
y1 = re.cap(2).toInt();
}
if(re.indexIn(s2) > -1)
{
x2 = re.cap(1).toInt();
y2 = re.cap(2).toInt();
}
if(x1 == x2)
return y1 > y2;
else
return x1 > x2;
}
QStringList getAvailableResolutions()
{
// store available rendering devices and available resolutions
@ -93,8 +113,7 @@ QStringList getAvailableResolutions()
{
// extract x and y values
QRegExp re("^(\\d+) x (\\d+)");
int pos = re.indexIn((*iter).c_str(), 0);
if (pos > -1)
if(re.indexIn((*iter).c_str(), 0) > -1)
{
QString aspect = getAspect(re.cap(1).toInt(), re.cap(2).toInt());
QString resolution = re.cap(1) + QString(" x ") + re.cap(2);
@ -110,42 +129,7 @@ QStringList getAvailableResolutions()
}
}
result.removeDuplicates();
return result;
}
QStringList getAvailableOptions(const QString &key)
{
QStringList result;
Ogre::ConfigOptionMap& renderOpt =
Ogre::Root::getSingleton().getRenderSystem()->getConfigOptions();
Ogre::ConfigOptionMap::iterator it = renderOpt.begin();
uint row = 0;
for(; it != renderOpt.end(); ++it, ++row)
{
Ogre::StringVector::iterator opt_it = it->second.possibleValues.begin();
uint idx = 0;
for(; opt_it != it->second.possibleValues.end(); ++opt_it, ++idx)
{
if(strcmp (key.toStdString().c_str(), it->first.c_str()) == 0)
{
result << ((key == "FSAA") ? QString("MSAA ") : QString(""))
+ QString::fromStdString((*opt_it).c_str()).simplified();
}
}
}
// Sort ascending
qSort(result.begin(), result.end(), naturalSortLessThanCI);
// Replace the zero option with Off
int index = result.indexOf("MSAA 0");
if(index != -1)
result.replace(index, QObject::tr("Off"));
qStableSort(result.begin(), result.end(), customCompare);
return result;
}
@ -163,17 +147,75 @@ CSVSettings::SettingsDialog::SettingsDialog(QTabWidget *parent)
spinBox_x->setMaximum(res.width());
spinBox_y->setMaximum(res.height());
connect(comboBox_rendersystem, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(rendererChanged()));
connect(checkBox_override, SIGNAL(toggled(bool)), this, SLOT(slotOverrideToggled(bool)));
connect(comboBox_rendersystem, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(slotRendererChanged(const QString&)));
connect(radioButton_standard_res, SIGNAL(toggled(bool)), this, SLOT(slotStandardToggled(bool)));
connect(comboBox_std_window_size, SIGNAL(mouseReleased()), this, SLOT(slotStandardClicked()));
connect(spinBox_x, SIGNAL(mouseReleased()), this, SLOT(slotCustomClicked()));
connect(spinBox_y, SIGNAL(mouseReleased()), this, SLOT(slotCustomClicked()));
}
void CSVSettings::SettingsDialog::rendererChanged()
void CSVSettings::SettingsDialog::slotStandardClicked()
{
std::cout << "click" << std::endl;
if(!radioButton_standard_res->isChecked())
radioButton_standard_res->toggle();
}
void CSVSettings::SettingsDialog::slotCustomClicked()
{
std::cout << "click" << std::endl;
if(radioButton_standard_res->isChecked())
radioButton_standard_res->toggle();
}
void CSVSettings::SettingsDialog::slotRendererChanged(const QString &renderer)
{
comboBox_antialiasing->clear();
comboBox_antialiasing->addItems(getAvailableOptions(QString("FSAA")));
comboBox_antialiasing->addItems(mModel->getOgreOptions(QString("FSAA"), renderer));
comboBox_shaderlanguage->clear();
comboBox_shaderlanguage->addItems(mModel->getShaderLanguageByRenderer(renderer));
if(mModel->settingValue("Video/use settings.cfg") == "true")
{
label_RenderingSubsystem->setEnabled(false);
comboBox_rendersystem->setEnabled(false);
label_Antialiasing->setEnabled(false);
comboBox_antialiasing->setEnabled(false);
checkBox_vsync->setEnabled(false);
label_ShaderLanguage->setEnabled(false);
comboBox_shaderlanguage->setEnabled(false);
}
else
checkBox_override->setChecked(false);
}
void CSVSettings::SettingsDialog::slotOverrideToggled(bool checked)
{
if(checked)
{
label_RenderingSubsystem->setEnabled(false);
comboBox_rendersystem->setEnabled(false);
label_Antialiasing->setEnabled(false);
comboBox_antialiasing->setEnabled(false);
checkBox_vsync->setEnabled(false);
label_ShaderLanguage->setEnabled(false);
comboBox_shaderlanguage->setEnabled(false);
}
else
{
label_RenderingSubsystem->setEnabled(true);
comboBox_rendersystem->setEnabled(true);
label_Antialiasing->setEnabled(true);
comboBox_antialiasing->setEnabled(true);
checkBox_vsync->setEnabled(true);
label_ShaderLanguage->setEnabled(true);
comboBox_shaderlanguage->setEnabled(true);
}
}
// FIXME: what to do with updating window size
void CSVSettings::SettingsDialog::slotStandardToggled(bool checked)
{
if (checked)
@ -192,22 +234,28 @@ void CSVSettings::SettingsDialog::slotStandardToggled(bool checked)
void CSVSettings::SettingsDialog::setViewValues()
{
//rendererChanged(Ogre::Root::getSingleton().getRenderSystemByName(renderer.toStdString()));
rendererChanged(); // setup antialiasing options
int index = -1;
if(mModel->settingValue("Video/use settings.cfg") == "true")
{
label_RenderingSubsystem->setEnabled(false);
comboBox_rendersystem->setEnabled(false);
label_Antialiasing->setEnabled(false);
comboBox_antialiasing->setEnabled(false);
checkBox_vsync->setEnabled(false);
label_ShaderLanguage->setEnabled(false);
comboBox_shaderlanguage->setEnabled(false);
// initialised in the constructor
slotOverrideToggled(checkBox_override->isChecked());
}
else
checkBox_override->setChecked(false);
// Ogre initialised earlier
slotRendererChanged(Ogre::Root::getSingleton().getRenderSystem()->getName().c_str());
// antialiasing
QString antialiasing = mModel->settingValue("Video/antialiasing");
index = comboBox_antialiasing->findData(antialiasing, Qt::DisplayRole);
if(index != -1)
comboBox_antialiasing->setCurrentIndex(index);
// vsync
checkBox_vsync->setChecked(mModel->settingValue("Video/vsync") == "true");
// shader lang
QString shaderlang = mModel->settingValue("Shader/language");
index = comboBox_shaderlanguage->findData(shaderlang, Qt::DisplayRole);
if(index != -1)
comboBox_shaderlanguage->setCurrentIndex(index);
if(mModel->settingValue("Window Size/Width") != "")
spinBox_x->setValue(mModel->settingValue("Window Size/Width").toInt());
@ -222,9 +270,7 @@ void CSVSettings::SettingsDialog::setViewValues()
QString currRes = mModel->settingValue("Window Size/Width") + " x " +
mModel->settingValue("Window Size/Height");
int index = comboBox_std_window_size->findData(currRes,
Qt::DisplayRole,
Qt::MatchStartsWith);
index = comboBox_std_window_size->findData(currRes, Qt::DisplayRole, Qt::MatchStartsWith);
if(index != -1)
{
// show the values in ini file
@ -234,9 +280,7 @@ void CSVSettings::SettingsDialog::setViewValues()
else
{
// show what's in Ogre instead
index = comboBox_std_window_size->findData(getCurrentOgreResolution(),
Qt::DisplayRole,
Qt::MatchStartsWith);
index = comboBox_std_window_size->findData(getCurrentOgreResolution(), Qt::DisplayRole, Qt::MatchStartsWith);
if(index != -1)
comboBox_std_window_size->setCurrentIndex(index);
@ -260,6 +304,55 @@ void CSVSettings::SettingsDialog::saveSettings()
}
}
#endif
std::cout << "closeEvent" << std::endl;
// override
if(checkBox_override->isChecked())
mModel->setDefinitions("Video/use settings.cfg", QStringList("true"));
else
mModel->setDefinitions("Video/use settings.cfg", QStringList("false"));
// render system
mModel->setDefinitions("Video/render system",
QStringList(comboBox_rendersystem->currentText()));
// vsync
if(checkBox_vsync->isChecked())
mModel->setDefinitions("Video/vsync", QStringList("true"));
else
mModel->setDefinitions("Video/vsync", QStringList("false"));
// antialiasing
mModel->setDefinitions("Video/antialiasing",
QStringList(comboBox_antialiasing->currentText()));
#if 0
QRegExp reAA("^\\D*(\\d+)\\D*");
if(reAA.indexIn(comboBox_antialiasing->currentText()) > -1)
mModel->setDefinitions("Video/antialiasing", QStringList(reAA.cap(1)));
#endif
// shader lang
mModel->setDefinitions("Shader/language",
QStringList(comboBox_shaderlanguage->currentText()));
// window size
if(radioButton_standard_res->isChecked())
{
QRegExp re("^(\\d+) x (\\d+)");
if(re.indexIn(comboBox_std_window_size->currentText()) > -1)
{
mModel->setDefinitions("Window Size/Width", QStringList(re.cap(1)));
mModel->setDefinitions("Window Size/Height", QStringList(re.cap(2)));
}
}
else
{
mModel->setDefinitions("Window Size/Width",
QStringList(QString::number(spinBox_x->value())));
mModel->setDefinitions("Window Size/Height",
QStringList(QString::number(spinBox_y->value())));
}
mModel->saveDefinitions();
}

@ -48,7 +48,10 @@ namespace CSVSettings {
void show();
void rendererChanged();
void slotStandardClicked();
void slotCustomClicked();
void slotRendererChanged(const QString &renderer);
void slotOverrideToggled(bool checked);
void slotStandardToggled(bool checked);
};
}

@ -31,56 +31,63 @@
</property>
<layout class="QGridLayout" name="gridLayout_Screen">
<item row="1" column="3">
<widget class="QSpinBox" name="spinBox_y"/>
<widget class="ClickSpinBox" name="spinBox_y">
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QSpinBox" name="spinBox_x">
<widget class="ClickSpinBox" name="spinBox_x">
<property name="maximumSize">
<size>
<width>186</width>
<height>16777215</height>
</size>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QRadioButton" name="radioButton_standard_res">
<property name="text">
<string>Standard:</string>
</property>
<property name="checked">
<bool>true</bool>
<item row="0" column="2" colspan="2">
<widget class="ClickComboBox" name="comboBox_std_window_size">
<property name="minimumSize">
<size>
<width>180</width>
<height>0</height>
</size>
</property>
<attribute name="buttonGroup">
<string notr="true">buttonGroup</string>
</attribute>
</widget>
</item>
<item row="1" column="1">
<item row="1" column="0">
<widget class="QRadioButton" name="radioButton_custom_res">
<property name="text">
<string>Custom;</string>
<string>Custom:</string>
</property>
<attribute name="buttonGroup">
<string notr="true">buttonGroup</string>
</attribute>
</widget>
</item>
<item row="0" column="0">
<item row="1" column="1">
<widget class="QLabel" name="label_Resolution">
<property name="text">
<string>Window Size</string>
<string/>
</property>
</widget>
</item>
<item row="0" column="2" colspan="2">
<widget class="QComboBox" name="comboBox_std_window_size">
<property name="minimumSize">
<size>
<width>180</width>
<height>0</height>
</size>
<item row="0" column="0">
<widget class="QRadioButton" name="radioButton_standard_res">
<property name="text">
<string>Standard:</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">buttonGroup</string>
</attribute>
</widget>
</item>
</layout>
@ -108,10 +115,10 @@
</rect>
</property>
<property name="title">
<string>Display</string>
<string>Window Size</string>
</property>
</widget>
<widget class="QWidget" name="layoutWidget">
<widget class="QWidget" name="layoutWidget_Render">
<property name="geometry">
<rect>
<x>20</x>
@ -180,7 +187,7 @@
<widget class="QComboBox" name="comboBox_shaderlanguage">
<item>
<property name="text">
<string>HLSL</string>
<string>GLSL</string>
</property>
</item>
<item>
@ -212,7 +219,7 @@
</layout>
</widget>
<zorder>renderGroup</zorder>
<zorder>layoutWidget</zorder>
<zorder>layoutWidget_Render</zorder>
<zorder>displayGroup</zorder>
<zorder>layoutWidget_Screen</zorder>
</widget>
@ -220,34 +227,46 @@
<attribute name="title">
<string>Display Settings</string>
</attribute>
<widget class="QWidget" name="layoutWidget2">
<widget class="QGroupBox" name="groupBox">
<property name="geometry">
<rect>
<x>20</x>
<y>30</y>
<x>10</x>
<y>10</y>
<width>371</width>
<height>71</height>
</rect>
</property>
<property name="title">
<string/>
</property>
</widget>
<widget class="QGroupBox" name="groupBox_2">
<property name="geometry">
<rect>
<x>9</x>
<y>110</y>
<width>371</width>
<height>111</height>
</rect>
</property>
<property name="title">
<string>Subviews</string>
</property>
</widget>
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>21</x>
<y>20</y>
<width>351</width>
<height>116</height>
<height>45</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_Subview">
<item row="1" column="0">
<widget class="QLabel" name="label_MaxSubviews">
<property name="text">
<string>Max Number of Subviews</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_MinSubviewWidth">
<property name="text">
<string>Min Subview Width</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="checkBox_reuse_subview">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_ShowIcon">
<property name="text">
<string>Reuse Subviews</string>
<string>Display Format:</string>
</property>
</widget>
</item>
@ -265,11 +284,51 @@
</item>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="spinBox_max_subviews"/>
<item row="1" column="0">
<widget class="QCheckBox" name="checkBox">
<property name="text">
<string>Show Status Bar</string>
</property>
</widget>
</item>
<item row="2" column="1">
</layout>
</widget>
<widget class="QWidget" name="layoutWidget2">
<property name="geometry">
<rect>
<x>21</x>
<y>130</y>
<width>351</width>
<height>71</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="label_MaxSubviews">
<property name="text">
<string>Max Number of Subviews:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="spinBox_max_subviews">
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_MinSubviewWidth">
<property name="text">
<string>Min Subview Width:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="spinBox_min_subview_width">
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="minimum">
<number>325</number>
</property>
@ -281,29 +340,18 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_ShowIcon">
<item row="2" column="0">
<widget class="QCheckBox" name="checkBox_reuse_subview">
<property name="text">
<string>Show Icon</string>
<string>Reuse Subviews</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QGroupBox" name="groupBox">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>371</width>
<height>151</height>
</rect>
</property>
<property name="title">
<string>GroupBox</string>
</property>
</widget>
<zorder>groupBox_2</zorder>
<zorder>groupBox</zorder>
<zorder>layoutWidget</zorder>
<zorder>layoutWidget2</zorder>
</widget>
<widget class="QWidget" name="MiscSettings">
@ -312,6 +360,18 @@
</attribute>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>ClickSpinBox</class>
<extends>QSpinBox</extends>
<header>clickspinbox.hpp</header>
</customwidget>
<customwidget>
<class>ClickComboBox</class>
<extends>QComboBox</extends>
<header>clickcombobox.hpp</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
<buttongroups>

Loading…
Cancel
Save