1 /*
2  * This file is part of Licq, an instant messaging client for UNIX.
3  * Copyright (C) 2007-2010 Licq developers
4  *
5  * Licq is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * Licq is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with Licq; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18  */
19 
20 #include "general.h"
21 
22 #include "config.h"
23 
24 #include <QCheckBox>
25 #include <QComboBox>
26 #include <QDir>
27 #include <QGridLayout>
28 #include <QGroupBox>
29 #include <QLabel>
30 #include <QRadioButton>
31 #include <QVBoxLayout>
32 
33 #include <licq/daemon.h>
34 
35 #include "config/general.h"
36 #include "core/gui-defines.h"
37 #include "widgets/fontedit.h"
38 
39 #include "settingsdlg.h"
40 
41 using namespace LicqQtGui;
42 /* TRANSLATOR LicqQtGui::Settings::General */
43 
General(SettingsDlg * parent)44 Settings::General::General(SettingsDlg* parent)
45   : QObject(parent)
46 {
47   parent->addPage(SettingsDlg::DockingPage, createPageDocking(parent),
48       tr("Docking"), SettingsDlg::ContactListPage);
49   parent->addPage(SettingsDlg::FontsPage, createPageFonts(parent),
50       tr("Fonts"), SettingsDlg::ContactListPage);
51 
52   load();
53 }
54 
createPageDocking(QWidget * parent)55 QWidget* Settings::General::createPageDocking(QWidget* parent)
56 {
57   QWidget* w = new QWidget(parent);
58   QVBoxLayout* myPageDockingLayout = new QVBoxLayout(w);
59   myPageDockingLayout->setContentsMargins(0, 0, 0, 0);
60 
61   myDockingBox = new QGroupBox(tr("Docking"));
62   myDockingLayout = new QGridLayout(myDockingBox);
63 
64   myUseDockCheck = new QCheckBox(tr("Use dock icon"), myDockingBox);
65   myUseDockCheck->setToolTip(tr("Controls whether or not the dockable icon should be displayed."));
66   myDockingLayout->addWidget(myUseDockCheck, 0, 0);
67 
68   myHiddenCheck = new QCheckBox(tr("Start hidden"));
69   myHiddenCheck->setToolTip(tr("Start main window hidden. Only the dock icon will be visible."));
70   myDockingLayout->addWidget(myHiddenCheck, 0, 1);
71 
72   myDockDefaultRadio = new QRadioButton(tr("Default icon"));
73   myDockingLayout->addWidget(myDockDefaultRadio, 1, 0);
74 
75   myDockFortyEightCheck = new QCheckBox(tr("64 x 48 dock icon"));
76   myDockFortyEightCheck->setToolTip(tr("Selects between the standard 64x64 icon used in the WindowMaker/Afterstep wharf\n"
77       "and a shorter 64x48 icon for use in the Gnome/KDE panel."));
78   myDockingLayout->addWidget(myDockFortyEightCheck, 1, 1);
79 
80   myDockThemedRadio = new QRadioButton(tr("Themed icon"));
81   myDockingLayout->addWidget(myDockThemedRadio, 2, 0);
82 
83   myDockTrayRadio = new QRadioButton(tr("Tray icon"));
84   myDockTrayRadio->setToolTip(tr("Uses the freedesktop.org standard to dock a small icon into the system tray.\n"
85       "Works with many different window managers."));
86   myDockingLayout->addWidget(myDockTrayRadio, 3, 0);
87 
88   myDockTrayBlinkCheck = new QCheckBox(tr("Blink on events"));
89   myDockTrayBlinkCheck->setToolTip(tr("Make tray icon blink on unread incoming events."));
90   myDockingLayout->addWidget(myDockTrayBlinkCheck, 3, 1);
91 
92   // TODO: Move this to Event pages when we get different kinds of popup
93   myTrayMsgOnlineNotify = new QCheckBox(tr("Show popup for Online notify"));
94   myTrayMsgOnlineNotify->setToolTip(tr("Show balloon popup message when contacts marked for online notify comes online."));
95   myDockingLayout->addWidget(myTrayMsgOnlineNotify, 4, 1);
96 
97   myDockThemeCombo = new QComboBox();
98   // Set the currently available themes
99   QString szDockThemesDir = QString::fromLocal8Bit(Licq::gDaemon.shareDir().c_str()) + QTGUI_DIR + DOCK_DIR;
100   QDir d(szDockThemesDir);
101   d.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
102   myDockThemeCombo->addItems(d.entryList());
103   connect(myDockDefaultRadio, SIGNAL(toggled(bool)), myDockFortyEightCheck, SLOT(setEnabled(bool)));
104   connect(myDockThemedRadio, SIGNAL(toggled(bool)), myDockThemeCombo, SLOT(setEnabled(bool)));
105   connect(myDockTrayRadio, SIGNAL(toggled(bool)), myDockTrayBlinkCheck, SLOT(setEnabled(bool)));
106   connect(myDockTrayRadio, SIGNAL(toggled(bool)), myTrayMsgOnlineNotify, SLOT(setEnabled(bool)));
107   connect(myUseDockCheck, SIGNAL(toggled(bool)), SLOT(useDockToggled(bool)));
108   myDockingLayout->addWidget(myDockThemeCombo, 2, 1);
109 
110 
111   myPageDockingLayout->addWidget(myDockingBox);
112   myPageDockingLayout->addStretch(1);
113 
114   return w;
115 }
116 
createPageFonts(QWidget * parent)117 QWidget* Settings::General::createPageFonts(QWidget* parent)
118 {
119   QWidget* w = new QWidget(parent);
120   myPageFontsLayout = new QVBoxLayout(w);
121   myPageFontsLayout->setContentsMargins(0, 0, 0, 0);
122 
123   myFontBox = new QGroupBox(tr("Fonts"));
124   myFontLayout = new QGridLayout(myFontBox);
125 
126   // Standard font
127   myFontLabel = new QLabel(tr("General:"));
128   myFontLabel->setToolTip(tr("Used for normal text."));
129   myFontLayout->addWidget(myFontLabel, 0, 0);
130   myNormalFontEdit = new FontEdit();
131   myNormalFontEdit->setToolTip(myFontLabel->toolTip());
132   myFontLabel->setBuddy(myNormalFontEdit);
133   myFontLayout->addWidget(myNormalFontEdit, 0, 1);
134   connect(myNormalFontEdit, SIGNAL(fontSelected(const QFont&)), SLOT(normalFontChanged(const QFont&)));
135 
136   // Edit font
137   myEditFontLabel = new QLabel(tr("Editing:"));
138   myEditFontLabel->setToolTip(tr("Used in message editor etc."));
139   myFontLayout->addWidget(myEditFontLabel, 1, 0);
140   myEditFontEdit = new FontEdit();
141   myEditFontEdit->setToolTip(myEditFontLabel->toolTip());
142   myEditFontLabel->setBuddy(myEditFontEdit);
143   myFontLayout->addWidget(myEditFontEdit, 1, 1);
144 
145   // History font
146   myHistoryFontLabel = new QLabel(tr("History:"));
147   myHistoryFontLabel->setToolTip(tr("Used in message history."));
148   myFontLayout->addWidget(myHistoryFontLabel, 2, 0);
149   myHistoryFontEdit = new FontEdit();
150   myHistoryFontEdit->setToolTip(myHistoryFontLabel->toolTip());
151   myHistoryFontLabel->setBuddy(myHistoryFontEdit);
152   myFontLayout->addWidget(myHistoryFontEdit, 2, 1);
153 
154   // Fixed font
155   myFixedFontLabel = new QLabel(tr("Fixed:"));
156   myFixedFontLabel->setToolTip(tr("Used in file editor and network log."));
157   myFontLayout->addWidget(myFixedFontLabel, 3, 0);
158   myFixedFontEdit = new FontEdit();
159   myFixedFontEdit->setToolTip(myFixedFontLabel->toolTip());
160   myFixedFontLabel->setBuddy(myFixedFontEdit);
161   myFontLayout->addWidget(myFixedFontEdit, 3, 1);
162 
163   myPageFontsLayout->addWidget(myFontBox);
164   myPageFontsLayout->addStretch(1);
165 
166   return w;
167 }
168 
useDockToggled(bool useDock)169 void Settings::General::useDockToggled(bool useDock)
170 {
171   if (!useDock)
172   {
173 #ifndef USE_KDE
174     myDockThemeCombo->setEnabled(false);
175     myDockDefaultRadio->setEnabled(false);
176     myDockThemedRadio->setEnabled(false);
177     myDockTrayRadio->setEnabled(false);
178     myDockFortyEightCheck->setEnabled(false);
179     myDockTrayBlinkCheck->setEnabled(false);
180     myTrayMsgOnlineNotify->setEnabled(false);
181 #endif
182     myHiddenCheck->setEnabled(false);
183     myHiddenCheck->setChecked(false);
184     return;
185   }
186   else
187   {
188     myHiddenCheck->setEnabled(true);
189   }
190 
191   // Turned on
192 #ifndef USE_KDE
193   myDockDefaultRadio->setEnabled(true);
194   myDockThemedRadio->setEnabled(true);
195   myDockTrayRadio->setEnabled(true);
196   if (myDockDefaultRadio->isChecked())
197   {
198     myDockFortyEightCheck->setEnabled(true);
199     myDockThemeCombo->setEnabled(false);
200     myDockTrayBlinkCheck->setEnabled(false);
201     myTrayMsgOnlineNotify->setEnabled(false);
202   }
203   else if (myDockThemedRadio->isChecked())
204   {
205     myDockFortyEightCheck->setEnabled(false);
206     myDockThemeCombo->setEnabled(true);
207     myDockTrayBlinkCheck->setEnabled(false);
208     myTrayMsgOnlineNotify->setEnabled(false);
209   }
210   else if (myDockTrayRadio->isChecked())
211   {
212     myDockFortyEightCheck->setEnabled(false);
213     myDockThemeCombo->setEnabled(false);
214     myDockTrayBlinkCheck->setEnabled(true);
215     myTrayMsgOnlineNotify->setEnabled(true);
216   }
217   else
218     myDockDefaultRadio->setChecked(true);
219 #endif
220 }
221 
normalFontChanged(const QFont & font)222 void Settings::General::normalFontChanged(const QFont& font)
223 {
224   myEditFontEdit->setFont(font);
225   myHistoryFontEdit->setFont(font);
226 }
227 
load()228 void Settings::General::load()
229 {
230   Config::General* generalConfig = Config::General::instance();
231 
232   myHiddenCheck->setChecked(generalConfig->mainwinStartHidden());
233   myUseDockCheck->setChecked(generalConfig->dockMode() != Config::General::DockNone);
234 #ifndef USE_KDE
235   myDockDefaultRadio->setChecked(generalConfig->dockMode() == Config::General::DockDefault);
236   myDockFortyEightCheck->setChecked(generalConfig->defaultIconFortyEight());
237   myDockThemedRadio->setChecked(generalConfig->dockMode() == Config::General::DockThemed);
238   for (int i = 0; i < myDockThemeCombo->count(); ++i)
239   {
240     if (myDockThemeCombo->itemText(i) == generalConfig->themedIconTheme())
241     {
242       myDockThemeCombo->setCurrentIndex(i);
243       break;
244     }
245   }
246 #endif
247   myDockTrayRadio->setChecked(generalConfig->dockMode() == Config::General::DockTray);
248   myDockTrayBlinkCheck->setChecked(generalConfig->trayBlink());
249   myTrayMsgOnlineNotify->setChecked(generalConfig->trayMsgOnlineNotify());
250   useDockToggled(myUseDockCheck->isChecked());
251 
252   myNormalFontEdit->setFont(QFont(generalConfig->normalFont()));
253   myEditFontEdit->setFont(QFont(generalConfig->editFont()));
254   myHistoryFontEdit->setFont(QFont(generalConfig->historyFont()));
255   myFixedFontEdit->setFont(QFont(generalConfig->fixedFont()));
256 }
257 
apply()258 void Settings::General::apply()
259 {
260   Config::General* generalConfig = Config::General::instance();
261   generalConfig->blockUpdates(true);
262 
263   generalConfig->setMainwinStartHidden(myHiddenCheck->isChecked());
264   Config::General::DockMode newDockMode = Config::General::DockNone;
265   if (myUseDockCheck->isChecked())
266   {
267 #ifdef USE_KDE
268     newDockMode = Config::General::DockTray;
269 #else
270     if (myDockDefaultRadio->isChecked())
271       newDockMode = Config::General::DockDefault;
272     else if (myDockThemedRadio->isChecked())
273       newDockMode = Config::General::DockThemed;
274     else if (myDockTrayRadio->isChecked())
275       newDockMode = Config::General::DockTray;
276 #endif
277   }
278   generalConfig->setDockMode(newDockMode);
279 #ifndef USE_KDE
280   generalConfig->setDefaultIconFortyEight(myDockFortyEightCheck->isChecked());
281   generalConfig->setThemedIconTheme(myDockThemeCombo->currentText());
282 #endif
283   generalConfig->setTrayBlink(myDockTrayBlinkCheck->isChecked());
284   generalConfig->setTrayMsgOnlineNotify(myTrayMsgOnlineNotify->isChecked());
285 
286   if (myNormalFontEdit->font() == Config::General::instance()->defaultFont())
287     generalConfig->setNormalFont(QString::null);
288   else
289     generalConfig->setNormalFont(myNormalFontEdit->font().toString());
290 
291   if (myEditFontEdit->font() == Config::General::instance()->defaultFont())
292     generalConfig->setEditFont(QString::null);
293   else
294     generalConfig->setEditFont(myEditFontEdit->font().toString());
295 
296   if (myHistoryFontEdit->font() == Config::General::instance()->defaultFont())
297     generalConfig->setHistoryFont(QString::null);
298   else
299     generalConfig->setHistoryFont(myHistoryFontEdit->font().toString());
300 
301   if (myFixedFontEdit->font() == Config::General::instance()->defaultFixedFont())
302     generalConfig->setFixedFont(QString::null);
303   else
304     generalConfig->setFixedFont(myFixedFontEdit->font().toString());
305 
306   generalConfig->blockUpdates(false);
307 }
308