WoWInterface

WoWInterface (https://www.wowinterface.com/forums/index.php)
-   Lua/XML Help (https://www.wowinterface.com/forums/forumdisplay.php?f=16)
-   -   Need help to integrate Addon-Options (https://www.wowinterface.com/forums/showthread.php?t=51508)

flow0284 01-12-15 03:15 PM

Need help to integrate Addon-Options
 
1 Attachment(s)
Hi all,

I'm not really good in addon programming and I need some help from you guys.
I maintain a very little milling addon called MillButton. Some users send me Mails with the idea to add some addon options to select the herbs (grouped by wow expansion) that the users want to mill when they use the addon.

Phanx already tried to helo me on a WoWAce, but I don't understand his example code. :(

If there was anyone who wants to help me, it would be very nice if he speaks german.

In attached files you can see my Addon.

Phanx 01-12-15 03:54 PM

For reference, here is what I posted on WowAce:

Quote:

Originally Posted by Phanx
You can see an example of a fully native (using Blizz templates only, no libraries) config panel with tabs here:
https://github.com/Phanx/CleanCompar...ptions.lua#L30
It's pretty lightweight, and wouldn't be too hard to adapt to your idea.

Another (somewhat bloated) option would be to use the AceConfig libraries:
1. Define an options table.
2. Register the options table with AceConfig-Registry.
3. Tell AceConfig-Dialog to make a config panel for your options table in the Interface Options window.


10leej 01-12-15 11:52 PM

Quote:

Originally Posted by Phanx (Post 304753)
For reference, here is what I posted on WowAce:

Oh come on Phanx no need to chase the poor soul down :rolleyes:

Duugu 01-13-15 02:38 AM

Das funktioniert grundsätzlich eigentlich ganz einfach. Am Beispiel von Phanx-Code grob erklärt:

Zuerst erstellst Du einfach ein Frame das später in den Blizzard Interfaceoptionen eingeblendet wird wenn jemand die Optionen für Dein Addon aufruft.

Lua Code:
  1. local Options = CreateFrame("Frame", ADDON.."Options", InterfaceOptionsFramePanelContainer)

Und dann fügst Du dieses Frame den Interfaceoptionen hinzu.

Lua Code:
  1. Options.name = GetAddOnMetadata(ADDON, "Title") or ADDON
  2. InterfaceOptions_AddCategory(Options)
  3. Addon.OptionsPanel = Options
Jetzt musst Du Dein Options-Frame nur noch mit den gewünschten Einstellungselementen füllen und diese entsprechend der aktuellen Einstellungen konfigurieren.

Lua Code:
  1. Options:SetScript("OnShow", function()
  2. --hier werden verschiedene Elemente erstellt und konfiguriert. zum Beispiel ein Titel:
  3.     local Title = Options:CreateFontString("$parentTitle", "ARTWORK", "GameFontNormalLarge")
  4.     Title:SetPoint("TOPLEFT", 16, -16)
  5.     Title:SetText(Options.name)
  6. --danach werden dann Unterkategorien erstellt. Aber ich würde sagen Du versuchst erstmal Optionen ohne Unterkategorien/Registerkarten zu bauen bevor Du Dich damit beschäftigst. :)
  7.  
  8. -- und dann kommen noch die Funktionen für die Standardbuttons die es bei den Optionen für jede Addon gibt (Ok, Abbrechen, Reset)
  9.     function Options.okay()
  10.     --was auch immer bei denen Optionen passieren soll wenn jemand auf ok klickt
  11.     end
  12.     function Options.cancel()
  13.     --was auch immer bei denen Optionen passieren soll wenn jemand auf abbrechen klickt
  14.     end
  15.  
  16. --und mit dieser Funktion werden die einzelnen optionselemente bei der anzeige aktualisiert
  17.     function Options.refresh()
  18.     --deine optionselemente entsprechend der aktuellen Einstellungen konfigurieren
  19.     end
  20. end)
Und zum Schluss wird dann noch ein Slash-Befehl registriert der das Optionsfenster öffnet:

Lua Code:
  1. SLASH_CLEANCOMPARE1 = "/ccompare"
  2. SlashCmdList.CLEANCOMPARE = function() InterfaceOptionsFrame_OpenToCategory(Options) end

Ich hoffe das erhellt die Sache ein wenig. Ansonsten frag einfach noch mal nach. :)

flow0284 01-13-15 12:33 PM

Ok das hat schonmal ein klein wenig Licht in die große Dunkelkammer gebracht.

Ich glaube ich habe aber doch vorher noch ein gaaanz anderes Problem.
Bevor ich mir gedanken mache wie ich die Optionen grafisch darstelle muss ich erst einmal hinbekommen meine künftigen Optionen zu speichern, oder?

Ich habe mir gedacht dazu eine Tabelle "MillButton_Defaults", in der die Standardeinstellungen vorgegeben sind, anzulegen. In dieser Tabelle möchte ich je WoW Erweiterung eine Untertabelle haben in der dann per ItemID nur über true und false angegeben wird, ob man das Kraut zu dieser ItemID immer mahlen will oder nicht.

Hier mal die Tabelle wie ich sie mir Momanten vorstelle (Damit es übersichtlich bleibt, nicht alle Kräuter):

Lua Code:
  1. MillButton_Defaults = {
  2.     ["Options"] = {
  3.         ["version"] = "6.0.3 - 2.0",
  4.         ["extended"] = true --für die Optionale Chatausgabe der übersrpungenen Kräuter (entfällt evtl.)
  5.     },
  6.     ["Classic"] = {
  7.         [765] = true, --Silberblatt
  8.         [785]   = true --Maguskönigskraut
  9.     },
  10.     ["The Burning Crusade"] = {
  11.         [22785] = true, --Teufelsgras
  12.         [22786] = true --Traumwinde
  13.     },
  14.     ["Wrath of the Lich King"] = {
  15.         [36901] = true, --Goldklee
  16.         [39970] = true --Feuerblatt
  17.     },
  18.     ["Cataclysm"] = {
  19.         [52983] = true, --Aschenblüte
  20.         [52984] = true --Sturmwinde
  21.     },
  22.     ["Mists of Pandaria"] = {
  23.         [72234] = true, --Teepflanze
  24.         [89639] = true --Entweihtes Kraut
  25.     },
  26.     ["Warlords of Draenor"] = {
  27.         [109124] = true, --Frostwurz
  28.         [109125] = true --Feuerwurz
  29.     },
  30. };

Die den jeweiligen Namen der Erweiterungen wollte ich für die Titel der Tabs hernehmen.

Bitte habt nachsicht mit mir Frischling :o

Duugu 01-13-15 05:44 PM

Quote:

Originally Posted by flow0284 (Post 304801)
Ok das hat schonmal ein klein wenig Licht in die große Dunkelkammer gebracht.

Ich glaube ich habe aber doch vorher noch ein gaaanz anderes Problem.
Bevor ich mir gedanken mache wie ich die Optionen grafisch darstelle muss ich erst einmal hinbekommen meine künftigen Optionen zu speichern, oder?

Ich habe mir gedacht dazu eine Tabelle "MillButton_Defaults", in der die Standardeinstellungen vorgegeben sind, anzulegen. In dieser Tabelle möchte ich je WoW Erweiterung eine Untertabelle haben in der dann per ItemID nur über true und false angegeben wird, ob man das Kraut zu dieser ItemID immer mahlen will oder nicht.

Oh. Ich dachte dieser Punkt ist bereits erledigt. Oke. Dann wird das wohl ein längerer Weg. ;)

Die Tabelle für die Standardeinstellungen ist natürlich ok. Aber ich denke Du solltest Dir erstmal ein paar grundsätzliche Fragen dazu stellen wie Du die Einstellungen speicherst und das dann so weit implementieren das es funktioniert. Willst Du verschiedene Profile? Mit Einstellungen pro Char oder für alle gleich?

Da ich nicht weiss wie weit Du mit dem Thema bist hilft Dir vielleicht diese Beschreibung: http://wow.gamepedia.com/Saving_vari..._game_sessions
Ist leider wieder englisch. Erklärt aber wie das funktioniert.

flow0284 01-13-15 05:55 PM

Die Einstellungen sollten pro Char gespeichert werden. Damit habe ich auch vorhin schon mal recht Erfolgreich experimentiert. :)

Ich werfe aber später trotzdem einen Blick auf deinen Link.

Phanx 01-13-15 09:31 PM

