mirror of
https://github.com/mapmapteam/mapmap.git
synced 2026-04-01 21:19:39 +02:00
improve preferences system
This commit is contained in:
415
PreferenceDialog.cpp
Normal file
415
PreferenceDialog.cpp
Normal file
@@ -0,0 +1,415 @@
|
||||
/*
|
||||
* PreferenceDialog.cpp
|
||||
*
|
||||
* (c) 2014 Sofian Audry -- info(@)sofianaudry(.)com
|
||||
* (c) 2014 Alexandre Quessy -- alexandre(@)quessy(.)net
|
||||
* (c) 2016 Dame Diongue -- baydamd(@)gmail(.)com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "PreferenceDialog.h"
|
||||
|
||||
MM_BEGIN_NAMESPACE
|
||||
|
||||
PreferenceDialog::PreferenceDialog(QWidget* parent) :
|
||||
QDialog(parent)
|
||||
{
|
||||
// configure size
|
||||
resize(PREFERENCES_WINDOW_WIDTH, PREFERENCES_WINDOW_HEIGHT);
|
||||
setMinimumSize(PREFERENCES_WINDOW_WIDTH, PREFERENCES_WINDOW_HEIGHT);
|
||||
|
||||
// Create different pages
|
||||
createInterfacePage();
|
||||
createMappingPage();
|
||||
createOutputPage();
|
||||
createControlsPage();
|
||||
createAdvancedPage();
|
||||
|
||||
// | Cancel || OK |
|
||||
_buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok
|
||||
| QDialogButtonBox::Cancel);
|
||||
|
||||
// Preferences list
|
||||
createPreferencesList();
|
||||
|
||||
// Rearrange position
|
||||
QGridLayout *mainLayout = new QGridLayout;
|
||||
mainLayout->setColumnStretch(0, 1);
|
||||
mainLayout->setColumnStretch(1, 3);
|
||||
mainLayout->addWidget(_listWidget, 0, 0);
|
||||
mainLayout->addLayout(_stackedLayout, 0, 1);
|
||||
mainLayout->addWidget(_buttonBox, 1, 0, 1, 2);
|
||||
setLayout(mainLayout);
|
||||
|
||||
connect(_buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
|
||||
connect(_buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
|
||||
|
||||
setWindowTitle(tr("Preferences"));
|
||||
_listWidget->setCurrentRow(0);
|
||||
}
|
||||
|
||||
PreferenceDialog::~PreferenceDialog()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void PreferenceDialog::showDialog()
|
||||
{
|
||||
exec();
|
||||
}
|
||||
|
||||
void PreferenceDialog::closeEvent(QCloseEvent *event)
|
||||
{
|
||||
emit closed();
|
||||
event->accept();
|
||||
}
|
||||
|
||||
void PreferenceDialog::accept()
|
||||
{
|
||||
applySettings();
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
void PreferenceDialog::reject()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
int PreferenceDialog::exec()
|
||||
{
|
||||
// Make sure settings is loaded
|
||||
if (!loadSettings())
|
||||
return QDialog::Rejected;
|
||||
|
||||
return QDialog::exec();
|
||||
}
|
||||
|
||||
bool PreferenceDialog::loadSettings()
|
||||
{
|
||||
QSettings settings;
|
||||
// Listening port
|
||||
_listenPortNumber->setValue(settings.value("oscListeningPort", MM::DEFAULT_OSC_PORT).toInt());
|
||||
// Sticky vertices enabled
|
||||
_stickyVerticesBox->setChecked(settings.value("stickyVertices", MM::STICKY_VERTICES).toBool());
|
||||
// Sticky vertices radius
|
||||
_stickyRadiusBox->setCurrentText(settings.value("vertexStickRadius", MM::VERTEX_STICK_RADIUS).toString());
|
||||
// Show screen resolution on output
|
||||
_showResolutionBox->setChecked(settings.value("showResolution", MM::SHOW_OUTPUT_RESOLUTION).toBool());
|
||||
// Set preferred test signal pattern
|
||||
_radioGroup.at(settings.value("signalTestCard", MM::DEFAULT_TEST_CARD).toInt())->setChecked(true);
|
||||
// Set toolbar icon size
|
||||
_toolbarIconSizeBox->setCurrentIndex(_toolbarIconSizeBox->findData(
|
||||
settings.value("toolbarIconSize", MM::TOOLBAR_ICON_SIZE)));
|
||||
// Set language
|
||||
_languageBox->setCurrentIndex(_languageBox->findData(settings.value("language", MM::DEFAULT_LANGUAGE)));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void PreferenceDialog::applySettings()
|
||||
{
|
||||
QSettings settings;
|
||||
MainWindow *mainWindow = MainWindow::window();
|
||||
// Listen port
|
||||
settings.setValue("oscListeningPort", _listenPortNumber->value());
|
||||
mainWindow->setOscPort(settings.value("oscListeningPort").toInt());
|
||||
// Sticky vertices enabled
|
||||
settings.setValue("stickyVertices", _stickyVerticesBox->isChecked());
|
||||
// Sticky vertices radius
|
||||
settings.setValue("vertexStickRadius", _stickyRadiusBox->currentText());
|
||||
// Show screen resolution on output
|
||||
settings.setValue("showResolution", _showResolutionBox->isChecked());
|
||||
// Set preferred test signal pattern
|
||||
foreach (QRadioButton *radio, _radioGroup) {
|
||||
if (radio->isChecked()) {
|
||||
settings.setValue("signalTestCard", _radioGroup.indexOf(radio));
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Set toolbar icon size
|
||||
settings.setValue("toolbarIconSize", _toolbarIconSizeBox->currentData());
|
||||
// Set language
|
||||
settings.setValue("language", _languageBox->currentData());
|
||||
}
|
||||
|
||||
void PreferenceDialog::refreshCurrentIP()
|
||||
{
|
||||
foreach (const QHostAddress &address, QNetworkInterface::allAddresses()) {
|
||||
if (address.protocol() == QAbstractSocket::IPv4Protocol
|
||||
&& address != QHostAddress(QHostAddress::LocalHost))
|
||||
_machineAddressLabel->setText(address.toString());
|
||||
}
|
||||
}
|
||||
|
||||
void PreferenceDialog::createInterfacePage()
|
||||
{
|
||||
_interfacePage = new QWidget;
|
||||
|
||||
// Create language box
|
||||
createLanguageList();
|
||||
|
||||
_toolbarIconSizeBox = new QComboBox;
|
||||
_toolbarIconSizeBox->addItem(tr("Large"), 64);
|
||||
_toolbarIconSizeBox->addItem(tr("Medium"), 48);
|
||||
_toolbarIconSizeBox->addItem(tr("Small"), 32);
|
||||
|
||||
QFormLayout *languageForm = new QFormLayout;
|
||||
languageForm->setFieldGrowthPolicy(QFormLayout::FieldsStayAtSizeHint);
|
||||
languageForm->addRow(tr("Language (requires restart)"), _languageBox);
|
||||
|
||||
QFormLayout *toolbarIconSizeForm = new QFormLayout;
|
||||
toolbarIconSizeForm->setFieldGrowthPolicy(QFormLayout::FieldsStayAtSizeHint);
|
||||
toolbarIconSizeForm->addRow(tr("Toolbar icon size (requires restart)"), _toolbarIconSizeBox);
|
||||
|
||||
QVBoxLayout *interfaceLayout = new QVBoxLayout;
|
||||
interfaceLayout->addLayout(languageForm);
|
||||
interfaceLayout->addLayout(toolbarIconSizeForm);
|
||||
|
||||
_interfacePage->setLayout(interfaceLayout);
|
||||
}
|
||||
|
||||
void PreferenceDialog::createMappingPage()
|
||||
{
|
||||
_mappingPage = new QWidget;
|
||||
QMargins marginLeft(40, 0, 0, 0);
|
||||
|
||||
// Vertex
|
||||
_stickyVerticesBox = new QCheckBox(tr("Enable Sticky vertices"));
|
||||
|
||||
_stickyRadiusBox = new QComboBox;
|
||||
QStringList stickList;
|
||||
for (int i(1); i <= 10; ++i)
|
||||
stickList.append(QString::number(i * 10));
|
||||
_stickyRadiusBox->addItems(stickList);
|
||||
// Enable box only if sticky vertices is enabled
|
||||
connect(_stickyVerticesBox, SIGNAL(toggled(bool)), _stickyRadiusBox, SLOT(setEnabled(bool)));
|
||||
|
||||
QFormLayout *stickRadiusForm = new QFormLayout;
|
||||
stickRadiusForm->setFieldGrowthPolicy(QFormLayout::FieldsStayAtSizeHint);
|
||||
stickRadiusForm->setContentsMargins(marginLeft);
|
||||
stickRadiusForm->addRow(tr("Sensitivity"), _stickyRadiusBox);
|
||||
|
||||
QGroupBox *vertexGroupBox = new QGroupBox(tr("Vertex"));
|
||||
|
||||
QVBoxLayout *vertexLayout = new QVBoxLayout;
|
||||
vertexLayout->addWidget(_stickyVerticesBox);
|
||||
vertexLayout->addLayout(stickRadiusForm);
|
||||
|
||||
vertexGroupBox->setLayout(vertexLayout);
|
||||
|
||||
// Shape
|
||||
QGroupBox *shapeGroupBox = new QGroupBox(tr("Shape"));
|
||||
|
||||
// Mapping
|
||||
QGroupBox *layerGroupBox = new QGroupBox(tr("Layers"));
|
||||
|
||||
QVBoxLayout *pageLayout = new QVBoxLayout;
|
||||
pageLayout->addWidget(vertexGroupBox);
|
||||
pageLayout->addWidget(shapeGroupBox);
|
||||
pageLayout->addWidget(layerGroupBox);
|
||||
|
||||
_mappingPage->setLayout(pageLayout);
|
||||
}
|
||||
|
||||
void PreferenceDialog::createOutputPage()
|
||||
{
|
||||
_outputPage = new QWidget;
|
||||
|
||||
_showResolutionBox = new QCheckBox(tr("Show resolution on output"));
|
||||
|
||||
_classicRadio = new QRadioButton(tr("Classic test card"));
|
||||
_palTestRadio = new QRadioButton(tr("PAL test card"));
|
||||
_ntscTestRadio = new QRadioButton(tr("NTSC test card"));
|
||||
|
||||
_radioGroup.append(_classicRadio);
|
||||
_radioGroup.append(_palTestRadio);
|
||||
_radioGroup.append(_ntscTestRadio);
|
||||
|
||||
_classicTestImg = new QLabel;
|
||||
_palTestImg = new QLabel;
|
||||
_ntscTestImg = new QLabel;
|
||||
|
||||
_classicTestImg->setPixmap(QPixmap(":/classic-test"));
|
||||
_palTestImg->setPixmap(QPixmap(":/pal-test"));
|
||||
_ntscTestImg->setPixmap(QPixmap(":/ntsc-test"));
|
||||
|
||||
QGridLayout *testLayout = new QGridLayout;
|
||||
testLayout->setContentsMargins(0, 0, 0, 0);
|
||||
testLayout->addWidget(_classicTestImg, 0, 0);
|
||||
testLayout->addWidget(_palTestImg, 0, 1);
|
||||
testLayout->addWidget(_ntscTestImg, 0, 2);
|
||||
testLayout->addWidget(_classicRadio, 1, 0);
|
||||
testLayout->addWidget(_palTestRadio, 1, 1);
|
||||
testLayout->addWidget(_ntscTestRadio, 1, 2);
|
||||
|
||||
QVBoxLayout *outputLayout = new QVBoxLayout;
|
||||
outputLayout->addWidget(_showResolutionBox);
|
||||
outputLayout->addSpacing(30);
|
||||
outputLayout->addLayout(testLayout);
|
||||
outputLayout->addStretch();
|
||||
|
||||
_outputPage->setLayout(outputLayout);
|
||||
}
|
||||
|
||||
void PreferenceDialog::createControlsPage()
|
||||
{
|
||||
_controlsPage = new QTabWidget;
|
||||
|
||||
// Osc Tab
|
||||
_oscWidget = new QWidget;
|
||||
|
||||
QFont bold;
|
||||
bold.setWeight(QFont::Bold);
|
||||
// Set IP Address validator
|
||||
QString octet("(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])");
|
||||
QRegExp rx(octet + "\\." + octet + "\\." + octet + "\\." + octet);
|
||||
QRegExpValidator *ipValidator = new QRegExpValidator(rx);
|
||||
QMargins margins(40, 0, 0, 0);
|
||||
|
||||
_sendMessageBox = new QCheckBox;
|
||||
_sendMessageBox->setFont(bold);
|
||||
_sendMessageBox->setText(tr("Send OSC messages"));
|
||||
_sendMessageBox->setEnabled(false); // Disable until supported
|
||||
|
||||
_sendAddressEdit = new QLineEdit;
|
||||
_sendAddressEdit->setValidator(ipValidator);
|
||||
_sendAddressEdit->setEnabled(false); // Disable until supported
|
||||
|
||||
_sendPortNumber = new QSpinBox;
|
||||
_sendPortNumber->setRange(1024, 65534);
|
||||
_sendPortNumber->setFixedWidth(120);
|
||||
_sendPortNumber->setEnabled(false); // Disable until supported
|
||||
|
||||
QFormLayout *sendMessageForm = new QFormLayout;
|
||||
sendMessageForm->setFieldGrowthPolicy(QFormLayout::FieldsStayAtSizeHint);
|
||||
sendMessageForm->setContentsMargins(margins);
|
||||
sendMessageForm->addRow(tr("to machine"), _sendAddressEdit);
|
||||
sendMessageForm->addRow(tr("at port"), _sendPortNumber);
|
||||
|
||||
_listenMessageBox = new QCheckBox;
|
||||
_listenMessageBox->setFont(bold);
|
||||
_listenMessageBox->setText(tr("Listen OSC messages"));
|
||||
_listenMessageBox->setChecked(true); // TODO: Give the choice to the user
|
||||
|
||||
_listenPortNumber = new QSpinBox;
|
||||
_listenPortNumber->setRange(1024, 65534);
|
||||
_listenPortNumber->setFixedWidth(120);
|
||||
|
||||
QFormLayout *listenPortForm = new QFormLayout;
|
||||
listenPortForm->setContentsMargins(margins);
|
||||
listenPortForm->addRow(tr("on port"), _listenPortNumber);
|
||||
|
||||
_machineAddressLabel = new QLabel;
|
||||
_ipRefreshButton = new QPushButton(tr("Refresh"));
|
||||
connect(_ipRefreshButton, SIGNAL(clicked()), this, SLOT(refreshCurrentIP()));
|
||||
|
||||
QHBoxLayout *listenAddressLayout = new QHBoxLayout;
|
||||
listenAddressLayout->addWidget(_machineAddressLabel);
|
||||
listenAddressLayout->addWidget(_ipRefreshButton);
|
||||
|
||||
QFormLayout *listenAddressForm = new QFormLayout;
|
||||
listenAddressForm->setFieldGrowthPolicy(QFormLayout::FieldsStayAtSizeHint);
|
||||
listenAddressForm->setFormAlignment(Qt::AlignCenter);
|
||||
listenAddressForm->addRow(tr("Local IP"), listenAddressLayout);
|
||||
|
||||
QVBoxLayout *oscLayout = new QVBoxLayout;
|
||||
oscLayout->addWidget(_sendMessageBox, 1);
|
||||
oscLayout->addLayout(sendMessageForm, 4);
|
||||
oscLayout->addWidget(_listenMessageBox, 1);
|
||||
oscLayout->addLayout(listenPortForm, 1);
|
||||
oscLayout->addLayout(listenAddressForm, 3);
|
||||
|
||||
_oscWidget->setLayout(oscLayout);
|
||||
|
||||
_controlsPage->addTab(_oscWidget, tr("OSC Setup"));
|
||||
|
||||
refreshCurrentIP();
|
||||
}
|
||||
|
||||
void PreferenceDialog::createAdvancedPage()
|
||||
{
|
||||
_advancedPage = new QTabWidget;
|
||||
}
|
||||
|
||||
void PreferenceDialog::createPreferencesList()
|
||||
{
|
||||
// Apparence Item
|
||||
QListWidgetItem *interfaceItem = new QListWidgetItem(QIcon(":/add-color"), tr("Interface"));
|
||||
|
||||
// Mapping & Shape Item
|
||||
QListWidgetItem *shapeItem = new QListWidgetItem(QIcon(":/control-points"), tr("Mapping & Shape"));
|
||||
|
||||
// Output Item
|
||||
QListWidgetItem *outputItem = new QListWidgetItem(QIcon(":/output-window"), tr("Output"));
|
||||
|
||||
// Controls Item
|
||||
QListWidgetItem *controlsItem = new QListWidgetItem(QIcon(":/preferences"), tr("Controls"));
|
||||
|
||||
// Advanced Item
|
||||
QListWidgetItem *advancedItem = new QListWidgetItem(QIcon(":/preferences"), tr("Advanced"));
|
||||
|
||||
// Add items in the list
|
||||
_listWidget = new QListWidget;
|
||||
_listWidget->addItem(interfaceItem);
|
||||
_listWidget->addItem(shapeItem);
|
||||
_listWidget->addItem(outputItem);
|
||||
_listWidget->addItem(controlsItem);
|
||||
_listWidget->addItem(advancedItem);
|
||||
|
||||
for (int i = 0; i < _listWidget->count(); i++) {
|
||||
QListWidgetItem *item = _listWidget->item(i);
|
||||
item->setSizeHint(QSize(item->sizeHint().width(), PreferenceDialog::LIST_ITEM_HEIGHT));
|
||||
}
|
||||
|
||||
// Add pages in the stacked layout
|
||||
_stackedLayout = new QStackedLayout;
|
||||
_stackedLayout->addWidget(_interfacePage);
|
||||
_stackedLayout->addWidget(_mappingPage);
|
||||
_stackedLayout->addWidget(_outputPage);
|
||||
_stackedLayout->addWidget(_controlsPage);
|
||||
_stackedLayout->addWidget(_advancedPage);
|
||||
// Sync list and pages
|
||||
connect(_listWidget, SIGNAL(currentRowChanged(int)), _stackedLayout, SLOT(setCurrentIndex(int)));
|
||||
}
|
||||
|
||||
void PreferenceDialog::createLanguageList()
|
||||
{
|
||||
_languageBox = new QComboBox;
|
||||
|
||||
// format systems language
|
||||
QString defaultLocale = QLocale::system().name();
|
||||
defaultLocale.truncate(defaultLocale.lastIndexOf('_'));
|
||||
|
||||
_languageBox->addItem("System default", defaultLocale);
|
||||
|
||||
QString translationPath = QApplication::applicationDirPath().append("/translations");
|
||||
QDir dir(translationPath);
|
||||
QStringList translations = dir.entryList(QStringList("mapmap_*.qm"));
|
||||
|
||||
for (int i(0); i < translations.size(); i++) {
|
||||
// get locale extracted by filename
|
||||
QString locale;
|
||||
locale = translations[i]; // mapmap_fr.qm
|
||||
locale.truncate(locale.lastIndexOf('.')); // mapmap_fr
|
||||
locale.remove(0, locale.indexOf('_') + 1); // fr
|
||||
|
||||
QString lang = QLocale::languageToString(QLocale(locale).language());
|
||||
|
||||
_languageBox->addItem(QString("%1 (%2)").arg(lang).arg(locale), locale);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MM_END_NAMESPACE
|
||||
Reference in New Issue
Block a user