|
Graphics.UI.Gtk.ActionMenuToolbar.UIManager | Portability | portable (depends on GHC) | Stability | provisional | Maintainer | gtk2hs-users@lists.sourceforge.net |
|
|
|
|
|
Description |
Constructing menus and toolbars from an XML description
- Module available since Gtk+ version 2.4
|
|
Synopsis |
|
|
|
|
Detail
|
|
A UIManager constructs a user interface (menus and toolbars) from one
or more UI definitions, which reference actions from one or more action
groups.
|
|
UI Definitions
|
|
The UI definitions are specified in an XML format which can be roughly
described by the following DTD.
<!ELEMENT ui (menubar|toolbar|popup|accelerator)* >
<!ELEMENT menubar (menuitem|separator|placeholder|menu)* >
<!ELEMENT menu (menuitem|separator|placeholder|menu)* >
<!ELEMENT popup (menuitem|separator|placeholder|menu)* >
<!ELEMENT toolbar (toolitem|separator|placeholder)* >
<!ELEMENT placeholder (menuitem|toolitem|separator|placeholder|menu)* >
<!ELEMENT menuitem EMPTY >
<!ELEMENT toolitem EMPTY >
<!ELEMENT separator EMPTY >
<!ELEMENT accelerator EMPTY >
<!ATTLIST menubar name #IMPLIED
action #IMPLIED >
<!ATTLIST toolbar name #IMPLIED
action #IMPLIED >
<!ATTLIST popup name #IMPLIED
action #IMPLIED >
<!ATTLIST placeholder name #IMPLIED
action #IMPLIED >
<!ATTLIST separator name #IMPLIED
action #IMPLIED >
<!ATTLIST menu name #IMPLIED
action #REQUIRED
position (top|bot) #IMPLIED >
<!ATTLIST menuitem name #IMPLIED
action #REQUIRED
position (top|bot) #IMPLIED >
<!ATTLIST toolitem name #IMPLIED
action #REQUIRED
position (top|bot) #IMPLIED >
<!ATTLIST accelerator name #IMPLIED
action #REQUIRED >
There are some additional restrictions beyond those specified in the DTD,
e.g. every toolitem must have a toolbar in its anchestry and every menuitem
must have a menubar or popup in its anchestry. Since a GMarkup
parser is used to parse the UI description, it must not
only be valid XML, but valid GMarkup.
If a name is not specified, it defaults to the action. If an action is
not specified either, the element name is used. The name and action
attributes must not contain '/' characters after parsing (since that
would mess up path lookup) and must be usable as XML attributes when
enclosed in doublequotes, thus they must not '"' characters or references
to the " entity.
|
|
A UI definition
|
|
<ui>
<menubar>
<menu name="FileMenu" action="FileMenuAction">
<menuitem name="New" action="New2Action" />
<placeholder name="FileMenuAdditions" />
</menu>
<menu name="JustifyMenu" action="JustifyMenuAction">
<menuitem name="Left" action="justify-left"/>
<menuitem name="Centre" action="justify-center"/>
<menuitem name="Right" action="justify-right"/>
<menuitem name="Fill" action="justify-fill"/>
</menu>
</menubar>
<toolbar action="toolbar1">
<placeholder name="JustifyToolItems">
<separator/>
<toolitem name="Left" action="justify-left"/>
<toolitem name="Centre" action="justify-center"/>
<toolitem name="Right" action="justify-right"/>
<toolitem name="Fill" action="justify-fill"/>
<separator/>
</placeholder>
</toolbar>
</ui>
|
|
UI Merging
|
|
The most remarkable feature of UIManager is that it can overlay a set
of menuitems and toolitems over another one, and demerge them later.
Merging is done based on the names of the XML elements. Each element is
identified by a path which consists of the names of its anchestors,
separated by slashes. For example, the menuitem named "Left" in the
example above has the path /ui/menubar/JustifyMenu/Left and the
toolitem with the same name has path
/ui/toolbar1/JustifyToolItems/Left.
|
|
Accelerators
|
|
Every action has an accelerator path. Accelerators are installed together
with menuitem proxies, but they can also be explicitly added with
<accelerator> elements in the UI definition. This makes it possible to have
accelerators for actions even if they have no visible proxies.
|
|
Smart Separators
|
|
The separators created by UIManager are "smart", i.e. they do not
show up in the UI unless they end up between two visible menu or tool items.
Separators which are located at the very beginning or end of the menu or
toolbar containing them, or multiple separators next to each other, are
hidden. This is a useful feature, since the merging of UI elements from
multiple sources can make it hard or impossible to determine in advance
whether a separator will end up in such an unfortunate position.
|
|
Empty Menus
|
|
Submenus pose similar problems to separators inconnection with merging.
It is impossible to know in advance whether they will end up empty after
merging. UIManager offers two ways to treat empty submenus:
- make them disappear by hiding the menu item they're attached to
- add an insensitive "Empty" item
The behaviour is chosen based on the "is_important" property of the
action to which the submenu is associated.
|
|
Class Hierarchy
|
|
| GObject
| +----UIManager
|
|
Types
|
|
data UIManager |
Instances | |
|
|
class GObjectClass o => UIManagerClass o |
| Instances | |
|
|
castToUIManager :: GObjectClass obj => obj -> UIManager |
|
data UIManagerItemType |
These enumeration values are used by uiManagerAddUi to determine what UI
element to create.
| Constructors | UiManagerAuto | | UiManagerMenubar | | UiManagerMenu | | UiManagerToolbar | | UiManagerPlaceholder | | UiManagerPopup | | UiManagerMenuitem | | UiManagerToolitem | | UiManagerSeparator | | UiManagerAccelerator | |
| Instances | |
|
|
data MergeId |
|
|
Constructors
|
|
uiManagerNew :: IO UIManager |
Creates a new ui manager object.
|
|
Methods
|
|
uiManagerSetAddTearoffs |
:: UIManager | | -> Bool | addTearoffs - whether tearoff menu items are added
| -> IO () | | Sets the "add_tearoffs" property, which controls whether menus
generated by this UIManager will have tearoff menu items.
Note that this only affects regular menus. Generated popup menus never
have tearoff menu items.
|
|
|
uiManagerGetAddTearoffs |
:: UIManager | | -> IO Bool | returns whether tearoff menu items are added
| Returns whether menus generated by this UIManager will have tearoff
menu items.
|
|
|
uiManagerInsertActionGroup |
:: UIManager | | -> ActionGroup | actionGroup - the action group to be inserted
| -> Int | pos - the position at which the group will be inserted.
| -> IO () | | Inserts an action group into the list of action groups associated with
self. Actions in earlier groups hide actions with the same name in later
groups.
|
|
|
uiManagerRemoveActionGroup |
:: UIManager | | -> ActionGroup | actionGroup - the action group to be removed
| -> IO () | | Removes an action group from the list of action groups associated with
self.
|
|
|
uiManagerGetActionGroups :: UIManager -> IO [ActionGroup] |
Returns the list of action groups associated with the UI manager.
|
|
uiManagerGetAccelGroup |
|
|
uiManagerGetWidget |
:: UIManager | | -> String | path - a path
| -> IO (Maybe Widget) | returns the widget found by following the path, or
Nothing if no widget was found.
| Looks up a widget by following a path. The path consists of the names
specified in the XML description of the UI. separated by '/'. Elements
which don't have a name or action attribute in the XML (e.g. <popup>) can
be addressed by their XML element name (e.g. "popup"). The root element
("/ui") can be omitted in the path.
Note that the widget found by following a path that ends in a <menu>
element is the menuitem to which the menu is attached, not the menu itself.
|
|
|
uiManagerGetToplevels |
|
|
uiManagerGetAction |
:: UIManager | | -> String | path - a path
| -> IO (Maybe Action) | returns the action whose proxy widget is found by
following the path, or Nothing if no widget was
found.
| Looks up an action by following a path. See uiManagerGetWidget for more
information about paths.
|
|
|
uiManagerAddUiFromString |
:: UIManager | | -> String | buffer - the string to parse
| -> IO MergeId | returns The merge id for the merged UI. The merge id can be
used to unmerge the UI with uiManagerRemoveUi.
| Parses a string containing a UI definition and merges it with the current
contents of self. An enclosing <ui> element is added if it is missing.
If a parse error occurres, an exception is thrown.
|
|
|
uiManagerAddUiFromFile |
:: UIManager | | -> String | filename - the name of the file to parse
| -> IO MergeId | returns The merge id for the merged UI. The merge id can be
used to unmerge the UI with uiManagerRemoveUi.
| Parses a file containing a UI definition and merges it with the current
contents of self.
If a parse or IO error occurres, an exception is thrown.
|
|
|
uiManagerNewMergeId :: UIManager -> IO MergeId |
Returns an unused merge id, suitable for use with uiManagerAddUi.
|
|
uiManagerAddUi |
:: UIManager | | -> MergeId | mergeId - the merge id for the merged UI, see
uiManagerNewMergeId
| -> String | path - a path
| -> String | name - the name for the added UI element
| -> Maybe String | action - the name of the action to be proxied,
or Nothing to add a separator
| -> [UIManagerItemType] | type - the type of UI element to add.
| -> Bool | top - if True, the UI element is added before
its siblings, otherwise it is added after its
siblings.
| -> IO () | | Adds a UI element to the current contents of self.
If type is UiManagerAuto, Gtk+ inserts a menuitem, toolitem or
separator if such an element can be inserted at the place determined by
path. Otherwise type must indicate an element that can be inserted at
the place determined by path.
|
|
|
uiManagerRemoveUi |
|
|
uiManagerGetUi |
:: UIManager | | -> IO String | returns string containing an XML representation of the
merged UI.
| Creates a UI definition of the merged UI.
|
|
|
uiManagerEnsureUpdate :: UIManager -> IO () |
Makes sure that all pending updates to the UI have been completed.
This may occasionally be necessary, since UIManager updates the UI in
an idle function. A typical example where this function is useful is to
enforce that the menubar and toolbar have been added to the main window
before showing it:
do
containerAdd window vbox
onAddWidget merge (addWidget vbox)
uiManagerAddUiFromFile merge "my-menus"
uiManagerAddUiFromFile merge "my-toolbars"
uiManagerEnsureUpdate merge
widgetShow window
|
|
Attributes
|
|
uIManagerAddTearoffs :: Attr UIManager Bool |
The "add-tearoffs" property controls whether generated menus have
tearoff menu items.
Note that this only affects regular menus. Generated popup menus never
have tearoff menu items.
Default value: False
|
|
Signals
|
|
onAddWidget :: UIManagerClass self => self -> (Widget -> IO ()) -> IO (ConnectId self) |
The add_widget signal is emitted for each generated menubar and toolbar.
It is not emitted for generated popup menus, which can be obtained by
uiManagerGetWidget.
|
|
afterAddWidget :: UIManagerClass self => self -> (Widget -> IO ()) -> IO (ConnectId self) |
|
onActionsChanged :: UIManagerClass self => self -> IO () -> IO (ConnectId self) |
The "actions-changed" signal is emitted whenever the set of actions
changes.
|
|
afterActionsChanged :: UIManagerClass self => self -> IO () -> IO (ConnectId self) |
|
onConnectProxy :: UIManagerClass self => self -> (Action -> Widget -> IO ()) -> IO (ConnectId self) |
The connect_proxy signal is emitted after connecting a proxy to an action
in the group.
This is intended for simple customizations for which a custom action
class would be too clumsy, e.g. showing tooltips for menuitems in the
statusbar.
|
|
afterConnectProxy :: UIManagerClass self => self -> (Action -> Widget -> IO ()) -> IO (ConnectId self) |
|
onDisconnectProxy :: UIManagerClass self => self -> (Action -> Widget -> IO ()) -> IO (ConnectId self) |
The disconnect_proxy signal is emitted after disconnecting a proxy from
an action in the group.
|
|
afterDisconnectProxy :: UIManagerClass self => self -> (Action -> Widget -> IO ()) -> IO (ConnectId self) |
|
onPreActivate :: UIManagerClass self => self -> (Action -> IO ()) -> IO (ConnectId self) |
The pre_activate signal is emitted just before the action is activated.
This is intended for applications to get notification just before any
action is activated.
|
|
afterPreActivate :: UIManagerClass self => self -> (Action -> IO ()) -> IO (ConnectId self) |
|
onPostActivate :: UIManagerClass self => self -> (Action -> IO ()) -> IO (ConnectId self) |
The post_activate signal is emitted just after the action is activated.
This is intended for applications to get notification just after any
action is activated.
|
|
afterPostActivate :: UIManagerClass self => self -> (Action -> IO ()) -> IO (ConnectId self) |
|
Produced by Haddock version 0.7 |