Thread Tools Display Modes
09/12/16, 05:51 PM   #1
tomtomhotep
 
tomtomhotep's Avatar
AddOn Author - Click to view addons
Join Date: Sep 2015
Posts: 21
Question ZO_SortFilterList -- What am i doing wrong??? :(

I'm trying to make a scroll list with columns.
I started by downloading "ScrollListExample" addon, which didn't work.
I fixed it by comparing it's code to MailR. Then it worked.

Then I copied the code into my add-on and I'm getting this error:




Here's my code:


Code:
UI_OrdersList = ZO_SortFilterList:Subclass()

UI_OrdersList.defaults = {}

UI_OrdersList.SORT_KEYS = {
  ["name"] = {},
  ["race"] = {tiebreaker="name"},
  ["class"] = {tiebreaker="name"},
  ["zone"] = {tiebreaker="name"}
}

function UI_OrdersList:New()
  local units = ZO_SortFilterList.New(self, HotepCGS_UI_main)
  
  units.masterList = {}
  
  ZO_ScrollList_AddDataType(units.list, 1, "HotepCGS_UI_main_OrdersList_Row", 30, function(control, data) self:SetupOrderRow(control, data) end)
  
  ZO_ScrollList_EnableHighlight(units.list, "ZO_ThinListHighlight")
  
  units.sortFunction = function(listEntry1, listEntry2)
      return ZO_TableOrderingFunction(listEntry1.data, listEntry2.data, units.currentSortKey, UI_OrdersList.SORT_KEYS, units.currentSortOrder)
    end
  
  units:RefreshData()
  
  return units
end


function UI_OrdersList:SetupOrderRow(rowControl, data)
  
  rowControl.data = data
  rowControl.name = GetControl(rowControl, "Name")
  rowControl.race = GetControl(rowControl, "Race")
  rowControl.class = GetControl(rowControl, "Class")
  rowControl.zone = GetControl(rowControl, "Zone")
  
  rowControl.name:SetText(data.name)
  rowControl.race:SetText(data.race)
  rowControl.class:SetText(data.class)
  rowControl.zone:SetText(data.zone)
  
  local DEFAULT_TEXT = ZO_ColorDef:New(0.4627, 0.737, 0.7647, 1)
  
  rowControl.name.normalColor = DEFAULT_TEXT
  rowControl.race.normalColor = DEFAULT_TEXT
  rowControl.class.normalColor = DEFAULT_TEXT
  rowControl.zone.normalColor = DEFAULT_TEXT
  
  
  ZO_SortFilterList.SetupRow(self, rowControl, data)
end


function UI_OrdersList:BuildMasterList()
  self.masterList = HotepCGS.GetOrdersList()
end


function UI_OrdersList:FilterScrollList()
    local scrollData = ZO_ScrollList_GetDataList(self.list)
    ZO_ClearNumericallyIndexedTable(scrollData)

    for i = 1, #self.masterList do
        local data = self.masterList[i]
      table.insert(scrollData, ZO_ScrollList_CreateDataEntry(1, data))
    end    
end


function UI_OrdersList:SortScrollList()
    local scrollData = ZO_ScrollList_GetDataList(self.list)
    table.sort(scrollData, self.sortFunction)
end



function UI_OrdersList:Refresh()
  self:RefreshData()
end



function HotepCGS.test3()
  SCENE_MANAGER:ToggleTopLevel(HotepCGS_UI_main)
end


function HotepCGS.MainMenuSwitch(orderstatus)
  local headings = {
    [ORDER_STATUS_WAITING] = "Viewing all Waiting orders",
    [ORDER_STATUS_CLAIMED] = "Viewing all Claimed orders",
    [ORDER_STATUS_DELIVERED] = "Viewing all Delivered orders",
  }
  
  HotepCGS_UI_main_OrdersHeading:SetText(headings[orderstatus])
  HotepCGS.UI_OrdersList:Refresh()
end


function HotepCGS.GetOrdersList(orderstatus)
  
  local dataItems = {}
  
  for emoteIndex=1, GetNumEmotes() do
    local emoteSlashName, emoteCategory, emoteId = GetEmoteInfo(emoteIndex)
    
    -- Organize your data for each item inside of a table
    local data =   {
      name = string.sub(emoteSlashName,2),
      race = tostring(emoteId),
      class = tostring(emoteCategory),
      zone = tostring(emoteIndex),
    }
    
    -- and use table.insert to put them into the dataItems table
    table.insert(dataItems, data)
  end
  
  return dataItems
end


function HotepCGS.OnOrderSelect(control, button, upInside)
    
    d(control.data)
end


function HotepCGS.InitOrdersList()
  
  SCENE_MANAGER:RegisterTopLevel(HotepCGS_UI_main, false)
  
  HotepCGS.UI_OrdersList = UI_OrdersList:New()
  
  HotepCGS.MainMenuSwitch(ORDER_STATUS_WAITING)
end




function HotepCGS:Initialize()
  
  EVENT_MANAGER:RegisterForEvent(self.name, EVENT_PLAYER_ACTIVATED, function()
      EVENT_MANAGER:UnregisterForEvent(self.name, EVENT_PLAYER_ACTIVATED)
      msgWithName("Loaded.")
      HotepCGS.InitOrdersList()
    end
  )
  
  -- ... other stuff ...
  
end


function HotepCGS.OnAddOnLoaded(event, addonName)
  if (addonName == HotepCGS.name) then
    EVENT_MANAGER:UnregisterForEvent(HotepCGS.name, EVENT_ADD_ON_LOADED)
    math.randomseed(GetTimeStamp())
    HotepCGS:Initialize()
  end
end


EVENT_MANAGER:RegisterForEvent(HotepCGS.name, EVENT_ADD_ON_LOADED, HotepCGS.OnAddOnLoaded)

Code:
<GuiXml>
  <Controls>
    <TopLevelControl name="HotepCGS_UI_main" mouseEnabled="true" movable="true" clampedToScreen="true" hidden="true">
      <Dimensions x="750" y="800" />
      <Anchor point="CENTER" />
      <Controls>
        
        <Backdrop name="$(parent)_BG" inherits="ZO_DefaultBackdrop" />
        
        <Label name="$(parent)_WindowTitle" font="ZoFontWindowTitle" text="|c3366ffHotep|r |cff6633Crafting Guild Service|r">
          <Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" />
        </Label>
        
        <Texture name="$(parent)_TopDivider" textureFile="/esoui/art/miscellaneous/horizontaldivider.dds" tier="HIGH">
          <Dimensions x="800" y="4"/>
          <Anchor point="TOP" relativeTo="$(parent)" offsetY="38" />
        </Texture>
        
        <Button name="$(parent)_Button_Close" inherits="ZO_ButtonBehaviorClickSound">
          <Dimensions x="40" y="40" />
          <Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="15" />
          <Textures normal="EsoUI/Art/Buttons/closebutton_up.dds"
            pressed="EsoUI/Art/Buttons/closebutton_down.dds"
            mouseOver="EsoUI/Art/Buttons/closebutton_mouseover.dds"
            disabled="EsoUI/Art/Buttons/closebutton_disabled.dds"/>
          <OnClicked>
            HotepCGS.test3()
          </OnClicked>
        </Button>
        
        <Button name="$(parent)_Button_Waiting" inherits="ZO_DefaultButton" text="Waiting Orders">
          <Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="30" offsetY="46" />
          <OnClicked>
            HotepCGS.MainMenuSwitch("waiting")
          </OnClicked>
        </Button>
        
        <Button name="$(parent)_Button_Claimed" inherits="ZO_DefaultButton" text="Claimed Orders">
          <Anchor point="TOP" relativeTo="$(parent)" relativePoint="TOP" offsetX="0" offsetY="46" />
          <OnClicked>
            HotepCGS.MainMenuSwitch("claimed")
          </OnClicked>
        </Button>
        
        <Button name="$(parent)_Button_Delivered" inherits="ZO_DefaultButton" text="Delivered Orders">
          <Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="-30" offsetY="46" />
          <OnClicked>
            HotepCGS.MainMenuSwitch("delivered")
          </OnClicked>
        </Button>
        
        <Label name="$(parent)_OrdersHeading" font="ZoFontHeader4" text="">
          <Anchor point="TOP" relativeTo="$(parent)_Button_Claimed" relativePoint="BOTTOM" offsetY="6" />
          <Dimensions x="700" />
        </Label>
        
        <Control name="$(parent)_OrdersListHeaders">
          <Anchor point="TOPLEFT" relativeTo="$(parent)_OrdersHeading" relativePoint="BOTTOMLEFT" offsetX="0" offsetY="16"/>
          <Dimensions y="32" />
          <Controls>
            <Control name="$(parent)Name" inherits="ZO_SortHeader">
              <OnInitialized>
                ZO_SortHeader_Initialize(self, "Name", "name", ZO_SORT_ORDER_DOWN, TEXT_ALIGN_LEFT, "ZoFontGameLargeBold")
              </OnInitialized>
              <Anchor point="TOPLEFT" />
              <Dimensions x="128" y="32" />
            </Control>
            <Control name="$(parent)Race" inherits="ZO_SortHeader">
              <OnInitialized>
                ZO_SortHeader_Initialize(self, "Race", "status", ZO_SORT_ORDER_DOWN, TEXT_ALIGN_LEFT, "ZoFontGameLargeBold")
              </OnInitialized>
              <Anchor point="TOPLEFT" relativeTo="$(parent)Name" relativePoint="TOPRIGHT"/>
              <Dimensions x="128" y="32" />
            </Control>
            <Control name="$(parent)Class" inherits="ZO_SortHeader">
              <OnInitialized>
                ZO_SortHeader_Initialize(self, "Class", "rankName", ZO_SORT_ORDER_DOWN, TEXT_ALIGN_LEFT, "ZoFontGameLargeBold")
              </OnInitialized>
              <Anchor point="TOPLEFT" relativeTo="$(parent)Race" relativePoint="TOPRIGHT" />
              <Dimensions x="128" y="32" />
            </Control>
            <Control name="$(parent)Zone" inherits="ZO_SortHeader">
              <OnInitialized>
                ZO_SortHeader_Initialize(self, "Zone", "recipient", ZO_SORT_ORDER_UP, TEXT_ALIGN_LEFT, "ZoFontGameLargeBold")
              </OnInitialized>
              <Anchor point="TOPLEFT" relativeTo="$(parent)Class" relativePoint="TOPRIGHT" />
              <Dimensions x="128" y="32" />
            </Control>
          </Controls>
        </Control>
        
        <Control name="$(parent)_OrdersList" inherits="ZO_ScrollList">
          <Anchor point="TOPLEFT" relativeTo="$(parent)_OrdersListHeaders" relativePoint="BOTTOMLEFT" />
          <Dimensions x="700" y="650" />
        </Control>
        
      </Controls>
    </TopLevelControl>
    
    <Button name="HotepCGS_UI_main_OrdersList_Row" virtual="true">
      <Dimensions y="30" />
      <Anchor point="RIGHT" relativeTo="$(parent)" />
      <OnMouseEnter>
          HotepCGS.UI_OrdersList:Row_OnMouseEnter(self)
      </OnMouseEnter>
      <OnMouseExit>
          HotepCGS.UI_OrdersList:Row_OnMouseExit(self)
      </OnMouseExit>
      <OnMouseUp>
          HotepCGS.OnOrderSelect(self, button, upInside)
      </OnMouseUp>
      <Controls>
        <Label name="$(parent)Name" font="ZoFontWinH4" wrapMode="ELLIPSIS">
          <Anchor point="TOPLEFT" relativeTo="$(parent)" />
          <Dimensions x="128" y="32" />
        </Label>
        <Label name="$(parent)Race" font="ZoFontWinH4" wrapMode="ELLIPSIS">
          <Anchor point="TOPLEFT" relativeTo="$(parent)Name" relativePoint="TOPRIGHT" />
          <Dimensions x="128" y="32" />
        </Label>
        <Label name="$(parent)Class" font="ZoFontWinH4" wrapMode="ELLIPSIS">
          <Anchor point="TOPLEFT" relativeTo="$(parent)Race"  relativePoint="TOPRIGHT" />
          <Dimensions x="128" y="32" />
        </Label>
        <Label name="$(parent)Zone" font="ZoFontWinH4" wrapMode="ELLIPSIS">
          <Anchor point="TOPLEFT" relativeTo="$(parent)Class" relativePoint="TOPRIGHT" />
          <Dimensions x="128" y="32" />
        </Label>
      </Controls>
    </Button>
    
  </Controls>
</GuiXml>

Please Help. I've been pulling my hair out for a week.
  Reply With Quote
09/12/16, 06:10 PM   #2
Ayantir
 
Ayantir's Avatar
AddOn Author - Click to view addons
Join Date: Jul 2014
Posts: 1,019
Lua Code:
  1. :New()

should be
Lua Code:
  1. :New(control)
And replace units by control in the :New() function/


no
Lua Code:
  1. units:RefreshData()
in :New().

drop
Lua Code:
  1. function UI_OrdersList:Refresh()
  2.   self:RefreshData()
  3. end


Lua Code:
  1. UI_OrdersList:New()
should send the Toplevelcontrol as param, bit better.

Lua Code:
  1. UI_OrdersList:New(HotepCGS_UI_main)


You have a nice easy example of all the stuff in Dyer addon.

I also written long time ago a little tuto, bit hidden :
http://www.esoui.com/forums/showpost...3&postcount=12


Consider the Lua highlight in forums too (last icon), it helps a lot, thank you
  Reply With Quote
09/12/16, 08:43 PM   #3
tomtomhotep
 
tomtomhotep's Avatar
AddOn Author - Click to view addons
Join Date: Sep 2015
Posts: 21
OK, Ayantir, I did everything you said:


Lua Code:
  1. UI_OrdersList = ZO_SortFilterList:Subclass()
  2.  
  3. UI_OrdersList.defaults = {}
  4.  
  5. UI_OrdersList.SORT_KEYS = {
  6.   ["name"] = {},
  7.   ["race"] = {tiebreaker="name"},
  8.   ["class"] = {tiebreaker="name"},
  9.   ["zone"] = {tiebreaker="name"}
  10. }
  11.  
  12. function UI_OrdersList:New(control)
  13.   control = ZO_SortFilterList.New(self, HotepCGS_UI_main)
  14.  
  15.   control.masterList = {}
  16.  
  17.   ZO_ScrollList_AddDataType(control.list, 1, "HotepCGS_UI_main_OrdersList_Row", 30, function(control, data) self:SetupOrderRow(control, data) end)
  18.  
  19.   ZO_ScrollList_EnableHighlight(control.list, "ZO_ThinListHighlight")
  20.  
  21.   control.sortFunction = function(listEntry1, listEntry2)
  22.       return ZO_TableOrderingFunction(listEntry1.data, listEntry2.data, control.currentSortKey, UI_OrdersList.SORT_KEYS, control.currentSortOrder)
  23.     end
  24.  
  25.   return control
  26. end
  27.  
  28.  
  29. function UI_OrdersList:SetupOrderRow(rowControl, data)
  30.  
  31.   rowControl.data = data
  32.   rowControl.name = GetControl(rowControl, "Name")
  33.   rowControl.race = GetControl(rowControl, "Race")
  34.   rowControl.class = GetControl(rowControl, "Class")
  35.   rowControl.zone = GetControl(rowControl, "Zone")
  36.  
  37.   rowControl.name:SetText(data.name)
  38.   rowControl.race:SetText(data.race)
  39.   rowControl.class:SetText(data.class)
  40.   rowControl.zone:SetText(data.zone)
  41.  
  42.   local DEFAULT_TEXT = ZO_ColorDef:New(0.4627, 0.737, 0.7647, 1)
  43.  
  44.   rowControl.name.normalColor = DEFAULT_TEXT
  45.   rowControl.race.normalColor = DEFAULT_TEXT
  46.   rowControl.class.normalColor = DEFAULT_TEXT
  47.   rowControl.zone.normalColor = DEFAULT_TEXT
  48.  
  49.  
  50.   ZO_SortFilterList.SetupRow(self, rowControl, data)
  51. end
  52.  
  53.  
  54. function UI_OrdersList:BuildMasterList()
  55.   self.masterList = HotepCGS.GetOrdersList()
  56. end
  57.  
  58.  
  59. function UI_OrdersList:FilterScrollList()
  60.   local scrollData = ZO_ScrollList_GetDataList(self.list)
  61.   ZO_ClearNumericallyIndexedTable(scrollData)
  62.  
  63.   for i = 1, #self.masterList do
  64.     local data = self.masterList[i]
  65.     table.insert(scrollData, ZO_ScrollList_CreateDataEntry(1, data))
  66.   end    
  67. end
  68.  
  69.  
  70. function UI_OrdersList:SortScrollList()
  71.   local scrollData = ZO_ScrollList_GetDataList(self.list)
  72.   table.sort(scrollData, self.sortFunction)
  73. end
  74.  
  75.  
  76.  
  77.  
  78. function HotepCGS.test3()
  79.   SCENE_MANAGER:ToggleTopLevel(HotepCGS_UI_main)
  80. end
  81.  
  82.  
  83. function HotepCGS.MainMenuSwitch(orderstatus)
  84.   local headings = {
  85.     [ORDER_STATUS_WAITING] = "Viewing all Waiting orders",
  86.     [ORDER_STATUS_CLAIMED] = "Viewing all Claimed orders",
  87.     [ORDER_STATUS_DELIVERED] = "Viewing all Delivered orders",
  88.   }
  89.  
  90.   HotepCGS_UI_main_OrdersHeading:SetText(headings[orderstatus])
  91.   HotepCGS.UI_OrdersList:Refresh()
  92. end
  93.  
  94.  
  95. function HotepCGS.GetOrdersList(orderstatus)
  96.  
  97.   local dataItems = {}
  98.  
  99.   for emoteIndex=1, GetNumEmotes() do
  100.     local emoteSlashName, emoteCategory, emoteId = GetEmoteInfo(emoteIndex)
  101.    
  102.     -- Organize your data for each item inside of a table
  103.     local data =   {
  104.       name = string.sub(emoteSlashName,2),
  105.       race = tostring(emoteId),
  106.       class = tostring(emoteCategory),
  107.       zone = tostring(emoteIndex),
  108.     }
  109.    
  110.     -- and use table.insert to put them into the dataItems table
  111.     table.insert(dataItems, data)
  112.   end
  113.  
  114.   return dataItems
  115. end
  116.  
  117.  
  118. function HotepCGS.OnOrderSelect(control, button, upInside)
  119.    
  120.     d(control.data)
  121. end
  122.  
  123.  
  124. function HotepCGS.InitOrdersList()
  125.  
  126.   SCENE_MANAGER:RegisterTopLevel(HotepCGS_UI_main, false)
  127.  
  128.   HotepCGS.UI_OrdersList = UI_OrdersList:New(HotepCGS_UI_main)
  129.  
  130.   HotepCGS.MainMenuSwitch(ORDER_STATUS_WAITING)
  131. end
  132.  
  133.  
  134.  
  135.  
  136. function HotepCGS:Initialize()
  137.  
  138.   EVENT_MANAGER:RegisterForEvent(self.name, EVENT_PLAYER_ACTIVATED, function()
  139.       EVENT_MANAGER:UnregisterForEvent(self.name, EVENT_PLAYER_ACTIVATED)
  140.       msgWithName("Loaded.")
  141.       HotepCGS.InitOrdersList()
  142.     end
  143.   )
  144.  
  145.   -- ... other stuff ...
  146.  
  147. end
  148.  
  149.  
  150. function HotepCGS.OnAddOnLoaded(event, addonName)
  151.   if (addonName == HotepCGS.name) then
  152.     EVENT_MANAGER:UnregisterForEvent(HotepCGS.name, EVENT_ADD_ON_LOADED)
  153.     math.randomseed(GetTimeStamp())
  154.     HotepCGS:Initialize()
  155.   end
  156. end
  157.  
  158.  
  159. EVENT_MANAGER:RegisterForEvent(HotepCGS.name, EVENT_ADD_ON_LOADED, HotepCGS.OnAddOnLoaded)



... And I got the same error message as in OP.


Would anyone else care to try to help me?



It's past my bedtime, but i will read your "little tuto" tomorrow.

Last edited by tomtomhotep : 09/12/16 at 08:45 PM. Reason: hit submit too soon
  Reply With Quote
09/13/16, 03:55 PM   #4
tomtomhotep
 
tomtomhotep's Avatar
AddOn Author - Click to view addons
Join Date: Sep 2015
Posts: 21
Praise the Three, I got it!!

After many trials and tribulations, I finally got it working. Thanks to the 8 divines and the Three.

I read the little tuto you linked to me, and changed my Lua to match, but that was no help. I still got the error.

I finally realized what was wrong, from comparing your XML and the XML from ScrollListExample to my XML.

The ZO_ScrollList control **MUST** be named "$(parent)List",
and the container for the list headers MUST be named "$(parent)Headers"

I had tried to give them more descriptive names. THAT was the whole problem.

But thank you for your time.
  Reply With Quote

ESOUI » Developer Discussions » Lua/XML Help » ZO_SortFilterList -- What am i doing wrong??? :(

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off