Lua Code:
  1. -- und dann kommen noch die Funktionen für die Standardbuttons die es bei den Optionen für jede Addon gibt (Ok, Abbrechen, Reset)
  2.     function Options.okay()
  3.     --was auch immer bei denen Optionen passieren soll wenn jemand auf ok klickt
  4.     end
  5.     function Options.cancel()
  6.     --was auch immer bei denen Optionen passieren soll wenn jemand auf abbrechen klickt
  7.     end

Normalerweise soll man diese Funktionen nicht definieren. Die Einstellungenfenster wird oft bei der ESC-Taste geschlossen, und dies ruft die "cancel"-Funktion anstelle der "okay"-Funktion, obwohl der Benutzer wahrscheinlich nicht beabsichtigt, um seine Änderungen abzubrechen.

flow0284 01-14-15 11:40 AM

Quote:

Originally Posted by Duugu (Post 304815)
Da ich nicht weiss wie weit Du mit dem Thema bist hilft Dir vielleicht diese Beschreibung: http://wow.gamepedia.com/Saving_vari..._game_sessions
Ist leider wieder englisch. Erklärt aber wie das funktioniert.

Mit Hilfe dieser Seite habe ich es gestern immerhin schon hinbekommen aus den Standardeistellungen aus der internen Tabelle die "SavedVariables" erstellen zu lassen.

In meiner .toc habe ich
Code:

## SavedVariablesPerCharacter: MillButtonDB
hinzugefügt. Ich denke es ist Benutzerfreundlicher wenn man pro Char einstellen kann was man mahlen will (vorausgesetzt man hat mehrere Chars mit Inschriftenkunde).

In meiner MillButton.lua habe ich das hier hinzugefügt:
Lua Code:
  1. local frame = CreateFrame("Frame")
  2. frame:RegisterEvent("ADDON_LOADED")
  3. frame:RegisterEvent("PLAYER_LOGOUT")
  4.  
  5. frame:SetScript("OnEvent", function(self, event, arg1)
  6.     if event == "ADDON_LOADED" and arg1 == "MillButton" then
  7.         if MillButtonDB == nil then
  8.             MillButtonDB = MillButton_Defaults
  9.             --DEFAULT_CHAT_FRAME:AddMessage("|cFF00FF00MillButton: |r Default settings loaded")
  10.         else
  11.             --DEFAULT_CHAT_FRAME:AddMessage("|cFF00FF00MillButton: |r Settings loaded")
  12.  
  13.         end
  14.     end
  15. end)

Für den (sehr wahrscheinlichen) Fall das die Defaultsettings mal wegen einer neuen Erweiterung oder ähnlichem erweitert oder geändert werden, so muss ja dann auch die "Datenbank" MillButtonDB erweitert werden. Hier sollen aber die Benutzereinstellungen nicht geändert werden, sofern das möglich ist.


Auf der Arbeit kam mir noch die Idee das Addon irgendwie in Abhängigkeit des vorhandenen Berufes nur zu aktivieren. Hier habe ich aber auch noch gar keine Ahnung wie das dann funktionieren könnte.

Lieber eines nach dem anderen.

flow0284 01-16-15 06:16 PM

Mal ein Update meine Hilfegesuches:

Meine Variablen werden mittlerweile pro Char gespeichert.
Im Blizzard OptionsFrame habe ich es geschafft mein Addon anzeigen zu lassen, das Umschalten zwischen "Extended" und "Normal" funktioniert und wird auch gespeichert.

Unterhalb des Optioneneintrags meines Addons habe ich es auch geschafft pro WoW Erweiterung eine Sub-Kategorie anzulegen.

Leider bekomme ich es nicht hin, jetzt noch diese Unterkategorien mit meinen restlichen Daten zu füllen.

Aufbau der Tabelle mit den Default_Options:
http://pastebin.com/kkJAzPRd

Hier der Aufbau meines Optionframes:
http://pastebin.com/uQm1tHT9

flow0284 01-24-15 10:33 AM

Ich bekomms einfach nicht hin. Ich glaub ich lass es sein und lege zumindest diese Idee auf Eis.

Trotzdem Danke Euch beiden für die Hilfestellungen.

flow0284 02-23-15 11:46 AM

1 Attachment(s)
Ok ich versuche es nochmal. Leider komme ich partou nicht weiter. Ich bekomme es einfach nicht hin, den Inhalt meiner Datenbank in die Optionspanels zu packen.

Ich hoffe mir kann da echt einer weiterhelfen.

Duugu 02-23-15 12:47 PM

Quote:

Originally Posted by flow0284 (Post 306756)
Ich bekomme es einfach nicht hin, den Inhalt meiner Datenbank in die Optionspanels zu packen.

Heyho

Das ist leider eine echt magere Beschreibung des Problems. :)
Du musst in den Panels doch nur passende Widgets zur Anzeige der Daten erstellen und dann bei OnShow über diese die jeweils passenden Daten anzeigen lassen.
Wie hast Du das bisher probiert und was genau ist dabei schiefgelaufen oder unklar?

flow0284 02-23-15 05:05 PM

In Zeile 78 versuchte ich jetzt die letzten Tage die Kräuter anzeigen zu lassen. Entweder hab ich meine Tabelle nicht richtig aufgebaut, versuche es am falschen Ort oder keine Ahnung. Den Aufbau der Tabelle hatte ich vor einigen Wochen bereits kurz dargestellt.


Lua Code:
  1. local Options = CreateFrame("Frame", ADDON.."Options", InterfaceOptionsFramePanelContainer)
  2. Options.name = GetAddOnMetadata(ADDON, "Title") or ADDON
  3. InterfaceOptions_AddCategory(Options)
  4. Addon.OptionsPanel = Options
  5.  
  6. Options:SetScript("OnShow", function()
  7.     local Title = Options:CreateFontString("$parentTitle", "ARTWORK", "GameFontNormalLarge")
  8.     Title:SetPoint("TOPLEFT", 16, -16)
  9.     Title:SetText(Options.name)
  10.    
  11.     local Notes = Options:CreateFontString("$parentSubText", "ARTWORK", "GameFontHighlightSmall")
  12.     Notes:SetPoint("TOPLEFT", Title, "BOTTOMLEFT", 0, -8)
  13.     Notes:SetPoint("RIGHT", -32, 0)
  14.     Notes:SetHeight(8)
  15.     Notes:SetJustifyH("LEFT")
  16.     Notes:SetJustifyV("TOP")
  17.     Notes:SetText("Version: "..GetAddOnMetadata(ADDON, "Version"))
  18.        
  19.     local OptionPanel = CreateFrame("Frame", nil, Options)
  20.     OptionPanel:SetPoint("TOPLEFT", Notes, "BOTTOMLEFT", 0, -24)
  21.     OptionPanel:SetPoint("BOTTOMRIGHT", Options, -16, 16)
  22.     OptionPanel:SetBackdrop({
  23.         bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
  24.         edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
  25.         tile = true, tileSize = 16, edgeSize = 16,
  26.         insets= { left = 3, right = 3, top = 5, bottom = 3 }
  27.     })
  28.     OptionPanel:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
  29.     OptionPanel:SetBackdropBorderColor(0.4, 0.4, 0.4)
  30.    
  31.     local myCheckButton = CreateFrame("CheckButton", "myCheckButton_GlobalName", OptionPanel, "ChatConfigCheckButtonTemplate")
  32.     myCheckButton:SetPoint("TOPLEFT", 16, -16)
  33.     myCheckButton_GlobalNameText:SetText("MillButton Extended")
  34.     myCheckButton.tooltip = "This is where you place MouseOver Text."
  35.     myCheckButton:SetScript("OnClick",
  36.     function()
  37.         PlaySound("igMainMenuOptionCheckBoxOn" or "igMainmenuOptionCheckBoxOff")
  38.         local isChecked = myCheckButton:GetChecked()
  39.         if isChecked == true then
  40.             MillButtonSettings.extended = true
  41.             print(MillButtonSettings.extended)
  42.         else
  43.             MillButtonSettings.extended = false
  44.             print(MillButtonSettings.extended)
  45.         end        
  46.     end)
  47.     myCheckButton:SetChecked(MillButtonSettings.extended)
  48.    
  49.     for i = 1, #MillButtonExpansions do
  50.         -- Make a child panel
  51.         local Options_Child = CreateFrame("Frame", ADDON.."Child", Options)
  52.         Options_Child.name = MillButtonExpansions[i]
  53.         Options_Child.id = i
  54.         -- Specify childness of this panel (this puts it under the little red [+], instead of giving it a normal AddOn category)
  55.         Options_Child.parent = Options.name
  56.         -- Add the child to the Interface Options
  57.         InterfaceOptions_AddCategory(Options_Child)
  58.        
  59.         local Title = Options_Child:CreateFontString("$parentTitle", "ARTWORK", "GameFontNormalLarge")
  60.         Title:SetPoint("TOPLEFT", 16, -16)
  61.         Title:SetText(Options_Child.name)
  62.        
  63.         local SubOptionPanel = CreateFrame("Frame", nil, Options_Child)
  64.         SubOptionPanel:SetPoint("TOPLEFT", Title, "BOTTOMLEFT", 0, -24)
  65.         SubOptionPanel:SetPoint("BOTTOMRIGHT", Options_Child, -16, 16)
  66.         SubOptionPanel:SetBackdrop({
  67.             bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
  68.             edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
  69.             tile = true, tileSize = 16, edgeSize = 16,
  70.             insets= { left = 3, right = 3, top = 5, bottom = 3 }
  71.         })
  72.         SubOptionPanel:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
  73.         SubOptionPanel:SetBackdropBorderColor(0.4, 0.4, 0.4)
  74.        
  75.         Options_Child:SetScript("OnShow",
  76.             function()
  77.             PlaySound("igMainMenuOptionCheckBoxOn" or "igMainmenuOptionCheckBoxOff")
  78.             --code für die kräuter
  79.         end)
  80.        
  81.     end
  82.    
  83.     Options:SetScript("OnShow", nil)
  84.        
  85. end)

