Seite 2 von 6

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Verfasst: 02.03.2016 01:11
von Andre
@PureLust: Planst du eigentlich auch eine Unterstützung von verschiedenen Fonts in den Dialogen? (für mich z.B. nützlich bei TextGadgets, die ich als Überschriften oder Beschriftung von weiteren GUI-Elementen verwende)

Wenn ja, gibt es ja evtl. die Möglichkeit einen optionalen Parameter 'FontID' einzuführen. Und wenn dieser Wert gültig, d.h. ein abweichender Font angegeben, ist, dann könnte der Dialog-Generator automatisch den notwendigen XML-Code ergänzen.

Ansonsten ist dies sicher auch "händisch" durch Befüllung des 'XMLParam$' Parameters möglich, habe es noch nicht probiert.

Aktuell nutze ich in meinem händisch erstelltem XML-Code die folgenden selbst erstellten "Hilfs"-Funktionen. Vielleicht sind dir diese nützlich, falls du Unterstützung abweichender Fonts tatsächlich einbauen möchtest.... :allright:

Der nachfolgende Code ist nicht direkt lauffähig, da ich "nur" die Funktionen aus meinem Projekt zusammenkopiert habe:

Code: Alles auswählen

; First we create the 1x1 pixel image for later testing the text width with GetTextWidth()....
If Not CreateImage(#Image_GetTextSize, 1, 1)
  Debug "Can't create 1x1 image for testing text width later..."
EndIf

Procedure GetTextWidth(text$, FontID = #Font_Standard, AddAdditionalGadgetPixels = #True)
  ; This function has the purpose to check, how the width (in pixel) of a given text is.
  ; As the 2nd and 3rd parameters are optional, as standard the regular system-font
  ; (FontID = #Font_Standard) will be used, and there will be added an additional
  ; pixel size to the calculated text-width for using the returned value with gadgets.
  ; The standard of this parameter is #True, as in most cases the needed width of a
  ; gadget (TextGadget, HyperlinkGadget,...) is needed. In other cases (e.g. for 
  ; calculating the pure text-width a listicon column need to have...) this parameter
  ; need to be set to #False.
  Protected width
  If StartDrawing(ImageOutput(#Image_GetTextSize))
    If FontID <> #Font_Standard
      DrawingFont(FontID(FontID))
    Else
      DrawingFont(GetGadgetFont(#PB_Default))
    EndIf
    width = TextWidth(text$)
    StopDrawing()
  Else
    Debug "StartDrawing() failed - can't check for text width!"
  EndIf
  If AddAdditionalGadgetPixels = #True
    ;CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
    ;  width * 1.05
    ;CompilerEndIf
    width + 15    ; currently (Aug. 201%) this value if for testing only, it need to be adapted for each OS and probably a factor is needed...
  EndIf
  ;Debug text$ + "==> width = " + Str(width)
  ProcedureReturn width
EndProcedure
  
Procedure GetTextHeight(text$, FontID = #Font_Standard)
   Protected height
   If StartDrawing(ImageOutput(#Image_GetTextSize))
     If FontID <> #Font_Standard
       DrawingFont(FontID(FontID))
     Else
       DrawingFont(GetGadgetFont(#PB_Default))
     EndIf
     height = TextHeight(text$)
     StopDrawing()
   Else
     Debug "StartDrawing() failed - can't check for text width!"
   EndIf
   ProcedureReturn height
EndProcedure  

Procedure.s DialogGadgetTextSize(text$, FontID, margin=0)
  ; This function is a combination of the two other functions, and will give
  ; a XML containing both width and height parameters!
  Protected width, height
  width = GetTextWidth(text$, FontID) + margin     ; we use another self-written function to calculate the width value
  height = GetTextHeight(text$, FontID) + margin     ; we use another self-written function to calculate the height value
  ; ... and now we return a XML string with both values:
  ProcedureReturn " width='"+Str(width)+"' height='"+Str(height)+"' "
EndProcedure

;-------------------------------

; eine exemplarische Zeile aus dem XML-Code:
         "          <text name='WHNameTitle' text='WHeritageName'" + DialogGadgetTextSize(Language("WHeritageName"), #Font_SmallBold, 3) + " />" + LF$ +

;-------------------------------

Procedure SetDialogGadgetTitleFont(Dialog, GadName$, FontType = #Font_SmallBold)
  ; The purpose of this function is, to check if a gadget - created via XML dialog - is available,
  ; and if yes set the smaller 'title' font for it. This is used to shorten code like this example:
  ;   gad = DialogGadget(dialog, "WHNameTitle")
  ;   SetGadgetFont(gad, FontID(#Font_SmallBold))
  ;
  ; Parameters:
  ;  dialog   = dialog number previously got (to be given as parameter from calling procedure)
  ;  GadName$ = name of the gadget created in the XML description
  ;  FontType = can be given as parameter (e.g. for bigger fonts like #Font_Middle or #Font_Big),
  ;             or the standard (#Font_SmallBold) like used for all section titles will be used
  ;
  Protected gad
  gad = DialogGadget(Dialog, GadName$)
  If gad > -1
    SetGadgetFont(gad, FontID(FontType))
  EndIf  
EndProcedure


; nach der erfolgreichen Dialog-/GUI-Erstellung verwendete Funktion:
  SetDialogGadgetTitleFont(dialog, "WHNameTitle")

Was für mich weniger interessant, sind besondere Makro-Funktionen o.ä., die das Einrücken erleichtern.
Ich komme gut und ausreichend mit dem händischen Einrücken der "DynamicDialogs-Befehle" zurecht, und bin schon froh, dass im generierten XML-Code dem Testen/Debuggen wegen ordentliche Einrückung automatisch dabei ist... :D

Ich kann mich nur wiederholen: herzlichen Dank für deine Mühe! :mrgreen:

PS: Wo bleibt eigentlich die Veröffentlichung im engl. Forum? 8)

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Verfasst: 03.03.2016 02:12
von PureLust
matbal hat geschrieben:
PureLust hat geschrieben:- Modul: DynamicDialogs_suffixed_IDonly
- Modul: DynamicDialogs_suffixed_NameOnly
Die Idee finde ich gut. Das macht den Code auch noch etwas übersichtlicher.
Hab ich jetzt mal umgesetzt. Es gibt jetzt also die Varianten '..._suffixed', '..._suffixed_IDonly' und '..._suffixed_NameOnly' die ich mal als "AddOns" bezeichnen würde.
In diesem Zusammenhang hab ich gleich noch ein kleines ReDesign vorgenommen:

Ich hab jetzt das Haupt-Modul "DynamicDialogs" und die AddOns '..._suffixed', '..._suffixed_IDonly' und '..._suffixed_NameOnly' in separate pbi-Dateien aufgeteilt.
Somit hat man also nicht mehr eine einzige große Include-Datei, sondern kann sich die AddOns je nach Geschmack selber hinzu fügen.
Noch als Hinweis: Die 'AddOns' inkludieren das 'Haupt'-Modul automatisch, so dass man also z.B. nur die Datei "DynamicDialogs_suffixed_IDonly' inkludieren muss um, wenn man die ID-only Version nutzen möchte.

Weiterhin hab ich die 'AddOns' verschlankt und die Funktionen, die exakt identisch zu denen im Haupt-Modul waren, gestrichen.
Das hat jetzt zur Folge, dass Ihr zuerst mit 'UseModul DynamicDialogs' das Haupt-Modul aktivieren müsst und dann z.B. zusätzlich mit "UseModul DynamicDialogs_suffixed_IDonly" noch die von Euch gewünschten Funktionen des AddOns.
matbalschrieb: Die Konstante fehlt noch im zweiten Modul "DynamicDialogs_suffixed".
Genau das war ein Grund für die Verschlankung.
Da die 'suffixed'-Variante bisher den kompletten Funktionsumfang des Haupt-Moduls hatte, musste ich fast alle Änderungen im Haupt-Modul dann auch in der suffixed-Version durchführen - da konnte es schon mal zu Flüchtigkeitsfehler kommen. Mit den neuen '..._IDonly' und '..._NameOnly' AddOns wären dann sogar vier Varianten zu pflegen gewesen - Fehlerquellen pur.
Nun habe ich in den AddOns keine redundanten Funktionen zum Haupt-Modul mehr drin und die AddOns bieten nun nur noch Zusatz-Funktionen.
Andre hat geschrieben:Planst du eigentlich auch eine Unterstützung von verschiedenen Fonts in den Dialogen? (für mich z.B. nützlich bei TextGadgets, die ich als Überschriften oder Beschriftung von weiteren GUI-Elementen verwende)
Gute Idee. :allright:
Da ich die Funktionen aber nicht mit noch mehr Parametern überladen möchte, hab ich mir überlegt das mit einer Font()-Funktion zu lösen.
(Im SourceCode des Haupt-Moduls hab ich da mal ein paar Ideen zu hingekitzelten. Kannst da ja mal reinschauen wenn Du magst.)

Einen Font='...' Parameter im XML-Code unterstützt die PureBasic Dialog-Library meines Wissens ja nicht - oder doch?

André schrieb: Was für mich weniger interessant, sind besondere Makro-Funktionen o.ä., die das Einrücken erleichtern.
Ich komme gut und ausreichend mit dem händischen Einrücken der "DynamicDialogs-Befehle" zurecht, ...

Probier die suffixed-Varianten doch einfach mal aus. Also ich möchte das automatische Einrücken in der IDE nicht mehr missen. :mrgreen:

André schrieb: Ich kann mich nur wiederholen: herzlichen Dank für deine Mühe!

Abba jerne doch. :wink:

André schrieb: PS: Wo bleibt eigentlich die Veröffentlichung im engl. Forum?

Wollte hier erst mal ein wenig Feedback sammeln, Bugs beseitigen und auch den idealen Stil für die Umsetzung finden (wie z.B. die heutige Auslagerung der AddOns).
Englisches Forum kommt bestimmt noch.

Ach ja .... neue Version mit Bug-fixes, den nun augelagerten AddOns und abgeänderten Demos wieder unter dem gleichen LINK online. :D

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Verfasst: 03.03.2016 17:51
von matbal
Danke für die neue Version. Ich habe es gleich mal ausprobiert. Mein Favorit ist "DynamicDialogs_suffixed_IDonly.pbi".

Dadurch, daß man auch das Modul DynamicDialogs einbinden muß, hat man jetzt zwar fast alle Befehle doppelt in der Autovervollständigung (mit und ohne __), aber damit kann ich mich gut arrangieren.

Übrigens finde ich es genial, wie du die gut lesbaren Tips für die Statuszeile hinbekommen hast. Auf den Trick mit dem CompilerIf #False und den Dummy-Declarations muß man erst einmal kommen... 8)

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Verfasst: 03.03.2016 21:37
von PureLust
matbal schrieb: Dadurch, daß man auch das Modul DynamicDialogs einbinden muß, hat man jetzt zwar fast alle Befehle doppelt in der Autovervollständigung (mit und ohne __), aber damit kann ich mich gut arrangieren.

Ist mir natürlich auch schon aufgefallen und fand ich jetzt auch nicht sooo dramatisch - aber unschön isses schon.
Um das noch abzustellen könnte ich auch noch die nicht-suffix Varianten auslagern, so dass man also immer (auch für die normalen nicht-suffix Befehle) ein AddOn wählen müsste.
Wäre vielleicht gar nicht so schlecht, da das die Nutzung konsistenter machen würde (da man dann immer 2 UseModul Befehle nutzen müsste), aber würde natürlich dann für User wie z.B. André bedeuten, dass er eine Zeile mehr im Code schreiben müsste. :mrgreen:
@André: was meinst Du ... wäre das ein Problem für Dich?

matbal schrieb: Übrigens finde ich es genial, wie du die gut lesbaren Tips für die Statuszeile hinbekommen hast. Auf den Trick mit dem CompilerIf #False und den Dummy-Declarations muß man erst einmal kommen... 8)

Jo, ... man muss sich halt irgendwie zu helfen wissen. :mrgreen:
Ich hatte zwar im englischen Forum mal ein Feature-Request bzgl. der Help-Texte geschrieben - das dümpelt aber bislang wohl unbeachtet vor sich hin.

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Verfasst: 04.03.2016 00:38
von Andre
Ich komme vor morgen abend leider nicht zu irgendwelchen Tests, sorry...

Im Moment nur mal 2 kurze Statements:
- einen <font> Tag für XML Dialog Definitionen gibt es bisher leider nicht, existiert aber als Wunsch im englischen Forum: http://www.purebasic.fr/english/viewtop ... =3&t=57272
Weitere Unterstützung dafür wäre wünschenswert ; -)
- das mit dem zusätzlichen UseModule stört mich nicht, wenn das die entsprechenden Vorteile bringt und jeder dadurch das nutzen kann, was er möchte. .. :-)

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Verfasst: 04.03.2016 03:24
von PureLust
Sooo ... neue Version online.

Änderung:
- Basis-Modul wurde nun umbenannt in 'DynamicDialogs_MainModul.pbi' (muss im Grunde nie eigenständig eingebunden werden).
- die 'normalen' Funktionen für die XML-Elemente (also die ohne Suffix) wurden nun in ein eigenes AddOn ausgelagert: 'DynamicDialogs_plain.pbi".
(Info: Auch vom neuen '..._plain'-AddOn wird das Basis-Modul 'DynamicDialogs_MainModul.pbi' automatisch mit inkludiert.)

Für die Standard-Funktionen sowie den Zugriff auf die Konstanten müsst Ihr also nun das Main-Modul nutzen:

UseModul DynamicDialogs

und für die Funktionen zum Aufbau des XML-Codes eines der AddOn:

UseModul DynamicDialogs_plain
UseModul DynamicDialogs_suffixed
UseModul DynamicDialogs_suffixed_IDonly
UseModul DynamicDialogs_suffixed_NameOnly

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Verfasst: 04.03.2016 22:49
von matbal
Nochmal Danke für die Änderungen. Jetzt ist es richtig komfortabel, keine doppelten Einträge mehr in der Autovervollständigung. Ich bin damit vollauf zufrieden.

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Verfasst: 05.03.2016 01:06
von Andre
Ich habe nun auch die neue (auf 2 Includes aufgeteilte) Version erfolgreich in mein Projekt integriert.
Verwende die 'plain' Variante und alles ist bestens, danke! :D

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Verfasst: 06.03.2016 11:32
von matbal
Ich habe deine Includes unter Linux und OSX ausprobiert. Deine Includes funktionieren da auch gut. Ich mußte aber die Konstante #Blue noch definieren. Die scheint es nur unter PB-Win zu geben.

Re: DynamicDialogs - komplexe dynamische GUIs einfach erstel

Verfasst: 06.03.2016 11:39
von PureLust
matbal hat geschrieben:Ich habe deine Includes unter Linux und OSX ausprobiert. Deine Includes funktionieren da auch gut. Ich mußte aber die Konstante #Blue noch definieren. Die scheint es nur unter PB-Win zu geben.
Oh super, danke für's Testen und den Hinweis. :allright:
In der nächsten Version ersetze ich #Blue dann mal durch $FF0000, dann sollte es keine Probleme mehr geben.

@André: Font-Funktionen sind in der Mache. :wink: