diff options
Diffstat (limited to 'src/qtconfig/mainwindow.cpp')
-rw-r--r-- | src/qtconfig/mainwindow.cpp | 956 |
1 files changed, 956 insertions, 0 deletions
diff --git a/src/qtconfig/mainwindow.cpp b/src/qtconfig/mainwindow.cpp new file mode 100644 index 000000000..059adb307 --- /dev/null +++ b/src/qtconfig/mainwindow.cpp @@ -0,0 +1,956 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "mainwindow.h" +#include "ui_mainwindow.h" + +#include "colorbutton.h" +#include "previewframe.h" +#include "paletteeditoradvanced.h" + +#include <QLabel> +#include <QApplication> +#include <QComboBox> +#include <QStyleFactory> +#include <QFontDatabase> +#include <QLineEdit> +#include <QSpinBox> +#include <QCheckBox> +#include <QFileDialog> +#include <QAction> +#include <QStatusBar> +#include <QSettings> +#include <QMessageBox> +#include <QStyle> +#include <QtEvents> +#include <QInputContext> +#include <QInputContextFactory> +#include <QtDebug> +#include <QPixmap> + +#include <stdlib.h> + +#ifndef QT_NO_GSTREAMER +#include <gst/gst.h> +#endif +#ifdef HAVE_PHONON +#include <phonon/phononnamespace.h> +#endif + +#include <QtGui/private/qt_x11_p.h> + +QT_BEGIN_NAMESPACE + +// from qapplication.cpp and qapplication_x11.cpp - These are NOT for +// external use ignore them +// extern bool Q_CORE_EXPORT qt_resolve_symlinks; + +static const char *appearance_text = QT_TRANSLATE_NOOP("MainWindow", +"<p><b><font size+=2>Appearance</font></b></p>" +"<hr>" +"<p>Use this tab to customize the appearance of your Qt applications.</p>" +"<p>You can select the default GUI Style from the drop down list and " +"customize the colors.</p>" +"<p>Any GUI Style plugins in your plugin path will automatically be added " +"to the list of built-in Qt styles. (See the Library Paths tab for " +"information on adding new plugin paths.)</p>" +"<p>When you choose 3-D Effects and Window Background colors, the Qt " +"Configuration program will automatically generate a palette for you. " +"To customize colors further, press the Tune Palette button to open " +"the advanced palette editor." +"<p>The Preview Window shows what the selected Style and colors look " +"like."); + +static const char *font_text = QT_TRANSLATE_NOOP("MainWindow", +"<p><b><font size+=2>Fonts</font></b></p>" +"<hr>" +"<p>Use this tab to select the default font for your Qt applications. " +"The selected font is shown (initially as 'Sample Text') in the line " +"edit below the Family, " +"Style and Point Size drop down lists.</p>" +"<p>Qt has a powerful font substitution feature that allows you to " +"specify a list of substitute fonts. Substitute fonts are used " +"when a font cannot be loaded, or if the specified font doesn't have " +"a particular character." +"<p>For example, if you select the font Lucida, which doesn't have Korean " +"characters, but need to show some Korean text using the Mincho font family " +"you can do so by adding Mincho to the list. Once Mincho is added, any " +"Korean characters that are not found in the Lucida font will be taken " +"from the Mincho font. Because the font substitutions are " +"lists, you can also select multiple families, such as Song Ti (for " +"use with Chinese text)."); + +static const char *interface_text = QT_TRANSLATE_NOOP("MainWindow", +"<p><b><font size+=2>Interface</font></b></p>" +"<hr>" +"<p>Use this tab to customize the feel of your Qt applications.</p>" +"<p>If the Resolve Symlinks checkbox is checked Qt will follow symlinks " +"when handling URLs. For example, in the file dialog, if this setting is turned " +"on and /usr/tmp is a symlink to /var/tmp, entering the /usr/tmp directory " +"will cause the file dialog to change to /var/tmp. With this setting turned " +"off, symlinks are not resolved or followed.</p>" +"<p>The Global Strut setting is useful for people who require a " +"minimum size for all widgets (e.g. when using a touch panel or for users " +"who are visually impaired). Leaving the Global Strut width and height " +"at 0 will disable the Global Strut feature</p>" +"<p>XIM (Extended Input Methods) are used for entering characters in " +"languages that have large character sets, for example, Chinese and " +"Japanese."); +// ### What does the 'Enhanced support for languages written R2L do? + +static const char *printer_text = QT_TRANSLATE_NOOP("MainWindow", +"<p><b><font size+=2>Printer</font></b></p>" +"<hr>" +"<p>Use this tab to configure the way Qt generates output for the printer." +"You can specify if Qt should try to embed fonts into its generated output." +"If you enable font embedding, the resulting postscript will be more " +"portable and will more accurately reflect the " +"visual output on the screen; however the resulting postscript file " +"size will be bigger." +"<p>When using font embedding you can select additional directories where " +"Qt should search for embeddable font files. By default, the X " +"server font path is used."); + +static const char *phonon_text = QT_TRANSLATE_NOOP("MainWindow", +"<p><b><font size+=2>Phonon</font></b></p>" +"<hr>" +"<p>Use this tab to configure the Phonon GStreamer multimedia backend. " +"<p>It is reccommended to leave all settings on \"Auto\" to let " +"Phonon determine your settings automatically."); + + +QPalette::ColorGroup MainWindow::groupFromIndex(int item) +{ + switch (item) { + case 0: + default: + return QPalette::Active; + case 1: + return QPalette::Inactive; + case 2: + return QPalette::Disabled; + } +} + +static void setStyleHelper(QWidget *w, QStyle *s) +{ + const QObjectList children = w->children(); + for (int i = 0; i < children.size(); ++i) { + QObject *child = children.at(i); + if (child->isWidgetType()) + setStyleHelper((QWidget *) child, s); + } + w->setStyle(s); +} + +MainWindow::MainWindow() + : ui(new Ui::MainWindow), + editPalette(palette()), + previewPalette(palette()), + previewstyle(0) +{ + ui->setupUi(this); + statusBar(); + + // signals and slots connections + connect(ui->fontPathLineEdit, SIGNAL(returnPressed()), SLOT(addFontpath())); + connect(ui->addFontPathButton, SIGNAL(clicked()), SLOT(addFontpath())); + connect(ui->addSubstitutionButton, SIGNAL(clicked()), SLOT(addSubstitute())); + connect(ui->browseFontPathButton, SIGNAL(clicked()), SLOT(browseFontpath())); + connect(ui->fontStyleCombo, SIGNAL(activated(int)), SLOT(buildFont())); + connect(ui->pointSizeCombo, SIGNAL(activated(int)), SLOT(buildFont())); + connect(ui->downFontpathButton, SIGNAL(clicked()), SLOT(downFontpath())); + connect(ui->downSubstitutionButton, SIGNAL(clicked()), SLOT(downSubstitute())); + connect(ui->fontFamilyCombo, SIGNAL(activated(QString)), SLOT(familySelected(QString))); + connect(ui->fileExitAction, SIGNAL(triggered()), SLOT(fileExit())); + connect(ui->fileSaveAction, SIGNAL(triggered()), SLOT(fileSave())); + connect(ui->helpAboutAction, SIGNAL(triggered()), SLOT(helpAbout())); + connect(ui->helpAboutQtAction, SIGNAL(triggered()), SLOT(helpAboutQt())); + connect(ui->mainTabWidget, SIGNAL(currentChanged(int)), SLOT(pageChanged(int))); + connect(ui->paletteCombo, SIGNAL(activated(int)), SLOT(paletteSelected(int))); + connect(ui->removeFontpathButton, SIGNAL(clicked()), SLOT(removeFontpath())); + connect(ui->removeSubstitutionButton, SIGNAL(clicked()), SLOT(removeSubstitute())); + connect(ui->toolBoxEffectCombo, SIGNAL(activated(int)), SLOT(somethingModified())); + connect(ui->doubleClickIntervalSpinBox, SIGNAL(valueChanged(int)), SLOT(somethingModified())); + connect(ui->cursorFlashTimeSpinBox, SIGNAL(valueChanged(int)), SLOT(somethingModified())); + connect(ui->wheelScrollLinesSpinBox, SIGNAL(valueChanged(int)), SLOT(somethingModified())); + connect(ui->menuEffectCombo, SIGNAL(activated(int)), SLOT(somethingModified())); + connect(ui->comboEffectCombo, SIGNAL(activated(int)), SLOT(somethingModified())); + connect(ui->audiosinkCombo, SIGNAL(activated(int)), SLOT(somethingModified())); + connect(ui->videomodeCombo, SIGNAL(activated(int)), SLOT(somethingModified())); + connect(ui->toolTipEffectCombo, SIGNAL(activated(int)), SLOT(somethingModified())); + connect(ui->strutWidthSpinBox, SIGNAL(valueChanged(int)), SLOT(somethingModified())); + connect(ui->strutHeightSpinBox, SIGNAL(valueChanged(int)), SLOT(somethingModified())); + connect(ui->effectsCheckBox, SIGNAL(toggled(bool)), SLOT(somethingModified())); + connect(ui->resolveLinksCheckBox, SIGNAL(toggled(bool)), SLOT(somethingModified())); + connect(ui->fontEmbeddingCheckBox, SIGNAL(clicked()), SLOT(somethingModified())); + connect(ui->rtlExtensionsCheckBox, SIGNAL(toggled(bool)), SLOT(somethingModified())); + connect(ui->inputStyleCombo, SIGNAL(activated(int)), SLOT(somethingModified())); + connect(ui->inputMethodCombo, SIGNAL(activated(int)), SLOT(somethingModified())); + connect(ui->guiStyleCombo, SIGNAL(activated(QString)), SLOT(styleSelected(QString))); + connect(ui->familySubstitutionCombo, SIGNAL(activated(QString)), SLOT(substituteSelected(QString))); + connect(ui->tunePaletteButton, SIGNAL(clicked()), SLOT(tunePalette())); + connect(ui->upFontpathButton, SIGNAL(clicked()), SLOT(upFontpath())); + connect(ui->upSubstitutionButton, SIGNAL(clicked()), SLOT(upSubstitute())); + + modified = true; + desktopThemeName = tr("Desktop Settings (Default)"); + setWindowIcon(QPixmap(":/trolltech/qtconfig/images/appicon.png")); + QStringList gstyles = QStyleFactory::keys(); + gstyles.sort(); + ui->guiStyleCombo->addItem(desktopThemeName); + ui->guiStyleCombo->setItemData(ui->guiStyleCombo->findText(desktopThemeName), + tr("Choose style and palette based on your desktop settings."), + Qt::ToolTipRole); + ui->guiStyleCombo->addItems(gstyles); + + QSettings settings(QLatin1String("Trolltech")); + settings.beginGroup(QLatin1String("Qt")); + + QString currentstyle = settings.value(QLatin1String("style")).toString(); + if (currentstyle.isEmpty()) { + ui->guiStyleCombo->setCurrentIndex(ui->guiStyleCombo->findText(desktopThemeName)); + currentstyle = QApplication::style()->objectName(); + } else { + int index = ui->guiStyleCombo->findText(currentstyle, Qt::MatchFixedString); + if (index != -1) { + ui->guiStyleCombo->setCurrentIndex(index); + } else { // we give up + ui->guiStyleCombo->addItem(tr("Unknown")); + ui->guiStyleCombo->setCurrentIndex(ui->guiStyleCombo->count() - 1); + } + } + ui->buttonMainColor->setColor(palette().color(QPalette::Active, QPalette::Button)); + ui->buttonWindowColor->setColor(palette().color(QPalette::Active, QPalette::Window)); + connect(ui->buttonMainColor, SIGNAL(colorChanged(QColor)), SLOT(buildPalette())); + connect(ui->buttonWindowColor, SIGNAL(colorChanged(QColor)), SLOT(buildPalette())); + + if (X11->desktopEnvironment == DE_KDE) + ui->colorConfig->hide(); + else + ui->kdeNoteLabel->hide(); + + QFontDatabase db; + QStringList families = db.families(); + ui->fontFamilyCombo->addItems(families); + + QStringList fs = families; + QStringList fs2 = QFont::substitutions(); + QStringList::Iterator fsit = fs2.begin(); + while (fsit != fs2.end()) { + if (!fs.contains(*fsit)) + fs += *fsit; + fsit++; + } + fs.sort(); + ui->familySubstitutionCombo->addItems(fs); + + ui->chooseSubstitutionCombo->addItems(families); + QList<int> sizes = db.standardSizes(); + foreach(int i, sizes) + ui->pointSizeCombo->addItem(QString::number(i)); + + ui->doubleClickIntervalSpinBox->setValue(QApplication::doubleClickInterval()); + ui->cursorFlashTimeSpinBox->setValue(QApplication::cursorFlashTime()); + ui->wheelScrollLinesSpinBox->setValue(QApplication::wheelScrollLines()); + // ############# + // resolveLinksCheckBox->setChecked(qt_resolve_symlinks); + + ui->effectsCheckBox->setChecked(QApplication::isEffectEnabled(Qt::UI_General)); + ui->effectsFrame->setEnabled(ui->effectsCheckBox->isChecked()); + + if (QApplication::isEffectEnabled(Qt::UI_FadeMenu)) + ui->menuEffectCombo->setCurrentIndex(2); + else if (QApplication::isEffectEnabled(Qt::UI_AnimateMenu)) + ui->menuEffectCombo->setCurrentIndex(1); + + if (QApplication::isEffectEnabled(Qt::UI_AnimateCombo)) + ui->comboEffectCombo->setCurrentIndex(1); + + if (QApplication::isEffectEnabled(Qt::UI_FadeTooltip)) + ui->toolTipEffectCombo->setCurrentIndex(2); + else if (QApplication::isEffectEnabled(Qt::UI_AnimateTooltip)) + ui->toolTipEffectCombo->setCurrentIndex(1); + + if (QApplication::isEffectEnabled(Qt::UI_AnimateToolBox)) + ui->toolBoxEffectCombo->setCurrentIndex(1); + + QSize globalStrut = QApplication::globalStrut(); + ui->strutWidthSpinBox->setValue(globalStrut.width()); + ui->strutHeightSpinBox->setValue(globalStrut.height()); + + // find the default family + QStringList::Iterator sit = families.begin(); + int i = 0, possible = -1; + while (sit != families.end()) { + if (*sit == QApplication::font().family()) + break; + if ((*sit).contains(QApplication::font().family())) + possible = i; + + i++; + sit++; + } + if (sit == families.end()) + i = possible; + if (i == -1) // no clue about the current font + i = 0; + + ui->fontFamilyCombo->setCurrentIndex(i); + + QStringList styles = db.styles(ui->fontFamilyCombo->currentText()); + ui->fontStyleCombo->addItems(styles); + + QString stylestring = db.styleString(QApplication::font()); + sit = styles.begin(); + i = 0; + possible = -1; + while (sit != styles.end()) { + if (*sit == stylestring) + break; + if ((*sit).contains(stylestring)) + possible = i; + + i++; + sit++; + } + if (sit == styles.end()) + i = possible; + if (i == -1) // no clue about the current font + i = 0; + ui->fontStyleCombo->setCurrentIndex(i); + + i = 0; + for (int psize = QApplication::font().pointSize(); i < ui->pointSizeCombo->count(); ++i) { + const int sz = ui->pointSizeCombo->itemText(i).toInt(); + if (sz == psize) { + ui->pointSizeCombo->setCurrentIndex(i); + break; + } else if(sz > psize) { + ui->pointSizeCombo->insertItem(i, QString::number(psize)); + ui->pointSizeCombo->setCurrentIndex(i); + break; + } + } + + QStringList subs = QFont::substitutes(ui->familySubstitutionCombo->currentText()); + ui->substitutionsListBox->clear(); + ui->substitutionsListBox->insertItems(0, subs); + + ui->rtlExtensionsCheckBox->setChecked(settings.value(QLatin1String("useRtlExtensions"), false) + .toBool()); + +#ifdef Q_WS_X11 + QString settingsInputStyle = settings.value(QLatin1String("XIMInputStyle")).toString(); + if (!settingsInputStyle.isEmpty()) + ui->inputStyleCombo->setCurrentIndex(ui->inputStyleCombo->findText(settingsInputStyle)); +#else + ui->inputStyleCombo->hide(); + ui->inputStyleComboLabel->hide(); +#endif + +#if defined(Q_WS_X11) && !defined(QT_NO_XIM) + QStringList inputMethodCombo = QInputContextFactory::keys(); + int inputMethodComboIndex = -1; + QString defaultInputMethod = settings.value(QLatin1String("DefaultInputMethod"), QLatin1String("xim")).toString(); + for (int i = inputMethodCombo.size()-1; i >= 0; --i) { + const QString &im = inputMethodCombo.at(i); + if (im.contains(QLatin1String("imsw"))) { + inputMethodCombo.removeAt(i); + if (inputMethodComboIndex > i) + --inputMethodComboIndex; + } else if (im == defaultInputMethod) { + inputMethodComboIndex = i; + } + } + if (inputMethodComboIndex == -1 && !inputMethodCombo.isEmpty()) + inputMethodComboIndex = 0; + ui->inputMethodCombo->addItems(inputMethodCombo); + ui->inputMethodCombo->setCurrentIndex(inputMethodComboIndex); +#else + ui->inputMethodCombo->hide(); + ui->inputMethodComboLabel->hide(); +#endif + + ui->fontEmbeddingCheckBox->setChecked(settings.value(QLatin1String("embedFonts"), true) + .toBool()); + fontpaths = settings.value(QLatin1String("fontPath")).toStringList(); + ui->fontpathListBox->insertItems(0, fontpaths); + + ui->audiosinkCombo->addItem(tr("Auto (default)"), QLatin1String("Auto")); + ui->audiosinkCombo->setItemData(ui->audiosinkCombo->findText(tr("Auto (default)")), + tr("Choose audio output automatically."), Qt::ToolTipRole); + ui->audiosinkCombo->addItem(tr("aRts"), QLatin1String("artssink")); + ui->audiosinkCombo->setItemData(ui->audiosinkCombo->findText(tr("aRts")), + tr("Experimental aRts support for GStreamer."), + Qt::ToolTipRole); +#ifdef HAVE_PHONON + ui->phononVersionLabel->setText(QLatin1String(Phonon::phononVersion())); +#endif +#ifndef QT_NO_GSTREAMER + if (gst_init_check(0, 0, 0)) { + gchar *versionString = gst_version_string(); + ui->gstVersionLabel->setText(QLatin1String(versionString)); + g_free(versionString); + GList *factoryList = gst_registry_get_feature_list(gst_registry_get_default(), + GST_TYPE_ELEMENT_FACTORY); + QString name, klass, description; + for (GList *iter = g_list_first(factoryList) ; iter != NULL ; iter = g_list_next(iter)) { + GstPluginFeature *feature = GST_PLUGIN_FEATURE(iter->data); + klass = QLatin1String(gst_element_factory_get_klass(GST_ELEMENT_FACTORY(feature))); + if (klass == QLatin1String("Sink/Audio")) { + name = QLatin1String(GST_PLUGIN_FEATURE_NAME(feature)); + if (name == QLatin1String("sfsink")) + continue; // useless to output audio to file when you cannot set the file path + else if (name == QLatin1String("autoaudiosink")) + continue; //This is used implicitly from the auto setting + GstElement *sink = gst_element_factory_make (qPrintable(name), NULL); + if (sink) { + description = QLatin1String(gst_element_factory_get_description(GST_ELEMENT_FACTORY(feature))); + ui->audiosinkCombo->addItem(name, name); + ui->audiosinkCombo->setItemData(ui->audiosinkCombo->findText(name), description, + Qt::ToolTipRole); + gst_object_unref (sink); + } + } + } + g_list_free(factoryList); + } +#else + ui->phononTab->setEnabled(false); + ui->phononLabel->setText(tr("Phonon GStreamer backend not available.")); +#endif + + ui->videomodeCombo->addItem(tr("Auto (default)"), QLatin1String("Auto")); + ui->videomodeCombo->setItemData(ui->videomodeCombo->findText(tr("Auto (default)")), + tr("Choose render method automatically"), Qt::ToolTipRole); +#ifdef Q_WS_X11 + ui->videomodeCombo->addItem(tr("X11"), QLatin1String("X11")); + ui->videomodeCombo->setItemData(ui->videomodeCombo->findText(tr("X11")), + tr("Use X11 Overlays"), Qt::ToolTipRole); +#endif +#ifndef QT_NO_OPENGL + ui->videomodeCombo->addItem(tr("OpenGL"), QLatin1String("OpenGL")); + ui->videomodeCombo->setItemData(ui->videomodeCombo->findText(tr("OpenGL")), + tr("Use OpenGL if available"), Qt::ToolTipRole); +#endif + ui->videomodeCombo->addItem(tr("Software"), QLatin1String("Software")); + ui->videomodeCombo->setItemData(ui->videomodeCombo->findText(tr("Software")), + tr("Use simple software rendering"), Qt::ToolTipRole); + + QString audioSink = settings.value(QLatin1String("audiosink"), QLatin1String("Auto")).toString(); + QString videoMode = settings.value(QLatin1String("videomode"), QLatin1String("Auto")).toString(); + ui->audiosinkCombo->setCurrentIndex(ui->audiosinkCombo->findData(audioSink)); + ui->videomodeCombo->setCurrentIndex(ui->videomodeCombo->findData(videoMode)); + + settings.endGroup(); // Qt + + ui->helpView->setText(tr(appearance_text)); + + setModified(false); + updateStyleLayout(); +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +#ifdef Q_WS_X11 +extern void qt_x11_apply_settings_in_all_apps(); +#endif + +void MainWindow::fileSave() +{ + if (! modified) { + statusBar()->showMessage(tr("No changes to be saved."), 2000); + return; + } + + statusBar()->showMessage(tr("Saving changes...")); + + { + QSettings settings(QLatin1String("Trolltech")); + settings.beginGroup(QLatin1String("Qt")); + QFontDatabase db; + QFont font = db.font(ui->fontFamilyCombo->currentText(), + ui->fontStyleCombo->currentText(), + ui->pointSizeCombo->currentText().toInt()); + + QStringList actcg, inactcg, discg; + bool overrideDesktopSettings = (ui->guiStyleCombo->currentText() != desktopThemeName); + if (overrideDesktopSettings) { + int i; + for (i = 0; i < QPalette::NColorRoles; i++) + actcg << editPalette.color(QPalette::Active, + QPalette::ColorRole(i)).name(); + for (i = 0; i < QPalette::NColorRoles; i++) + inactcg << editPalette.color(QPalette::Inactive, + QPalette::ColorRole(i)).name(); + for (i = 0; i < QPalette::NColorRoles; i++) + discg << editPalette.color(QPalette::Disabled, + QPalette::ColorRole(i)).name(); + } + + settings.setValue(QLatin1String("font"), font.toString()); + settings.setValue(QLatin1String("Palette/active"), actcg); + settings.setValue(QLatin1String("Palette/inactive"), inactcg); + settings.setValue(QLatin1String("Palette/disabled"), discg); + + settings.setValue(QLatin1String("fontPath"), fontpaths); + settings.setValue(QLatin1String("embedFonts"), ui->fontEmbeddingCheckBox->isChecked()); + settings.setValue(QLatin1String("style"), + overrideDesktopSettings ? ui->guiStyleCombo->currentText() : QString()); + + settings.setValue(QLatin1String("doubleClickInterval"), ui->doubleClickIntervalSpinBox->value()); + settings.setValue(QLatin1String("cursorFlashTime"), + ui->cursorFlashTimeSpinBox->value() == 9 ? 0 : ui->cursorFlashTimeSpinBox->value()); + settings.setValue(QLatin1String("wheelScrollLines"), ui->wheelScrollLinesSpinBox->value()); + settings.setValue(QLatin1String("resolveSymlinks"), ui->resolveLinksCheckBox->isChecked()); + + QSize strut(ui->strutWidthSpinBox->value(), ui->strutHeightSpinBox->value()); + settings.setValue(QLatin1String("globalStrut/width"), strut.width()); + settings.setValue(QLatin1String("globalStrut/height"), strut.height()); + + settings.setValue(QLatin1String("useRtlExtensions"), ui->rtlExtensionsCheckBox->isChecked()); + +#ifdef Q_WS_X11 + QString style = ui->inputStyleCombo->currentText(); + QString str = QLatin1String("On The Spot"); + if (style == tr("Over The Spot")) + str = QLatin1String("Over The Spot"); + else if (style == tr("Off The Spot")) + str = QLatin1String("Off The Spot"); + else if (style == tr("Root")) + str = QLatin1String("Root"); + settings.setValue(QLatin1String("XIMInputStyle"), str); +#endif +#if defined(Q_WS_X11) && !defined(QT_NO_XIM) + settings.setValue(QLatin1String("DefaultInputMethod"), ui->inputMethodCombo->currentText()); +#endif + + QString audioSink = settings.value(QLatin1String("audiosink"), QLatin1String("Auto")).toString(); + QString videoMode = settings.value(QLatin1String("videomode"), QLatin1String("Auto")).toString(); + settings.setValue(QLatin1String("audiosink"), + ui->audiosinkCombo->itemData(ui->audiosinkCombo->currentIndex())); + settings.setValue(QLatin1String("videomode"), + ui->videomodeCombo->itemData(ui->videomodeCombo->currentIndex())); + + QStringList effects; + if (ui->effectsCheckBox->isChecked()) { + effects << QLatin1String("general"); + + switch (ui->menuEffectCombo->currentIndex()) { + case 1: effects << QLatin1String("animatemenu"); break; + case 2: effects << QLatin1String("fademenu"); break; + } + + switch (ui->comboEffectCombo->currentIndex()) { + case 1: effects << QLatin1String("animatecombo"); break; + } + + switch (ui->toolTipEffectCombo->currentIndex()) { + case 1: effects << QLatin1String("animatetooltip"); break; + case 2: effects << QLatin1String("fadetooltip"); break; + } + + switch (ui->toolBoxEffectCombo->currentIndex()) { + case 1: effects << QLatin1String("animatetoolbox"); break; + } + } else + effects << QLatin1String("none"); + settings.setValue(QLatin1String("GUIEffects"), effects); + + QStringList familysubs = QFont::substitutions(); + QStringList::Iterator fit = familysubs.begin(); + settings.beginGroup(QLatin1String("Font Substitutions")); + while (fit != familysubs.end()) { + QStringList subs = QFont::substitutes(*fit); + settings.setValue(*fit, subs); + fit++; + } + settings.endGroup(); // Font Substitutions + settings.endGroup(); // Qt + } + +#if defined(Q_WS_X11) + qt_x11_apply_settings_in_all_apps(); +#endif // Q_WS_X11 + + setModified(false); + statusBar()->showMessage(tr("Saved changes.")); +} + +void MainWindow::fileExit() +{ + qApp->closeAllWindows(); +} + +void MainWindow::setModified(bool m) +{ + if (modified == m) + return; + + modified = m; + ui->fileSaveAction->setEnabled(m); +} + +void MainWindow::buildPalette() +{ + QPalette temp(ui->buttonMainColor->color(), ui->buttonWindowColor->color()); + for (int i = 0; i < QPalette::NColorGroups; i++) + temp = PaletteEditorAdvanced::buildEffect(QPalette::ColorGroup(i), temp); + + editPalette = temp; + setPreviewPalette(editPalette); + updateColorButtons(); + + setModified(true); +} + +void MainWindow::setPreviewPalette(const QPalette &pal) +{ + QPalette::ColorGroup colorGroup = groupFromIndex(ui->paletteCombo->currentIndex()); + + for (int i = 0; i < QPalette::NColorGroups; i++) { + for (int j = 0; j < QPalette::NColorRoles; j++) { + QPalette::ColorGroup targetGroup = QPalette::ColorGroup(i); + QPalette::ColorRole targetRole = QPalette::ColorRole(j); + previewPalette.setColor(targetGroup, targetRole, pal.color(colorGroup, targetRole)); + } + } + + ui->previewFrame->setPreviewPalette(previewPalette); +} + +void MainWindow::updateColorButtons() +{ + ui->buttonMainColor->setColor(editPalette.color(QPalette::Active, QPalette::Button)); + ui->buttonWindowColor->setColor(editPalette.color(QPalette::Active, QPalette::Window)); +} + +void MainWindow::tunePalette() +{ + bool ok; + QPalette pal = PaletteEditorAdvanced::getPalette(&ok, editPalette, + backgroundRole(), this); + if (!ok) + return; + + editPalette = pal; + setPreviewPalette(editPalette); + setModified(true); +} + +void MainWindow::paletteSelected(int) +{ + setPreviewPalette(editPalette); +} + +void MainWindow::updateStyleLayout() +{ + QString currentStyle = ui->guiStyleCombo->currentText(); + bool autoStyle = (currentStyle == desktopThemeName); + ui->previewFrame->setPreviewVisible(!autoStyle); + ui->buildPaletteGroup->setEnabled(currentStyle.toLower() != QLatin1String("gtk") && !autoStyle); +} + +void MainWindow::styleSelected(const QString &stylename) +{ + QStyle *style = 0; + if (stylename == desktopThemeName) { + setModified(true); + } else { + style = QStyleFactory::create(stylename); + if (!style) + return; + setStyleHelper(ui->previewFrame, style); + delete previewstyle; + previewstyle = style; + setModified(true); + } + updateStyleLayout(); +} + +void MainWindow::familySelected(const QString &family) +{ + QFontDatabase db; + QStringList styles = db.styles(family); + ui->fontStyleCombo->clear(); + ui->fontStyleCombo->addItems(styles); + ui->familySubstitutionCombo->addItem(family); + buildFont(); +} + +void MainWindow::buildFont() +{ + QFontDatabase db; + QFont font = db.font(ui->fontFamilyCombo->currentText(), + ui->fontStyleCombo->currentText(), + ui->pointSizeCombo->currentText().toInt()); + ui->sampleLineEdit->setFont(font); + setModified(true); +} + +void MainWindow::substituteSelected(const QString &family) +{ + QStringList subs = QFont::substitutes(family); + ui->substitutionsListBox->clear(); + ui->substitutionsListBox->insertItems(0, subs); +} + +void MainWindow::removeSubstitute() +{ + if (!ui->substitutionsListBox->currentItem()) + return; + + int row = ui->substitutionsListBox->currentRow(); + QStringList subs = QFont::substitutes(ui->familySubstitutionCombo->currentText()); + subs.removeAt(ui->substitutionsListBox->currentRow()); + ui->substitutionsListBox->clear(); + ui->substitutionsListBox->insertItems(0, subs); + if (row > ui->substitutionsListBox->count()) + row = ui->substitutionsListBox->count() - 1; + ui->substitutionsListBox->setCurrentRow(row); + QFont::removeSubstitution(ui->familySubstitutionCombo->currentText()); + QFont::insertSubstitutions(ui->familySubstitutionCombo->currentText(), subs); + setModified(true); +} + +void MainWindow::addSubstitute() +{ + if (!ui->substitutionsListBox->currentItem()) { + QFont::insertSubstitution(ui->familySubstitutionCombo->currentText(), + ui->chooseSubstitutionCombo->currentText()); + QStringList subs = QFont::substitutes(ui->familySubstitutionCombo->currentText()); + ui->substitutionsListBox->clear(); + ui->substitutionsListBox->insertItems(0, subs); + setModified(true); + return; + } + + int row = ui->substitutionsListBox->currentRow(); + QFont::insertSubstitution(ui->familySubstitutionCombo->currentText(), ui->chooseSubstitutionCombo->currentText()); + QStringList subs = QFont::substitutes(ui->familySubstitutionCombo->currentText()); + ui->substitutionsListBox->clear(); + ui->substitutionsListBox->insertItems(0, subs); + ui->substitutionsListBox->setCurrentRow(row); + setModified(true); +} + +void MainWindow::downSubstitute() +{ + if (!ui->substitutionsListBox->currentItem() || ui->substitutionsListBox->currentRow() >= ui->substitutionsListBox->count()) + return; + + int row = ui->substitutionsListBox->currentRow(); + QStringList subs = QFont::substitutes(ui->familySubstitutionCombo->currentText()); + QString fam = subs.at(row); + subs.removeAt(row); + subs.insert(row + 1, fam); + ui->substitutionsListBox->clear(); + ui->substitutionsListBox->insertItems(0, subs); + ui->substitutionsListBox->setCurrentRow(row + 1); + QFont::removeSubstitution(ui->familySubstitutionCombo->currentText()); + QFont::insertSubstitutions(ui->familySubstitutionCombo->currentText(), subs); + setModified(true); +} + +void MainWindow::upSubstitute() +{ + if (!ui->substitutionsListBox->currentItem() || ui->substitutionsListBox->currentRow() < 1) + return; + + int row = ui->substitutionsListBox->currentRow(); + QStringList subs = QFont::substitutes(ui->familySubstitutionCombo->currentText()); + QString fam = subs.at(row); + subs.removeAt(row); + subs.insert(row-1, fam); + ui->substitutionsListBox->clear(); + ui->substitutionsListBox->insertItems(0, subs); + ui->substitutionsListBox->setCurrentRow(row - 1); + QFont::removeSubstitution(ui->familySubstitutionCombo->currentText()); + QFont::insertSubstitutions(ui->familySubstitutionCombo->currentText(), subs); + setModified(true); +} + +void MainWindow::removeFontpath() +{ + if (!ui->fontpathListBox->currentItem()) + return; + + int row = ui->fontpathListBox->currentRow(); + fontpaths.removeAt(row); + ui->fontpathListBox->clear(); + ui->fontpathListBox->insertItems(0, fontpaths); + if (row > ui->fontpathListBox->count()) + row = ui->fontpathListBox->count() - 1; + ui->fontpathListBox->setCurrentRow(row); + setModified(true); +} + +void MainWindow::addFontpath() +{ + if (ui->fontPathLineEdit->text().isEmpty()) + return; + + if (!ui->fontpathListBox->currentItem()) { + fontpaths.append(ui->fontPathLineEdit->text()); + ui->fontpathListBox->clear(); + ui->fontpathListBox->insertItems(0, fontpaths); + setModified(true); + + return; + } + + int row = ui->fontpathListBox->currentRow(); + fontpaths.insert(row + 1, ui->fontPathLineEdit->text()); + ui->fontpathListBox->clear(); + ui->fontpathListBox->insertItems(0, fontpaths); + ui->fontpathListBox->setCurrentRow(row); + setModified(true); +} + +void MainWindow::downFontpath() +{ + if (!ui->fontpathListBox->currentItem() + || ui->fontpathListBox->currentRow() >= (ui->fontpathListBox->count() - 1)) { + return; + } + + int row = ui->fontpathListBox->currentRow(); + QString fam = fontpaths.at(row); + fontpaths.removeAt(row); + fontpaths.insert(row + 1, fam); + ui->fontpathListBox->clear(); + ui->fontpathListBox->insertItems(0, fontpaths); + ui->fontpathListBox->setCurrentRow(row + 1); + setModified(true); +} + +void MainWindow::upFontpath() +{ + if (!ui->fontpathListBox->currentItem() || ui->fontpathListBox->currentRow() < 1) + return; + + int row = ui->fontpathListBox->currentRow(); + QString fam = fontpaths.at(row); + fontpaths.removeAt(row); + fontpaths.insert(row - 1, fam); + ui->fontpathListBox->clear(); + ui->fontpathListBox->insertItems(0, fontpaths); + ui->fontpathListBox->setCurrentRow(row - 1); + setModified(true); +} + +void MainWindow::browseFontpath() +{ + QString dirname = QFileDialog::getExistingDirectory(this, tr("Select a Directory")); + if (dirname.isNull()) + return; + + ui->fontPathLineEdit->setText(dirname); +} + +void MainWindow::somethingModified() +{ + setModified(true); +} + +void MainWindow::helpAbout() +{ + QMessageBox box(this); + box.setText(tr("<h3>%1</h3>" + "<br/>Version %2" + "<br/><br/>Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).") + .arg(tr("Qt Configuration")).arg(QLatin1String(QT_VERSION_STR))); + box.setWindowTitle(tr("Qt Configuration")); + box.setIcon(QMessageBox::NoIcon); + box.exec(); +} + +void MainWindow::helpAboutQt() +{ + QMessageBox::aboutQt(this, tr("Qt Configuration")); +} + +void MainWindow::pageChanged(int pageNumber) +{ + QWidget *page = ui->mainTabWidget->widget(pageNumber); + if (page == ui->interfaceTab) + ui->helpView->setText(tr(interface_text)); + else if (page == ui->appearanceTab) + ui->helpView->setText(tr(appearance_text)); + else if (page == ui->fontsTab) + ui->helpView->setText(tr(font_text)); + else if (page == ui->printerTab) + ui->helpView->setText(tr(printer_text)); + else if (page == ui->phononTab) + ui->helpView->setText(tr(phonon_text)); +} + +void MainWindow::closeEvent(QCloseEvent *e) +{ + if (modified) { + switch (QMessageBox::warning(this, tr("Save Changes"), + tr("Save changes to settings?"), + (QMessageBox::Yes | QMessageBox::No + | QMessageBox::Cancel))) { + case QMessageBox::Yes: // save + qApp->processEvents(); + fileSave(); + + // fall through intended + case QMessageBox::No: // don't save + e->accept(); + break; + + case QMessageBox::Cancel: // cancel + e->ignore(); + break; + + default: break; + } + } else + e->accept(); +} + +QT_END_NAMESPACE |