mirror of
https://github.com/mapmapteam/mapmap.git
synced 2026-04-01 13:09:36 +02:00
418 lines
13 KiB
C++
418 lines
13 KiB
C++
/*
|
|
* 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"
|
|
|
|
namespace mmp {
|
|
|
|
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
|
|
for (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()
|
|
{
|
|
for (const QHostAddress &address: QNetworkInterface::allAddresses()) {
|
|
if (address.protocol() == QAbstractSocket::IPv4Protocol
|
|
&& address != QHostAddress(QHostAddress::LocalHost)) {
|
|
_machineAddressLabel->setText(address.toString());
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
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 to 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);
|
|
}
|
|
}
|
|
|
|
|
|
}
|