Notice: This forum has been recovered from an old backup, so some content, links, and dates may be outdated. The forum is currently read-only while we restore sign-in and registration functionality. Details

If you find this forum valuable and would like to help keep it online, donations to help cover hosting and domain costs are greatly appreciated, but never expected. You can support the forum through Buy Me a Coffee or Ko-fi. Thank you for helping preserve the EventGhost community.

Registry Plugin (war: Dialog Layout)

Allgemeines zum Thema EventGhost
Bartman
Plugin Developer
Posts: 881
Joined: Sun Feb 12, 2006 9:03 am

Registry Plugin (war: Dialog Layout)

Post by Bartman »

Ich habe unten stehenden Code, der einen Auswahl für Registrywerte darstellt. Der funktioniert auch schon ganz gut, aber ich sitze mittlerweile länger daran, dass Teil zu layouten, als die Funktion zu schreiben.
Ich m├Âchte, dass der Baum mit w├ñchst, wenn man das Fenster gr├Â├ƒer macht und dann unten die mittlere Eingabekomponente mitw├ñchst (oder auch alle gleichm├ñ├ƒig, falls das geht).

Außerdem wäre es nett, wenn die Kinder des Baums sortiert wäre. Das geht zwar auch, aber dann wird nach A,B,...Z, a,..z sortiert. Kann man da iirgendwie Einfluß drauf nehmen?

Ist es legitim, den Sizer von meiner Komponente (RegistryChooser) zu erweitern, um f├╝r den ganzen Dialog ein einheitliches Layout zu haben?

Code: Select all

[Source Code entfernt, da neuere Version weiter unten verf├╝gbar]
Last edited by Bartman on Wed Aug 23, 2006 5:38 pm, edited 1 time in total.
User avatar
Bitmonster
Site Admin
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Post by Bitmonster »

Hmm, gute Idee so ein Plugin.

Also warum der nicht richtig resized:
Wenn man ein Control in wxPython baut, dass selbst aus mehreren Controls besteht, dann muss man auch eine "OnSize" Methode definieren und diese mit dem passenden Event verbinden:

Code: Select all

    def __init__(self, parent, id = -1, ...
        ...
        self.Bind(wx.EVT_SIZE, self.OnSize)

    def OnSize(self, event):
        if self.GetAutoLayout():
            self.Layout()
Insgesamt ist es gerade bei TreeCtrls in der Regel auch einfacher und vor allem auch ├╝bersichtlicher, wenn man eine TreeCtrl-Unterklasse baut, statt das TreeCtrl direkt zu verwenden.
Das ist auch so eine Konsequenz aus dem "Zen of Python", dass da unter anderem lautet: "Flat is better than nested."
Also lieber eine neue Toplevel-Klasse bauen, als alles in ein St├╝ck Code zu verschachteln.

Was das Sortieren angeht, schau dir mal die Doku zu wxTreeCtrl::OnCompareItems und wxTreeCtrl::SortChildren an.

In dem Fall w├╝rde ich aber einfach f├╝r jeden Zweig die Daten erst in eine Liste schreiben, die Liste dann sortieren und dann erst wieder einzeln AppendItem aufrufen.

Macht aber schon was her, der Baum.

Was mir so auf die Schnelle noch aufgefallen ist:
1. Statt:
tree.SetItemData(node, wx.TreeItemData(fatherData))
kann man auch schreiben:
tree.SetPyData(node, fatherData)
2. Die Items zeigen noch nicht an, ob sie Children haben.

Das hattest du schon gefunden?
http://wiki.wxpython.org/index.cgi/TreeControls
Bartman
Plugin Developer
Posts: 881
Joined: Sun Feb 12, 2006 9:03 am

Post by Bartman »

Das mit dem Resizen geht jetzt, aber nur in der Horizontalen.
Das mit dem Auslagern in eine eigene Klasse f├╝r die TreeCtrl kann ich mir mal anschauen. wird ja nicht so schwer sein

zu 1) Das ist mir schon aufgefallen bei den GBSpan und GBPosition Parametern. Hatte das nur noch nicht ├╝berall nachgezogen.

zu 2)
Das ist ja Absicht. Spätestens wenn man HKEY_CLASSES_ROOT schon mal ausliest, dann steht mein Rechner bzw. EG schon einige Zeit still. Das scheint dann so ein LazyTree wie in dem Wiki zu sein.
Mal schauen, was da noch so drin steht.
User avatar
Bitmonster
Site Admin
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Post by Bitmonster »

Du musst:
dialog.sizer.Add(regChooserCtrl, 1, flag = wx.EXPAND)
machen, damit er auch in die andere Richtung resized.

zu 2.)
Na ja, ist aber trotzdem besser, wenn man gleich sieht, dass es noch weiter nach unten geht. D├╝rfte ja auch nicht schwer sein. Man muss ja nur mit EnumKey rausfinden, ob er Subkeys hat und dann entsprechend wxTreeCtrl::SetItemHasChildren benutzen.

