Calques façon photoshop

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Calques façon photoshop

Message par blendman »

salut

En ce moment, je cherche le moyen de créer des calques comme ceux de photoshop ou tout autre soft 2D, pour l'intégrer à mon soft animatoon.

Je fais cela en 3 étapes :
- tout d'abord la création du panneau (ou menu flottant)
- puis la création du calque (un ensemble de bouton image : calque visible, calque bloqué, calque lié, etc...)
- puis la création du calque en tant qu'image gadget sur laquelle ensuite on pourra dessiner (ça c'est déjà fait, voir mon sujet animatoon)

Pour le moment, j'ai réalisé l'étape 1 et 2.

Mais avant cela, j'ai fait le panneau des calques (avec l'excellent pureform, en retouchant un peu le code ensuite).

Si certains veulent tester.
Ce n'est pas terminé mais ça fonctionne déjà.

Par contre, savez-vous s'il est possible de faire une sorte d'update de la fenêtre, car il arrive que lorsque l'on passe un panneau au dessus d'un autre, on a une espèce de bug graphique très moche : le panneau copie une partie de l'image dans l'autre panneau.

Sinon, j'ai 2 erreurs sur les "boutons" du panneau layers (bouton close et minimize, voir les commentaires ;<<<<<<------), si vous avez une idée de la raison du bug.

Le code :

Code : Tout sélectionner

;{ Informations
; Floatting panels, and interface like in photoshop/gimp/painter/mypaint..
; made by blendman, in july 2011
; pb 4.60 and pureform (for the base)
;}

;{- Enumerations / DataSections

;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ image
#layer_ht = 0
;}
;{ Gadgets
Enumeration
  #Cont_layer
  #Cont_tools
  #cont_swatch
  ;text
  #T_opac
  #T_blendmode  
  ;trackbar
  #TB_Opac
  ;string
  #St_opac
  ;images
  #I_G_toplayer
  #I_layer1  
  #I_G_topTools
  #I_G_topswatch
  #I_G_grid_swatch
  ;buttons
  #B_layer_min
  #B_layer_close
  #b_blendmode
  #B_newlayer
  #B_SupLayer
  #B_MaskLayer
  #B_RegLayer
  #B_opac  
  ; button tools
  #B_tool_resize
  #B_tool_move
  #B_tool_select
  #B_tool_wind
  #B_tool_brush
  #B_tool_eraser
  ;scrollarea
  #SA_Layer 
  #SA_swatch
  ; combo box   
  #CB_ZonTra
  
  #lastgadget
EndEnumeration

;}
;}

;{ variables, globales
; general
Global clic.b, info$, nb_gadget.u = #lastgadget+1
;move Ui
Global Panel_move.b, move_layer.b, move_tools.b, move_swatch.b
; UI
Global hide_layer.b, layer_y.u, hide_tools.b, tools_y.u, hide_swatch.b, swatch_y.u
; layers
Global current_layer.a, nb_layer.a, curpos_layer.a
; EVENT
Global Event.i, EventWindow.i, EventGadget.i, EventMenu.i
;}

;{ Init & images

;{ UI general
;bordure
CreateImage(0,180,15)
StartDrawing(ImageOutput(0))
Box(0,0,180,15,RGB(170,170,170))
StopDrawing()
;}
;{ layer 
; layer background
CreateImage(1,180,15)
StartDrawing(ImageOutput(1))
Box(0,0,180,20,RGB(130,130,130))
StopDrawing()

; image tool buttons
CreateImage(2,25,25)
StartDrawing(ImageOutput(2))
Box(0,0,30,30,RGB(200,200,200))
StopDrawing()
;}
;{ image layer images
CreateImage(4,25,25) ; visible
StartDrawing(ImageOutput(4))
Box(0,0,30,30,RGB(200,200,200))
StopDrawing()

CreateImage(5,350,25) ; center normal
StartDrawing(ImageOutput(5))
Box(0,0,350,30,RGB(160,160,160))
StopDrawing()

CreateImage(6,25,25) ; locked
StartDrawing(ImageOutput(6))
Box(0,0,30,30,RGB(200,200,200))
StopDrawing()

CreateImage(7,350,25) ; center selected
StartDrawing(ImageOutput(7))
Box(0,0,350,30,RGB(110,110,110))
StopDrawing()
;}
;{ swatch
;bordure
CreateImage(10,200,200)
StartDrawing(ImageOutput(10))
Box(0,0,200,200,RGB(255,255,255))
For i = 0 To 20
  Line(0,i*12,200,1,RGB(120,120,120))
Next i
For i = 0 To 20
  Line(i*12,0,1,200,0)
Next i
StopDrawing()
;}
;}

;{ structures

Structure s_layer
  ; image for the button
  i_center.i
  i_lock.i
  i_visible.i
  name$  
  ; parameters of the layer
  Id.i
  position.u
  blendmode.b
  opacity.a
  locked.b
  visible.b
  imageID.i ; the image attached to the layer 
EndStructure

Global NewList layers.s_layer()

Structure s_img_layer
  x.i
  y.i
  id.i
  widht.u
  height.u  
EndStructure

Global NewList Image_layer.s_img_layer()

;}

;{ declare
Declare create_layer() : Declare delete_layer() : Declare move_layer() : Declare layers_list()
Declare factorysetting()
;}

