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
;
;}