Duugu 02-23-15 05:08 PM

Ja zeig her den code für die Kräuter! :D

Oder hast Du überhaupt gar keine Idee wie Du das machen sollst? Ich steh auf dem Schlauch. :)

gmarco 02-24-15 03:12 AM

Come mai tutti scrivono in tedesco ? :-)

Duugu 02-24-15 05:31 AM

Perché qui a quanto pare solo tedeschi discutono. :)

flow0284 02-24-15 12:20 PM

Quote:

Originally Posted by Duugu (Post 306772)
Ja zeig her den code für die Kräuter! :D

Oder hast Du überhaupt gar keine Idee wie Du das machen sollst? Ich steh auf dem Schlauch. :)

Ganz ehrlich meine die nicht geklappt hatten habe ich nach dem Fehlschlägen rückgängig gemacht gehabt.
Mittlerweile habe ich gar keine Idee mehr, zumal ich neuling bin. Ich erwarte keinen fertigen Code von jemand hier aber eine verständliche Hilfestellung wäre klasse.

Duugu 02-24-15 01:33 PM

Ah. Ok. :)

Also erstmal wäre die Frage wie Du die ganzen Kräuter anzeigen lassen willst. Am einfachsten wäre natürlich eine Checkbox für jedes Kraut zu machen. Allerdings sind das ja teilweise eine ganze Menge. Könnte also unübersichtlich werden.
Was gäbs noch? Eine Scrollist, ein Dropdown, oder Buttons für jedes Kraut. Auf jeden Fall solltest Du vorher erstmal überlegen wie das Anzeigekonzept aussehen soll.

Am einfachsten wäre wie gesagt, einfach für jedes Kraut in jedem Panel eine Checkbox zu erstellen.
Das würde ich ungefähr so wie unten machen.
Aber Vorsicht: das hab ich trocken runtergeschrieben und nicht ausprobiert. Muss also nicht direkt so ohne Fehler funktionieren. :) Nur um die Richtung aufzuzeigen.


Lua Code:
  1. ...
  2.     for i = 1, #MillButtonExpansions do
  3.         -- Make a child panel
  4.         local Options_Child = CreateFrame("Frame", ADDON.."Child", Options)
  5.         Options_Child.name = MillButtonExpansions[i]
  6.         Options_Child.id = i
  7.         -- Specify childness of this panel (this puts it under the little red [+], instead of giving it a normal AddOn category)
  8.         Options_Child.parent = Options.name
  9.         -- Add the child to the Interface Options
  10.         InterfaceOptions_AddCategory(Options_Child)
  11.        
  12.         local Title = Options_Child:CreateFontString("$parentTitle", "ARTWORK", "GameFontNormalLarge")
  13.         Title:SetPoint("TOPLEFT", 16, -16)
  14.         Title:SetText(Options_Child.name)
  15.        
  16.         local SubOptionPanel = CreateFrame("Frame", nil, Options_Child)
  17.         SubOptionPanel:SetPoint("TOPLEFT", Title, "BOTTOMLEFT", 0, -24)
  18.         SubOptionPanel:SetPoint("BOTTOMRIGHT", Options_Child, -16, 16)
  19.         SubOptionPanel:SetBackdrop({
  20.             bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
  21.             edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
  22.             tile = true, tileSize = 16, edgeSize = 16,
  23.             insets= { left = 3, right = 3, top = 5, bottom = 3 }
  24.         })
  25.         SubOptionPanel:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
  26.         SubOptionPanel:SetBackdropBorderColor(0.4, 0.4, 0.4)
  27.  
  28.        
  29.        
  30.         Options_Child:SetScript("OnShow",
  31.             function()
  32.             PlaySound("igMainMenuOptionCheckBoxOn" or "igMainmenuOptionCheckBoxOff")
  33.             local expansion = Options_Child.name
  34.             print(expansion.." clicked")
  35.  
  36.             --wenn noch keine checkboxen vorhanden dann erstmal erstellen
  37.             if not self.herbCheckboxes then
  38.                 self.herbCheckboxes = {}
  39.                 --alle kräuter der jeweiligen untertabelle durchgehen und jeweils eine checkbox erstellen
  40.                 for each itemID, optionValue in pairs(MillButton_Herblist[expansion]) do
  41.                     --name des krauts für das label der checkbox holen
  42.                     local itemName = GetItemInfo(itemID)
  43.                     --ankerpunkt für die erste checkbox
  44.                     local tAnchorPointY = -10
  45.                     --checkbox erstellen (siehe helper function unten) und für späteren zugriff referenz auf checkbox-objekt mit itemid vom kraut als index in herbCheckboxes speichern
  46.                     self.herbCheckboxes[itemID] = Addon:CreateOptionsCheckButton(self, itemName)
  47.                     --passend anordnen
  48.                     self.herbCheckboxes[itemID]:SetPoint("TOPLEFT", self.parent, "TOPLEFT", 10, tAnchorPointY)
  49.                     --ankerpunkt für die nächste checkbox
  50.                     tAnchorPointY = tAnchorPointY - self.itemID:GetHeight()
  51.                 end
  52.             end
  53.  
  54.            
  55.             --alle inhalte self.herbCheckboxes durchgehen und den aktuellen wert (checked/nicht checked bzw. true/false) für die checkbox entsprechend der db festlegen
  56.             for each itemID, checkboxObj in pairs(self.herbCheckboxes) do
  57.                 --wert der checkbox entsprechend der tabelle festlegen
  58.                 checkboxObj:SetChecked(MillButton_Herblist[expansion][itemID])
  59.                 --bei wertänderung in der db speichern
  60.                 checkboxObj:SetScript("OnClick", function()
  61.                     MillButton_Herblist[self:GetParent().name][self.itemID] = self:GetChecked()
  62.                 end)
  63.             end
  64.            
  65.         end)
  66.        
  67.     end
  68.    
  69.     Options:SetScript("OnShow", nil)
  70.        
  71. end)
  72.    
  73. SLASH_MILLBUTTON1 = "/millbutton"
  74. SLASH_MILLBUTTON2 = "/mbtn"
  75. SlashCmdList.MILLBUTTON = function() InterfaceOptionsFrame_OpenToCategory(Options) end
  76.  
  77. [[-- HELPERS--]]
  78. function Addon:CreateOptionsCheckButton(pParentFrame, pLabelText)
  79.     local tCheckBoxFrame = CreateFrame("CheckButton", nil, pParentFrame)
  80.     tCheckBoxFrame:SetWidth(25)
  81.     tCheckBoxFrame:SetHeight(25)
  82.     tCheckBoxFrame:SetNormalTexture("Interface\\Buttons\\UI-CheckBox-Up")
  83.     tCheckBoxFrame:SetPushedTexture("Interface\\Buttons\\UI-CheckBox-Down")
  84.     tCheckBoxFrame:SetHighlightTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
  85.     tCheckBoxFrame:SetCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check")
  86.     tCheckBoxFrame:SetDisabledCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check-Disabled")
  87.     tCheckBoxFrame:SetFrameStrata("HIGH")
  88.     tCheckBoxFrame:Show()
  89.  
  90.     local tFS = Smoothe:CreateFontString(nil, "OVERLAY")        
  91.     tCheckBoxFrame.FS = tFS
  92.     tFS:SetFont("Fonts\\ARIALN.TTF", 12)
  93.     tFS:SetFontObject(GameFontNormalSmall)
  94.     tFS:SetText(pLabelText)
  95.     tFS:SetTextColor(1, 1, 1, 1)
  96.     tFS:SetJustifyH("LEFT")
  97.     tFS:SetJustifyV("TOP")
  98.     tFS:SetPoint("LEFT", tCheckBoxFrame, "RIGHT", 0, 0)
  99.     tFS:Show()
  100.  
  101.     return tCheckBoxFrame
  102. end
  103. ...

