IceDesign GUI-Designer

Anwendungen, Tools, Userlibs und anderes nützliches.
MAQ
Beiträge: 6
Registriert: 08.03.2024 23:54

Re: IceDesign GUI-Designer

Beitrag von MAQ »

Super! Eine gute Lösung für das DateGadget mittels der Konstante #DateGadgetTheme! Und danke auch für die Korrektur des ComboBoxGadgets!

Aber ich habe noch ein weiteres Problem gefunden. Beim Skalieren des Imagegadgets wird der Fensterhintergrund nicht aktualisiert, es bleiben unschöne Grafikreste übrig...

https://ibb.co/sR0X04P
MAQ
Beiträge: 6
Registriert: 08.03.2024 23:54

Re: IceDesign GUI-Designer

Beitrag von MAQ »

Noch eine Sache zum Imagegadget: Es wäre auch schön, wenn man eine Option hätte, um beim Skalieren ein korrektes Seitenverhältnis einzuhalten.

Etwa so:

Code: Alles auswählen

;- Top
; -----------------------------------------------------------------------------
;           Name: Image Demo
;    Description: Demonstration of correct aspect ration scaling
;         Author: MAQ
;           Date: 2024-03-23
;        Version: 0.1
;     PB-Version: 6.03
;             OS: Windows
;         Credit: Scaling Routine 2016 (c) Lunasole
;          Forum:
;     Created by: IceDesign
; -----------------------------------------------------------------------------

EnableExplicit

;- Enumerations
Enumeration Window
  #Window_0
EndEnumeration

Enumeration Gadgets
  #Gadget_0_Img_1
  #Gadget_0_Check_Correct_Aspect_Ratio
EndEnumeration

Enumeration Image
  #Imag_0_PureBasicLogo
EndEnumeration

Structure GadgetImages
  Image.i
  PressedImage.i
  Width.i
  Height.i
EndStructure

Global Aspect.b = #False

;- Load Images

