Page 1 sur 1

[5.20b] MDIgadget et splitter

Publié : ven. 30/août/2013 10:54
par blendman
Salut

En testant un code avec des MDi, j'ai voulu utiliser un splittergadget, et paf, ça ne marchait pas (la doc le disait a noté Mesa).

Voici donc un petit code qui permet d'avoir une sorte de splittergadget avec MDI (et on garde toutes les fonctions du MDI).

Merci Fred pour les remarques qui m'ont permis d'améliorer et de changer le code ;)

New code (basé sur MDI image viewer des exemples purebasic) :

Code : Tout sélectionner

; PureBasic - MDI example file
; (c) 2004 - Fantaisie Software
; modification : blendman 08/2013 // ajout du "faux splitter (canvas)
; pb : 5.20b

;{ structure
Structure MDIWindow
  ; info about the loaded image
  Image.i
  ImageWidth.l
  ImageHeight.l
  
  ; Our MDI Window  
  Window.i

  ; gadget numbers
  ScrollAreaGadget.i
  ImageGadget.i
EndStructure
;}

Global NewList MDIWindow.MDIWindow()

#WINDOW = 0
#TOOLBAR = 0
#MENU = 0

#MDI_Base = 1

Enumeration
  #MENU_Open
  #MENU_Close
  #MENU_CloseAll
  #MENU_Quit
  
  #MENU_TileV
  #MENU_TileH
  #MENU_Cascade
  #MENU_Arrange
  #MENU_Previous
  #MENU_Next
  
  #MENU_FirstMDI
EndEnumeration

UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()

Procedure SelectMDIWindow(Window)

  ForEach MDIWindow()
    If MDIWindow()\Window = Window
      ProcedureReturn 1
    EndIf
  Next

EndProcedure

#GADGET_MDI = 0
#WindowFlags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget

