[5.20b] MDIgadget et splitter

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

[5.20b] MDIgadget et splitter

Message 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).
Dernière modification par blendman le ven. 30/août/2013 14:32, modifié 2 fois.
Fred
Site Admin
Messages : 2652
Inscription : mer. 21/janv./2004 11:03

Re: [5.20b] MDIgadget, containergadget et splitter

Message par Fred »

De plus, tu n'as pas le menu MDI classique (avec la reoganisation etc.)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [5.20b] MDIgadget, containergadget et splitter

Message 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 ^^).
Fred
Site Admin
Messages : 2652
Inscription : mer. 21/janv./2004 11:03

Re: [5.20b] MDIgadget, containergadget et splitter

Message 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.)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [5.20b] MDIgadget, containergadget et splitter

Message 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.
Mesa
Messages : 1098
Inscription : mer. 14/sept./2011 16:59

Re: [5.20b] MDIgadget et splitter

Message par Mesa »

Génial ! :D

Mesa.
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: [5.20b] MDIgadget et splitter

Message par kernadec »

Merci blendman
c'est vraiment cool!!! :mrgreen:

Cordialement
Répondre