Toolbar in einer Anwendung

Rhyt
Beiträge: 70
Registriert: Mo 28. Nov 2022, 20:22

Toolbar in einer Anwendung

Beitrag von Rhyt »

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.
Bildschirmfoto 2024-01-31 um 11.27.39.png
Bildschirmfoto 2024-01-31 um 11.27.39.png (209.69 KiB) 2981 mal betrachtet
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

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Toolbar in einer Anwendung

Beitrag von Mathias »

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.
Ich vermute mal, da musst du recht tief ins Mac-OS eingreifen.

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
Bildschirmfoto vom 2024-01-31 19-29-48.png (23.28 KiB) 2942 mal betrachtet
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

CCRDudeLaz
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

Beitrag von CCRDudeLaz »


CCRDudeLaz
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

Beitrag von CCRDudeLaz »

Find ich so spannend, dass ich mal kurz was probiert habe. Eine leere Toolbar habe ich schnell hinbekommen:

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;
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).

Rhyt
Beiträge: 70
Registriert: Mo 28. Nov 2022, 20:22

Re: Toolbar in einer Anwendung

Beitrag von Rhyt »

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)
ohne WM11
ohne WM11
Bildschirmfoto 2024-02-01 um 13.57.29.png (139.41 KiB) 2870 mal betrachtet
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 :)




Calendar Tile 2.zip
(597.87 KiB) 30-mal heruntergeladen
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
ohne WM11
ohne WM11
Bildschirmfoto 2024-02-01 um 13.57.29.png (139.41 KiB) 2870 mal betrachtet
Dateianhänge
mit wm11
mit wm11
Bildschirmfoto 2024-02-01 um 14.31.50.png (177.87 KiB) 2870 mal betrachtet

CCRDudeLaz
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

Beitrag von CCRDudeLaz »

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).

Rhyt
Beiträge: 70
Registriert: Mo 28. Nov 2022, 20:22

Re: Toolbar in einer Anwendung

Beitrag von Rhyt »

kein problem :) ich freu mich schon auf Rückmeldung :) Es geht ums Prinzip das hinzubekommen

CCRDudeLaz
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

Beitrag von CCRDudeLaz »

Ausgegraut sind Buttons, wenn ihre Action nicht ankommt.

Du hast das hier ausgegraut:

Code: Alles auswählen

toolbarItem.setTarget(self);
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:

Code: Alles auswählen

TToolbarDelegate = objcclass(NSObject, NSToolbarDelegateProtocol)
   ...
   procedure ToolbarAddItemClick(Sender: TObject); message 'ToolbarAddItemClick:';
end;
Ich habe das einfach getestet mit:

Code: Alles auswählen

 procedure TToolbarDelegate.ToolbarAddItemClick(Sender: TObject);
 begin
    ShowMessage('add item clicked');
 end;
Schon ist 1. der Button nicht mehr ausgegraut und 2. macht er auch was :)

Rhyt
Beiträge: 70
Registriert: Mo 28. Nov 2022, 20:22

Re: Toolbar in einer Anwendung

Beitrag von Rhyt »

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.

CCRDudeLaz
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

Beitrag von CCRDudeLaz »

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...

CCRDudeLaz
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

Beitrag von CCRDudeLaz »

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...

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;  
... irgendwie einfacher wiederzuverwenden :)

Rhyt
Beiträge: 70
Registriert: Mo 28. Nov 2022, 20:22

Re: Toolbar in einer Anwendung

Beitrag von Rhyt »

CCRDudeLaz hat geschrieben:
Fr 2. Feb 2024, 11:27
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...
Also das erscheinen der Buttons und aussehen insgesamt hängt sehr stark von der macOS Version ab und welche Compiler Build Optionen du verwendest.
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

CCRDudeLaz
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

Beitrag von CCRDudeLaz »

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.

CCRDudeLaz
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

Beitrag von CCRDudeLaz »

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.

Rhyt
Beiträge: 70
Registriert: Mo 28. Nov 2022, 20:22

Re: Toolbar in einer Anwendung

Beitrag von Rhyt »

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.

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 :D 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 :)

Antworten