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

« back to all changes in this revision

Viewing changes to qguiplatformplugin_kde/qguiplatformplugin_kde.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
 
 
3
    Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). <qt-info@nokia.com>
 
4
 
 
5
    This library is free software; you can redistribute it and/or
 
6
    modify it under the terms of the GNU Library 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.
 
9
 
 
10
    This library 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
    Library General Public License for more details.
 
14
 
 
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.
 
19
*/
 
20
 
 
21
#include <KDE/KStandardDirs>
 
22
#include <KDE/KGlobal>
 
23
#include <KDE/KComponentData>
 
24
#include <KDE/KGlobalSettings>
 
25
#include <KDE/KStyle>
 
26
#include <KDE/KConfigGroup>
 
27
#include <KDE/KIcon>
 
28
#include <KDE/KFileDialog>
 
29
#include <KDE/KColorDialog>
 
30
#include <QtCore/QHash>
 
31
#include <QtGui/QFileDialog>
 
32
#include <QtGui/QColorDialog>
 
33
#include <QtGui/QApplication>
 
34
#include <QtGui/QToolButton>
 
35
#include "qguiplatformplugin_p.h"
 
36
 
 
37
#include <kdebug.h>
 
38
 
 
39
/*
 
40
 * Map a Qt filter string into a KDE one.
 
41
 * (from kfiledialog.cpp)
 
42
*/
 
43
static QString qt2KdeFilter(const QString &f)
 
44
{
 
45
    QString filter;
 
46
    QTextStream str(&filter, QIODevice::WriteOnly);
 
47
    const QStringList list(f.split(";;").replaceInStrings("/", "\\/"));
 
48
    QStringList::const_iterator it(list.begin()),
 
49
                                end(list.end());
 
50
    bool first=true;
 
51
 
 
52
    for(; it!=end; ++it)
 
53
    {
 
54
        int ob=(*it).lastIndexOf('('),
 
55
            cb=(*it).lastIndexOf(')');
 
56
 
 
57
        if(-1!=cb && ob<cb)
 
58
        {
 
59
            if(first)
 
60
                first=false;
 
61
            else
 
62
                str << '\n';
 
63
            str << (*it).mid(ob+1, (cb-ob)-1) << '|' << (*it).mid(0, ob);
 
64
        }
 
65
    }
 
66
    return filter;
 
67
}
 
68
 
 
69
/*
 
70
 * Map a KDE filter string into a Qt one.
 
71
 * (from kfiledialog.cpp)
 
72
 */
 
73
static void kde2QtFilter(const QString &orig, const QString &kde, QString *sel)
 
74
{
 
75
    if(sel)
 
76
    {
 
77
        const QStringList list(orig.split(";;"));
 
78
        QStringList::const_iterator it(list.begin()),
 
79
                                    end(list.end());
 
80
        int pos;
 
81
 
 
82
        for(; it!=end; ++it)
 
83
            if(-1!=(pos=(*it).indexOf(kde)) && pos>0 &&
 
84
                ('('==(*it)[pos-1] || ' '==(*it)[pos-1]) &&
 
85
                (*it).length()>=kde.length()+pos &&
 
86
                (')'==(*it)[pos+kde.length()] || ' '==(*it)[pos+kde.length()]))
 
87
            {
 
88
                *sel=*it;
 
89
                return;
 
90
            }
 
91
    }
 
92
}
 
93
 
 
94
 
 
95
class KFileDialogBridge : public KFileDialog
 
96
{
 
97
public:
 
98
    KFileDialogBridge (const KUrl &startDir, const QString &filter, QFileDialog *original_)
 
99
     :  KFileDialog (startDir, filter, original_), original(original_)
 
100
     {
 
101
         connect(this, SIGNAL(fileSelected(QString)), original, SIGNAL(currentChanged(QString)));
 
102
     }
 
103
 
 
104
    virtual void accept()
 
105
    {
 
106
        kDebug();
 
107
        KFileDialog::accept();
 
108
        QMetaObject::invokeMethod(original, "accept"); //workaround protected
 
109
    }
 
110
 
 
111
    virtual void reject()
 
112
    {
 
113
        kDebug();
 
114
        KFileDialog::reject();
 
115
        QMetaObject::invokeMethod(original, "reject"); //workaround protected
 
116
    }
 
117
 
 
118
    QFileDialog *original;
 
119
};
 
