~ubuntu-branches/ubuntu/utopic/kde-workspace/utopic-proposed

« back to all changes in this revision

Viewing changes to solid/kcm/backendchooser.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Michał Zając
  • Date: 2011-07-09 08:31:15 UTC
  • Revision ID: james.westby@ubuntu.com-20110709083115-ohyxn6z93mily9fc
Tags: upstream-4.6.90
Import upstream version 4.6.90

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*  This file is part of the KDE project
 
2
    Copyright (C) 2006 Kevin Ottens <ervin@kde.org>
 
3
 
 
4
    This library is free software; you can redistribute it and/or
 
5
    modify it under the terms of the GNU Library General Public
 
6
    License as published by the Free Software Foundation; either
 
7
    version 2 of the License, or (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 General Public License
 
15
    along with this program; if not, write to the Free Software
 
16
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 
17
    02110-1301, USA.
 
18
 
 
19
*/
 
20
 
 
21
#include "backendchooser.h"
 
22
 
 
23
#include <kservicetypeprofile.h>
 
24
#include <kservicetype.h>
 
25
#include <kservicetypetrader.h>
 
26
#include <kconfig.h>
 
27
#include <QStringList>
 
28
#include <QListWidgetItem>
 
29
#include <kapplication.h>
 
30
#include <kicon.h>
 
31
#include <QList>
 
32
 
 
33
 
 
34
static bool equals(const KService::List &list1, const KService::List &list2)
 
35
{
 
36
    if (list1.size()!=list2.size())
 
37
    {
 
38
        return false;
 
39
    }
 
40
 
 
41
    for (int i=0; i<list1.size(); ++i)
 
42
    {
 
43
        if (list1[i]->name()!=list2[i]->name())
 
44
        {
 
45
            return false;
 
46
        }
 
47
    }
 
48
 
 
49
    return true;
 
50
}
 
51
 
 
52
 
 
53
BackendChooser::BackendChooser(QWidget *parent, const QString &backendType)
 
54
    : QWidget(parent), m_backendType(backendType)
 
55
{
 
56
    m_ui.setupUi(this);
 
57
 
 
58
    connect(m_ui.listView, SIGNAL(itemSelectionChanged()),
 
59
             this, SLOT(slotSelectionChanged()));
 
60
    connect(m_ui.upButton, SIGNAL(clicked()),
 
61
             this, SLOT(slotUpClicked()));
 
62
    connect(m_ui.downButton, SIGNAL(clicked()),
 
63
             this, SLOT(slotDownClicked()));
 
64
 
 
65
    KServiceType::Ptr service_type = KServiceType::serviceType(backendType);
 
66
 
 
67
    QString title;
 
68
    if (service_type) {
 
69
        title = service_type->comment();
 
70
    }
 
71
 
 
72
    if (title.isEmpty())
 
73
    {
 
74
        title = backendType;
 
75
    }
 
76
 
 
77
    m_ui.groupBox->setTitle(title);
 
78
}
 
79
 
 
80
void BackendChooser::load()
 
81
{
 
82
    m_initServices = KServiceTypeTrader::self()->query(m_backendType, "Type == 'Service'");
 
83
 
 
84
    loadServicesInView(m_initServices);
 
85
}
 
86
 
 
87
void BackendChooser::loadServicesInView(const KService::List &services)
 
88
{
 
89
    m_services.clear();
 
90
    m_ui.listView->clear();
 
91
 
 
92
    foreach (KService::Ptr service, services)
 
93
    {
 
94
        m_ui.listView->addItem(service->name());
 
95
        m_services[service->name()] = service;
 
96
    }
 
97
 
 
98
    m_ui.listView->setItemSelected(m_ui.listView->item(0), true);
 
99
}
 
100
 
 
101
KService::List BackendChooser::servicesFromView()
 
102
{
 
103
    KService::List services;
 
104
 
 
105
    int count = m_ui.listView->count();
 
106
 
 
107
    for (int i=0; i<count; ++i)
 
108
    {
 
109
        QListWidgetItem *item = m_ui.listView->item(i);
 
110
        KService::Ptr service = m_services[item->text()];
 
111
        services.append(service);
 
112
    }
 
113
 
 
114
    return services;
 
115
}
 
116
 
 
117
void BackendChooser::save()
 
118
{
 
119
    if (!equals(m_initServices, servicesFromView()))
 
120
    {
 
121
        m_initServices = servicesFromView();
 
122
        KServiceTypeProfile::writeServiceTypeProfile(m_backendType, m_initServices);
 
123
        emit changed(false);
 
124
    }
 
125
}
 
126
 
 
127
void BackendChooser::defaults()
 
128
{
 
129
    KService::List currentServices = servicesFromView();
 
130
    KService::List defaultServices = KServiceTypeTrader::self()->defaultOffers(m_backendType, "Type == 'Service'");
 
131
 
 
132
    if (!equals(currentServices, defaultServices))
 
133
    {
 
134
        loadServicesInView(KServiceTypeTrader::self()->defaultOffers(m_backendType, "Type == 'Service'"));
 
135
        emit changed(!equals(m_initServices, servicesFromView()));
 
136
    }
 
137
}
 
138
 
 
139
void BackendChooser::slotSelectionChanged()
 
140
{
 
141
    KService::Ptr service;
 
142
 
 
143
    for (int i=0; i<m_ui.listView->count(); ++i)
 
144
    {
 
145
        QListWidgetItem *item = m_ui.listView->item(i);
 
146
 
 
147
        if (m_ui.listView->isItemSelected(item))
 
148
        {
 
149
            service = m_services[item->text()];
 
150
            break;
 
151
        }
 
152
    }
 
153
 
 
154
    if (service)
 
155
    {
 
156
        m_ui.iconLabel->setPixmap(KIcon(service->icon()).pixmap(32));
 
157
        m_ui.nameLabel->setText(service->name());
 
158
        m_ui.commentLabel->setText(service->comment());
 
159
        m_ui.versionLabel->setText(service->property("X-KDE-SolidBackendInfo-Version").toString());
 
160
    }
 
161
}
 
162
 
 
163
void BackendChooser::slotUpClicked()
 
164
{
 
165
    QList<QListWidgetItem *> selectedList = m_ui.listView->selectedItems();
 
166
 
 
167
    foreach (QListWidgetItem *selected, selectedList)
 
168
    {
 
169
        int row = m_ui.listView->row(selected);
 
170
 
 
171
        if (row > 0)
 
172
        {
 
173
            QListWidgetItem *taken = m_ui.listView->takeItem(row - 1);
 
174
            m_ui.listView->insertItem(row, taken);
 
175
 
 
176
            emit changed(!equals(m_initServices, servicesFromView()));
 
177
            return;
 
178
        }
 
179
    }
 
180
}
 
181
 
 
182
void BackendChooser::slotDownClicked()
 
183
{
 
184
    QList<QListWidgetItem *> selectedList = m_ui.listView->selectedItems();
 
185
 
 
186
    foreach (QListWidgetItem *selected, selectedList)
 
187
    {
 
188
        int row = m_ui.listView->row(selected);
 
189
 
 
190
        if (row + 1 < m_ui.listView->count())
 
191
        {
 
192
            QListWidgetItem *taken = m_ui.listView->takeItem(row + 1);
 
193
            m_ui.listView->insertItem(row, taken);
 
194
 
 
195
            emit changed(!equals(m_initServices, servicesFromView()));
 
196
            return;
 
197
        }
 
198
    }
 
199
}
 
200
 
 
201
#include "backendchooser.moc"