1. Wurzelwidget (vorerst Desktop) 1.1 es gibt ein Objekt, das die Wurzel der darzustellenden Objekte repräsentiert 1.2 das Wurzelobjekt wird von Layer abgeleitet und enthält damit keine eigene Surface 1.3 es hält Referenzen auf alle enthaltenen Widgets - Widgets sollten mit schwaren Referenzierungen gespeichert werden -> Referenzen müssen nicht entfernt werden -> Referenzierungen behindern nicht das zerstören der Widgets - die Widgets werden während ihrer Erzeugung eingetragen - Umsetzungsvorschlag: WeakValueDictionary 2. Klassenstruktur object | | Control | +------+--------+ | | Container Widget | | +------+---+-+-----+-----+-|---+------+-----------+------------+--------+ | | | +---|-+---|-+---|-+----|-+---------|-+----------|-+------|-+ | | | | | | | | | | | | | | | | | | Layer Frame Button Label Entry Text Checkbutton Radiobutton Listbox Scrollbar | | Desktop \-> besser: Textfield / Text wie in Tkinter:P * Mehrzeilenwidget - welchen Namen wählen? ------------------------------------------ Text - kurz, entspricht Tkinter Widget, "text" ist aber ein zu allgemeines Wort Textfield - direkte Bezeichnung, aber wenig Bezug zu existierenden Sprachen Textarea - aus html Weitere Widgets: - Dropdown (option of listbox?) - PygTree - menu - filebrowser - select (list of elements with prev and next buttons that displays one - Dialogs (vgl. tkSimpleDialog, tkMessageBox, ...) - Tree (Baumstruktur wie z.B. Windows Filebrowser) - Contextmenü (auf Menü-Basis) - Menüs (auf Tree-Basis) - colorchooser - spinbox (oä) - statusbar - TabbedFrame (oä) WIDGET - DETAILS Selector -------- Beschreibung: Soll die Auswahl eines Elements aus einer Sammlung möglicher Elemente ermöglichen, indem der User über Steuerelemente blättert. Standardmäßig besteht ein Selector-Widget aus 3 horizontal angeordneten Elementen: - die Widgets können optional auch vertikal angeordnet werden - Möglichkeit unterschiedlicher Schritte/Ziele einbauen -> ein Element pro Klick (default) -> n Elemente pro Klick -> zu festgelegtem Element springen -> zum Anfang / zum Ende springen - Scroll-Widgets indiviuell erzeugen / anpassen - simplen aber universellen Mechanismus ausdenken - "loop"-Option einrichten -> wenn True beginnt der Durchlauf am anderen Ende neu Anm: Label, Entry & Textfield aus einem Basewidget oder sogar als ein Widget mit Attributen wie zB editable und multiline. Mechanismus zur Autovalidation von Eingabefeldern bereitstellen (evlt. sogar implizit durch Angabe einer Variablen. Wenn die eingabe nicht zum typ der Variablen konvertiert werden kann, wird sie zurückgesetzt) * Validierung von Entry-Eingaben -------------------------------- => Komplett über TypVariablen handhaben? - bei Tastendruck wird die Eingabe dem bestehenden Inhalt hinzgefügt - die Validierungsfunktion (vom User übergeben) wird mit Ausgangswert und neuem Wert aufgerufen - die Validierungsfunktion prüft die Gültigkeit des neuen Werts - darf der neue Wert eingesetzt werden, gibt die Funktion einen wahren Wert zurück - ist der neue Wert ungültig, gibt die Funktion einen Wert mit Wahrheitswert False zurück - innerhalb der Funktion kann der Programmierer den User z.B. durch eine MessageBox informieren - zur Validierung von Standardtypen können vordefinierte Konvertierungs- funktionen statt der bestimmte trings angegeben werden: "str", "int", "float", "hex" 3. Widgets und Container 3.1 Listbox kann andere Widgets in der Liste darstellen? ==> nein, dafür Frames - der Listbox wird eine Sequenz aus Strings oder Surfaces übergeben - aus diesen Elementen werden ListboxItem-Instanzen generiert - ListboxItems sind Einträge mit speziellen Funktionen zur Interaktion mit der Listbox - ListboxItem ist eine interne, von Label abgeleitete Klasse zur Darstellung von ListBox-Einträgen. Es können Strings (StringVars) und Images/Surfaces dargestellt werden (->resizing?) 3.2 Wigets können optional Text oder Image enthalten: Label 3.3 Interaktion zwischen Scrollbar und Listbox, Textxxx, Frame, ... optional - Verbindung durch Aufruf einer Methode von Scrollbar oder verlinktem Widget herstellen 4. Variablenobjekte 4.1 Variablenobjekte dienen u.a. der Gruppierung und Steuerung von Checkbuttons und Optionbuttons 4.2 Check- und Optionbuttons haben einen on- und einen off-Wert default ist on=True, off=False (Int) on=Widgettext, off="" (String) 4.3 Variablen enthalten ein callback dictionary (weak) mit Funktionen, die nach einer Änderung des Inhalts mit folgenden Parametern aufgerufen werden: - self: Referenz auf das Variablenobjekt, z.B. um den callback zu loeschen - prevalue: Wert vor der Änderung - postvalue: Wert nach der Änderung 4.4 Variablentypen Var (generell), IntVar, StringVar, FloatVar, BoolVar 4.5 Das Textattribut von Widgets, die es verwenden, wird intern durch ein StringVar-Objekt repräsentiert 4.6 Das Valueattribut von Widgets, die es verwenden, wird intern durch ein ein IntVar oder FloatVar repräsentiert 4.7 Die Sondermethoden __str__, __int__, __float__, __bool__ müssen implementiert werden 4.8 Der Wahrheitswert eines Variablenobjekts entspricht dem des repräsentierten Objekts (str, int, float, bool, sonstige) 4.9 Die Sondermethoden __add__, __sub__, __mul__, __div__ (...?) sowie ihre __r- Varianten müssen zur Interaktion mit Std.typ-Variablen implementiert werden. -> 15 + IntVar-Instanz => Summe aus 15 und Wert der IntVar-Instanz a = StringVar("Hallo ") b = StringVar("Welt! ") a + b => "Hallo Welt! " b + a => "Welt! Hallo " a + "Juggernaut" => "Hallo Juggernaut" Anm.: Es wäre cool, variablen dynamisch zu kombinieren. UMSETZUNG in var.py BEISPIEL (kopiert): =========================================== >>> from var import StringVar >>> king = StringVar("nobody") >>> whosking = StringVar("%s is king", king) >>> print whosking nobody is king >>> king.value = "Jug" >>> print whosking Jug is king =========================================== Natürlich kann auch ein StringVar in einem Var-Objekt gespeichert werden: =========================================== >>> from var import StringVar, Var >>> king = StringVar("Jug") >>> question = StringVar("%s is king?") >>> ask = Var(question, king) >>> print ask Jug is king? >>> question.value = "%s is hungry?" >>> print ask Jug is hungry? =========================================== So können automatisch Attribute von Widgets verknüpft werden, da Attribute in StringVars gespeichert werden StringVar.set() .get() .set_value() .set_vars() Meta-data --------- Data of file "index.csv" that must be contained in each imageset directory. ImageSetLoader._load_metadata reads the data of the csv-file saved in the imageset directory that is is received from ImageSetLoader.imageset. It returns a list of data set dictionaries with: - "widgetname" : name of widget, like "button" - "filename" : name of file containing the images - "stretch" : value - if True: the tiles are stretchable if False: images are used as the are - "states" : the names of the states the tiles describe, like "normal", "over", "down", "disabled" --------------- - Widgetgeneration genauer formulieren (Image->Widget). - Themesystem - genereller, globaler Aufbau. Was genau muss der user machen um eine minimale gui zu erzeugen. (-> events, -> blitting) - Zeitoptimierungen (->dirtyRects oä) - Untermodul mit nützlichen funktionen gui.utils (oä) - funktionen zur farbkonvertierung (dunkler, heller, umkehren, ...) - surface mit textur füllen - ... - Handling of focus - Layout management - Option handling (vgl. tkinters widget.config(), widget["option"]) - intelligentes Eventmanagement - intelligente, einfache, intuitive Integration in bestehende Programme (die gui sollte nicht den mainloop übernehmen, sondern aus diesem jediglich upgedated und geblittet werden). - dezentrales System, dh. nicht ein 'Desktop', also eine Surface über den ganzen Bildschirm auf die man Guielemente legen kann, sondern einzelne Frames (oä, egal wie man das nennt), die man beliebig blitten/platzieren kann. (-> Multiscreen management) - Effizient arbeiten, Pygamefunktionen voll ausnutzen. Dazu zählt vor allem die Nutzung von DirtyRects (kenn mich damit auch noch nicht so aus, jedoch sollte ein flip() pro Frame nicht durch die GUI erzwungen werden. Dieser Punkt sollte vlt. auch in der mailinglist noch ausführlicher diskutiert werden. - durchdachtes Geometrymanagement - intelligentes Themesystem. Das Layout muss denk ich mal auf jeden Fall image-basiert konzipert werden. Dabei sollte auch ohne eigene Bilder ein zum Rest des Programms passendes Design einfach zu erstellen sein. Dazu könnte man Alphamaps verwenden, in denen nur Konturen und Schatten gespeichert sind, und in die dann eine beliebige Farbe eingesetzt werden kann.