120
 
 
121
class KColorDialogBridge : public KColorDialog
 
122
{
 
123
public:
 
124
    KColorDialogBridge(QColorDialog* original_ = 0L) : KColorDialog(original_, true) , original(original_)
 
125
    {
 
126
        connect(this, SIGNAL(colorSelected(QColor)), original, SIGNAL(currentColorChanged(QColor)));
 
127
    }
 
128
 
 
129
    QColorDialog *original;
 
130
 
 
131
    virtual void accept()
 
132
    {
 
133
        KColorDialog::accept();
 
134
        original->setCurrentColor(color());
 
135
        QMetaObject::invokeMethod(original, "accept"); //workaround protected
 
136
    }
 
137
 
 
138
    virtual void reject()
 
139
    {
 
140
        KColorDialog::reject();
 
141
        QMetaObject::invokeMethod(original, "reject"); //workaround protected
 
142
    }
 
143
};
 
144
 
 
145
Q_DECLARE_METATYPE(KFileDialogBridge *)
 
146
Q_DECLARE_METATYPE(KColorDialogBridge *)
 
147
 
 
148
class KQGuiPlatformPlugin : public QGuiPlatformPlugin
 
149
{
 
150
    Q_OBJECT
 
151
public:
 
152
    KQGuiPlatformPlugin()
 
153
    {
 
154
        connect(KGlobalSettings::self(), SIGNAL(toolbarAppearanceChanged(int)), this, SLOT(updateToolbarStyle()));
 
155
        connect(KGlobalSettings::self(), SIGNAL(kdisplayStyleChanged()), this, SLOT(updateWidgetStyle()));
 
156
    }
 
157
 
 
158
    virtual QStringList keys() const { return QStringList() << QLatin1String("kde"); }
 
159
    virtual QString styleName()
 
160
    {
 
161
        const QString defaultStyle = KStyle::defaultStyle();
 
162
        const KConfigGroup pConfig(KGlobal::config(), "General");
 
163
        return pConfig.readEntry("widgetStyle", defaultStyle);
 
164
    }
 
165
    virtual QPalette palette()
 
166
    {
 
167
        return KGlobalSettings::createApplicationPalette();
 
168
    }
 
169
    virtual QString systemIconThemeName()
 
170
    {
 
171
        return KIconTheme::current();
 
172
    }
 
173
    virtual QStringList iconThemeSearchPaths()
 
174
    {
 
175
        return KGlobal::dirs()->resourceDirs("icon");
 
176
    }
 
177
    virtual QIcon fileSystemIcon(const QFileInfo &file)
 
178
    {
 
179
        return KIcon(KMimeType::findByPath(file.filePath(), 0, true)->iconName());
 
180
    }
 
181
    virtual int platformHint(PlatformHint hint)
 
182
    {
 
183
        switch(hint)
 
184
        {
 
185
        case PH_ToolButtonStyle: {
 
186
            KConfigGroup group(KGlobal::config(), "Toolbar style");
 
187
            QString style = group.readEntry("ToolButtonStyle", "TextUnderIcon").toLower();
 
188
            if (style == "textbesideicon" || style == "icontextright")
 
189
                return Qt::ToolButtonTextBesideIcon;
 
190
            else if (style == "textundericon" || style == "icontextbottom")
 
191
                return Qt::ToolButtonTextUnderIcon;
 
192
            else if (style == "textonly")
 
193
                return Qt::ToolButtonTextOnly;
 
194
            else
 
195
                return Qt::ToolButtonIconOnly;
 
196
        }
 
197
        case PH_ToolBarIconSize:
 
198
            return KIconLoader::global()->currentSize(KIconLoader::MainToolbar);
 
199
        case PH_ItemView_ActivateItemOnSingleClick:
 
200
            return KGlobalSettings::singleClick();
 
201
        default:
 
202
            break;
 
203
        }
 
204
        return QGuiPlatformPlugin::platformHint(hint);
 
205
    }
 
206
 
 
207
public: // File Dialog integration
 
208
#define K_FD(QFD) KFileDialogBridge *kdefd = qvariant_cast<KFileDialogBridge *>(QFD->property("_k_bridge"))
 
209
    virtual void fileDialogDelete(QFileDialog *qfd)
 
210
    {
 
211
        K_FD(qfd);
 
212
        delete kdefd;
 
213
    }
 
214
    virtual bool fileDialogSetVisible(QFileDialog *qfd, bool visible)
 
215
    {
 
216
        K_FD(qfd);
 
217
        if (!kdefd && visible) {
 
218
            if(qfd->options() & QFileDialog::DontUseNativeDialog)
 
219
                return false;
 
220
 
 
221
            kdefd = new KFileDialogBridge(KUrl::fromPath(qfd->directory().canonicalPath()),
 
222
                                          qt2KdeFilter(qfd->nameFilters().join(";;")), qfd);
 
223
 
 
224
            qfd->setProperty("_k_bridge", QVariant::fromValue(kdefd));
 
225
        }
 
226
 
 
227
        if (visible) {
 
228
            switch (qfd->fileMode()) {
 
229
                case QFileDialog::AnyFile:
 
230
                    kdefd->setMode(KFile::LocalOnly | KFile::File);
 
231
                    break;
 
232
                case QFileDialog::ExistingFile:
 
233
                    kdefd->setMode(KFile::LocalOnly | KFile::File | KFile::ExistingOnly);
 
234
                    break;
 
235
                case QFileDialog::ExistingFiles:
 
236
                    kdefd->setMode(KFile::LocalOnly | KFile::Files | KFile::ExistingOnly);
 
237
                    break;
 
238
                case QFileDialog::Directory:
 
239
                case QFileDialog::DirectoryOnly:
 
240
                    kdefd->setMode(KFile::LocalOnly | KFile::Directory);
 
241
                    break;
 
242
            }
 
243
 
 
244
 
 
245
            kdefd->setOperationMode((qfd->acceptMode() == QFileDialog::AcceptSave) ? KFileDialog::Saving : KFileDialog::Opening);
 
246
            kdefd->setCaption(qfd->windowTitle());
 
247
            kdefd->setConfirmOverwrite(qfd->confirmOverwrite());
 
248
            kdefd->setSelection(qfd->selectedFiles().value(0));
 
249
        }
 
250
        kdefd->setVisible(visible);
 
251
        return true;
 
252
    }
 
253
    virtual QDialog::DialogCode fileDialogResultCode(QFileDialog *qfd)
 
254
    {
 
255
        K_FD(qfd);
 
256
        Q_ASSERT(kdefd);
 
257
        return QDialog::DialogCode(kdefd->result());
 
258
    }
 
259
    virtual void fileDialogSetDirectory(QFileDialog *qfd, const QString &directory)
 
260
    {
 
261
        K_FD(qfd);
 
262
        kdefd->setUrl(KUrl::fromPath(directory));
 
263
    }
 
264
    virtual QString fileDialogDirectory(const QFileDialog *qfd) const
 
265
    {
 
266
        K_FD(qfd);
 
267
        Q_ASSERT(kdefd);
 
268
        return kdefd->baseUrl().pathOrUrl();
 
269
    }
 
270
    virtual void fileDialogSelectFile(QFileDialog *qfd, const QString &filename)
 
271
    {
 
272
        K_FD(qfd);
 
273
        Q_ASSERT(kdefd);
 
274
        kdefd->setSelection(filename);
 
275
    }
 
276
    virtual QStringList fileDialogSelectedFiles(const QFileDialog *qfd) const
 
277
    {
 
278
        K_FD(qfd);
 
279
        Q_ASSERT(kdefd);
 
280
        return kdefd->selectedFiles();
 
281
    }
 
282
    /*virtual void fileDialogSetFilter(QFileDialog *qfd)
 
283
    {
 
284
        K_FD(qfd);
 
285
    }*/
 
286
    virtual void fileDialogSetNameFilters(QFileDialog *qfd, const QStringList &filters)
 
287
    {
 
288
        K_FD(qfd);
 
289
        Q_ASSERT(kdefd);
 
290
        kdefd->setFilter(qt2KdeFilter(filters.join(";;")));
 
291
    }
 
292
    /*virtual void fileDialogSelectNameFilter(QFileDialog *qfd, const QString &filter)
 
293
    {
 
294
        K_FD(qfd);
 
295
    }*/
 
296
    virtual QString fileDialogSelectedNameFilter(const QFileDialog *qfd) const
 
297
    {
 
298
        K_FD(qfd);
 
299
        Q_ASSERT(kdefd);
 
300
        QString ret;
 
301
        kde2QtFilter(qfd->nameFilters().join(";;"), kdefd->currentFilter(), &ret);
 
302
        return ret;
 
303
    }
 
304
public: // ColorDialog
 
305
#define K_CD(QCD) KColorDialogBridge *kdecd = qvariant_cast<KColorDialogBridge *>(QCD->property("_k_bridge"))
 
306
    virtual void colorDialogDelete(QColorDialog *qcd)
 
307
    {
 
308
        K_CD(qcd);
 
309
        delete kdecd;
 
310
 
 
311
    }
 
312
    virtual bool colorDialogSetVisible(QColorDialog *qcd, bool visible)
 
313
    {
 
314
        K_CD(qcd);
 
315
        if (!kdecd) {
 
316
            kdecd = new KColorDialogBridge(qcd);
 
317
            kdecd->setColor(qcd->currentColor());
 
318
            if (qcd->options() & QColorDialog::NoButtons) {
 
319
                kdecd->setButtons(KDialog::None);
 
320
            }
 
321
            kdecd->setModal(qcd->isModal());
 
322
            qcd->setProperty("_k_bridge", QVariant::fromValue(kdecd));
 
323
        }
 
324
        if (visible) {
 
325
            kdecd->setCaption(qcd->windowTitle());
 
326
            kdecd->setAlphaChannelEnabled(qcd->options() & QColorDialog::ShowAlphaChannel);
 
327
        }
 
328
        kdecd->setVisible(visible);
 
329
        return true;
 
330
    }
 
331
    virtual void colorDialogSetCurrentColor(QColorDialog *qcd, const QColor &color)
 
332
    {
 
333
        K_CD(qcd);
 
334
        if (kdecd) {
 
335
            kdecd->setColor(color);
 
336
        }
 
337
    }
 
338
 
 
339
private slots:
 
340
    void updateToolbarStyle()
 
341
    {
 
342
        //from gtksymbol.cpp
 
343
        QWidgetList widgets = QApplication::allWidgets();
 
344
        for (int i = 0; i < widgets.size(); ++i) {
 
345
            QWidget *widget = widgets.at(i);
 
346
            if (qobject_cast<QToolButton*>(widget)) {
 
347
                QEvent event(QEvent::StyleChange);
 
348
                QApplication::sendEvent(widget, &event);
 
349
            }
 
350
        }
 
351
    }
 
352
 
 
353
    void updateWidgetStyle()
 
354
    {
 
355
        if (qApp) {
 
356
            if (qApp->style()->objectName() != styleName()) {
 
357
                qApp->setStyle(styleName());
 
358
            }
 
359
        }
 
360
    }
 
361
};
 
362
 
 
363
Q_EXPORT_PLUGIN2(KQGuiPlatformPlugin, KQGuiPlatformPlugin)
 
364
 
 
365
#include "qguiplatformplugin_kde.moc"
 
366