Le 28/11/2012 10:03, Torsten Bergmann a écrit :
Can anyone point me to a spec example
with a (context) menu with icons and
where we can enable/disable specific
menue items depending on state?


I'm not sure there is anything Spec specific in menus doing that but...

A source for doing what you want is available in the OmniBrowser (Pharo 1.4). I reused a simplified version of that code in the Alt Browser in Pharo 2.0; if you browse around version 40, it is linked to a Spec-built interface.

The example goes like that :

A menu command object answer the following methods:
>>isActive (in the menu or not in the menu)
>>isEnabled (greyed out in the menu)
>>execute (the command to execute when selected)
>>icon (the icon symbol name)
>>label (the text of the menu item)
>>keyString (if you want to add a keymapping shortcut as well, it lists itself in the menu).

Building a menu item is then the following, once you get the menu given to you by the widget :

buildTreeMenu: aMenu on: aTarget

...
self isActive ifTrue: [
        (aMenu add: self label target: self selector: #execute)
                enablementSelector: #isEnabled;
                icon: (self icon notNil
                        ifTrue: [ UITheme current perform: self icon ]
                        ifFalse: [ nil ]);
                keyText: self keyString ]
...

When you create your Spec GUI, you ask the widget model to give you the menu before showing it to the user (this is in initializePresenter)

textModel menu: [:aMenu :aTarget | self buildMenu: aMenu on: aTarget ]

The resulting menu will look like the picture in attachment.

Note: This is with a fairly old version of Spec. Newer versions may have changed the way to get the menu from the widget model.

Note 2: Since the menu is built each time the user asks for it then its easy to have a menu which depends on the state of the application (the type of selected item, etc...)

Thierry
--
Thierry Goubier
CEA list
Laboratoire des Fondations des Systèmes Temps Réel Embarqués
91191 Gif sur Yvette Cedex
France
Phone/Fax: +33 (0) 1 69 08 32 92 / 83 95

<<attachment: Capture du 2012-11-29 15:45:34.png>>

Reply via email to