呼叫方式
UI.selector.selectorWidget()
記錄相依項目 UI.selector.selectorWidget,然後以該名稱呼叫。含命名空間的呼叫不會傳入 self:請使用冒號呼叫,或自行傳入該物件。
作用
Constructs a new RM-Selector dropdown widget: an optional caption over a button that opens the workbench selector popup. SetList takes a map of keys to text (or {text, icon}) and an optional order, sorting by text otherwise; choosing a different entry fires OnValueChanged. It returns the registered but not yet acquired widget; addon:CreateConditionDropdown acquires it.
參數
無。
傳回值
| 1 | RMConditionWidget | The new selector widget, registered with the condition widget system. |
|---|
版本
內建輔助函式在每個版本上都會註冊。不同的是它們讀取的遊戲 API;某個 API 不存在時,輔助函式會改用備用方式,或傳回 nil 並附上原因。
- 該版本無法使用(原因請見提示)
- 僅在暴雪的棄用相容層開啟時
範例
-- needs the dependency UI.selector.selectorWidget
local picker = addon:AcquireConditionWidget("RM-Selector", UI.selector.selectorWidget)
picker:SetLabel(L["Unit"])
picker:SetList({ player = L["Player"], target = L["Target"] }, { "player", "target" })
picker:SetValue(value.unit)
picker:SetCallback("OnValueChanged", function(_, _, unit) value.unit = unit end)
parent:AddChild(picker)原始碼
UI/selector.lua,第 523 行。在遊戲中為唯讀;「複製」會產生一份可編輯的複本。
UI.selector.selectorWidget()
local w={type='RM-Selector',list={},order={},disabled=false}
local frame=CreateFrame('Frame',nil,UIParent);w.frame=frame;frame:SetSize(220,44)
local caption=frame:CreateFontString(nil,'OVERLAY','GameFontHighlightSmall');w.caption=caption;caption:SetPoint('TOPLEFT',0,0);caption:SetPoint('TOPRIGHT',0,0);caption:SetHeight(18);caption:SetJustifyH('LEFT')
local button=addon:CreateWorkbenchLabeledIconButton(frame,'chevron-down','',220);w.button=button;button:SetPoint('TOPLEFT',0,-20);button:SetPoint('TOPRIGHT',0,-20)
local popup=addon:CreateWorkbenchSelector();w.selector=popup
function w:OnAcquire() self.alive=true;self.list={};self.order={};self:SetDisabled(false);self:SetLabel('');self:SetValue(nil);self:SetWidth(220);self:SetHeight(44) end
function w:OnRelease() self.alive=false;popup:Release();self.list={};self.order={};self.value=nil end
function w:SetLabel(text) caption:SetText(text or '');local has=text and text~='';if has then caption:Show() else caption:Hide() end;button:ClearAllPoints();button:SetPoint('TOPLEFT',0,has and -20 or 0);button:SetPoint('TOPRIGHT',0,has and -20 or 0);self:SetHeight(has and 44 or 24) end
function w:SetText(text) button:SetText(text or L['Select']);addon:AlignWorkbenchTextLeft(button,26) end
function w:SetValue(value) self.value=value;local entry=self.list[value];if type(entry)=='table' then addon:PaintSelectorSelection(button,entry,entry.text) else self:SetText(entry);if button.valueIcon then button.valueIcon:Hide() end end end
function w:GetValue() return self.value end
function w:SetList(values,order)
self.list=values or {};self.order={};if order then for _,id in ipairs(order) do self.order[#self.order+1]=id end else for id in pairs(self.list) do self.order[#self.order+1]=id end;table.sort(self.order,function(a,b) return tostring(type(self.list[a])=='table' and self.list[a].text or self.list[a])<tostring(type(self.list[b])=='table' and self.list[b].text or self.list[b]) end) end;self:SetValue(self.value)
end
function w:SetDisabled(value) self.disabled=value==true;if self.disabled then button:Disable();popup:Hide() else button:Enable() end end
function w:ClearFocus() popup:Hide() end
addon:SetUIScript(button,'OnClick',function()
if not w.alive or w.disabled then return end
if popup.frame:IsShown() then popup:Hide();return end
local entries={};for _,id in ipairs(w.order) do local item=w.list[id];local record=type(item)=='table' and item or nil;entries[#entries+1]={value=id,text=record and record.text or item,icon=record and record.icon or nil,disabled=record and record.disabled or nil,header=record and record.header or nil} end
local lifetime=w.userdata
popup:Open(button,entries,w.value,function(value) if value~=w.value then w:SetValue(value);w:Fire('OnValueChanged',value) end end,function() return w.alive and w.userdata==lifetime and not w.disabled end)
end)
addon:SetUIScript(frame,'OnHide',function() popup:Hide() end)
---@cast w RMConditionWidget
return addon:RegisterConditionWidget(w)




