#1 [HowTo] Creating a Page (2.3.902 | GERMAN) by Bizzarrus 21.12.2012 18:54

avatar

Ein HowTo für v2.4 ist hier verfügbar!

Hier ein tutorial, wie man eine eigene Subpage in GroupInvite erstellt und einbindet:

1. Erstellung eines kleinen 'PagePacks'
Dieser Schritt ist optional, allerdings empfohlen! Du kannst die Subpage ebenso direkt in den GroupInvite Ordner erstellen, allerdings könnte sie dann bei einem Update von GroupInvite wieder gelöscht werden. Mit diesem Schritt beugt man dem vor, indem man die Subpage in ein eigenes, kleines Addon einbaut(PagePacks).
Hierzu, erstelle zunächst einen Unterordner in dem Addons-Ordner(du kannst den Ordner nennen, wie du willst). In diesem erstellst du zunächst mit dem Windows-Editor oder einem ähnlichen Programm(z.B. Notepad++) eine .toc und eine .lua datei, die beide zum laden deines PagePacks nötig sind. Auch diese kannst du im grunde nennen, wie du willst. Die .lua datei trägst du dann in die .toc datei ein.
In die .lua schreibst du folgenden Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
if(not _G["GroupInvite_AddPages"])then _G["GroupInvite_AddPages"]={}; end
local pages={
"<Name deiner Subpage>",
};
for a=1,table.maxn(pages)do
local f=false;
for b=1,table.maxn(_G["GroupInvite_AddPages"])do
if(_G["GroupInvite_AddPages"][b][1]==pages[a] and _G["GroupInvite_AddPages"][b][2]=="Interface/Addons/<Name deines Unterordners>/")then
f=true;
end
end
if(f==false)then
table.insert(_G["GroupInvite_AddPages"],{pages[a],"Interface/Addons/<Name deines Unterordners>/"});
end
end
 



Statt den <...> gibst du natürlich die entsprechenden Werte ein. Wenn du die SubPage in einen weiteren Unterordner speicherst, solltest du dessen Pfad ebenfalls bei "" mit angeben! Wie dir vll aufgefallen ist, ist die Variable pages eine table, heißt du kannst beliebig viele SubPages in ein PagePack einschließen, wenn du möchtest.

2. Erstellung der Subpage
Nun kommen wir zu dem wichtigen Teil Um es einfach zu machen, kopiere die Datei test.lua aus dem Ordner GroupInvite/LUA/Tree/ in deinen PagePack Ordner (Solltest du den ersten Schritt übersprungen haben, erstelle eine Kopie der datei in dem selben Ordner, in dem sie sich befindet. Die Registrierung der Datei findet dann im Loader statt!) und benenne sie entsprechend um.
Wenn du die Datei nun öffnest, enthällt diese bereits einiges an code, der zur Ausführung der Subpage benötigt wird(bzw teilweise sind die Funktionen auch optional). Um die Subpage richtig zu laden, ist jeweils ein code-teil ganz oben und ganz unten von bedeutung:

1
2
3
4
5
6
7
8
 
local page={
name = "test",--name of page
parent = "Group",--name of page parent(the page, under which this page stands in tree, use "" if its a top page, like the group page)
iff = nil,--string - If value in string does not exist: hide page. If nil, ignore. If set to "false", the page won't be shown in the tree menu. Use " & " to check more than one value(space are needed)
version = 1.0,--number - the version of this page(needed for patching, etc)
scmd = "test",--optional, add slash command /gic test ...
parts = 1,--optional, number of parts of this page(allow a number of pages IN this page, this has nothing to do with the number of pages UNDER this page!)
};
 



