1/*
2 * Copyright 2008 Ryan P. Bitanga <ryan.bitanga@gmail.com>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Library General Public License as
6 * published by the Free Software Foundation; either version 2, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details
13 *
14 * You should have received a copy of the GNU Library General Public
15 * License along with this program; if not, write to the
16 * Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 */
19
20#include "configdialog.h"
21
22#include <QButtonGroup>
23#include <QDialogButtonBox>
24#include <QGroupBox>
25#include <QDialogButtonBox>
26#include <QPushButton>
27#include <QRadioButton>
28#include <QTabWidget>
29#include <QVBoxLayout>
30#include <QTimer>
31
32#include <KConfigGroup>
33#include <KDebug>
34#include <KGlobal>
35#include <KPluginInfo>
36#include <KPluginSelector>
37#include <KServiceTypeTrader>
38
39#include <Plasma/RunnerManager>
40#include <Plasma/Theme>
41
42#include "interfaces/default/interface.h"
43#include "krunnersettings.h"
44#include "interfaces/quicksand/qs_dialog.h"
45
46KRunnerConfigWidget::KRunnerConfigWidget(Plasma::RunnerManager *manager, QWidget *parent)
47 : QWidget(parent),
48 m_preview(0),
49 m_manager(manager)
50{
51 m_tabWidget = new KTabWidget(this);
52 m_sel = new KPluginSelector(m_tabWidget);
53 m_tabWidget->addTab(m_sel, i18n("Plugins"));
54
55 QWidget *m_generalSettings = new QWidget(m_tabWidget);
56 //QVBoxLayout *genLayout = new QVBoxLayout(m_generalSettings);
57
58 m_interfaceType = KRunnerSettings::interface();
59 m_uiOptions.setupUi(m_generalSettings);
60
61 syncPalette();
62 connect(Plasma::Theme::defaultTheme(), SIGNAL(themeChanged()), this, SLOT(syncPalette()));
63
64 QButtonGroup *positionButtons = new QButtonGroup(m_generalSettings);
65 positionButtons->addButton(m_uiOptions.topEdgeButton);
66 positionButtons->addButton(m_uiOptions.freeFloatingButton);
67 m_uiOptions.freeFloatingButton->setChecked(KRunnerSettings::freeFloating());
68
69 QButtonGroup *displayButtons = new QButtonGroup(m_generalSettings);
70 connect(displayButtons, SIGNAL(buttonClicked(int)), this, SLOT(setInterface(int)));
71 displayButtons->addButton(m_uiOptions.commandButton, KRunnerSettings::EnumInterface::CommandOriented);
72 displayButtons->addButton(m_uiOptions.taskButton, KRunnerSettings::EnumInterface::TaskOriented);
73
74 if (m_interfaceType == KRunnerSettings::EnumInterface::CommandOriented) {
75 m_uiOptions.commandButton->setChecked(true);
76 } else {
77 m_uiOptions.taskButton->setChecked(true);
78 }
79
80 connect(m_uiOptions.previewButton, SIGNAL(clicked()), this, SLOT(previewInterface()));
81
82 m_tabWidget->addTab(m_generalSettings, i18n("User Interface"));
83
84 connect(m_sel, SIGNAL(configCommitted(QByteArray)), this, SLOT(updateRunner(QByteArray)));
85
86 QTimer::singleShot(0, this, SLOT(load()));
87
88 m_buttons = new QDialogButtonBox(this);
89 m_buttons->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Apply | QDialogButtonBox::Cancel);
90 connect(m_buttons, SIGNAL(clicked(QAbstractButton*)), this, SLOT(save(QAbstractButton*)));
91 connect(m_buttons, SIGNAL(rejected()), this, SIGNAL(finished()));
92
93 QVBoxLayout *topLayout = new QVBoxLayout(this);
94 topLayout->addWidget(m_tabWidget);
95 topLayout->addWidget(m_buttons);
96}
97
98KRunnerConfigWidget::~KRunnerConfigWidget()
99{
100}
101
102void KRunnerConfigWidget::syncPalette()
103{
104 QColor color = Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor);
105 QPalette p = palette();
106 p.setColor(QPalette::Normal, QPalette::WindowText, color);
107 p.setColor(QPalette::Inactive, QPalette::WindowText, color);
108 color.setAlphaF(0.6);
109 p.setColor(QPalette::Disabled, QPalette::WindowText, color);
110
111 p.setColor(QPalette::Normal, QPalette::Link, Plasma::Theme::defaultTheme()->color(Plasma::Theme::LinkColor));
112 p.setColor(QPalette::Normal, QPalette::LinkVisited, Plasma::Theme::defaultTheme()->color(Plasma::Theme::VisitedLinkColor));
113 setPalette(p);
114}
115
116void KRunnerConfigWidget::previewInterface()
117{
118 delete m_preview;
119 switch (m_interfaceType) {
120 case KRunnerSettings::EnumInterface::CommandOriented:
121 m_preview = new Interface(m_manager, this);
122 break;
123 default:
124 m_preview = new QsDialog(m_manager, this);
125 break;
126 }
127
128 m_preview->setFreeFloating(m_uiOptions.freeFloatingButton->isChecked());
129 m_preview->show();
130}
131
132void KRunnerConfigWidget::setInterface(int type)
133{
134 m_interfaceType = type;
135}
136
137void KRunnerConfigWidget::updateRunner(const QByteArray &name)
138{
139 Plasma::AbstractRunner *runner = m_manager->runner(QString::fromLatin1( name ));
140 //Update runner if runner is loaded
141 if (runner) {
142 runner->reloadConfiguration();
143 }
144}
145
146void KRunnerConfigWidget::load()
147{
148 m_sel->addPlugins(Plasma::RunnerManager::listRunnerInfo(),
149 KPluginSelector::ReadConfigFile,
150 i18n("Available Plugins"), QString(),
151 KSharedConfig::openConfig(QLatin1String( "krunnerrc" )));
152}
153
154void KRunnerConfigWidget::save(QAbstractButton *pushed)
155{
156 if (m_buttons->buttonRole(pushed) == QDialogButtonBox::ApplyRole ||
157 m_buttons->buttonRole(pushed) == QDialogButtonBox::AcceptRole) {
158 m_sel->save();
159 m_manager->reloadConfiguration();
160 KRunnerSettings::setInterface(m_interfaceType);
161 KRunnerSettings::setFreeFloating(m_uiOptions.freeFloatingButton->isChecked());
162 KRunnerSettings::self()->writeConfig();
163
164 if (m_buttons->buttonRole(pushed) == QDialogButtonBox::AcceptRole) {
165 emit finished();
166 }
167 }
168}
169
170#include "configdialog.moc"
171
172