Toolbar in einer Anwendung
Toolbar in einer Anwendung
Ich versuche gerade einfach aus Interesse in meiner Anwendung (Test Projekt ) die Mactypische Toolbar mit Icons zu füllen. Und ich bekomme es einfach nicht hin.
Mein Projekt ist im Anhang.
hat jemand damit Erfahrungen gemacht und könnte mir da weiterhelfen?Mein Projekt ist im Anhang.
- Dateianhänge
-
- Calendar Tile.zip
- (594.91 KiB) 35-mal heruntergeladen
-
- Beiträge: 6210
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Toolbar in einer Anwendung
Ich vermute mal, da musst du recht tief ins Mac-OS eingreifen.Ich versuche gerade einfach aus Interesse in meiner Anwendung (Test Projekt ) die Mactypische Toolbar mit Icons zu füllen. Und ich bekomme es einfach nicht hin.
Als Beispiel das gtk-Fenster im Anhang. Sowas geht mit normalen Formularen nicht, daher wird ein Trick angewendet. Es ist ein nacktes Fenster, ohne System-Buttons. Die System-Buttons werden manuell hinzugefügt. Bei dir wären es die farbigen Knöpfe.
- Dateianhänge
-
- Bildschirmfoto vom 2024-01-31 19-29-48.png (23.28 KiB) 2944 mal betrachtet
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 29
- Registriert: Do 25. Jan 2024, 08:33
- OS, Lazarus, FPC: Win/macOS/Linux (L trunk FPC trunk)
- CPU-Target: 32+64
-
- Beiträge: 29
- Registriert: Do 25. Jan 2024, 08:33
- OS, Lazarus, FPC: Win/macOS/Linux (L trunk FPC trunk)
- CPU-Target: 32+64
Re: Toolbar in einer Anwendung
Find ich so spannend, dass ich mal kurz was probiert habe. Eine leere Toolbar habe ich schnell hinbekommen:
Nun müsste man entweder eine nib mit Toolbar-Definition erzeugen (Interface Builder, das FPC-Wiki enthält Infos zu nibs), oder die Toolbar ohne nib füllen (dafür gibt's hier was, ganz unten).
Code: Alles auswählen
procedure TFormNetworkLeprechaun.AddToolbar;
var
win: NSWindow;
tb: NSToolbar;
begin
tb := NSToolbar.alloc;
tb.init;
tb.setAllowsUserCustomization(true);
tb.setAutosavesConfiguration(true);
tb.setDisplayMode(NSToolbarDisplayModeIconAndLabel);
win := TCocoaWSCustomForm(Self).GetWindowContentFromHandle(Self).lclOwnWindow;
win.setToolbar(tb);
end;
Re: Toolbar in einer Anwendung
Danke für eure Hilfe!
habs herausgefunden, hab nur das vergessen
function TToolbarDelegate.toolbarDefaultItemIdentifiers(toolbar: NSToolbar): NSArray;
begin
Result := NSArray.arrayWithObjects(
NSSTR('addToolbarItem'),
NSSTR('removeToolbarItem'),
// possibly other default identifiers
nil);
end;
Also einen DefaultItemIdentifier...
jetzt muss ich nur noch herausfinden warum die dinger ausgegraut sind
(hat eventuell etwas mit Delegates usw. zu tun)
Ich nutze ja schon NSToolbar usw. deswegen hab ich mein Projektcode auch komplett im ersten Post mitgegeben
@CCRDudeLaz ich glaube das NSToolbar.alloc init in deinem Beispiel geht nur noch bist zu einer bestimmten wem Version, bei mir zumindest gibt es nen SIGARBT beim Starten wenn ich die options -WM11.0 eingestellt habe.
tb := NSToolbar.alloc.initWithIdentifier(NSSTR('mainToolbar'));
würde funktionieren.
was machst du da genau? TCocoaWSCustomForm(Self).GetWindowContentFromHandle(Self).lclOwnWindow;
Ich habe
NSView(self.Handle).window;
Ich schlag mich durch das ganze grad mit GPTs und Foren beiträge seit gestern ( also echt noch noob) und mein Objective C wissen ist von vor 10 Jahren. Die Sprache anfürsich mit sender und Empfänger usw. kann ich noch lesen und interpretieren im kopf
witzig ist auch was für ein Unterschied darstellungstechnisch die WM11 Option hat.
Ohne und mein Bild oben, mit... Ist irgendwie ne ganz andere Toolbar
habs herausgefunden, hab nur das vergessen
function TToolbarDelegate.toolbarDefaultItemIdentifiers(toolbar: NSToolbar): NSArray;
begin
Result := NSArray.arrayWithObjects(
NSSTR('addToolbarItem'),
NSSTR('removeToolbarItem'),
// possibly other default identifiers
nil);
end;
Also einen DefaultItemIdentifier...
jetzt muss ich nur noch herausfinden warum die dinger ausgegraut sind
(hat eventuell etwas mit Delegates usw. zu tun)
Ich nutze ja schon NSToolbar usw. deswegen hab ich mein Projektcode auch komplett im ersten Post mitgegeben
@CCRDudeLaz ich glaube das NSToolbar.alloc init in deinem Beispiel geht nur noch bist zu einer bestimmten wem Version, bei mir zumindest gibt es nen SIGARBT beim Starten wenn ich die options -WM11.0 eingestellt habe.
tb := NSToolbar.alloc.initWithIdentifier(NSSTR('mainToolbar'));
würde funktionieren.
was machst du da genau? TCocoaWSCustomForm(Self).GetWindowContentFromHandle(Self).lclOwnWindow;
Ich habe
NSView(self.Handle).window;
Ich schlag mich durch das ganze grad mit GPTs und Foren beiträge seit gestern ( also echt noch noob) und mein Objective C wissen ist von vor 10 Jahren. Die Sprache anfürsich mit sender und Empfänger usw. kann ich noch lesen und interpretieren im kopf
witzig ist auch was für ein Unterschied darstellungstechnisch die WM11 Option hat.
Ohne und mein Bild oben, mit... Ist irgendwie ne ganz andere Toolbar
- Dateianhänge
-
- mit wm11
- Bildschirmfoto 2024-02-01 um 14.31.50.png (177.87 KiB) 2872 mal betrachtet
-
- Beiträge: 29
- Registriert: Do 25. Jan 2024, 08:33
- OS, Lazarus, FPC: Win/macOS/Linux (L trunk FPC trunk)
- CPU-Target: 32+64
Re: Toolbar in einer Anwendung
Oh entschuldige, den Anhang hab ich wohl übersehen. Dann warst Du ja schon weiter als ich, peinlich
Ich schau‘s mir später mal an.
initWithIdentifier klappte bei mir nicht.
Meinen Weg zum NSWindow hab ich mit irgendwo im Widgetset abgeschaut, da app.mainWindow nicht klappte (evtl. wie unter Windows, wo ja das API-Hauptfensterhandle auch nur das der TApplication und nicht des Hauptfensters).
Ich schau‘s mir später mal an.
initWithIdentifier klappte bei mir nicht.
Meinen Weg zum NSWindow hab ich mit irgendwo im Widgetset abgeschaut, da app.mainWindow nicht klappte (evtl. wie unter Windows, wo ja das API-Hauptfensterhandle auch nur das der TApplication und nicht des Hauptfensters).
Re: Toolbar in einer Anwendung
kein problem ich freu mich schon auf Rückmeldung Es geht ums Prinzip das hinzubekommen
-
- Beiträge: 29
- Registriert: Do 25. Jan 2024, 08:33
- OS, Lazarus, FPC: Win/macOS/Linux (L trunk FPC trunk)
- CPU-Target: 32+64
Re: Toolbar in einer Anwendung
Ausgegraut sind Buttons, wenn ihre Action nicht ankommt.
Du hast das hier ausgegraut:
Das ist aber natürlich wichtig - und da da "Self" steht, musst Du den Handler "ToolbarAddItemClick" nicht in der Form wie in Deinem Code, sondern im Delegate definieren:
Ich habe das einfach getestet mit:
Schon ist 1. der Button nicht mehr ausgegraut und 2. macht er auch was
Du hast das hier ausgegraut:
Code: Alles auswählen
toolbarItem.setTarget(self);
Code: Alles auswählen
TToolbarDelegate = objcclass(NSObject, NSToolbarDelegateProtocol)
...
procedure ToolbarAddItemClick(Sender: TObject); message 'ToolbarAddItemClick:';
end;
Code: Alles auswählen
procedure TToolbarDelegate.ToolbarAddItemClick(Sender: TObject);
begin
ShowMessage('add item clicked');
end;
Re: Toolbar in einer Anwendung
Oh man das war die Lösung! super!
hab das einfach nicht wahrgenommen das es auskommentiert war, und klar wenn ich darüber nachdenke bezog sich das self dann ja auf die TToolbarDelegate und nicht auf TForm1 (Wald vor Bäumen und so) und dazu kommt das ich die Message vergessen habe.
hab das einfach nicht wahrgenommen das es auskommentiert war, und klar wenn ich darüber nachdenke bezog sich das self dann ja auf die TToolbarDelegate und nicht auf TForm1 (Wald vor Bäumen und so) und dazu kommt das ich die Message vergessen habe.
-
- Beiträge: 29
- Registriert: Do 25. Jan 2024, 08:33
- OS, Lazarus, FPC: Win/macOS/Linux (L trunk FPC trunk)
- CPU-Target: 32+64
Re: Toolbar in einer Anwendung
Eines ist mir gerade auch noch aufgefallen: Dein ToolbarAddItemClick hat ja Sender: TObject als Parameter. Das ist aber definitiv kein TObject, was da übergeben wird.
Ich versuche gerade, das in einer einfacheren Klasse zusammenzufassen. Im mit einer TObjectList von Buttons arbeiten zu können, kann ich ja nur einen Handler verwenden, und müsste dann vom Parameter hoffentlich schließen können auf den gedrückten Knopf. Hast Du eine Idee, was da als Parameter übergeben wird?
Und wie hast Du es hinbekommen, dass die Buttons rechts erscheinen? Bei mir sind sie nur in einer Toolbar darunter...
Ich versuche gerade, das in einer einfacheren Klasse zusammenzufassen. Im mit einer TObjectList von Buttons arbeiten zu können, kann ich ja nur einen Handler verwenden, und müsste dann vom Parameter hoffentlich schließen können auf den gedrückten Knopf. Hast Du eine Idee, was da als Parameter übergeben wird?
Und wie hast Du es hinbekommen, dass die Buttons rechts erscheinen? Bei mir sind sie nur in einer Toolbar darunter...
-
- Beiträge: 29
- Registriert: Do 25. Jan 2024, 08:33
- OS, Lazarus, FPC: Win/macOS/Linux (L trunk FPC trunk)
- CPU-Target: 32+64
Re: Toolbar in einer Anwendung
Eine Antwort kann ich mir schon selber geben: NSToolbarItem.
Und dann habe ich das ganze Mal in eine Pascal-Klasse gewrappt,
https://gitlab.com/ccrdude-pascal/firef ... oolbar.pas
Sicher noch nicht ganz sauber, aber mit...
... irgendwie einfacher wiederzuverwenden
Und dann habe ich das ganze Mal in eine Pascal-Klasse gewrappt,
https://gitlab.com/ccrdude-pascal/firef ... oolbar.pas
Sicher noch nicht ganz sauber, aber mit...
Code: Alles auswählen
var
toolbar: TMacToolbar;
item: TMacToolbarItem;
begin
toolbar := TMacToolbar.Create(Self);
item := toolbar.Items.AddItem('refreshToolbarItem', 'Refresh', 'Refresh', Self.FActionRefresh);
item.ImageFilename := 'Resources/rotate.png';
item := toolbar.Items.AddItem('connectToolbarItem', 'Connect', 'Connect', Self.FActionConnect);
item.ImageFilename := 'Resources/link.png';
item := toolbar.Items.AddItem('disconnectToolbarItem', 'Disconnect', 'Disconnect', Self.FActionDisconnect);
item.ImageFilename := 'Resources/link-slash.png';
toolbar.Attach;
end;
Re: Toolbar in einer Anwendung
Also das erscheinen der Buttons und aussehen insgesamt hängt sehr stark von der macOS Version ab und welche Compiler Build Optionen du verwendest.CCRDudeLaz hat geschrieben: ↑Fr 2. Feb 2024, 11:27Eines ist mir gerade auch noch aufgefallen: Dein ToolbarAddItemClick hat ja Sender: TObject als Parameter. Das ist aber definitiv kein TObject, was da übergeben wird.
Ich versuche gerade, das in einer einfacheren Klasse zusammenzufassen. Im mit einer TObjectList von Buttons arbeiten zu können, kann ich ja nur einen Handler verwenden, und müsste dann vom Parameter hoffentlich schließen können auf den gedrückten Knopf. Hast Du eine Idee, was da als Parameter übergeben wird?
Und wie hast Du es hinbekommen, dass die Buttons rechts erscheinen? Bei mir sind sie nur in einer Toolbar darunter...
im Aktuellen macOS werden die Buttons rechts angeordnet erstmal ohne zutun.
Ich verwende die Optionen -WM11.0 d.h. allerdings auch das ich die toolbar wie folgt initialisieren muss NSToolbar.alloc.initWithIdentifier(NSSTR('mainToolbar'));
also mit initWithIdentifier ansonsten startet nichts
Du bist echt der Hammer mit der FireFly pas ich versuche das gerade zum laufen zu bekommen was du da feines gebastelt hast. (Danke für die Danksagung)
- Dateianhänge
-
- Bildschirmfoto 2024-02-02 um 18.17.12.png
- (699.03 KiB) Noch nie heruntergeladen
-
- Beiträge: 29
- Registriert: Do 25. Jan 2024, 08:33
- OS, Lazarus, FPC: Win/macOS/Linux (L trunk FPC trunk)
- CPU-Target: 32+64
Re: Toolbar in einer Anwendung
Ohne Deinen Anlauf und Dein Beispiel mit dem Delegate hätte ich mich da nicht rangewagt
Danke für die -WM11.0, habe die nochmal ausprobiert und das init auf initWithIdentifier umgestellt (Repository ist aktualisiert). Tatsächlich sind die Buttons auch bei mir jetzt oben rechts.
Und -WM11.0 scheint einen automatischen Support für den Dark Mode mit sich zu bringen, noch ein Gewinn
Ich werde mal schauen, ob ich das mit dem validateToolitem noch irgendwie hinbekomme, weil zwei meiner Actions kontextabhängig sind.
Danke für die -WM11.0, habe die nochmal ausprobiert und das init auf initWithIdentifier umgestellt (Repository ist aktualisiert). Tatsächlich sind die Buttons auch bei mir jetzt oben rechts.
Und -WM11.0 scheint einen automatischen Support für den Dark Mode mit sich zu bringen, noch ein Gewinn
Ich werde mal schauen, ob ich das mit dem validateToolitem noch irgendwie hinbekomme, weil zwei meiner Actions kontextabhängig sind.
-
- Beiträge: 29
- Registriert: Do 25. Jan 2024, 08:33
- OS, Lazarus, FPC: Win/macOS/Linux (L trunk FPC trunk)
- CPU-Target: 32+64
Re: Toolbar in einer Anwendung
Es gab noch einen Fehler - im toolbarAllowedItemIdentifiers hatte ich noch die Anzahl der Items fest: 3. Das ist jetzt angepasst. Und die TMacToolbarItem haben properties IsDefault und IsImmovable bekommen, die sich auf die user customization auswirken.
Re: Toolbar in einer Anwendung
Wahnsinns Arbeit
hätte das nicht so in dieser Zeit Herzaubern können.
ich muss bei dir im Code in der MacToolbar.Attach folgendes ändern damit die Toolbar angezeigt wird.
es macht Optisch einen so massiven unterschied mit dieser Toolbar und wenn man das so leicht dann einbinden kann einfach nur yay
Ein paar Kleinigkeiten sind noch bisschen ungereimt. Die Icons werden zu groß angezeigt und der Hintergrund wird hell beim klicken und so. Das weicht etwas ab vom Standard verhalten.
Das mit dem mehreren hinzufügen als nur die 3 Stück funktioniert gut
hätte das nicht so in dieser Zeit Herzaubern können.
ich muss bei dir im Code in der MacToolbar.Attach folgendes ändern damit die Toolbar angezeigt wird.
Code: Alles auswählen
// FMacWindow := {%H-}TCocoaWSCustomForm(FForm).GetWindowContentFromHandle(FForm).lclOwnWindow;
FMacWindow := {%H-}NSView(FForm.Handle).window;
es macht Optisch einen so massiven unterschied mit dieser Toolbar und wenn man das so leicht dann einbinden kann einfach nur yay
Ein paar Kleinigkeiten sind noch bisschen ungereimt. Die Icons werden zu groß angezeigt und der Hintergrund wird hell beim klicken und so. Das weicht etwas ab vom Standard verhalten.
Das mit dem mehreren hinzufügen als nur die 3 Stück funktioniert gut