Grouping support in containments

Giulio Camuffo giuliocamuffo at gmail.com
Tue Oct 20 21:53:42 CEST 2009


Hi plasma devs!

Some of you may know recently i've tried in many ways to group applets visually 
inside the containment. I tried to embed applets in applets but it brought many 
problems, then containment in qgraphicsproxywidget in applet in containment but it 
brought other problems.

Then i started working with an other approach: i wrote a subclass of Plasma::Applet, 
AbstractGroup, that is the base class for all the GroupApplets. it has some functions 
such as 
- assignApplet(Plasma::Applet)
- layoutApplet(Plasma::Applet)
- saveAppletLayoutInfo(Plasma::Applet *applet, const KConfigGroup &group)
- restoreAppletLayoutInfo(Plasma::Applet *applet, const KConfigGroup &group)

Then i created a desktop containment and reimplemented some things:
- when an applet is added it checks if its pos() is contained in some group 
geometry() and in the case it calls group->assignApplet(applet)

- reimplemented saveContents so that for each applet if it is managed by a group it 
saves an entry Group=group_id in the applet's config and calls 
group->saveAppletLayoutInfo(applet, kconfiggroup)

- reimplemented restoreContents so that it reads the Group entry and calls 
group->assignAppelt(applet) and group->restoreAppletLayoutInfo(applet, kconfiggroup)

in saveAppletLayoutInfo the group creates a KConfigGroup (that is [Applets][id]
[GroupInformation]) and inside it it writes config specified to that one group. so, 
e.g, i wrote a grid group so it saves row and column, but one could write a stack 
group so it saves the index.
restoreAppletLayoutInfo obviously does the contrary.

the configuration of a group is saved under [Containment][id][Groups][id], so that the 
containment doesn't risk to confuse between groups and simple applets.


Now i hope i've explained myself and i'm asking you: what should i do with this?
I was thinking between two possibilities: should i merge this with 
Plasma::Containment? Please note that the containment doesn't know *anything* about 
how the groups manage the applets inside them. it knows only if they are grouped and, 
in the case, the id of their group. nor the applets knows anything about how they are 
arranged. It is all done internally in the groups.
Or should i write a subclass of Containment that has group support so one could use 
this to write a desktop or panel with grouping support?

I'd aim at the first one choice, because it would add little more complexity in the 
containment code but, on the other hand, all the containments would have this support 
for free.

you can find the code in playground/base/plasma/containments/groupingdesktop/

What do you think?

Giulio.


More information about the Plasma-devel mailing list