Move children together with their group when the group gets moved, and add a group convenience function to extender to avoid needing all those casts from extenderitem to extendergroup. Plus some minor code cleanups.
svn path=/trunk/KDE/kdelibs/; revision=959604
This commit is contained in:
parent
ebcc06e25f
commit
a5c48ddc4f
12
extender.cpp
12
extender.cpp
@ -170,6 +170,11 @@ ExtenderItem *Extender::item(const QString &name) const
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ExtenderGroup *Extender::group(const QString &name) const
|
||||||
|
{
|
||||||
|
return qobject_cast<ExtenderGroup*>(item(name));
|
||||||
|
}
|
||||||
|
|
||||||
bool Extender::hasItem(const QString &name) const
|
bool Extender::hasItem(const QString &name) const
|
||||||
{
|
{
|
||||||
if (item(name)) {
|
if (item(name)) {
|
||||||
@ -177,7 +182,8 @@ bool Extender::hasItem(const QString &name) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
//if item(name) returns false, that doesn't mean that the item doesn't exist, just that it has
|
//if item(name) returns false, that doesn't mean that the item doesn't exist, just that it has
|
||||||
//not been instantiated yet.
|
//not been instantiated yet. check to see if there's mention of this item existing in the
|
||||||
|
//plasma config's section DetachedExtenderItems
|
||||||
Corona *corona = qobject_cast<Corona*>(scene());
|
Corona *corona = qobject_cast<Corona*>(scene());
|
||||||
KConfigGroup extenderItemGroup(corona->config(), "DetachedExtenderItems");
|
KConfigGroup extenderItemGroup(corona->config(), "DetachedExtenderItems");
|
||||||
foreach (const QString &extenderItemId, extenderItemGroup.groupList()) {
|
foreach (const QString &extenderItemId, extenderItemGroup.groupList()) {
|
||||||
@ -340,13 +346,17 @@ void Extender::dropEvent(QGraphicsSceneDragDropEvent *event)
|
|||||||
void Extender::itemAddedEvent(ExtenderItem *item, const QPointF &pos)
|
void Extender::itemAddedEvent(ExtenderItem *item, const QPointF &pos)
|
||||||
{
|
{
|
||||||
if (pos == QPointF(-1, -1)) {
|
if (pos == QPointF(-1, -1)) {
|
||||||
|
//if just plain adding an item, add it at a sane position:
|
||||||
if (!item->group()) {
|
if (!item->group()) {
|
||||||
if (appearance() == BottomUpStacked) {
|
if (appearance() == BottomUpStacked) {
|
||||||
|
//at the top
|
||||||
d->layout->insertItem(0, item);
|
d->layout->insertItem(0, item);
|
||||||
} else {
|
} else {
|
||||||
|
//at the bottom
|
||||||
d->layout->addItem(item);
|
d->layout->addItem(item);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
//at the top in the group it belongs to
|
||||||
d->layout->insertItem(d->insertIndexFromPos(item->group()->pos()) + 1, item);
|
d->layout->insertItem(d->insertIndexFromPos(item->group()->pos()) + 1, item);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -138,6 +138,13 @@ class PLASMA_EXPORT Extender : public QGraphicsWidget
|
|||||||
*/
|
*/
|
||||||
ExtenderItem *item(const QString &name) const;
|
ExtenderItem *item(const QString &name) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extra convenience function for obtaining groups specified by name. This will avoid needed
|
||||||
|
* to call item and casting to ExtenderGroup, which is otherwise quite common.
|
||||||
|
* @returns the requested group
|
||||||
|
*/
|
||||||
|
ExtenderGroup *group(const QString &name) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function can be used for easily determining if a certain item is already displayed
|
* This function can be used for easily determining if a certain item is already displayed
|
||||||
* in an extender item somewhere, so your applet doesn't duplicate this item. This is needed
|
* in an extender item somewhere, so your applet doesn't duplicate this item. This is needed
|
||||||
|
@ -68,8 +68,8 @@ ExtenderGroup::ExtenderGroup(Extender *parent, uint groupId)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (items().isEmpty() && d->autoHide && !isDetached()) {
|
if (items().isEmpty() && d->autoHide && !isDetached()) {
|
||||||
hide();
|
|
||||||
extender()->itemRemovedEvent(this);
|
extender()->itemRemovedEvent(this);
|
||||||
|
hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
connect(Plasma::Theme::defaultTheme(), SIGNAL(themeChanged()),
|
connect(Plasma::Theme::defaultTheme(), SIGNAL(themeChanged()),
|
||||||
@ -101,9 +101,9 @@ bool ExtenderGroup::autoHide() const
|
|||||||
void ExtenderGroup::setAutoHide(bool autoHide)
|
void ExtenderGroup::setAutoHide(bool autoHide)
|
||||||
{
|
{
|
||||||
d->autoHide = autoHide;
|
d->autoHide = autoHide;
|
||||||
if (autoHide && items().count() < 2) {
|
if (autoHide && items().isEmpty()) {
|
||||||
hide();
|
|
||||||
extender()->itemRemovedEvent(this);
|
extender()->itemRemovedEvent(this);
|
||||||
|
hide();
|
||||||
} else if (!autoHide && !isVisible()) {
|
} else if (!autoHide && !isVisible()) {
|
||||||
extender()->itemAddedEvent(this);
|
extender()->itemAddedEvent(this);
|
||||||
show();
|
show();
|
||||||
@ -151,41 +151,27 @@ ExtenderGroupPrivate::~ExtenderGroupPrivate()
|
|||||||
void ExtenderGroupPrivate::addItemToGroup(Plasma::ExtenderItem *item)
|
void ExtenderGroupPrivate::addItemToGroup(Plasma::ExtenderItem *item)
|
||||||
{
|
{
|
||||||
if (item->group() == q) {
|
if (item->group() == q) {
|
||||||
int itemCount = q->items().count();
|
if (!q->isVisible() && !q->items().isEmpty()) {
|
||||||
if (collapsed && !(autoHide && itemCount == 1)) {
|
q->extender()->itemAddedEvent(q);
|
||||||
//the group is collapsed, so hide the new item unless there's only one item and autohide
|
q->show();
|
||||||
//is true, in which case we hide this group, and not the item in it.
|
}
|
||||||
|
if (collapsed) {
|
||||||
q->extender()->itemRemovedEvent(item);
|
q->extender()->itemRemovedEvent(item);
|
||||||
item->hide();
|
item->hide();
|
||||||
} else {
|
} else {
|
||||||
//the group isn't collapsed so show and readd this item to the extender, which takes
|
|
||||||
//care of placing the new item directly under the group widget.
|
|
||||||
q->extender()->itemAddedEvent(item);
|
q->extender()->itemAddedEvent(item);
|
||||||
item->show();
|
item->show();
|
||||||
}
|
}
|
||||||
if (!q->isVisible() && (itemCount > 1 || !autoHide)) {
|
|
||||||
//show the group if needed, depending on autoHide policy.
|
|
||||||
q->extender()->itemAddedEvent(q);
|
|
||||||
q->show();
|
|
||||||
if (collapsed) {
|
|
||||||
q->extender()->itemRemovedEvent(q->items().first());
|
|
||||||
q->items().first()->hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExtenderGroupPrivate::removeItemFromGroup(Plasma::ExtenderItem *item)
|
void ExtenderGroupPrivate::removeItemFromGroup(Plasma::ExtenderItem *item)
|
||||||
{
|
{
|
||||||
if (item->group() == q) {
|
if (item->group() == q) {
|
||||||
if (q->items().count() < 2 && autoHide && !q->isDetached()) {
|
if (q->items().isEmpty() && autoHide && !q->isDetached()) {
|
||||||
q->extender()->itemRemovedEvent(q);
|
q->extender()->itemRemovedEvent(q);
|
||||||
q->hide();
|
q->hide();
|
||||||
}
|
}
|
||||||
if (q->items().count() == 1 && autoHide) {
|
|
||||||
q->extender()->itemAddedEvent(q->items().first());
|
|
||||||
q->items().first()->show();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,6 +188,12 @@ void ExtenderItem::setWidget(QGraphicsItem *widget)
|
|||||||
widget->setPos(QPointF(d->bgLeft + d->dragLeft, panelSize.height() + d->bgTop));
|
widget->setPos(QPointF(d->bgLeft + d->dragLeft, panelSize.height() + d->bgTop));
|
||||||
d->widget = widget;
|
d->widget = widget;
|
||||||
d->updateSizeHints();
|
d->updateSizeHints();
|
||||||
|
|
||||||
|
/**
|
||||||
|
if (isGroup() && !isVisible()) {
|
||||||
|
widget->hide();
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
QGraphicsItem *ExtenderItem::widget() const
|
QGraphicsItem *ExtenderItem::widget() const
|
||||||
@ -284,10 +290,24 @@ Extender *ExtenderItem::extender() const
|
|||||||
|
|
||||||
void ExtenderItem::setGroup(ExtenderGroup *group)
|
void ExtenderItem::setGroup(ExtenderGroup *group)
|
||||||
{
|
{
|
||||||
|
if (isGroup()) {
|
||||||
|
//nesting extender groups is just insane. I don't think we'd even want to support that.
|
||||||
|
kWarning() << "Nesting ExtenderGroups is not supported";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
d->group = group;
|
d->group = group;
|
||||||
config().writeEntry("group", group->name());
|
|
||||||
if (!group->isDetached()) {
|
if (group) {
|
||||||
|
config().writeEntry("group", group->name());
|
||||||
|
//TODO: move to another extender if the group we set is actually detached.
|
||||||
|
if (group->extender() != extender()) {
|
||||||
|
kDebug() << "moving to another extender because we're joining a detached group.";
|
||||||
|
setExtender(group->extender());
|
||||||
|
}
|
||||||
group->d->addItemToGroup(this);
|
group->d->addItemToGroup(this);
|
||||||
|
} else {
|
||||||
|
config().deleteEntry("group");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -563,6 +583,15 @@ void ExtenderItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ExtenderGroup *group = qobject_cast<ExtenderGroup*>(this);
|
||||||
|
QList<ExtenderItem*> childItems;
|
||||||
|
bool collapsedGroup;
|
||||||
|
if (isGroup()) {
|
||||||
|
collapsedGroup = group->d->collapsed;
|
||||||
|
group->collapseGroup();
|
||||||
|
childItems = group->items();
|
||||||
|
}
|
||||||
|
|
||||||
//and execute the drag.
|
//and execute the drag.
|
||||||
QWidget *dragParent = extender()->d->applet->view();
|
QWidget *dragParent = extender()->d->applet->view();
|
||||||
QDrag *drag = new QDrag(dragParent);
|
QDrag *drag = new QDrag(dragParent);
|
||||||
@ -578,6 +607,18 @@ void ExtenderItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
|
|||||||
d->extender->itemAddedEvent(this, curPos);
|
d->extender->itemAddedEvent(this, curPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//invoke setGroup on all items belonging to this group, to make sure all children move to the
|
||||||
|
//new extender together with the group.
|
||||||
|
if (isGroup()) {
|
||||||
|
foreach (ExtenderItem *item, childItems) {
|
||||||
|
item->setGroup(group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isGroup() && !collapsedGroup) {
|
||||||
|
group->expandGroup();
|
||||||
|
}
|
||||||
|
|
||||||
d->dragStarted = false;
|
d->dragStarted = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,7 +173,8 @@ class PLASMA_EXPORT ExtenderItem : public QGraphicsWidget
|
|||||||
Extender *extender() const;
|
Extender *extender() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param group the group you want this item to belong to.
|
* @param group the group you want this item to belong to. Note that you can't nest
|
||||||
|
* ExtenderGroups.
|
||||||
* @since 4.3
|
* @since 4.3
|
||||||
*/
|
*/
|
||||||
void setGroup(ExtenderGroup *group);
|
void setGroup(ExtenderGroup *group);
|
||||||
|
Loading…
Reference in New Issue
Block a user