flow0284 02-24-15 02:58 PM

Baoh vielen vielen Dank!

WoW mochte das "each" in den beiden Schleifen nicht aber was ich jetzt noch nicht verstehe ist, was WoW gegen das "self." hier meckert WoW jetzt noch.

/edit: Ja mit Checkboxen wollte ich das auch machen.

/edit2: ich glaub ich sollte mal wieder richtig ausschalfen...

ich muss aus
Lua Code:
  1. Options_Child:SetScript("OnShow",
  2.             function()

Lua Code:
  1. Options_Child:SetScript("OnShow",
  2.             function(self)
machen...

ich denke mal das "Smoothe"
Lua Code:
  1. local tFS = Smoothe:CreateFontString(nil, "OVERLAY")
bei den helpers ist falsch und müsste, wenn ich mich nicht irre Addon:... sein. Allerdings meckert mir WoW dann: "attempt to call method 'CreateFontString' (a nil value)"

flow0284 02-24-15 04:15 PM

Soo das hier hab ich aus deiner Vorlage gemacht, soweit gibt es keine Fehlermeldungen mehr beim anklicken, jedoch werden auch keine Checkboxen angezeigt :(

Lua Code:
  1. Options_Child:SetScript("OnShow",
  2.             function(self)
  3.             PlaySound("igMainMenuOptionCheckBoxOn" or "igMainmenuOptionCheckBoxOff")
  4.             --checkboxes begin
  5.             local expansion = Options_Child.name
  6.             print(expansion.." clicked")
  7.  
  8.             --wenn noch keine checkboxen vorhanden dann erstmal erstellen
  9.             if not self.herbCheckboxes then
  10.                 self.herbCheckboxes = {}
  11.                 --alle kräuter der jeweiligen untertabelle durchgehen und jeweils eine checkbox erstellen
  12.                 for itemID, optionValue in pairs(MillButton_Herblist[expansion]) do
  13.                     --name des krauts für das label der checkbox holen
  14.                     local itemName = GetItemInfo(itemID)
  15.                     --ankerpunkt für die erste checkbox
  16.                     local tAnchorPointY = -10
  17.                     --checkbox erstellen (siehe helper function unten) und für späteren zugriff referenz auf checkbox-objekt mit itemid vom kraut als index in herbCheckboxes speichern
  18.                     self.herbCheckboxes[itemID] = Addon:CreateOptionsCheckButton(self, itemName)
  19.                     --passend anordnen
  20.                     self.herbCheckboxes[itemID]:SetPoint("TOPLEFT", self.parent, "TOPLEFT", 10, tAnchorPointY)
  21.                     --ankerpunkt für die nächste checkbox
  22.                     tAnchorPointY = tAnchorPointY - self.herbCheckboxes[itemID]:GetHeight()
  23.                 end
  24.             end
  25.  
  26.            
  27.             --alle inhalte self.herbCheckboxes durchgehen und den aktuellen wert (checked/nicht checked bzw. true/false) für die checkbox entsprechend der db festlegen
  28.             for itemID, checkboxObj in pairs(self.herbCheckboxes) do
  29.                 --wert der checkbox entsprechend der tabelle festlegen
  30.                 checkboxObj:SetChecked(MillButton_Herblist[expansion][itemID])
  31.                 --bei wertänderung in der db speichern
  32.                 checkboxObj:SetScript("OnClick", function()
  33.                     MillButton_Herblist[self:GetParent().name][self.itemID] = self:GetChecked()
  34.                 end)
  35.             end
  36.  
  37.             --checkboxes end
  38.         end)
  39.        
  40.     end
  41.    
  42.     Options:SetScript("OnShow", nil)
  43.        
  44. end)
  45.    
  46. SLASH_MILLBUTTON1 = "/millbutton"
  47. SLASH_MILLBUTTON2 = "/mbtn"
  48. SlashCmdList.MILLBUTTON = function() InterfaceOptionsFrame_OpenToCategory(Options) end
  49.  
  50.  
  51. -- Checkbox HELPERS Beginn
  52. function Addon:CreateOptionsCheckButton(pParentFrame, pLabelText)
  53.     local tCheckBoxFrame = CreateFrame("CheckButton", nil, pParentFrame)
  54.     tCheckBoxFrame:SetWidth(25)
  55.     tCheckBoxFrame:SetHeight(25)
  56.     tCheckBoxFrame:SetNormalTexture("Interface\\Buttons\\UI-CheckBox-Up")
  57.     tCheckBoxFrame:SetPushedTexture("Interface\\Buttons\\UI-CheckBox-Down")
  58.     tCheckBoxFrame:SetHighlightTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
  59.     tCheckBoxFrame:SetCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check")
  60.     tCheckBoxFrame:SetDisabledCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check-Disabled")
  61.     tCheckBoxFrame:SetFrameStrata("HIGH")
  62.     tCheckBoxFrame:Show()
  63.  
  64.     local tFS = tCheckBoxFrame:CreateFontString(nil, "OVERLAY")
  65.     tCheckBoxFrame.fontstring = tFS
  66.     tFS:SetFont("Fonts\\ARIALN.TTF", 12)
  67.     tFS:SetFontObject(GameFontNormalSmall)
  68.     tFS:SetText(pLabelText)
  69.     tFS:SetTextColor(1, 1, 1, 1)
  70.     tFS:SetJustifyH("LEFT")
  71.     tFS:SetJustifyV("TOP")
  72.     tFS:SetPoint("LEFT", tCheckBoxFrame, "RIGHT", 0, 0)
  73.     tFS:Show()
  74.  
  75.     return tCheckBoxFrame
  76. end
  77. -- Checkbox HELPERS Ende

Ich hab mich da bestimmt irgendwo "verlaufen"...

/letztes edit für heute:
jetzt bekomm ich die Checkboxen zwar angezeigt aber die hängen alle auf einander..

das hier hab ich geändert, also aus self.parent wurde SubOptionPanel:
Lua Code:
  1. self.herbCheckboxes[itemID]:SetPoint("TOPLEFT", SubOptionPanel, "TOPLEFT", 10, tAnchorPointY)
  2.                     --ankerpunkt für die nächste checkbox
  3.                     tAnchorPointY = tAnchorPointY - self.herbCheckboxes[itemID]:GetHeight()

Duugu 02-24-15 05:50 PM

Ich habe leider kein aktives Account und kann nix ausprobieren. Daher kann ich nur vermuten.

Ich denke mal es liegt an
Lua Code:
  1. --passend anordnen
  2. self.herbCheckboxes[itemID]:SetPoint("TOPLEFT", self.parent, "TOPLEFT", 10, tAnchorPointY)

self.parent hast Du weiter oben den Namen zugewiesen. Das ist somit ein String.
SetPoint() erwartet aber als zweites Argument ein Objekt. Als eine Referenz auf das Parent-Frame. Nicht dessen Name. Das müsste also so lauten:
Lua Code:
  1. self.herbCheckboxes[itemID]:SetPoint("TOPLEFT", self, "TOPLEFT", 10, tAnchorPointY)
Vermutlich wird es trotzdem nicht funktionieren. Ich sehe nämlich gerade, dass
Lua Code:
  1. local tAnchorPointY = -10
natürlich außerhalb der for-Schleife sein muss. :) Sonst bleibt es ja bei -10. Also
Lua Code:
  1. --ankerpunkt für die erste checkbox
  2.                 local tAnchorPointY = -10
  3.                 for itemID, optionValue in pairs(MillButton_Herblist[expansion]) do
  4.                     --name des krauts für das label der checkbox holen
  5.                     local itemName = GetItemInfo(itemID)

flow0284 02-24-15 06:06 PM

Joar, dat wars :)

