CocoaExt

Kommentare anzeigen Worklog abonnieren
Gehe zu Seite Zurück  1, 2, 3, 4, 5

Worklogs CocoaExt

NSToolbarItem #2

Samstag, 11. Juli 2009 von d-bug
So quasi aus Spaß an der Freude hab ich mich eben noch mal mit den ToolbarItems auseinander gesetzt. Es fehlen ja ohnehin noch ein paar Features, die ich jetzt Stück für Stück nachreichen werde:

Also kommen wir noch mal zurück auf die normalen, userspezifischen Items:

Aufruf:
BlitzMax: [AUSKLAPPEN]
Global TBMyItem:String = AddCocoaToolbarItem (Toolbar, Name, Tooltip, Icon, IsDefault, IsSelectable)


Neues:
der Bool IsSelectable ist neu! Setzt man diesen auf True, so wird das Item ein Verhalten an den Tag legen, als wäre es ein RadioButton, oder ein Tab. Man kann unter Leopard dieses Verhalten am besten studieren, wenn man mal das Preferences-Panel von Safari öffnet. Natürlich funktioniert das nur richtig, wenn man mehrere dieser Items in der Toolbar hat.

Event:
Statt des üblichen EVENT_GADGETACTION Events wirft das Item im Selectable-Modus jetzt ein EVENT_GADGETSELECT aus wenn es selektiert wurde.
Code: [AUSKLAPPEN]
GadgetSelect: data=0, mods=0, x=0, y=0, extra="MyItemIdentifier"

Damit kann man dann z.B. das ganze Fenster mit anderen Gadgets bestücken, so wie bei einem Tab.

Screen:
user posted image

Abhängige Funktionen:
Um das ganze auch handhaben zu können gibt es noch zwei neue Funktionen.

BlitzMax: [AUSKLAPPEN]
SelectCocoaToolbarItem (MyToolbar, MyItemIdentifier)

Da Items während der Erstellungsphase keine Befehle entgegen nehmen, wird diese Funktion benötigt um das erste Item zu aktivieren, nachdem die Toolbar mit EndCocoaToolbar abgeschlossen wurde. Natürlich kann man damit auch während des laufenden Prozesses umschalten.

BlitzMax: [AUSKLAPPEN]
Local MySelectedItemIdentifier:String = SelectedCocoaToolbarItem (MyToolbar)

Diese Funktion gibt das momentan selektierte Item einer Toolbar zurück.

NSToolbar, NSToolbarItem

Freitag, 10. Juli 2009 von d-bug
Beginnen wir also mit dem ersten Gadget! Lasst uns über die Toolbar reden:
Die Geschichte der Toolbar ist eine Geschichte voller Missverständnisse... *bla*

Also, normalerweise kann man eine Toolbar in OSX an allen Ecken und Kanten an seine Vorstellungen anpassen. So gibt es die Möglichkeit mittels eines Dialogs Items auszutauschen, nur Text anzeigen, nur Icon anzeigen ... Das alles bietet mir MaxGUI einfach nicht.

Darum nehmen wir einfach mal die Objective-C Komponente auseinander und schrauben hier und da und freuen uns wenn tatsächlich mal was klappt...



Erstellen einer Toolbar (Ablauf):

1. Beginn einer Toolbar
Code: [AUSKLAPPEN]
Global Toolbar:TGadget = BeginCocoaToolbar (Window, NSToolbarDisplayModeLabel | NSToolbarDisplayModeIcon,, True)

Um eine Toolbar mit anpassbaren Items versehen zu können muss man eigentlich bei Cocoa erst die Toolbar mit Items bestücken, bevor man sie dem Fenster bzw. dem Controller zuweist. Genauer gesagt verwaltet Cocoa intern zwei Arrays mit Item-Identifiern für die Customization-Palette. Eines für alle erlaubten Items und eines für anzuzeigende Items. Diese Arrays müssen anscheinend gefüllt sein, bevor man die Toolbar zuweist, denn sonst kommt es zu Fehlern. *buzzer* Mit dem Finger auf BRL zeig. Also BeginCocoaToolbar beginnt die Toolbar und speichert die übergebenen Daten zwischen, bis EndCocoaToolbar aufgerufen wird.


