diff -r b2fa5f89798a -r 24ba5aa3393f src/configDialog.cpp --- a/src/configDialog.cpp Mon Aug 31 23:18:17 2015 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,703 +0,0 @@ -/* - * LDForge: LDraw parts authoring CAD - * Copyright (C) 2013 - 2015 Teemu Piippo - * - * 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 . - * ===================================================================== - * - * configDialog.cxx: Settings dialog and everything related to it. - * Actual configuration core is in config.cxx. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "main.h" -#include "configDialog.h" -#include "ldDocument.h" -#include "miscallenous.h" -#include "colors.h" -#include "dialogs/colorselector.h" -#include "glRenderer.h" -#include "ui_config.h" -#include "guiutilities.h" - -const char* g_extProgPathFilter = -#ifdef _WIN32 - "Applications (*.exe)(*.exe);;" -#endif - "All files (*.*)(*.*)"; - -ConfigDialog::ConfigDialog (QWidget* parent, ConfigDialog::Tab defaulttab, Qt::WindowFlags f) : - QDialog (parent, f), - HierarchyElement (parent), - m_settings (m_window->makeSettings (this)) -{ - ui = new Ui_ConfigUI; - ui->setupUi (this); - - // Set defaults - applyToWidgetOptions ( - [&](QWidget* widget, QString confname) - { - QVariant value = m_settings->value (confname, m_config->defaultValueByName (confname)); - QLineEdit* le; - QSpinBox* spinbox; - QDoubleSpinBox* doublespinbox; - QSlider* slider; - QCheckBox* checkbox; - QPushButton* button; - - if ((le = qobject_cast (widget)) != null) - { - le->setText (value.toString()); - } - else if ((spinbox = qobject_cast (widget)) != null) - { - spinbox->setValue (value.toInt()); - } - else if ((doublespinbox = qobject_cast (widget)) != null) - { - doublespinbox->setValue (value.toDouble()); - } - else if ((slider = qobject_cast (widget)) != null) - { - slider->setValue (value.toInt()); - } - else if ((checkbox = qobject_cast (widget)) != null) - { - checkbox->setChecked (value.toBool()); - } - else if ((button = qobject_cast (widget)) != null) - { - setButtonBackground (button, value.toString()); - connect (button, SIGNAL (clicked()), this, SLOT (setButtonColor())); - } - else - { - print ("Unknown widget of type %1\n", widget->metaObject()->className()); - } - }); - - m_window->applyToActions ([&](QAction* act) - { - addShortcut (act); - }); - - ui->shortcutsList->setSortingEnabled (true); - ui->shortcutsList->sortItems(); - quickColors = LoadQuickColorList(); - updateQuickColorList(); - initExtProgs(); - selectPage (defaulttab); - connect (ui->shortcut_set, SIGNAL (clicked()), this, SLOT (slot_setShortcut())); - connect (ui->shortcut_reset, SIGNAL (clicked()), this, SLOT (slot_resetShortcut())); - connect (ui->shortcut_clear, SIGNAL (clicked()), this, SLOT (slot_clearShortcut())); - connect (ui->quickColor_add, SIGNAL (clicked()), this, SLOT (slot_setColor())); - connect (ui->quickColor_remove, SIGNAL (clicked()), this, SLOT (slot_delColor())); - connect (ui->quickColor_edit, SIGNAL (clicked()), this, SLOT (slot_setColor())); - connect (ui->quickColor_addSep, SIGNAL (clicked()), this, SLOT (slot_addColorSeparator())); - connect (ui->quickColor_moveUp, SIGNAL (clicked()), this, SLOT (slot_moveColor())); - connect (ui->quickColor_moveDown, SIGNAL (clicked()), this, SLOT (slot_moveColor())); - connect (ui->quickColor_clear, SIGNAL (clicked()), this, SLOT (slot_clearColors())); - connect (ui->findDownloadPath, SIGNAL (clicked (bool)), this, SLOT (slot_findDownloadFolder())); - connect (ui->buttonBox, SIGNAL (clicked (QAbstractButton*)), - this, SLOT (buttonClicked (QAbstractButton*))); - connect (ui->m_pages, SIGNAL (currentChanged (int)), this, SLOT (selectPage (int))); - connect (ui->m_pagelist, SIGNAL (currentRowChanged (int)), this, SLOT (selectPage (int))); -} - -ConfigDialog::~ConfigDialog() -{ - delete ui; -} - -void ConfigDialog::selectPage (int row) -{ - ui->m_pagelist->setCurrentRow (row); - ui->m_pages->setCurrentIndex (row); -} - -// -// Adds a shortcut entry to the list of shortcuts. -// -void ConfigDialog::addShortcut (QAction* act) -{ - ShortcutListItem* item = new ShortcutListItem; - item->setIcon (act->icon()); - item->setAction (act); - item->setSequence (act->shortcut()); - setShortcutText (item); - - // If the action doesn't have a valid icon, use an empty one - // so that the list is kept aligned. - if (act->icon().isNull()) - item->setIcon (GetIcon ("empty")); - - ui->shortcutsList->insertItem (ui->shortcutsList->count(), item); -} - -// -// Initializes the stuff in the ext programs tab -// -void ConfigDialog::initExtProgs() -{ - QGridLayout* pathsLayout = new QGridLayout; - int row = 0; - - for (int i = 0; i < NumExternalPrograms; ++i) - { - ExtProgramType program = (ExtProgramType) i; - ExternalProgramWidgets& widgets = m_externalProgramWidgets[i]; - QString name = m_window->externalPrograms()->externalProgramName (program); - QLabel* icon = new QLabel; - QLabel* progLabel = new QLabel (name); - QLineEdit* input = new QLineEdit; - QPushButton* setPathButton = new QPushButton; - - icon->setPixmap (GetIcon (name.toLower())); - input->setText (m_window->externalPrograms()->getPathSetting (program)); - setPathButton->setIcon (GetIcon ("folder")); - widgets.input = input; - widgets.setPathButton = setPathButton; - widgets.wineBox = nullptr; - connect (setPathButton, SIGNAL (clicked()), this, SLOT (slot_setExtProgPath())); - pathsLayout->addWidget (icon, row, 0); - pathsLayout->addWidget (progLabel, row, 1); - pathsLayout->addWidget (input, row, 2); - pathsLayout->addWidget (setPathButton, row, 3); - -#ifdef Q_OS_UNIX - { - QCheckBox* wineBox = new QCheckBox ("Wine"); - wineBox->setChecked (m_window->externalPrograms()->programUsesWine (program)); - widgets.wineBox = wineBox; - pathsLayout->addWidget (wineBox, row, 4); - } -#endif - ++row; - } - ui->extProgs->setLayout (pathsLayout); -} - -void ConfigDialog::applyToWidgetOptions (std::function func) -{ - // Apply configuration - for (QWidget* widget : findChildren()) - { - if (not widget->objectName().startsWith ("config")) - continue; - - QString optionname (widget->objectName().mid (strlen ("config"))); - - if (m_config->existsEntry (optionname)) - func (widget, optionname); - else - print ("Couldn't find configuration entry named %1", optionname); - } -} - -// -// Set the settings based on widget data. -// -void ConfigDialog::applySettings() -{ - applyToWidgetOptions ([&](QWidget* widget, QString confname) - { - QVariant value; - QLineEdit* le; - QSpinBox* spinbox; - QDoubleSpinBox* doublespinbox; - QSlider* slider; - QCheckBox* checkbox; - QPushButton* button; - - if ((le = qobject_cast (widget)) != null) - value = le->text(); - else if ((spinbox = qobject_cast (widget)) != null) - value = spinbox->value(); - else if ((doublespinbox = qobject_cast (widget)) != null) - value = doublespinbox->value(); - else if ((slider = qobject_cast (widget)) != null) - value = slider->value(); - else if ((checkbox = qobject_cast (widget)) != null) - value = checkbox->isChecked(); - else if ((button = qobject_cast (widget)) != null) - value = m_buttonColors[button]; - else - { - print ("Unknown widget of type %1\n", widget->metaObject()->className()); - return; - } - - m_settings->setValue (confname, value); - }); - - // Rebuild the quick color toolbar - m_window->setQuickColors (quickColors); - m_config->setQuickColorToolbar (quickColorString()); - - // Ext program settings - for (int i = 0; i < NumExternalPrograms; ++i) - { - ExtProgramType program = (ExtProgramType) i; - ExtProgramToolset* toolset = m_window->externalPrograms(); - ExternalProgramWidgets& widgets = m_externalProgramWidgets[i]; - toolset->getPathSetting (program) = widgets.input->text(); - - if (widgets.wineBox) - toolset->setWineSetting (program, widgets.wineBox->isChecked()); - } - - // Apply shortcuts - for (int i = 0; i < ui->shortcutsList->count(); ++i) - { - auto item = static_cast (ui->shortcutsList->item (i)); - item->action()->setShortcut (item->sequence()); - } - - m_window->syncSettings(); - LDDocument::current()->reloadAllSubfiles(); - LoadLogoStuds(); - - m_window->R()->setBackground(); - m_window->doFullRefresh(); - m_window->updateDocumentList(); -} - -// -// A dialog button was clicked -// -void ConfigDialog::buttonClicked (QAbstractButton* button) -{ - QDialogButtonBox* dbb = ui->buttonBox; - - if (button == dbb->button (QDialogButtonBox::Ok)) - { - applySettings(); - accept(); - } - else if (button == dbb->button (QDialogButtonBox::Apply)) - { - applySettings(); - } - else if (button == dbb->button (QDialogButtonBox::Cancel)) - { - reject(); - } -} - -// -// Update the list of color toolbar items in the quick color tab. -// -void ConfigDialog::updateQuickColorList (LDQuickColor* sel) -{ - for (QListWidgetItem * item : quickColorItems) - delete item; - - quickColorItems.clear(); - - // Init table items - for (LDQuickColor& entry : quickColors) - { - QListWidgetItem* item = new QListWidgetItem; - - if (entry.isSeparator()) - { - item->setText ("
"); - item->setIcon (GetIcon ("empty")); - } - else - { - LDColor color = entry.color(); - - if (color.isValid()) - { - item->setText (color.name()); - item->setIcon (guiUtilities()->makeColorIcon (color, 16)); - } - else - { - item->setText ("[[unknown color]]"); - item->setIcon (GetIcon ("error")); - } - } - - ui->quickColorList->addItem (item); - quickColorItems << item; - - if (sel and &entry == sel) - { - ui->quickColorList->setCurrentItem (item); - ui->quickColorList->scrollToItem (item); - } - } -} - -// -// Quick colors: add or edit button was clicked. -// -void ConfigDialog::slot_setColor() -{ - LDQuickColor* entry = null; - QListWidgetItem* item = null; - const bool isNew = static_cast (sender()) == ui->quickColor_add; - - if (not isNew) - { - item = getSelectedQuickColor(); - - if (not item) - return; - - int i = getItemRow (item, quickColorItems); - entry = &quickColors[i]; - - if (entry->isSeparator() == true) - return; // don't color separators - } - - LDColor defaultValue = entry ? entry->color() : LDColor::nullColor(); - LDColor value; - - if (not ColorSelector::selectColor (this, value, defaultValue)) - return; - - if (entry != null) - { - entry->setColor (value); - } - else - { - LDQuickColor newentry (value, null); - item = getSelectedQuickColor(); - int idx = (item) ? getItemRow (item, quickColorItems) + 1 : quickColorItems.size(); - quickColors.insert (idx, newentry); - entry = &quickColors[idx]; - } - - updateQuickColorList (entry); -} - -// -// Remove a quick color -// -void ConfigDialog::slot_delColor() -{ - if (ui->quickColorList->selectedItems().isEmpty()) - return; - - QListWidgetItem* item = ui->quickColorList->selectedItems() [0]; - quickColors.removeAt (getItemRow (item, quickColorItems)); - updateQuickColorList(); -} - -// -// Move a quick color up/down -// -void ConfigDialog::slot_moveColor() -{ - const bool up = (static_cast (sender()) == ui->quickColor_moveUp); - - if (ui->quickColorList->selectedItems().isEmpty()) - return; - - QListWidgetItem* item = ui->quickColorList->selectedItems() [0]; - int idx = getItemRow (item, quickColorItems); - int dest = up ? (idx - 1) : (idx + 1); - - if (dest < 0 or dest >= quickColorItems.size()) - return; // destination out of bounds - - qSwap (quickColors[dest], quickColors[idx]); - updateQuickColorList (&quickColors[dest]); -} - -// -// -// Add a separator to quick colors -// -void ConfigDialog::slot_addColorSeparator() -{ - quickColors << LDQuickColor::getSeparator(); - updateQuickColorList (&quickColors[quickColors.size() - 1]); -} - -// -// -// Clear all quick colors -// -void ConfigDialog::slot_clearColors() -{ - quickColors.clear(); - updateQuickColorList(); -} - -// -// -void ConfigDialog::setButtonColor() -{ - QPushButton* button = qobject_cast (sender()); - - if (button == null) - { - print ("setButtonColor: null sender!\n"); - return; - } - - QColor color = QColorDialog::getColor (m_buttonColors[button]); - - if (color.isValid()) - { - QString colorname; - colorname.sprintf ("#%.2X%.2X%.2X", color.red(), color.green(), color.blue()); - setButtonBackground (button, colorname); - } -} - -// -// Sets background color of a given button. -// -void ConfigDialog::setButtonBackground (QPushButton* button, QString value) -{ - button->setIcon (GetIcon ("colorselect")); - button->setAutoFillBackground (true); - button->setStyleSheet (format ("background-color: %1", value)); - m_buttonColors[button] = QColor (value); -} - -// -// Finds the given list widget item in the list of widget items given. -// -int ConfigDialog::getItemRow (QListWidgetItem* item, QList& haystack) -{ - int i = 0; - - for (QListWidgetItem* it : haystack) - { - if (it == item) - return i; - - ++i; - } - - return -1; -} - -// -// Which quick color is currently selected? -// -QListWidgetItem* ConfigDialog::getSelectedQuickColor() -{ - if (ui->quickColorList->selectedItems().isEmpty()) - return null; - - return ui->quickColorList->selectedItems() [0]; -} - -// -// Get the list of shortcuts selected -// -QList ConfigDialog::getShortcutSelection() -{ - QList out; - - for (QListWidgetItem* entry : ui->shortcutsList->selectedItems()) - out << static_cast (entry); - - return out; -} - -// -// Edit the shortcut of a given action. -// -void ConfigDialog::slot_setShortcut() -{ - QList sel = getShortcutSelection(); - - if (sel.size() < 1) - return; - - ShortcutListItem* item = sel[0]; - - if (KeySequenceDialog::staticDialog (item, this)) - setShortcutText (item); -} - -// -// Reset a shortcut to defaults -// -void ConfigDialog::slot_resetShortcut() -{ - QList sel = getShortcutSelection(); - - for (ShortcutListItem* item : sel) - { - item->setSequence (MainWindow::defaultShortcut (item->action())); - setShortcutText (item); - } -} - -// -// Remove the shortcut of an action. -// -void ConfigDialog::slot_clearShortcut() -{ - QList sel = getShortcutSelection(); - - for (ShortcutListItem* item : sel) - { - item->setSequence (QKeySequence()); - setShortcutText (item); - } -} - -// -// Set the path of an external program -// -void ConfigDialog::slot_setExtProgPath() -{ - ExtProgramType program = NumExternalPrograms; - - for (int i = 0; i < NumExternalPrograms; ++i) - { - if (m_externalProgramWidgets[i].setPathButton == sender()) - { - program = (ExtProgramType) i; - break; - } - } - - if (program != NumExternalPrograms) - { - ExtProgramToolset* toolset = m_window->externalPrograms(); - ExternalProgramWidgets& widgets = m_externalProgramWidgets[program]; - QString filepath = QFileDialog::getOpenFileName (this, - format ("Path to %1", toolset->externalProgramName (program)), - widgets.input->text(), g_extProgPathFilter); - - if (filepath.isEmpty()) - return; - - widgets.input->setText (filepath); - } -} - -// -// '...' button pressed for the download path -// -void ConfigDialog::slot_findDownloadFolder() -{ - QString dpath = QFileDialog::getExistingDirectory(); - - if (not dpath.isEmpty()) - ui->configDownloadFilePath->setText (dpath); -} - -// -// -// Updates the text string for a given shortcut list item -// -void ConfigDialog::setShortcutText (ShortcutListItem* item) -{ - QAction* act = item->action(); - QString label = act->iconText(); - QString keybind = item->sequence().toString(); - item->setText (format ("%1 (%2)", label, keybind)); -} - -// -// Gets the configuration string of the quick color toolbar -// -QString ConfigDialog::quickColorString() -{ - QString val; - - for (const LDQuickColor& entry : quickColors) - { - if (val.length() > 0) - val += ':'; - - if (entry.isSeparator()) - val += '|'; - else - val += format ("%1", entry.color().index()); - } - - return val; -} - -// -// -KeySequenceDialog::KeySequenceDialog (QKeySequence seq, QWidget* parent, Qt::WindowFlags f) : - QDialog (parent, f), seq (seq) -{ - lb_output = new QLabel; - - bbx_buttons = new QDialogButtonBox (QDialogButtonBox::Ok | QDialogButtonBox::Cancel); \ - connect (bbx_buttons, SIGNAL (accepted()), this, SLOT (accept())); \ - connect (bbx_buttons, SIGNAL (rejected()), this, SLOT (reject())); \ - - setWhatsThis (tr ("Into this dialog you can input a key sequence for use as a " - "shortcut in LDForge. Use OK to confirm the new shortcut and Cancel to " - "dismiss.")); - - QVBoxLayout* layout = new QVBoxLayout; - layout->addWidget (lb_output); - layout->addWidget (bbx_buttons); - setLayout (layout); - - updateOutput(); -} - -// -// -bool KeySequenceDialog::staticDialog (ShortcutListItem* item, QWidget* parent) -{ - KeySequenceDialog dlg (item->sequence(), parent); - - if (dlg.exec() == QDialog::Rejected) - return false; - - item->setSequence (dlg.seq); - return true; -} - -// -// -void KeySequenceDialog::updateOutput() -{ - QString shortcut = seq.toString(); - - if (seq == QKeySequence()) - shortcut = "<empty>"; - - QString text = format ("
%1
", shortcut); - lb_output->setText (text); -} - -// -// -void KeySequenceDialog::keyPressEvent (QKeyEvent* ev) -{ - seq = ev->key() + ev->modifiers(); - updateOutput(); -}