Sind aber zwei neue Problemchen da...

Zum einen Laufen die Checkboxen der Classickräuter über den Frame hinaus, hier sind senkrecht nur Platz für 19 Checkboxen und wenn ich eine Box anklicke gibts ne Fehlermeldung:

Quote:

attempt to call method 'GetChecked' (a nil value)
Nochmal vielen vielen Dank für deine Unterstützung!
Ich gehe jetzt aber ins Bett.

Duugu 02-25-15 07:51 AM

Quote:

Originally Posted by flow0284 (Post 306843)
Zum einen Laufen die Checkboxen der Classickräuter über den Frame hinaus, hier sind senkrecht nur Platz für 19 Checkboxen

Ja, habe ich mir ja schon gedacht. Du könntest einfach die Checkboxen in zwei Reihen anordnen. Das wäre wohl am einfachsten. Der vierte Parameter von SetPoint ist der x-Offset (http://wowprogramming.com/docs/widgets/Region/SetPoint).
Oder Du packst sie in ein Scrollframe.
Oder Du verwendest eine andere Lösung. Zum Beispiel eine Scrolllist oder halt ein Dropdown oder sowas.

Quote:

Originally Posted by flow0284 (Post 306843)
und wenn ich eine Box anklicke gibts ne Fehlermeldung

Wie wir ja schon weiter oben gelernt haben, muss der Script-Handler explizit den Parameter "self" haben. :)
Das muss also so lauten:
Lua Code:
  1. checkboxObj:SetScript("OnClick", function(self)

flow0284 02-25-15 12:08 PM

Quote:

Originally Posted by Duugu (Post 306873)
Ja, habe ich mir ja schon gedacht. Du könntest einfach die Checkboxen in zwei Reihen anordnen. Das wäre wohl am einfachsten. Der vierte Parameter von SetPoint ist der x-Offset (http://wowprogramming.com/docs/widgets/Region/SetPoint).

Wie wir ja schon weiter oben gelernt haben, muss der Script-Handler explizit den Parameter "self" haben. :)

Stimmt, war aber auch recht spät für mich... sry


Beim anklicken der Checkboxen kommt jetzt ein anderen Fehler:

Quote:

table index is nil
und es wird auf die 7. zeile verwiesen:
Lua Code:
  1. --alle inhalte self.herbCheckboxes durchgehen und den aktuellen wert (checked/nicht checked bzw. true/false) für die checkbox entsprechend der db festlegen
  2. for itemID, checkboxObj in pairs(self.herbCheckboxes) do
  3. --wert der checkbox entsprechend der tabelle festlegen
  4. checkboxObj:SetChecked(MillButton_Herblist[expansion][itemID])
  5. --bei wertänderung in der db speichern
  6. checkboxObj:SetScript("OnClick", function(self)
  7.     MillButton_Herblist[self:GetParent().name][self.itemID] = self:GetChecked()
  8.     end)
  9. end

Für den Aufbau als 2 Spalten muss ich doch die Anzahl der Checkboxen ermitteln und bei 19 festlegen das x-Offset verschoben und der y-Offset wieder bei "0" anfängt.

Duugu 02-25-15 12:20 PM

Gibt self:GetParent().name denn einen Namen und self.itemID eine Item-ID zurück?

Vermutlich muss es self:GetParent():GetParent().name heißen.


Quote:

Für den Aufbau als 2 Spalten muss ich doch die Anzahl der Checkboxen ermitteln und bei 19 festlegen das x-Offset verschoben und der y-Offset wieder bei "0" anfängt.
Genau. Wobei Dir die Anzahl ja egal sein kann. Es sie denn, Du gehst davon aus dass es in irgendeiner Erweiterung mehr als 28 Kräuter geben könnte. :)

flow0284 02-25-15 12:41 PM

Quote:

Originally Posted by Duugu (Post 306891)
Gibt self:GetParent().name denn einen Namen und self.itemID eine Item-ID zurück?

Vermutlich muss es self:GetParent():GetParent().name heißen.

Sorry aber ich steh jetzt echt total aufm schlauch.
self:GetParent():GetParent().name bringt allerdings ebenso diesen fehler.


Quote:

Originally Posted by Duugu (Post 306891)
Genau. Wobei Dir die Anzahl ja egal sein kann. Es sie denn, Du gehst davon aus dass es in irgendeiner Erweiterung mehr als 28 Kräuter geben könnte. :)

Wie die Anzahl kann mir da eigentlich egal sein?! :eek:
Wie soll ich denn sonst diesen Umbruch machen?


Sorry aber ich bin halt echt noch ein Frischling :(

Duugu 02-25-15 02:19 PM

Ah, nach genauerem Durchgehen fällt mir auf, dass es gar nicht an self:GetParent().name liegt, sondern an self.itemID. :)

Rausfinden kannst Du das, wenn Du im OnClick-Handler ein paar test-prints einfügst:
Lua Code:
  1. checkboxObj:SetScript("OnClick", function(self)
  2.     print(self:GetParent().name)
  3.     print(self.itemID)
  4.     MillButton_Herblist[self:GetParent().name][self.itemID] = self:GetChecked()
  5. end)
Dann wird nämlich beim ersten wie geplant der Name der Erweiterung ausgegeben und beim zweiten Nil.
Das liegt daran, dass "self" ja eine Referenz auf das Checkbox-Objekt ist, und wir nirgendwo das Attribut itemID dafür festlegen.
Das lässt sich so lösen (Zeile 9):
Lua Code:
  1. --alle kräuter der jeweiligen untertabelle durchgehen und jeweils eine checkbox erstellen
  2.                 --ankerpunkt für die erste checkbox
  3.                 local tAnchorPointY = -10
  4.                 for itemID, optionValue in pairs(MillButton_Herblist[expansion]) do
  5.                     --name des krauts für das label der checkbox holen
  6.                     local itemName = GetItemInfo(itemID)
  7.                     --checkbox erstellen (siehe helper function unten) und für späteren zugriff referenz auf checkbox-objekt mit itemid vom kraut als index in herbCheckboxes speichern
  8.                     self.herbCheckboxes[itemID] = Addon:CreateOptionsCheckButton(self, itemName)
  9.                     self.herbCheckboxes[itemID].itemID = itemID
  10.                     --passend anordnen
  11.                     self.herbCheckboxes[itemID]:SetPoint("TOPLEFT", self.parent, "TOPLEFT", 10, tAnchorPointY)
  12.                     --ankerpunkt für die nächste checkbox
  13.                     tAnchorPointY = tAnchorPointY - self.herbCheckboxes[itemID]:GetHeight()
  14.                 end
  15.  
  16.             --alle inhalte self.herbCheckboxes durchgehen und den aktuellen wert (checked/nicht checked bzw. true/false) für die checkbox entsprechend der db festlegen
  17.             for itemID, checkboxObj in pairs(self.herbCheckboxes) do
  18.                 --wert der checkbox entsprechend der tabelle festlegen
  19.                 checkboxObj:SetChecked(MillButton_Herblist[expansion][itemID])
  20.                 --bei wertänderung in der db speichern
  21.                 checkboxObj:SetScript("OnClick", function(self)
  22.                     MillButton_Herblist[self:GetParent().name][self.itemID] = self:GetChecked()
  23.                 end)
  24.             end

Quote:

Wie die Anzahl kann mir da eigentlich egal sein?!
Wie soll ich denn sonst diesen Umbruch machen?
Na, Du zählst einfach mit und rechnest alle 19 mal etwas auf den x-Offset drauf. :)

Lua Code:
  1. local tAnchorPointY = -10
  2.                local tAnchorPointX  = 0
  3.                local tAnchorPointCount  = 0
  4.                 for itemID, optionValue in pairs(MillButton_Herblist[expansion]) do
  5.                     --name des krauts für das label der checkbox holen
  6.                     local itemName = GetItemInfo(itemID)
  7.                     --checkbox erstellen (siehe helper function unten) und für späteren zugriff referenz auf checkbox-objekt mit itemid vom kraut als index in herbCheckboxes speichern
  8.                     self.herbCheckboxes[itemID] = Addon:CreateOptionsCheckButton(self, itemName)
  9.                     self.herbCheckboxes[itemID].itemID = itemID
  10.                     --passend anordnen
  11.                     self.herbCheckboxes[itemID]:SetPoint("TOPLEFT", self.parent, "TOPLEFT", tAnchorPointX, tAnchorPointY)
  12.                     --ankerpunkt für die nächste checkbox
  13.                     tAnchorPointY = tAnchorPointY - self.herbCheckboxes[itemID]:GetHeight()
  14.                     tAnchorPointCount = tAnchorPointCount + 1
  15.                     if tAnchorPointCount > 19 then
  16.                                         tAnchorPointX = tAnchorPointX + 50
  17.                                         tAnchorPointY = -10
  18.                                         tAnchorPointCount = 0
  19.                     end
  20.                 end

