SweetyVD (Visual Designer)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
ChrisR
Messages : 235
Inscription : sam. 14/févr./2015 16:20

SweetyVD (Visual Designer)

Message par ChrisR »

SweetyVD (Visual Designer) est, comme son nom l'indique, un petit designer visuel (sans plus de prétentions) permettant de créer une interface (GUI ou IHM).

Crédit, merci Falsam et STARGÅTE pour le partage 8)
Tiny Visual Designer (TVD).
EnableGadgetTransformation.

Pas visible sur l'interface:
- Flèches haut, bas, gauche et droite pour déplacer un gadget en plus de la souris et des positions.
- Shift(Maj) + Flèches pour redimensionner avec le clavier
-Click droit pour obtenir le menu contextuel de création des gadgets avec alignement automatique (idem bouton +). Touche Inser sous Linux.
- Touche Del pour supprimer un gadget sélectionné.

Testé sous Windows et Linux sous VMware.
Note Linux 1: Utilisez la version purebasic 5.61 (ou 5.60). Les gadgets ne sont pas dessinés au dessus des Canvas avec les versions suivantes (5.62, 5.70, 5.71).

Note Linux 2: avec l'utilisation des WebGadgets, vous devez utiliser WebKitGTK. Voir le post de Shardik ici http://www.purebasic.fr/english/viewtop ... 15&t=54049
Pour installer WebKit Gtk3 sous Debian/Ubuntu:
sudo apt-get install libwebkitgtk-3.0-0


Windows:
Image

Linux:
Image

Il a l'avantage d'avoir les vrais gadgets dessinés avec SetGadgetText, Attribute, State, disponibles et visibles.
Merci pour vos tests et retours :D

Mise à jour V2.1.0 (2020-01-29)
Diminution du scintillement (sur Windows) dû en grande partie au chevauchement des gadgets et des Canvas
Le design a été modifié avec un pseudo ruban et un panneau de réglage
Sélection Multiple de gadgets (Ctrl+Clic) pour les déplacer ensemble
Grouper, Dégrouper les Gadgets pour faciliter les sélections
Alignez les gadgets à gauche, à droite, en haut, en bas ainsi que même largeur, hauteur
Bouton "Jouer" Compil/Run
...
Paquet complet sur Github : github SweetyVD (Virtual Designer)

La dernière version, Release est disponible ici Dernière version (latest release)

Enjoy :)
Dernière modification par ChrisR le mer. 29/janv./2020 15:48, modifié 17 fois.
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: SweetyVD (Visual Designer)

Message par boby »

Salut ChrisR,
Tout d'abord félicitation c'est un projet très ambitieux mais plutôt intéressant !
Ça à l'air d'un début fonctionnel, ce qui m'a le plus gêné c'est le défilement à la souris qui se fait à 2 à l'heure et il manque un petit shift + molette pour défilement horizontal.

Niveau code : 700 lignes sur une page ça passe encore, au delà tu vas t'y perdre, tu devrais séparer ton code en plusieurs pages, regarde du coté des modules pour ça c'est vraiment magique !
Tes procédure tu devrais les déclarer (avec la fonction declare) plutôt que de toutes les avoir en haut de ton code avec risque d'avoir besoin de faire appel à une procedure dans une procedure qui ne serait pas encore appelé... enfin bref... ne pas définir tes procédure ça fout également vite le bordel. Tu commence par tout déclarer et HOP t'es tranquille plus besoin de faire attention à l'ordre tout ça tout ça...

La gestion des events je ne saurais trop te conseiller que de le faire via "bindevent".

Bon courage pour la suite !
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: SweetyVD (Visual Designer)

Message par Shadow »

Salut ChrisR,

Oui, bien joué, c'est un travail très dur de faire ça :wink:
C'est plutôt bien avancé :)

Je te souhaite bon courage, t'es bien partie.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
ChrisR
Messages : 235
Inscription : sam. 14/févr./2015 16:20

Re: SweetyVD (Visual Designer)

Message par ChrisR »

Salut boby, Shadow
Merci pour votre retour, Oui, c'est un projet un peu ambitieux vu mon expérience en dev.
Mais il devrait être une bonne porte pour apprendre et le sujet est interressant.
Surtout que je suis un ancien du monde As400 (ou iSeries) avec sa super interface graphique, pour ceux qui connaisse :wink:

J'ai modifié le défilement à la souris avec une valeur de Déplacement à 5, tu devrais donc être a 10 à l'heure maintenant :lol: si c'est suffisant.
et j'ai ajouté le défilement horizontal avec shift + molette.

Code : Tout sélectionner