;{ Procedures & macros

Procedure OpenWindow_Window()
  If OpenWindow(#Window_0, 0,0,1024,768, "Animatoon layers", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_MaximizeGadget|#PB_Window_Maximize|#PB_Window_ScreenCentered)
    SetWindowColor(0,RGB(150,150,150))
    SmartWindowRefresh(#Window_0, #True)
    ;{ top menu    
    If  CreateMenu(1,WindowID(0))
      MenuTitle("File") ; shortcut 0->19
      MenuItem(0,"New")
      MenuItem(1,"Open")
      MenuBar()
      MenuItem(2,"Save")
      
      MenuTitle("Edit") ; shortcuts 20->39
      MenuItem(20,"Copy") 
      
      MenuTitle("View") ; shortcuts 40->59
      MenuItem(40,"Zoom") 
      
      MenuTitle("Layers") ; shortcut  60->79
      MenuItem(60,"New")
      
      MenuTitle("Window") ; shortcut 80->99
      MenuItem(84,"Reset the position of the Panels")
      MenuBar()
      MenuItem(80,"Hide/Unhide panels"+Chr(9)+"Tab") ;shortcut 80
      MenuBar()
      MenuItem(81,"Show Layers") 
      MenuItem(82,"Show Tools") 
      MenuItem(83,"Show Swatch") 
      
      MenuTitle("Help")   ;shortcut 100->119
      MenuItem(100,"About") 
    EndIf
    ;}
    ;{ status bar
    If CreateStatusBar(0,WindowID(0))
      AddStatusBarField(20)
      AddStatusBarField(300)
      AddStatusBarField(#PB_Ignore)
      StatusBarText(0,1,Info$,#PB_StatusBar_BorderLess)
    EndIf
      ;}  
    ;{ Tools panel
    ContainerGadget(#Cont_tools, 5, 40, 60, 350, #PB_Container_Double|#PB_Container_Raised)
    ImageGadget(#I_G_topTools,0,0,60,20,ImageID(0)) 
    ButtonImageGadget(#B_tool_resize, 2, 25, 25, 25, ImageID(2),#PB_Button_Toggle)
    ButtonImageGadget(#B_tool_move, 26, 25, 25, 25,ImageID(2),#PB_Button_Toggle)
    ButtonImageGadget(#B_tool_wind, 2, 50, 25, 25,ImageID(2),#PB_Button_Toggle)
    ButtonImageGadget(#B_tool_select, 26, 50, 25, 25,ImageID(2),#PB_Button_Toggle)
    ButtonImageGadget(#B_tool_brush, 2, 78, 25, 25,ImageID(2),#PB_Button_Toggle)
    ButtonImageGadget(#B_tool_eraser, 26, 78, 25, 25,ImageID(2),#PB_Button_Toggle)
    CloseGadgetList()
      ;}
    ;{ layers (flotting panel)
    If ContainerGadget(#Cont_layer, WindowWidth(0)-150, WindowHeight(0)-200, 180, 400, #PB_Container_Double|#PB_Container_Raised)
        ImageGadget(#I_G_Toplayer,0,0,180,20,ImageID(0))
        TextGadget(#T_opac, 5, 42, 46, 20, "Opacité", #PB_Text_Center|#SS_CENTERIMAGE)
        TrackBarGadget(#TB_Opac, 52, 45, 115, 16, 0, 100)
        StringGadget(#St_opac, 124, 18, 26, 20, "100", #PB_String_Numeric)
        GadgetToolTip(#St_opac, "Opacité")
        ; top button (close, min)
        ButtonImageGadget(#B_layer_min, 140, 0, 15, 15, 0)
        ButtonImageGadget(#B_layer_close, 155, 0, 15, 15, 0)
        ; blendmode    
        TextGadget(#T_blendmode, 5, 17, 90, 20, "Normal", #SS_CENTERIMAGE|#PB_Text_Border)
        ButtonImageGadget(#b_blendmode, 95, 16, 15, 20,0)
        GadgetToolTip(#T_blendmode, "Layer Blend mode")        
        ;bouton bas
        ButtonImageGadget(#B_SupLayer, 120, 374, 20, 20, 0)
        GadgetToolTip(#B_SupLayer, "Supprimer le calque Actif")
        ButtonImageGadget(#B_newlayer, 100, 374, 20, 20, 0)
        GadgetToolTip(#B_newlayer, "Créer un nouveau calque")
        ButtonImageGadget(#B_MaskLayer, 80, 374, 20, 20, 0)
        GadgetToolTip(#B_MaskLayer, "Créer un mask de Fusion")
        ButtonImageGadget(#B_RegLayer, 60, 374, 20, 20, 0)
        GadgetToolTip(#B_RegLayer, "Ajouter un calque de réglage")        
        ; zone transparence
        CheckBoxGadget(#CB_ZonTra, 5, 62, 150, 15, "Préserver la transparence")
        ButtonImageGadget(#B_opac, 153, 18, 10, 20, 0)
        ; scroll for the layers
        ScrollAreaGadget(#SA_Layer, 5, 82, 165, 290, 146, 632, 10, #PB_ScrollArea_Single)
          layers_list()  
        CloseGadgetList()      
        CloseGadgetList()
      EndIf
    
    ;}  
    ;{ Swatches
    If ContainerGadget(#cont_swatch, WindowWidth(0)-150, WindowHeight(0)-100, 180, 250, #PB_Container_Double|#PB_Container_Raised)
      ImageGadget(#I_G_topswatch,0,0,180,25,ImageID(0))
      ScrollAreaGadget(#SA_swatch,5,20,160,100,135,150,10,#PB_ScrollArea_Single)
      ImageGadget(#I_G_grid_swatch,0,0,160,160,ImageID(10))
      CloseGadgetList()      
      CloseGadgetList()
    EndIf    
    ;}
    ;{ pop up menu layer mode
    If CreatePopupMenu(0)
      MenuItem(0,"Normal")
      MenuBar()
      MenuItem(0,"Multiply")
      MenuItem(0,"Color Burn")
      MenuBar()
      MenuItem(0,"Screen")
      MenuItem(0,"Add")
      MenuItem(0,"Linear Light")
      MenuItem(0,"Vivid Light")    
      MenuBar()
      MenuItem(0,"Overlay")
      MenuBar()    
      MenuItem(0,"Negatif")
      MenuItem(0,"Saturation")
      MenuItem(0,"Color")
      MenuBar()
    EndIf
      ;} 
    ;{ Gadget Colors
    ;PureCOLOR_SetGadgetColor(#Cont_layer, #PureCOLOR_SystemColor, $707070) ; need the lib purecolor
    SetGadgetColor(#T_blendmode,#PB_Gadget_BackColor ,RGB(150,150,150))
    ;}
    ;{ shortcuts
    AddKeyboardShortcut(0,#PB_Shortcut_Tab, 80) ; quit the program

    ;}
    create_layer() ; create a new layer to use in the scrollarea
    factorysetting()
  EndIf
EndProcedure

;{ Layers 
Procedure create_layer()  
  AddElement(layers())  ; add a layer to the list
  AddElement(Image_layer()) ; add an image to the list
  nb_layer +1
  curpos_layer +1
  With layers()
    \id = nb_layer
    current_layer = \id
    \blendmode = 0    
    \locked = 0
    \visible = 1
    \position = curpos_layer
    \i_visible  = 500 + (nb_layer-1)*3 + 1
    \i_center   = 500 + (nb_layer-1)*3 + 2
    \i_lock     = 500 + (nb_layer-1)*3 + 3    
    \name$ = "Layer" + Str(\id)
  EndWith
  OpenGadgetList(#SA_Layer)
  layers_list()
  CloseGadgetList()      
; NOT FINISHED
EndProcedure

Procedure delete_layer()  
  If ListSize(layers())>1
    With layers()
      If IsGadget(\i_center)
        curpos_layer - 1
        current_layer - 1
        Debug current_layer
        FreeGadget(\i_center)
        DeleteElement(layers(),1)
        DeleteElement(Image_layer(),1)       
        OpenGadgetList(#SA_Layer)
        layers_list()
        CloseGadgetList() 
      EndIf 
    EndWith 
  Else
    MessageRequester("Erreur","Vous devez avoir plus d'un calque pour effectuer cette action.")
  EndIf  
EndProcedure

Procedure move_layer()
  
EndProcedure

Procedure layers_list()  
  ForEach layers() 
    With layers()  
      If \id = current_layer
        ImageGadget(\i_center   ,0 ,1+26*(\position-1),180,25,ImageID(7))
      Else
        ImageGadget(\i_center   ,0 ,1+26*(\position-1),180,25,ImageID(5))
      EndIf
      ; NOT FINISHED !!!
      ;ImageGadget(\i_visible  ,0  ,1+25*(\position-1),25,25,ImageID(4))
      ;ImageGadget(\i_lock     ,120,1+25*(\position-1),25,25,ImageID(6))
    EndWith    
  Next  
EndProcedure
;}

;{ macros : move, hide, snap
Macro move_UI(move, gadget, hide, resX, resY, posX, posX1, x, y, min=0)
  If  WindowMouseX(0) > GadgetX(gadget) And WindowMouseX(0) < GadgetX(gadget)+GadgetWidth(gadget)-min
    If move = 1 
      move=2
    EndIf
  EndIf 
  snapping(move, gadget, hide, resX, resY, posX, posX1, x, y)
EndMacro

Macro snapping(move, gadget, hide, resX, resY, posX, posX1, x, y)
  If move = 2 
    ResizeGadget(gadget,WindowMouseX(0)-resX,WindowMouseY(0)-resy,#PB_Ignore,#PB_Ignore)
    Y = WindowMouseY(0)
  ElseIf move = 0 And hide = 0
    If posX>posX1 ;And GadgetY(gadget)posY
      ResizeGadget(gadget,x,y,#PB_Ignore,#PB_Ignore)
    EndIf    
  EndIf
EndMacro

Macro hide_ui(hide, y, gadget)
  If hide = 0
    y =GadgetY(gadget)
  EndIf 
  hide = 1 - hide
  ResizeGadget(gadget, #PB_Ignore,hide*-5000+y,#PB_Ignore,#PB_Ignore)
EndMacro
;}

;{ Update, reset
Procedure update_UI()
  
  ;{ Display infos
  If Panel_move = 0
    info$ = Str(WindowMouseX(0))+" / "+Str(WindowMouseY(0))+" - "+Str(GadgetX(#Cont_layer))+" / "+Str(GadgetY(#Cont_layer))+" / "+Str(move_tools)
    StatusBarText(0, 1, info$)  
  EndIf
  ;}
    
  ;{ Move and snap
  move_ui(move_layer,#Cont_layer, hide_layer,80,6,GadgetX(#Cont_layer),WindowWidth(0)-250,WindowWidth(0)-185,layer_y,55)
  move_ui(move_swatch,#cont_swatch, hide_swatch,80,6,GadgetX(#cont_swatch),WindowWidth(0)-250,WindowWidth(0)-185,swatch_y,55)
  move_ui(move_tools,#Cont_tools,hide_tools,30,6,60,GadgetX(#Cont_tools),5,tools_y)  
  ;}
  
  ;{ tests
  If WindowMouseX(0) > GadgetX(#Cont_layer)+125 And WindowMouseX(0) < GadgetX(#Cont_layer)+GadgetWidth(#Cont_layer)-25 And WindowMouseY(0) > GadgetY(#Cont_layer) And WindowMouseY(0) < GadgetY(#Cont_layer)+20
    ;If eventtype = #B_layer_min
    ;SetGadgetState(#B_layer_min, 1)
    SetActiveGadget(#B_layer_min)
    ;EndIf    
  ElseIf  WindowMouseX(0) > GadgetX(#Cont_layer)+140 And WindowMouseX(0) < GadgetX(#Cont_layer)+GadgetWidth(#Cont_layer)-5 And WindowMouseY(0) > GadgetY(#Cont_layer) And WindowMouseY(0) < GadgetY(#Cont_layer)+20
    SetActiveGadget(#B_layer_close)
    ;If eventtype = #B_layer_close
    ; SetGadgetState(#B_layer_close, 0)      
    ; EndIf    
  EndIf
  ;}
  
EndProcedure

Procedure reset_move()
  Panel_move = 0
  move_layer = 0  
  move_tools = 0  
  move_swatch = 0
EndProcedure

Procedure factorysetting()
  ; not finished
  reset_move()  
  ResizeGadget(#cont_swatch, WindowWidth(0)-150, WindowHeight(0)-100, 180, 150)
  ResizeGadget(#Cont_layer, WindowWidth(0)-150, WindowHeight(0)-200, 180, 400)
  ResizeGadget(#Cont_tools, 5, 40, 60, 350)
  
  layer_y = 15
  swatch_y = 400+15
  tools_y = 20
EndProcedure
;}

; event
Procedure  event_UI()
    
  If event  <> 0
    
    Select Event  
        
      Case #PB_Event_Menu
        Select EventMenu()
            
            
            
          Case 60
            create_layer()
            
          Case 80 ; tab : show/hide all panels
            hide_ui(hide_layer, layer_y, #Cont_layer)
            hide_ui(hide_tools, tool_y, #Cont_tools) 
            hide_ui(hide_swatch, swatch_y, #cont_swatch) 
;   
          Case 81 ; layers
            hide_ui(hide_layer, layer_y, #Cont_layer)
            
          Case 82 ; tools
            hide_ui(hide_tools, tool_y, #Cont_tools) 
            
          Case 83
            hide_ui(hide_swatch, swatch_y, #cont_swatch) 
          Case 84
            factorysetting()
          Case 100
            MessageRequester("About", "This is a test for a interface system like in "+Chr(10)+"Photoshop, mypaint, painter, gimp For example. "+Chr(10)+"This example is made by Blendman, in 07/2011.")
        EndSelect
        
        
      Case #WM_LBUTTONUP ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ---------- TROUVER UN EQUIVALENT POUR LINUX ET MAC !!!! //don't work with Linux and Mac :(
         reset_move()
        
      Case #PB_Event_Gadget
        EventGadget = EventGadget()
        EventType = EventType()        
        If eventgadget = #I_G_Toplayer  
          If eventtype = #PB_EventType_LeftClick And move_layer =0
            Panel_move = 1
            move_layer = 1                    
          EndIf           
        ElseIf eventgadget = #I_G_topTools  
          If eventtype = #PB_EventType_LeftClick And move_tools =0
            Panel_move = 1
            move_tools = 1                    
          EndIf  
        ElseIf eventgadget = #I_G_topswatch  
          If eventtype = #PB_EventType_LeftClick And move_swatch =0
            Panel_move = 1
            move_swatch = 1                    
          EndIf 
            
        ElseIf EventGadget = #TB_Opac ; trackbra pour régler l'opacité
        ElseIf EventGadget = #B_opac ; button pour régler l'opacite
          ; ouvrira un trakcbra pour régler l'opacité
        ElseIf EventGadget = #St_opac        
        ElseIf EventGadget = #B_layer_close
          reset_move()
          Debug "close panel" ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ne marche pas ?? - don't work ?
        ElseIf EventGadget = #SA_Layer
        ElseIf EventGadget = #B_layer_min
          reset_move()
          Debug "minimize panel" ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ne marche pas ??   - don't work ?       
        ElseIf EventGadget = #B_newlayer
          If eventtype = #PB_EventType_LeftClick
            create_layer()             
          EndIf            
        ElseIf EventGadget = #B_SupLayer
          If eventtype = #PB_EventType_LeftClick
            delete_layer()
          EndIf
        ElseIf EventGadget = #B_MaskLayer
        ElseIf EventGadget = #B_RegLayer
        ElseIf EventGadget = #b_blendmode
          reset_move()   
          DisplayPopupMenu(0,WindowID(0),WindowX(0)+GadgetX(#Cont_layer)+GadgetX(#T_blendmode)+7,WindowY(0)+GadgetY(#Cont_layer)+GadgetY(#T_blendmode)+70)            
        ElseIf EventGadget = #CB_ZonTra ; combo box, zone transparent  (keep the transparent pixels     
        EndIf        
      Case #PB_Event_CloseWindow
        EventWindow = EventWindow()
        If EventWindow = #Window_0
          CloseWindow(#Window_0)          
        EndIf
    EndSelect        
  Else
    Delay(1)
  EndIf
EndProcedure
;}



OpenWindow_Window()

;{ Pincipal loop
Repeat
  Event = WaitWindowEvent(1)      
  
  update_UI()  
  event_UI()
  
Until event = #PB_Event_CloseWindow
;
;}
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Re: Calques façon photoshop

Message par jbernard13 »

j'ai testé le code sous seven il marche bien j'ai le curseur , je peux pas t'aider pour les bugs que tu rencontre .
Jbernard13
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Re: Calques façon photoshop

Message par Atomo »

Tes bugs de rafraîchissement et de boutons ont pour cause le même problème, la superposition de gadgets, chose qu'il ne faut jamais faire.
Dans le premier cas, tu superposes des ContainerGadget, et dans le second cas, un ImageGadget avec des ButtonGadget.
Ce qu'il faudrait faire pour corriger les problèmes selon moi, remplacer toutes tes sous-fenêtres ContainerGadget par des vraies fenêtres (chaque fenêtre est gérée dans son propre thread) avec le flag #PB_Window_Tool ou bien utiliser des MDIGadget.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Calques façon photoshop

Message par blendman »

Atomo a écrit :Tes bugs de rafraîchissement et de boutons ont pour cause le même problème, la superposition de gadgets, chose qu'il ne faut jamais faire.
Dans le premier cas, tu superposes des ContainerGadget, et dans le second cas, un ImageGadget avec des ButtonGadget.
Ce qu'il faudrait faire pour corriger les problèmes selon moi, remplacer toutes tes sous-fenêtres ContainerGadget par des vraies fenêtres (chaque fenêtre est gérée dans son propre thread) avec le flag #PB_Window_Tool ou bien utiliser des MDIGadget.
je comprends.
J'avoue que je ne souhaite pas trop utiliser les MDI, pour que ça reste compatible sur tous les OS, malgrè le fait que ce soit vraiment très pratique ;).
Maintenant s'il y a une possibilité de rendre ça compatible avec linux et Mac, je les utiliserai avec plaisir, car c'est vraiment très intéressant.

Du coup, j'ai testé avec une autre méthode que tu m'as conseillées : les fenêtres.

Code : Tout sélectionner

;{---- Informations
; Software test : animatoon
; Floatting panels, and interface like in photoshop/gimp/painter/mypaint..
; methode N°2
; made by blendman, in july 2011 (12/07/2011)
; pb 4.60
;}

;{---- enumeration
; window
Enumeration
  #W_main
  #W_tool ; tools
  #W_swatch ; swatch, brush, preset
  #W_Layers ; layers, channels
  #W_infos ; infos, options tools 
EndEnumeration

;images
Enumeration
  #img_surface
EndEnumeration

;gadgets
Enumeration
  ;-- Window  Main
  #Main_cont
  #Main_SA_surface
  #Main_IG_surface
  #Main_IG_finale
 
  ;-- Window swatch
  ; container
  #Swatch_cont
  ; panel
  #Swatch_panel
  ; buttons
  #Swatch_B_min
 
  ;-- Window Tools
  ; container
  #Tool_cont
  ;buttons 
  #Tool_B_brush
  #Tool_B_eraser
  #Tool_B_select
  #Tool_B_move
 
  ;-- Window Layers
  ; container
  #Layers_cont
  ; panel
  #Layers_panel
  ; buttons
  #Layers_B_brush
 
  ;-- Window Infos 
  #Infos_cont
  #Infos_panel
 
  ;-- autres constantes
  ; autres
  #Cont_layer
  #Cont_tools
  #cont_swatch
 
  ;text
  #T_opac
  #T_blendmode 
  ;trackbar
  #TB_Opac
  ;string
  #St_opac
  ;images
  #I_G_toplayer
  #I_layer1 
  #I_G_topTools
  #I_G_topswatch
  #I_G_grid_swatch
  ;buttons
  #B_layer_min
  #B_layer_close
  #b_blendmode
  #B_newlayer
  #B_SupLayer
  #B_MaskLayer
  #B_RegLayer
  #B_opac 
  ; button tools
  #B_tool_resize
  #B_tool_move
  #B_tool_select
  #B_tool_wind
  #B_tool_brush
  #B_tool_eraser
  ;scrollarea
  #SA_Layer
  #SA_swatch
  ; combo box   
  #CB_ZonTra
 
  #lastgadget 
EndEnumeration
;}

;{---- variables, globales

; general
Global hide_win.b=1, quit.b, window_min.b, maximizWin.b
;document
Global doc_h.u = 2000,doc_w.u=2000
; Interface
Global clic.b, info1$, info2$, info3$, nb_gadget.u = #lastgadget+1
; move Ui
Global snap_layer.b, snap_tools.b, snap_swatch.b, move.b
; UI
;Global hide_layer.b, layer_y.u, hide_tools.b, tools_y.u, hide_swatch.b, swatch_y.u
; layers
Global current_layer.a, nb_layer.a, curpos_layer.a
; EVENT
Global Event.i, EventWindow.i, EventGadget.i, EventMenu.i,EventType.i
;}

;{---- structure
Structure s_window
  Id.i
EndStructure

Global NewList win.s_window()

; layers
Structure s_layer
  ; image for the button
  i_center.i
  i_lock.i
  i_visible.i
  name$ 
  ; parameters of the layer
  Id.i
  position.u
  blendmode.b
  opacity.a
  locked.b
  visible.b
  imageID.i ; the image attached to the layer
EndStructure

Global NewList layers.s_layer()

Structure s_img_layer
  x.i
  y.i
  id.i
  widht.u
  height.u 
EndStructure

Global NewList Image_layer.s_img_layer()
;}

;{---- declare
Declare hideWin() : Declare factorysetting()
Declare new_layer() : Declare delete_layer() : Declare move_layer() : Declare layers_list()
;}

;{---- Init & images
If UseJPEGImageDecoder()=0 Or UsePNGImageDecoder()=0 Or UseTGAImageDecoder() = 0 Or UseTGAImageDecoder() =0
  End 
EndIf

; Image : surface drawing
CreateImage(#img_surface,doc_w,doc_h,32)
StartDrawing(ImageOutput(#img_surface))
Box(0,0,doc_w, doc_h,RGB(255,255,255))
StopDrawing()

;{ layer
; layer background
CreateImage(1,180,15)
StartDrawing(ImageOutput(1))
Box(0,0,180,20,RGB(130,130,130))
StopDrawing()

; image tool buttons
CreateImage(2,25,25)
StartDrawing(ImageOutput(2))
Box(0,0,30,30,RGB(200,200,200))
StopDrawing()
;}
;{ image layer images
CreateImage(4,25,25) ; visible
StartDrawing(ImageOutput(4))
Box(0,0,30,30,RGB(200,200,200))
StopDrawing()

CreateImage(5,350,25) ; center normal
StartDrawing(ImageOutput(5))
Box(0,0,350,30,RGB(160,160,160))
StopDrawing()

CreateImage(6,25,25) ; locked
StartDrawing(ImageOutput(6))
Box(0,0,30,30,RGB(200,200,200))
StopDrawing()

CreateImage(7,350,25) ; center selected
StartDrawing(ImageOutput(7))
Box(0,0,350,30,RGB(110,110,110))
StopDrawing()
;}
;{ swatch
;bordure
CreateImage(10,200,200)
StartDrawing(ImageOutput(10))
Box(0,0,200,200,RGB(255,255,255))
For i = 0 To 20
  Line(0,i*12,200,1,RGB(120,120,120))
Next i
For i = 0 To 20
  Line(i*12,0,1,200,0)
Next i
StopDrawing()
;}


;}

;{----procedures

;{ create

Procedure add_window_tool(number, name$, x, y, w, h, flag, color=8224125)
  OpenWindow(number,x,y,w,h,Name$,flag)
  SetWindowColor(number,color)
  StickyWindow(number,1)
EndProcedure

Procedure create_infos()
  AddElement(win())
  win()\Id = #W_infos ; 4
  add_window_tool(#W_infos,"Infos",WindowWidth(0)-220,WindowHeight(0)-150,200,150,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_Tool)
  If ContainerGadget(#Infos_cont,2,2,196,146)
      PanelGadget(#infos_panel,5,5,190,140)
        AddGadgetItem (#infos_panel, -1, "Infos")     
        AddGadgetItem (#infos_panel, -1, "Options")
        AddGadgetItem (#infos_panel, -1, "Navigation")   
    CloseGadgetList()
  EndIf
 
EndProcedure

Procedure create_swatch() 
  AddElement(win())
  win()\Id = 2 
 
  add_window_tool(2,"Swatches",WindowWidth(0)-220,80,200,150,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_Tool)
  If ContainerGadget( #Swatch_cont,2,2,196,146)
      PanelGadget(#Swatch_panel,5,5,190,140)
        AddGadgetItem (#Swatch_panel, -1, "Swatches")     
          ScrollAreaGadget(#SA_swatch,5,5,160,100,135,150,10,#PB_ScrollArea_Single)
          ImageGadget(#I_G_grid_swatch,0,0,160,160,ImageID(10))
          CloseGadgetList()       
        AddGadgetItem (#Swatch_panel, -1, "Brush")
        AddGadgetItem (#Swatch_panel, -1, "Presets")     
      CloseGadgetList()
    CloseGadgetList()
    ;ButtonGadget(#Swatch_B_min,185,5,10,10,"")
  EndIf 
EndProcedure

Procedure create_Tool()
  AddElement(win())
  win()\Id = 1 
 
  add_window_tool(1,"Tools",5,80,60,250,#PB_Window_Tool)
  If ContainerGadget(#Tool_cont,2,2,56,246)
    ButtonGadget(#Tool_B_brush,5,5,20,20,"")
    ButtonGadget(#Tool_B_eraser,5,26,20,20,"")
    ButtonGadget(#Tool_B_move,26,5,20,20,"")
    ButtonGadget(#Tool_B_select,26,26,20,20,"")   
  EndIf
EndProcedure

Procedure create_Layers() 
  AddElement(win())
  win()\Id = 3
 
  If IsWindow(2)    
    add_window_tool(3,"Layers",WindowWidth(0)-220,WindowY(2)+WindowHeight(2)+40,200,430,#PB_Window_Tool|#PB_Window_SizeGadget|#PB_Window_SystemMenu)
  Else
    add_window_tool(3,"Layers",WindowWidth(0)-220,80,200,430,#PB_Window_Tool|#PB_Window_SizeGadget|#PB_Window_SystemMenu)
  EndIf
 
  WindowBounds(3, 200, 100, 200, 430)
 
  If ContainerGadget(#Cont_layer, 0, 0, 200, 800)   
    PanelGadget( #Layers_panel,5,5,190,420)
     AddGadgetItem (#Layers_panel, -1, "Layers")   
      ; opacite
      TextGadget(#T_opac, 5, 42, 46, 20, "Opacité", #PB_Text_Center|#SS_CENTERIMAGE)
      TrackBarGadget(#TB_Opac, 52, 45, 115, 16, 0, 100)
      StringGadget(#St_opac, 124, 18, 26, 20, "100", #PB_String_Numeric)
      GadgetToolTip(#St_opac, "Opacité")     
      ; blendmode   
      TextGadget(#T_blendmode, 5, 17, 90, 20, "Normal", #SS_CENTERIMAGE|#PB_Text_Border)
      ButtonImageGadget(#b_blendmode, 95, 16, 15, 20,0)
      GadgetToolTip(#T_blendmode, "Layer Blend mode")       
      ;bouton bas
      ButtonImageGadget(#B_SupLayer, 120, 374, 20, 20, 0)
      GadgetToolTip(#B_SupLayer, "Supprimer le calque Actif")
      ButtonImageGadget(#B_newlayer, 100, 374, 20, 20, 0)
      GadgetToolTip(#B_newlayer, "Créer un nouveau calque")
      ButtonImageGadget(#B_MaskLayer, 80, 374, 20, 20, 0)
      GadgetToolTip(#B_MaskLayer, "Créer un mask de Fusion")
      ButtonImageGadget(#B_RegLayer, 60, 374, 20, 20, 0)
      GadgetToolTip(#B_RegLayer, "Ajouter un calque de réglage")       
      ; zone transparence
      CheckBoxGadget(#CB_ZonTra, 5, 62, 150, 15, "Préserver la transparence")
      ButtonImageGadget(#B_opac, 153, 18, 10, 20, 0)
      ; scroll for the layers
      ScrollAreaGadget(#SA_Layer, 5, 82, 165, 290, 146, 632, 10, #PB_ScrollArea_Single)
      layers_list() 
      CloseGadgetList()
     
    AddGadgetItem (#Layers_panel, -1, "Channels")
     
    CloseGadgetList()
    CloseGadgetList()
  EndIf

  ;{ pop up menu layer mode
    If CreatePopupMenu(0)
      MenuItem(0,"Normal")
      MenuBar()
      MenuItem(0,"Multiply")
      MenuItem(0,"Color Burn")
      MenuBar()
      MenuItem(0,"Screen")
      MenuItem(0,"Add")
      MenuItem(0,"Linear Light")
      MenuItem(0,"Vivid Light")   
      MenuBar()
      MenuItem(0,"Overlay")
      MenuBar()   
      MenuItem(0,"Negatif")
      MenuItem(0,"Saturation")
      MenuItem(0,"Color")
      MenuBar()
    EndIf
      ;}

EndProcedure

Procedure createAllwin()
  If Not IsWindow(#W_tool)
    create_Tool()   
  EndIf
  If Not IsWindow(#W_swatch)
    create_swatch()
  EndIf
  If Not IsWindow(#W_Layers)
    create_Layers()   
  EndIf 
  If Not IsWindow(#W_infos)
    create_infos()
  EndIf 
  hideWin()
  factorysetting()
EndProcedure

Procedure create_DrawSurf()
  If ContainerGadget(#Main_cont, 0,23,WindowWidth(0),WindowHeight(0)-64,#PB_Container_Single)
     If ScrollAreaGadget(#Main_SA_surface,5,5,WindowWidth(0)-15,WindowHeight(0)-53-5-23,doc_w,doc_h,30, #PB_ScrollArea_Flat)
       ImageGadget(#Main_IG_surface,0,0, doc_w,doc_h,ImageID(#img_surface))
       CloseGadgetList()
     EndIf     
     CloseGadgetList()
  EndIf 
  SetGadgetColor(#Main_cont,#PB_Gadget_BackColor,RGB(115,115,115))
EndProcedure
;}

;{ Layers

Procedure new_layer() 
  AddElement(layers())  ; add a layer to the list
  AddElement(Image_layer()) ; add an image to the list
  nb_layer +1
  curpos_layer +1
  With layers()
    \id = nb_layer
    current_layer = \id
    \blendmode = 0   
    \locked = 0
    \visible = 1
    \position = curpos_layer
    \i_visible  = 500 + (nb_layer-1)*3 + 1
    \i_center   = 500 + (nb_layer-1)*3 + 2
    \i_lock     = 500 + (nb_layer-1)*3 + 3   
    \name$ = "Layer" + Str(\id)
  EndWith
  OpenGadgetList(#SA_Layer)
  layers_list()
  CloseGadgetList()     
; NOT FINISHED
EndProcedure

Procedure delete_layer() 
  If ListSize(layers())>1
    With layers()
      If IsGadget(\i_center)
        curpos_layer - 1
        current_layer - 1
        Debug current_layer
        FreeGadget(\i_center)
        DeleteElement(layers(),1)
        DeleteElement(Image_layer(),1)       
        OpenGadgetList(#SA_Layer)
        layers_list()
        CloseGadgetList()
      EndIf
    EndWith
  Else
    MessageRequester("Erreur","Vous devez avoir plus d'un calque pour effectuer cette action.")
  EndIf 
EndProcedure

Procedure move_layer()
 
EndProcedure

Procedure layers_list() 
  ForEach layers()
    With layers() 
      If \id = current_layer
        ImageGadget(\i_center   ,0 ,1+26*(\position-1),180,25,ImageID(7))
      Else
        ImageGadget(\i_center   ,0 ,1+26*(\position-1),180,25,ImageID(5))
      EndIf
      ; NOT FINISHED !!!
      ;ImageGadget(\i_visible  ,0  ,1+25*(\position-1),25,25,ImageID(4))
      ;ImageGadget(\i_lock     ,120,1+25*(\position-1),25,25,ImageID(6))
    EndWith   
  Next 
EndProcedure

;}

;{ hide, snap, show..

; hide
Procedure hideWin()
  If hide_win = 0
    hide_win = 1
    For i = 1 To ListSize(win())
      ResizeWindow(i, #PB_Ignore, WindowY(i)-5000, #PB_Ignore,#PB_Ignore)
    Next i
  ElseIf hide_win = 1
    hide_win = 0
    For i = 1 To ListSize(win())
      ResizeWindow(i, #PB_Ignore, WindowY(i)+5000, #PB_Ignore,#PB_Ignore)
      StickyWindow(i,1)
    Next i
    SetActiveWindow(0)
  EndIf
EndProcedure

Procedure hidepanel(panel)
    If WindowY(panel)>0
      ResizeWindow(panel,#PB_Ignore,WindowY(panel)-5000,#PB_Ignore,#PB_Ignore)
    Else
      ResizeWindow(panel,#PB_Ignore,WindowY(panel)+5000,#PB_Ignore,#PB_Ignore)
    EndIf
EndProcedure

; snap
Procedure snapping(win, posX, x, mode=1)
  If GetActiveWindow() = win
    If mode =1
      If WindowX(win)>posX
        ResizeWindow(win,x,#PB_Ignore,#PB_Ignore,#PB_Ignore)
        SetActiveWindow(0)
      Else
        SetActiveWindow(0)
      EndIf
    ElseIf mode = -1
      If WindowX(win)<posX
        ResizeWindow(win,x,#PB_Ignore,#PB_Ignore,#PB_Ignore)
        SetActiveWindow(0)
      Else
        SetActiveWindow(0)
      EndIf
    EndIf
  EndIf 
EndProcedure
 
; focus
Procedure sticky() ; if the window isn't focused
  For iji =1 To ListSize(win())
    StickyWindow(iji,0)
  Next iji 
EndProcedure

Procedure sticky2() ; if the main window is focused
  If GetActiveWindow() = 0
    For iji =1 To ListSize(win())
      StickyWindow(iji,1)
    Next iji     
  EndIf   
EndProcedure
;}

;{ Updates, reset

Procedure update_UI()
  If Panel_move = 0
    info2$ = "Coords : "+Str(WindowMouseX(0))+" / "+Str(WindowMouseY(0))
    info1$ = "Zoom : "+Str(zoom)+"%"
    StatusBarText(0, 0, info1$)
    StatusBarText(0, 1, info2$) 
    StatusBarText(0, 2, info3$)
  EndIf
 
EndProcedure

Procedure factorysetting()
  ; not finished
  ResizeWindow(#W_tool, 5,80,60,250)
  ResizeWindow(#W_swatch, WindowWidth(0)-220,80,200,150)
  ResizeWindow(#W_Layers, WindowWidth(0)-220,270,200,430)
  ResizeWindow(#W_infos, WindowWidth(0)-220,720,200,150)
EndProcedure

;}

;{ event

Procedure event_win_fille()
  If event
   
    If event = #PB_Event_MinimizeWindow
      hidewin()
     
    ElseIf event = #PB_Event_MaximizeWindow
      hidewin()
     
    ElseIf event = #WM_LBUTTONUP ; <------ erreur ??
      ; debug "up"
      SetActiveWindow(0)
     
    ElseIf event = #PB_Event_MoveWindow   
      snapping(#W_Layers, WindowWidth(0)-250, WindowWidth(0)-210) 
      snapping(#W_swatch, WindowWidth(0)-250, WindowWidth(0)-210)
      snapping(#W_tool,70, 5,-1)
     
    ElseIf event = #PB_Event_Gadget
      Select EventGadget()
         
        Case #B_newlayer
          If eventtype = #PB_EventType_LeftClick
            new_layer()             
          EndIf   
         
        Case #B_SupLayer
          If eventtype = #PB_EventType_LeftClick
            delete_layer()
          EndIf
         
        Case  #B_MaskLayer
          MessageRequester("Mask","Not implemented")
         
        Case #B_RegLayer   
          MessageRequester("Layer settings","Not implemented")
         
        Case  #b_blendmode   
          DisplayPopupMenu(0,WindowID(3),WindowX(3)+GadgetX(#Cont_layer)+GadgetX(#T_blendmode)+7,WindowY(3)+GadgetY(#Cont_layer)+GadgetY(#T_blendmode)+70) 
                   
      EndSelect
     
    ElseIf event = #PB_Event_Menu
      Select EventMenu()
         
        Case 19
          quit = 1
         
        Case 80
          HideWin() 
         
      EndSelect
     
     
    EndIf
  Else
    SetActiveWindow(0)
  EndIf   
EndProcedure

Procedure event()

  EventType = EventType()
  If event
    update_UI()
   
    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      If EventWindow() = 0       
        Quit = 1
      Else
        i = EventWindow()
        ForEach win()
          If win()\id = i
            If IsWindow(i)
              CloseWindow(i)           
            EndIf
            DeleteElement(win(),1)
            Break
          EndIf         
        Next
      EndIf
     
    ElseIf GetActiveWindow() =-1 And event <> #PB_Event_MinimizeWindow And event <> #PB_Event_MaximizeWindow
      If window_min = 0       
        sticky()
        window_min = 1
      EndIf
     
    ElseIf event = #WM_LBUTTONUP
      If GetActiveWindow() <>0
        SetActiveWindow(0)
      EndIf
     
    ElseIf GetActiveWindow() <>0
     event_win_fille()     

    ElseIf event = #PB_Event_ActivateWindow
      If  window_min = 1
        sticky2()
        window_min = 0
      EndIf
     
    ElseIf event = #PB_Event_MinimizeWindow
      hideWin()
     
    ElseIf event = #PB_Event_RestoreWindow 
      maximizWin = 1
     
    ElseIf event = #PB_Event_MaximizeWindow
      If maximizWin =0
        If EventWindow() = 0
          createAllwin()       
          SetActiveWindow(0)
        EndIf
      Else
        maximizWin = 0
      EndIf
   
     
    ElseIf event = #PB_Event_Menu
      Select EventMenu()
        Case 19
          quit = 1
         
        Case 80
          HideWin()
         
        Case 81 ; show layers
           If Not IsWindow(#W_Layers)
            create_Layers()
          Else
            hidepanel(#W_Layers)           
          EndIf
         
        Case 82 ; show tools
          If Not IsWindow(#W_tool)
            create_Tool() 
          Else
            hidepanel(#W_tool)           
          EndIf
                 
        Case 83 ; show swatchs
          If Not IsWindow(#W_swatch)
            create_swatch()
          Else
             hidepanel(#W_swatch)   
          EndIf
         
        Case 84 ; reset
          factorysetting()
         
      EndSelect
    ElseIf event= #PB_Event_Gadget
      Select EventGadget()
         
         Case #B_SupLayer
          If eventtype = #PB_EventType_LeftClick
            delete_layer()
          EndIf
         
      EndSelect
     
    EndIf   
  Else     
    Delay(1)
  EndIf     
EndProcedure

;}

;}

;{---- open window
If OpenWindow(0, 100, 200, 640,  480, "Animatoon - floatting panels - methode2", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget|#PB_Window_WindowCentered|#PB_Window_SizeGadget|#PB_Window_Maximize)
 
  ;{ menu
   If  CreateMenu(1,WindowID(0))
      MenuTitle("File") ; shortcut 0->19
      MenuItem(0,"New")
      MenuItem(1,"Open")
      MenuItem(2,"Open as...")
      MenuBar()
      MenuItem(8,"Save")
      MenuBar()     
      MenuItem(19,"Quit")
     
      MenuTitle("Edit") ; shortcuts 20->39
      MenuItem(20,"Undo")
      MenuItem(21,"Redo")
      MenuBar()
      MenuItem(22,"Copy")
      MenuItem(23,"Cut")
      MenuItem(24,"Paste")
     
      MenuTitle("View") ; shortcuts 40->59
      MenuItem(40,"Zoom +")
      MenuItem(41,"Zoom -")
      MenuItem(42,"Zoom 100%")
      MenuBar()
      MenuItem(43,"Centrer l'image")

      MenuTitle("Layers") ; shortcut  60->79
      MenuItem(60,"Créer un nouveau")
      MenuItem(61,"Supprimer le calque actif")
      MenuBar()

      MenuTitle("Window") ; shortcut 80->99
      MenuItem(84,"Reset the position of the Panels")
      MenuBar()
      MenuItem(80,"Hide/Unhide panels"+Chr(9)+"Tab") ;shortcut 80
      MenuBar()
      MenuItem(81,"Layers")
      MenuItem(82,"Tools")
      MenuItem(83,"Swatch")
     
      MenuTitle("Help")   ;shortcut 100->119
      MenuItem(100,"About")
      MenuItem(101,"Help")
    EndIf
 
  ;}
 
  ;{ toolbar
  If CreateToolBar(0,WindowID(0))
    ToolBarStandardButton(0, #PB_ToolBarIcon_New)
    ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
    ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
  EndIf
 
  ;}
 
  ;{ surface for drawing
create_DrawSurf()
  ;}

  ;{ status bar
  If CreateStatusBar(0,WindowID(0))
      AddStatusBarField(80)
      AddStatusBarField(300)
      AddStatusBarField(#PB_Ignore)
      StatusBarText(0,0,info1$)
      StatusBarText(0,1,Info2$)
      StatusBarText(0,2,Info3$)
  EndIf
  ;}
   
  ;{ shortcut
   AddKeyboardShortcut(0,#PB_Shortcut_Escape, 19) ;
   AddKeyboardShortcut(0,#PB_Shortcut_Tab, 80) ;
  ;}
 
  ;{ sub window, window panel and tools
  createAllwin()
  ;}
 
  ;{ window principal parameters
  SetActiveWindow(0)
  ;SetWindowColor(0,RGB(160,160,160))
  ;}
new_layer()
   
;}




;{---- principal loop
  Repeat
    Event = WaitWindowEvent(1) 
   
    event() 
   
  Until Quit = 1
 
EndIf

;}

End
Effectivement, ça fonctionne pas mal.
Mais le principal problème est que pour voir les panneaux, il faut les mettre en stickywindow(), et du coup, lorsque je clique dans la barre des menus de windows, if arrive que les menus restent au dessus des autres. De plus, dans la barre taches, j'aimerai que ça ne clignote pas lorsque la fenêtre principale perd le focus et que je clique sur un des panneaux, mais je n'ai pas encore trouvé comment résoudre ça.

De plus, je n'ai pas compris comment gérer un thread par fenêtre-fille ouverte :p.
Alors, j'ai un peu du bidouiller. Mais je préfèrerai utiliser un thread pour chaque fenêtre fille, je pense que ce serait mieux.

Encore merci ;).

Cela dit, le jour où les MDI seront ajoutés à linux et mac, je les utiliserai, car ça me semble quand même beaucoup plus simple :).
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Re: Calques façon photoshop

Message par Atomo »

Je t'ai fait un petit exemple avec des threads.
Pour corriger le problème des sticky windows et de la barre des tâches, j'ai attaché les fenêtres fille à la fenêtre principale grâce au paramètre ParentID de OpenWindow.

il faut cocher l'option thread-safe dans les options du compilateur lorsqu'on travail avec les threads.

Code : Tout sélectionner

Enumeration
  #Window_Main
  #Window_Tool1
  #Window_Tool2
EndEnumeration

Declare OpenWindowTool1(*void)
Declare OpenWindowTool2(*void)

If OpenWindow(#Window_Main, 0, 0, 800, 600, "Main", #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered)
  CreateThread(@OpenWindowTool1(), 0)
  CreateThread(@OpenWindowTool2(), 0)
  Repeat
    Event = WaitWindowEvent(1)
  Until Event = #PB_Event_CloseWindow
EndIf

Procedure OpenWindowTool1(*void)
  If OpenWindow(#Window_Tool1, 0, 0, 100, 200, "Tool 1", #PB_Window_SystemMenu|#PB_Window_Tool, WindowID(#Window_Main))
    StickyWindow(#Window_Tool1, #True)
    Repeat
      Event = WaitWindowEvent(1)
    Until Event = #PB_Event_CloseWindow
    CloseWindow(#Window_Tool1)
  EndIf
EndProcedure

Procedure OpenWindowTool2(*void)
  If OpenWindow(#Window_Tool2, 200, 0, 100, 200, "Tool 2", #PB_Window_SystemMenu|#PB_Window_Tool, WindowID(#Window_Main))
    StickyWindow(#Window_Tool2, #True)
    Repeat
      Event = WaitWindowEvent(1)
    Until Event = #PB_Event_CloseWindow
    CloseWindow(#Window_Tool2)
  EndIf
EndProcedure
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Calques façon photoshop

Message par blendman »

Super !!! Merci beaucoup pour ce code, j'ai compris les thread et les fenêtres grâce à toi ;)

Sous Xp, il faut enlever :

Code : Tout sélectionner

StickyWindow(#Window_Tool1, #True)
pour que les fenêtres filles restent quand même devant la fenêtre mère mais pas devant les autres fenêtres lorsque l'on clique sur une autre fenêtre dans la barre des taches.

Encore merci :)

EDIT : j'ai remarqué que lorsque je ferme la fenêtre principale, les 2 autres continuent d'exister. Il n'y a pas une technique pour les fermer ?
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Re: Calques façon photoshop

Message par Atomo »

Normalement la fermeture de la fenêtre principale met fin au programme, essaye d'insérer un End à la fin ou bien teste ce code qui force la fermeture des threads avant de quitter :

Code : Tout sélectionner

Enumeration
  #Window_Main
  #Window_Tool1
  #Window_Tool2
EndEnumeration

Global Exit

Declare OpenWindowTool1(*void)
Declare OpenWindowTool2(*void)

If OpenWindow(#Window_Main, 0, 0, 800, 600, "Main", #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered)
  Thread_1 = CreateThread(@OpenWindowTool1(), 0)
  Thread_2 = CreateThread(@OpenWindowTool2(), 0)
  Repeat
    Event = WaitWindowEvent(1)
  Until Event = #PB_Event_CloseWindow
  Exit = #True
  WaitThread(Thread_1) : WaitThread(Thread_2)
EndIf

Procedure OpenWindowTool1(*void)
  If OpenWindow(#Window_Tool1, 0, 0, 100, 200, "Tool 1", #PB_Window_SystemMenu|#PB_Window_Tool, WindowID(#Window_Main))
    StickyWindow(#Window_Tool1, #True)
    Repeat
      Event = WaitWindowEvent(1)
    Until Event = #PB_Event_CloseWindow Or Exit = #True
    CloseWindow(#Window_Tool1)
  EndIf
EndProcedure

Procedure OpenWindowTool2(*void)
  If OpenWindow(#Window_Tool2, 200, 0, 100, 200, "Tool 2", #PB_Window_SystemMenu|#PB_Window_Tool, WindowID(#Window_Main))
    StickyWindow(#Window_Tool2, #True)
    Repeat
      Event = WaitWindowEvent(1)
    Until Event = #PB_Event_CloseWindow Or Exit = #True
    CloseWindow(#Window_Tool2)
  EndIf
EndProcedure
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Calques façon photoshop

Message par blendman »

Là, ça marche nickel, merci beaucoup :)
Répondre