PureBasic Forum
https://www.purebasic.fr/english/

Workaround Darkmode CanvasGadget
https://www.purebasic.fr/english/viewtopic.php?f=19&t=72680
Page 1 of 1

Author:  mk-soft [ Fri Apr 19, 2019 1:12 pm ]
Post subject:  Workaround Darkmode CanvasGadget

Workaround Darkmode CanvasGadget
Code:
;-TOP

; Comment : Workaround Darkmode CanvasGadget PB v5.7x
; Version : v1.02
; Create  : 19.04.2019
; Update  : 12.08.2019
; OS      : macOS

Procedure CanvasSetGadgetBackgoundColor(Gadget, BackColor = #PB_Ignore)
  CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
    Protected sv, container, cnt, index, obj, NSBackColor
    Protected Alpha.CGFloat, Blue.CGFloat, Green.CGFloat, Red.CGFloat
   
    If BackColor <> #PB_Ignore
      Red = Red(BackColor) / 255
      Green = Green(BackColor) / 255
      Blue = Blue(BackColor) / 255
      Alpha = 1.0
      NSBackColor = CocoaMessage(0, 0, "NSColor colorWithDeviceRed:@", @Red, "green:@", @Green, "blue:@", @Blue, "alpha:@", @Alpha)
    Else
      NSBackColor = CocoaMessage(0, 0, "NSColor windowBackgroundColor")
    EndIf
   
    sv = CocoaMessage(0, GadgetID(Gadget), "subviews")
    If CocoaMessage(0, sv, "count")
      container = CocoaMessage(0, sv, "objectAtIndex:", 0)
      If container
        sv = CocoaMessage(0, container, "subviews")
        cnt = CocoaMessage(0, sv, "count") - 1
        For index = 0 To cnt
          obj = CocoaMessage(0, sv, "objectAtIndex:@", @index)
          CocoaMessage(0, obj, "setBackgroundColor:", NSBackColor)
        Next
      EndIf
    EndIf
  CompilerEndIf
EndProcedure

Procedure IsDarkmode()
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_MacOS
      Protected UserDefaults, NSString, String.s
      UserDefaults = CocoaMessage(0, 0, "NSUserDefaults standardUserDefaults")
      NSString = CocoaMessage(0, UserDefaults, "stringForKey:$", @"AppleInterfaceStyle")
      If NSString
        String = PeekS(CocoaMessage(0, NSString, "UTF8String"), -1, #PB_UTF8)
        If String = "Dark"
          ProcedureReturn 1
        Else
          ProcedureReturn 0
        EndIf
      Else
        ProcedureReturn 0
      EndIf
     
    CompilerCase #PB_OS_Windows
      ProcedureReturn 0
    CompilerCase #PB_OS_Linux
      ProcedureReturn 0
     
  CompilerEndSelect
 
EndProcedure

; *******************************************************************************

CompilerIf #PB_Compiler_IsMainFile
 
  Procedure RedrawCanvas0()
    ResizeGadget(0, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore)
    StartDrawing(CanvasOutput(0))
    Box(0, 0, GadgetWidth(0), GadgetHeight(0), $FF0000)
    Box(2, 2, GadgetWidth(0) - 4, GadgetHeight(0) - 4, $B48246)
    StopDrawing()
  EndProcedure
 
  Procedure RedrawCanvas3()
    ResizeGadget(5, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore)
  EndProcedure
 
  Procedure SizeWindow()
    ResizeGadget(4, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20)
  EndProcedure
 
  ; ---------------------------------------------------------------------------
 
  Define Event
 
  ; ---------------------------------------------------------------------------
 
  If OpenWindow(0, 0, 0, 220, 220, "Canvas Container Workaround", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
   
    CanvasGadget(0, 0, 0, 200, 200, #PB_Canvas_Container)
    ButtonGadget(1, 10, 10, 80, 30, "Button 1")
    CloseGadgetList()
   
    ScrollAreaGadget(2, 0, 0, 400, 400, 400, 400); #PB_Container_BorderLess)
    CanvasGadget(3, 0, 0, 400, 400, #PB_Canvas_Container)
    ButtonGadget(5, 10, 10, 80, 30, "Button 5")
    StringGadget(6, 10, 50, 200, 25, "Texte")
    TextGadget(7, 10, 90, 200, 60, "Hello World!")
    CloseGadgetList()
    CloseGadgetList()
   
    CanvasSetGadgetBackgoundColor(3)
    CanvasSetGadgetBackgoundColor(0, #Red)
   
    StartDrawing(CanvasOutput(3))
    Define x, y
    y = 0
    For x = 0 To 195 Step 10
      Box(x, y, 400-2*x, 400-2*y, RGB(Random(255), Random(255), Random(255)))
      y + 10        ; the same as y = y + 10
    Next x
    StopDrawing()
   
    SplitterGadget(4, 10, 10, 200, 200, 2, 0);, #PB_Splitter_Separator)
   
    RedrawCanvas0()
   
    BindEvent(#PB_Event_SizeWindow, @SizeWindow(), 0)
   
    BindGadgetEvent(0, @RedrawCanvas0(), #PB_EventType_Resize)
    BindGadgetEvent(2, @RedrawCanvas3(), #PB_EventType_Resize)
   
    Repeat
      Event = WaitWindowEvent()
     
    Until Event = #PB_Event_CloseWindow
   
  EndIf
 
CompilerEndIf

Page 1 of 1 All times are UTC + 1 hour
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/