Das kann man natürlich anders deutlich eleganter lösen, aber ich dachte mir so ists vielleicht erstmal an ersichtlichsten. :)

[e]
Wenn wir noch weiter darüber diskutieren wäre es gut, wenn Du irgendwo Deinen aktuellen Code einmal komplett bereitstellst. Sonst wird der aktuelle Stand langsam schwer nachvollziehbar.
[e2]
Bei erneutem Lesen bin ich mir unsicher, ob das ganze überhaupt für Dich nachvollziehbar ist oder Du nur das was ich geschrieben habe als Black-Box nutzt. Also z. B. was self.GetParent().name macht und sowas. Wenn Dir also was unklar ist oder Du Fragen hast, dann frag. :) Es macht langfristig ja nur wenig Sinn wenn Du überhaupt nicht nachvollziehen kannst was einzelne Teile machen und sie nur einfach so verwendest.

flow0284 02-25-15 06:15 PM

1 Attachment(s)
Quote:

Originally Posted by Duugu (Post 306904)
Das kann man natürlich anders deutlich eleganter lösen, aber ich dachte mir so ists vielleicht erstmal an ersichtlichsten. :)

[e]
Wenn wir noch weiter darüber diskutieren wäre es gut, wenn Du irgendwo Deinen aktuellen Code einmal komplett bereitstellst. Sonst wird der aktuelle Stand langsam schwer nachvollziehbar.
[e2]
Bei erneutem Lesen bin ich mir unsicher, ob das ganze überhaupt für Dich nachvollziehbar ist oder Du nur das was ich geschrieben habe als Black-Box nutzt. Also z. B. was self.GetParent().name macht und sowas. Wenn Dir also was unklar ist oder Du Fragen hast, dann frag. :) Es macht langfristig ja nur wenig Sinn wenn Du überhaupt nicht nachvollziehen kannst was einzelne Teile machen und sie nur einfach so verwendest.

Ja auf die Test Prints hätte ich wirklich kommen müssen, die nutze ich so ja auch gelegentlich wenn ich sehen will was da passiert. :rolleyes:


Momentan (!) habe ich deinen Code mehr oder weniger "nur" übernommen. Es gibt definitiv Codefragmente die ich noch nicht so wirklich verstehe. Da mich aber immer mehr die Addonprogrmmierung begeistert werde ich mich in den kommenden Wochen zumindest am Wochenende immer wieder ran setzen und versuchen zu verstehen was dieser Code von Dir genau macht.

Eine Frage stelle ich mir jedoch noch. Was mache ich eigentlich wenn ich mal, wegen eines Contentpatches, die Interne Datenbank Updaten muss. Also wenn z.B. ein paar ItemIDs wegfallen oder hinzukommen sollten. Ich möchte da dann ungerne den Addonuser zwingen seine Einstellungen neu machen zumüssen. Man kann doch bestimmt dann die gespeicherte Datenbank die pro Charakter gespeichert wird mit der internen abgleichen (wenn z.B. eine Versionsnummer der Datenbank oder so) sich ändert.

Ich habe da vorhin schon mal versucht etwas zu finden aber ich bin da noch nicht fündig geworden.

Hier im Anhang ist auch das komplette Addon, so wie es dank Deiner Unterstützung jetzt ist. Und es funktioniert sogar auch, aber ich denke mal einige was ich da "fabriziert" habe lässt sich bestimmt eleganter lösen.

Duugu 02-27-15 11:40 AM

Ich würde an Deiner stelle das Erstellen und Konfigurieren der Checkboxen nicht mit MillbuttonDB (also der Tabelle mit den gespeicherten Werten des Users), sondern mit MillButton_Herblist (also der Default-Tabelle) durchführen.

Erst wenn Du den eigentlichen Wert (checked/unchecked) festlegst und wenn einer klickt und du den aktuellen Wert speicherst solltest Du das mit MillbuttonDB machen.

Also ungefähr so: (Zeile 7 und 22-26 ... wieder ungetestet)

Lua Code:
  1. --wenn noch keine checkboxen vorhanden dann erstmal erstellen
  2.             if not self.herbCheckboxes then
  3.                 self.herbCheckboxes = {}
  4.                 local tAnchorPointY = -64
  5.         local tAnchorPointX  = 30
  6.         local tAnchorPointCount  = 0
  7.                 for itemID, optionValue in pairs(MillButton_Herblist[expansion]) do
  8.                     local itemName = GetItemInfo(itemID)
  9.                     self.herbCheckboxes[itemID] = Addon:CreateOptionsCheckButton(self, itemName)
  10.                     self.herbCheckboxes[itemID].itemID = itemID
  11.                     self.herbCheckboxes[itemID]:SetPoint("TOPLEFT", self, "TOPLEFT", tAnchorPointX, tAnchorPointY)
  12.                     tAnchorPointY = tAnchorPointY - self.herbCheckboxes[itemID]:GetHeight()
  13.                     tAnchorPointCount = tAnchorPointCount + 1
  14.                     if tAnchorPointCount > 18 then
  15.                         tAnchorPointX = tAnchorPointX + 180
  16.                         tAnchorPointY = -64
  17.                         tAnchorPointCount = 0
  18.                     end
  19.                 end
  20.             end
  21.             for itemID, checkboxObj in pairs(self.herbCheckboxes) do
  22.             if MillButtonDB[expansion] and MillButtonDB[expansion][itemID] then
  23.                 checkboxObj:SetChecked(MillButtonDB[expansion][itemID])
  24.             else
  25.                 checkboxObj:SetChecked(MillButton_Herblist[expansion][itemID])
  26.             end
  27.             checkboxObj:SetScript("OnClick", function(self)
  28.                 --  print(self:GetParent().name)
  29.                 --  print(self.itemID)
  30.                     MillButtonDB[self:GetParent().name][self.itemID] = self:GetChecked()
  31.             end)
  32.             end
  33.         end)

So werden dann alle Änderungen die Du an MillButton_Herblist machst automatisch in MillButtonDB durchgereicht. Und wenn es neue Herbs gibt die noch nicht in MillbuttonDB sind, dann wird einfach der Standardwert aus MillButton_Herblist genutzt.
Wenn Du in MillButton_Herblist welche entfernst, dann bleiben die in MillButtonDB zwar bis in alle Ewigkeiten drin, aber da die Liste der Checkboxen ja über MillButton_Herblist erstellt wird kann Dir das egal sein.

flow0284 02-27-15 01:57 PM

Danke.

Aber so werden immer wieder die defaultsettings geladen. kann es daran liegen weil ich beim event addon_loaded die MillButtonDB bereits aus der Herblist erstellen lasse?

Und mir ist eben aufgefallen das nicht immer die Namen bei den Checkboxen stehen. manchmal muss ich das ui ein bis zwei mal neu laden.

Duugu 02-27-15 04:13 PM

Quote:

Originally Posted by flow0284 (Post 307043)
Danke.

Aber so werden immer wieder die defaultsettings geladen. kann es daran liegen weil ich beim event addon_loaded die MillButtonDB bereits aus der Herblist erstellen lasse?

Und mir ist eben aufgefallen das nicht immer die Namen bei den Checkboxen stehen. manchmal muss ich das ui ein bis zwei mal neu laden.

[edit]
Mir fällt gerade auf, dass das was ich zuerst mit variables_loaded geschrieben hatte Quatsch war. Hab ich daher wegeditiert.
Dann musst Du selbst rausfinden was schiefläuft. Wie gesagt, mit print() gucken was wann passiert.

Warum die Labels nicht angezeigt werden musst Du selbst herausfinden. :) Keine Ahnung. Einfach mal prints einfügen und gucken was wann passiert. Das wirst Du sicher rausbekommen.

flow0284 03-05-15 05:49 AM

Soo,

