0.4!
La principale novità della 0.4 rispetto alla 0.3 è l'introduzione dei menu. Certo, anche la correzione di alcuni bug (chiamarli così è riduttivo) è importante, ma l'introduzione dei menu è quel che mi ha portato ancora avanti nello studio di mui.
Vediamo...
Ovviamente tutti sappiamo cosa siano i menu in un programma: sono quelle liste di alimenti cucinati più o meno male a cui è associato un prezzo più o meno spropositato. Ennò... non è proprio così!
I menu sono uno degli elementi fondamentali dei sistemi operativi a finestre e, anzi, a volte la posizione, il comportamento degli stessi definisce un pò tutto l'aspetto del sistema operativo.
Prendete per esempio i vari sistemi amigoidi: tutti hanno la barra dei menu in alto con menu che si sviluppano verso il basso da sinistra verso destra. Stessa storia per i sistemi apple o per windows fino alla 3.x. Da win 9x in poi (ma già su nt) la barra menu principale è posta in basso e si sviluppa verso l'alto.
Un'altra caratteristica peculiare dei sistemi amiga (e dei sistemi apple...) è che i programmi non hanno menu perennemente visibili ma divengono visibili con la pressione del tasto destro del mouse. In windows invece ogni programma ha la barra menu che fa parte della finestra del programma stesso ed è sempre visibile. Anche se a vedere windows 7 le cose stanno cambiando anche lì (prendete office o ie9).
Ritorniamo ad amiga:
Su amiga (eventualmente anche per MUI) per poter usare dei menu in un programma bisogna definire una struttura NewMenu che contiene tutti i dati necessari per il comportamento dei menu del programma.
L'insieme di tutti i menu del programma vengono chiamati "menu strip". Tradotto letteralmente significa striscia di menu: se teniamo presente come è strutturato un insieme di menu, cioè l'uno affianco all'altro con i propri sottomenu, la definizione di striscia è visivamente azzeccata.
Quindi abbiamo questa striscia di menu. Composta di menu. I quali a loro volta sono composti di elementi singoli o di ulteriori sottomenu:
MENUSTRIP
-MENU1
---MENUITEM1.1
---MENUITEM1.2
---SUBMENU1.3
------MENUITEM1.3.1
------MENUITEM1.3.2
-MENU2
---MENUITEM2.1
---SUBMENU2.2
-----MENUITEM2.2.1
-----MENUITEM2.2.2
-----MENUITEM2.2.3
---MENUITEM2.3
Quello precedente è lo schema di una menustrip con due menu principali (menu1 e menu2),
Menu1 ha due elementi (item) menuitem1.1 e menuitem1.2, nonchè un sottomenu (submenu1.3).
Submenu1.3 ha due elementi menuitem1.3.1 e menuitem1.3.2.
Lo stesso vale per menu2.
P.S. la numerazione è qualcosa di messo da me e non fa parte nè del linguaggio nè di niente, serve solo per "dividere" i menu logicamente sulla carta. Ma non è imperativa.
In MUI la classe Menustrip (la barra menu) è una sottoclasse (sottoinsieme) della classe family. Dalla definizione che ne da Stuntz (per i nuovi arrivati è il creatore di MUI) las family.class è la classe di base per tutti quegli oggetti capaci di gestire liste di "oggetti figli". E se ci riflettiamo un menu ha nelle sue voci e nei suoi sottomenu, figuratamente, dei figli.
Tanto per iniziare MUI permette di definire una barra menu per l'applicazione o per la singola finestra. Quindi potremo avere un'applicazione composta da due finestre separate che ha due menustrip separate.
Un altro attributo fondamentale per le menustrip è MUIA_Menustrip_Enabled: booleano. Se settato a true la barra menu è attiva (enabled) altrimenti risulta disattivata.
Questo viene stabilito in fase di creazione della menustrip usando i seguenti attributi:
MUIA_Application_Menustrip
MUIA_Window_Menustrip
La prima, come si intuisce creerà una barra menu globale all'applicazione mentre la seconda riga creerà una barra menu relativa alla singola finestra nella quale sarà referenziata.
In rebulator ho usato la MUIA_Application_Menustrip ma vale anche per la MUIA_Window_Menustrip.
La riga
MUIA_Application_Menustrip, (IPTR) (MenustripObject,
crea le basi dell'oggetto MenuStrip.
Nello specifico MenuStripObject è una define (contenuta come al solito in mui.h).
Riporto di seguito le quattro define che riguardano i menu
#define MenustripObject MUI_NewObject(MUIC_Menustrip
#define MenuObject MUI_NewObject(MUIC_Menu
#define MenuObjectT(name) MUI_NewObject(MUIC_Menu,MUIA_Menu_Title,name
#define MenuitemObject MUI_NewObject(MUIC_Menuitem