based upon a patch by aaron,

now if an empty icon is set the popup is always shown also in the
desktop and the applet area painting has to be done by the
implementation
first using it also in this patch is libplasmaclock
also, api change:
pupApplet::setIcon and icon() became setPopupIcon() and popupIcon()


svn path=/trunk/KDE/kdebase/workspace/libs/plasma/; revision=860338
This commit is contained in:
Marco Martin 2008-09-12 18:32:01 +00:00
parent b6cb43398d
commit 604aef6bd1
2 changed files with 85 additions and 47 deletions

View File

@ -29,6 +29,7 @@
#include <KIcon>
#include <KIconLoader>
#include <KWindowSystem>
#include <KGlobalSettings>
#include <plasma/dialog.h>
#include <plasma/corona.h>
@ -50,7 +51,8 @@ public:
proxy(0),
popupPlacement(Plasma::FloatingPopup),
savedAspectRatio(Plasma::InvalidAspectRatioMode),
timer(0)
timer(0),
startupComplete(false)
{
}
@ -78,6 +80,8 @@ public:
Plasma::PopupPlacement popupPlacement;
Plasma::AspectRatioMode savedAspectRatio;
QTimer *timer;
QPoint clicked;
bool startupComplete;
};
PopupApplet::PopupApplet(QObject *parent, const QVariantList &args)
@ -86,6 +90,11 @@ PopupApplet::PopupApplet(QObject *parent, const QVariantList &args)
{
int iconSize = IconSize(KIconLoader::Desktop);
resize(iconSize, iconSize);
if (!icon().isNull()) {
setPopupIcon(KIcon(icon()));
} else {
setPopupIcon(KIcon("icons"));
}
}
PopupApplet::~PopupApplet()
@ -93,27 +102,41 @@ PopupApplet::~PopupApplet()
delete d;
}
void PopupApplet::setIcon(const QIcon &icon)
void PopupApplet::setPopupIcon(const QIcon &icon)
{
if (icon.isNull()) {
if (d->icon) {
delete d->icon;
d->icon = 0;
setLayout(0);
}
return;
}
if (!d->icon) {
d->icon = new Plasma::Icon(icon, QString(), this);
connect(d->icon, SIGNAL(clicked()), this, SLOT(togglePopup()));
QGraphicsLinearLayout *layout = new QGraphicsLinearLayout();
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
layout->setOrientation(Qt::Horizontal);
setAspectRatioMode(Plasma::ConstrainedSquare);
setLayout(layout);
} else {
d->icon->setIcon(icon);
}
}
void PopupApplet::setIcon(const QString &iconName)
void PopupApplet::setPopupIcon(const QString &iconName)
{
if (!d->icon) {
d->icon = new Plasma::Icon(KIcon(iconName), QString(), this);
} else {
d->icon->setIcon(iconName);
}
setPopupIcon(KIcon(iconName));
}
QIcon PopupApplet::icon() const
QIcon PopupApplet::popupIcon() const
{
return d->icon->icon();
return d->icon ? d->icon->icon() : QIcon();
}
QWidget *PopupApplet::widget()
@ -129,35 +152,26 @@ QGraphicsWidget *PopupApplet::graphicsWidget()
void PopupApplet::constraintsEvent(Plasma::Constraints constraints)
{
if (constraints & Plasma::StartupCompletedConstraint) {
if (!d->icon) {
d->icon = new Plasma::Icon(KIcon("icons"), QString(), this);
}
d->layout = new QGraphicsLinearLayout(this);
d->layout->setContentsMargins(0, 0, 0, 0);
d->layout->setSpacing(0);
d->layout->setOrientation(Qt::Horizontal);
setAspectRatioMode(Plasma::ConstrainedSquare);
setLayout(d->layout);
connect(d->icon, SIGNAL(clicked()), this, SLOT(togglePopup()));
d->startupComplete = true;
}
//since we call this function when an extender's geometry gets updated, we want to avoid doing
//anything if the StartupCompletedConstraint hasn't been called yet.
if (!d->layout) {
if (!d->startupComplete) {
return;
}
if (constraints & Plasma::FormFactorConstraint) {
d->layout->removeAt(0);
QGraphicsLinearLayout *lay = dynamic_cast<QGraphicsLinearLayout *>(layout());
switch (formFactor()) {
case Plasma::Planar:
case Plasma::MediaCenter: {
if (d->icon) {
d->icon->hide();
}
if (constraints & Plasma::FormFactorConstraint) {
if (lay) {
lay->removeAt(0);
}
if ((formFactor() != Plasma::Vertical && formFactor() != Plasma::Horizontal) &&
d->icon) {
// we only switch to expanded if we aren't horiz/vert constrained and
// this applet has an icon.
// otherwise, we leave it up to the applet itself to figure it out
d->icon->hide();
if (d->savedAspectRatio != Plasma::InvalidAspectRatioMode) {
setAspectRatioMode(d->savedAspectRatio);
@ -178,24 +192,24 @@ void PopupApplet::constraintsEvent(Plasma::Constraints constraints)
QGraphicsWidget *gWidget = graphicsWidget();
if (gWidget) {
d->layout->addItem(gWidget);
if (lay) {
lay->addItem(gWidget);
}
setMinimumSize(gWidget->minimumSize() + marginSize);
gWidget->installEventFilter(this);
} else {
} else if (widget()) {
if (!d->proxy) {
d->proxy = new QGraphicsProxyWidget(this);
d->proxy->setWidget(widget());
d->proxy->show();
}
d->layout->addItem(d->proxy);
if (lay) {
lay->addItem(d->proxy);
}
setMinimumSize(widget() ? widget()->minimumSize() + marginSize : QSizeF(300, 200));
}
break;
}
case Plasma::Horizontal:
case Plasma::Vertical:
} else {
//save the aspect ratio mode in case we drag'n drop in the Desktop later
d->savedAspectRatio = aspectRatioMode();
setAspectRatioMode(Plasma::ConstrainedSquare);
@ -211,6 +225,7 @@ void PopupApplet::constraintsEvent(Plasma::Constraints constraints)
}
if (!d->dialog) {
kDebug() << "making dialog with view" << view();
d->dialog = new Plasma::Dialog();
//no longer use Qt::Popup since that seems to cause a lot of problem when you drag
@ -234,7 +249,7 @@ void PopupApplet::constraintsEvent(Plasma::Constraints constraints)
graphicsWidget()->setMinimumSize(gWidget->preferredSize());
d->dialog->setGraphicsWidget(gWidget);
}
} else {
} else if (widget()) {
QVBoxLayout *l_layout = new QVBoxLayout(d->dialog);
l_layout->setSpacing(0);
l_layout->setMargin(0);
@ -243,13 +258,34 @@ void PopupApplet::constraintsEvent(Plasma::Constraints constraints)
}
d->dialog->adjustSize();
d->layout->addItem(d->icon);
break;
if (d->icon && lay) {
lay->addItem(d->icon);
}
}
}
}
void PopupApplet::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if (!d->icon && event->buttons() == Qt::LeftButton) {
d->clicked = scenePos().toPoint();
event->setAccepted(true);
return;
} else {
Applet::mousePressEvent(event);
}
}
void PopupApplet::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
if (!d->icon && (d->clicked - scenePos().toPoint()).manhattanLength() < KGlobalSettings::dndEventDelay()) {
d->togglePopup();
} else {
Applet::mouseReleaseEvent(event);
}
}
bool PopupApplet::eventFilter(QObject *watched, QEvent *event)
{
if (watched == d->dialog && (event->type() == QEvent::WindowDeactivate)) {

View File

@ -55,17 +55,17 @@ public:
/**
* @arg icon the icon that has to be displayed when the applet is in a panel.
*/
void setIcon(const QIcon &icon);
void setPopupIcon(const QIcon &icon);
/**
* @arg icon the icon that has to be displayed when the applet is in a panel.
*/
void setIcon(const QString &iconName);
void setPopupIcon(const QString &iconName);
/**
* @return the icon that is displayed when the applet is in a panel.
*/
QIcon icon() const;
QIcon popupIcon() const;
/**
* Implement either this function or graphicsWidget().
@ -108,6 +108,8 @@ public Q_SLOTS:
protected:
void constraintsEvent(Plasma::Constraints constraints);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
bool eventFilter(QObject *watched, QEvent *event);
QVariant itemChange(GraphicsItemChange change, const QVariant &value);