1
/* This file is part of the KDE project
3
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). <qt-info@nokia.com>
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.
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.
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 <KDE/KStandardDirs>
22
#include <KDE/KGlobal>
23
#include <KDE/KComponentData>
24
#include <KDE/KGlobalSettings>
26
#include <KDE/KConfigGroup>
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"
40
* Map a Qt filter string into a KDE one.
41
* (from kfiledialog.cpp)
43
static QString qt2KdeFilter(const QString &f)
46
QTextStream str(&filter, QIODevice::WriteOnly);
47
const QStringList list(f.split(";;").replaceInStrings("/", "\\/"));
48
QStringList::const_iterator it(list.begin()),
54
int ob=(*it).lastIndexOf('('),
55
cb=(*it).lastIndexOf(')');
63
str << (*it).mid(ob+1, (cb-ob)-1) << '|' << (*it).mid(0, ob);
70
* Map a KDE filter string into a Qt one.
71
* (from kfiledialog.cpp)
73
static void kde2QtFilter(const QString &orig, const QString &kde, QString *sel)
77
const QStringList list(orig.split(";;"));
78
QStringList::const_iterator it(list.begin()),
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()]))
95
class KFileDialogBridge : public KFileDialog
98
KFileDialogBridge (const KUrl &startDir, const QString &filter, QFileDialog *original_)
99
: KFileDialog (startDir, filter, original_), original(original_)
101
connect(this, SIGNAL(fileSelected(QString)), original, SIGNAL(currentChanged(QString)));
104
virtual void accept()
107
KFileDialog::accept();
108
QMetaObject::invokeMethod(original, "accept"); //workaround protected
111
virtual void reject()
114
KFileDialog::reject();
115
QMetaObject::invokeMethod(original, "reject"); //workaround protected
118
QFileDialog *original;
121
class KColorDialogBridge : public KColorDialog
124
KColorDialogBridge(QColorDialog* original_ = 0L) : KColorDialog(original_, true) , original(original_)
126
connect(this, SIGNAL(colorSelected(QColor)), original, SIGNAL(currentColorChanged(QColor)));
129
QColorDialog *original;
131
virtual void accept()
133
KColorDialog::accept();
134
original->setCurrentColor(color());
135
QMetaObject::invokeMethod(original, "accept"); //workaround protected
138
virtual void reject()
140
KColorDialog::reject();
141
QMetaObject::invokeMethod(original, "reject"); //workaround protected
145
Q_DECLARE_METATYPE(KFileDialogBridge *)
146
Q_DECLARE_METATYPE(KColorDialogBridge *)
148
class KQGuiPlatformPlugin : public QGuiPlatformPlugin
152
KQGuiPlatformPlugin()
154
connect(KGlobalSettings::self(), SIGNAL(toolbarAppearanceChanged(int)), this, SLOT(updateToolbarStyle()));
155
connect(KGlobalSettings::self(), SIGNAL(kdisplayStyleChanged()), this, SLOT(updateWidgetStyle()));
158
virtual QStringList keys() const { return QStringList() << QLatin1String("kde"); }
159
virtual QString styleName()
161
const QString defaultStyle = KStyle::defaultStyle();
162
const KConfigGroup pConfig(KGlobal::config(), "General");
163
return pConfig.readEntry("widgetStyle", defaultStyle);
165
virtual QPalette palette()
167
return KGlobalSettings::createApplicationPalette();
169
virtual QString systemIconThemeName()
171
return KIconTheme::current();
173
virtual QStringList iconThemeSearchPaths()
175
return KGlobal::dirs()->resourceDirs("icon");
177
virtual QIcon fileSystemIcon(const QFileInfo &file)
179
return KIcon(KMimeType::findByPath(file.filePath(), 0, true)->iconName());
181
virtual int platformHint(PlatformHint hint)
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;
195
return Qt::ToolButtonIconOnly;
197
case PH_ToolBarIconSize:
198
return KIconLoader::global()->currentSize(KIconLoader::MainToolbar);
199
case PH_ItemView_ActivateItemOnSingleClick:
200
return KGlobalSettings::singleClick();
204
return QGuiPlatformPlugin::platformHint(hint);
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)
214
virtual bool fileDialogSetVisible(QFileDialog *qfd, bool visible)
217
if (!kdefd && visible) {
218
if(qfd->options() & QFileDialog::DontUseNativeDialog)
221
kdefd = new KFileDialogBridge(KUrl::fromPath(qfd->directory().canonicalPath()),
222
qt2KdeFilter(qfd->nameFilters().join(";;")), qfd);
224
qfd->setProperty("_k_bridge", QVariant::fromValue(kdefd));
228
switch (qfd->fileMode()) {
229
case QFileDialog::AnyFile:
230
kdefd->setMode(KFile::LocalOnly | KFile::File);
232
case QFileDialog::ExistingFile:
233
kdefd->setMode(KFile::LocalOnly | KFile::File | KFile::ExistingOnly);
235
case QFileDialog::ExistingFiles:
236
kdefd->setMode(KFile::LocalOnly | KFile::Files | KFile::ExistingOnly);
238
case QFileDialog::Directory:
239
case QFileDialog::DirectoryOnly:
240
kdefd->setMode(KFile::LocalOnly | KFile::Directory);
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));
250
kdefd->setVisible(visible);
253
virtual QDialog::DialogCode fileDialogResultCode(QFileDialog *qfd)
257
return QDialog::DialogCode(kdefd->result());
259
virtual void fileDialogSetDirectory(QFileDialog *qfd, const QString &directory)
262
kdefd->setUrl(KUrl::fromPath(directory));
264
virtual QString fileDialogDirectory(const QFileDialog *qfd) const
268
return kdefd->baseUrl().pathOrUrl();
270
virtual void fileDialogSelectFile(QFileDialog *qfd, const QString &filename)
274
kdefd->setSelection(filename);
276
virtual QStringList fileDialogSelectedFiles(const QFileDialog *qfd) const
280
return kdefd->selectedFiles();
282
/*virtual void fileDialogSetFilter(QFileDialog *qfd)
286
virtual void fileDialogSetNameFilters(QFileDialog *qfd, const QStringList &filters)
290
kdefd->setFilter(qt2KdeFilter(filters.join(";;")));
292
/*virtual void fileDialogSelectNameFilter(QFileDialog *qfd, const QString &filter)
296
virtual QString fileDialogSelectedNameFilter(const QFileDialog *qfd) const
301
kde2QtFilter(qfd->nameFilters().join(";;"), kdefd->currentFilter(), &ret);
304
public: // ColorDialog
305
#define K_CD(QCD) KColorDialogBridge *kdecd = qvariant_cast<KColorDialogBridge *>(QCD->property("_k_bridge"))
306
virtual void colorDialogDelete(QColorDialog *qcd)
312
virtual bool colorDialogSetVisible(QColorDialog *qcd, bool visible)
316
kdecd = new KColorDialogBridge(qcd);
317
kdecd->setColor(qcd->currentColor());
318
if (qcd->options() & QColorDialog::NoButtons) {
319
kdecd->setButtons(KDialog::None);
321
kdecd->setModal(qcd->isModal());
322
qcd->setProperty("_k_bridge", QVariant::fromValue(kdecd));
325
kdecd->setCaption(qcd->windowTitle());
326
kdecd->setAlphaChannelEnabled(qcd->options() & QColorDialog::ShowAlphaChannel);
328
kdecd->setVisible(visible);
331
virtual void colorDialogSetCurrentColor(QColorDialog *qcd, const QColor &color)
335
kdecd->setColor(color);
340
void updateToolbarStyle()
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);
353
void updateWidgetStyle()
356
if (qApp->style()->objectName() != styleName()) {
357
qApp->setStyle(styleName());
363
Q_EXPORT_PLUGIN2(KQGuiPlatformPlugin, KQGuiPlatformPlugin)
365
#include "qguiplatformplugin_kde.moc"