CanvasGadget(#PB_EventType_Repaint or #PB_EventType_Resize)

Got an idea for enhancing PureBasic? New command(s) you'd like to see?
mestnyi
Addict
Addict
Posts: 1098
Joined: Mon Nov 25, 2013 6:41 am

CanvasGadget(#PB_EventType_Repaint or #PB_EventType_Resize)

Post by mestnyi »

Example for linux and windows

Code: Select all

Macro EnableEnumerate
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    Import ""
    CompilerElse
      ImportC ""
      CompilerEndIf
      PB_Object_EnumerateStart( PB_Objects )
      PB_Object_EnumerateNext( PB_Objects, *ID.Integer )
      PB_Object_EnumerateAbort( PB_Objects )
      
      PB_Object_Count( PB_Objects )
      
      PB_Window_Objects.i
      PB_Gadget_Objects.i
    EndImport
  EndMacro : EnableEnumerate
  
  ;- ImageButton
  DeclareModule ImageButton
    EnableExplicit
    
    Enumeration #PB_EventType_FirstCustomValue
      #PB_EventType_Repaint
    EndEnumeration
    
    ;
    #PB_GadgetType_ImageButton = 34
    
    #PB_Button_Top = #PB_Button_Left <<2
    #PB_Button_Bottom = #PB_Button_Left <<3
    ;
    Declare Repaint( Gadget )
    Declare Free( Gadget )
    Declare Gadget( Gadget, X,Y,Width,Height, Text.s, ImageID.i = #False, Flags.i = #False, ImgWidth.i = 16, ImgHeight.i = 16 )
  EndDeclareModule
  
  Module ImageButton
    Macro EnableEnumerate
      CompilerIf #PB_Compiler_OS = #PB_OS_Windows
        Import ""
        CompilerElse
          ImportC ""
          CompilerEndIf
          PB_Object_EnumerateStart( PB_Objects )
          PB_Object_EnumerateNext( PB_Objects, *ID.Integer )
          PB_Object_EnumerateAbort( PB_Objects )
          
          PB_Object_Count( PB_Objects )
          
          PB_Window_Objects.i
          PB_Gadget_Objects.i
        EndImport
      EndMacro : EnableEnumerate
      
      Structure ImageButton
        Canvas.i
        Flags.i
        ;
        Img.i
        Text.s
        ;
        FontID.i
        ColorFont.i
        ;
        ColorIdleBorder.i
        ColorIdleTop.i
        ColorIdleBottom.i
        ;
        ColorHoverBorder.i
        ColorHoverTop.i
        ColorHoverBottom.i
        ;
        ColorPressBorder.i
        ColorPressTop.i
        ColorPressBottom.i
        ;
        HoverItem.i
        PressItem.i
      EndStructure
      
      Global NewMap *ImageButtonData()
      
      Procedure _setImageButtonData(GadgetID, *data)
        *ImageButtonData(Str(GadgetID)) = *data
      EndProcedure
      
      Procedure _getImageButtonData(GadgetID)
        ProcedureReturn *ImageButtonData(Str(GadgetID))
      EndProcedure
      
      Procedure Img( ImageID, Width = 16, Height = 16 )
        If IsImage(ImageID)
          ImageID = ImageID(ImageID)
        EndIf
        
        If ImageID
          CompilerSelect #PB_Compiler_OS
            CompilerCase #PB_OS_Windows
              Protected ImgID = CopyImage_(ImageID, #IMAGE_ICON, Width, Height, #LR_COPYRETURNORG)
              If ImgID 
                ImageID = ImgID
              Else
                ImageID = CopyImage_(ImageID, #IMAGE_BITMAP, Width, Height, #LR_COPYRETURNORG)
              EndIf
          CompilerEndSelect
          
          Protected Image = CreateImage(#PB_Any, Width, Height, 32)
          If StartDrawing(ImageOutput(Image))
            DrawingMode(#PB_2DDrawing_AllChannels)
            Box(0, 0, OutputWidth(), OutputHeight())
            DrawImage(ImageID, 0, 0, Width, Height )
            StopDrawing()
          EndIf
          
          ProcedureReturn Image
        EndIf
      EndProcedure
      
      Procedure Repaint( GadgetID )
        Protected *IMG.ImageButton = _getImageButtonData( GadgetID )
        If GadgetID
          Protected TopColor.i, BottomColor.i, BorderColor.i, DefaultColor.i, Width, Height
          
          If (*IMG And IsGadget(*IMG\Canvas))
            With *IMG
              If (StartDrawing(CanvasOutput(\Canvas)))
                Width = GadgetWidth(\Canvas) 
                Height = GadgetHeight(\Canvas) 
;                 Width = OutputWidth()
;                 Height = OutputHeight()
                                               ;               Debug GadgetWidth(\Canvas)
                                               ;               Debug Width
                                               ;
                If ((\PressItem = \HoverItem) And (\PressItem))
                  TopColor    = \ColorPressTop
                  BottomColor = \ColorPressBottom
                  BorderColor = \ColorPressBorder
                  DefaultColor = \ColorPressBorder
                ElseIf (\HoverItem)
                  TopColor    = \ColorHoverTop
                  BottomColor = \ColorHoverBottom
                  BorderColor = \ColorHoverBorder
                  DefaultColor = \ColorHoverBorder
                Else
                  TopColor    = \ColorIdleTop
                  BottomColor = \ColorIdleBottom
                  BorderColor = \ColorIdleBorder
                  DefaultColor = \ColorHoverBorder
                EndIf
                
                
                ;
                DrawingMode(#PB_2DDrawing_Gradient)
                BackColor(TopColor)
                FrontColor(BottomColor)
                LinearGradient(0, 0, 0, Height)
                Box(0, 0, Width, Height)
                
                ;
                DrawingMode(#PB_2DDrawing_Outlined)
                If ((\Flags & #PB_Button_Default) = #PB_Button_Default)
                  Box(0, 0, Width, Height, DefaultColor)
                Else
                  Box(0, 0, Width, Height, BorderColor)
                EndIf
                
                
                Protected X, ImageWidth, Y, ImageHeight
                DrawingFont(\FontID)
                DrawingMode(#PB_2DDrawing_AlphaBlend)
                
                X = (Width-TextWidth(\Text))>>1
                Y = (Height-TextHeight(\Text))>>1
                
                If IsImage(\Img)
                  ImageWidth = ImageWidth(\Img)
                  ImageHeight = ImageHeight(\Img)
                  
                  If (\Flags & #PB_Button_Left) = #PB_Button_Left
                    X = X+1-ImageWidth>>1
                    Y = (Height - ImageHeight)>>1
                  ElseIf (\Flags & #PB_Button_Top) = #PB_Button_Top
                    X = (Width - ImageWidth)>>1
                    Y = Y-2-ImageHeight>>1
                  ElseIf (\Flags & #PB_Button_Right) = #PB_Button_Right
                    X = (X+TextWidth(\Text)+1)-ImageWidth>>1 
                    Y = (Height - ImageHeight)>>1
                  ElseIf (\Flags & #PB_Button_Bottom) = #PB_Button_Bottom
                    X = (Width - ImageWidth)>>1
                    Y = (Y+2+TextHeight(\Text))-ImageHeight>>1
                  Else
                    X = (Width - ImageWidth)>>1
                    Y = (Height - ImageHeight)>>1
                  EndIf
                  
                  DrawImage(ImageID(\Img), X, Y) ; center
                  
                  X = (Width-TextWidth(\Text))>>1
                  Y = (Height-TextHeight(\Text))>>1
                  
                  If (\Flags & #PB_Button_Left) = #PB_Button_Left
                    X = X+2+ImageWidth>>1
                  ElseIf (\Flags & #PB_Button_Top) = #PB_Button_Top
                    Y = Y+2+ImageHeight>>1
                  ElseIf (\Flags & #PB_Button_Right) = #PB_Button_Right
                    X = X-2-ImageWidth>>1
                  ElseIf (\Flags & #PB_Button_Bottom) = #PB_Button_Bottom
                    Y = Y-2-TextHeight(\Text)
                  EndIf
                  
                Else
                  If (\Flags & #PB_Button_Left) = #PB_Button_Left
                    X = 2
                  ElseIf (\Flags & #PB_Button_Top) = #PB_Button_Top
                    Y = 2
                  ElseIf (\Flags & #PB_Button_Right) = #PB_Button_Right
                    X = Width-TextWidth(\Text)-2
                  ElseIf (\Flags & #PB_Button_Bottom) = #PB_Button_Bottom
                    Y = Height-TextHeight(\Text)-2
                  EndIf
                EndIf
                
                DrawingMode(#PB_2DDrawing_Transparent)
                DrawText(X, Y, \Text, \ColorFont)
                
                StopDrawing()
              EndIf
            EndWith
          EndIf
        EndIf
      EndProcedure
      
      Procedure Callback( )
        Static Redraw
        Protected *IMG.ImageButton = _getImageButtonData(GadgetID(EventGadget()))
        
        If (*IMG And IsGadget(*IMG\Canvas))
          With *IMG
            Select (EventType())
              Case #PB_EventType_Repaint
                Repaint(GadgetID(EventGadget()))
                
              Case #PB_EventType_MouseEnter,
                   #PB_EventType_MouseMove, 
                   #PB_EventType_LeftButtonDown
                
                If (GetGadgetAttribute(\Canvas, #PB_Canvas_MouseX) >=0 And
                    GadgetWidth(\Canvas) >= GetGadgetAttribute(\Canvas, #PB_Canvas_MouseX)) And
                   (GetGadgetAttribute(\Canvas, #PB_Canvas_MouseY) >=0 And 
                    GadgetHeight(\Canvas) >= GetGadgetAttribute(\Canvas, #PB_Canvas_MouseY))
                  \HoverItem = #True
                Else
                  \HoverItem = #False
                EndIf
                If (EventType() = #PB_EventType_LeftButtonDown)
                  \PressItem = #True
                EndIf
                Redraw = #True
                
              Case #PB_EventType_LeftButtonUp
                \PressItem = #False
                Redraw = #True
                
              Case #PB_EventType_MouseLeave
                \HoverItem = #False
                Redraw = #True
                
            EndSelect
            
            If Redraw = #True 
              Repaint( GadgetID(EventGadget()) )
              Redraw = #False 
            EndIf
          EndWith
        EndIf
      EndProcedure
      
      Procedure Free( Gadget )
        If (IsGadget(Gadget))
          SetGadgetData(Gadget, #Null)
          UnbindGadgetEvent(Gadget, @Callback())
          
          If (GetGadgetData(Gadget))
            ClearStructure(GetGadgetData(Gadget), ImageButton)
            FreeMemory(GetGadgetData(Gadget))
          EndIf
          FreeGadget(Gadget)
          FreeMap(*ImageButtonData())
        EndIf
        ProcedureReturn (#Null)
      EndProcedure
      
      CompilerIf #PB_Compiler_OS = #PB_OS_Linux
        CompilerIf Defined(GdkEvent,#PB_Structure)=#False
          Structure GdkEvent
            Type.l
            StructureUnion
              any.GdkEventAny
              expose.GdkEventExpose    
              no_expose.GdkEventNoExpose    
              visibility.GdkEventVisibility    
              motion.GdkEventMotion
              button.GdkEventButton
              scroll.GdkEventScroll
              key.GdkEventKey
              crossing.GdkEventCrossing
              focus_change.GdkEventFocus            
              configure.GdkEventConfigure        
              property.GdkEventProperty    
              selection.GdkEventSelection    
              proximity.GdkEventProximity
              client.GdkEventClient        
              dnd.GdkEventDND               
              window_state.GdkEventWindowState       
              setting.GdkEventSetting           
            EndStructureUnion
          EndStructure
        CompilerEndIf
        
        Procedure GetDlgCtrlID_(*Widget.GtkWidget)
          Protected Gadget
          PB_Object_EnumerateStart( PB_Gadget_Objects )
          
          If PB_Gadget_Objects
            While PB_Object_EnumerateNext(PB_Gadget_Objects, @Gadget )
              If GadgetID( Gadget ) = *Widget\name
                ProcedureReturn Gadget
              EndIf
            Wend
            
            PB_Object_EnumerateAbort( PB_Gadget_Objects ) 
          EndIf
          
        EndProcedure
        
        ProcedureC OS_Callback(*Event.GdkEventAny, *UserData)
          Protected Stat.S
          Protected *Widget.GtkWidget
          
          Select *Event\Type
            Case #GDK_CONFIGURE
            Case #GDK_EXPOSE
              *Widget.gtkWidget = *Event\window
              If *Widget\name
                ;Repaint(*Widget\name)
                ;Debug ""+Str(*Widget\name)+" "+PeekS(gtk_widget_get_name_(*Widget\name), -1, #PB_UTF8) 
              PostEvent( #PB_Event_Gadget, EventWindow(), GetDlgCtrlID_(*Widget), #PB_EventType_Repaint)
             EndIf
              
           Default
             
         EndSelect
          
          gtk_main_do_event_(*Event)
        EndProcedure 
        Procedure Disable_Os_Event( Gadget )
          Static run
          If IsGadget( Gadget )
            
            ;If run = 0 :run = 1
              gdk_event_handler_set_(@OS_Callback(), Gadget, 0)
            ;EndIf
            
          EndIf
        EndProcedure
        
      CompilerElse
        Procedure OS_CallBack(hWnd, Msg, wParam, lParam)
          Protected *Func = GetProp_( hWnd, "PB_OS_CallBack") 
          
          Select Msg
            ;Case #WM_PAINT
              ;Repaint((hWnd))
              ;PostEvent( #PB_Event_Gadget, EventWindow(), GetDlgCtrlID_(hWnd), #PB_EventType_Repaint)
             
            Case #WM_SIZE
              ;  SendMessage_(hWnd,#WM_PAINT,0,0)
               PostEvent( #PB_Event_Gadget, EventWindow(), GetDlgCtrlID_(hWnd), #PB_EventType_Repaint)
              
            Case #WM_NCDESTROY
              RemoveProp_(hwnd,"PB_OS_CallBack")
              
            Default      
          EndSelect
          
             ProcedureReturn CallWindowProc_(*Func, hWnd, Msg, wParam, lParam) ; #PB_ProcessPureBasicEvents ; 
         EndProcedure
        
        Procedure Disable_Os_Event( Gadget )
          Protected GadgetID1, GadgetID2, GadgetID3, GadgetID4, GadgetID5, GadgetID6
          If IsGadget( Gadget )
            If GetProp_( GadgetID( Gadget ), "PB_OS_CallBack") = #False
            SetProp_( GadgetID( Gadget ), "PB_OS_CallBack", SetWindowLong_(GadgetID( Gadget ), #GWL_WNDPROC, @OS_CallBack()))
            ;SetWindowCallback(  @OS_CallBack()); 
          EndIf
          EndIf
        EndProcedure
      CompilerEndIf
      
      Procedure Gadget( Gadget, X.i, Y.i, Width.i, Height.i, Text.s, ImageID.i = #False, Flags.i = #False, ImgWidth.i = 16, ImgHeight.i = 16 )
        Protected *IMG.ImageButton = #Null
        Protected Canvas.i = CanvasGadget(Gadget, X, Y, Width, Height) :If Gadget ! -1 :Canvas = Gadget :EndIf
        If IsGadget(Canvas)
          *IMG = AllocateMemory(SizeOf(ImageButton))
          If (*IMG)
            InitializeStructure(*IMG, ImageButton)
            With *IMG
              \Canvas    = Canvas
              \ColorFont = RGB(0, 0, 0)
              
              If ImageID And Text And Flags = #False
                Flags = #PB_Button_Left
              EndIf  
              
              \Flags    = Flags
              ;
              CompilerSelect (#PB_Compiler_OS)
                CompilerCase (#PB_OS_Windows)
                  Protected Temp.i = TextGadget(#PB_Any, 0, 0, 25, 25, " ")
                  If (Temp)
                    \FontID = GetGadgetFont(Temp)
                    FreeGadget(Temp)
                  EndIf
                  :  \FontID = GetGadgetFont(#PB_Default)
                CompilerCase (#PB_OS_MacOS)
                  Protected Temp.i = TextGadget(#PB_Any, 0, 0, 25, 25, " ")
                  If (Temp)
                    \FontID = GetGadgetFont(Temp)
                    FreeGadget(Temp)
                  EndIf
                CompilerDefault
                  Protected Temp.i = TextGadget(#PB_Any, 0, 0, 25, 25, " ")
                  If (Temp)
                    \FontID = GetGadgetFont(Temp)
                    FreeGadget(Temp)
                  EndIf
                  ;  CompilerError "Not tested on this OS yet"
              CompilerEndSelect
              
              ;           CompilerIf #PB_Compiler_OS = #PB_OS_Windows
              ;             CanvasColor = GetSysColor_(#COLOR_3DFACE)
              ;           CompilerEndIf
              
              ;
              ; Default colors (based on Windows 7)
              \ColorIdleBorder  = RGB(172, 172, 172)
              \ColorIdleTop     = RGB(240, 240, 240)
              \ColorIdleBottom  = RGB(229, 229, 229)
              ;\ColorHoverBorder = RGB(126, 180, 234)
              \ColorHoverBorder = RGB(0, 160, 252)
              \ColorHoverTop    = RGB(236, 244, 252)
              \ColorHoverBottom = RGB(220, 236, 252)
              \ColorPressBorder = RGB(86, 157, 229)
              \ColorPressTop    = RGB(218, 236, 252)
              \ColorPressBottom = RGB(196, 224, 252)
              
              \Img = Img(ImageID,ImgWidth,ImgHeight)
              \Text = " "+Text.s+" "
              
            EndWith
            ;
            _setImageButtonData(GadgetID(Canvas), *IMG)
            
            Repaint( GadgetID(Canvas) )
            BindGadgetEvent(Canvas, @Callback())
            
            Disable_Os_Event( Canvas )
            CompilerIf #PB_Compiler_OS = #PB_OS_Windows
              If GetWindowLongPtr_(GadgetID(Canvas), #GWL_STYLE) & #WS_CLIPSIBLINGS = #False 
                SetWindowLongPtr_( GadgetID(Canvas), #GWL_STYLE, GetWindowLongPtr_( GadgetID(Canvas), #GWL_STYLE )|#WS_CLIPSIBLINGS )
              EndIf
            CompilerEndIf
          Else
            FreeGadget(Canvas)
          EndIf
        EndIf
        
        ProcedureReturn (Canvas)
      EndProcedure
    EndModule
    
    
    UsePNGImageDecoder()
    LoadImage(4, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Paste.png")
    
    Procedure Resize()
      Protected Gadget
      PB_Object_EnumerateStart( PB_Gadget_Objects )
      
      If PB_Gadget_Objects
        While PB_Object_EnumerateNext(PB_Gadget_Objects, @Gadget )
          If IsGadget( Gadget )
            ResizeGadget(Gadget,#PB_Ignore,#PB_Ignore,WindowWidth(EventWindow())-20,#PB_Ignore)
          EndIf
        Wend
        
        PB_Object_EnumerateAbort( PB_Gadget_Objects ) 
      EndIf
      
    EndProcedure
    
    Procedure Repaint()
;       Protected Gadget
;       PB_Object_EnumerateStart( PB_Gadget_Objects )
;       
;       If PB_Gadget_Objects
;         While PB_Object_EnumerateNext(PB_Gadget_Objects, @Gadget )
;           If IsGadget( Gadget )
;               ;             ResizeGadget(Gadget,#PB_Ignore,#PB_Ignore,WindowWidth(EventWindow())-20,#PB_Ignore)
;                          ImageButton::Repaint(GadgetID(Gadget))
;             ;Break
;           EndIf
;         Wend
;         
;         PB_Object_EnumerateAbort( PB_Gadget_Objects ) 
;       EndIf
;       
    EndProcedure
    
    If OpenWindow(0, 0, 0, 150, 515, "ImageButton", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
      WindowBounds(0,150,515,#PB_Ignore,515)
      
      ImageButton::Gadget(#PB_Any, 10,10,130,25,"image_left",ImageID(4),#PB_Button_Left)
      ImageButton::Gadget(#PB_Any, 10,40,130,25,"image_right",ImageID(4),#PB_Button_Right)
      ImageButton::Gadget(#PB_Any, 10,70,130,75,"image_top",ImageID(4),ImageButton::#PB_Button_Top,32,32)
      ImageButton::Gadget(#PB_Any, 10,150,130,75,"image_bottom",ImageID(4),ImageButton::#PB_Button_Bottom,32,32)
      
      ImageButton::Gadget(#PB_Any, 10,230,130,75,"",ImageID(4))
      
      ImageButton::Gadget(#PB_Any, 10,310,130,35,"text_center",0,#PB_Button_Default)
      ImageButton::Gadget(#PB_Any, 10,350,130,35,"text_left",0,#PB_Button_Left)
      ImageButton::Gadget(#PB_Any, 10,390,130,35,"text_right",0,#PB_Button_Right)
      ImageButton::Gadget(#PB_Any, 10,430,130,35,"text_top",0,ImageButton::#PB_Button_Top)
      ImageButton::Gadget(#PB_Any, 10,470,130,35,"text_bottom",0,ImageButton::#PB_Button_Bottom)
      
      BindEvent( #PB_Event_SizeWindow, @Resize())
      ;BindEvent( #PB_Event_Repaint, @Repaint())
      Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
    EndIf
; IDE Options = PureBasic 5.31 (Linux - x86)
; CursorPosition = 28
; Folding = O5-MAsP5FA9
; EnableUnicode
; EnableXP
Last edited by mestnyi on Fri Apr 01, 2016 5:12 pm, edited 1 time in total.
mestnyi
Addict
Addict
Posts: 1098
Joined: Mon Nov 25, 2013 6:41 am

Re: CanvasGadget(#PB_EventType_Repaint or #PB_EventType_Resi

Post by mestnyi »

Should not such an event? Why are you silent?
Post Reply