Seite 1 von 2

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

Verfasst: 10.03.2019 18:06
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

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

Verfasst: 10.03.2019 18:10
von RSBasic
:allright:

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

Verfasst: 10.03.2019 18:41
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.

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

Verfasst: 10.03.2019 19:28
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 

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

Verfasst: 10.03.2019 22:18
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)

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

Verfasst: 10.03.2019 22:46
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

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

Verfasst: 10.03.2019 22:49
von Thorsten1867
@mk-soft

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

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

Verfasst: 12.03.2019 11:40
von Thorsten1867
Hinzugefügt: ComboBox / SpinGadget / ButtonGadget

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

Verfasst: 17.03.2019 12:59
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

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

Verfasst: 17.03.2019 14:03
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 ;}