2. Items erstellen
Code: [AUSKLAPPEN]
Global TBFontItem:String   = AddCocoaToolbarFontItem (Toolbar,"Fonts","Fontdialog öffnen")
Global TBColorItem:String   = AddCocoaToolbarColorItem (Toolbar,"Farben","Farbdialog öffnen")
Global TBPrintItem:String   = AddCocoaToolbarPrintItem (Toolbar,"Drucken","Dokument drucken")
'...

Als erstes wird aufallen, dass die Items nun als String zurückgegeben werden. Das hat auch seinen Grund! Cocoa verwaltet ToolbarItems als String und nicht als Integer! *buzzer* Mit dem Finger auf BRL zeig. Was in diesem Code aufgeführt wird sind ein paar Standarditems. Auf die ich noch eingehen werde.


3. Toolbar abschließen
Code: [AUSKLAPPEN]
EndCocoaToolbar (Toolbar)






Abfragen einer Toolbar:
Dazu und hoffentlich zu noch mehr hab ich drei extra Event-Funktionen ins leben gerufen:

Code: [AUSKLAPPEN]
EventCocoaIdentifier ()

filtert den Identifier, der mit AddToolbarItem zurückgegeben wird, aus dem jeweiligen Event.

Code: [AUSKLAPPEN]
EventCocoaMessage ()

filtert die Message aus dem Event. Wird nicht so oft benötigt, aber ab und an kommt es trotzdem vor.

Code: [AUSKLAPPEN]
EventCocoaData ()

filtert die Daten aus dem Event.

Beispiel
Code: [AUSKLAPPEN]
Repeat

   Select WaitEvent ()
      Case EVENT_WINDOWCLOSE, EVENT_APPTERMINATE
         End

      Case EVENT_GADGETACTION

         Select EventCocoaIdentifier ()

            Case TBColorItem
               Local Color:String[] = EventCocoaData ().Split(",")
               SetGadgetColor (ColorButton, Int(Color[0]), Int(Color[1]), Int(Color[2]))


Ein normaler Event sieht dann in etwa so aus:
Code: [AUSKLAPPEN]
GadgetAction: data=1, mods=0, x=0, y=0, extra="NSToolbarColorsItem|ok|255,87,96"

Man sieht, alles was ich da mache ist ein wenig das EventExtra zu verwursten! Um diesen Umstand etwas angenehmer zu gestalten habe ich eben diese drei Funktionen geschrieben, die das EventExtra splitten und dann das passende zum abfragen zurückgeben.




Die Toolbar:

Code: [AUSKLAPPEN]
Global Toolbar:TGadget = BeginCocoaToolbar (Window, DisplayMode, SizeMode, AllowCustomization)


Erklärung der Übergabevariablen:

Window:
Wie jedes normale Gadget braucht auch eine Toolbar ein Parent. Bei Cocoa kann dies nur ein Fenster sein, soweit mir bisher bekannt ist.


DisplayMode:
Der DisplayMode sorgt für eine angepasste Darstellung der Toolbar. Man kann hier einstellen, ob nur Icons, nur Text oder Text und Icons angezeigt werden sollen.

Flags:
Arrow NSToolbarDisplayModeDefault
user posted image
eigentlich eine Kombination aus NSToolbarDisplayModeIcon und NSToolbarDisplayModeLabel. Wird nicht zwingend benötigt.

Arrow NSToolbarDisplayModeIcon
user posted image
Schaltet die Darstellung der Icons ein.

Arrow NSToolbarDisplayModeLabel
user posted image
Schaltet die Darstellung der Labels (Texte) ein.

Standard ist NSToolbarDisplayModeDefault bzw. NSToolbarDisplayModeIcon|NSToolbarDisplayModeLabel


SizeMode:
Der SizeMode gibt die Startgröße der ToolbarItems an.

Flags:
Arrow NSToolbarSizeModeDefault
Der Standardmodus. Eigentlich NSToolbarSizeModeRegular

Arrow NSToolbarSizeModeRegular
user posted image
Icongröße beträgt in diesem Modus 32x32.

Arrow NSToolbarSizeModeSmall
user posted image
Icongröße beträgt in diesem Modus 24x24. Größere Icons werden automatisch skaliert.


AllowCustomization:
Ein Bool (True/False), das angibt, ob der Benutzer die Toolbar ändern kann oder nicht.