Case #WM_MOUSEWHEEL   ;Défilement vertival avec la roulette et défilement horizontal avec Shift=Roulette 
  Wheel = (EventwParam() >> 16) / 120
  If EventwParam() & $FFFF = #MK_SHIFT
    SetGadgetAttribute(#ScrollArea, #PB_ScrollArea_X, GetGadgetAttribute(#ScrollArea, #PB_ScrollArea_X) + (Wheel*5))   
  Else
    SetGadgetAttribute(#ScrollArea, #PB_ScrollArea_Y, GetGadgetAttribute(#ScrollArea, #PB_ScrollArea_Y) - (Wheel*5))
  EndIf
J'ai mis le code à jour sur le 1er post, même lien

Je suis d'accord pour les Declare Procedure, pour l'instant ca va mais il va devenir compliqué en grossissant
C'est d'ailleurs un peu "chiant" qu'il ne soit pas fait en automatique!

Sinon, pour les modules, je ne sais pas bien quoi découpé pour l'instant.
Et je ne sais pas comment faire pour les énumérations comme les gadgets.
Il est peut-être plus facile de découpé en utilisant XIncludeFile.
:)
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: SweetyVD (Visual Designer)

Message par Micoute »

Bonjour ChrisR,

moi, je serais plutôt parti comme ça :

Code : Tout sélectionner

;- Module: TransformationGadget

DeclareModule TransformationGadget
  
  EnumerationBinary 1
    #TransformationGadget_Position
    #TransformationGadget_Horizontalement
    #TransformationGadget_Verticalement
  EndEnumeration
  
  #TransformationGadget_Taille = #TransformationGadget_Horizontalement|#TransformationGadget_Verticalement
  #TransformationGadget_Totale = #TransformationGadget_Position|#TransformationGadget_Horizontalement|#TransformationGadget_Verticalement
  
  Declare DesactiverTransformationGadget(Gadget)
  Declare ActiverTransformationGadget(Gadget, Drapeaux = #TransformationGadget_Totale, Grille = 1)
  
EndDeclareModule

Module TransformationGadget
  
  EnableExplicit
  
  #TaillePoignees = 5
  
  Structure TransformationGadget
    Gadget.i
    Poignee.i[10]
    Grille.i
  EndStructure
  
  Structure DonneesTampon
    Poignee.i[10]
  EndStructure
  
  Global NewList TransformationGadget.TransformationGadget()
  
  Procedure CorrespondanceGrille(Valeur, Grille, Max = $7FFFFFFF)
    Valeur = Round(Valeur / Grille, #PB_Round_Nearest) * Grille
    If Valeur > Max
      ProcedureReturn Max
    Else
      ProcedureReturn Valeur
    EndIf
  EndProcedure
  
  Procedure TransformationGadget_Callback()
    Static Selected, X, Y, OffsetX, OffsetY, GadgetX0, GadgetX1, GadgetY0, GadgetY1
    Protected *TransformationGadget.TransformationGadget = GetGadgetData(EventGadget())
    With *TransformationGadget
      Select EventType()
        Case #PB_EventType_LeftButtonDown
          Selected = #True
          OffsetX = GetGadgetAttribute(EventGadget(), #PB_Canvas_MouseX)
          OffsetY = GetGadgetAttribute(EventGadget(), #PB_Canvas_MouseY)
          GadgetX0 = GadgetX(\Gadget)
          GadgetX1 = GadgetX0 + GadgetWidth(\Gadget)
          GadgetY0 = GadgetY(\Gadget)
          GadgetY1 = GadgetY0 + GadgetHeight(\Gadget)
        Case #PB_EventType_LeftButtonUp
          Selected = #False
        Case #PB_EventType_MouseMove
          If Selected
            X = WindowMouseX(GetActiveWindow())-OffsetX
            Y = WindowMouseY(GetActiveWindow())-OffsetY
            Select EventGadget()
              Case \Poignee[1]
                ResizeGadget(\Gadget, CorrespondanceGrille(X + #TaillePoignees, \Grille, GadgetX1), #PB_Ignore, 
                             GadgetX1 - CorrespondanceGrille(X + #TaillePoignees, \Grille, GadgetX1), CorrespondanceGrille(Y, \Grille) - GadgetY0)
              Case \Poignee[2]
                ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, #PB_Ignore, CorrespondanceGrille(Y, \Grille) - GadgetY0)
              Case \Poignee[3]
                ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, CorrespondanceGrille(X, \Grille) - GadgetX0, CorrespondanceGrille(Y, \Grille) - GadgetY0)
              Case \Poignee[4]
                ResizeGadget(\Gadget, CorrespondanceGrille(X + #TaillePoignees, \Grille, GadgetX1), #PB_Ignore, 
                             GadgetX1 - CorrespondanceGrille(X + #TaillePoignees, \Grille, GadgetX1), #PB_Ignore)
              Case \Poignee[5]
                ResizeGadget(\Gadget, CorrespondanceGrille(X - #TaillePoignees, \Grille), CorrespondanceGrille(Y + #TaillePoignees, \Grille), #PB_Ignore, #PB_Ignore)
              Case \Poignee[6]
                ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, CorrespondanceGrille(X, \Grille) - GadgetX0, #PB_Ignore)
              Case \Poignee[7]
                ResizeGadget(\Gadget, CorrespondanceGrille(X + #TaillePoignees, \Grille, GadgetX1), 
                             CorrespondanceGrille(Y + #TaillePoignees, \Grille, GadgetY1), 
                             GadgetX1 - CorrespondanceGrille(X + #TaillePoignees, \Grille, GadgetX1), 
                             GadgetY1 - CorrespondanceGrille(Y + #TaillePoignees, \Grille, GadgetY1))
              Case \Poignee[8]
                ResizeGadget(\Gadget, #PB_Ignore, CorrespondanceGrille(Y + #TaillePoignees, \Grille, GadgetY1), #PB_Ignore, 
                             GadgetY1 - CorrespondanceGrille(Y + #TaillePoignees, \Grille, GadgetY1))
              Case \Poignee[9]
                ResizeGadget(\Gadget, #PB_Ignore, CorrespondanceGrille(Y + #TaillePoignees, \Grille, GadgetY1), 
                             CorrespondanceGrille(X, \Grille) - GadgetX0, GadgetY1 - CorrespondanceGrille(Y + #TaillePoignees, \Grille, GadgetY1))
            EndSelect
            If \Poignee[1]
              ResizeGadget(\Poignee[1], GadgetX(\Gadget) - #TaillePoignees, GadgetY(\Gadget) + GadgetHeight(\Gadget), #PB_Ignore, #PB_Ignore)
            EndIf
            If \Poignee[2]
              ResizeGadget(\Poignee[2], GadgetX(\Gadget) + (GadgetWidth(\Gadget) - #TaillePoignees) / 2, GadgetY(\Gadget) + GadgetHeight(\Gadget), #PB_Ignore, #PB_Ignore)
            EndIf
            If \Poignee[3]
              ResizeGadget(\Poignee[3], GadgetX(\Gadget) + GadgetWidth(\Gadget), GadgetY(\Gadget) + GadgetHeight(\Gadget), #PB_Ignore, #PB_Ignore)
            EndIf
            If \Poignee[4]
              ResizeGadget(\Poignee[4], GadgetX(\Gadget) - #TaillePoignees, GadgetY(\Gadget) + (GadgetHeight(\Gadget) - #TaillePoignees) / 2, #PB_Ignore, #PB_Ignore)
            EndIf
            If \Poignee[5]
              ResizeGadget(\Poignee[5], GadgetX(\Gadget) + #TaillePoignees, GadgetY(\Gadget) - #TaillePoignees, #PB_Ignore, #PB_Ignore)
            EndIf
            If \Poignee[6]
              ResizeGadget(\Poignee[6], GadgetX(\Gadget) + GadgetWidth(\Gadget), GadgetY(\Gadget) + (GadgetHeight(\Gadget) - #TaillePoignees) / 2, #PB_Ignore, #PB_Ignore)
            EndIf
            If \Poignee[7]
              ResizeGadget(\Poignee[7], GadgetX(\Gadget) - #TaillePoignees, GadgetY(\Gadget) - #TaillePoignees, #PB_Ignore, #PB_Ignore)
            EndIf
            If \Poignee[8]
              ResizeGadget(\Poignee[8], GadgetX(\Gadget) + (GadgetWidth(\Gadget)-#TaillePoignees) / 2, GadgetY(\Gadget) - #TaillePoignees, #PB_Ignore, #PB_Ignore)
            EndIf
            If \Poignee[9]
              ResizeGadget(\Poignee[9], GadgetX(\Gadget) + GadgetWidth(\Gadget), GadgetY(\Gadget) - #TaillePoignees, #PB_Ignore, #PB_Ignore)
            EndIf
          EndIf
      EndSelect
    EndWith
  EndProcedure
  
  Procedure DesactiverTransformationGadget(Gadget)
    Protected I, *TransformationGadget.TransformationGadget
    ForEach TransformationGadget()
      If TransformationGadget()\Gadget = Gadget
        For I = 1 To 9
          If TransformationGadget()\Poignee[I]
            FreeGadget(TransformationGadget()\Poignee[I])
          EndIf
        Next
        DeleteElement(TransformationGadget())
      EndIf
    Next
  EndProcedure
  
  Procedure ActiverTransformationGadget(Gadget, Drapeaux = #TransformationGadget_Totale, Grille = 1)
    Protected Poignee, I
    Protected *TransformationGadget.TransformationGadget
    Protected *Curseurs.DonneesTampon = ?Curseurs
    Protected *Drapeaux.DonneesTampon = ?Drapeaux
    ForEach TransformationGadget()
      If TransformationGadget()\Gadget = Gadget
        For I = 1 To 9
          If TransformationGadget()\Poignee[I]
            FreeGadget(TransformationGadget()\Poignee[I])
          EndIf
        Next
        DeleteElement(TransformationGadget())
      EndIf
    Next
    *TransformationGadget = AddElement(TransformationGadget())
    *TransformationGadget\Gadget = Gadget
    *TransformationGadget\Grille = Grille
    For I = 1 To 9
      If Drapeaux & *Drapeaux\Poignee[I] = *Drapeaux\Poignee[I]
        Select I
          Case 1
            Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) - #TaillePoignees, GadgetY(Gadget) + GadgetHeight(Gadget), #TaillePoignees, #TaillePoignees)
          Case 2
            Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) + (GadgetWidth(Gadget)-#TaillePoignees) / 2, GadgetY(Gadget) + GadgetHeight(Gadget), #TaillePoignees, #TaillePoignees)
          Case 3
            Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) + GadgetWidth(Gadget), GadgetY(Gadget) + GadgetHeight(Gadget), #TaillePoignees, #TaillePoignees)
          Case 4
            Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) - #TaillePoignees, GadgetY(Gadget) + (GadgetHeight(Gadget)-#TaillePoignees) / 2, #TaillePoignees, #TaillePoignees)
          Case 5
            Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) + #TaillePoignees, GadgetY(Gadget) - #TaillePoignees, 2 * #TaillePoignees, #TaillePoignees)
          Case 6
            Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) + GadgetWidth(Gadget), GadgetY(Gadget) + (GadgetHeight(Gadget)-#TaillePoignees) / 2, #TaillePoignees, #TaillePoignees)
          Case 7
            Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) - #TaillePoignees, GadgetY(Gadget) - #TaillePoignees, #TaillePoignees, #TaillePoignees)
          Case 8
            Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) + (GadgetWidth(Gadget)-#TaillePoignees) / 2, GadgetY(Gadget) - #TaillePoignees, #TaillePoignees, #TaillePoignees)
          Case 9
            Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) + GadgetWidth(Gadget), GadgetY(Gadget) - #TaillePoignees, #TaillePoignees, #TaillePoignees)
        EndSelect
        *TransformationGadget\Poignee[I] = Poignee
        SetGadgetData(Poignee, *TransformationGadget)
        SetGadgetAttribute(Poignee, #PB_Canvas_Cursor, *Curseurs\Poignee[I])
        If StartDrawing(CanvasOutput(Poignee))
          Box(0, 0, OutputWidth(), OutputHeight(), $000000)
          Box(1, 1, OutputWidth() - 2, OutputHeight() - 2, $FFFFFF)
          StopDrawing()
        EndIf
        BindGadgetEvent(Poignee, @TransformationGadget_Callback())
      EndIf
    Next
    DataSection
      Curseurs:
      Data.i 0, #PB_Cursor_LeftDownRightUp, #PB_Cursor_UpDown, #PB_Cursor_LeftUpRightDown, #PB_Cursor_LeftRight
      Data.i #PB_Cursor_Arrows, #PB_Cursor_LeftRight, #PB_Cursor_LeftUpRightDown, #PB_Cursor_UpDown, #PB_Cursor_LeftDownRightUp
      Drapeaux:
      Data.i 0, #TransformationGadget_Taille, #TransformationGadget_Verticalement, #TransformationGadget_Taille, #TransformationGadget_Horizontalement
      Data.i #TransformationGadget_Position, #TransformationGadget_Horizontalement, #TransformationGadget_Taille, #TransformationGadget_Verticalement, #TransformationGadget_Taille
    EndDataSection
  EndProcedure
  
EndModule



;- Code exemple
CompilerIf #PB_Compiler_IsMainFile
  
  UseModule TransformationGadget
  
  Enumeration
    #Fenetre_principale
    #TransformationGadget
    #Edt
    #Btn
    #TrB
    #Spn
  EndEnumeration
  
  OpenWindow(#Fenetre_principale, 0, 0, 600, 400, "Ma fenêtre", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
  EditorGadget(#Edt, 50, 100, 200, 50, #PB_Editor_WordWrap)
  SetGadgetText(#Edt, "Les assistants grincheux font un mélange toxique pour le mal de la Reine et du valet.")
  ButtonGadget(#Btn, 50, 250, 200, 25, "Salut monde cruel!", #PB_Button_MultiLine)
  TrackBarGadget(#TrB, 350, 100, 200, 25, 0, 100) : SetGadgetState(#TrB, 70)
  SpinGadget(#Spn, 350, 250, 200, 25, 0, 100, #PB_Spin_Numeric) : SetGadgetState(#Spn, 70)
  
  ButtonGadget(#TransformationGadget, 20, 20, 150, 25, "Activer la transformation", #PB_Button_Toggle)
  
  Repeat
    
    Select WaitWindowEvent()
        
      Case #PB_Event_CloseWindow
        End
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #TransformationGadget
            Select GetGadgetState(#TransformationGadget)
              Case #False
                SetGadgetText(#TransformationGadget, "Activer Transformation")
                DesactiverTransformationGadget(#Edt)
                DesactiverTransformationGadget(#Btn)
                DesactiverTransformationGadget(#TrB)
                DesactiverTransformationGadget(#Spn)
              Case #True
                SetGadgetText(#TransformationGadget, "Desactiver Transformation")
                ActiverTransformationGadget(#Edt, #TransformationGadget_Totale, 10)
                ActiverTransformationGadget(#Btn, #TransformationGadget_Totale)
                ActiverTransformationGadget(#TrB, #TransformationGadget_Position|#TransformationGadget_Horizontalement)
                ActiverTransformationGadget(#Spn, #TransformationGadget_Position)
            EndSelect
        EndSelect
        
        
    EndSelect
    
  ForEver
  
CompilerEndIf
Bien que je trouve ton approche intéressante, mais il me semble qu'il y ait un problème avec les conteneurs.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
ChrisR
Messages : 235
Inscription : sam. 14/févr./2015 16:20

Re: SweetyVD (Visual Designer)

Message par ChrisR »

Bonjour Micoute,
Merci pour ce code, c'est super et très propre, beau travail de Stargate.
C'est bien aussi pour la poignée de déplacement mais a mon goût moins pratique que la main sur le gadget lui même.
Je vais essayer de l'utiliser dans une scrollarea pour probablement repartir de là, sans tout mettre à la poubelle.
Merci
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: SweetyVD (Visual Designer)

Message par Micoute »

C'est une manie que j'ai de franciser tous les codes qui me plaisent et d'oublier de citer le nom de l'auteur et j'en demande des excuses à tous.

en fait ces codes sont sensés rester sur mon disque dur pour mon utilisation personnelle.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: SweetyVD (Visual Designer)

Message par Kwai chang caine »

Bonjour Chris

Et ben !!! pour un commencement tu ne t'attaques pas au plus facile 8O
Un VD ça a l'air simple à faire mais c'est super long, on ne compte plus les projets qui ont commencé et sont morts dans l'oeuf :cry:

J'ai du flickering au deplacement des gadgets, mais c'est un trés bon début 8)
C'est bien parti, je te souhaite bon courage :wink:

Et merci pour le partage
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
ChrisR
Messages : 235
Inscription : sam. 14/févr./2015 16:20

Re: SweetyVD (Visual Designer)

Message par ChrisR »

Pas de soucis Micoute, le code est vraiment super. Merci de me l'avoir montré, c'est en effet une bonne voie a suivre :D
KCC, en effet il n'est certainement pas le plus facile, et je risque d'être parfois d'être un peu ridicule. Même pas peur :wink:
J'aurais déjà beaucoup appris avec mon début, même s'il va a la poubelle plus tard mais pas tout de suite...

Pour l'instant, j'ai mis le code de Stargate dans un module, avec les gadgets dans une Scrollarea (calcul pos) et en fixant les pos X,Y largeur/hauteur pour que les gadgets ne sortent pas de la Scrollarea.

Pour utiliser les touches Up,Left,... j'essaye d'utiliser un canvas a la dimension(+1) du gadget.
Le gadget est visible au départ mais n'est plus visible ensuite, lorsque le canvas prend et perd le focus.
J'ai essayé avec BringWindowToTop, SetForegroundWindow,et autres mais sans succès.
Y a t'il une solution ? exemple ci-dessous.

Code : Tout sélectionner

Structure GadgetHandle
  Gadget.i
  Handle.i
EndStructure
Global GadgetHandle.GadgetHandle

Procedure GadgetHandle_Callback()
  Protected *GadgetHandle.GadgetHandle = GetGadgetData(EventGadget())
  With *GadgetHandle 
    Select EventType()
      Case #PB_EventType_Focus
        Debug "Focus "+\Handle

      Case #PB_EventType_LostFocus
        Debug "Lost focus "+\Handle

      Case #PB_EventType_KeyDown
        Select GetGadgetAttribute(EventGadget(),#PB_Canvas_Key)
          Case #PB_Shortcut_Right
            ResizeGadget(\Gadget, GadgetX(\Gadget)+1, #PB_Ignore, #PB_Ignore, #PB_Ignore)
          Case #PB_Shortcut_Left
            ResizeGadget(\Gadget, GadgetX(\Gadget)-1, #PB_Ignore, #PB_Ignore, #PB_Ignore)
        EndSelect
        ResizeGadget(\Handle, GadgetX(\Gadget)-1, #PB_Ignore, #PB_Ignore, #PB_Ignore)

    EndSelect
  EndWith
EndProcedure

Window_0 = OpenWindow(#PB_Any, 0, 0, 300, 140, "", #PB_Window_SystemMenu)
Editor_0 = EditorGadget(#PB_Any, 50, 20, 200, 60, #PB_Editor_WordWrap) : SetGadgetText(Editor_0, "Touche Droit,gauche pour déplacer. Y a t'il moyen de conserver le Gadget Editor visible après avoir pris puis perdu le focus?")
Canvas_0 = CanvasGadget(#PB_Any, GadgetX(Editor_0)-1, GadgetY(Editor_0)-1, GadgetWidth(Editor_0)+2, GadgetHeight(Editor_0)+2, #PB_Canvas_Keyboard|#PB_Canvas_DrawFocus)
SetWindowPos_(GadgetID(Canvas_0),#HWND_TOP,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE)
Button_0 = ButtonGadget(#PB_Any, 50, 100, 100, 25, "Take Focus")
GadgetHandle\Gadget = Editor_0
GadgetHandle\Handle = Canvas_0
SetGadgetData(Canvas_0, GadgetHandle)
SetGadgetAttribute(Canvas_0, #PB_Canvas_Cursor, #PB_Cursor_Arrows)
BindGadgetEvent(Canvas_0, @GadgetHandle_Callback())

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Gadget
      Select EventGadget()
      EndSelect
  EndSelect
ForEver
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: SweetyVD (Visual Designer)

Message par falsam »

Le gadget est visible au départ mais n'est plus visible ensuite, lorsque le canvas prend et perd le focus. Y a t'il une solution ?
En ce servant du canvas comme container. (PureBasic 5.60 Beta)

Code : Tout sélectionner

Structure GadgetHandle
  Gadget.i
  Handle.i
EndStructure
Global GadgetHandle.GadgetHandle

Procedure GadgetHandle_Callback()
  Protected GadgetHandle.GadgetHandle 
    
  With GadgetHandle
    \Gadget = EventGadget()
    
    Select EventType()
      Case #PB_EventType_KeyDown
        Select GetGadgetAttribute(EventGadget(),#PB_Canvas_Key)
          Case #PB_Shortcut_Right
            ResizeGadget(\Gadget, GadgetX(\Gadget)+1, #PB_Ignore, #PB_Ignore, #PB_Ignore)
            
          Case #PB_Shortcut_Left
            ResizeGadget(\Gadget, GadgetX(\Gadget)-1, #PB_Ignore, #PB_Ignore, #PB_Ignore)
            
          Case #PB_Shortcut_Up
            If GetGadgetAttribute(\Gadget, #PB_Canvas_Modifiers) = #PB_Canvas_Control 
              ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetHeight(\Gadget)-1)
              ResizeGadget(GetGadgetData(\Gadget), #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetHeight(GetGadgetData(\Gadget))-1)
            Else
              ResizeGadget(\Gadget, #PB_Ignore, GadgetY(\Gadget)-1, #PB_Ignore, #PB_Ignore)
            EndIf
            
          Case #PB_Shortcut_Down
            If GetGadgetAttribute(\Gadget, #PB_Canvas_Modifiers) = #PB_Canvas_Control 
              ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetHeight(\Gadget)+1)
              ResizeGadget(GetGadgetData(\Gadget), #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetHeight(GetGadgetData(\Gadget))+1)
            Else
              ResizeGadget(\Gadget, #PB_Ignore, GadgetY(\Gadget)+1, #PB_Ignore, #PB_Ignore)
            EndIf 
            
        EndSelect
        
    EndSelect
  EndWith
EndProcedure

Window_0 = OpenWindow(#PB_Any, 0, 0, 300, 150, "", #PB_Window_SystemMenu)
Canvas_0 = CanvasGadget(#PB_Any, 50, 30, 200 + 2, 50 + 2, #PB_Canvas_Container |#PB_Canvas_Keyboard)
  Editor_0 = EditorGadget(#PB_Any, 1, 1, 200, 50, #PB_Editor_WordWrap) 
  SetGadgetText(Editor_0, "Y a t'il moyen de conserver le Gadget Editor visible après avoir pris puis perdu le focus?")
  DisableGadget(Editor_0, #True)
  SetGadgetData(Canvas_0, Editor_0)  
CloseGadgetList()

Button_0 = ButtonGadget(#PB_Any, 50, 100, 100, 25, "Take Focus")
GadgetHandle\Gadget = Editor_0
GadgetHandle\Handle = Canvas_0
SetGadgetAttribute(Canvas_0, #PB_Canvas_Cursor, #PB_Cursor_Arrows)
BindGadgetEvent(Canvas_0, @GadgetHandle_Callback())

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Je me suis passé de ta gestion du pointer d’événement gadget qui m'a dérouté et j'ai testé le redimensionnement du gadget en hauteur avec la combinaison de touche Ctrl + Flèche bas ou haut. Petit bug : Un cadre bleu à la place du blanc du canvas quand on redimensionne en hauteur.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
ChrisR
Messages : 235
Inscription : sam. 14/févr./2015 16:20

Re: SweetyVD (Visual Designer)

Message par ChrisR »

Merci falsam,
Plus qu'a télécharger la dernière bèta pour tester.
A voir comment je peux faire avec mon bout de code actuel. Les CanvasGadgets sont créés dans un module, après les autres Gadgets qui sont passés en paramètres au module. OpenGadgetList!
Avatar de l’utilisateur
ChrisR
Messages : 235
Inscription : sam. 14/févr./2015 16:20

Re: SweetyVD (Visual Designer)

Message par ChrisR »

PureBasic 5.60 Beta est installé maintenant
Le Canvas container est en effet le truc pour la visibilité du gadget 8)

Il semble qu'il y a un autre petit bug en si l'on superpose plusieurs Canvas container, voir exemple ci-dessous :
1. Déplacer le Text vers le haut dans le Text Editor Gadget puis le redescendre, le canvas devient gris
2. Déplacer le Text vers le haut dans le Text Editor Gadget puis déplacer maintenant le Text Editor Gadget, surprise
J'ai un contournement avec (en commentaire dans l'exemple):
HideGadget(\Handle, #True)
HideGadget(\Handle, #False)
SetActiveGadget(\Handle)
#
Il y a aussi un truc avec un TextGadget dans un canva container, le texte est affiché uniquement après
ResizeGadget(Text_0, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore)

Code : Tout sélectionner

Structure GadgetHandle
  Gadget.i
  Handle.i
EndStructure

Procedure GadgetHandle_Callback()
  Protected GadgetHandle.GadgetHandle 
    
  With GadgetHandle
    \Handle = EventGadget()
    \Gadget = GetGadgetData(\Handle)
    
    Select EventType()
        
      Case #PB_EventType_Focus
        ;Dessine une bordure autour du gadget
;         If StartDrawing(CanvasOutput(\Handle))
;           Box(0, 0, OutputWidth(), OutputHeight(), $000000) 
;           Box(1, 1, OutputWidth()-2, OutputHeight()-2, $FFFFFF)
;           StopDrawing()
;         EndIf
        SetWindowPos_(GadgetID(\Handle),#HWND_BOTTOM,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE)
        
      Case #PB_EventType_LostFocus
        ;Supprime la bordure autour du gadget cf #PB_EventType_Focus
;         If StartDrawing(CanvasOutput(\Handle))
;           Box(0, 0, OutputWidth(), OutputHeight(), $FFFFFF) 
;           StopDrawing()
;         EndIf        
        
      Case #PB_EventType_Resize
        ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, GadgetWidth(\Handle)-2, GadgetHeight(\Handle)-2)
        
      Case #PB_EventType_KeyDown
        Select GetGadgetAttribute(EventGadget(),#PB_Canvas_Key)
            
           Case #PB_Shortcut_Right
            If GetGadgetAttribute(\Handle, #PB_Canvas_Modifiers) = #PB_Canvas_Control 
              ResizeGadget(\Handle, #PB_Ignore, #PB_Ignore, GadgetWidth(\Handle)+1, #PB_Ignore)
            Else
              ResizeGadget(\Handle, GadgetX(\Handle)+1, #PB_Ignore, #PB_Ignore, #PB_Ignore)
            EndIf
            
          Case #PB_Shortcut_Left
            If GetGadgetAttribute(\Handle, #PB_Canvas_Modifiers) = #PB_Canvas_Control 
              ResizeGadget(\Handle, #PB_Ignore, #PB_Ignore, GadgetWidth(\Handle)-1, #PB_Ignore)
            Else            
              ResizeGadget(\Handle, GadgetX(\Handle)-1, #PB_Ignore, #PB_Ignore, #PB_Ignore)
            EndIf
            
          Case #PB_Shortcut_Up
            If GetGadgetAttribute(\Handle, #PB_Canvas_Modifiers) = #PB_Canvas_Control 
              ResizeGadget(\Handle, #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetHeight(\Handle)-1)
            Else
              ResizeGadget(\Handle, #PB_Ignore, GadgetY(\Handle)-1, #PB_Ignore, #PB_Ignore)
            EndIf
            
          Case #PB_Shortcut_Down
            If GetGadgetAttribute(\Handle, #PB_Canvas_Modifiers) = #PB_Canvas_Control 
              ResizeGadget(\Handle, #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetHeight(\Handle)+1)
            Else
              ResizeGadget(\Handle, #PB_Ignore, GadgetY(\Handle)+1, #PB_Ignore, #PB_Ignore)
            EndIf 
             
        EndSelect
;         HideGadget(\Handle, #True)
;         HideGadget(\Handle, #False)
;         SetActiveGadget(\Handle)
        
    EndSelect
  EndWith
EndProcedure

Window_0 = OpenWindow(#PB_Any, 0, 0, 300, 145, "", #PB_Window_SystemMenu)
Canvas_0 = CanvasGadget(#PB_Any, 50, 20, 200 + 2, 50 + 2, #PB_Canvas_Container|#PB_Canvas_Keyboard)
  Editor_0 = EditorGadget(#PB_Any, 1, 1, 200, 50, #PB_Editor_WordWrap) 
  SetGadgetText(Editor_0, "Text Editor Gadget")
  DisableGadget(Editor_0, #True)
  SetGadgetData(Canvas_0, Editor_0)
CloseGadgetList()

Canvas_1 = CanvasGadget(#PB_Any, 50, 80, 100 + 2, 20 + 2, #PB_Canvas_Container|#PB_Canvas_Keyboard)
  Text_0 = TextGadget(#PB_Any, 1, 1, 100, 20, "Texte")
  SetGadgetData(Canvas_1, Text_0)
CloseGadgetList()
;Besoin de ResizeGadget pour voir le Texte
ResizeGadget(Text_0, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore)

Button_0 = ButtonGadget(#PB_Any, 50, 110, 100, 25, "Take Focus")

SetGadgetAttribute(Canvas_0, #PB_Canvas_Cursor, #PB_Cursor_Arrows)
BindGadgetEvent(Canvas_0, @GadgetHandle_Callback())
SetGadgetAttribute(Canvas_1, #PB_Canvas_Cursor, #PB_Cursor_Arrows)
BindGadgetEvent(Canvas_1, @GadgetHandle_Callback())

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: SweetyVD (Visual Designer)

Message par falsam »

Effectivement il y a des soucis de superposition. Au passage download la version définitive :)

Je regarde si il y a quelques chose à faire en changeant la position z de tes gadgets.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: SweetyVD (Visual Designer)

Message par falsam »

Ajoute cette procédure proposée par Gally

Code : Tout sélectionner

Procedure ForceGadgetZOrder(gadget, zorder = 0)
  If IsGadget(gadget)
    SetWindowLong_(GadgetID(gadget), #GWL_STYLE, GetWindowLong_(GadgetID(gadget), #GWL_STYLE) | #WS_CLIPSIBLINGS)
    If zorder = 1
      SetWindowPos_ (GadgetID (gadget), #HWND_BOTTOM, 0,0,0,0, #SWP_NOSIZE | #SWP_NOMOVE)
    Else
      SetWindowPos_ (GadgetID(gadget), #HWND_TOP, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE)
    EndIf
  EndIf
EndProcedure
puis pour chaque création de Canvas tu ajoute la profondeur. Exemple

Code : Tout sélectionner

Canvas_0 = CanvasGadget(#PB_Any, 50, 20, 200 + 2, 50 + 2, #PB_Canvas_Container|#PB_Canvas_Keyboard)
  Editor_0 = EditorGadget(#PB_Any, 1, 1, 200, 50, #PB_Editor_WordWrap) 
  SetGadgetText(Editor_0, "Text Editor Gadget")
  DisableGadget(Editor_0, #True)
  SetGadgetData(Canvas_0, Editor_0)
CloseGadgetList()
ForceGadgetZOrder(Canvas_0, 0)
pour le gadget Canvas suivant

Code : Tout sélectionner

Canvas_1 = CanvasGadget(#PB_Any, 50, 80, 100 + 2, 20 + 2, #PB_Canvas_Container|#PB_Canvas_Keyboard)
  Text_0 = TextGadget(#PB_Any, 1, 1, 100, 20, "Texte")
  SetGadgetData(Canvas_1, Text_0)
CloseGadgetList()
;Besoin de ResizeGadget pour voir le Texte
ResizeGadget(Text_0, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore)
ForceGadgetZOrder(Canvas_1, 1)
etc .....
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
ChrisR
Messages : 235
Inscription : sam. 14/févr./2015 16:20

Re: SweetyVD (Visual Designer)

Message par ChrisR »

:D
Toutefois il ne semble pas en rapport avec z-order mais avec #WS_CLIPSIBLINGS
Et pour mettre au 1er plan le gadget sélectionné lors du déplacement:

Code : Tout sélectionner

Case #PB_EventType_Focus
ForceGadgetZOrder(\Handle, 0)
Répondre