source: trunk/tools/qtconfig/mainwindow.cpp@ 552

Last change on this file since 552 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 35.0 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information ([email protected])
5**
6** This file is part of the tools applications of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you are unsure which license is appropriate for your use, please
37** contact the sales department at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "mainwindow.h"
43#include "colorbutton.h"
44#include "previewframe.h"
45#include "paletteeditoradvanced.h"
46
47#include <QLabel>
48#include <QApplication>
49#include <QComboBox>
50#include <QStyleFactory>
51#include <QFontDatabase>
52#include <QLineEdit>
53#include <QSpinBox>
54#include <QCheckBox>
55#include <QFileDialog>
56#include <QAction>
57#include <QStatusBar>
58#include <QSettings>
59#include <QMessageBox>
60#include <QStyle>
61#include <QtEvents>
62#include <Q3ValueList>
63#include <QInputContext>
64#include <QInputContextFactory>
65#include <QtDebug>
66
67#include <stdlib.h>
68
69#ifndef QT_NO_GSTREAMER
70#include <gst/gst.h>
71#include <phonon/phononnamespace.h>
72#endif
73
74#include <QtGui/private/qt_x11_p.h>
75
76QT_BEGIN_NAMESPACE
77
78// from qapplication.cpp and qapplication_x11.cpp - These are NOT for
79// external use ignore them
80// extern bool Q_CORE_EXPORT qt_resolve_symlinks;
81
82static const char *appearance_text =
83"<p><b><font size+=2>Appearance</font></b></p>"
84"<hr>"
85"<p>Use this tab to customize the appearance of your Qt applications.</p>"
86"<p>You can select the default GUI Style from the drop down list and "
87"customize the colors.</p>"
88"<p>Any GUI Style plugins in your plugin path will automatically be added "
89"to the list of built-in Qt styles. (See the Library Paths tab for "
90"information on adding new plugin paths.)</p>"
91"<p>When you choose 3-D Effects and Window Background colors, the Qt "
92"Configuration program will automatically generate a palette for you. "
93"To customize colors further, press the Tune Palette button to open "
94"the advanced palette editor."
95"<p>The Preview Window shows what the selected Style and colors look "
96"like.";
97
98static const char *font_text =
99"<p><b><font size+=2>Fonts</font></b></p>"
100"<hr>"
101"<p>Use this tab to select the default font for your Qt applications. "
102"The selected font is shown (initially as 'Sample Text') in the line "
103"edit below the Family, "
104"Style and Point Size drop down lists.</p>"
105"<p>Qt has a powerful font substitution feature that allows you to "
106"specify a list of substitute fonts. Substitute fonts are used "
107"when a font cannot be loaded, or if the specified font doesn't have "
108"a particular character."
109"<p>For example, if you select the font Lucida, which doesn't have Korean "
110"characters, but need to show some Korean text using the Mincho font family "
111"you can do so by adding Mincho to the list. Once Mincho is added, any "
112"Korean characters that are not found in the Lucida font will be taken "
113"from the Mincho font. Because the font substitutions are "
114"lists, you can also select multiple families, such as Song Ti (for "
115"use with Chinese text).";
116
117static const char *interface_text =
118"<p><b><font size+=2>Interface</font></b></p>"
119"<hr>"
120"<p>Use this tab to customize the feel of your Qt applications.</p>"
121"<p>If the Resolve Symlinks checkbox is checked Qt will follow symlinks "
122"when handling URLs. For example, in the file dialog, if this setting is turned "
123"on and /usr/tmp is a symlink to /var/tmp, entering the /usr/tmp directory "
124"will cause the file dialog to change to /var/tmp. With this setting turned "
125"off, symlinks are not resolved or followed.</p>"
126"<p>The Global Strut setting is useful for people who require a "
127"minimum size for all widgets (e.g. when using a touch panel or for users "
128"who are visually impaired). Leaving the Global Strut width and height "
129"at 0 will disable the Global Strut feature</p>"
130"<p>XIM (Extended Input Methods) are used for entering characters in "
131"languages that have large character sets, for example, Chinese and "
132"Japanese.";
133// ### What does the 'Enhanced support for languages written R2L do?
134
135static const char *printer_text =
136"<p><b><font size+=2>Printer</font></b></p>"
137"<hr>"
138"<p>Use this tab to configure the way Qt generates output for the printer."
139"You can specify if Qt should try to embed fonts into its generated output."
140"If you enable font embedding, the resulting postscript will be more "
141"portable and will more accurately reflect the "
142"visual output on the screen; however the resulting postscript file "
143"size will be bigger."
144"<p>When using font embedding you can select additional directories where "
145"Qt should search for embeddable font files. By default, the X "
146"server font path is used.";
147
148static const char *phonon_text =
149"<p><b><font size+=2>Phonon</font></b></p>"
150"<hr>"
151"<p>Use this tab to configure the Phonon GStreamer multimedia backend. "
152"<p>It is reccommended to leave all settings on \"Auto\" to let "
153"Phonon determine your settings automatically.";
154
155static QColorGroup::ColorRole centralFromItem( int item )
156{
157 switch( item ) {
158 case 0: return QColorGroup::Window;
159 case 1: return QColorGroup::WindowText;
160 case 2: return QColorGroup::Button;
161 case 3: return QColorGroup::Base;
162 case 4: return QColorGroup::Text;
163 case 5: return QColorGroup::BrightText;
164 case 6: return QColorGroup::ButtonText;
165 case 7: return QColorGroup::Highlight;
166 case 8: return QColorGroup::HighlightedText;
167 default: return QColorGroup::NColorRoles;
168 }
169}
170
171
172static QColorGroup::ColorRole effectFromItem( int item )
173{
174 switch( item ) {
175 case 0: return QColorGroup::Light;
176 case 1: return QColorGroup::Midlight;
177 case 2: return QColorGroup::Mid;
178 case 3: return QColorGroup::Dark;
179 case 4: return QColorGroup::Shadow;
180 default: return QColorGroup::NColorRoles;
181 }
182}
183
184
185static void setStyleHelper(QWidget *w, QStyle *s)
186{
187 const QObjectList children = w->children();
188 for (int i = 0; i < children.size(); ++i) {
189 QObject *child = children.at(i);
190 if (child->isWidgetType())
191 setStyleHelper((QWidget *) child, s);
192 }
193 w->setStyle(s);
194}
195
196
197MainWindow::MainWindow()
198 : MainWindowBase(0, "main window"),
199 editPalette(palette()), previewPalette(palette()), previewstyle(0)
200{
201 modified = true;
202 desktopThemeName = tr("Desktop Settings (Default)");
203 QStringList gstyles = QStyleFactory::keys();
204 gstyles.sort();
205 gstylecombo->addItem(desktopThemeName);
206 gstylecombo->setItemData(gstylecombo->findText(desktopThemeName),
207 tr("Choose style and palette based on your desktop settings."), Qt::ToolTipRole);
208 gstylecombo->insertStringList(gstyles);
209
210 QSettings settings(QLatin1String("Trolltech"));
211 settings.beginGroup(QLatin1String("Qt"));
212
213 QString currentstyle = settings.value(QLatin1String("style")).toString();
214 if (currentstyle.isEmpty()) {
215 gstylecombo->setCurrentItem(gstylecombo->findText(desktopThemeName));
216 currentstyle = QLatin1String(QApplication::style()->name());
217 } else {
218 int index = gstylecombo->findText(currentstyle, Qt::MatchFixedString);
219 if (index != -1) {
220 gstylecombo->setCurrentItem(index);
221 } else { // we give up
222 gstylecombo->insertItem(QLatin1String("Unknown"));
223 gstylecombo->setCurrentItem(gstylecombo->count() - 1);
224 }
225 }
226 buttonMainColor->setColor(palette().color(QPalette::Active,
227 QColorGroup::Button));
228 buttonMainColor2->setColor(palette().color(QPalette::Active,
229 QColorGroup::Window));
230 connect(buttonMainColor, SIGNAL(colorChanged(QColor)),
231 this, SLOT(buildPalette()));
232 connect(buttonMainColor2, SIGNAL(colorChanged(QColor)),
233 this, SLOT(buildPalette()));
234
235 if (X11->desktopEnvironment == DE_KDE)
236 colorConfig->hide();
237 else
238 labelKDENote->hide();
239
240 QFontDatabase db;
241 QStringList families = db.families();
242 familycombo->insertStringList(families);
243
244 QStringList fs = families;
245 QStringList fs2 = QFont::substitutions();
246 QStringList::Iterator fsit = fs2.begin();
247 while (fsit != fs2.end()) {
248 if (! fs.contains(*fsit))
249 fs += *fsit;
250 fsit++;
251 }
252 fs.sort();
253 familysubcombo->insertStringList(fs);
254
255 choosesubcombo->insertStringList(families);
256 Q3ValueList<int> sizes = db.standardSizes();
257 Q3ValueList<int>::Iterator it = sizes.begin();
258 while (it != sizes.end())
259 psizecombo->insertItem(QString::number(*it++));
260
261 dcispin->setValue(QApplication::doubleClickInterval());
262 cfispin->setValue(QApplication::cursorFlashTime());
263 wslspin->setValue(QApplication::wheelScrollLines());
264 // #############
265// resolvelinks->setChecked(qt_resolve_symlinks);
266
267 effectcheckbox->setChecked(QApplication::isEffectEnabled(Qt::UI_General));
268 effectbase->setEnabled(effectcheckbox->isChecked());
269
270 if (QApplication::isEffectEnabled(Qt::UI_FadeMenu))
271 menueffect->setCurrentItem(2);
272 else if (QApplication::isEffectEnabled(Qt::UI_AnimateMenu))
273 menueffect->setCurrentItem(1);
274
275 if (QApplication::isEffectEnabled(Qt::UI_AnimateCombo))
276 comboeffect->setCurrentItem(1);
277
278 if (QApplication::isEffectEnabled(Qt::UI_FadeTooltip))
279 tooltipeffect->setCurrentItem(2);
280 else if (QApplication::isEffectEnabled(Qt::UI_AnimateTooltip))
281 tooltipeffect->setCurrentItem(1);
282
283 if ( QApplication::isEffectEnabled( Qt::UI_AnimateToolBox ) )
284 toolboxeffect->setCurrentItem( 1 );
285
286 QSize globalStrut = QApplication::globalStrut();
287 strutwidth->setValue(globalStrut.width());
288 strutheight->setValue(globalStrut.height());
289
290 // find the default family
291 QStringList::Iterator sit = families.begin();
292 int i = 0, possible = -1;
293 while (sit != families.end()) {
294 if (*sit == QApplication::font().family())
295 break;
296 if ((*sit).contains(QApplication::font().family()))
297 possible = i;
298
299 i++;
300 sit++;
301 }
302 if (sit == families.end())
303 i = possible;
304 if (i == -1) // no clue about the current font
305 i = 0;
306
307 familycombo->setCurrentItem(i);
308
309 QStringList styles = db.styles(familycombo->currentText());
310 stylecombo->insertStringList(styles);
311
312 QString stylestring = db.styleString(QApplication::font());
313 sit = styles.begin();
314 i = 0;
315 possible = -1;
316 while (sit != styles.end()) {
317 if (*sit == stylestring)
318 break;
319 if ((*sit).contains(stylestring))
320 possible = i;
321
322 i++;
323 sit++;
324 }
325 if (sit == styles.end())
326 i = possible;
327 if (i == -1) // no clue about the current font
328 i = 0;
329 stylecombo->setCurrentItem(i);
330
331 i = 0;
332 for (int psize = QApplication::font().pointSize(); i < psizecombo->count(); ++i) {
333 const int sz = psizecombo->text(i).toInt();
334 if (sz == psize) {
335 psizecombo->setCurrentItem(i);
336 break;
337 } else if(sz > psize) {
338 psizecombo->insertItem(i, QString::number(psize));
339 psizecombo->setCurrentItem(i);
340 break;
341 }
342 }
343
344 QStringList subs = QFont::substitutes(familysubcombo->currentText());
345 sublistbox->clear();
346 sublistbox->insertStringList(subs);
347
348 rtlExtensions->setChecked(settings.value(QLatin1String("useRtlExtensions"), false).toBool());
349
350#ifdef Q_WS_X11
351 inputStyle->setCurrentText(settings.value(QLatin1String("XIMInputStyle"), trUtf8("On The Spot")).toString());
352#else
353 inputStyle->hide();
354 inputStyleLabel->hide();
355#endif
356
357#if defined(Q_WS_X11) && !defined(QT_NO_XIM)
358 QStringList inputMethods = QInputContextFactory::keys();
359 int inputMethodIndex = -1;
360 QString defaultInputMethod = settings.value(QLatin1String("DefaultInputMethod"), QLatin1String("xim")).toString();
361 for (int i = inputMethods.size()-1; i >= 0; --i) {
362 const QString &im = inputMethods.at(i);
363 if (im.contains(QLatin1String("imsw"))) {
364 inputMethods.removeAt(i);
365 if (inputMethodIndex > i)
366 --inputMethodIndex;
367 } else if (im == defaultInputMethod) {
368 inputMethodIndex = i;
369 }
370 }
371 if (inputMethodIndex == -1 && !inputMethods.isEmpty())
372 inputMethodIndex = 0;
373 inputMethod->addItems(inputMethods);
374 inputMethod->setCurrentIndex(inputMethodIndex);
375#else
376 inputMethod->hide();
377 inputMethodLabel->hide();
378#endif
379
380 fontembeddingcheckbox->setChecked(settings.value(QLatin1String("embedFonts"), true).toBool());
381 fontpaths = settings.value(QLatin1String("fontPath")).toStringList();
382 fontpathlistbox->insertStringList(fontpaths);
383
384 audiosinkCombo->addItem(tr("Auto (default)"), QLatin1String("Auto"));
385 audiosinkCombo->setItemData(audiosinkCombo->findText(tr("Auto (default)")),
386 tr("Choose audio output automatically."), Qt::ToolTipRole);
387 audiosinkCombo->addItem(tr("aRts"), QLatin1String("artssink"));
388 audiosinkCombo->setItemData(audiosinkCombo->findText(tr("aRts")),
389 tr("Experimental aRts support for GStreamer."), Qt::ToolTipRole);
390#ifndef QT_NO_GSTREAMER
391 phononVersionLabel->setText(QLatin1String(Phonon::phononVersion()));
392 if (gst_init_check(0, 0, 0)) {
393 gchar *versionString = gst_version_string();
394 gstversionLabel->setText(QLatin1String(versionString));
395 g_free(versionString);
396 GList* factoryList = gst_registry_get_feature_list(gst_registry_get_default (), GST_TYPE_ELEMENT_FACTORY);
397 QString name, klass, description;
398 for (GList* iter = g_list_first(factoryList) ; iter != NULL ; iter = g_list_next(iter)) {
399 GstPluginFeature *feature = GST_PLUGIN_FEATURE(iter->data);
400 klass = QLatin1String(gst_element_factory_get_klass(GST_ELEMENT_FACTORY(feature)));
401 if (klass == QLatin1String("Sink/Audio")) {
402 name = QLatin1String(GST_PLUGIN_FEATURE_NAME(feature));
403 if (name == QLatin1String("sfsink"))
404 continue; //useless to output audio to file when you cannot set the file path
405 else if (name == QLatin1String("autoaudiosink"))
406 continue; //This is used implicitly from the auto setting
407 GstElement *sink = gst_element_factory_make (qPrintable(name), NULL);
408 if (sink) {
409 description = QLatin1String(gst_element_factory_get_description (GST_ELEMENT_FACTORY(feature)));
410 audiosinkCombo->addItem(name, name);
411 audiosinkCombo->setItemData(audiosinkCombo->findText(name), description, Qt::ToolTipRole);
412 gst_object_unref (sink);
413 }
414 }
415 }
416 g_list_free(factoryList);
417 }
418#else
419 tab4->setEnabled(false);
420 phononLabel->setText(tr("Phonon GStreamer backend not available."));
421#endif
422
423 videomodeCombo->addItem(tr("Auto (default)"), QLatin1String("Auto"));
424 videomodeCombo->setItemData(videomodeCombo->findText(tr("Auto (default)")), tr("Choose render method automatically"), Qt::ToolTipRole);
425#ifdef Q_WS_X11
426 videomodeCombo->addItem(tr("X11"), QLatin1String("X11"));
427 videomodeCombo->setItemData(videomodeCombo->findText(tr("X11")), tr("Use X11 Overlays"), Qt::ToolTipRole);
428#endif
429#ifndef QT_NO_OPENGL
430 videomodeCombo->addItem(tr("OpenGL"), QLatin1String("OpenGL"));
431 videomodeCombo->setItemData(videomodeCombo->findText(tr("OpenGL")), tr("Use OpenGL if avaiable"), Qt::ToolTipRole);
432#endif
433 videomodeCombo->addItem(tr("Software"), QLatin1String("Software"));
434 videomodeCombo->setItemData(videomodeCombo->findText(tr("Software")), tr("Use simple software rendering"), Qt::ToolTipRole);
435
436 QString audioSink = settings.value(QLatin1String("audiosink"), QLatin1String("Auto")).toString();
437 QString videoMode = settings.value(QLatin1String("videomode"), QLatin1String("Auto")).toString();
438 audiosinkCombo->setCurrentItem(audiosinkCombo->findData(audioSink));
439 videomodeCombo->setCurrentItem(videomodeCombo->findData(videoMode));
440
441 settings.endGroup(); // Qt
442
443 helpview->setText(tr(appearance_text));
444
445 setModified(false);
446 updateStyleLayout();
447}
448
449
450MainWindow::~MainWindow()
451{
452}
453
454#ifdef Q_WS_X11
455extern void qt_x11_apply_settings_in_all_apps();
456#endif
457
458void MainWindow::fileSave()
459{
460 if (! modified) {
461 statusBar()->showMessage(tr("No changes to be saved."), 2000);
462 return;
463 }
464
465 statusBar()->showMessage(tr("Saving changes..."));
466
467 {
468 QSettings settings(QLatin1String("Trolltech"));
469 settings.beginGroup(QLatin1String("Qt"));
470 QFontDatabase db;
471 QFont font = db.font(familycombo->currentText(),
472 stylecombo->currentText(),
473 psizecombo->currentText().toInt());
474
475 QStringList actcg, inactcg, discg;
476 bool overrideDesktopSettings = (gstylecombo->currentText() != desktopThemeName);
477 if (overrideDesktopSettings) {
478 int i;
479 for (i = 0; i < QColorGroup::NColorRoles; i++)
480 actcg << editPalette.color(QPalette::Active,
481 (QColorGroup::ColorRole) i).name();
482 for (i = 0; i < QColorGroup::NColorRoles; i++)
483 inactcg << editPalette.color(QPalette::Inactive,
484 (QColorGroup::ColorRole) i).name();
485 for (i = 0; i < QColorGroup::NColorRoles; i++)
486 discg << editPalette.color(QPalette::Disabled,
487 (QColorGroup::ColorRole) i).name();
488 }
489
490 settings.setValue(QLatin1String("font"), font.toString());
491 settings.setValue(QLatin1String("Palette/active"), actcg);
492 settings.setValue(QLatin1String("Palette/inactive"), inactcg);
493 settings.setValue(QLatin1String("Palette/disabled"), discg);
494
495 settings.setValue(QLatin1String("fontPath"), fontpaths);
496 settings.setValue(QLatin1String("embedFonts"), fontembeddingcheckbox->isChecked());
497 settings.setValue(QLatin1String("style"), overrideDesktopSettings ? gstylecombo->currentText() : QString());
498
499 settings.setValue(QLatin1String("doubleClickInterval"), dcispin->value());
500 settings.setValue(QLatin1String("cursorFlashTime"), cfispin->value() == 9 ? 0 : cfispin->value() );
501 settings.setValue(QLatin1String("wheelScrollLines"), wslspin->value());
502 settings.setValue(QLatin1String("resolveSymlinks"), resolvelinks->isChecked());
503
504 QSize strut(strutwidth->value(), strutheight->value());
505 settings.setValue(QLatin1String("globalStrut/width"), strut.width());
506 settings.setValue(QLatin1String("globalStrut/height"), strut.height());
507
508 settings.setValue(QLatin1String("useRtlExtensions"), rtlExtensions->isChecked());
509
510#ifdef Q_WS_X11
511 QString style = inputStyle->currentText();
512 QString str = QLatin1String("On The Spot");
513 if ( style == trUtf8( "Over The Spot" ) )
514 str = QLatin1String("Over The Spot");
515 else if ( style == trUtf8( "Off The Spot" ) )
516 str = QLatin1String("Off The Spot");
517 else if ( style == trUtf8( "Root" ) )
518 str = QLatin1String("Root");
519 settings.setValue( QLatin1String("XIMInputStyle"), str );
520#endif
521#if defined(Q_WS_X11) && !defined(QT_NO_XIM)
522 settings.setValue(QLatin1String("DefaultInputMethod"), inputMethod->currentText());
523#endif
524
525 QString audioSink = settings.value(QLatin1String("audiosink"), QLatin1String("Auto")).toString();
526 QString videoMode = settings.value(QLatin1String("videomode"), QLatin1String("Auto")).toString();
527 settings.setValue(QLatin1String("audiosink"), audiosinkCombo->itemData(audiosinkCombo->currentIndex()));
528 settings.setValue(QLatin1String("videomode"), videomodeCombo->itemData(videomodeCombo->currentIndex()));
529
530 QStringList effects;
531 if (effectcheckbox->isChecked()) {
532 effects << QLatin1String("general");
533
534 switch (menueffect->currentItem()) {
535 case 1: effects << QLatin1String("animatemenu"); break;
536 case 2: effects << QLatin1String("fademenu"); break;
537 }
538
539 switch (comboeffect->currentItem()) {
540 case 1: effects << QLatin1String("animatecombo"); break;
541 }
542
543 switch (tooltipeffect->currentItem()) {
544 case 1: effects << QLatin1String("animatetooltip"); break;
545 case 2: effects << QLatin1String("fadetooltip"); break;
546 }
547
548 switch ( toolboxeffect->currentItem() ) {
549 case 1: effects << QLatin1String("animatetoolbox"); break;
550 }
551 } else
552 effects << QLatin1String("none");
553 settings.setValue(QLatin1String("GUIEffects"), effects);
554
555 QStringList familysubs = QFont::substitutions();
556 QStringList::Iterator fit = familysubs.begin();
557 settings.beginGroup(QLatin1String("Font Substitutions"));
558 while (fit != familysubs.end()) {
559 QStringList subs = QFont::substitutes(*fit);
560 settings.setValue(*fit, subs);
561 fit++;
562 }
563 settings.endGroup(); // Font Substitutions
564 settings.endGroup(); // Qt
565 }
566
567#if defined(Q_WS_X11)
568 qt_x11_apply_settings_in_all_apps();
569#endif // Q_WS_X11
570
571 setModified(false);
572 statusBar()->showMessage(QLatin1String("Saved changes."));
573}
574
575
576void MainWindow::fileExit()
577{
578 qApp->closeAllWindows();
579}
580
581
582void MainWindow::setModified(bool m)
583{
584 if (modified == m)
585 return;
586
587 modified = m;
588 fileSaveAction->setEnabled(m);
589}
590
591
592void MainWindow::buildPalette()
593{
594 int i;
595 QColorGroup cg;
596 QColor btn = buttonMainColor->color();
597 QColor back = buttonMainColor2->color();
598 QPalette automake( btn, back );
599
600 for (i = 0; i<9; i++)
601 cg.setColor( centralFromItem(i), automake.active().color( centralFromItem(i) ) );
602
603 editPalette.setActive( cg );
604 buildActiveEffect();
605
606 cg = editPalette.inactive();
607
608 QPalette temp( editPalette.active().color( QColorGroup::Button ),
609 editPalette.active().color( QColorGroup::Window ) );
610
611 for (i = 0; i<9; i++)
612 cg.setColor( centralFromItem(i), temp.inactive().color( centralFromItem(i) ) );
613
614 editPalette.setInactive( cg );
615 buildInactiveEffect();
616
617 cg = editPalette.disabled();
618
619 for (i = 0; i<9; i++)
620 cg.setColor( centralFromItem(i), temp.disabled().color( centralFromItem(i) ) );
621
622 editPalette.setDisabled( cg );
623 buildDisabledEffect();
624
625 updateColorButtons();
626
627 setModified(true);
628}
629
630
631void MainWindow::buildActiveEffect()
632{
633 QColorGroup cg = editPalette.active();
634 QColor btn = cg.color( QColorGroup::Button );
635
636 QPalette temp( btn, btn );
637
638 for (int i = 0; i<5; i++)
639 cg.setColor( effectFromItem(i), temp.active().color( effectFromItem(i) ) );
640
641 editPalette.setActive( cg );
642 setPreviewPalette( editPalette );
643
644 updateColorButtons();
645}
646
647
648void MainWindow::buildInactive()
649{
650 editPalette.setInactive( editPalette.active() );
651 buildInactiveEffect();
652}
653
654
655void MainWindow::buildInactiveEffect()
656{
657 QColorGroup cg = editPalette.inactive();
658
659 QColor light, midlight, mid, dark, shadow;
660 QColor btn = cg.color( QColorGroup::Button );
661
662 light = btn.light(150);
663 midlight = btn.light(115);
664 mid = btn.dark(150);
665 dark = btn.dark();
666 shadow = Qt::black;
667
668 cg.setColor( QColorGroup::Light, light );
669 cg.setColor( QColorGroup::Midlight, midlight );
670 cg.setColor( QColorGroup::Mid, mid );
671 cg.setColor( QColorGroup::Dark, dark );
672 cg.setColor( QColorGroup::Shadow, shadow );
673
674 editPalette.setInactive( cg );
675 setPreviewPalette( editPalette );
676 updateColorButtons();
677}
678
679
680void MainWindow::buildDisabled()
681{
682 QColorGroup cg = editPalette.active();
683 cg.setColor( QColorGroup::ButtonText, Qt::darkGray );
684 cg.setColor( QColorGroup::WindowText, Qt::darkGray );
685 cg.setColor( QColorGroup::Text, Qt::darkGray );
686 cg.setColor( QColorGroup::HighlightedText, Qt::darkGray );
687 editPalette.setDisabled( cg );
688
689 buildDisabledEffect();
690}
691
692
693void MainWindow::buildDisabledEffect()
694{
695 QColorGroup cg = editPalette.disabled();
696
697 QColor light, midlight, mid, dark, shadow;
698 QColor btn = cg.color( QColorGroup::Button );
699
700 light = btn.light(150);
701 midlight = btn.light(115);
702 mid = btn.dark(150);
703 dark = btn.dark();
704 shadow = Qt::black;
705
706 cg.setColor( QColorGroup::Light, light );
707 cg.setColor( QColorGroup::Midlight, midlight );
708 cg.setColor( QColorGroup::Mid, mid );
709 cg.setColor( QColorGroup::Dark, dark );
710 cg.setColor( QColorGroup::Shadow, shadow );
711
712 editPalette.setDisabled( cg );
713 setPreviewPalette( editPalette );
714 updateColorButtons();
715}
716
717
718void MainWindow::setPreviewPalette( const QPalette& pal )
719{
720 QColorGroup cg;
721
722 switch (paletteCombo->currentItem()) {
723 case 0:
724 default:
725 cg = pal.active();
726 break;
727 case 1:
728 cg = pal.inactive();
729 break;
730 case 2:
731 cg = pal.disabled();
732 break;
733 }
734 previewPalette.setActive( cg );
735 previewPalette.setInactive( cg );
736 previewPalette.setDisabled( cg );
737
738 previewFrame->setPreviewPalette(previewPalette);
739}
740
741
742void MainWindow::updateColorButtons()
743{
744 buttonMainColor->setColor( editPalette.active().color( QColorGroup::Button ));
745 buttonMainColor2->setColor( editPalette.active().color( QColorGroup::Window ));
746}
747
748
749void MainWindow::tunePalette()
750{
751 bool ok;
752 QPalette pal = PaletteEditorAdvanced::getPalette(&ok, editPalette,
753 backgroundMode(), this);
754 if (! ok)
755 return;
756
757 editPalette = pal;
758 setPreviewPalette(editPalette);
759 setModified(true);
760}
761
762
763void MainWindow::paletteSelected(int)
764{
765 setPreviewPalette(editPalette);
766}
767
768void MainWindow::updateStyleLayout()
769{
770 QString currentStyle = gstylecombo->currentText();
771 bool autoStyle = (currentStyle == desktopThemeName);
772 previewFrame->setPreviewVisible(!autoStyle);
773 groupAutoPalette->setEnabled(currentStyle.toLower() != QLatin1String("gtk") && !autoStyle);
774}
775
776void MainWindow::styleSelected(const QString &stylename)
777{
778 QStyle *style = 0;
779 if (stylename == desktopThemeName) {
780 setModified(true);
781 } else {
782 style = QStyleFactory::create(stylename);
783 if (!style)
784 return;
785 setStyleHelper(previewFrame, style);
786 delete previewstyle;
787 previewstyle = style;
788 setModified(true);
789 }
790 updateStyleLayout();
791}
792
793
794void MainWindow::familySelected(const QString &family)
795{
796 QFontDatabase db;
797 QStringList styles = db.styles(family);
798 stylecombo->clear();
799 stylecombo->insertStringList(styles);
800 familysubcombo->insertItem(family);
801 buildFont();
802}
803
804
805void MainWindow::buildFont()
806{
807 QFontDatabase db;
808 QFont font = db.font(familycombo->currentText(),
809 stylecombo->currentText(),
810 psizecombo->currentText().toInt());
811 samplelineedit->setFont(font);
812 setModified(true);
813}
814
815
816void MainWindow::substituteSelected(const QString &family)
817{
818 QStringList subs = QFont::substitutes(family);
819 sublistbox->clear();
820 sublistbox->insertStringList(subs);
821}
822
823
824void MainWindow::removeSubstitute()
825{
826 if (sublistbox->currentItem() < 0 ||
827 uint(sublistbox->currentItem()) > sublistbox->count())
828 return;
829
830 int item = sublistbox->currentItem();
831 QStringList subs = QFont::substitutes(familysubcombo->currentText());
832 subs.remove(subs.at(sublistbox->currentItem()));
833 sublistbox->clear();
834 sublistbox->insertStringList(subs);
835 if (uint(item) > sublistbox->count())
836 item = int(sublistbox->count()) - 1;
837 sublistbox->setCurrentItem(item);
838 QFont::removeSubstitution(familysubcombo->currentText());
839 QFont::insertSubstitutions(familysubcombo->currentText(), subs);
840 setModified(true);
841}
842
843
844void MainWindow::addSubstitute()
845{
846 if (sublistbox->currentItem() < 0 ||
847 uint(sublistbox->currentItem()) > sublistbox->count()) {
848 QFont::insertSubstitution(familysubcombo->currentText(), choosesubcombo->currentText());
849 QStringList subs = QFont::substitutes(familysubcombo->currentText());
850 sublistbox->clear();
851 sublistbox->insertStringList(subs);
852 setModified(true);
853 return;
854 }
855
856 int item = sublistbox->currentItem();
857 QFont::insertSubstitution(familysubcombo->currentText(), choosesubcombo->currentText());
858 QStringList subs = QFont::substitutes(familysubcombo->currentText());
859 sublistbox->clear();
860 sublistbox->insertStringList(subs);
861 sublistbox->setCurrentItem(item);
862 setModified(true);
863}
864
865
866void MainWindow::downSubstitute()
867{
868 if (sublistbox->currentItem() < 0 ||
869 uint(sublistbox->currentItem()) >= sublistbox->count())
870 return;
871
872 int item = sublistbox->currentItem();
873 QStringList subs = QFont::substitutes(familysubcombo->currentText());
874 QString fam = subs.at(item);
875 subs.removeAt(item);
876 subs.insert(item+1, fam);
877 sublistbox->clear();
878 sublistbox->insertStringList(subs);
879 sublistbox->setCurrentItem(item + 1);
880 QFont::removeSubstitution(familysubcombo->currentText());
881 QFont::insertSubstitutions(familysubcombo->currentText(), subs);
882 setModified(true);
883}
884
885
886void MainWindow::upSubstitute()
887{
888 if (sublistbox->currentItem() < 1)
889 return;
890
891 int item = sublistbox->currentItem();
892 QStringList subs = QFont::substitutes(familysubcombo->currentText());
893 QString fam = subs.at(item);
894 subs.removeAt(item);
895 subs.insert(item-1, fam);
896 sublistbox->clear();
897 sublistbox->insertStringList(subs);
898 sublistbox->setCurrentItem(item - 1);
899 QFont::removeSubstitution(familysubcombo->currentText());
900 QFont::insertSubstitutions(familysubcombo->currentText(), subs);
901 setModified(true);
902}
903
904
905void MainWindow::removeFontpath()
906{
907 if (fontpathlistbox->currentItem() < 0 ||
908 uint(fontpathlistbox->currentItem()) > fontpathlistbox->count())
909 return;
910
911 int item = fontpathlistbox->currentItem();
912 fontpaths.remove(fontpaths.at(fontpathlistbox->currentItem()));
913 fontpathlistbox->clear();
914 fontpathlistbox->insertStringList(fontpaths);
915 if (uint(item) > fontpathlistbox->count())
916 item = int(fontpathlistbox->count()) - 1;
917 fontpathlistbox->setCurrentItem(item);
918 setModified(true);
919}
920
921
922void MainWindow::addFontpath()
923{
924 if (fontpathlineedit->text().isEmpty())
925 return;
926
927 if (fontpathlistbox->currentItem() < 0 ||
928 uint(fontpathlistbox->currentItem()) > fontpathlistbox->count()) {
929 fontpaths.append(fontpathlineedit->text());
930 fontpathlistbox->clear();
931 fontpathlistbox->insertStringList(fontpaths);
932 setModified(true);
933
934 return;
935 }
936
937 int item = fontpathlistbox->currentItem();
938 fontpaths.insert(fontpathlistbox->currentItem()+1,
939 fontpathlineedit->text());
940 fontpathlistbox->clear();
941 fontpathlistbox->insertStringList(fontpaths);
942 fontpathlistbox->setCurrentItem(item);
943 setModified(true);
944}
945
946
947void MainWindow::downFontpath()
948{
949 if (fontpathlistbox->currentItem() < 0 ||
950 uint(fontpathlistbox->currentItem()) >= fontpathlistbox->count() - 1)
951 return;
952
953 int item = fontpathlistbox->currentItem();
954 QString fam = fontpaths.at(item);
955 fontpaths.removeAt(item);
956 fontpaths.insert(item+1, fam);
957 fontpathlistbox->clear();
958 fontpathlistbox->insertStringList(fontpaths);
959 fontpathlistbox->setCurrentItem(item + 1);
960 setModified(true);
961}
962
963
964void MainWindow::upFontpath()
965{
966 if (fontpathlistbox->currentItem() < 1)
967 return;
968
969 int item = fontpathlistbox->currentItem();
970 QString fam = fontpaths.at(item);
971 fontpaths.removeAt(item);
972 fontpaths.insert(item-1, fam);
973 fontpathlistbox->clear();
974 fontpathlistbox->insertStringList(fontpaths);
975 fontpathlistbox->setCurrentItem(item - 1);
976 setModified(true);
977}
978
979
980void MainWindow::browseFontpath()
981{
982 QString dirname = QFileDialog::getExistingDirectory(QString(), this, 0,
983 tr("Select a Directory"));
984 if (dirname.isNull())
985 return;
986
987 fontpathlineedit->setText(dirname);
988}
989
990
991void MainWindow::somethingModified()
992{
993 setModified(true);
994}
995
996
997void MainWindow::helpAbout()
998{
999 QMessageBox box(this);
1000 box.setText(tr("<h3>%1</h3>"
1001 "<br/>Version %2"
1002 "<br/><br/>Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)."
1003 "<br/><br/>The program is provided AS IS with NO WARRANTY OF ANY KIND,"
1004 " INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A"
1005 " PARTICULAR PURPOSE.<br/> ")
1006 .arg(tr("Qt Configuration")).arg(QLatin1String(QT_VERSION_STR)));
1007 box.setWindowTitle(tr("Qt Configuration"));
1008 box.setIcon(QMessageBox::NoIcon);
1009 box.exec();
1010}
1011
1012
1013void MainWindow::helpAboutQt()
1014{
1015 QMessageBox::aboutQt(this, tr("Qt Configuration"));
1016}
1017
1018
1019void MainWindow::pageChanged(QWidget *page)
1020{
1021 if (page == tab)
1022 helpview->setText(tr(interface_text));
1023 else if (page == tab1)
1024 helpview->setText(tr(appearance_text));
1025 else if (page == tab2)
1026 helpview->setText(tr(font_text));
1027 else if (page == tab3)
1028 helpview->setText(tr(printer_text));
1029 else if (page == tab4)
1030 helpview->setText(tr(phonon_text));
1031}
1032
1033
1034void MainWindow::closeEvent(QCloseEvent *e)
1035{
1036 if (modified) {
1037 switch(QMessageBox::warning(this, tr("Save Changes"),
1038 tr("Save changes to settings?"),
1039 tr("&Yes"), tr("&No"), tr("&Cancel"), 0, 2)) {
1040 case 0: // save
1041 qApp->processEvents();
1042 fileSave();
1043
1044 // fall through intended
1045 case 1: // don't save
1046 e->accept();
1047 break;
1048
1049 case 2: // cancel
1050 e->ignore();
1051 break;
1052
1053 default: break;
1054 }
1055 } else
1056 e->accept();
1057}
1058
1059QT_END_NAMESPACE
Note: See TracBrowser for help on using the repository browser.