Ist diese Variable auf True gesetzt, wird folgender Dialog...
user posted image
...das Kontextmenü...
user posted image
... und das automatische speichern der Toolbardaten in der Preferences-PList (~/Library/Preferences/MyApp.plist) freigeschaltet. Wenn der potenzielle User jetzt die Items anderes sortiert, wird dies bei Verlassen der Customize-Palette automatisch gespeichert und die Toolbar wird beim nächsten Aufruf der Applikation wieder mit den Änderungen geöffnet.





Bisherige ToolbarItems:
user posted image

von links/nach rechts erklärt


FontItem

Aufruf:
Code: [AUSKLAPPEN]
Global TBFontItem:String   = AddCocoaToolbarFontItem (Toolbar,"Fonts","Fontdialog öffnen")


Event:
Code: [AUSKLAPPEN]
GadgetAction: data=0, mods=0, x=0, y=0, extra="NSToolbarFontsItem|ok|FontName,FontSize,FontFace"


Dieses Item öffnet den OSX Fontdialog und gibt als Event den ausgewählten Font zurück. Die Message lautet in dem Fall "ok" und ist zu vernachlässigen. Der Identifier "NSToolbarFontsItem" ist nicht änderbar!


FarbItem

Aufruf:
Code: [AUSKLAPPEN]
Global TBColorItem:String = AddCocoaToolbarColorItem (Toolbar,"Farben","Farbdialog öffnen")


Event:
Code: [AUSKLAPPEN]
GadgetAction: data=0, mods=0, x=0, y=0, extra="NSToolbarColorsItem|ok|Red,Green,Blue"


Dieses Item öffnet den OSX Farbdialog und gibt als Event die ausgewählte Farbe zurück. Die Message lautet in dem Fall "ok" und ist zu vernachlässigen. Der Identifier "NSToolbarColorsItem" ist nicht änderbar!


SeparatorItem

Aufruf:
Code: [AUSKLAPPEN]
AddCocoaToolbarSeparatorItem (Toolbar)


Event:
keiner!

Kann mehrfach aufgerufen werden und gehört zu den Items, die standardmäßig in der Customization-Palette abgelegt sind. Der Identifier wird nicht benötigt, da das Item keinen Event postet.


PrintItem

Aufruf:
Code: [AUSKLAPPEN]
Global TBPrintItem:String    = AddCocoaToolbarPrintItem (Toolbar,"Drucken","Dokument drucken")


Event:
Code: [AUSKLAPPEN]
GadgetAction: data=0, mods=0, x=0, y=0, extra="NSToolbarPtintItem|ok|"


Dieses Item kann für eine eigene Druck-Routine verwendet werden. Es gibt als Message nur "ok" zurück. Es ist eigentlich ein ganz normales Item, dass angeklickt werden kann, musste aber CocoaExt-Intern als separates Item behandelt werden, da es zu den Standard Cocoa Items gehört und da auch eine eigene Action auslöst.



Custom Item mit Cocoa Standardimage und Custom Item mit Pixmap

Aufruf:
Code: [AUSKLAPPEN]
Global TBMyItem:String    = AddCocoaToolbarItem (Toolbar, Name, Tooltip, Icon)


Event:
Code: [AUSKLAPPEN]
GadgetAction: data=0, mods=0, x=0, y=0, extra="Toolbar1:1|ok|"


Der Identifier wird einem Custom-Item automatisch zugewiesen. Als Message gibts ein ok, wenn das Item angeklickt wurde.
Zu den Icons ist zu sagen, dass Cocoa 44 Standard Icons besitzt, die alle als Konstante vorliegen und zugewiesen werden können. Genau so gut kann man allerdings auch einfach eine Pixmap nehmen. IconStrip ist noch nicht wieder implementiert, kommt aber noch. Ein Icon sollte die Größe 32x32 haben, nicht wie von BRL verlangt 24x24. Die Größe wird automatisch angepasst, wenn das Icon zu klein ist, siehe Quicklook-Icon (Das Auge da).


FlexibleSpaceItem

Aufruf:
Code: [AUSKLAPPEN]
AddCocoaToolbarFlexibleSpaceItem (Toolbar)


Event:
keiner!

Das FlexibleSpaceItem erstellt eine Lücke zwischen den Items, die eine variable Größe hat. (Kennt man auch vom Firefox)
Kann mehrfach aufgerufen werden und gehört zu den Items, die standardmäßig in der Customization-Palette abgelegt sind. Der Identifier wird nicht benötigt, da das Item keinen Event postet.


