/* vi: ts=8 sts=4 sw=4 * * This file is part of the KDE project, module kfile. * Copyright (C) 2000 Geert Jansen * (C) 2000 Kurt Granroth * (C) 1997 Christoph Neerfeld * (C) 2002 Carsten Pfeiffer * * This is free software; it comes under the GNU Library General * Public License, version 2. See the file "COPYING.LIB" for the * exact licensing terms. */ #include "kicondialog.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * Qt allocates very little horizontal space for the icon name, * even if the gridSize width is large. This delegate allocates * the gridSize width (minus some padding) for the icon and icon name. */ class KIconCanvasDelegate : public QAbstractItemDelegate { public: KIconCanvasDelegate(KIconCanvas *parent, QAbstractItemDelegate *defaultDelegate); ~KIconCanvasDelegate() {}; void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const; QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const; private: KIconCanvas *m_iconCanvas; QAbstractItemDelegate *m_defaultDelegate; static const int HORIZONTAL_EDGE_PAD = 3; }; KIconCanvasDelegate::KIconCanvasDelegate(KIconCanvas *parent, QAbstractItemDelegate *defaultDelegate) : QAbstractItemDelegate(parent) { m_iconCanvas = parent; m_defaultDelegate = defaultDelegate; } void KIconCanvasDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const { const int GRID_WIDTH = m_iconCanvas->gridSize().width(); QStyleOptionViewItem newOption = option; // Manipulate the width available. newOption.rect.setX((option.rect.x() / GRID_WIDTH) * GRID_WIDTH + HORIZONTAL_EDGE_PAD); newOption.rect.setWidth(GRID_WIDTH - 2 * HORIZONTAL_EDGE_PAD); m_defaultDelegate->paint(painter, newOption, index); } QSize KIconCanvasDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const { QSize size = m_defaultDelegate->sizeHint(option, index); const int GRID_WIDTH = m_iconCanvas->gridSize().width(); size.setWidth(GRID_WIDTH - 2 * HORIZONTAL_EDGE_PAD); return size; } class KIconCanvas::KIconCanvasPrivate { public: KIconCanvasPrivate(KIconCanvas *qq) { q = qq; m_bLoading = false; } ~KIconCanvasPrivate() {} KIconCanvas *q; bool m_bLoading; QStringList mFiles; QTimer *mpTimer; KIconCanvasDelegate *mpDelegate; // slots void _k_slotLoadFiles(); void _k_slotCurrentChanged(QListWidgetItem *item); }; /** * Helper class for sorting icon paths by icon name */ class IconPath : public QString { protected: QString m_iconName; public: IconPath(const QString &ip) : QString (ip) { int n = lastIndexOf('/'); m_iconName = (n==-1) ? static_cast(*this) : mid(n+1); } IconPath() : QString () { } bool operator== (const IconPath &ip) const { return m_iconName == ip.m_iconName; } bool operator< (const IconPath &ip) const { return m_iconName < ip.m_iconName; } }; /* * KIconCanvas: Iconview for the iconloader dialog. */ KIconCanvas::KIconCanvas(QWidget *parent) : KListWidget(parent), d(new KIconCanvasPrivate(this)) { setViewMode(IconMode); setUniformItemSizes(true); setMovement(Static); setIconSize(QSize(60, 60)); d->mpTimer = new QTimer(this); connect(d->mpTimer, SIGNAL(timeout()), this, SLOT(_k_slotLoadFiles())); connect(this, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(_k_slotCurrentChanged(QListWidgetItem*))); setGridSize(QSize(100,80)); d->mpDelegate = new KIconCanvasDelegate(this, itemDelegate()); setItemDelegate(d->mpDelegate); } KIconCanvas::~KIconCanvas() { delete d->mpTimer; delete d->mpDelegate; delete d; } void KIconCanvas::loadFiles(const QStringList& files) { clear(); d->mFiles = files; emit startLoading(d->mFiles.count()); d->mpTimer->setSingleShot(true); d->mpTimer->start(10); d->m_bLoading = false; } void KIconCanvas::KIconCanvasPrivate::_k_slotLoadFiles() { q->setResizeMode(QListWidget::Fixed); QApplication::setOverrideCursor(Qt::WaitCursor); // disable updates to not trigger paint events when adding child items, // but force an initial paint so that we do not get garbage q->repaint(); q->setUpdatesEnabled(false); // Cache these as we will call them frequently. const int canvasIconWidth = q->iconSize().width(); const int canvasIconHeight = q->iconSize().width(); const bool uniformIconSize = q->uniformItemSizes(); m_bLoading = true; int i; QStringList::ConstIterator it; uint emitProgress = 10; // so we will emit it once in the beginning QStringList::ConstIterator end(mFiles.constEnd()); for (it = mFiles.constBegin(), i = 0; it != end; ++it, i++) { if (emitProgress >= 10) { emit q->progress(i); emitProgress = 0; } emitProgress++; if (!m_bLoading) { // user clicked on a button that will load another set of icons break; } QImage img(*it); if (img.isNull()) { continue; } if (img.width() > canvasIconWidth || img.height() > canvasIconHeight) { if (img.width() / (float)canvasIconWidth > img.height() / (float)canvasIconHeight) { int height = (int) (((float)canvasIconWidth / img.width()) * img.height()); img = img.scaled(canvasIconWidth, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); } else { int width = (int) (((float)canvasIconHeight / img.height()) * img.width()); img = img.scaled(width, canvasIconHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); } } if (uniformIconSize && (img.width() != canvasIconWidth || img.height() != canvasIconHeight)) { // Image is smaller than desired. Draw onto a transparent QImage of the required dimensions. // (Unpleasant glitches occur if we break the uniformIconSizes() contract). QImage paddedImage = QImage(canvasIconWidth, canvasIconHeight, QImage::Format_ARGB32_Premultiplied); paddedImage.fill(0); QPainter painter(&paddedImage); painter.drawImage( (canvasIconWidth - img.width()) / 2, (canvasIconHeight - img.height()) / 2, img); img = paddedImage; } QPixmap pm = QPixmap::fromImage(img); QFileInfo fi(*it); QListWidgetItem *item = new QListWidgetItem(pm, fi.completeBaseName(), q); item->setData(Qt::UserRole, *it); item->setToolTip(fi.completeBaseName()); } // enable updates since we have to draw the whole view now q->setUpdatesEnabled(true); QApplication::restoreOverrideCursor(); m_bLoading = false; emit q->finished(); q->setResizeMode(QListWidget::Adjust); } QString KIconCanvas::getCurrent() const { if (!currentItem()) return QString(); return currentItem()->data(Qt::UserRole).toString(); } void KIconCanvas::stopLoading() { d->m_bLoading = false; } void KIconCanvas::KIconCanvasPrivate::_k_slotCurrentChanged(QListWidgetItem *item) { emit q->nameChanged((item != 0L) ? item->text() : QString()); } class KIconDialog::KIconDialogPrivate { public: KIconDialogPrivate(KIconDialog *qq) { q = qq; m_bStrictIconSize = true; m_bLockUser = false; m_bLockCustomDir = false; searchLine = 0; mNumOfSteps = 1; } ~KIconDialogPrivate() {} void init(); void showIcons(); void setContext( KIconLoader::Context context ); // slots void _k_slotContext(int); void _k_slotStartLoading(int); void _k_slotProgress(int); void _k_slotFinished(); void _k_slotAcceptIcons(); void _k_slotBrowse(); void _k_slotOtherIconClicked(); void _k_slotSystemIconClicked(); KIconDialog *q; int mGroupOrSize; KIconLoader::Context mContext; QStringList mFileList; KComboBox *mpCombo; QPushButton *mpBrowseBut; QRadioButton *mpSystemIcons, *mpOtherIcons; QProgressBar *mpProgress; int mNumOfSteps; KIconLoader *mpLoader; KIconCanvas *mpCanvas; int mNumContext; KIconLoader::Context mContextMap[ 11 ]; // must match KIcon::Context size, code has assert bool m_bStrictIconSize, m_bLockUser, m_bLockCustomDir; QString custom; QString customLocation; KListWidgetSearchLine *searchLine; }; /* * KIconDialog: Dialog for selecting icons. Both system and user * specified icons can be chosen. */ KIconDialog::KIconDialog(QWidget *parent) : KDialog(parent), d(new KIconDialogPrivate(this)) { setModal( true ); setCaption( i18n("Select Icon") ); setButtons( Ok | Cancel ); setDefaultButton( Ok ); d->mpLoader = KIconLoader::global(); d->init(); } KIconDialog::KIconDialog(KIconLoader *loader, QWidget *parent) : KDialog(parent), d(new KIconDialogPrivate(this)) { setModal( true ); setCaption( i18n("Select Icon") ); setButtons( Ok | Cancel ); setDefaultButton( Ok ); d->mpLoader = loader; d->init(); } void KIconDialog::KIconDialogPrivate::init() { mGroupOrSize = KIconLoader::Desktop; mContext = KIconLoader::Any; mFileList = KGlobal::dirs()->findAllResources("appicon", QLatin1String("*.png")); QWidget *main = new QWidget(q); q->setMainWidget(main); QVBoxLayout *top = new QVBoxLayout(main); top->setMargin(0); QGroupBox *bgroup = new QGroupBox(main); bgroup->setTitle(i18n("Icon Source")); QVBoxLayout *vbox = new QVBoxLayout; bgroup->setLayout( vbox ); top->addWidget(bgroup); QGridLayout *grid = new QGridLayout(); vbox->addLayout(grid); mpSystemIcons = new QRadioButton(i18n("S&ystem icons:"), bgroup); connect(mpSystemIcons, SIGNAL(clicked()), q, SLOT(_k_slotSystemIconClicked())); grid->addWidget(mpSystemIcons, 1, 0); mpCombo = new KComboBox(bgroup); mpCombo->setMaxVisibleItems(12); connect(mpCombo, SIGNAL(activated(int)), q, SLOT(_k_slotContext(int))); grid->addWidget(mpCombo, 1, 1); mpOtherIcons = new QRadioButton(i18n("O&ther icons:"), bgroup); connect(mpOtherIcons, SIGNAL(clicked()), q, SLOT(_k_slotOtherIconClicked())); grid->addWidget(mpOtherIcons, 2, 0); mpBrowseBut = new QPushButton(i18n("&Browse..."), bgroup); connect(mpBrowseBut, SIGNAL(clicked()), q, SLOT(_k_slotBrowse())); grid->addWidget(mpBrowseBut, 2, 1); // // ADD SEARCHLINE // QHBoxLayout *searchLayout = new QHBoxLayout(); searchLayout->setMargin(0); top->addLayout(searchLayout); QLabel *searchLabel = new QLabel(i18n("&Search:"), main); searchLayout->addWidget(searchLabel); searchLine = new KListWidgetSearchLine(main); searchLayout->addWidget(searchLine); searchLabel->setBuddy(searchLine); QString wtstr = i18n("Search interactively for icon names (e.g. folder)."); searchLabel->setWhatsThis(wtstr); searchLine->setWhatsThis(wtstr); mpCanvas = new KIconCanvas(main); connect(mpCanvas, SIGNAL(itemActivated(QListWidgetItem*)), q, SLOT(_k_slotAcceptIcons())); top->addWidget(mpCanvas); searchLine->setListWidget(mpCanvas); // Compute width of canvas with 4 icons displayed in a row QStyleOption opt; opt.initFrom(mpCanvas); int width = 4 * mpCanvas->gridSize().width() + 1; width += mpCanvas->verticalScrollBar()->sizeHint().width(); width += 2 * mpCanvas->frameWidth(); if (mpCanvas->style()->styleHint(QStyle::SH_ScrollView_FrameOnlyAroundContents, &opt, mpCanvas)) { width += mpCanvas->style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarSpacing, &opt, mpCanvas); } mpCanvas->setMinimumSize(width, 125); mpProgress = new QProgressBar(main); top->addWidget(mpProgress); connect(mpCanvas, SIGNAL(startLoading(int)), q, SLOT(_k_slotStartLoading(int))); connect(mpCanvas, SIGNAL(progress(int)), q, SLOT(_k_slotProgress(int))); connect(mpCanvas, SIGNAL(finished()), q, SLOT(_k_slotFinished())); // When pressing Ok or Cancel, stop loading icons connect(q, SIGNAL(hidden()), mpCanvas, SLOT(stopLoading())); static const char* const context_text[] = { I18N_NOOP( "Actions" ), I18N_NOOP( "Animations" ), I18N_NOOP( "Applications" ), I18N_NOOP( "Categories" ), I18N_NOOP( "Devices" ), I18N_NOOP( "Emblems" ), I18N_NOOP( "Emotes" ), I18N_NOOP( "International" ), I18N_NOOP( "Mimetypes" ), I18N_NOOP( "Places" ), I18N_NOOP( "Status" ) }; static const KIconLoader::Context context_id[] = { KIconLoader::Action, KIconLoader::Animation, KIconLoader::Application, KIconLoader::Category, KIconLoader::Device, KIconLoader::Emblem, KIconLoader::Emote, KIconLoader::International, KIconLoader::MimeType, KIconLoader::Place, KIconLoader::StatusIcon }; mNumContext = 0; int cnt = sizeof( context_text ) / sizeof( context_text[ 0 ] ); // check all 3 arrays have same sizes Q_ASSERT( cnt == sizeof( context_id ) / sizeof( context_id[ 0 ] ) && cnt == sizeof( mContextMap ) / sizeof( mContextMap[ 0 ] )); for (int i = 0; i < cnt; ++i) { if (mpLoader->hasContext( context_id[ i ])) { mpCombo->addItem(i18n( context_text[ i ] )); mContextMap[ mNumContext++ ] = context_id[ i ]; } } mpCombo->setFixedSize(mpCombo->sizeHint()); mpBrowseBut->setFixedWidth(mpCombo->width()); // Make the dialog a little taller q->incrementInitialSize(QSize(0,100)); connect(q, SIGNAL(okClicked()), q, SLOT(slotOk())); } KIconDialog::~KIconDialog() { delete d; } void KIconDialog::KIconDialogPrivate::_k_slotAcceptIcons() { custom.clear(); q->slotOk(); } void KIconDialog::KIconDialogPrivate::showIcons() { mpCanvas->clear(); QStringList filelist; if (mpSystemIcons->isChecked()) { if (m_bStrictIconSize) { filelist = mpLoader->queryIcons(mGroupOrSize, mContext); } else { filelist = mpLoader->queryIconsByContext(mGroupOrSize, mContext); } } else if (!customLocation.isEmpty()) { filelist = mpLoader->queryIconsByDir(customLocation); } else { filelist = mFileList; } QList iconlist; QStringList::const_iterator it; foreach (const QString &it, filelist) { iconlist.append(IconPath(it)); } qSort(iconlist); filelist.clear(); foreach (const IconPath &ip, iconlist) { filelist.append(ip); } searchLine->clear(); // The KIconCanvas has uniformItemSizes set which really expects // all added icons to be the same size, otherwise weirdness ensues :) // Ensure all SVGs are scaled to the desired size and that as few icons // need to be padded as possible by specifying a sensible size. if (mGroupOrSize < -1) { // mGroupOrSize can be -1 if NoGroup is chosen. // Explicit size. mpCanvas->setIconSize(QSize(-mGroupOrSize, -mGroupOrSize)); } else { // Icon group. int groupSize = mpLoader->currentSize((KIconLoader::Group)mGroupOrSize); mpCanvas->setIconSize(QSize(groupSize, groupSize)); } mpCanvas->loadFiles(filelist); } void KIconDialog::setStrictIconSize(bool b) { d->m_bStrictIconSize=b; } bool KIconDialog::strictIconSize() const { return d->m_bStrictIconSize; } void KIconDialog::setIconSize( int size ) { // see KIconLoader, if you think this is weird if (size == 0) { d->mGroupOrSize = KIconLoader::Desktop; // default Group } else { d->mGroupOrSize = -size; // yes, KIconLoader::queryIconsByContext is weird } } int KIconDialog::iconSize() const { // 0 or any other value ==> mGroupOrSize is a group, so we return 0 return (d->mGroupOrSize < 0) ? -d->mGroupOrSize : 0; } void KIconDialog::setup(KIconLoader::Group group, KIconLoader::Context context, bool strictIconSize, int iconSize, bool user, bool lockUser, bool lockCustomDir ) { d->m_bStrictIconSize = strictIconSize; d->m_bLockUser = lockUser; d->m_bLockCustomDir = lockCustomDir; if (iconSize == 0) { if (group == KIconLoader::NoGroup) { // NoGroup has numeric value -1, which should // not really be used with KIconLoader::queryIcons*(...); // pick a proper group. d->mGroupOrSize = KIconLoader::Small; } else { d->mGroupOrSize = group; } } else { d->mGroupOrSize = -iconSize; } d->mpSystemIcons->setChecked(!user); d->mpSystemIcons->setEnabled(!lockUser || !user); d->mpOtherIcons->setChecked(user); d->mpOtherIcons->setEnabled(!lockUser || user); d->mpCombo->setEnabled(!user); d->mpBrowseBut->setEnabled(user && !lockCustomDir); d->setContext(context); } void KIconDialog::KIconDialogPrivate::setContext(KIconLoader::Context context) { mContext = context; for (int i = 0; i < mNumContext; ++i) { if( mContextMap[ i ] == context ) { mpCombo->setCurrentIndex(i); return; } } } void KIconDialog::setCustomLocation( const QString& location ) { d->customLocation = location; } QString KIconDialog::openDialog() { d->showIcons(); d->searchLine->setFocus(); if (exec() == Accepted) { if (!d->custom.isEmpty()) { return d->custom; } QString name = d->mpCanvas->getCurrent(); if (name.isEmpty() || d->mpOtherIcons->isChecked()) { return name; } QFileInfo fi(name); return fi.completeBaseName(); } return QString(); } void KIconDialog::showDialog() { setModal(false); d->showIcons(); d->searchLine->setFocus(); show(); } void KIconDialog::slotOk() { QString name; if (!d->custom.isEmpty()) { name = d->custom; } else { name = d->mpCanvas->getCurrent(); if (!name.isEmpty() && d->mpSystemIcons->isChecked()) { const QFileInfo fi(name); name = fi.completeBaseName(); } } emit newIconName(name); KDialog::accept(); } QString KIconDialog::getIcon(KIconLoader::Group group, KIconLoader::Context context, bool strictIconSize, int iconSize, bool user, QWidget *parent, const QString &caption) { KIconDialog dlg(parent); dlg.setup(group, context, strictIconSize, iconSize, user); if (!caption.isEmpty()) { dlg.setCaption(caption); } return dlg.openDialog(); } void KIconDialog::KIconDialogPrivate::_k_slotBrowse() { // Create a file dialog to select a PNG, XPM or SVG file, // with the image previewer shown. // KFileDialog::getImageOpenURL doesn't allow svg. KUrl emptyUrl; KFileDialog dlg(emptyUrl, i18n("*.png *.xpm *.svg *.svgz|Icon Files (*.png *.xpm *.svg *.svgz)"), q); dlg.setOperationMode( KFileDialog::Opening ); dlg.setCaption( i18n("Open") ); dlg.setMode( KFile::File ); KImageFilePreview *ip = new KImageFilePreview( &dlg ); dlg.setPreviewWidget( ip ); dlg.exec(); QString file = dlg.selectedFile(); if (!file.isEmpty()) { custom = file; if (mpSystemIcons->isChecked()) { customLocation = QFileInfo(file).absolutePath(); } q->slotOk(); } } void KIconDialog::KIconDialogPrivate::_k_slotSystemIconClicked() { mpBrowseBut->setEnabled(false); mpCombo->setEnabled(true); showIcons(); } void KIconDialog::KIconDialogPrivate::_k_slotOtherIconClicked() { mpBrowseBut->setEnabled(!m_bLockCustomDir); mpCombo->setEnabled(false); showIcons(); } void KIconDialog::KIconDialogPrivate::_k_slotContext(int id) { mContext = static_cast( mContextMap[ id ] ); showIcons(); } void KIconDialog::KIconDialogPrivate::_k_slotStartLoading(int steps) { if (steps < 10) mpProgress->hide(); else { mNumOfSteps = steps; mpProgress->setValue(0); mpProgress->show(); } } void KIconDialog::KIconDialogPrivate::_k_slotProgress(int p) { mpProgress->setValue(static_cast(100.0 * (double)p / (double)mNumOfSteps)); } void KIconDialog::KIconDialogPrivate::_k_slotFinished() { mNumOfSteps = 1; mpProgress->hide(); } class KIconButton::KIconButtonPrivate { public: KIconButtonPrivate(KIconButton *qq, KIconLoader *loader); ~KIconButtonPrivate(); // slots void _k_slotChangeIcon(); void _k_newIconName(const QString&); KIconButton *q; int iconSize; int buttonIconSize; bool m_bStrictIconSize; bool mbUser; KIconLoader::Group mGroup; KIconLoader::Context mContext; QString mIcon; KIconDialog *mpDialog; KIconLoader *mpLoader; }; /* * KIconButton: A "choose icon" pushbutton. */ KIconButton::KIconButton(QWidget *parent) : QPushButton(parent), d(new KIconButtonPrivate(this, KIconLoader::global())) { QPushButton::setIconSize(QSize(48, 48)); } KIconButton::KIconButton(KIconLoader *loader, QWidget *parent) : QPushButton(parent), d(new KIconButtonPrivate(this, loader)) { QPushButton::setIconSize(QSize(48, 48)); } KIconButton::KIconButtonPrivate::KIconButtonPrivate(KIconButton *qq, KIconLoader *loader) : q(qq) { m_bStrictIconSize = false; iconSize = 0; // let KIconLoader choose the default buttonIconSize = -1; //When buttonIconSize is -1, iconSize will be used for the button mGroup = KIconLoader::Desktop; mContext = KIconLoader::Application; mbUser = false; mpLoader = loader; mpDialog = 0L; connect(q, SIGNAL(clicked()), q, SLOT(_k_slotChangeIcon())); } KIconButton::KIconButtonPrivate::~KIconButtonPrivate() { delete mpDialog; } KIconButton::~KIconButton() { delete d; } void KIconButton::setStrictIconSize(bool b) { d->m_bStrictIconSize=b; } bool KIconButton::strictIconSize() const { return d->m_bStrictIconSize; } void KIconButton::setIconSize( int size ) { if (d->buttonIconSize == -1) { QPushButton::setIconSize(QSize(size, size)); } d->iconSize = size; } int KIconButton::iconSize() const { return d->iconSize; } void KIconButton::setButtonIconSize( int size ) { QPushButton::setIconSize(QSize(size, size)); d->buttonIconSize = size; } int KIconButton::buttonIconSize() const { return QPushButton::iconSize().height(); } void KIconButton::setIconType(KIconLoader::Group group, KIconLoader::Context context, bool user) { d->mGroup = group; d->mContext = context; d->mbUser = user; } void KIconButton::setIcon(const QString& icon) { d->mIcon = icon; setIcon(KIcon(d->mIcon)); if (!d->mpDialog) { d->mpDialog = new KIconDialog(d->mpLoader, this); connect(d->mpDialog, SIGNAL(newIconName(QString)), this, SLOT(_k_newIconName(QString))); } if (d->mbUser) { d->mpDialog->setCustomLocation(QFileInfo(d->mpLoader->iconPath(d->mIcon, d->mGroup, true) ).absolutePath()); } } void KIconButton::setIcon(const QIcon& icon) { QPushButton::setIcon(icon); } void KIconButton::resetIcon() { d->mIcon.clear(); setIcon(QIcon()); } const QString &KIconButton::icon() const { return d->mIcon; } void KIconButton::KIconButtonPrivate::_k_slotChangeIcon() { if (!mpDialog) { mpDialog = new KIconDialog(mpLoader, q); connect(mpDialog, SIGNAL(newIconName(QString)), q, SLOT(_k_newIconName(QString))); } mpDialog->setup(mGroup, mContext, m_bStrictIconSize, iconSize, mbUser); mpDialog->showDialog(); } void KIconButton::KIconButtonPrivate::_k_newIconName(const QString& name) { if (name.isEmpty()) { return; } q->setIcon(KIcon(name)); mIcon = name; if (mbUser) { mpDialog->setCustomLocation(QFileInfo(mpLoader->iconPath(mIcon, mGroup, true)).absolutePath()); } emit q->iconChanged(name); } #include "moc_kicondialog.cpp"