ist der erste Teil. Diese Table gibt GroupInvite alle wichtigen Informationen über deine Subpage!

  • name: Diese Variable ist der Name deiner SubPage, wie sie von GroupInvite genannt werden soll. Der Name hat nichts mit dem Dateinamen zu tun und dient nur als Eindeutige ID, um in der Sprachdatei die richtigen Texte auszuwählen!
  • parent: Diese Variable gibt den Namen einer SubPage an, die der deinen Übergeordnet ist. Gib "" an, um die SubPage als eine der obersten Seiten anzuzeigen.
  • iff: Diese Variable ist optional und gibt in form eines Strings die Namen von Globalen Variablen an, die beim Starten des Spieles geladen werden müssen, damit diese Seite angezeigt wird.
  • version: Diese Variable gibt die Version deiner SubPage an. Die Information ist wichtig, da GroupInvite daran erkennt, ob es die Gespeicherten Variablen überprüfen muss, falls bei einem update neue hinzu kamen.
  • scmd: Auch diese Variable ist optional, sie steht für den Sub-Slash-Command. Ist scmd z.B. gleich "hans" würden die Slash Commands, die mit der Seite eingebunden werden, alle mit "/gic hans " anfangen. (Achtung: Wenn du Slash Commands in diese Seite einbinden willst, musst du hier etwas eingeben! Es ist aber auch erlaubt, dass mehrere SubPages den gleichen scmd Wert haben!
  • parts: ACHTUNG: DIE MIT DIESER VARIABLE VERBUNDEN FUNKTIONEN KÖNNEN NOCH FEHLERHAFT SEIN!!!. Die Variable ist optional und teilt deine SubPage praktisch nochmals in mehrere SubPages auf, zwischen denen dann an den oberen Ecken der SubPage gewechselt werden kann.

#2 RE: [HowTo] Creating a Page (2.3.902 | GERMAN) by Bizzarrus 21.12.2012 19:22

avatar

Der zweite wichtige Code-Abschnitt ist folgender:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
local add={
Page=page,--gives the whole page tab, since v2.3.837 not needed
Func={--this tab is not needed, it includes all functions to execute by GroupInvite
OnShowFrame=GroupInvite_MyFrame,--every of this lines could be deleated if you don't need the function
OnLoad=GroupInvite_PrivatLoad,
OnUpdate=GroupInvite_PrivatUpdate,
OnEvent=GroupInvite_PrivatEvent,
OnSetText=GroupInvite_PrivatSetTextThis,
OnDataControl=GroupInvite_PrivatSaveLoad,
OnBtnClick=GroupInvite_PrivatButtonClick,
OnDropDown=GroupInvite_PrivatDropDown,
ClickModes="",--this value is optional,too. It declines which click modes will be recognized, if this is set to "" or to nil, only the normal "CLICK" event will be recognized, else all events which will be found in this string will be recognized
},
DefaultData=default,--this tab includes all save settings, not needed
Colors={--this tab includes a table of all colors the page need to save, not needed
["MyColorsA"]={--the "MyColorsA" is the title of the colors
["SendColour_Test_1"]="|cffff00ff",
["SendColour_Test_2"]="|cff0f0f0f",
},
["MyColorsB"]={
["SendColour_Test_3"]="|cffaffa00",
},
},
AddLanguages={--(not needed)
{"Interface/Addons/MyTestPage",GroupInvite_PrivatGetMyLang,{"RU"}},--allows multi languages files:
{"Interface/Addons/MyTestLang2",GroupInvite_PrivatGetMyLang,{"ES","RU"}},--allow optional adding of additional languages(these need a FULL translation!)
{"Interface/Addons/MyTestLang3",GroupInvite_PrivatGetMyLang},
},
};
GroupInvite_Execute("GroupInvite_Tree_RegisterTab",add);
 


Bei diesem, etwas längerem, Codeabschnitt ist das wichtigste die schlechte Wortwahl: "not needed" heißt hier nicht dass die Variable nicht mehr in Gebrauch ist, sondern, dass die Variable optional ist. Auch hier sollte man allerdings wissen, welche Folgen es hat, wenn man die entsprechenden Variablen weg lässt!

  • Page: Diese Variable muss gleich dem code weiter oben sein. Wenn diese Variable gleich nil ist, werden nur die Bereiche "Colors" und "AddLanguages" in der Liste berücksichtigt!
  • Func: Diese Table enthällt die zum ausführen benötigten Funktionen, wie die OnLoad funktion oder ähnliches. Die genaue Absicht dieser Funktionen sollte sich aus dem Funktionsnamen erschließen, einzig sollte darauf geachtet werden, dass die OnLoad funktion hier nicht wie bei normalen Addons praktisch als erstes ausgeführt wird, sondern erst nach dem Ausblenden des Ladebildschirms(mit dem LOADING_END event). Neben den Funktionen ist auch die Variable ClickModes vorhanden, die ebenfalls optional ist und GroupInvite mitteilt, auf welche Interaktionen es eine Reaktion an diese SubPage (genauer gesagt an die Funktion OnBtnClick) senden soll. Die gewünschten Aktionen werden, mit einem Leerzeichen getrennt, als String angegeben. Mögliche Interaktionen sind:
    • CLICK: Wird beim Clicken eines Buttons aktiviert und wird unabhängig von der Variable CLickModes sowieso immer gesendet
    • WHEEL: Wird aktiviert, wenn sich das Mausrad bewegt, während die Maus über dem Button liegt
    • DONW: Wird beim herunterdrücken der Maustaste auf den Button aktiviert
    • UP: Wird beim loslassen der Maustaste über dem Button aktiviert
    • ENTER: Wird aktiviert, sobald sich die Maus über dem Button befindet
    • LEAVE: Wird aktiviert, sobald sich die Maus nicht mehr über dem Button befindet
  • DefaultData: Hier wird eine table weitergegeben, die als Prototyp der später gespeicherten Variablen dient. Es zeigt sowohl die Struktur als auch den Dateityp, den die entsprechenden Werte haben müssen
  • Colors: Diese table enthällt Farben, die in GroupInvite mit der Funktion GroupInvite_GetColor(col, inst) erhalten werden können. Diese Farbwerte werden automatisch gespeichert und sind in der SubPage Farbeinstellungen InGame veränderbar. Der Name des Tables, in welchem die Farben enthalten sind, dient zur Sortierung der Farben auf dieser SubPage nach Überschriften.
  • AddLanguages: Diese Table beinhaltet weitere tables, die jeweils den Pfad zu deinen Sprach-Dateien, eine Funktion, die je nachdem, welche Sprach datei zuletzt geladen wurde, deren Inhalt entsprechend ausgibt, und eine weitere table, die besagt, welche Sprachdateien in diesem Ordner vorhanden sind. Die letzte table ist optional, sollte sie nicht existieren wird bei jeder Sprache versucht, diese auch aus diesem Ordner zu laden. Es ist empfohlen, mindestens eine englischsprachige Datei(EN.lua) enthalten zu haben, auf die GroupInvite automatisch zugreift, sollte es keine Datei in der von dem Benutzer ausgewählten Sprache geben. Es können auch Sprachen angegeben werden, die in GroupInvite noch keine Übersetzung haben, diese werden dann in der liste der auswählbaren Sprachen mit angezeigt. Außerdem gillt zu beachten, dass diese Sprach Dateien nach denen von GroupInvite geladen werden und deren Werte daher überschreiben könnten!


Ist dies alles gemacht, sollte die Seite korrekt geladen und im Baum-Menü angezeigt werden. Sie wird allerdings noch leer sein, da wir noch keine Frames hinzugefügt haben!

#3 RE: [HowTo] Creating a Page (2.3.902 | GERMAN) by Bizzarrus 21.12.2012 20:01

avatar

Bitte beachte, dass der folgende Code-Abschnitt in jeder Seite, die angezeigt werden soll, vorhanden sein muss. Änderungen an diesem sind jedoch nicht notwendig!

_G["GroupInvite_"..page.name.."_GetPage"]=function()
return page;
end

(Hier hat das Forum ein Problem mit dem Anzeigen in Code Format...)

Als nächstes werde ich noch erklären, wie man die SubPage mit Inhalt füllt:
Der Vorgang, dass eine Seite angezeigt wird, wird komplett in der Funktion GroupInvite_MyFrame(partID) abgewickelt:

1
2
3
4
5
6
7
 
local function GroupInvite_MyFrame(partID)
if(not page.ID)then
page.ID=GroupInvite_Execute("GroupInvite_Tree_GetPageID",page.name);
if(page.ID==nil)then page.ID=0; end
end
GroupInvite_Execute("GroupInvite_Page_RegisterTooltip",page.ID,GroupInvite_PrivatTooltipReplaces);
end
 



Ist die Funktion so, wie sie hier oben steht, macht sie noch sehr wenig: Sie generiert eine eindeutige ID in Zahlenform für deine SubPage. Diese ID dient später zum erkennen deiner SubPage innerhalb des Addons und ist nötig, um die SubPage mit Inhalt zu füllen. Sollte diese ID gleich 0 sein, ist etwas in der Regestrierung deiner SubPage schief gegangen!
Das zweite, dass diese Funktion bisher noch macht, ist, die einzige Funktion, die unten nicht eingebunden werden konnte, nun einzubinden: Die TooltipReplace Funktion. Diese Funktion ist dazu da, Variablen in den Tooltips anzeigen zu können, und benötigt die ID deiner SubPage. Letzteres ist der Grund, warum die Funktion nicht vorher eingebunden werden konnte, denn die ID kann erst generiert werden, wenn alle SubPages geladen werden konnten(ob mit Erfolg oder ohne ist irrelevant, aber der Ladevorgang muss beendet sein bevor eine ID generiert werden kann! Das heißt die erste Funktion, in der die ID generiert werden kann, ist die OnLoad funktion deiner SubPage, früher geht nicht!)

Nachdem die TooltipReplace Funktion registriert wurde, können wir nun damit beginnen, Inhalt zu entwickeln. Hierzu gibt es zwei Grundlegende Methoden:

  • Du erstellst eine XML datei und lässt den darin erstellten Frame in dieser Funktion anzeigen, hierbei musst du die Anchors entsprechend an den GroupInvite Main Frame anlegen, und der Frame muss bei dem Event "GROUPINVITE_PAGE_CHANGE" wieder versteckt werden.
  • Möglichkeit zwei ist das benutzen von Funktionen, die GroupInvite bereit stellt. Diese Variante ist meistens Kürzer und, wenn man sich ersteinmal hinein gefunden hat, meist einfacher. Außerdem erlaubt diese Funktion, dass es keine anhäufung von XML elementen gibt. Auch Funktionen wie OnBtnClick usw sind bereits mit dieser Variante verbunden, daher werde ich diese Variante hier erklären:

3. Aufbau des Frames
Einen Teil des Frames zu erstellen besteht - je nach typ des Frames - meistens aus 3 Teilen:
Initialisierung des Frames und speicherung in eine temporäre Variable:
this=GroupInvite_Execute("GroupInvite_Page_GetNextText",page.ID,"GroupTitle");

Festlegung von Größe und Position des Frames: (Achtung: Listen Benutzen hier eine Funktion mit anderem Namen, die Werte-Anordnung ist jedoch identisch)
GroupInvite_Page_SetSizeAnchorsAndID(this,200,20,"TOPLEFT","TOPLEFT",nil,25,9,page.ID);

Festlegung von Text und Tooltip des Frames:
GroupInvite_Page_SetTextAndTooltip(this,"GUI_GroupTitle");

Bei der Initialisierung gibt es immer 3 Werte: Die Funktion zur Initialisierung, die ID der SubPage und der Name des Frames(dieser dient später als eindeutige ID des Frames). Welche Funktionen es zur Initialisierung der Frames gibt, ist in der Datei Pages.lua in den ersten Zeilen zu lesen.

Der initialisierte Frame wird in eine temporäre Variable gespeichert, die später als AnchorParent eingesetzt werden kann(in dem Beispiel wäre es der wert nil) Die im Beispiel angegebene Positionierung ist die Positionierung einer Linksbündigen Überschrift, im allgemeinen ist Empfohlen, die initialisierten Variablen von vorausgegangenen Frames als AnchorParent einzusetzen. Wird nil angegeben, wird der AnchorParent auf den GroupInvite Main Frame gesetzt. Die Werte 200 und 20 sind Breite und Höhe des Frames, die Werte 25 und 9 die Positionierung. Um Anhand des Namens und der Subpage-ID später auf den Frame zugreifen zu können, dient die Funktion GroupInvite_Page_GetThisByNameAndID(name,ID). Diese gibt als ersten Wert den Frame zurück, als zweiten Wert eine boolean Variable, ob der Frame gerade auf dieser Seite angezeigt wird.

Die Festlegung des Textes kennt nur 3 Werte: Die temporäre Variable, den Namen des Textes, den der Frame tragen soll, und den Namen des Tooltips des Frames. Die letzten Beiden Werte sowie der Einsatz der Funktion sind optional, wenn du statt den Namen eines Textes/des Tooltips den Wert "true" eingibst, wird der Name gemäß folgendem Schema automatisch generiert:
  • Text des Frames: GUI_[Name der SubPage]_[Name des Frames]
  • Tooltip: Tooltip_[Name des SubPage]_[Name des Frames]

  • Beim Tooltip wird in der Sprach-Datei nach dem Tooltip-Namen und einem weiteren "_" noch eine mit 1 Beginnende Nummerierung hinzugefügt. Der Text mit dem Wert 1 ist hierbei die Überschrift, der Rest sind Textabschnitte.
    Sollten Frames eine Variable Beschriftung besitzen, wird bei deren Beschriftung hier entweder garkein Text oder der Standart-Text eingesetzt, das Verändern des Textes läuft dann über die Funktion GroupInvite_PrivatSetTextThis(func), wobei die funktion func automatisch den Text des Frames setzt, sie benötigt nur den Frame(nicht den Namen sondern den Frame selbst) sowie den zu setzenden Text.

    Anschließend können bei bestimmten Objekten wie Listen oder Eingabe-Boxen zusatzwerte in Funktionen angegeben werden, wie, aus welcher Funktion die Liste ihren Inhalt zieht, oder was das Zeichenmaximums der Textbox ist.

    Falls ihr noch Fragen habt, fragt ruhig

Xobor Einfach ein eigenes Xobor Forum erstellen