Neuigkeiten
Treeview Switchbar Tutorial für mIRC
03. Oct 2005 / Kommentare
Original verfasst am: 01.01.2003
Treeview Switchbar
Dies ist ein Tutorial - eine Anleitung. Simples kopieren wird euch nicht zu einer voll funktionstüchtigen Switchbar bringen, das Tutorial zeigt euch nur die wichtigsten Schritte. Grundlegende Erfahrungen wären hilfreich wenn nicht sogar verpflichtend.
Einleitung
Eine Treeview Switchbar ist nichts weiteres als ein Dialog den man mithilfe von .dll Dateien bearbeitet. Dazu werden 2 verschiedene benötigt, zum einen MDX welche aus dem List-Objekt innerhalb des Dialogs den Treeview erstellt und zum anderen kTools Ultradock welche den Dialog an die Seite von mIRC legt.
1. Schritt: Der Dialog
Zuerst erstellen man nun den benötigten Dialog mit der Bezeichnung "switchbar". Hier kommen die oben genannten Erfahrungen ins Spiel, d.h. ihr solltet schon wissen wie man einen Dialog kreiert. Bei den Koordinaten und Grössenangaben orientiert man sich an den meinigen welche aber später an die eigenen Bedürfnisse angepasst werden können.. x und y müssen jeweills -1 sein, für w (Breite) und h (Höhe) werden die Werte 75 und 1000 (dbu) genommen. In diesem Dialog wird nun ein List-Objekt hinein gesetzt welches später mit Mdx bearbeitet wird. Auch hier wird -1 für x und y verwendet und w wird auf 78 sowie h wiedermals auf 1000 gesetzt Als ID nimmt man logischwerweise die 1 und nun sollte das ganze so aussehen:
dialog switchbar {
title "switchbar"
size -1 -1 75 1000
option dbu
list 1, -1 -1 78 1000, size
}
Zu Testzwecken kann man sich diesen Dialog jetzt mit /dialog -m switchbar switchbar ansehen.
2. Schritt: Bearbeiten mit MDX/Ultradock
Das erstellen des Treeviews geschieht im Init-Event des Dialogs, hierzu legt man sich zuerst ein "mdx"-Alias an welches /dll pfadzurmdx.dll $1- ausführt. Selbiges wird dann für die UltraDock.dll gemacht.
Nachdem nun die beiden Aliase erstellt sind muss MDX für den Dialog geladen werden, d.h. es werden nun folgende zwei Befehle in dem oben genannten Event ausgeführt:
mdx SetMircVersion $version
mdx MarkDialog $dname
Und gleich danach werden auch schon die ersten visuellen Modifikationen vorgenommen. Mit
mdx SetDialog $dname style
mdx SetControlMDX $dname 1 treeview haslines hasbuttons showsel > pfadzurviews.mdx
entfernt man den Kopf des Dialogs und lädt dann in der zweiten Zeile den Treeview. Wichtig ist, dass der Pfad hier angepasst wird. Ich würde empfehlen in dem MDX Help File nachzulesen was genau die Befehle "SetMircVersion", "MarkDialog", "SetDialog" und "SetControlMDX" machen. Kurz gefasst sagen die ersten beiden MDX nur die Mirc Version und den aktuellen Dialog welchen man bearbeiten möchte (man kann ja mehr als einen haben), ein wenig komplizierter werden dann die beiden anderen, beide haben diverse Optionen und Parameter welche man, wie gesagt, ruhig mal nachlesen sollte.
Jetzt kann der Dialog bereits an der Seite angedockt werden:
ultradock Dock 0 $dialog(switchbar).hwnd left switchbar
Nun ist es mal wieder an der Zeit zu schaun wieweit die Treeview ist (/dialog -m switchbar switchbar), da jetzt aber oben der Balken fehlt benötigen man /dialog -c switchbar switchbar um den Dialog wieder zu schliessen! Sobald jetzt die gewünschten Icons hinzugefügt wurd kann man auch schon anfangen Inhalte hinzuzufügen. Hierfür werden drei Befehle gebraucht welche alle mit "did -i $dname 1 1" in die erste Zeile unserer Switchbar geschrieben werden. Sollten sie nun auch wirklich optisch hineingeschrieben werden weiss man, dass mit den Pfaden vom MDX etwas nicht stimmt.
did -i $dname 1 1 clearicons normal
did -i $dname 1 1 iconsize normal small
did -i $dname 1 1 seticon normal 0 pfadzumicon.ico
In der ersten Zeile werden erstmal alle Icons die geladen sind (falls welche geladen sind) gelöscht, mit der zweiten legt man die Grösse fest. Letzteren Befehl muss man nur je nachdem wieviele Icons hinzugefügt werden sollen wiederholen. Die 0 bewirkt, dass diese einfach der Reihe nach durchnummeriert werden, nun sollte auch klar werden warum zuerst gelöscht werden musste. Um Missverständnissen vorzubeugen hier nochmal ein Beispiel wie man mit der letzten Zeile umgeht:
did -i $dname 1 1 seticon normal 0 pfadzumstatus.ico
did -i $dname 1 1 seticon normal 0 pfadzumchannel.ico
did -i $dname 1 1 seticon normal 0 pfadzumquery.ico
Fertig ist unser Treeview ;)
3. Schritt: Laden des Inhalts
Jetzt fängt die richtige Arbeit erst an,es wird nun ein Alias namens "/load.switchbar" angelegt mit welchem nun die Einträge in die Bar gemacht werden. Zuerst wird überprüft ob die Switchbar überhaupt offen ist und löscht dann den ganzen Inhalt falls welcher vorhanden ist:
alias load.switchbar {
if ($dialog(switchbar)) {
did -r switchbar 1
}
}
Nun kommt der eigentliche Teil, unter dem did -r (Zeile 4) folgt nun eine While-Schleife welche sämtliche Networks zu welchen mIRC connected ist durchgeht und hinzufügt.
var %s = 1
while (%s <= $scon(0)) {
scon %s
did -i switchbar 1 1 cb root
did -a switchbar 1 +eb 1 1 $iif($status != disconnected,$iif($scon(%s).network == $null,$scon(%s).server $chr(9) $scon(%s).server,$scon(%s).network $chr(9) $scon(%s).network / $scon(%s).server),Not connected)
inc %s
}
In diese Schleife wiederum werden nochmals (Zeile 6) zwei weitere eingefsetzt welche die entsprechenden Channel und Queries erstellen womit man dann folgendes hat:
did -i switchbar 1 1 cb last
did -a switchbar 1 +e 3 3 Channel ( $+ $chan(0) $+ ) $chr(9) Channel ( $+ $chan(0) $+ )
did -i switchbar 1 1 cb last
var %i = 1
while (%i <= $chan(0)) {
did -a switchbar 1 2 2 $chan(%i) $chr(9) $chan(%i)
inc %i
}
did -i switchbar 1 1 cb up
did -a switchbar 1 +e 3 3 Queries ( $+ $query(0) $+ ) $chr(9) Queries ( $+ $query(0) $+ )
did -i switchbar 1 1 cb last
var %i = 1
while (%i <= $query(0)) {
did -a switchbar 1 3 3 $query(%i) $chr(9) $query(%i)
inc %i
}
Anmerkung:
Ich denke diesen Code sollte man leicht nachvollziehen können wenn man ein wenig Ahnung hat, was ja die Vorraussetzung für dieses Tutorial ist. Mit den Befehlen welche mit "did -i switchbar 1 1 cb" beginnen navigieren wir durch die Verzeichnisse. "Cb root" steht somit für das oberste (Grund-/Hauptverzeichnis, sozusagen c: auf unserer Festplatte), "cb last" sagt MDX das dies der letzte Eintrag (vorerst) auf dieser Ebene sein soll und wir nun gerne die nächsten Einträge unterhalb des voherigens erstellen möchten. Das heisst wir machen auf "cb root" den Server (e.g. QuakeNet) dann "cb last" und dort Channel sowie Queries. Mit "cb up" wiederum sagen wir dann das wir wieder ein Verzeichnis hoch möchten, in diesem Fall "cb root". Wie man oben sieht fügt man einzelnde Punkte unter Verwendung von did -a switchbar 1 hinzu. Die Attribute +eb stehen hierbei für expanded und bold - weitere kann man der MDX Help entnehmen. Die folgenden 2 Zahlen sind die Nummern vom Icon. Danach adden wir den eigentlichen Text zweimal getrennt mit einem $chr(9). Der Teil hinter dem Tab ($chr(9)) stellt unseren Tooltip dar.
did -a [dname] [id] [attr] [icon] [icon] [text] $chr(9) [tooltip]
Nachdem dies getan ist fügt man unterhalb der Server DCC/@Windows und alles andere nach demselben Prinzip hinzu.
/dialog -m switchbar switchbar /load.switchbar4. Schritt: Klick mich!
Um jetzt noch navigieren zu können wird ein "Sclick"-Event benötigt.
on *:DIALOG:switchbar:sclick:1: {
tokenize 32 $did(1,1)
echo -a $1-
}
Zu Testzwecken kann jetzt hemmungslos auf der Switchbar herumgeklickt werden. Von Interesse sind in der Ausgabe die hinteren Zahlen welche die Verzeichnisse wiedergeben durch die man vorher mit "cb" navigiert ist. Zu beachten ist, dass alle Zahlen um eins erhöht sind.
slclick select mouse 2 3 3
Diese Zeile zum Beispiel würde bedeuten das in dem ersten Network, unter dem zweiten Eintrag (Queries) auf das zweite Query geklickt wurde. Diese Ausgabe muss nun weiterverarbeitet werden, was theoretisch aber kein Problem darstellen dürfte.
Tipps:
- Die Fenster einfach mit /window -a aktivieren
- Bei Channel und Query Windows ein Timer verwenden um das Fenster zu aktivieren, ansonsten ist das Eingabefeld nicht aktiv
- Bei DCC Fenster zum Beispiel wie folgend verfahren:
/.timer -m 1 1 window -a "Get $get(1) $get(1).file $+ "wobei die beiden Einsen ausgetauscht werden müssen mit der entsprechenden Nummer. - Status Fenster:
/window -a "status window"
5. Schritt: Doch wie...
... aktualisierst man das nun!? Tja das ist eine Frage die ich nicht so leicht beantworten kann. Es gibt zwei gängige Methoden:
Methode 1:
In jedem Event das /load.switchbar Alias aufrufen und einfach die komplette Switchbar neu laden. Nachteil: Auf langsameren Rechnern bzw. auch auf schnelleren flackert es jedesmal wenn die Switchbar neu geladen wird, nicht so schön und auch Arbeitsintensiver für den PC, für dich selber nicht, das ist auch der Vorteil.
on *:JOIN:#:{ if ($nick == $me) { .timer -m 1 1 load.switchbar } }
on *:CONNECT:{ .timer -m 1 1 load.switchbar }
on *:OPEN:*:{ .timer -m 1 1 load.switchbar }
...
Methode 2:
Man bearbeitet in jedem Event nur den Teil der betroffen ist. Hierzu kann man z.B. wenn man etwas löschen möchte zuerst ausrechnen wo genau der Eintrag liegen sollte und dann mit /did -d switchbar 1 [id] löschen. Editieren wiederum (Icons wechseln, Font bold darstellen) kann man mit "replaceitem"
did -i switchbar 1 1 replaceitem [id] [attr] [icon] [icon] [text] $chr(9) [tooltip]
Geht man also davon aus, dass die Zeile welche beim klicken slclick select mouse 2 2 9 ausgibt (8ter Channel im ersten Network) geändern werden soll:
did -i switchbar 1 1 cb root 2 2
did -i switchbar 1 1 replaceitem 9 +b [icon] [icon] #chan $chr(9) #chan
Das heisst rd muss zuerst mit der ersten Zeile an die Stelle hingegangen werden und anschliessend mit dem zweiten Befehl die Zeile überschrieben werden.. Diese Methode ist schöner aber auch um einiges komplizierter und dementsprechend auch Buganfälliger.
Nachwort
- Um die Switchbar nun immer zu laden muss man ein on Start Event anlegen und mit dialog -m switchbar switchbar öffnen. Ausserdem muss das /load.switchbar Alias noch an das Ende des Init Bereiches angefügt werden damit der Inhalt gleich geladen wird.
- Die Original Switchbar kann mit der DMU.dll entfernt werden. Ebenso gut geht es aber auch in den mIRC Options.
- Um Highlight und allgemeinen Betrieb im Channel/Query erkenntlich zu machen kann man einzelne Menüpunkte dick schreiben bzw. ein anderes Icon verwenden. Einzelne Zeilen farbig zu gestalten ist NICHT möglich.
Update: Zum Thema "replaceitem"
Obwohl ich innerhalb dieses Tutorials den MDX Befehl replaceitem schon zur Sprache brachte sehe ich mich gezwungen hier nochmal ein wenig was zu erläutern da wohl das lesen und verstehen der MDX Help einigen Schwierigkeiten bereitet.
did -i switchbar 1 1 cb root Hiermit kommen wir dorthin wo die Server/Networks aufgelistet sind, ins Hauptverzeichnis
did -i switchbar 1 1 cb root 2 Erstes Network
did -i switchbar 1 1 cb root 3 Zweites Network
did -i switchbar 1 1 cb root 2 2 Channel des ersten Networks
did -i switchbar 1 1 cb root 2 3 Queries des ersten Networks
Mit diesen Befehlen müssen wir zuerst navigieren bevor wir mit replaceitem was verändern. Wie ich oben schon erwähnte hat replaceitem folgenden Syntax, did -i switchbar 1 1 replaceitem [id] [attr] [icon] [icon] [text] $chr(9) [tooltip]. Wenn wir jetzt also mit did -i switchbar 1 1 cb root 2 2 zu den Channel unseres ersten Networks "navigiert" sind müssen wir bei replaceitem als [id] 2 für den ersten Channel angeben, 3 für den zweiten und soweiter. Das heisst wir machen zum Beispiel did -i switchbar 1 1 cb root 2 2 | did -i switchbar 1 1 replaceitem 3 +b 1 1 #chan $chr(9) #chan um den zweiten Channel des ersten Networks dick zu schreiben.
Bold ist wie ihr evt. gesehen habt das b, da sind wir auch schon beim Thema "Wie lasse ich ein Channel dick anzeigen". Ganz einfach, ihr macht genau das was ich eben getan hab im on Text Event, d.h. ihr schaut das wievielte Network es ist und der wievielte Chan (das erfahrt ihr wenn ihr durch $chan() bzw. $scon() cycled und überschreibt den Eintrag mit
~ Kommentare ~
ein noob am 12. Jan '07 18:56
Hi ich hab eine Frage.
Also ich habe die 2. Methode fürs Aktualisieren genommen.
Zuerst navigiere ich zu den Channels des jeweiligen Netzwerkes.
Dann will ich mit did -a switchbar 1 2 %status $chan(%ichan) $chr(9) $chan(%ichan) den Channel hinzufügen.
Nur irgendwie ist er dann an der untersten Stelle(obwohl er zb. an der 3. sein sollte)
Wie handhabe ich es so, dass er an seiner richtigen Position angezeigt wird.
ein schlauerer nub^^ am 15. Jan '07 23:32
Hi echt nettes Tutorial!
Hab auch die 2. Methode genommen und ich finde es echt super, das du den "Usern" nicht alles fertig präsemtierst, sondern sie nach denken lässt.
1+ dafür ;)