CustomizeItem

Aufruf:
Code: [AUSKLAPPEN]
AddCocoaToolbarCustomizeItem  (Toolbar,"Anpassen","Werkzeugleiste anpassen")


Event:
keiner!

Dieses Item öffnet die Customization-Palette in der die Items neu angeordnet werden können. Es gibt keinen Event zurück.


SearchItem
Mein Schätzchen. :>

Aufruf:
Code: [AUSKLAPPEN]
Global TBSearchItem:String =AddCocoaToolbarSearchItem (Toolbar,"Suchen","Suche starten")


Event:
Code: [AUSKLAPPEN]
GadgetAction: data=0, mods=0, x=0, y=0, extra="NSToolbarSearchItem|proc|Hallo W"

Während des tippens! (Man beachte die Message "proc") Praktisch um eine Vorauswahl der Terms treffen zu können, dachte ich mir so!

Code: [AUSKLAPPEN]
GadgetAction: data=0, mods=0, x=0, y=0, extra="NSToolbarSearchItem|ok|Hallo Welt"

Nach dem drücken von Enter, oder wenn man auf die kleine Lupe klickt (Da ist sie wieder, die Message "ok")

Code: [AUSKLAPPEN]
GadgetAction: data=0, mods=0, x=0, y=0, extra="NSToolbarSearchItem|cancel|"

Beim Klick auf das kleine Kreuz, was erscheint wenn man anfängt zu tippen

Das Item sucht nichts von alleine, sondern gibt nur die entprechenden Events aus!



SpaceItem (nicht gezeigt)

Aufruf:
Code: [AUSKLAPPEN]
AddCocoaToolbarSpaceItem (Toolbar)


Event:
keiner!

Das SpaceItem erstellt eine Lücke zwischen den Items, die eine feste Größe hat.
Kann mehrfach aufgerufen werden und gehört zu den Items, die standardmäßig in der Customization-Palette abgelegt sind. Der Identifier wird nicht benötigt, da das Item keinen Event postet.


Generelles zu den Items
Alle Items außer Separator, Space und FlexibleSpace besitzen einen IsDefault Flag, der auf False gesetzt werden kann, wenn das Item nicht direkt angezeigt werden soll, sondern erst mal nur in der Customization-Palette erscheinen soll. Separator, Space und FlexibleSpace sind automatisch in der Palette enthalten. Sie werden erst zu Standard-Items, wenn man sie mit der jeweiligen Add-Funktion aufruft.

habe fertig!

Wer? Was? Wie? Wo?

Freitag, 10. Juli 2009 von d-bug
Wer?
Dieses Worklog richtet sich an alle, die MaxGUI und einen Mac mit Leopard ihr Eigen nennen.


Was?
Erst mal zur Aufklärung was Cocoa eigentlich ist: Cocoa ist das GUI Framework von Apples OS X. Für die Windows User sei gesagt, das es vergleichbar mit der Windows API ist.

Leider hat BRL aus Kompatibilitätsgründen, nehme ich an, auf einen Großteil der Cocoa-Features verzichtet, was MaxGUI Programme auf dem Mac immer etwas unschön bzw. dem System nicht angeglichen erscheinen lässt.

Da mir der Umgang mit MaxGUI auf OSX anfing den letzten Nerv zu rauben und all mein Flehen und Jammern keinen Eindruck auf SebHoll machte, hab ich dann eben beschlossen mich selbst da rein zu hacken.

Im entstehen ist also ein Modul, dass all die Lücken zwischen Cocoa und MaxGUI schließen soll.

Der erste, der daraus jetzt wieder einen OS-War startet bekommt von mir persönlich einen Tritt in den Hintern! Ich meine, Windows-User bekamen ja bereits das win32maxguiex.mod und Linux User das Modul von Brucey.


Wie?
Nun, wie es funktioniert werde ich von Gadget zu Gadget erklären, also noch ein wenig Geduld!
Wie ich das alles noch in mein ausgefülltes Arbeits-und Beziehungsleben einbinde weiß ich noch nicht so genau.
Ab und an findet sich noch eine kleine Lücke und ich bastel ein wenig daran herum.


Wo?
Derzeit nirgends! Kein Download so far, da ich noch mitten drin stecke und nur recht mühsam voran komme.

Gehe zu Seite Zurück  1, 2, 3, 4, 5