Vielleicht sollte man auch mal ausporbieren, ob das win32api Modul nicht wesentlich schnell ist, als das _winreg Modul.
User avatar
Bitmonster
Site Admin
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Post by Bitmonster »

Ok, ich habe das gerade mal mit C ausprobiert und da ist das Enumerieren der Keys so schnell wie in Regedit. Ich werde daher mal eine kleine Funktion schreiben, die alle Subkeys als Python-Liste zur├╝ckgibt, inkl. der Anzahl der Subkeys und Subvalues die diese Subkeys jeweils haben.

Ich hab nur eigentlich gar keine Zeit um irgendwas an EG zu machen.
Kann also ein paar Tage dauern.

Aber du kannst ja schon so weiter machen und erstmal HKEY_CLASSES_ROOT ausklammern.
Jedenfalls sollte der Baum nur bei einem OnExpand ausklappen und nicht schon bei einem OnSelect.
User avatar
Bitmonster
Site Admin
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Post by Bitmonster »

Na ja, hat mir doch keine Ruhe gelassen. Ich habe mir doch ne Stunde genommen um das mal in C zu gießen. Also:

1. Neuste Beta installieren.
2. Am Anfang des Plugins folgenden import machen:
from eg.cFunctions import RegEnumKeyAndValueNames

3. Dieses Teil deines Codes:

Code: Select all

                try:
                    index = 0
                    while(True):
                        enumKeyName = _winreg.EnumKey(regHandle, index)
                        #print "New subkey", enumKeyName
                        data = (False, fatherData[1], parentSubkey + enumKeyName, None )
                        tmp = tree.AppendItem(node, enumKeyName, image = folderIcon, data = wx.TreeItemData(data))
                        if subkey2Find == enumKeyName:
                            newItemSelected = True
                            tree.SelectItem(tmp)
                        index += 1
                except EnvironmentError, e:
                    pass 
gegen folgendes austauschen:

Code: Select all

                keyNames, valueNames = RegEnumKeyAndValueNames(regHandle)
                for keyName, numSubKeys, numSubValues in keyNames:
                    data = (False, fatherData[1], parentSubkey + keyName, None)
                    tmp = tree.AppendItem(
                        node, 
                        keyName, 
                        image=folderIcon, 
                        data=wx.TreeItemData(data)
                    )
                    tree.SetItemHasChildren(tmp, numSubKeys + numSubValues > 0)
RegEnumKeyAndValueNames liefert zwei Listen zurück. Die erste enthält Dreier-Tuple für jeden SubKey mit (Name des Subkeys, Anzahl Subkeys des Subkeys, Anzahl Values des Subkeys).
Die zweite Liste enthält die Namen der Values des Keys.

Wie man sieht ist jetzt selbst HKEY_CLASSES_ROOT ausreichend schnell.
Bartman
Plugin Developer
Posts: 881
Joined: Sun Feb 12, 2006 9:03 am

Post by Bartman »

teste ich gleich mal.
Ich habe jetzt noch das Problem, dass beim Klick auf das Plus neben einem Ordner nichts passiert.
Ist ja eigentlich auch logisch, weil ja nichts ausgewählt wird. Und selbst wenn ich auf EVT_TREE_ITEM_EXPANDING reagiere weiß ich grade nicht, wie ich rausbekomme welche + denn jetzt ausgewählt wurde.
User avatar
Bitmonster
Site Admin
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Post by Bitmonster »

Code: Select all

 def OnExpandNode(self, event):
    treeItem = event.GetItem()
    node = self.GetPyData(treeItem)
Bartman
Plugin Developer
Posts: 881
Joined: Sun Feb 12, 2006 9:03 am

Post by Bartman »

ich habe jetzt folgenden Code.
ist in der Tat deutlich schneller. Sind die Namen eigentlich schon sotiert?
Ich habe aber das Problem, dass alle Valuenamen gleich sind. Es sind aber unterschiedlich viele.

Code: Select all

[Source Code entfernt, da neuere Version weiter unten verf├╝gbar]
User avatar
Bitmonster
Site Admin
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Post by Bitmonster »

Update ist oben.
Bartman
Plugin Developer
Posts: 881
Joined: Sun Feb 12, 2006 9:03 am

Post by Bartman »

geht tatsächlich.
Fehlt noch der Typ, auch wenn mir das nicht so wichtig ist.

Ist aber schon heftig, dass das soviel schneller ist. Da verstehe ich auch, dass du die Tastaturabfrage in c machen willst. Hat jetzt mehrere Tage gedauert, bis Autohotkey eine Sekunde CPU-Zeit beansprucht hat ;)

Da hätte ich gleich auch schon die nächsten Fragen
1) Wie geht das denn mit den Icons? Du hast da ja schon ein paar Tools f├╝r gebastelt. Daf├╝r k├Ânnte ich so auf Anhieb den ganzen Verlauf nicht mehr nachvollziehen.

2) Wie ist das rechtlich mit den Icons?
Wenn ich jetzt z.B. die Teile aus Regedit exportorie. Darf man die dann in ein GPL Programm packen?
Dass man einfach sagt nimm Icon 42 aus foo.exe geht nicht ohne weiteres oder?
User avatar
Bitmonster
Site Admin
Posts: 2239
Joined: Mon Feb 06, 2006 10:28 pm

