--[[editboxData = { type = "editbox", name = "My Editbox", -- or string id or function returning a string getFunc = function() return db.text end, setFunc = function(text) db.text = text doStuff() end, tooltip = "Editbox's tooltip text.", -- or string id or function returning a string (optional) isMultiline = true, --boolean (optional) isExtraWide = true, --boolean (optional) width = "full", --or "half" (optional) disabled = function() return db.someBooleanSetting end, --or boolean (optional) warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional) requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional) default = defaults.text, -- default value or function that returns the default value (optional) reference = "MyAddonEditbox" -- unique global reference to control (optional) } ]] local widgetVersion = 14 local LAM = LibStub("LibAddonMenu-2.0") if not LAM:RegisterWidget("editbox", widgetVersion) then return end local wm = WINDOW_MANAGER 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 = LAM.util.GetDefaultValue(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 LAM.util.RequestRefreshIfNeeded(control) else value = control.data.getFunc() control.editbox:SetText(value) end end local MIN_HEIGHT = 24 local HALF_WIDTH_LINE_SPACING = 2 function LAMCreateControl.editbox(parent, editboxData, controlName) local control = LAM.util.CreateLabelAndContainerControl(parent, editboxData, controlName) local container = control.container control.bg = wm:CreateControlFromVirtual(nil, container, "ZO_EditBackdrop") local bg = control.bg bg:SetAnchorFill() 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 MIN_WIDTH = (parent.GetWidth and (parent:GetWidth() / 10)) or (parent.panel.GetWidth and (parent.panel:GetWidth() / 10)) or 0 control.label:ClearAnchors() container:ClearAnchors() control.label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 0) container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, 0, 0) if control.isHalfWidth then container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, 0, 0) end if editboxData.isExtraWide then container:SetAnchor(BOTTOMLEFT, control, BOTTOMLEFT, 0, 0) else container:SetWidth(MIN_WIDTH * 3.2) end if editboxData.isMultiline then container:SetHeight(MIN_HEIGHT * 3) else container:SetHeight(MIN_HEIGHT) end if control.isHalfWidth ~= true and editboxData.isExtraWide ~= true then control:SetHeight(container:GetHeight()) else control:SetHeight(container:GetHeight() + control.label:GetHeight()) end editbox:ClearAnchors() editbox:SetAnchor(TOPLEFT, container, TOPLEFT, 2, 2) editbox:SetAnchor(BOTTOMRIGHT, container, BOTTOMRIGHT, -2, -2) if editboxData.warning ~= nil or editboxData.requiresReload then control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon") if editboxData.isExtraWide then control.warning:SetAnchor(BOTTOMRIGHT, control.bg, TOPRIGHT, 2, 0) else control.warning:SetAnchor(TOPRIGHT, control.bg, TOPLEFT, -5, 0) end control.UpdateWarning = LAM.util.UpdateWarning control:UpdateWarning() end control.UpdateValue = UpdateValue control:UpdateValue() if editboxData.disabled ~= nil then control.UpdateDisabled = UpdateDisabled control:UpdateDisabled() end LAM.util.RegisterForRefreshIfNeeded(control) LAM.util.RegisterForReloadIfNeeded(control) return control end