If OpenWindow(#WINDOW, 0, 0, 800, 600, "MDI ImageViewer", #WindowFlags)
  
  ;{ menu & toolbar
  If CreateMenu(#MENU, WindowID(#WINDOW))
    MenuTitle("File")
      MenuItem(#MENU_Open, "Open")
      MenuItem(#MENU_Close, "Close")
      MenuItem(#MENU_CloseAll, "Close All")
      MenuBar()
      MenuItem(#MENU_QUit, "Quit")      
    MenuTitle("Windows")
      MenuItem(#MENU_TileV, "Tile vertically")
      MenuItem(#MENU_TileH, "Tile horizontally")
      MenuItem(#MENU_Cascade, "Cascade")
      MenuItem(#MENU_Previous, "Previous")
      MenuItem(#MENU_Next, "Next")
      ; MDI subwindows will get added here
  EndIf
  
  If CreateToolBar(#TOOLBAR, WindowID(#WINDOW))
    ToolBarStandardButton(#MENU_Open, #PB_ToolBarIcon_Open)
    ToolBarStandardButton(#MENU_Close, #PB_ToolBarIcon_Delete)
    ToolBarSeparator()
    ToolBarStandardButton(#MENU_Previous, #PB_ToolBarIcon_Undo)
    ToolBarStandardButton(#MENU_Next, #PB_ToolBarIcon_Redo)
  EndIf
  ;}
  ;{ gadgets
  h = WindowHeight(0)-ToolBarHeight(#TOOLBAR)
  y = ToolBarHeight(#TOOLBAR)
  
  panel = TreeGadget(#PB_Any,0,y,142,h)
  AddGadgetItem(panel,0,"Truc")
  canvas = CanvasGadget(#PB_Any, 143,y,6,h)
  MDIGadget(#GADGET_MDI, 150, y, WindowWidth(0)-150, h, 1, #MENU_FirstMDI)
  ;}
  
  Quit = 0
  
  ;{ loop
  Repeat
    Event = WaitWindowEvent()
    Window = EventWindow()

    Select Event
        
      Case #PB_Event_Gadget
        Select EventGadget()
            
          Case canvas
            
            Select EventType()
                
              Case #PB_EventType_MouseEnter  
                SetGadgetAttribute(canvas,#PB_Canvas_Cursor,#PB_Cursor_LeftRight)
                
              Case #PB_EventType_MouseLeave   
                SetGadgetAttribute(canvas,#PB_Canvas_Cursor,#PB_Cursor_Default)
                
              Case #PB_EventType_LeftButtonDown  
                bougeCanvas = 1
                               
              Case #PB_EventType_LeftButtonUp
                bougeCanvas =0
                HideGadget(#GADGET_MDI,1)
                HideGadget(#GADGET_MDI,0)
                
              Case #PB_EventType_MouseMove                 
                If bougeCanvas                    
                  ResizeGadget(canvas,WindowMouseX(0),#PB_Ignore,#PB_Ignore,#PB_Ignore)                  
                  ResizeGadget(panel,0,#PB_Ignore,GadgetX(canvas)-1,#PB_Ignore)
                  ResizeGadget(#GADGET_MDI,GadgetX(canvas)+GadgetWidth(canvas)+1,#PB_Ignore, WindowWidth(0)-(GadgetX(canvas)+GadgetWidth(canvas)+1), #PB_Ignore)
                EndIf

            EndSelect
            
        EndSelect
        
            
      Case #PB_Event_CloseWindow
        Select Window
          Case #WINDOW ; Out main window is closed, just quit
            Quit = 1
            
          Default ; It's one of our MDI children
            
            If SelectMDIWindow(Window) ; Check if it's one of our MDI window
              CloseWindow(Window)
              FreeImage(MDIWindow()\Image)
              DeleteElement(MDIWindow())   
            EndIf
            
        EndSelect
        
      Case  #PB_Event_Menu
        Select EventMenu()
          Case #MENU_Open
            FileName$ = OpenFileRequester("Open Image", DefautFile$, "Image Files (*.bmp,*.jpg,*.tiff,*.png,*.tga)|*.bmp;*.jpg;*.tiff;*.png;*.tga|All Files (*.*)|*.*", 0, #PB_Requester_MultiSelection)
            While FileName$
              DefaultFile$ = FileName$
              
              Image = LoadImage(#PB_Any, FileName$)
              If Image
                
                LastElement(MDIWindow())
                AddElement(MDIWindow())
                
                Item = ListIndex(MDIWindow())
                
                MDIWindow()\Image       = Image            
                MDIWIndow()\ImageWidth  = ImageWidth(Image)  ; ***
                MDIWindow()\ImageHeight = ImageHeight(Image)
                
                MDIWindow()\Window = AddGadgetItem(#GADGET_MDI, -1, FileName$)
                
                Width  = WindowWidth (MDIWindow()\Window)
                Height = WindowHeight(MDIWindow()\Window)
                
                MDIWindow()\ScrollAreaGadget = ScrollAreaGadget(#PB_Any, 0, 0, Width, Height, MDIWindow()\ImageWidth, MDIWindow()\ImageHeight, 10)
                MDIWindow()\ImageGadget = ImageGadget(#PB_Any, 0, 0, MDIWindow()\ImageWidth, MDIWindow()\ImageHeight, ImageID(Image))
                CloseGadgetList()
                
              Else
                MessageRequester("Image Viewer","Could not load image: "+FileName$)
              EndIf            
              
              FileName$ = NextSelectedFileName()
            Wend
            
          Case #MENU_Close
            Window = GetGadgetState(#GADGET_MDI)
            If Window <> -1          
              CloseWindow(Window)
              
              SelectMDIWindow(Window)
              FreeImage(MDIWindow()\Image)
              DeleteElement(MDIWindow())
            EndIf
            
          Case #MENU_CloseAll
            
            ForEach MDIWindow()
              CloseWindow(MDIWindow()\Window)
              FreeImage(MDIWindow()\Image)  
            Next
            ClearList(MDIWindow())
            
          Case #MENU_Quit
            Quit = 1     
            
          Case #MENU_TileV
            SetGadgetState(#GADGET_MDI, #PB_MDI_TileVertically)
            
          Case #MENU_TileH
            SetGadgetState(#GADGET_MDI, #PB_MDI_TileHorizontally)
            
          Case #MENU_Cascade
            SetGadgetState(#GADGET_MDI, #PB_MDI_Cascade)
            
          Case #MENU_Arrange
            SetGadgetState(#GADGET_MDI, #PB_MDI_Arrange)
            
          Case #MENU_Previous
            SetGadgetState(#GADGET_MDI, #PB_MDI_Previous)
            
          Case #MENU_Next
            SetGadgetState(#GADGET_MDI, #PB_MDI_Next)
            
        EndSelect
                
      Case #PB_Event_SizeWindow   
        h= WindowHeight(0)-50
        ResizeGadget(canvas,#PB_Ignore,ToolBarHeight(#TOOLBAR),#PB_Ignore,h)   
        ResizeGadget(panel,0,ToolBarHeight(#TOOLBAR),GadgetX(canvas)-1,h)
        ResizeGadget(#GADGET_MDI,GadgetX(canvas)+GadgetWidth(canvas)+1, ToolBarHeight(#TOOLBAR), WindowWidth(0)-(GadgetX(canvas)+GadgetWidth(canvas)+1), h)
    
        If SelectMDIWindow(Window)
          ResizeGadget(MDIWindow()\ScrollAreaGadget, 0, 0, WindowWidth(Window), WindowHeight(Window))
        EndIf
        
    EndSelect
    
  Until Quit = 1  
  
EndIf
;}
Amélioration : trouver un système qui permet d'éviter l'effet de flickering quand on déplace le splitter (canvas).

Re: [5.20b] MDIgadget, containergadget et splitter

Publié : ven. 30/août/2013 12:03
par Fred
De plus, tu n'as pas le menu MDI classique (avec la reoganisation etc.)

Re: [5.20b] MDIgadget, containergadget et splitter

Publié : ven. 30/août/2013 12:47
par blendman
Fred a écrit :De plus, tu n'as pas le menu MDI classique (avec la reoganisation etc.)
oui, je sais ^^. Mais comme je voulais utiliser un mdi avec des gadgets dans la même fenêtre, je ne vois pas comment faire autrement ^^ (la doc explique que ce n'est pas possible, par exemple, avec un panel, treegadget, etc. sur la même fenêtre).
C'est d'ailleurs dommage, parce qu'on ne peut pas utiliser les MDI avec les gadgets (sauf avec mon genre de bidouille ^^).

Re: [5.20b] MDIgadget, containergadget et splitter

Publié : ven. 30/août/2013 12:59
par Fred
Si, tu peux mettre le MDI sur la fenetre sans qu'il prenne toute la place, donc tu peux mettre d'autres gadgets à coté. Mais tu ne peux pas la mettre dans un container (donc pas de splitter etc.)

Re: [5.20b] MDIgadget, containergadget et splitter

Publié : ven. 30/août/2013 14:03
par blendman
Oui, j'avais testé mais comme je cherchais un splitter, je n'avais pas été plus loin.

Mais je viens d'avoir une idée du coup pour avoir un splitter et un MDI normal :
- treegadget(0,0,140,..) à gauche
- canvasgadget(150,0...) de 3 pixel
- MDI qui démarre en x= 150 pixels MDIGadget(#GADGET_MDI, 150, 0..).

Et quand on bouge le canvas, je redimensionne le MDI, le treegadget et le canvas avec resizegadget(), ça devrait marcher ^^.
Je vais tester et j'updaterai le code si j'y arrive.

EDIT : bon, ben merci Fred ;) J'ai réussi en utilisant un canvas gadget comme splitter ^^.
ça fonctionne donc et on garde toutes les fonctions du MDI.

Re: [5.20b] MDIgadget et splitter

Publié : sam. 31/août/2013 9:59
par Mesa
Génial ! :D

Mesa.

Re: [5.20b] MDIgadget et splitter

Publié : sam. 31/août/2013 11:43
par kernadec
Merci blendman
c'est vraiment cool!!! :mrgreen:

Cordialement