# HG changeset patch # User Teemu Piippo # Date 1441052625 -10800 # Node ID 24ba5aa3393fb0295d4d0d5504ad94aaec00a084 # Parent b2fa5f89798ab4d6af504ff6012f6d85e9f63fce Move ConfigDialog into src/dialogs/ subfolder diff -r b2fa5f89798a -r 24ba5aa3393f CMakeLists.txt --- a/CMakeLists.txt Mon Aug 31 23:18:17 2015 +0300 +++ b/CMakeLists.txt Mon Aug 31 23:23:45 2015 +0300 @@ -35,7 +35,6 @@ src/addObjectDialog.cpp src/basics.cpp src/colors.cpp - src/configDialog.cpp src/crashCatcher.cpp src/dialogs.cpp src/documentation.cpp @@ -58,6 +57,7 @@ src/ringFinder.cpp src/version.cpp src/dialogs/colorselector.cpp + src/dialogs/configdialog.cpp src/dialogs/ldrawpathdialog.cpp src/dialogs/newpartdialog.cpp src/dialogs/openprogressdialog.cpp @@ -95,7 +95,6 @@ src/documentation.h src/main.h src/basics.h - src/configDialog.h src/glRenderer.h src/glCompiler.h src/mainwindow.h @@ -105,6 +104,7 @@ src/hierarchyelement.h src/guiutilities.h src/dialogs/colorselector.h + src/dialogs/configdialog.h src/dialogs/ldrawpathdialog.h src/dialogs/newpartdialog.h src/dialogs/openprogressdialog.h @@ -127,7 +127,6 @@ set (LDFORGE_FORMS ui/about.ui ui/addhistoryline.ui - ui/config.ui ui/coverer.ui ui/downloadfrom.ui ui/edger2.ui @@ -144,6 +143,7 @@ ui/ytruder.ui src/mainwindow.ui src/dialogs/colorselector.ui + src/dialogs/configdialog.ui src/dialogs/ldrawpathdialog.ui src/dialogs/newpartdialog.ui src/dialogs/openprogressdialog.ui 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(); -} diff -r b2fa5f89798a -r 24ba5aa3393f src/configDialog.h --- a/src/configDialog.h Mon Aug 31 23:18:17 2015 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,123 +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 . - */ - -#pragma once -#include "mainwindow.h" -#include "toolsets/extprogramtoolset.h" -#include - -class Ui_ConfigUI; -class QLabel; -class QDoubleSpinBox; - -// ============================================================================= -class ShortcutListItem : public QListWidgetItem -{ - PROPERTY (public, QAction*, action, setAction, STOCK_WRITE) - PROPERTY (public, QKeySequence, sequence, setSequence, STOCK_WRITE) - -public: - explicit ShortcutListItem (QListWidget* view = null, int type = Type) : - QListWidgetItem (view, type) {} -}; - -struct ExternalProgramWidgets -{ - class QLineEdit* input; - class QPushButton* setPathButton; - class QCheckBox* wineBox; -}; - -// ============================================================================= -class ConfigDialog : public QDialog, public HierarchyElement -{ - Q_OBJECT - -public: - enum Tab - { - InterfaceTab, - EditingToolsTab, - ProfileTab, - ShortcutsTab, - QuickColorsTab, - GridsTab, - ExtProgsTab, - DownloadTab - }; - - explicit ConfigDialog (QWidget* parent = nullptr, Tab defaulttab = (Tab) 0, Qt::WindowFlags f = 0); - virtual ~ConfigDialog(); - - QList quickColors; - -private: - Ui_ConfigUI* ui; - QList quickColorItems; - QMap m_buttonColors; - ExternalProgramWidgets m_externalProgramWidgets[NumExternalPrograms]; - QSettings* m_settings; - - void applySettings(); - void addShortcut (QAction* act); - void setButtonBackground (QPushButton* button, QString value); - void updateQuickColorList (LDQuickColor* sel = null); - void setShortcutText (ShortcutListItem* item); - int getItemRow (QListWidgetItem* item, QList& haystack); - QString quickColorString(); - QListWidgetItem* getSelectedQuickColor(); - QList getShortcutSelection(); - void initExtProgs(); - void applyToWidgetOptions (std::function func); - -private slots: - void setButtonColor(); - void slot_setShortcut(); - void slot_resetShortcut(); - void slot_clearShortcut(); - void slot_setColor(); - void slot_delColor(); - void slot_addColorSeparator(); - void slot_moveColor(); - void slot_clearColors(); - void slot_setExtProgPath(); - void slot_findDownloadFolder(); - void buttonClicked (QAbstractButton* button); - void selectPage (int row); -}; - -// ============================================================================= -// -class KeySequenceDialog : public QDialog -{ - Q_OBJECT - -public: - explicit KeySequenceDialog (QKeySequence seq, QWidget* parent = null, Qt::WindowFlags f = 0); - static bool staticDialog (ShortcutListItem* item, QWidget* parent = null); - - QLabel* lb_output; - QDialogButtonBox* bbx_buttons; - QKeySequence seq; - -private: - void updateOutput(); - -private slots: - virtual void keyPressEvent (QKeyEvent* ev) override; -}; diff -r b2fa5f89798a -r 24ba5aa3393f src/dialogs/configdialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/dialogs/configdialog.cpp Mon Aug 31 23:23:45 2015 +0300 @@ -0,0 +1,703 @@ +/* + * 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 +#include "../main.h" +#include "../ldDocument.h" +#include "../miscallenous.h" +#include "../glRenderer.h" +#include "../guiutilities.h" +#include "colorselector.h" +#include "configdialog.h" +#include "ui_configdialog.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_ConfigDialog; + 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(); +} diff -r b2fa5f89798a -r 24ba5aa3393f src/dialogs/configdialog.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/dialogs/configdialog.h Mon Aug 31 23:23:45 2015 +0300 @@ -0,0 +1,122 @@ +/* + * 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 . + */ + +#pragma once +#include "../mainwindow.h" +#include "../toolsets/extprogramtoolset.h" +#include + +class QLabel; +class QDoubleSpinBox; + +// ============================================================================= +class ShortcutListItem : public QListWidgetItem +{ + PROPERTY (public, QAction*, action, setAction, STOCK_WRITE) + PROPERTY (public, QKeySequence, sequence, setSequence, STOCK_WRITE) + +public: + explicit ShortcutListItem (QListWidget* view = null, int type = Type) : + QListWidgetItem (view, type) {} +}; + +struct ExternalProgramWidgets +{ + class QLineEdit* input; + class QPushButton* setPathButton; + class QCheckBox* wineBox; +}; + +// ============================================================================= +class ConfigDialog : public QDialog, public HierarchyElement +{ + Q_OBJECT + +public: + enum Tab + { + InterfaceTab, + EditingToolsTab, + ProfileTab, + ShortcutsTab, + QuickColorsTab, + GridsTab, + ExtProgsTab, + DownloadTab + }; + + explicit ConfigDialog (QWidget* parent = nullptr, Tab defaulttab = (Tab) 0, Qt::WindowFlags f = 0); + virtual ~ConfigDialog(); + + QList quickColors; + +private: + class Ui_ConfigDialog* ui; + QList quickColorItems; + QMap m_buttonColors; + ExternalProgramWidgets m_externalProgramWidgets[NumExternalPrograms]; + QSettings* m_settings; + + void applySettings(); + void addShortcut (QAction* act); + void setButtonBackground (QPushButton* button, QString value); + void updateQuickColorList (LDQuickColor* sel = null); + void setShortcutText (ShortcutListItem* item); + int getItemRow (QListWidgetItem* item, QList& haystack); + QString quickColorString(); + QListWidgetItem* getSelectedQuickColor(); + QList getShortcutSelection(); + void initExtProgs(); + void applyToWidgetOptions (std::function func); + +private slots: + void setButtonColor(); + void slot_setShortcut(); + void slot_resetShortcut(); + void slot_clearShortcut(); + void slot_setColor(); + void slot_delColor(); + void slot_addColorSeparator(); + void slot_moveColor(); + void slot_clearColors(); + void slot_setExtProgPath(); + void slot_findDownloadFolder(); + void buttonClicked (QAbstractButton* button); + void selectPage (int row); +}; + +// ============================================================================= +// +class KeySequenceDialog : public QDialog +{ + Q_OBJECT + +public: + explicit KeySequenceDialog (QKeySequence seq, QWidget* parent = null, Qt::WindowFlags f = 0); + static bool staticDialog (ShortcutListItem* item, QWidget* parent = null); + + QLabel* lb_output; + QDialogButtonBox* bbx_buttons; + QKeySequence seq; + +private: + void updateOutput(); + +private slots: + virtual void keyPressEvent (QKeyEvent* ev) override; +}; diff -r b2fa5f89798a -r 24ba5aa3393f src/dialogs/configdialog.ui --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/dialogs/configdialog.ui Mon Aug 31 23:23:45 2015 +0300 @@ -0,0 +1,1070 @@ + + + ConfigDialog + + + + 0 + 0 + 668 + 408 + + + + Settings + + + + :/icons/settings.png:/icons/settings.png + + + + + + + + + 144 + 0 + + + + + 144 + 16777215 + + + + + Interface + + + + + Editing tools + + + + + Profile + + + + + Shortcuts + + + + + Color Toolbar + + + + + Grids + + + + + External Programs + + + + + Downloads + + + + + + + + 0 + + + + + + + Interface + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Background color + + + + + + + This is the background color for the viewport. + + + + + + + :/icons/colorselect.png:/icons/colorselect.png + + + + + + + + + + Main color + + + + + + + This color is used for the main color. + + + + + + + :/icons/colorselect.png:/icons/colorselect.png + + + + + + + Selected color + + + + + + + This color is used for the main color. + + + + + + + :/icons/colorselect.png:/icons/colorselect.png + + + + + + + + + + Main color alpha + + + + + + + 1.000000000000000 + + + 0.050000000000000 + + + 1.000000000000000 + + + + + + + + + + Line thickness + + + + + + + How thick lines should be drawn in the viewport. + + + 1 + + + 8 + + + Qt::Horizontal + + + QSlider::TicksAbove + + + 1 + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Use logoed studs + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Anti-aliased lines + + + + + + + Display line lenghts when drawing + + + + + + + Polygons' front sides become green and back sides red. + + + Red/green BFC view (incomplete) + + + + + + + Makes colored objects (non-16 and 24) appear colored in the list view. A red triangle will, for instance, have its entry written in red text. This can be useful to locate colored objects. + + + Colorize objects in list view + + + + + + + Makes all edgelines appear black. If this is not set, edge lines take their color as defined in LDConfig.ldr. + + + Black edges + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Highlight object below cursor + + + + + + + List implicitly loaded files + + + + + + + + + + + + + + + + + + Editing tools + + + + + + Rounding + + + + + + + + Position decimals: + + + + + + + + + + Matrix decimals: + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + Profile + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + QFormLayout::ExpandingFieldsGrow + + + + + Name: + + + + + + + + 250 + 0 + + + + + + + + Username: + + + + + + + + + + Use CA license + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + Here you can alter keyboard shortcuts for almost all LDForge actions. Only exceptions are the controls for the viewport. Use the set button to set a key shortcut, clear to remove it and reset to restore the shortcut to its default value. + +Shortcut changes apply immediately after closing this window. + + + Shortcuts + + + + + + Qt::ScrollBarAsNeeded + + + + + + + + + Set + + + + + + + Reset + + + + :/icons/undo.png:/icons/undo.png + + + + + + + Clear + + + + :/icons/delete.png:/icons/delete.png + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + + + Here you can alter the layout of the quick colors toolbar. Use the controls to add, remove or edit the colors used. You can also add separators in between colors. + +Usually this contains MainColor, EdgeColor and some auxiliary colors used to group objects. + + + Color Toolbar + + + + + + Qt::ScrollBarAsNeeded + + + + + + + + + Add Color + + + + :/icons/palette.png:/icons/palette.png + + + + + + + Add Separator + + + + + + + Edit + + + + :/icons/mode-draw.png:/icons/mode-draw.png + + + + + + + Qt::Horizontal + + + + + + + Move Up + + + + :/icons/arrow-up.png:/icons/arrow-up.png + + + + + + + Move Down + + + + :/icons/arrow-down.png:/icons/arrow-down.png + + + + + + + Qt::Horizontal + + + + + + + Remove + + + + :/icons/delete.png:/icons/delete.png + + + + + + + Clear List + + + + :/icons/delete.png:/icons/delete.png + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + + + Grids + + + + + + + + ° + + + 3 + + + 360.000000000000000 + + + + + + + Coordinate snap + + + + + + + Angle snap + + + + + + + + + + :/icons/grid-coarse.png + + + + + + + Coarse + + + + + + + LDU + + + 5 + + + 10000.000000000000000 + + + + + + + ° + + + 3 + + + 360.000000000000000 + + + + + + + + + + :/icons/grid-medium.png + + + + + + + Medium + + + + + + + LDU + + + 5 + + + 10000.000000000000000 + + + + + + + ° + + + 3 + + + 360.000000000000000 + + + + + + + + + + :/icons/grid-fine.png + + + + + + + Fine + + + + + + + LDU + + + 5 + + + 10000.000000000000000 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 165 + + + + + + + + + + + + + + + LDForge supports launching of several third-party utility tools; here you can set the file paths to these tools. Set the paths of the tools to the exe files. + +Under Linux, you can also set the programs to be launched with Wine, so you can use Windows binaries here as well. You will obviously need Wine installed. A 'wine' command in PATH is necessary for this to work. + + + External Programs + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + Downloads + + + + + + + + Download path: + + + + + + + + + + + + + + :/icons/folder.png:/icons/folder.png + + + + + + + + + Attempt to download missing parts from the PT + + + + + + + <p>When this is set, LDForge tries to adjust and correct part paths based on the input. A full path given to the download prompt should be of form <tt>"&lt;dir&gt;/&lt;file&gt;.dat"</tt> - with this set, input can be automatically completed.</p> + +<p>Examples: +<ul> +<li>3002 -> parts/3002.dat</li> +<li>3002.da -> parts/3002.dat</li> +<li>3002s01 -> parts/s/3002s01.dat</li> +<li>4-4cyli -> p/4-4cyli.dat</li> +</ul></p> + + + Correct and guess part paths + + + + + + + If this is set, LDForge will close the download prompt after everything has been downloaded. The prompt will not be closed if a download has failed. + + + Close download prompt after completion + + + + + + + Qt::Vertical + + + + 20 + 187 + + + + + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + diff -r b2fa5f89798a -r 24ba5aa3393f src/mainwindow.cpp --- a/src/mainwindow.cpp Mon Aug 31 23:18:17 2015 +0300 +++ b/src/mainwindow.cpp Mon Aug 31 23:23:45 2015 +0300 @@ -46,12 +46,12 @@ #include "radioGroup.h" #include "addObjectDialog.h" #include "messageLog.h" -#include "configDialog.h" #include "ui_mainwindow.h" #include "primitives.h" #include "editmodes/abstractEditMode.h" #include "toolsets/extprogramtoolset.h" #include "toolsets/toolset.h" +#include "dialogs/configdialog.h" #include "guiutilities.h" static bool g_isSelectionLocked = false; diff -r b2fa5f89798a -r 24ba5aa3393f src/toolsets/filetoolset.cpp --- a/src/toolsets/filetoolset.cpp Mon Aug 31 23:18:17 2015 +0300 +++ b/src/toolsets/filetoolset.cpp Mon Aug 31 23:23:45 2015 +0300 @@ -18,13 +18,13 @@ #include #include -#include "../configDialog.h" #include "../dialogs.h" #include "../glRenderer.h" #include "../ldDocument.h" #include "../mainwindow.h" #include "../partDownloader.h" #include "../primitives.h" +#include "../dialogs/configdialog.h" #include "../dialogs/ldrawpathdialog.h" #include "../dialogs/newpartdialog.h" #include "filetoolset.h" diff -r b2fa5f89798a -r 24ba5aa3393f ui/config.ui --- a/ui/config.ui Mon Aug 31 23:18:17 2015 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1070 +0,0 @@ - - - ConfigUI - - - - 0 - 0 - 668 - 370 - - - - Settings - - - - :/icons/settings.png:/icons/settings.png - - - - - - - - - 144 - 0 - - - - - 144 - 16777215 - - - - - Interface - - - - - Editing tools - - - - - Profile - - - - - Shortcuts - - - - - Color Toolbar - - - - - Grids - - - - - External Programs - - - - - Downloads - - - - - - - - 0 - - - - - - - Interface - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - Background color - - - - - - - This is the background color for the viewport. - - - - - - - :/icons/colorselect.png:/icons/colorselect.png - - - - - - - - - - Main color - - - - - - - This color is used for the main color. - - - - - - - :/icons/colorselect.png:/icons/colorselect.png - - - - - - - Selected color - - - - - - - This color is used for the main color. - - - - - - - :/icons/colorselect.png:/icons/colorselect.png - - - - - - - - - - Main color alpha - - - - - - - 1.000000000000000 - - - 0.050000000000000 - - - 1.000000000000000 - - - - - - - - - - Line thickness - - - - - - - How thick lines should be drawn in the viewport. - - - 1 - - - 8 - - - Qt::Horizontal - - - QSlider::TicksAbove - - - 1 - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Use logoed studs - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Anti-aliased lines - - - - - - - Display line lenghts when drawing - - - - - - - Polygons' front sides become green and back sides red. - - - Red/green BFC view (incomplete) - - - - - - - Makes colored objects (non-16 and 24) appear colored in the list view. A red triangle will, for instance, have its entry written in red text. This can be useful to locate colored objects. - - - Colorize objects in list view - - - - - - - Makes all edgelines appear black. If this is not set, edge lines take their color as defined in LDConfig.ldr. - - - Black edges - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Highlight object below cursor - - - - - - - List implicitly loaded files - - - - - - - - - - - - - - - - - - Editing tools - - - - - - Rounding - - - - - - - - Position decimals: - - - - - - - - - - Matrix decimals: - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - Profile - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - QFormLayout::ExpandingFieldsGrow - - - - - Name: - - - - - - - - 250 - 0 - - - - - - - - Username: - - - - - - - - - - Use CA license - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - - Here you can alter keyboard shortcuts for almost all LDForge actions. Only exceptions are the controls for the viewport. Use the set button to set a key shortcut, clear to remove it and reset to restore the shortcut to its default value. - -Shortcut changes apply immediately after closing this window. - - - Shortcuts - - - - - - Qt::ScrollBarAsNeeded - - - - - - - - - Set - - - - - - - Reset - - - - :/icons/undo.png:/icons/undo.png - - - - - - - Clear - - - - :/icons/delete.png:/icons/delete.png - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - - - - Here you can alter the layout of the quick colors toolbar. Use the controls to add, remove or edit the colors used. You can also add separators in between colors. - -Usually this contains MainColor, EdgeColor and some auxiliary colors used to group objects. - - - Color Toolbar - - - - - - Qt::ScrollBarAsNeeded - - - - - - - - - Add Color - - - - :/icons/palette.png:/icons/palette.png - - - - - - - Add Separator - - - - - - - Edit - - - - :/icons/mode-draw.png:/icons/mode-draw.png - - - - - - - Qt::Horizontal - - - - - - - Move Up - - - - :/icons/arrow-up.png:/icons/arrow-up.png - - - - - - - Move Down - - - - :/icons/arrow-down.png:/icons/arrow-down.png - - - - - - - Qt::Horizontal - - - - - - - Remove - - - - :/icons/delete.png:/icons/delete.png - - - - - - - Clear List - - - - :/icons/delete.png:/icons/delete.png - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - - - - Grids - - - - - - - - ° - - - 3 - - - 360.000000000000000 - - - - - - - Coordinate snap - - - - - - - Angle snap - - - - - - - - - - :/icons/grid-coarse.png - - - - - - - Coarse - - - - - - - LDU - - - 5 - - - 10000.000000000000000 - - - - - - - ° - - - 3 - - - 360.000000000000000 - - - - - - - - - - :/icons/grid-medium.png - - - - - - - Medium - - - - - - - LDU - - - 5 - - - 10000.000000000000000 - - - - - - - ° - - - 3 - - - 360.000000000000000 - - - - - - - - - - :/icons/grid-fine.png - - - - - - - Fine - - - - - - - LDU - - - 5 - - - 10000.000000000000000 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Qt::Vertical - - - - 20 - 165 - - - - - - - - - - - - - - - LDForge supports launching of several third-party utility tools; here you can set the file paths to these tools. Set the paths of the tools to the exe files. - -Under Linux, you can also set the programs to be launched with Wine, so you can use Windows binaries here as well. You will obviously need Wine installed. A 'wine' command in PATH is necessary for this to work. - - - External Programs - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - Downloads - - - - - - - - Download path: - - - - - - - - - - - - - - :/icons/folder.png:/icons/folder.png - - - - - - - - - Attempt to download missing parts from the PT - - - - - - - <p>When this is set, LDForge tries to adjust and correct part paths based on the input. A full path given to the download prompt should be of form <tt>"&lt;dir&gt;/&lt;file&gt;.dat"</tt> - with this set, input can be automatically completed.</p> - -<p>Examples: -<ul> -<li>3002 -> parts/3002.dat</li> -<li>3002.da -> parts/3002.dat</li> -<li>3002s01 -> parts/s/3002s01.dat</li> -<li>4-4cyli -> p/4-4cyli.dat</li> -</ul></p> - - - Correct and guess part paths - - - - - - - If this is set, LDForge will close the download prompt after everything has been downloaded. The prompt will not be closed if a download has failed. - - - Close download prompt after completion - - - - - - - Qt::Vertical - - - - 20 - 187 - - - - - - - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - -