Compare with Previous | Blame | View Log
--[[editboxData = { type = "editbox", name = "My Editbox", tooltip = "Editbox's tooltip text.", getFunc = function() return db.text end, setFunc = function(text) db.text = text doStuff() end, isMultiline = true, --boolean width = "full", --or "half" (optional) disabled = function() return db.someBooleanSetting end, --or boolean (optional) warning = "Will need to reload the UI.", --(optional) default = defaults.text, --(optional) reference = "MyAddonEditbox" --(optional) unique global reference to control } ]] local widgetVersion = 6 local LAM = LibStub("LibAddonMenu-2.0") if not LAM:RegisterWidget("editbox", widgetVersion) then return end local wm = WINDOW_MANAGER local cm = CALLBACK_MANAGER local tinsert = table.insert local function UpdateDisabled(control) local disable if type(control.data.disabled) == "function" then disable = control.data.disabled() else disable = control.data.disabled end if disable then control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA()) control.editbox:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA()) else control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA()) control.editbox:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA()) end --control.editbox:SetEditEnabled(not disable) control.editbox:SetMouseEnabled(not disable) end local function UpdateValue(control, forceDefault, value) if forceDefault then --if we are forcing defaults value = control.data.default control.data.setFunc(value) control.editbox:SetText(value) elseif value then control.data.setFunc(value) --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed if control.panel.data.registerForRefresh then cm:FireCallbacks("LAM-RefreshPanel", control) end else value = control.data.getFunc() control.editbox:SetText(value) end end function LAMCreateControl.editbox(parent, editboxData, controlName) local control = wm:CreateTopLevelWindow(controlName or editboxData.reference) control:SetParent(parent.scroll or parent) control:SetMouseEnabled(true) control:SetResizeToFitDescendents(true) --control.tooltipText = editboxData.tooltip control:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter) control:SetHandler("OnMouseExit", ZO_Options_OnMouseExit) control.label = wm:CreateControl(nil, control, CT_LABEL) local label = control.label label:SetAnchor(TOPLEFT) label:SetFont("ZoFontWinH4") label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS) label:SetText(editboxData.name) control.bg = wm:CreateControlFromVirtual(nil, control, "ZO_EditBackdrop") local bg = control.bg if editboxData.isMultiline then control.editbox = wm:CreateControlFromVirtual(nil, bg, "ZO_DefaultEditMultiLineForBackdrop") control.editbox:SetHandler("OnMouseWheel", function(self, delta) if self:HasFocus() then --only set focus to new spots if the editbox is currently in use local cursorPos = self:GetCursorPosition() local text = self:GetText() local textLen = text:len() local newPos if delta > 0 then --scrolling up local reverseText = text:reverse() local revCursorPos = textLen - cursorPos local revPos = reverseText:find("\n", revCursorPos+1) newPos = revPos and textLen - revPos else --scrolling down newPos = text:find("\n", cursorPos+1) end if newPos then --if we found a new line, then scroll, otherwise don't self:SetCursorPosition(newPos) end end end) else control.editbox = wm:CreateControlFromVirtual(nil, bg, "ZO_DefaultEditForBackdrop") end local editbox = control.editbox editbox:SetText(editboxData.getFunc()) editbox:SetMaxInputChars(3000) editbox:SetHandler("OnFocusLost", function(self) control:UpdateValue(false, self:GetText()) end) editbox:SetHandler("OnEscape", function(self) self:LoseFocus() control:UpdateValue(false, self:GetText()) end) editbox:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end) editbox:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end) local isHalfWidth = editboxData.width == "half" if isHalfWidth then control:SetDimensions(250, 55) label:SetDimensions(250, 26) bg:SetDimensions(225, editboxData.isMultiline and 74 or 24) bg:SetAnchor(TOPRIGHT, label, BOTTOMRIGHT) if editboxData.isMultiline then editbox:SetDimensionConstraints(210, 74, 210, 500) end else control:SetDimensions(510, 30) label:SetDimensions(300, 26) bg:SetDimensions(200, editboxData.isMultiline and 100 or 24) bg:SetAnchor(TOPRIGHT) if editboxData.isMultiline then editbox:SetDimensionConstraints(185, 100, 185, 500) end end if editboxData.warning then control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon") control.warning:SetAnchor(TOPRIGHT, control.bg, TOPLEFT, -5, 0) --control.warning.tooltipText = editboxData.warning control.warning.data = {tooltipText = editboxData.warning} end control.panel = parent.panel or parent --if this is in a submenu, panel is its parent control.data = editboxData control.data.tooltipText = editboxData.tooltip if editboxData.disabled then control.UpdateDisabled = UpdateDisabled control:UpdateDisabled() end control.UpdateValue = UpdateValue control:UpdateValue() if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then --if our parent window wants to refresh controls, then add this to the list tinsert(control.panel.controlsToRefresh, control) end return control end