2
* Copyright (C) 2010 Rafael Fernández López <ereslibre@kde.org>
3
* Copyright (C) 2010 UFO Coders <info@ufocoders.com>
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public
7
* License as published by the Free Software Foundation; either
8
* version 2 of the License, or (at your option) any later version.
10
* This program 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 GNU
13
* General Public License for more details.
15
* You should have received a copy of the GNU Library General Public License
16
* along with this library; see the file COPYING.LIB. If not, write to
17
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18
* Boston, MA 02110-1301, USA.
21
#include "bluedeviladapters.h"
22
#include "systemcheck.h"
24
#include <QtCore/QTimer>
26
#include <QtGui/QScrollArea>
27
#include <QtGui/QBoxLayout>
28
#include <QtGui/QRadioButton>
29
#include <QtGui/QCheckBox>
30
#include <QtGui/QSlider>
31
#include <QtGui/QLabel>
32
#include <QtGui/QFormLayout>
33
#include <QtGui/QButtonGroup>
35
#include <bluedevil/bluedevil.h>
38
#include <klineedit.h>
39
#include <kaboutdata.h>
40
#include <kpluginfactory.h>
42
K_PLUGIN_FACTORY(BlueDevilFactory, registerPlugin<KCMBlueDevilAdapters>();)
43
K_EXPORT_PLUGIN(BlueDevilFactory("bluedeviladapters"))
45
////////////////////////////////////////////////////////////////////////////////////////////////////
47
AdapterSettings::AdapterSettings(Adapter *adapter, KCModule *parent)
50
, m_name(new KLineEdit(this))
51
, m_hidden(new QRadioButton(i18n("Hidden"), this))
52
, m_alwaysVisible(new QRadioButton(i18n("Always visible"), this))
53
, m_temporaryVisible(new QRadioButton(i18n("Temporary visible"), this))
54
, m_discoverTime(new QSlider(Qt::Horizontal, this))
55
, m_discoverTimeLabel(new QLabel(this))
56
, m_discoverTimeWidget(new QWidget(this))
57
, m_powered(new QCheckBox(this))
59
QButtonGroup *const buttonGroup = new QButtonGroup(this);
60
buttonGroup->addButton(m_hidden);
61
buttonGroup->addButton(m_alwaysVisible);
62
buttonGroup->addButton(m_temporaryVisible);
64
m_name->setText(adapter->name());
65
m_nameOrig = adapter->name();
67
m_alwaysVisibleOrig = false;
68
m_temporaryVisibleOrig = false;
69
if (!adapter->isDiscoverable()) {
70
m_hidden->setChecked(true);
73
if (!adapter->discoverableTimeout()) {
74
m_alwaysVisible->setChecked(true);
75
m_alwaysVisibleOrig = true;
77
m_temporaryVisible->setChecked(true);
78
m_temporaryVisibleOrig = true;
81
m_discoverTime->setRange(1, 30);
82
m_discoverTime->setValue(adapter->discoverableTimeout() / 60);
83
m_discoverTime->setTickPosition(QSlider::TicksBelow);
84
m_discoverTime->setTickInterval(1);
85
m_discoverTimeOrig = qMax((quint32) 1, adapter->discoverableTimeout() / 60);
87
QHBoxLayout *layout = new QHBoxLayout;
88
layout->addWidget(m_discoverTime);
89
layout->addWidget(m_discoverTimeLabel);
90
m_discoverTimeWidget->setLayout(layout);
91
m_discoverTimeWidget->setEnabled(m_temporaryVisibleOrig);
93
m_discoverTimeLabel->setText(i18np("1 minute", "%1 minutes", m_discoverTime->value()));
95
m_powered->setChecked(adapter->isPowered());
96
m_poweredOrig = adapter->isPowered();
98
m_layout = new QFormLayout;
99
m_layout->addRow(i18n("Name"), m_name);
100
m_layout->addRow(i18n("Powered"), m_powered);
101
m_layout->addRow(i18n("Visibility"), m_hidden);
102
m_layout->addWidget(m_alwaysVisible);
103
m_layout->addWidget(m_temporaryVisible);
104
m_layout->addRow(i18n("Discover Time"), m_discoverTimeWidget);
107
m_layout->labelForField(m_discoverTimeWidget)->setEnabled(m_temporaryVisibleOrig);
109
connect(m_adapter, SIGNAL(propertyChanged(QString,QVariant)), this, SLOT(readChanges()));
110
connect(m_name, SIGNAL(textEdited(QString)), this, SLOT(slotSettingsChanged()));
111
connect(m_hidden, SIGNAL(toggled(bool)), this, SLOT(visibilityChanged()));
112
connect(m_hidden, SIGNAL(toggled(bool)), this, SLOT(slotSettingsChanged()));
113
connect(m_alwaysVisible, SIGNAL(toggled(bool)), this, SLOT(visibilityChanged()));
114
connect(m_alwaysVisible, SIGNAL(toggled(bool)), this, SLOT(slotSettingsChanged()));
115
connect(m_temporaryVisible, SIGNAL(toggled(bool)), this, SLOT(visibilityChanged()));
116
connect(m_temporaryVisible, SIGNAL(toggled(bool)), this, SLOT(slotSettingsChanged()));
117
connect(m_discoverTime, SIGNAL(valueChanged(int)), this, SLOT(slotSettingsChanged()));
118
connect(m_powered, SIGNAL(stateChanged(int)), this, SLOT(slotSettingsChanged()));
120
if (BlueDevil::Manager::self()->defaultAdapter() == adapter) {
121
setTitle(i18n("Default adapter: %1 (%2)").arg(adapter->name()).arg(adapter->address()));
123
setTitle(i18n("Adapter: %1 (%2)").arg(adapter->name()).arg(adapter->address()));
127
AdapterSettings::~AdapterSettings()
131
bool AdapterSettings::isModified() const
133
return m_name->text() != m_nameOrig || m_hidden->isChecked() != m_hiddenOrig ||
134
m_alwaysVisible->isChecked() != m_alwaysVisibleOrig ||
135
m_temporaryVisible->isChecked() != m_temporaryVisibleOrig ||
136
m_discoverTime->value() != m_discoverTimeOrig || m_powered->isChecked() != m_poweredOrig;
139
void AdapterSettings::applyChanges()
141
if (m_name->text() != m_nameOrig) {
142
m_adapter->setName(m_name->text());
145
if (m_hidden->isChecked()) {
146
m_adapter->setDiscoverable(false);
147
} else if (m_alwaysVisible->isChecked()) {
148
m_adapter->setDiscoverable(true);
149
m_adapter->setDiscoverableTimeout(0);
151
m_adapter->setDiscoverable(true);
152
m_adapter->setDiscoverableTimeout(m_discoverTime->value() * 60);
155
if (m_powered->isChecked() != m_poweredOrig) {
156
m_adapter->setPowered(m_powered->isChecked());
160
QString AdapterSettings::name() const
162
return m_name->text();
165
AdapterSettings::DiscoverOptions AdapterSettings::discoverOptions() const
167
if (m_hidden->isChecked()) {
170
if (m_alwaysVisible->isChecked()) {
171
return AlwaysVisible;
173
return TemporaryVisible;
176
quint32 AdapterSettings::discoverTime() const
178
return m_discoverTime->value() * 60;
181
bool AdapterSettings::powered() const
183
return m_powered->isChecked();
186
void AdapterSettings::readChanges()
190
m_nameOrig = m_adapter->name();
191
m_hiddenOrig = !m_adapter->isDiscoverable();
192
m_alwaysVisibleOrig = m_adapter->isDiscoverable() && !m_adapter->discoverableTimeout();
193
m_temporaryVisibleOrig = m_adapter->isDiscoverable() && m_adapter->discoverableTimeout();
194
m_discoverTimeOrig = qMax((quint32) 1, m_adapter->discoverableTimeout() / 60);
195
m_poweredOrig = m_adapter->isPowered();
197
m_name->setText(m_nameOrig);
198
m_hidden->setChecked(m_hiddenOrig);
199
m_alwaysVisible->setChecked(m_alwaysVisibleOrig);
200
m_temporaryVisible->setChecked(m_temporaryVisibleOrig);
201
m_discoverTime->setValue(m_discoverTimeOrig);
202
m_powered->setChecked(m_poweredOrig);
204
m_discoverTimeLabel->setText(i18np("1 minute", "%1 minutes", m_discoverTime->value()));
205
if (BlueDevil::Manager::self()->defaultAdapter() == m_adapter) {
206
setTitle(i18n("Default adapter: %1 (%2)").arg(m_adapter->name()).arg(m_adapter->address()));
208
setTitle(i18n("Adapter: %1 (%2)").arg(m_adapter->name()).arg(m_adapter->address()));
213
emit settingsChanged(false);
216
void AdapterSettings::visibilityChanged()
218
QRadioButton *const sdr = static_cast<QRadioButton*>(sender());
219
if (!sdr->isChecked()) {
222
const bool enabled = sender() == m_temporaryVisible;
223
m_discoverTimeWidget->setEnabled(enabled);
224
m_layout->labelForField(m_discoverTimeWidget)->setEnabled(enabled);
227
void AdapterSettings::slotSettingsChanged()
229
m_discoverTimeLabel->setText(i18np("1 minute", "%1 minutes", m_discoverTime->value()));
230
emit settingsChanged(isModified());
233
////////////////////////////////////////////////////////////////////////////////////////////////////
235
KCMBlueDevilAdapters::KCMBlueDevilAdapters(QWidget *parent, const QVariantList&)
236
: KCModule(BlueDevilFactory::componentData(), parent)
237
, m_noAdaptersMessage(0)
238
, m_systemCheck(new SystemCheck(this))
240
KAboutData* ab = new KAboutData(
241
"kcmbluedeviladapters", 0, ki18n("BlueDevil Adapters"), "1.0",
242
ki18n("BlueDevil Adapters Control Panel Module"),
243
KAboutData::License_GPL, ki18n("(c) 2010 Rafael Fernández López"));
245
ab->addAuthor(ki18n("Rafael Fernández López"), ki18n("Developer and Maintainer"), "ereslibre@kde.org");
248
connect(m_systemCheck, SIGNAL(updateInformationStateRequest()),
249
this, SLOT(updateInformationState()));
251
QVBoxLayout *layout = new QVBoxLayout;
252
m_systemCheck->createWarnings(layout);
253
QScrollArea *mainArea = new QScrollArea(this);
254
QWidget *widget = new QWidget(mainArea);
255
m_layout = new QVBoxLayout;
256
widget->setLayout(m_layout);
257
mainArea->setWidget(widget);
258
mainArea->setWidgetResizable(true);
259
layout->addWidget(mainArea);
262
connect(BlueDevil::Manager::self(), SIGNAL(adapterAdded(Adapter*)),
263
this, SLOT(updateAdapters()));
264
connect(BlueDevil::Manager::self(), SIGNAL(adapterRemoved(Adapter*)),
265
this, SLOT(updateAdapters()));
266
connect(BlueDevil::Manager::self(), SIGNAL(defaultAdapterChanged(Adapter*)),
267
this, SLOT(defaultAdapterChanged(Adapter*)));
269
BlueDevil::Adapter *const defaultAdapter = BlueDevil::Manager::self()->defaultAdapter();
270
if (defaultAdapter) {
271
connect(defaultAdapter, SIGNAL(discoverableChanged(bool)),
272
this, SLOT(adapterDiscoverableChanged()));
275
fillAdaptersInformation();
276
updateInformationState();
279
KCMBlueDevilAdapters::~KCMBlueDevilAdapters()
283
void KCMBlueDevilAdapters::defaults()
287
void KCMBlueDevilAdapters::save()
289
Q_FOREACH (AdapterSettings *const adapterSettings, m_adapterSettingsMap) {
290
adapterSettings->applyChanges();
292
QTimer::singleShot(300, this, SLOT(updateInformationState()));
295
void KCMBlueDevilAdapters::updateAdapters()
297
fillAdaptersInformation();
298
QTimer::singleShot(300, this, SLOT(updateInformationState()));
301
void KCMBlueDevilAdapters::defaultAdapterChanged(Adapter *adapter)
304
connect(adapter, SIGNAL(discoverableChanged(bool)),
305
this, SLOT(adapterDiscoverableChanged()));
307
QTimer::singleShot(300, this, SLOT(updateInformationState()));
310
void KCMBlueDevilAdapters::adapterDiscoverableChanged()
312
QTimer::singleShot(300, this, SLOT(updateInformationState()));
315
void KCMBlueDevilAdapters::generateNoAdaptersMessage()
317
QGridLayout *layout = new QGridLayout;
318
m_noAdaptersMessage = new QWidget(this);
319
QLabel *label = new QLabel(m_noAdaptersMessage);
320
label->setPixmap(KIcon("dialog-information").pixmap(128, 128));
321
layout->addWidget(label, 0, 1, Qt::AlignHCenter);
322
layout->addWidget(new QLabel("No adapters found. Please connect one.", m_noAdaptersMessage),
323
1, 1, Qt::AlignHCenter);
324
layout->setRowStretch(2, 1);
325
layout->setColumnStretch(0, 1);
326
layout->setColumnStretch(2, 1);
327
m_noAdaptersMessage->setLayout(layout);
328
m_noAdaptersMessage->setVisible(false);
331
void KCMBlueDevilAdapters::updateInformationState()
333
m_systemCheck->updateInformationState();
336
void KCMBlueDevilAdapters::adapterConfigurationChanged(bool modified)
342
Q_FOREACH (AdapterSettings *const adapterSettings, m_adapterSettingsMap) {
343
if (adapterSettings->isModified()) {
350
void KCMBlueDevilAdapters::fillAdaptersInformation()
352
qDeleteAll(m_adapterSettingsMap);
353
m_adapterSettingsMap.clear();
355
for (int i = 0; i < m_layout->count(); ++i) {
359
if (BlueDevil::Manager::self()->adapters().isEmpty()) {
360
generateNoAdaptersMessage();
361
m_layout->addWidget(m_noAdaptersMessage);
362
m_noAdaptersMessage->setVisible(true);
366
if (m_noAdaptersMessage) {
367
m_noAdaptersMessage->setVisible(false);
370
Q_FOREACH (Adapter *const adapter, BlueDevil::Manager::self()->adapters()) {
371
AdapterSettings *const adapterSettings = new AdapterSettings(adapter, this);
372
connect(adapterSettings, SIGNAL(settingsChanged(bool)),
373
this, SLOT(adapterConfigurationChanged(bool)));
374
m_adapterSettingsMap.insert(adapter, adapterSettings);
375
m_layout->addWidget(adapterSettings);
378
m_layout->addStretch();