kdeui: new KPixmapWidget

the idea for QImage/QPixmap-optimized widget occurred to me while
writing kimageviewer (see the kde-playground repo), unlike the widget I
wrote for kimageviewer this one supports drag-n-drop tho and is drop-in
replacement for QLabel when showing only a pixmap is required. the
widget also shows a small image while dragging ala ksnapshot

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2023-08-29 08:18:25 +03:00
parent 7cb0785160
commit 88598523d0
15 changed files with 462 additions and 169 deletions

View file

@ -202,6 +202,7 @@ install(
KPasswordDialog
KPasteTextAction
KPixmap
KPixmapWidget
KPluginFactory
KPluginInfo
KPluginLoader

1
includes/KPixmapWidget Normal file
View file

@ -0,0 +1 @@
#include "../kpixmapwidget.h"

View file

@ -217,6 +217,7 @@ set(kdeui_LIB_SRCS
widgets/kmessagewidget.cpp
widgets/kmultitabbar.cpp
widgets/knuminput.cpp
widgets/kpixmapwidget.cpp
widgets/kpushbutton.cpp
widgets/kratingpainter.cpp
widgets/kratingwidget.cpp
@ -514,6 +515,7 @@ install(
widgets/kmessagewidget.h
widgets/kmultitabbar.h
widgets/knuminput.h
widgets/kpixmapwidget.h
widgets/kpushbutton.h
widgets/kratingpainter.h
widgets/kratingwidget.h

View file

@ -29,6 +29,7 @@
#include "ktextedit.h"
#include "ksqueezedtextlabel.h"
#include "kwindowsystem.h"
#include "kpixmapwidget.h"
#include <QtCore/QPointer>
#include <QtCore/QDebug>
@ -176,17 +177,17 @@ int KMessageBox::createKMessageBox(KDialog *dialog, const QIcon &icon,
hLayout->setSpacing(-1); // use default spacing
mainLayout->addLayout(hLayout,5);
QLabel *iconLabel = new QLabel(mainWidget);
KPixmapWidget *iconWidget = new KPixmapWidget(mainWidget);
if (!icon.isNull()) {
QStyleOption option;
option.initFrom(mainWidget);
iconLabel->setPixmap(icon.pixmap(mainWidget->style()->pixelMetric(QStyle::PM_MessageBoxIconSize, &option, mainWidget)));
iconWidget->setPixmap(icon.pixmap(mainWidget->style()->pixelMetric(QStyle::PM_MessageBoxIconSize, &option, mainWidget)));
}
QVBoxLayout *iconLayout = new QVBoxLayout();
iconLayout->addStretch(1);
iconLayout->addWidget(iconLabel);
iconLayout->addWidget(iconWidget);
iconLayout->addStretch(5);
hLayout->addLayout(iconLayout,0);
@ -301,12 +302,12 @@ int KMessageBox::createKMessageBox(KDialog *dialog, const QIcon &icon,
dialog->setMainWidget(mainWidget);
if (!usingListWidget && !usingScrollArea && !usingSqueezedTextLabel && details.isEmpty())
dialog->setFixedSize(dialog->sizeHint() + QSize( 10, 10 ));
else if (!details.isEmpty() && dialog->minimumHeight()<iconLabel->sizeHint().height()*2)//strange bug...
else if (!details.isEmpty() && dialog->minimumHeight()<iconWidget->sizeHint().height()*2)//strange bug...
{
if (!usingScrollArea)
dialog->setMinimumSize(300,qMax(150,qMax(iconLabel->sizeHint().height(),messageLabel->sizeHint().height())));
dialog->setMinimumSize(300,qMax(150,qMax(iconWidget->sizeHint().height(),messageLabel->sizeHint().height())));
else
dialog->setMinimumSize(300,qMax(150,iconLabel->sizeHint().height()));
dialog->setMinimumSize(300,qMax(150,iconWidget->sizeHint().height()));
}

View file

@ -22,31 +22,31 @@
// I (espen) prefer that header files are included alphabetically
#include "khelpmenu.h"
#include "kaboutapplicationdialog.h"
#include "kaboutdata.h"
#include "kaboutkdedialog_p.h"
#include "kaction.h"
#include "kactioncollection.h"
#include "kapplication.h"
#include "kdialog.h"
#include "kguiitem.h"
#include "khbox.h"
#include "kiconloader.h"
#include "klocale.h"
#include "kmenu.h"
#include "kstandardshortcut.h"
#include "kstandardaction.h"
#include "kstandardguiitem.h"
#include "kswitchlanguagedialog_p.h"
#include "ktoolinvocation.h"
#include "kstandarddirs.h"
#include "kpixmapwidget.h"
#include <QtCore/QTimer>
#include <QtGui/QLabel>
#include <QtGui/QWidget>
#include <QtGui/QWhatsThis>
#include <kaboutapplicationdialog.h>
#include <kaboutdata.h>
#include <kaboutkdedialog_p.h>
#include <kaction.h>
#include <kactioncollection.h>
#include <kapplication.h>
#include <kdialog.h>
#include <kguiitem.h>
#include <khbox.h>
#include <kiconloader.h>
#include <klocale.h>
#include <kmenu.h>
#include <kstandardshortcut.h>
#include <kstandardaction.h>
#include <kstandardguiitem.h>
#include <kswitchlanguagedialog_p.h>
#include <ktoolinvocation.h>
#include <kstandarddirs.h>
#include <config.h>
#ifdef Q_WS_X11
#include <QtGui/qx11embed_x11.h>
@ -271,10 +271,10 @@ void KHelpMenu::aboutApplication()
hbox->setSpacing(KDialog::spacingHint() * 3);
hbox->setMargin(KDialog::marginHint() * 1);
QLabel *label1 = new QLabel(hbox);
KPixmapWidget *pixmap1 = new KPixmapWidget(hbox);
int size = IconSize(KIconLoader::Dialog);
label1->setPixmap(qApp->windowIcon().pixmap(size,size));
pixmap1->setPixmap(qApp->windowIcon().pixmap(size,size));
QLabel *label2 = new QLabel(hbox);
label2->setText(d->mAboutAppText);
}

View file

@ -18,13 +18,13 @@
* 02110-1301 USA
*/
#include "kmessagewidget.h"
#include <kaction.h>
#include <kcolorscheme.h>
#include <kdebug.h>
#include <kicon.h>
#include <kiconloader.h>
#include <kstandardaction.h>
#include "kaction.h"
#include "kcolorscheme.h"
#include "kicon.h"
#include "kiconloader.h"
#include "kstandardaction.h"
#include "kpixmapwidget.h"
#include "kdebug.h"
#include <QEvent>
#include <QGridLayout>
@ -42,7 +42,7 @@ public:
void init(KMessageWidget *q_ptr);
KMessageWidget* q;
QLabel* iconLabel;
KPixmapWidget* iconWidget;
QLabel* textLabel;
QToolButton* closeButton;
QIcon icon;
@ -58,9 +58,9 @@ void KMessageWidgetPrivate::init(KMessageWidget *q_ptr)
q->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
iconLabel = new QLabel(q);
iconLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
iconLabel->hide();
iconWidget = new KPixmapWidget(q);
iconWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
iconWidget->hide();
textLabel = new QLabel(q);
textLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
@ -104,7 +104,7 @@ void KMessageWidgetPrivate::updateLayout()
if (textLabel->wordWrap()) {
QGridLayout* layout = new QGridLayout(q);
// Set alignment to make sure icon does not move down if text wraps
layout->addWidget(iconLabel, 0, 0, 1, 1, Qt::AlignHCenter | Qt::AlignTop);
layout->addWidget(iconWidget, 0, 0, 1, 1, Qt::AlignHCenter | Qt::AlignTop);
layout->addWidget(textLabel, 0, 1);
QHBoxLayout* buttonLayout = new QHBoxLayout();
@ -121,7 +121,7 @@ void KMessageWidgetPrivate::updateLayout()
layout->addItem(buttonLayout, 1, 0, 1, 2);
} else {
QHBoxLayout* layout = new QHBoxLayout(q);
layout->addWidget(iconLabel);
layout->addWidget(iconWidget);
layout->addWidget(textLabel);
Q_FOREACH(QToolButton* button, buttons) {
@ -316,11 +316,11 @@ void KMessageWidget::setIcon(const QIcon& icon)
{
d->icon = icon;
if (d->icon.isNull()) {
d->iconLabel->hide();
d->iconWidget->hide();
} else {
const int size = KIconLoader::global()->currentSize(KIconLoader::MainToolbar);
d->iconLabel->setPixmap(d->icon.pixmap(size));
d->iconLabel->show();
d->iconWidget->setPixmap(d->icon.pixmap(size));
d->iconWidget->show();
}
}

View file

@ -0,0 +1,209 @@
/* This file is part of the KDE libraries
Copyright (C) 2023 Ivailo Monev <xakepa10@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License version 2, as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "kpixmapwidget.h"
#include "kmimetype.h"
#include "kimageio.h"
#include "kglobalsettings.h"
#include "kdebug.h"
#include <QPainter>
#include <QStyle>
#include <QStyleOption>
#include <QUrl>
static bool kCheckMimeData(const QMimeData *mimedata)
{
if (!mimedata) {
return false;
} else if (mimedata->hasImage()) {
return true;
} else if (mimedata->hasUrls()) {
const QList<QUrl> mimedataurls = mimedata->urls();
foreach (const QUrl &mimedataurl, mimedataurls) {
const KMimeType::Ptr mimetype = KMimeType::findByPath(mimedataurl.toLocalFile());
if (mimetype && KImageIO::isSupported(mimetype->name())) {
// atleast one supported image
return true;
}
}
}
return false;
}
class KPixmapWidgetPrivate
{
public:
KPixmapWidgetPrivate();
QPixmap pixmap;
Qt::Alignment alignment;
bool dragenabled;
QPoint dragstartpos;
};
KPixmapWidgetPrivate::KPixmapWidgetPrivate()
: alignment(Qt::AlignHCenter | Qt::AlignVCenter),
dragenabled(false)
{
}
KPixmapWidget::KPixmapWidget(QWidget *parent)
: QWidget(parent),
d(new KPixmapWidgetPrivate())
{
}
KPixmapWidget::~KPixmapWidget()
{
delete d;
}
void KPixmapWidget::setPixmap(const QPixmap &pixmap)
{
d->pixmap = pixmap;
update();
}
QPixmap KPixmapWidget::pixmap() const
{
return d->pixmap;
}
void KPixmapWidget::setAlignment(Qt::Alignment alignment)
{
d->alignment = alignment;
update();
}
Qt::Alignment KPixmapWidget::alignment() const
{
return d->alignment;
}
bool KPixmapWidget::dragEnabled() const
{
return d->dragenabled;
}
void KPixmapWidget::setDragEnabled(const bool enable)
{
d->dragenabled = enable;
}
QSize KPixmapWidget::sizeHint() const
{
return minimumSizeHint();
}
QSize KPixmapWidget::minimumSizeHint() const
{
const QSize pixmapsize = d->pixmap.size();
return pixmapsize.expandedTo(QWidget::minimumSize());
}
void KPixmapWidget::paintEvent(QPaintEvent *event)
{
if (Q_LIKELY(!d->pixmap.isNull())) {
QPainter painter(this);
QStyle *style = QWidget::style();
const int alignment = QStyle::visualAlignment(layoutDirection(), d->alignment);
if (!isEnabled()) {
QStyleOption styleoptions;
styleoptions.initFrom(this);
style->drawItemPixmap(
&painter, contentsRect(), alignment,
style->generatedIconPixmap(QIcon::Disabled, d->pixmap, &styleoptions)
);
} else {
style->drawItemPixmap(
&painter, contentsRect(), alignment, d->pixmap
);
}
}
QWidget::paintEvent(event);
}
void KPixmapWidget::mousePressEvent(QMouseEvent *event)
{
if (d->dragenabled) {
d->dragstartpos = event->pos();
}
QWidget::mousePressEvent(event);
}
void KPixmapWidget::mouseMoveEvent(QMouseEvent *event)
{
if (d->dragenabled &&
event->buttons() & Qt::LeftButton &&
(event->pos() - d->dragstartpos).manhattanLength() > KGlobalSettings::dndEventDelay())
{
QDrag* drag = new QDrag(this);
QMimeData* mimedata = new QMimeData();
mimedata->setImageData(d->pixmap.toImage());
drag->setMimeData(mimedata);
if (!d->pixmap.isNull()) {
drag->setPixmap(d->pixmap.scaled(QSize(96, 96), Qt::KeepAspectRatio));
// same as the one in KColorMimeData
drag->setHotSpot(QPoint(-5,-7));
}
drag->start();
}
// don't propagate
event->accept();
}
void KPixmapWidget::dragEnterEvent(QDragEnterEvent *event)
{
if (kCheckMimeData(event->mimeData())) {
event->acceptProposedAction();
}
}
void KPixmapWidget::dragMoveEvent(QDragMoveEvent *event)
{
if (kCheckMimeData(event->mimeData())) {
event->acceptProposedAction();
}
}
void KPixmapWidget::dropEvent(QDropEvent *event)
{
const QMimeData* mimedata = event->mimeData();
if (!mimedata) {
return;
} else if (mimedata->hasImage()) {
// images are QPixmap-convertable
setPixmap(qvariant_cast<QPixmap>(mimedata->imageData()));
} else if (mimedata->hasUrls()) {
const QList<QUrl> mimedataurls = mimedata->urls();
foreach (const QUrl &mimedataurl, mimedataurls) {
const QString mimedataurlpath = mimedataurl.toLocalFile();
const KMimeType::Ptr mimetype = KMimeType::findByPath(mimedataurlpath);
if (mimetype && KImageIO::isSupported(mimetype->name())) {
const QPixmap mimedataurlpixmap = QPixmap(mimedataurlpath);
if (!mimedataurlpixmap.isNull()) {
// the last pixmap wins
setPixmap(mimedataurlpixmap.scaled(QWidget::size(), Qt::KeepAspectRatio));
}
}
}
}
}
#include "moc_kpixmapwidget.cpp"

View file

@ -0,0 +1,75 @@
/* This file is part of the KDE libraries
Copyright (C) 2023 Ivailo Monev <xakepa10@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License version 2, as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef KPIXMAPWIDGET_H
#define KPIXMAPWIDGET_H
#include <kdeui_export.h>
#include <QWidget>
#include <QPixmap>
#include <QPaintEvent>
#include <QDropEvent>
#include <QMouseEvent>
class KPixmapWidgetPrivate;
/*!
Class to show a pixmap with drag-n-drop support.
@note neither drag nor drop is enabled by default, call @p setDragEnabled and
@p setAcceptDrops to enable the features
@since 4.24
@warning the API is subject to change
*/
class KDEUI_EXPORT KPixmapWidget: public QWidget
{
Q_OBJECT
Q_PROPERTY(bool dragEnabled READ dragEnabled WRITE setDragEnabled)
public:
KPixmapWidget(QWidget *parent = nullptr);
~KPixmapWidget();
void setPixmap(const QPixmap &pixmap);
QPixmap pixmap() const;
Qt::Alignment alignment() const;
void setAlignment(Qt::Alignment);
bool dragEnabled() const;
void setDragEnabled(const bool enable);
// QWidget reimplementations
virtual QSize sizeHint() const;
virtual QSize minimumSizeHint() const;
protected:
// QWidget reimplementations
virtual void paintEvent(QPaintEvent *event);
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
virtual void dragEnterEvent(QDragEnterEvent *event);
virtual void dragMoveEvent(QDragMoveEvent *event);
virtual void dropEvent(QDropEvent *event);
private:
Q_DISABLE_COPY(KPixmapWidget);
KPixmapWidgetPrivate *d;
};
#endif // KPIXMAPWIDGET_H

View file

@ -18,6 +18,9 @@
*/
#include "ktitlewidget.h"
#include "kicon.h"
#include "kiconloader.h"
#include "kpixmapwidget.h"
#include <QtCore/QTimer>
#include <QtGui/qevent.h>
@ -26,9 +29,6 @@
#include <QtGui/QLayout>
#include <QtGui/QTextDocument>
#include <kicon.h>
#include <kiconloader.h>
class KTitleWidget::Private
{
public:
@ -48,9 +48,9 @@ public:
void updateCommentWidget() const
{
// FIXME: we need the usability color styles to implement different
// FIXME: need the usability color styles to implement different
// yet palette appropriate colours for the different use cases!
// also .. should we include an icon here, perhaps using the imageLabel?
// also .. should an icon be included here, perhaps using the pixmapWidget?
switch (messageType) {
case InfoMessage:
case WarningMessage:
@ -77,7 +77,7 @@ public:
KTitleWidget* q;
QGridLayout *headerLayout;
QLabel *imageLabel;
KPixmapWidget *pixmapWidget;
QLabel *textLabel;
QLabel *commentLabel;
int autoHideTimeout;
@ -130,11 +130,11 @@ KTitleWidget::KTitleWidget(QWidget *parent)
d->textLabel->setVisible(false);
d->textLabel->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse);
d->imageLabel = new QLabel(titleFrame);
d->imageLabel->setVisible(false);
d->pixmapWidget = new KPixmapWidget(titleFrame);
d->pixmapWidget->setVisible(false);
d->headerLayout->addWidget(d->textLabel, 0, 0);
d->headerLayout->addWidget(d->imageLabel, 0, 1, 1, 2);
d->headerLayout->addWidget(d->pixmapWidget, 0, 1, 1, 2);
d->commentLabel = new QLabel(titleFrame);
d->commentLabel->setVisible(false);
@ -186,9 +186,9 @@ QString KTitleWidget::comment() const
return d->commentLabel->text();
}
const QPixmap *KTitleWidget::pixmap() const
QPixmap KTitleWidget::pixmap() const
{
return d->imageLabel->pixmap();
return d->pixmapWidget->pixmap();
}
void KTitleWidget::setBuddy(QWidget *buddy)
@ -237,15 +237,15 @@ void KTitleWidget::setComment(const QString &comment, MessageType type)
void KTitleWidget::setPixmap(const QPixmap &pixmap, ImageAlignment alignment)
{
d->imageLabel->setVisible(!pixmap.isNull());
d->pixmapWidget->setVisible(!pixmap.isNull());
d->headerLayout->removeWidget(d->textLabel);
d->headerLayout->removeWidget(d->commentLabel);
d->headerLayout->removeWidget(d->imageLabel);
d->headerLayout->removeWidget(d->pixmapWidget);
if (alignment == ImageLeft) {
// swap the text and image labels around
d->headerLayout->addWidget(d->imageLabel, 0, 0, 2, 1);
d->headerLayout->addWidget(d->pixmapWidget, 0, 0, 2, 1);
d->headerLayout->addWidget(d->textLabel, 0, 1);
d->headerLayout->addWidget(d->commentLabel, 1, 1);
d->headerLayout->setColumnStretch(0, 0);
@ -253,12 +253,12 @@ void KTitleWidget::setPixmap(const QPixmap &pixmap, ImageAlignment alignment)
} else {
d->headerLayout->addWidget(d->textLabel, 0, 0);
d->headerLayout->addWidget(d->commentLabel, 1, 0);
d->headerLayout->addWidget(d->imageLabel, 0, 1, 2, 1);
d->headerLayout->addWidget(d->pixmapWidget, 0, 1, 2, 1);
d->headerLayout->setColumnStretch(1, 0);
d->headerLayout->setColumnStretch(0, 1);
}
d->imageLabel->setPixmap(pixmap);
d->pixmapWidget->setPixmap(pixmap);
}

View file

@ -117,7 +117,7 @@ public:
* @return the pixmap displayed in the title
* @see setPixmap()
*/
const QPixmap *pixmap() const;
QPixmap pixmap() const;
/**
* Sets this label's buddy to buddy.

View file

@ -276,6 +276,10 @@ ToolTip=Title box with label and icon
WhatsThis=A styled frame to be used in title positions in dialogs and other widgets
Group=Display (KDE)
[KPixmapWidget]
ToolTip=QPixmap-optimized widget with drag-n-drop support
Group=Display (KDE)
[KTreeWidgetSearchLine]
ToolTip=QTreeWidget Search Line (KDE)
Group=Input (KDE)

View file

@ -24,6 +24,7 @@
#include <kfileitem.h>
#include <kpixmapsequenceoverlaypainter.h>
#include <kio/previewjob.h>
#include <kpixmapwidget.h>
#include <kconfiggroup.h>
#include <config-kfile.h>
@ -56,13 +57,13 @@ public:
void _k_slotFailed(const KFileItem &item);
KUrl lastShownURL;
QLabel *imageLabel;
KPixmapWidget *pixmapWidget;
KPixmapSequenceOverlayPainter *busyPainter;
KIO::PreviewJob *m_job;
};
KImageFilePreviewPrivate::KImageFilePreviewPrivate()
: imageLabel(nullptr),
: pixmapWidget(nullptr),
busyPainter(nullptr),
m_job(nullptr)
{
@ -76,11 +77,11 @@ void KImageFilePreviewPrivate::_k_slotFailed(const KFileItem &item)
{
busyPainter->stop();
if (item.isDir()) {
imageLabel->setPixmap(
pixmapWidget->setPixmap(
DesktopIcon("inode-directory", KIconLoader::SizeEnormous, KIconLoader::DisabledState)
);
} else {
imageLabel->setPixmap(
pixmapWidget->setPixmap(
SmallIcon("image-missing", KIconLoader::SizeEnormous, KIconLoader::DisabledState)
);
}
@ -103,13 +104,13 @@ KImageFilePreview::KImageFilePreview(QWidget *parent)
QVBoxLayout *vb = new QVBoxLayout(this);
vb->setMargin(0);
d->imageLabel = new QLabel(this);
d->imageLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
d->imageLabel->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
vb->addWidget(d->imageLabel);
d->pixmapWidget = new KPixmapWidget(this);
d->pixmapWidget->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
d->pixmapWidget->setDragEnabled(true);
vb->addWidget(d->pixmapWidget);
d->busyPainter = new KPixmapSequenceOverlayPainter(this);
d->busyPainter->setWidget(d->imageLabel);
d->busyPainter->setWidget(d->pixmapWidget);
d->busyPainter->stop();
setSupportedMimeTypes(KIO::PreviewJob::supportedMimeTypes());
@ -133,8 +134,8 @@ void KImageFilePreview::showPreview(const KUrl& url)
d->lastShownURL = url;
int w = d->imageLabel->contentsRect().width() - 4;
int h = d->imageLabel->contentsRect().height() - 4;
int w = d->pixmapWidget->contentsRect().width() - 4;
int h = d->pixmapWidget->contentsRect().height() - 4;
if (d->m_job) {
disconnect(
@ -188,7 +189,7 @@ QSize KImageFilePreview::sizeHint() const
void KImageFilePreview::gotPreview(const KFileItem &item, const QPixmap &pixmap)
{
d->busyPainter->stop();
d->imageLabel->setPixmap(pixmap);
d->pixmapWidget->setPixmap(pixmap);
}
@ -198,7 +199,7 @@ void KImageFilePreview::clearPreview()
d->m_job->kill();
d->m_job = nullptr;
}
d->imageLabel->setPixmap(QPixmap());
d->pixmapWidget->setPixmap(QPixmap());
}
#include "moc_kimagefilepreview.cpp"

View file

@ -43,7 +43,51 @@
#include "kpropertiesdialog.h"
#include "kpropertiesdialog_p.h"
#include "kdialog.h"
#include "kdirnotify.h"
#include "kdiskfreespaceinfo.h"
#include "kdebug.h"
#include "kdesktopfile.h"
#include "kicondialog.h"
#include "kurl.h"
#include "kurlrequester.h"
#include "klocale.h"
#include "kglobal.h"
#include "kglobalsettings.h"
#include "kstandarddirs.h"
#include "kjobuidelegate.h"
#include "kio/job.h"
#include "kio/copyjob.h"
#include "kio/chmodjob.h"
#include "kio/directorysizejob.h"
#include "kio/renamedialog.h"
#include "kio/netaccess.h"
#include "kio/jobuidelegate.h"
#include "kfiledialog.h"
#include "kmimetype.h"
#include "kmountpoint.h"
#include "kiconloader.h"
#include "kmessagebox.h"
#include "kservice.h"
#include "kcombobox.h"
#include "kcompletion.h"
#include "klineedit.h"
#include "kseparator.h"
#include "ksqueezedtextlabel.h"
#include "kmimetypetrader.h"
#include "kpreviewprops.h"
#include "kmetaprops.h"
#include "krun.h"
#include "kvbox.h"
#include "kacl.h"
#include "kconfiggroup.h"
#include "kshell.h"
#include "kcapacitybar.h"
#include "kfileitemlistproperties.h"
#include "kuser.h"
#include "kpixmapwidget.h"
#include "kbuildsycocaprogressdialog.h"
#include "kmimetypechooser.h"
#include <config.h>
#include <config-acl.h>
@ -75,59 +119,12 @@ extern "C" {
#include <sys/acl.h>
#endif
#include <kdialog.h>
#include <kdirnotify.h>
#include <kdiskfreespaceinfo.h>
#include <kdebug.h>
#include <kdesktopfile.h>
#include <kicondialog.h>
#include <kurl.h>
#include <kurlrequester.h>
#include <klocale.h>
#include <kglobal.h>
#include <kglobalsettings.h>
#include <kstandarddirs.h>
#include <kjobuidelegate.h>
#include <kio/job.h>
#include <kio/copyjob.h>
#include <kio/chmodjob.h>
#include <kio/directorysizejob.h>
#include <kio/renamedialog.h>
#include <kio/netaccess.h>
#include <kio/jobuidelegate.h>
#include <kfiledialog.h>
#include <kmimetype.h>
#include <kmountpoint.h>
#include <kiconloader.h>
#include <kmessagebox.h>
#include <kservice.h>
#include <kcombobox.h>
#include <kcompletion.h>
#include <klineedit.h>
#include <kseparator.h>
#include <ksqueezedtextlabel.h>
#include <kmimetypetrader.h>
#include <kpreviewprops.h>
#include <kmetaprops.h>
#include <krun.h>
#include <kvbox.h>
#include <kacl.h>
#include <kconfiggroup.h>
#include <kshell.h>
#include <kcapacitybar.h>
#include <kfileitemlistproperties.h>
#include <kuser.h>
#include "ui_kpropertiesdesktopbase.h"
#include "ui_kpropertiesdesktopadvbase.h"
#ifdef HAVE_POSIX_ACL
#include "kacleditwidget.h"
#endif
#include <kbuildsycocaprogressdialog.h>
#include <kmimetypechooser.h>
using namespace KDEPrivate;
static QString nameFromFileName(QString nameStr)
@ -858,11 +855,11 @@ KFilePropsPlugin::KFilePropsPlugin(KPropertiesDialog *props)
this, SLOT(slotIconChanged())
);
} else {
QLabel *iconLabel = new QLabel(d->m_frame);
int bsize = 66 + 2 * iconLabel->style()->pixelMetric(QStyle::PM_ButtonMargin);
iconLabel->setFixedSize(bsize, bsize);
iconLabel->setPixmap(KIconLoader::global()->loadIcon(iconStr, KIconLoader::Desktop, 48));
d->iconArea = iconLabel;
KPixmapWidget *iconWidget = new KPixmapWidget(d->m_frame);
int bsize = 66 + 2 * iconWidget->style()->pixelMetric(QStyle::PM_ButtonMargin);
iconWidget->setFixedSize(bsize, bsize);
iconWidget->setPixmap(KIconLoader::global()->loadIcon(iconStr, KIconLoader::Desktop, 48));
d->iconArea = iconWidget;
}
grid->addWidget(d->iconArea, curRow, 0, Qt::AlignLeft);

View file

@ -43,8 +43,8 @@
#include <QtDBus/QDBusReply>
#include <QtDBus/QDBusConnectionInterface>
#include <kmimetypetrader.h>
#include <kmimetype.h>
#include "kmimetypetrader.h"
#include "kmimetype.h"
#include "kio/jobclasses.h" // for KIO::JobFlags
#include "kio/job.h"
#include "kio/jobuidelegate.h"
@ -54,24 +54,25 @@
#include "kfile/kopenwithdialog.h"
#include "kfile/krecentdocument.h"
#include "kdesktopfileactions.h"
#include <kmessageboxwrapper.h>
#include <kurl.h>
#include <kglobal.h>
#include <ktoolinvocation.h>
#include <kdebug.h>
#include <klocale.h>
#include <kprotocolmanager.h>
#include <kstandarddirs.h>
#include <kprocess.h>
#include <kdesktopfile.h>
#include <kmacroexpander.h>
#include <kshell.h>
#include <kde_file.h>
#include <kconfiggroup.h>
#include <kdialog.h>
#include <kstandardguiitem.h>
#include <kguiitem.h>
#include <ksavefile.h>
#include "kmessageboxwrapper.h"
#include "kurl.h"
#include "kglobal.h"
#include "ktoolinvocation.h"
#include "kdebug.h"
#include "klocale.h"
#include "kprotocolmanager.h"
#include "kstandarddirs.h"
#include "kprocess.h"
#include "kdesktopfile.h"
#include "kmacroexpander.h"
#include "kshell.h"
#include "kde_file.h"
#include "kconfiggroup.h"
#include "kdialog.h"
#include "kstandardguiitem.h"
#include "kguiitem.h"
#include "ksavefile.h"
#include "kpixmapwidget.h"
#ifdef Q_WS_X11
#include <kwindowsystem.h>
@ -858,10 +859,10 @@ static bool makeServiceExecutable(const KService& service, QWidget* window)
QWidget *baseWidget = new QWidget(baseDialog);
QHBoxLayout *mainLayout = new QHBoxLayout(baseWidget);
QLabel *iconLabel = new QLabel(baseWidget);
KPixmapWidget *iconWidget = new KPixmapWidget(baseWidget);
QPixmap warningIcon(KIconLoader::global()->loadIcon("dialog-warning", KIconLoader::NoGroup, KIconLoader::SizeHuge));
mainLayout->addWidget(iconLabel);
iconLabel->setPixmap(warningIcon);
mainLayout->addWidget(iconWidget);
iconWidget->setPixmap(warningIcon);
QVBoxLayout *contentLayout = new QVBoxLayout;
QString warningMessage = i18nc("program name follows in a line edit below",

View file

@ -20,6 +20,15 @@
#include "tooltip_p.h"
#include "windowpreview_p.h"
#include "plasma/plasma.h"
#include "plasma/paintutils.h"
#include "plasma/theme.h"
#include "plasma/framesvg.h"
#include "plasma/windoweffects.h"
#include "kdebug.h"
#include "kglobal.h"
#include "kglobalsettings.h"
#include "kpixmapwidget.h"
#include <QAbstractTextDocumentLayout>
#include <QBitmap>
@ -32,16 +41,6 @@
#include <QPropertyAnimation>
#include <QtGui/qtextobject.h>
#include <kdebug.h>
#include <kglobal.h>
#include <kglobalsettings.h>
#include <plasma/plasma.h>
#include <plasma/paintutils.h>
#include <plasma/theme.h>
#include <plasma/framesvg.h>
#include <plasma/windoweffects.h>
namespace Plasma {
class TipTextWidget : public QWidget
@ -140,15 +139,17 @@ class ToolTipPrivate
{
public:
ToolTipPrivate()
: text(0),
imageLabel(0),
preview(0),
: text(nullptr),
imageWidget(nullptr),
preview(nullptr),
background(nullptr),
animation(nullptr),
direction(Plasma::Up),
autohide(true)
{ }
TipTextWidget *text;
QLabel *imageLabel;
KPixmapWidget *imageWidget;
WindowPreview *preview;
FrameSvg *background;
QWeakPointer<QObject> source;
@ -165,9 +166,9 @@ ToolTip::ToolTip(QWidget *parent)
setWindowFlags(Qt::ToolTip);
d->preview = new WindowPreview(this);
d->text = new TipTextWidget(this);
d->imageLabel = new QLabel(this);
d->imageWidget = new KPixmapWidget(this);
d->imageLabel->setAlignment(Qt::AlignTop | Qt::AlignLeft);
d->imageWidget->setAlignment(Qt::AlignTop | Qt::AlignLeft);
d->animation = new QPropertyAnimation(this, "pos", this);
d->animation->setEasingCurve(QEasingCurve::InOutQuad);
d->animation->setDuration(250);
@ -183,7 +184,7 @@ ToolTip::ToolTip(QWidget *parent)
QGridLayout *mainLayout = new QGridLayout();//2, 2);
mainLayout->addWidget(d->preview, 0, 0, 1, -1, Qt::AlignCenter);
mainLayout->addWidget(d->imageLabel, 1, 0, Qt::AlignTop | Qt::AlignHCenter);
mainLayout->addWidget(d->imageWidget, 1, 0, Qt::AlignTop | Qt::AlignHCenter);
mainLayout->addWidget(d->text, 1, 1, Qt::AlignCenter | Qt::AlignVCenter);
mainLayout->setColumnStretch(1, 10);
@ -281,10 +282,10 @@ void ToolTip::setContent(QObject *tipper, const ToolTipContent &data)
if (data.image().isNull() ||
(WindowEffects::isEffectAvailable(WindowEffects::WindowPreview) &&
!data.windowsToPreview().isEmpty())) {
d->imageLabel->hide();
d->imageWidget->hide();
} else {
d->imageLabel->show();
d->imageLabel->setPixmap(data.image());
d->imageWidget->show();
d->imageWidget->setPixmap(data.image());
}
if (data.highlightWindows() && !data.windowsToPreview().isEmpty()) {