[Module] Extended ToolBar-Gadget (all OS / DPI)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

[Module] Extended ToolBar-Gadget (all OS / DPI)

Beitrag von Thorsten1867 »

ToolBarGadget - Module (All OS / DPI)
  • Image-Größen: 16x16 / 24x24 / 32x32
  • sendet wahlweise Gadget- oder Menü-Events (#PB_Event_Gadget / #PB_Event_Menu)
  • Separator und Spacer Elemente verfügbar
  • Buttons können alternativ mit Popup-Menüs verknüpft werden.
  • Tooltipps für einzelne Buttons
  • automatische Anpassung der Button-Breite an die maximale Textbreite möglich
  • automatische Anpassung der Gadgethöhe möglich, wenn Button-Text verwendet wird
  • automatische Größenanpassung des Gadgets an die Fenstergröße möglich (#MoveX|#MoveY|#ResizeWidth|#ResizeHeight)
  • ComoBox / SpinGadget / ButtonGadget können zusätzlich hinzugefügt werden
  • DPI kompatible
Bild

Code: Alles auswählen

; ToolBar::AddItem()              - similar to 'AddGadgetItem()'
; ToolBar::AttachPopupMenu()      - attachs a popup menu to the button
; ToolBar::ButtonText()           - similar to 'ToolBarButtonText()'
; ToolBar::ComboBox()             - adds a ComboBox to the toolbar
; ToolBar::DisableButton()        - similar to 'DisableToolBarButton()'
; ToolBar::DisableReDraw()        - disable/enable redrawing
; ToolBar::Separator()            - similar to 'ToolBarSeparator()'
; ToolBar::EventNumber()          - returns the event number (integer) of the toolbar button
; ToolBar::EventID()              - returns the event ID (string) of the toolbar button
; ToolBar::EventState()           - returns the state of a toolbar gadget (e.g. ComboBox)
; ToolBar::Free()                 - similar to 'FreeToolBar()'
; ToolBar::Gadget()               - similar to 'CreateToolBar()'
; ToolBar::GetAttribute()         - similar to 'GetGadgetAttribute()'
; ToolBar::GetIndex()             - returns item index of the corresponding event number
; ToolBar::GetIndexFromID()       - returns item index of the corresponding event ID
; ToolBar::GetGadgetNumber()      - returns the gadget number of the gadget at index position
; ToolBar::GetState()             - similar to 'GetGadgetState()'
; ToolBar::GetText()              - similar to 'GetGadgetText()'
; ToolBar::ImageButton()          - similar to 'ToolBarImageButton()'
; ToolBar::HideButton()           - hide button
; ToolBar::Height()               - similar to 'ToolBarHeight()'
; ToolBar::SetAutoResizeFlags()   - [#MoveX|#MoveY|#ResizeWidth|#ResizeHeight]
; ToolBar::SetAttribute()         - similar to 'SetGadgetColor()'
; ToolBar::SetColor()             - similar to 'SetGadgetAttribute()'
; ToolBar::SetFont()              - similar to 'SetGadgetFont()'
; ToolBar::SetGadgetFlags()       - [#Top/#Bottom]
; ToolBar::SetPostEvent()         - changes PostEvent [#PB_Event_Gadget/#PB_Event_Menu]
; ToolBar::SetSpinAttribute()     - similar to 'SetGadgetAttribute()' for the SpinGadget [#PB_Spin_Minimum/#PB_Spin_Maximum]
; ToolBar::SetState()             - similar to 'SetGadgetState()'
; ToolBar::SetText()              - similar to 'SetGadgetText()'
; ToolBar::Spacer()               - inserts available space between buttons
; ToolBar::SpinBox()              - adds a SpinGadget to the toolbar
; ToolBar::ToolTip()              - similar to 'ToolBarToolTip()'
; ToolBar::TextButton()           - similar to 'ButtonGadget()'
Download: ToolBarExModule.pbi
Zuletzt geändert von Thorsten1867 am 20.12.2019 16:41, insgesamt 3-mal geändert.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: [Module] Extended ToolBar-Gadget (all OS / DPI)

Beitrag von RSBasic »

:allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [Module] Extended ToolBar-Gadget (all OS / DPI)

Beitrag von STARGÅTE »

Hallo Thorsten1867,

Habs mal getestet:
  • Der Maus-Bereich, wann der Button hovered, ist bei mir irgendwie etwa 8px oben und unten zu klein. Soll das so sein?
  • Wieso werden alle Buttons "größer" obwohl nur z.B. ein Button einen langen Text hat?
  • Ich sehe kein ToolTip, obwohl im Beispiel einer für New und Save erstellt wird.
  • Wenn man eine größere Font benutzt, wird der Text unten abgeschnitten, bzw. das Bild oben.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: [Module] Extended ToolBar-Gadget (all OS / DPI)

Beitrag von mk-soft »

Sieht sehr gut aus...

Ist aber noch kleiner Fehler drin und sieht man erst wenn man es mit MacOS startet...

ResizeImage(...) liefert kein neues Bild, sondern ändert das angegebene Image.
Bei erfolgreicher Änderung ist der Rückgabewert bei Window das Handle und bei Linux das Object
Unter MacOS True oder False

Also immer vorher eine Kopie des Image erstellen und dann die Größe der Kopie ändern...

So läuft es auch unter MacOS

Zeile 513

Code: Alles auswählen

  If TBEx()\Items()\Flags & #Disable
                  ;ImageID = ResizeImage(TBEx()\Items()\ImageNum, TBEx()\Images\Width, TBEx()\Images\Height, #PB_Image_Smooth)
                  ;DrawAlphaImage(ImageID, X + imgX, imgY, 128)
                  ImageID = CopyImage(TBEx()\Items()\ImageNum, #PB_Any)
                  If ResizeImage(ImageID, TBEx()\Images\Width, TBEx()\Images\Height, #PB_Image_Smooth)
                    DrawAlphaImage(ImageID(ImageID), X + imgX, imgY, 128)
                  Else
                    DrawImage(ImageID(TBEx()\Items()\ImageNum), X + imgX, imgY, TBEx()\Images\Width, TBEx()\Images\Height)
                  EndIf
                  FreeImage(ImageID)
                Else
                  DrawImage(ImageID(TBEx()\Items()\ImageNum), X + imgX, imgY, TBEx()\Images\Width, TBEx()\Images\Height)
                EndIf
              
P.S. Gefällt mir immer Besser :allright:

Um ein gleiches verhalten im Modus Event_Menu zu erhalten, vielleicht noch das PostEvent für EventMenu ändern.
Somit kann man wieder für ein Menu Eintrag und den Toolbar Eintrag gleiche Menu ID´s verwenden.

Zeile 665

Code: Alles auswählen

                    If TBEx()\PostEvent = #Event_Menu
                      ;PostEvent(#PB_Event_Menu, TBEx()\Window\Num, TBEx()\CanvasNum, #EventType_Button, btIndex)
                      PostEvent(#PB_Event_Menu, TBEx()\Window\Num, TBEx()\Event\Num)
                    Else
                      PostEvent(#PB_Event_Gadget, TBEx()\Window\Num, TBEx()\CanvasNum, #EventType_Button, btIndex)
                    EndIf 
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] Extended ToolBar-Gadget (all OS / DPI)

Beitrag von Thorsten1867 »

Hinzugefügt:
  • einzelne Buttons an die jeweilge Textgröße anpassen (#AdjustButtons)
  • alle Buttons an die maximale Textbreite anpassen (#AdjustAllButtons)
  • Focus mit abgerundeten Ecken (#RoundFocus)
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] Extended ToolBar-Gadget (all OS / DPI)

Beitrag von Thorsten1867 »

STARGÅTE hat geschrieben:
  • Der Maus-Bereich, wann der Button hovered, ist bei mir irgendwie etwa 8px oben und unten zu klein. Soll das so sein?
  • Ich sehe kein ToolTip, obwohl im Beispiel einer für New und Save erstellt wird.
  • Wenn man eine größere Font benutzt, wird der Text unten abgeschnitten, bzw. das Bild oben.
  • Den Rand kann man mit dem Attribute "Spacing" ändern
  • Tooltipps sollten jetzt funktionieren. (Button war deaktiviert)
  • Die Höhe sollte jetzt auch bei einem Wechsel des Font neu berechnet werden
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] Extended ToolBar-Gadget (all OS / DPI)

Beitrag von Thorsten1867 »

@mk-soft

Habe die Änderungen übernommen.
Weißt du zufällig auch, wie man die Systemfarben bei MacOs oder Linux ermitteln kann?
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] Extended ToolBar-Gadget (all OS / DPI)

Beitrag von Thorsten1867 »

Hinzugefügt: ComboBox / SpinGadget / ButtonGadget
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: [Module] Extended ToolBar-Gadget (all OS / DPI)

Beitrag von mk-soft »

Hier noch die Funktionen für OSX...

Code: Alles auswählen

;-TOP
; by mk-soft 

Procedure OSX_NSColorToRGBA(NSColor)
  Protected.cgfloat red, green, blue, alpha
  Protected nscolorspace, rgba
  nscolorspace = CocoaMessage(0, nscolor, "colorUsingColorSpaceName:$", @"NSCalibratedRGBColorSpace")
  If nscolorspace
    CocoaMessage(@red, nscolorspace, "redComponent")
    CocoaMessage(@green, nscolorspace, "greenComponent")
    CocoaMessage(@blue, nscolorspace, "blueComponent")
    CocoaMessage(@alpha, nscolorspace, "alphaComponent")
    rgba = RGBA(red * 255.9, green * 255.9, blue * 255.9, alpha * 255.)
    ProcedureReturn rgba
  EndIf
EndProcedure

Procedure OSX_NSColorToRGB(NSColor)
  Protected.cgfloat red, green, blue, alpha
  Protected r, g, b, a
  Protected nscolorspace, rgba
  nscolorspace = CocoaMessage(0, nscolor, "colorUsingColorSpaceName:$", @"NSCalibratedRGBColorSpace")
  If nscolorspace
    CocoaMessage(@red, nscolorspace, "redComponent")
    CocoaMessage(@green, nscolorspace, "greenComponent")
    CocoaMessage(@blue, nscolorspace, "blueComponent")
    CocoaMessage(@alpha, nscolorspace, "alphaComponent")
    rgba = RGB(red * 255.0, green * 255.0, blue * 255.0)
    ProcedureReturn rgba
  EndIf
EndProcedure

nscolor = CocoaMessage(0, 0, "NSColor controlBackgroundColor")
;nscolor = CocoaMessage(0, 0, "NSColor windowBackgroundColor")

color = OSX_NSColorToRGBA(nscolor)
Debug Hex(color)

If OpenWindow(0, 0, 0, 220, 220, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 10, 10, 200, 200)
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget And EventGadget() = 0 
      If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
        If StartDrawing(CanvasOutput(0))
          x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
          y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
          Circle(x, y, 10, color)
          StopDrawing()
        EndIf
      EndIf
    EndIf    
    
  Until Event = #PB_Event_CloseWindow
EndIf
Siehe https://developer.apple.com/documentati ... ent_colors
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: [Module] Extended ToolBar-Gadget (all OS / DPI)

Beitrag von mk-soft »

Habe folgende Erweiterungen eingefügt.
Der Hintergrund ist im Darkmode nicht ganz perfekt, da das CanvasGadget Solid ist. Dafür kann man aber besser die anderen Controls sehen.

Zeile 317

Code: Alles auswählen

;- ============================================================================
  ;-   Module - Internal - MacOS
  ;- ============================================================================ 
  
  CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
    Procedure OSX_NSColorToRGBA(NSColor)
      Protected.cgfloat red, green, blue, alpha
      Protected nscolorspace, rgba
      nscolorspace = CocoaMessage(0, nscolor, "colorUsingColorSpaceName:$", @"NSCalibratedRGBColorSpace")
      If nscolorspace
        CocoaMessage(@red, nscolorspace, "redComponent")
        CocoaMessage(@green, nscolorspace, "greenComponent")
        CocoaMessage(@blue, nscolorspace, "blueComponent")
        CocoaMessage(@alpha, nscolorspace, "alphaComponent")
        rgba = RGBA(red * 255.9, green * 255.9, blue * 255.9, alpha * 255.)
        ProcedureReturn rgba
      EndIf
    EndProcedure
    
    Procedure OSX_NSColorToRGB(NSColor)
      Protected.cgfloat red, green, blue
      Protected r, g, b, a
      Protected nscolorspace, rgb
      nscolorspace = CocoaMessage(0, nscolor, "colorUsingColorSpaceName:$", @"NSCalibratedRGBColorSpace")
      If nscolorspace
        CocoaMessage(@red, nscolorspace, "redComponent")
        CocoaMessage(@green, nscolorspace, "greenComponent")
        CocoaMessage(@blue, nscolorspace, "blueComponent")
        rgb = RGB(red * 255.0, green * 255.0, blue * 255.0)
        ProcedureReturn rgb
      EndIf
    EndProcedure
  CompilerEndIf
  
  
Zeile 1450

Code: Alles auswählen

        CompilerSelect #PB_Compiler_OS ;{ window background color (if possible)
          CompilerCase #PB_OS_Windows
            TBEx()\Color\Back      = GetSysColor_(#COLOR_MENU)
            TBEx()\Color\Separator = GetSysColor_(#COLOR_3DSHADOW)
            TBEx()\Color\Focus     = GetSysColor_(#COLOR_MENUHILIGHT)
          CompilerCase #PB_OS_MacOS
            TBEx()\Color\Back      = OSX_NSColorToRGB(CocoaMessage(0, 0, "NSColor controlBackgroundColor"))
            TBEx()\Color\Separator = OSX_NSColorToRGB(CocoaMessage(0, 0, "NSColor separatorColor"))
            TBEx()\Color\Focus     = OSX_NSColorToRGB(CocoaMessage(0, 0, "NSColor selectedControlColor"))
            TBEx()\Color\Border    = OSX_NSColorToRGB(CocoaMessage(0, 0, "NSColor grayColor"))
          CompilerCase #PB_OS_Linux
            
        CompilerEndSelect ;}
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten