Mercurial > wow > turok
comparison Turok/Layout/Dialog.lua @ 6:a9b8b0866ece
clear out log jam
| author | Nenue |
|---|---|
| date | Sun, 21 Feb 2016 08:32:53 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 5:8a9a6637f082 | 6:a9b8b0866ece |
|---|---|
| 1 --- Dialog Generator | |
| 2 -- @file-author@ | |
| 3 -- @project-revision@ @project-hash@ | |
| 4 -- @file-revision@ @file-hash@ | |
| 5 -- Created: 1/1/2016 3:37 PM | |
| 6 --- Framescript template for generating intelligible dialog panels | |
| 7 --[[ | |
| 8 -- Frame << TkListFrame | |
| 9 -- { | |
| 10 -- Frame <rows> << TkListItem <-- Any number of list item frames with parentArray="rows" | |
| 11 -- { | |
| 12 :GetRow(row, values, id, offset) <-- Populates the uiobjects that make up the given row, with data from values[id], on display row offset | |
| 13 <opts> <-- Any layered region of child frame with parentArray=opts" | |
| 14 } | |
| 15 Button <buttons> <-- Any frame with parentArray="buttons" | |
| 16 | |
| 17 .Click (button, list) <-- Defines results of using a control button | |
| 18 .Check (button, row, list) <-- Defines results of operating a row widget | |
| 19 .Wheel (list, delta) <-- Defines response to mousewheel action over the list panel | |
| 20 } | |
| 21 | |
| 22 Globals: | |
| 23 TkList_Init ( object, values, offset, numRows ) | |
| 24 Takes the return from CreateFrame and a table of values and establishes a scrollable list interface. | |
| 25 | |
| 26 TkPanel_Init ( object ) | |
| 27 TkList_Init without the scrollable list operations. Lines up control buttons and nothing else. | |
| 28 --]] | |
| 29 local TK_LIST_SPACING = 1 | |
| 30 local TK_LIST_PADDING = 3 | |
| 31 local TK_LIST_HEADING_SIZE = 26 | |
| 32 local TK_LIST_ITEM_HEIGHT = 24 | |
| 33 local TK_LIST_DISPLAY_ITEMS = 10 | |
| 34 | |
| 35 local print = function(...) | |
| 36 if _G.Devian and _G.DevianDB.workspace ~= 1 then | |
| 37 _G.print('Xui', ...) | |
| 38 end | |
| 39 end | |
| 40 -- GLOBALS: TkList_SetView, TkList_Init, Turok | |
| 41 local type, error, pairs, ipairs, tonumber, max, CreateFrame = type, error, pairs, ipairs, tonumber, math.max, CreateFrame | |
| 42 local checkval = function(valtype, t, fallback) | |
| 43 return (type(t) == valtype) and t or (fallback or error('Expected table reference, got '..type(t))) | |
| 44 end | |
| 45 local tableval = function(t, fallback) | |
| 46 return checkval('table', t, fallback or {}) | |
| 47 end | |
| 48 local funcval = function(f, fallback) | |
| 49 return checkval('function', f, fallback or function() end) | |
| 50 end | |
| 51 | |
| 52 --- Orders list row | |
| 53 -- Does an ipairs iteration over self.opts and distributes the referenced objects along the horizontal axis of 'self' | |
| 54 -- Note that members are only aligned horizontally; no column alignment is done. Widths can be set by datafunc to accomplish that. | |
| 55 local function TkListItem_Init (listrow) | |
| 56 if not listrow.opts then | |
| 57 print('no options to enumerate') | |
| 58 return | |
| 59 end | |
| 60 local rwidth = TK_LIST_PADDING*2 | |
| 61 for i, z in pairs(listrow.opts) do | |
| 62 if i > 1 then | |
| 63 z:SetPoint('LEFT', listrow.opts[i-1], 'RIGHT', TK_LIST_SPACING, 0) | |
| 64 else | |
| 65 z:SetPoint('LEFT', listrow, 'LEFT', TK_LIST_PADDING, 0) | |
| 66 end | |
| 67 rwidth = rwidth + z:GetWidth()+TK_LIST_SPACING | |
| 68 z:Show() | |
| 69 end | |
| 70 listrow:SetSize(rwidth-TK_LIST_PADDING*2,TK_LIST_ITEM_HEIGHT) | |
| 71 listrow:Show() | |
| 72 print(rwidth) | |
| 73 return rwidth | |
| 74 end | |
| 75 | |
| 76 | |
| 77 --- | |
| 78 local function TkControls_Init(self) | |
| 79 local buttonsize = (self._dwidth - (#self.buttons -1) * TK_LIST_SPACING - TK_LIST_PADDING*2) / #self.buttons | |
| 80 for n, b in ipairs(self.buttons) do | |
| 81 --print('Spirit', buttonsize) | |
| 82 b:SetWidth(buttonsize) | |
| 83 b:SetPoint('TOPLEFT', self, 'BOTTOMLEFT', buttonsize* (n-1) + TK_LIST_SPACING * (n-1) + TK_LIST_PADDING, -TK_LIST_PADDING) | |
| 84 end | |
| 85 self.controls:SetHeight(self.buttons[1]:GetHeight()+ TK_LIST_PADDING*2) | |
| 86 end | |
| 87 | |
| 88 --- Populates the list frame with items | |
| 89 function TkList_SetView(self, start_num, num_rows) | |
| 90 print(self, start_num, num_rows) | |
| 91 if not start_num then | |
| 92 start_num = self.offset | |
| 93 end | |
| 94 | |
| 95 if not num_rows then | |
| 96 num_rows = self.num_rows | |
| 97 end | |
| 98 | |
| 99 if start_num > #self.info then | |
| 100 start_num = #self.info - #self.info % num_rows | |
| 101 elseif start_num < 1 then | |
| 102 start_num = 1 | |
| 103 end | |
| 104 | |
| 105 print(' ', self:GetName(), start_num, num_rows, #self.info) | |
| 106 self.offset = start_num | |
| 107 | |
| 108 for draw_num = 1, num_rows do | |
| 109 local actual_row = draw_num + start_num - 1 | |
| 110 if not self.rows[draw_num] then | |
| 111 self.rows[draw_num] = CreateFrame('Frame', self:GetName()..'_Option_'..draw_num, self, 'TurokListItem') | |
| 112 self.rows[draw_num]:SetHeight(TK_LIST_ITEM_HEIGHT) | |
| 113 self.rows[draw_num].row_num = draw_num | |
| 114 end | |
| 115 self.rows[draw_num].actual_row = actual_row | |
| 116 local row = self.rows[draw_num] | |
| 117 if self.info[actual_row] then | |
| 118 print( actual_row, draw_num) | |
| 119 self.GetRow(row, self.info, actual_row, draw_num) | |
| 120 row:Show() | |
| 121 else | |
| 122 print('|cFF888888'..actual_row, draw_num) | |
| 123 row:Hide() | |
| 124 end | |
| 125 row:SetParent(self) | |
| 126 end | |
| 127 end | |
| 128 | |
| 129 --- Prime TkListFrame template-spawn for use | |
| 130 -- @param self frame object to list-ify | |
| 131 -- @param info array of list item values | |
| 132 -- @param datafunc function that takes 1) frame object 2) info table 3) index number 4) row number | |
| 133 -- @param offset starting offset for initial view | |
| 134 function TkList_Init (self, info, offset, num_rows) | |
| 135 -- error checking | |
| 136 --[[if type(info) ~= 'table' then | |
| 137 error('arg #2 info must be an associative array') | |
| 138 end | |
| 139 if type(datafunc) ~= 'function' then | |
| 140 error('arg #3 needs a funcref or method name from the frame object') | |
| 141 end | |
| 142 --]] | |
| 143 self.GetRow = funcval(self.GetRow, function() end) | |
| 144 self.info = tableval(info, {}) | |
| 145 for i, v in ipairs(info) do | |
| 146 print('Main', i, '=', v.spellName, v.spellTab) | |
| 147 self.max_row = i | |
| 148 end | |
| 149 print('Main', 'last row #', self.max_row) | |
| 150 | |
| 151 | |
| 152 -- obtain data contents | |
| 153 self._dwidth = 0 | |
| 154 self.rows = {} | |
| 155 self.offset = offset and offset or 1 | |
| 156 self.num_rows = (tonumber(num_rows) ~= nil) and num_rows or TK_LIST_DISPLAY_ITEMS | |
| 157 self.name:SetHeight(TK_LIST_HEADING_SIZE) | |
| 158 TkList_SetView(self, offset) | |
| 159 | |
| 160 -- sort out the proper width | |
| 161 local rwidth = 1 | |
| 162 local k = 0 | |
| 163 for n, item in ipairs(self.rows) do | |
| 164 print(item:GetName()) | |
| 165 if item:IsShown() then | |
| 166 if n > 1 then | |
| 167 item:SetPoint('TOPLEFT', self.rows[n-1], 'BOTTOMLEFT', 0, - TK_LIST_SPACING) | |
| 168 else | |
| 169 item:SetPoint('TOPLEFT', self, 'TOPLEFT', TK_LIST_PADDING, -(TK_LIST_PADDING+TK_LIST_HEADING_SIZE+TK_LIST_SPACING)) | |
| 170 end | |
| 171 k = k+1 | |
| 172 self._dwidth = max(self._dwidth, TkListItem_Init(item)) | |
| 173 end | |
| 174 end | |
| 175 | |
| 176 TkControls_Init(self) | |
| 177 | |
| 178 self:SetSize(self._dwidth , (k*TK_LIST_ITEM_HEIGHT)+(TK_LIST_PADDING*2)+(k*TK_LIST_SPACING)+TK_LIST_HEADING_SIZE) | |
| 179 end | |
| 180 | |
| 181 --- Set up for a non-list-style panel, no iterative controls | |
| 182 function TkPanel_Init(self) | |
| 183 self._dwidth = self:GetWidth() | |
| 184 TkControls_Init(self) | |
| 185 --self:SetSize(self._dwidth , (k*TK_LIST_ITEM_HEIGHT)+(TK_LIST_PADDING*2)+(k*TK_LIST_SPACING)+TK_LIST_HEADING_SIZE) | |
| 186 end |
