It is currently Sun Jul 21, 2019 11:54 am

All times are UTC + 1 hour




Post new topic Reply to topic  [ 1 post ] 
Author Message
 Post subject: CanvasGadget and OSX Darkmode
PostPosted: Sun Dec 16, 2018 7:00 pm 
Offline
Addict
Addict
User avatar

Joined: Fri May 12, 2006 6:51 pm
Posts: 1769
Location: Germany
Some gadgets are transparent.

I think is not a Bug from Purebasic , but a problem with macOS Mojave in Darkmode and the CanvasGadget.
Code:
;-TOP

; Workaround PB v5.62
; Version : v1.1
; Create  : 24.08.2018
; Update  : 15.12.2018

; -----------------------------------------------------------------------------

;- Global

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_MacOS
    ;TODO
   
  CompilerCase #PB_OS_Windows
    ;TODO
   
  CompilerCase #PB_OS_Linux
    ; Ubuntu compiler bug
    ImportC "-no-pie" : EndImport
   
CompilerEndSelect

; -----------------------------------------------------------------------------

;- Begin Module

DeclareModule Workaround
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_MacOS
     
      Declare FixResizeGadget(Gadget, x, y, width, height)
     
      Macro ResizeGadget(Gadget, x, y, width, height)
        FixResizeGadget(Gadget, x, y, width, height)
      EndMacro
     
    CompilerCase #PB_OS_Windows
      ;TODO
     
    CompilerCase #PB_OS_Linux
      ;TODO
     
  CompilerEndSelect
 
EndDeclareModule

;----

Module Workaround
 
  EnableExplicit
 
  Macro PB(Function)
    Function
  EndMacro
 
  CompilerSelect #PB_Compiler_OS
     
    CompilerCase #PB_OS_MacOS
     
      ; Link https://www.purebasic.fr/english/viewtopic.php?f=24&t=71269
      ; Canvas Gadget Container Bugfix
      Procedure FixResizeGadget(Gadget, x, y, width, height)
        Protected rect.NSRect, sv, container
        PB(ResizeGadget)(Gadget, x, y, width, height)
        If GadgetType(Gadget) <> #PB_GadgetType_Canvas
          ProcedureReturn 1
        EndIf
        sv = CocoaMessage(0, GadgetID(Gadget), "subviews")
        If CocoaMessage(0, sv, "count")
          container = CocoaMessage(0, sv, "objectAtIndex:", 0)
          If container
            CocoaMessage(@rect, GadgetID(Gadget), "frame")
            rect\origin\x = 0
            rect\origin\y = 0
            CocoaMessage(0, container, "setFrame:@", @rect)
          EndIf
        EndIf
      EndProcedure
     
    CompilerCase #PB_OS_Windows
      ;TODO
     
    CompilerCase #PB_OS_Linux
      ;TODO
  CompilerEndSelect
 
EndModule

;- End Module

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

CompilerIf #PB_Compiler_IsMainFile
 
  UseModule Workaround
 
  ; ---------------------------------------------------------------------------
 
  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
 
  ; ---------------------------------------------------------------------------
 
  Procedure CanvasSetGadgetBackgoundColor(Gadget, NSBackColor)
    Protected sv, container, cnt, index, obj
   
    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
   
  EndProcedure
 
  Define Event
 
  ; ---------------------------------------------------------------------------
 
  If OpenWindow(0, 0, 0, 220, 220, "Canvas Container Workaround", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
   
    Define NSBackColor = CocoaMessage(0, WindowID(Window), "backgroundColor", 0)
   
    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(0, NSBackColor)
    ;CanvasSetGadgetBackgoundColor(3, NSBackColor)
   
    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

_________________
My Projects ThreadToGUI / OOP-BaseClass / OOP-BaseClassDispatch / Event-Designer
PB v3.30 / v5.70 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace


Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1 post ] 

All times are UTC + 1 hour


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
Jump to:  

 


Powered by phpBB © 2008 phpBB Group
subSilver+ theme by Canver Software, sponsor Sanal Modifiye