Post by Bitmonster »

1. Ich auch nicht. :)
Werde da auch besser so schnell nicht wieder Hand anlegen. Das war unheimlich viel Gefummel um die ganzen Transparenz-Probleme, etc. zu l├Âsen. Also besser gar nicht verwenden, bis ich das irgendwann mal dokumentiert hab.

2. Eigentlich stehen alle Microsoft Icons unter einer Lizenz, die sowas verbietet. Ein direktes auslesen w├ñre damit auch verboten. Allerdings scheint Microsoft das sehr lachs zu handhaben. Teilweise sind einige Icons ├╝ber Visual Studio unter eine Lizenz ver├Âffentlicht worden, die die freie Verwendung erlauben. Allerdings sind die Icons nur im Win95-Stil. Also auch nicht so prickelnd.

Icons sind insgesamt für EventGhost noch ein großes Problem. Die sollten alle noch überarbeitet/sortiert/neu kreiert werden. Da muss mal etwas geschehen. Aber bei der geringen Userzahl, ist die Wahrscheinlichkeit einen zu finden der mit Grafik umgehen kann, noch recht gering. Obwohl, für das Logo haben sich ja auch welche gefunden. War zwar noch nicht abgeschlossen die Entwicklung, aber das jetzige gefiehl mir einfach schon ganz gut. Zumindest ist es besser als gar keins.

Aber wenn dir irgendwo frei verwendbare Icons ├╝ber den Weg laufen, die f├╝r EG brauchbar erscheinen, dann immer her damit.

Zur├╝ck zu EnumRegistry:
Ich habe die Funktion jetzt umbenannt in RegEnumKeysAndValues. Die zweite Liste ist jetzt eine Liste aus Tupeln, die jeweils Name und Typ (REG_* Konstante als Integer) enthalten.
Musst deinen Code also noch entsprechend anpassen.
Wäre auch denkbar als drittes Feld gleich den eigentlichen Wert zu liefern.
MonsterMagnet
Plugin Developer
Posts: 137
Joined: Fri Feb 10, 2006 12:04 pm

Post by MonsterMagnet »

Das ist echt mal ne gute Idee f├╝r ein Plugin !

Das mit den Icons find ich jetzt eigentlich nicht so wichtig (MS d├╝rfte das wohl kaum interessieren...), aber evtl. k├Ânnte man ja auf das Tango Project zur├╝ckgreifen, die Icons sind zwar auch nicht aussagekr├ñftiger und genauso
zweckentfremdet aber immerhin.

http://tango.freedesktop.org/Tango_Icon_Gallery
Bartman
Plugin Developer
Posts: 881
Joined: Sun Feb 12, 2006 9:03 am

Post by Bartman »

So hier mal die erste funktionsfähige Version. Bitte um Feedback.
Eigentlich w├╝rde ich die Funktion eher unter System vermuten. Konfigurieren muss man ja auch nichts. Wenn du m├Âchtest kannst du das ja in die allgemeinen Tools aufnehmen. Ich hoffe ich habe die Keyauswahl ordentlich getrennt.
Kann es sein, dass die Liste meldet, dass unterpunkte vorhanden sind, obwohl die Rechte nicht mal zum Lesen ausreichen?

Dann habe ich noch das Probleme, dass bei einigen wenigen Werten eine Exception fliegt, wenn ich den Wert im Log ausgebe. Scheinbar wird krampfhat versucht das als Unicode anzusehen.
Ist das ok, dass man im Dialog was im Log ausgibt?

Wenn ich brauchbare Icons habe kann ich auch noch die Unterscheidung der Typen einbauen.

Hast du eigentlich Zahlen wieviele Leute sich eine Version von EG so ungefähr runterladen?

Mit den komplizierteren Typen kann das Plugin auch nicht viel anfangen, aber ich denke f├╝r die einfachen Dinge reicht das.

Dafür hätte ich mir doch jetzt eigentlich auch so einen schicken Plugin Developer Titel verdient ;)

Fast 600 Zeilen für so ein wenig Funktion und wenn ich mich an die Zeilenläge gehalten hätte wären es sogar noch ein paar mehr geworden...

Code: Select all

[Source Code entfernt, da neuere Version weiter unten verf├╝gbar]
MonsterMagnet
Plugin Developer
Posts: 137
Joined: Fri Feb 10, 2006 12:04 pm

Post by MonsterMagnet »

Also soweit funktioniert das hier, was ich ändern, hinzufügen würde:

Command:
Change HKCU\Control Panel\Desktop\ScreenSaveActive to 1

Logger:
Change HKCU\Control Panel\Desktop\ScreenSaveActive to 1

Besser wär:

Registy:ScreenSaveActive to 1

Also ne Antwort.

Und was auch cool wär wenn Du noch ein current value Fenster in den Dialog einfügst und die Ausgabe nicht über den Logger kommt.

Ansonsten:

Sehr geil.
Post Reply