ich glaube zu wissen warum die Labels nicht mit dem itemName gefüllt werden. Hier scheint es an der API selbst zu liegen. Die API kann mir nur die Namen direkt anzeigen, die ich während der aktuellen Gamesession gesehen habe. Habe ich ein Item noch nicht gesehen wird eine Anfrage an der Server gestellt, hier dauert es scheinbar unterschiedlich lange bis eine Antwort ankommt. Daher kommt dann bei GetItemInfo(itemID) nil als Ergebnis.

Ich befürchte ich muss hier je Lokalisierung die Itemnamen meine kleinen Übersetzungstabellen aufnehmen. Oder gibt es einen anderen Weg vorzeitig an die Itemnamen zu kommen?


Was das Problem mit den immer wieder kehrenden Defaultsettings habe ich so gelöst (Zeile 4):
Lua Code:
  1. --alle inhalte self.herbCheckboxes durchgehen und den aktuellen wert (checked/nicht checked bzw. true/false) für die checkbox entsprechend der db festlegen
  2. for itemID, checkboxObj in pairs(self.herbCheckboxes) do
  3. --wert der checkbox entsprechend der tabelle festlegen
  4.     if MillButtonDB[expansion] and MillButtonDB[expansion][itemID]==false then
  5.         checkboxObj:SetChecked(MillButtonDB[expansion][itemID])
  6.     else
  7.         checkboxObj:SetChecked(MillButton_Herblist[expansion][itemID])
  8.     end
  9.     --bei wertänderung in der db speichern
  10.     checkboxObj:SetScript("OnClick", function(self)
  11.         MillButtonDB[self:GetParent().name][self.itemID] = self:GetChecked()
  12.     end)

Aus MillButtonDB[expansion][itemID] habe ich MillButtonDB[expansion][itemID]==false gemacht und schon gehts.

Dorwido 03-05-15 07:21 AM

Ich würde sowas in der art machen:
http://us.battle.net/wow/en/forum/topic/2842565045

Und die namen dann global als savedvariable speichern so muss das addon die nur einmal requesten und kann sie danach aus den saved variablen laden und du sparst dir die arbeit für jede sprache das selbst zu machen oder andere machen zu lassen.

Dorwido 03-05-15 07:51 AM

Bei sowas wie Standardeinstellung finde ich übrigens Metatabellen recht handlich:

Code:

local defaultconf = {["GlobalConf"]=true,["TimeOnMission"]=true,["CounterTraits"]=true,["AutoPlace"]=true,["ShowTimeLeft"]=true,["FollowerRequired"]=true,["QuickAssign"]=true,["GoldExpShow"]=true,
                                        ["HideAlert"]=false,["ShowCounterFollower"]=true,["ShowItemlevelFollower"]=true};

local metatable = {};

metatable.__index = function( inTable, inKey )
  value = defaultconf[inKey];
  inTable[ inKey ] = value;
  return value;
end

setmetatable(GarrisonMissonEnhancedGlobalConfig,metatable);

Das ist ne auszug aus eines meiner addons, GarrisonMissonEnhancedGlobalConfig ist dabei die savedvariable, wenn ich nun aufrufe GarrisonMissonEnhancedGlobalConfig["TimeOnMission"] und das existiert nicht in der saved variable dann wird die standardeinstellung übernommen, so kann man problemlos die standard config erweitern ohne das man in der savedvariable checken muss ob die neue option existiert oder nicht und wenn nicht hinzufügen.

flow0284 03-05-15 08:13 AM

Aber dann besteht doch vorerst noch immer das Problem. Die Labels der Checkboxen bleiben doch dann noch immer solange leer bis der itemName vom Server zurückgegeben wurde, oder? :confused:

flow0284 03-05-15 08:22 AM

Quote:

Originally Posted by Dorwido (Post 307287)
Bei sowas wie Standardeinstellung finde ich übrigens Metatabellen recht handlich:

Code:

local defaultconf = {["GlobalConf"]=true,["TimeOnMission"]=true,["CounterTraits"]=true,["AutoPlace"]=true,["ShowTimeLeft"]=true,["FollowerRequired"]=true,["QuickAssign"]=true,["GoldExpShow"]=true,
                                        ["HideAlert"]=false,["ShowCounterFollower"]=true,["ShowItemlevelFollower"]=true};

local metatable = {};

metatable.__index = function( inTable, inKey )
  value = defaultconf[inKey];
  inTable[ inKey ] = value;
  return value;
end

setmetatable(GarrisonMissonEnhancedGlobalConfig,metatable);

Das ist ne auszug aus eines meiner addons, GarrisonMissonEnhancedGlobalConfig ist dabei die savedvariable, wenn ich nun aufrufe GarrisonMissonEnhancedGlobalConfig["TimeOnMission"] und das existiert nicht in der saved variable dann wird die standardeinstellung übernommen, so kann man problemlos die standard config erweitern ohne das man in der savedvariable checken muss ob die neue option existiert oder nicht und wenn nicht hinzufügen.

Metatabellen hab ich irgendwo schon mal gelesen aber noch nie mit befasst.
Werden mal demnächst schauen wie Metatabellen funktionieren.

Dorwido 03-05-15 08:23 AM

Kannst ja direkt nach dem laden des addons, anfangen die liste zu erstellen denke mal das sollte nicht allzulange dauern

flow0284 03-05-15 03:15 PM

Da muss ich ma schauen, wie ich das machen kann.

Duugu 03-05-15 04:13 PM

Wenn Du sichergehen willst, das die Namen definitiv angezeigt werden, dann musst Du die Namen lokalisiert in einer Tabelle ins Addon einfügen.

Diese Namen ändern sich ja eigentlich nie. Über wowhead mit XML kannst Du mit etwas Skripten alle Namen für alle Sprachen automatisch abrufen wenn Du das nicht per Hand erledigen willst (mehr dazu hier: http://www.wowhead.com/tooltips. Müsste btw eigentlich auch über Web-API von WoW gehen.

flow0284 03-05-15 05:37 PM

"Sichergehn" klingt doch schonmal gut :)

Aaaber XML...Skripten...:eek:

humfras 03-06-15 02:51 AM

Für die Lokalisierung bietet sich ein Grundgerüst mit ItemIDs/SpellIDs an, dass du dann lokalisiert in der SVar abspeicherst.

Für deine Optionen machst du es dir am einfachsten, wenn du das ganze über Ace3 (AceConfig etc.) aufbaust.
Dann sparst du dir die Gestaltung und kannst dich auf die Daten konzentrieren.

Duugu 03-06-15 05:44 AM

Quote:

Originally Posted by flow0284 (Post 307312)
"Sichergehn" klingt doch schonmal gut :)

Aaaber XML...Skripten...:eek:

Ich meinte, wowhead stellt alle Datenbankinfos auch als XML bereit. Beispiel:
http://en.wowhead.com/item=109125&xml
http://de.wowhead.com/item=109125&xml
http://fr.wowhead.com/item=109125&xml
http://ru.wowhead.com/item=109125&xml
usw

Du musst Dir also nur ein kleines Skript mit irgendeiner Lösung Deiner Wahl bauen, dass alle Item-IDs und Domains durchgeht und Dir den Namen aus dem XML holt. Das kannst Du in fast jeder Sprache/Umgebung machen die Dir genehm ist. Einfach mal nach "get XML script" oder so suchen. Da gibt's 1000 Möglichkeiten. Zum Beispiel per javascript:
Code:

<html>
<body>
<span id="demo">test</span>
<script>
var xmlhttp=false;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
 else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
 xmlhttp.open("GET", "http://de.wowhead.com/item=109125&xml",true);
 xmlhttp.onreadystatechange=function() {
  if (xmlhttp.readyState==4) {
  document.getElementById("demo").innerHTML = xmlhttp.responseXML.documentElement.getElementsByTagName("name").item(0).firstChild.nodeValue ;
  }
 }
 xmlhttp.send(null);
</script>
</body>
</html>

Mehr dazu hier: http://www.w3schools.com/ajax/ajax_xmlfile.asp
Wenn Du auch nur halbwegs mit Javascript klarkommst solltest Du damit mit den ItemIDs eine Liste aller Namen bauen können. Du musst nur die ItemIDs und Domains in zwei arrays packen und durchgehen.

Dorwido 03-06-15 06:00 AM

Quote:

Originally Posted by Duugu (Post 307311)
Müsste btw eigentlich auch über Web-API von WoW gehen.

total vergessen das es ja die api gibt, darüber geht das auch.

Quote:

Originally Posted by humfras (Post 307317)
Für deine Optionen machst du es dir am einfachsten, wenn du das ganze über Ace3 (AceConfig etc.) aufbaust.
Dann sparst du dir die Gestaltung und kannst dich auf die Daten konzentrieren.

