1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
Bug with toolbars: a->saveState(); delete a; b->saveState(); delete b;
will store wrong positions (index, offset and newline).
When removing an xmlgui-client involves destroying toolbars, we need to save the
whole set of toolbar positions of the mainwindow, into the xmlgui-client.
Data structure:
struct KToolBarPos {
short int index;
short int offset;
bool newLine;
};
typedef QValueVector<KToolBarPos> KToolBarPosList;
API:
KToolBarPosList KMainWindow::toolBarPositionList() const;
The remaining problem is to know when to call it:
* when we know in advance that we'll be able to remove toolbars?
(when creating the client we could remember if we created a toolbar and store
that bit of information, to re-use it when removing the client again)
* when removing the first toolbar (of a given client); then we need
to differentiate between first and following toolbars
* always, if fast enough? With tons of plugins that might not be a good idea.
========== More long term
Problems:
* No ui_standards.rc merging for parts
* Confusing tag names (MergeLocal vs DefineGroup) for similar features
* Two different merging codes (DOM-tree merging for ui_standards, xmlguifactory merging
between xmlguiclients).
Solution:
* Get rid of the custom DOM-tree merging code from kxmlguiclient (for ui_standards.rc),
use the existing merging code from kxmlguifactory instead
* MergeLocal and DefineGroup are renamed MergeGroup, and append= becomes equivalent to group=.
* Action is renamed MergeAction, and uses a new kind of place holder
(one that matches actions by name during merging)
So ui_standards.rc needs to be turned into <MergeAction>s and <MergeGroup>s only.
* This also means that it will be possible to have only merge tags (and custom items
like separators and tearoffhandle etc.) in a container, in which case it should
not appear in the GUI. For that, ContainerNode must be improved so that it supports
having no real GUI container attached to it.
Big problem here. This means not building a container until we find that it
really has an action (and the other way round: deleting a container when
removing its last action, as we do, but still keeping a ContainerNode around...)
(A ContainerNode is destroyed when its owner guiclient is removed from the factory,
no change here).
* A new XMLGUIClient provides the ui_standards.rc XML. It has the same instance
as the mainwindow's guiclient. It provides no actions. No problems, since it
only has <Merge*> tags.
But that new xmlguiclient will 'own' the containers, so KEditToolbar will
give wrong information.
=====>
This means the following KEditToolbar improvement is necessary:
(it's an almost unrelated and necessary change there anyway, usability-wise)
It would use merging, to present a merged view of the toolbars
When the user inserts an action to a toolbar, we know which client the action
belongs to, so we know which XML file to modify.
BUT if the user adds actions in non-contiguous positions, we need to
create <DefineGroup name="client1_tmp1"> groups, so that the merging actually does
what the user asked for (!!)
This allows to get rid of the "toolbar <client>" combobox stuff, and just have
a list of toolbars there.
Implementation: it can do this by providing its own KXMLGUIBuilder, to a
new factory. The guiclients would be wrapped in a KXMLGUIClientProxy,
which would forward the action() and domElement() calls - because a client
can be in only one factory at a time.
This custom builder needs to know about action plugging too, we don't really want
to call KAction::plug here. So this would be 'virtualized' (new virtual, in a new
interface to keep BC, that by default calls plug, but does something else in
kedittoolbar's builder).
======
Additional benefits:
* Any XML file can use the new <MergeAction> feature to modify the way a
child client (e.g. a part) is getting merged, without adding group attributes
to the child client (useful for a binary-only one, e.g.)
--
David Faure <[email protected]>
Simon Hausmann <[email protected]>
|