CatchImage(#Imag_0_PureBasicLogo, ?Imag_0_PureBasicLogo)

;- Declare
Declare ScaleProportional (*res_w.Integer, *res_h.Integer, from_width, from_heigh, to_width = 0, to_heigh = 0)
Declare ResizeGadgetImage(Gadget, OriginalImage, OriginalPressedImage = #PB_Ignore)
Declare Resize_Window_0()
Declare Open_Window_0(X = 0, Y = 0, Width = 440, Height = 160)

Procedure ScaleProportional (*res_w.Integer, *res_h.Integer, from_width, from_heigh, to_width = 0, to_heigh = 0)
   Protected.d hMod
   If Not to_width :   to_width = *res_w\i : EndIf : *res_w\i = to_width
   If Not to_heigh :   to_heigh = *res_h\i : EndIf : *res_h\i = to_heigh
   
   If from_heigh > to_heigh Or from_width > to_width
      hMod = from_width / to_width
      If Not Round(from_heigh / hMod, #PB_Round_Nearest) > to_heigh And Not Round(from_width / hMod, #PB_Round_Nearest) > to_width
      Else
         hMod = from_heigh / to_heigh
      EndIf
      *res_w\i = from_width / hMod      
      *res_h\i = from_heigh / hMod
   ElseIf from_heigh < to_heigh Or from_width < to_width
      hMod = to_width / from_width
      If Not Round(from_heigh * hMod, #PB_Round_Nearest) > to_heigh And Not Round(from_width * hMod, #PB_Round_Nearest) > to_width
      Else
         hMod = to_heigh / from_heigh
      EndIf
      *res_w\i = from_width * hMod     
      *res_h\i = from_heigh * hMod
   EndIf
EndProcedure

Procedure ResizeGadgetImage(Gadget, OriginalImage, OriginalPressedImage = #PB_Ignore)
  Protected Image, Width, Height
  Static NewMap GadgetImage.GadgetImages()

  If IsGadget(Gadget) And IsImage(OriginalImage)
    Width = DesktopScaledX(GadgetWidth(Gadget)) : Height = DesktopScaledY(GadgetHeight(Gadget))
    If Width > 0 And Height > 0
      If GadgetImage(Str(Gadget))\Width <> Width Or GadgetImage(Str(Gadget))\Height <> Height
        GadgetImage()\Width  =  Width :  GadgetImage()\Height =  Height

        Image = CopyImage(OriginalImage, #PB_Any)
        If Image
          If Aspect = #True
            ScaleProportional(@Width, @Height, ImageWidth(Image), ImageHeight(Image), Width, Height)
          EndIf  
          ResizeImage(Image, Width, Height)
          Select GadgetType(Gadget)
            Case #PB_GadgetType_ButtonImage
              SetGadgetAttribute(Gadget, #PB_Button_Image, ImageID(Image))
            Case #PB_GadgetType_Image
              SetGadgetState(Gadget, ImageID(Image))
          EndSelect
          If GadgetImage()\Image And IsImage(GadgetImage()\Image)
            FreeImage(GadgetImage()\Image)
          EndIf
          GadgetImage()\Image = Image
        EndIf

        If GadgetType(Gadget) = #PB_GadgetType_ButtonImage And IsImage(OriginalPressedImage)
          Image = CopyImage(OriginalPressedImage, #PB_Any)
          If Image
            ResizeImage(Image, Width, Height)
            SetGadgetAttribute(Gadget, #PB_Button_PressedImage, ImageID(Image))
            If GadgetImage()\PressedImage And IsImage(GadgetImage()\PressedImage)
              FreeImage(GadgetImage()\PressedImage)
            EndIf
            GadgetImage()\PressedImage = Image
          EndIf
        EndIf

      EndIf   
    EndIf      
  EndIf       
EndProcedure

Procedure Resize_Window_0()
  Protected Window_0_WidthIni = 440, Window_0_HeightIni = 160
  Protected ScaleX.f, ScaleY.f

  ScaleX = WindowWidth(#Window_0) / Window_0_WidthIni : ScaleY = WindowHeight(#Window_0) / Window_0_HeightIni
  ResizeGadget(#Gadget_0_Img_1, WindowWidth(#Window_0)/2 - (ScaleX * 381)/2, ScaleY * 30, ScaleX * 381, ScaleY * 68)
  ResizeGadgetImage(#Gadget_0_Img_1, #Imag_0_PureBasicLogo)
  ResizeGadget(#Gadget_0_Check_Correct_Aspect_Ratio, WindowWidth(#Window_0)/2 - (ScaleX * 140)/2, ScaleY * 120, ScaleX * 140, ScaleY * 20)
EndProcedure

Procedure Open_Window_0(X = 0, Y = 0, Width = 440, Height = 160)
  If OpenWindow(#Window_0, X, Y, Width, Height, "Image Demo", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
    ImageGadget(#Gadget_0_Img_1, 30, 30, 381, 68, ImageID(#Imag_0_PureBasicLogo))
    CheckBoxGadget(#Gadget_0_Check_Correct_Aspect_Ratio, 150, 120, 140, 20, "Correct Aspect Ratio")

    BindEvent(#PB_Event_SizeWindow, @Resize_Window_0(), #Window_0)
    PostEvent(#PB_Event_SizeWindow, #Window_0, 0)

    WindowBounds(#Window_0, 440, 160, #PB_Ignore, #PB_Ignore)
    ProcedureReturn #True
  EndIf
EndProcedure

;- Main Program
If Open_Window_0()

  ;- Event Loop
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break

        ;-> Event Gadget
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #Gadget_0_Check_Correct_Aspect_Ratio
            If GetGadgetState(#Gadget_0_Check_Correct_Aspect_Ratio) = #True
              Aspect = #True
            Else
              Aspect = #False
            EndIf  
        EndSelect

    EndSelect
  ForEver
EndIf

;- DataSection
DataSection
  Imag_0_PureBasicLogo: : IncludeBinary #PB_Compiler_Home + "\Examples\Sources\Data\PureBasicLogo.bmp"
EndDataSection
Die Skalierungsroutine habe ich hier entnommen:

https://www.purebasic.fr/english/viewto ... 51#p485651
ChrisR
Beiträge: 84
Registriert: 04.03.2017 12:23

Re: IceDesign GUI-Designer

Beitrag von ChrisR »

IceDesign wurde auf Version 2.1.0 aktualisiert
  • WebViewGadget hinzugefügt.
  • KeepWindowsSize: Option in den Einstellungen hinzugefügt, um die Position, die Größe und den Status des Fensters (Normal, Minimiert, Maximiert) zwischen den Ausführungen für das generierte Formular beizubehalten.
  • Optionen in den Einstellungen für die Sortierung der Aufzählungen und für die Anzahl der Aufzählungen pro Zeile hinzugefügt, um ein zu starkes Scrollen zu verhindern.
    Beispiel hier mit 6 Aufzählungen, die pro Zeile sortiert werden:

    Code: Alles auswählen

    Enumeration Gadgets
      #Check_1 : #Check_2 : #Check_3 : #Check_4 : #Check_5 : #Check_6
      #String_1 : #String_2 : #String_3 : #String_4 : #String_5 : #String_6
      #Txt_1 : #Txt_2 : #Txt_3 : #Txt_4 : #Txt_5 : #Txt_6
    EndEnumeration
    ;oder wenn Variablen verwendet werden.
    Global Check_1, Check_2, Check_3, Check_4, Check_5, Check_6
    Global String_1, String_2, String_3, String_4, String_5, String_6
    Global Txt_1, Txt_2, Txt_3, Txt_4, Txt_5, Txt_6
  • Tabreihenfolge : Für alle Gadgets, die hervorgehoben werden können, wurde die Eigenschaft "Tabulatorreihenfolge" hinzugefügt.
    Der Wert für die Tabulatorreihenfolge ist frei wählbar, es wird nicht überprüft, ob dieselbe Nummer bereits verwendet wird, und es gibt keine Neunummerierung.
    Die Tabulatorreihenfolge wird nach dieser Nummer sortiert, dann nach der Y-Position und dann nach der X-Position.
    Zur Information: Es wäre ziemlich schwierig, die Tabulatorreihenfolge auszuwählen und im Designbereich anzuzeigen, da im Multi-Level-Modus nur die Couyrant-Ebene aktiv ist und in IceDesign gezeichnet wird.
    Die Tabulatorreihenfolge wird mit dem Makro SetTabOrder(#Gadget1) festgelegt: SetTabOrder(#Gadget2).
    Und die Reihenfolge, in der die Gadgets erstellt werden, bleibt unverändert (Ebene,Tabulator,Y- und dann X-Position). Dadurch bleiben die TextGadgets neben den Strings... und das Öffnen und Schließen der Container entfällt.
Ara
Beiträge: 35
Registriert: 29.08.2004 13:40

Re: IceDesign GUI-Designer

Beitrag von Ara »

Danke für das Update.

Die IceDesign_x86.exe startet einwandfrei.
Die IceDesign.exe bringt bei mir leider einen Fehler.
SilkTheme.zip Not found in the current directory. Exit now.

Ich benutze Purebasic 6.10 32 Bit und 64 Bit.
Keine Ahnung ob der Fehler bei mir oder im IceDesign liegt. Alte Versionen gehen.

Viele Grüße
Thomas
Win11 Pro
PureBasic 6.10 LTS
ChrisR
Beiträge: 84
Registriert: 04.03.2017 12:23

Re: IceDesign GUI-Designer

Beitrag von ChrisR »

Hallo Thomas,
Scheint hier gut zu funktionieren, es keine Änderungen an diesem Teil.
Beim Start sollte er SilkTheme_Light.zip in denselben Ordner extrahieren. Überprüfe, ob du Schreibrechte für diesen Ordner hast oder vielleicht das Antivirenprogramm.
Ara
Beiträge: 35
Registriert: 29.08.2004 13:40

Re: IceDesign GUI-Designer

Beitrag von Ara »

Danke für die Info mit den Schreibrechten, das war der Fehler.
Klappt jetzt einwandfrei.
Vielen dank.
Thomas
Win11 Pro
PureBasic 6.10 LTS
ChrisR
Beiträge: 84
Registriert: 04.03.2017 12:23

Re: IceDesign GUI-Designer

Beitrag von ChrisR »

IceDesign wurde auf Version 2.1.4 aktualisiert

Es ist möglich, die Position von geklonten oder kopierten Gadgets anzupassen, wobei die Höhe und/oder Breite des/der duplizierten Gadgets und ein X/Y-Versatz berücksichtigt werden. Es funktioniert auch mit Mehrfachauswahlen, die Höhe/Breite ist die der Auswahl. Siehe Bildschirm unten

Bild

Zusätzlich zu "Fenstername hinzufügen" wurden Präfixe und Suffixe (vorher ".i" und nicht wirklich nützlich) geändert und sind nun sowohl für Variablen als auch für Konstanten verfügbar. Siehe Bildschirm oben
Sie können sie entweder kombinieren oder nur eine von ihnen verwenden.

Nach dem 1. Durchlauf sind die Standard-Kurznamen der Steuerelemente nun in IceDesign.ini anpassbar. Zu verwenden mit der Option "Use Short Name for Controls" in den Einstellungen.
IceDesign.ini

Code: Alles auswählen

[ControlsShortName]
Button = Bouton
CheckBox = Häkchen
...
IceDesign ist jetzt mit PB 6.10 und VS Linker kompiliert
:)
ChrisR
Beiträge: 84
Registriert: 04.03.2017 12:23

Re: IceDesign GUI-Designer

Beitrag von ChrisR »

IceDesign wurde auf Version 2.1.6 aktualisiert

Deutsche Sprache hinzugefügt, Dank an SiRprise 8)
Einige Verbesserungen, Korrekturen in ObjectTheme
Fehler in den Namen der Menüpunkte behoben
ChrisR
Beiträge: 84
Registriert: 04.03.2017 12:23

Re: IceDesign GUI-Designer

Beitrag von ChrisR »

IceDesign wurde auf Version 2.1.7 aktualisiert
  • Korrigieren Sie die Namen der Konstanten (oder Variablen) für Schriftarten und Bilder, indem Sie nur die erlaubten Zeichen beibehalten, z. B:
    Für die Schriftart: @Mx437 HP 100LX 6x8, 20, Bold, lautet der Name der Konstante: #Font_Mx437_HP_100LX_6x8_20_B.
    und der Ladevorgang ist: LoadFont(#Font_Mx437_HP_100LX_6x8_20_B, "@Mx437 HP 100LX 6x8", 20, #PB_Font_Bold).
  • Ändern Sie den für das Hintergrundbild erzeugten Code in den Einstellungen, indem Sie jetzt:
    SetClassLongPtr, GCL_HBRBACKGROUND anstelle eines deaktivierten Hintergrundbildes.
  • Die Variablen Brush_Background und Quit (zum Verlassen der Schleife) verwenden den kurzen Namen des Fensters, Präfix und Suffix, wie es auch bei anderen Konstanten und Variablen der Fall ist.
ChrisR
Beiträge: 84
Registriert: 04.03.2017 12:23

Re: IceDesign GUI-Designer

Beitrag von ChrisR »

IceDesign wurde auf Version 2.2.0 aktualisiert

Rückgängig/Wiederherstellen-Funktionen hinzufügen
Das stand schon eine Weile in meinem Todo, aber ich konnte nicht sehen, wie man es einfach machen kann, angesichts der Anzahl der Rückgängig-Aktionen, die zu bewältigen sind.

Um dies zu umgehen, wird die komplette IceDesign-Liste der Gadgets in einer Undo/Redo-Liste für jede Änderung gespeichert.
Beim Rückgängigmachen/Wiederherstellen werden die vorherigen oder nächsten Listen neu geladen und komplett neu angezeigt (die aktuelle Auswahl geht verloren).
Es ist also nicht wirklich unmittelbar, da das Neuladen ein wenig Zeit in Anspruch nimmt, aber es erfüllt seinen Zweck 8)

Um zu verhindern, dass die Undo/Redo-Liste zu groß wird, kann die maximale Anzahl der Undo-Vorgänge in den Einstellungen geändert werden. Ich habe sie standardmäßig auf 99 gesetzt, aber sie könnte höher sein.
Antworten