frage mich wie das heut zu tage ist wollte vor zig jahren mal ace3 nutzen und die doku war einfach bescheiden, stand quasi überall nur man soll in andere addons schauen wie das genutzt wird, da war es defintiv schneller was eigenes zu schreiben als mit ace3 klar zu kommen.

Duugu 03-06-15 06:44 AM

Hab Dir das Javascript-Beispiel unten mal etwas erweitert:

Code:

<html>
<body>
<span id="demo">test</span>
<script>
var xmlhttp=false;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
 else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
 
 
  var domains = ["fr", "de", "pt"];
  var items = [109125, 109126, 109127];
  var domCount = 0;
  var itemCount = 0;

 xmlhttp.open("GET", "http://" + domains[domCount] +".wowhead.com/item=" + items[itemCount] + "&xml",true);
xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4) {
                document.getElementById("demo").innerHTML =  document.getElementById("demo").innerHTML + "<br/>"  + items[itemCount] + " " + domains[domCount] + " " + xmlhttp.responseXML.documentElement.getElementsByTagName("name").item(0).firstChild.nodeValue  ;
                itemCount = itemCount + 1;
                if(itemCount >= items.length){
                        domCount++;
                        itemCount = 0;
                }
                if(domCount < domains.length)
                        {
                        xmlhttp.open("GET", "http://" + domains[domCount] +".wowhead.com/item=" + items[itemCount] + "&xml",true);
                        xmlhttp.send(null);
                        }
}
}
 xmlhttp.send(null);
 
</script>
</body>
</html>

[e]
Mit RU kommt mein Beispiel irgendwie nicht klar. Schätzungsweise ein Unicode-Problem. Musst Du rausfrickeln. ;)

Duugu 03-06-15 06:47 AM

Quote:

Originally Posted by Dorwido (Post 307321)
frage mich wie das heut zu tage ist wollte vor zig jahren mal ace3 nutzen und die doku war einfach bescheiden, stand quasi überall nur man soll in andere addons schauen wie das genutzt wird, da war es defintiv schneller was eigenes zu schreiben als mit ace3 klar zu kommen.

Sie ist immer noch bescheiden. ;)

So geht's mir auch immer. Eigentlich kurz gedacht, weil man beim nächsten Projekt ja Zeit spart wenn man sich einmal in Ace einarbeitet. Aber ich bin nun mal ein Faultier und denke JEDES mal "ach, das dauert länger als selbst eben was zu schreiben". :D

flow0284 03-06-15 09:33 AM

Quote:

Originally Posted by Duugu (Post 307323)
Hab Dir das Javascript-Beispiel unten mal etwas erweitert:
.
.
.
[e]
Mit RU kommt mein Beispiel irgendwie nicht klar. Schätzungsweise ein Unicode-Problem. Musst Du rausfrickeln. ;)

Danke dafür :)

Ich habe mir auch schon die Daten zusammengebaut.

Bsp:
Lua Code:
  1. L["109124"] = "Frostwurz"
  2. L["109125"] = "Feuerwurz"
  3. L["109126"] = "Gorgrondfliegenfalle"
  4. L["109127"] = "Sternenblume"
  5. L["109128"] = "Nagrandpfeilkelch"
  6. L["109129"] = "Taladororchidee"

Ich würde gerne die jeweilige itemID zum übersetzen nehmen. Und jetzt kommts (mal wieder), momentan stehe ich vor dem Problem das es noch nicht hinbekomme. Zu letzte habe ich es so versucht:
Lua Code:
  1. --alle kräuter der jeweiligen untertabelle durchgehen und jeweils eine checkbox erstellen
  2. for itemID, optionValue in pairs(MillButton_Herblist[expansion]) do
  3.     --name des krauts für das label der checkbox holen
  4.     itemName = L[itemID]
  5.     --checkbox erstellen (siehe helper function unten) und für späteren zugriff referenz auf checkbox-objekt mit itemid vom kraut als index in herbCheckboxes speichern
  6.     self.herbCheckboxes[itemID] = Addon:CreateOptionsCheckButton(self, itemName)
  7.     self.herbCheckboxes[itemID].itemID = itemID
  8.     --passend anordnen
  9.     self.herbCheckboxes[itemID]:SetPoint("TOPLEFT", self, "TOPLEFT", tAnchorPointX, tAnchorPointY)

Ich "google" dann man noch etwas weiter. Vllt. habe ich ja auch nur einen Denkfehler.

Dorwido 03-06-15 09:36 AM

da fehlt was
Addon:CreateOptionsCheckButton tut

Duugu 03-06-15 09:42 AM

Quote:

Originally Posted by flow0284 (Post 307330)
Ich "google" dann man noch etwas weiter. Vllt. habe ich ja auch nur einen Denkfehler.

Man müsste den gesamten Code inkl. aller Tabellen kennen um das beurteilen zu können. ;)

So geraten würde ich sagen Du musst die Anführungszeichen um die ItemIDs wegnehmen:

L[109124] = "Frostwurz"

flow0284 03-06-15 09:50 AM

1 Attachment(s)
Ich hänge ma das komplette Projekt hier an.

Die Idee mit dem weglassen der Anführungszeichen habe ich eben auch schon gehabt. Leider hat das nichts gebracht.

Dorwido 03-06-15 10:40 AM

Quote:

Originally Posted by flow0284 (Post 307333)
Ich hänge ma das komplette Projekt hier an.

Die Idee mit dem weglassen der Anführungszeichen habe ich eben auch schon gehabt. Leider hat das nichts gebracht.

Also in der angehängten version fehlt das definieren von L in der options.lua ansonsten so geht es:

local itemName = L[tostring(itemID)]

du definierst die übersetzung halt als string und fragt mit ne integer ab.

humfras 03-06-15 05:40 PM

Quote:

Originally Posted by Duugu (Post 307324)
Sie ist immer noch bescheiden. ;)

So geht's mir auch immer. Eigentlich kurz gedacht, weil man beim nächsten Projekt ja Zeit spart wenn man sich einmal in Ace einarbeitet. Aber ich bin nun mal ein Faultier und denke JEDES mal "ach, das dauert länger als selbst eben was zu schreiben". :D

Woot?

Ich komm gleich mit dem Lineal und brat dir eins über! :mad: :cool:

Duugu 03-06-15 06:58 PM

Quote:

Originally Posted by humfras (Post 307345)
Woot?

Ich komm gleich mit dem Lineal und brat dir eins über! :mad: :cool:

Nicht das Lineal! NICHT DAS LINEAL!!! Lieber den Gürtel.

:D

flow0284 03-06-15 07:08 PM

:eek:

Ich danke Euch für Eure bisherige Hilfe. Ein paar Sachen sind mir zwar noch unklar, aber da muss und werde ich noch ein wenig lesen.

Eine letzte Sache habe ich noch, kann es sein das unter (un)gewissen Umständen nicht richtig gelootet werden kann? Manchmal, wenn ich den Button für das Addon mehr oder weniger spamme dann kann es vorkommen, dass das Lootfenster sich nicht öffnet aber die Kräuter gemahlen wurden. Bis jetzt ist mir das nur mit dem automatischen Plündern passiert.

Duugu 03-07-15 07:45 AM

Da bin ich überfragt. Um ehrliche zu sein ich weiß nicht mal genau was Dein Addon eigentlich macht. ;)

flow0284 03-08-15 07:24 AM

Quote:

Originally Posted by Duugu (Post 307362)
Da bin ich überfragt. Um ehrliche zu sein ich weiß nicht mal genau was Dein Addon eigentlich macht. ;)

:D

Das Addon soll beim mahlen von Kräutern helfen. Man kann, dank Eurer Hilfe, auswählen welche Kräuter man mahlen lassen will ohne jedes mal ein ggf. vorhandenes "mahlen Makro" ändern zu müssen. Mehr macht das Addon nicht.

Dorwido 03-10-15 05:15 AM

Hab es mal benutzt und konnte das problem mit dem spam clicken nicht nachvollziehen und war erstmal am überlegen wie man es benutzt, hätte eigentlich erwartet man gibt ne command ein kriegt dann ne bar mit allen herbs die man in der tasche hat und kann dann klicken welche man mahlen will.


All times are GMT -6. The time now is 06:35 PM.

vBulletin © 2020, Jelsoft Enterprises Ltd
© 2004 - 2020 MMOUI