From e9a9d39c3cfd8af84f72ce5991e486026f95deca Mon Sep 17 00:00:00 2001 From: urnati Date: Tue, 18 Apr 2023 14:29:11 -0400 Subject: [PATCH] - Make "RightClickMenu" a constant --- Titan/Titan.lua | 377 ++++++++++++++++++++++++++++++++++++++++++++-- Titan/Titan.xml | 20 +++ Titan/TitanPanel.xml | 20 --- Titan/TitanTemplate.lua | 2 +- Titan/TitanUtils.lua | 5 +- Titan/TitanVariables.lua | 1 + 6 files changed, 385 insertions(+), 40 deletions(-) create mode 100644 Titan/Titan.xml delete mode 100644 Titan/TitanPanel.xml diff --git a/Titan/Titan.lua b/Titan/Titan.lua index 4ea033c..344d9f8 100644 --- a/Titan/Titan.lua +++ b/Titan/Titan.lua @@ -1824,15 +1824,10 @@ local function BuildServerProfilesMenu() end --[[ local -NAME: TitanPanel_PlayerSettingsMenu -DESC: Show list of toons submenu off Profiles/Manage/ from the Titan right click menu. +NAME: BuildPluginMenu +DESC: Show list of plugin defined options from the Titan right click menu. VAR: None OUT: None -NOTE: -- There are 2 level 3 menus possible - 1) Under profiles, then value could be the server of a saved toon - 2) Under plugins value could be the options of a plugin -:NOTE --]] local function BuildPluginMenu() -- @@ -1842,10 +1837,8 @@ local function BuildPluginMenu() for index, id in pairs(TitanPluginsIndex) do local plugin = TitanUtils_GetPlugin(id) --- local _, _, menu_plugin = string.find(TitanPanelRightClickMenu_GetDropdMenuValue(), R_PLUGIN.."(.-)") local par_val = TitanPanelRightClickMenu_GetDropdMenuValue() local menu_plugin = string.gsub(par_val, R_PLUGIN, "") --- if plugin.id and plugin.id == TitanPanelRightClickMenu_GetDropdMenuValue() then if plugin.id and plugin.id == menu_plugin then --title info = {}; @@ -1935,6 +1928,12 @@ local function BuildPluginMenu() end end +--[[ local +NAME: BuildPluginMenu +DESC: Show alphabetical list of toons submenu off Profiles/Manage/ from the Titan right click menu. +VAR: None +OUT: None +--]] local function BuildProfileMenu() -- local info = {}; @@ -1943,7 +1942,6 @@ local function BuildProfileMenu() -- -- Handle the profiles -- --- for index, id in pairs(TitanSettings.Players) do for idx = 1, #TitanVars.players do local index = TitanVars.players[idx] local player, server = TitanUtils_ParseName(index) @@ -2095,15 +2093,17 @@ end --[[ Titan NAME: TitanPanelRightClickMenu_PrepareBarMenu -DESC: This is the controller to show the proper level of the Titan (right click) menu. -VAR: self - expected to be the Tian bar that was right clicked +DESC: This is the controller of the Titan (right click) menu. +VAR: self - expected to be the Titan bar that was right clicked OUT: None +NOTE: +- Frame name used is RightClickMenu +:NOTE --]] function TitanPanelRightClickMenu_PrepareBarMenu(self) -- Determine which bar was clicked on - -- This MUST match the convention used in TitanPanel.xml to declare - -- the dropdown menu. ($parentRightClickMenu) - local s, e, frame = string.find(self:GetName(), "(.*)RightClickMenu"); +-- local s, e, frame = string.find(self:GetName(), "(.*)RightClickMenu"); + local s, e, frame = string.find(self:GetName(), "(.*)"..TITAN_PANEL_CLICK_MENU_SUFFIX); local lev = (TitanPanelRightClickMenu_GetDropdownLevel() or 1) --[[ print("_prep R click" @@ -2118,6 +2118,9 @@ print("_prep R click" end -- Level 2 + -- Plugin Categories => Plugins in that category + -- OR + -- Profiles => Server / Realm list if ( lev == 2 ) then if string.find(TitanPanelRightClickMenu_GetDropdMenuValue(), R_ADDONS) then BuildPluginCategoryMenu(frame) @@ -2130,6 +2133,9 @@ print("_prep R click" end -- Level 3 + -- Plugin Categories => Plugins in that category => Plugin defined options + -- OR + -- Profiles => Server / Realm list => Character on realm list if ( lev == 3 ) then if string.find(TitanPanelRightClickMenu_GetDropdMenuValue(), R_PLUGIN) then BuildPluginMenu() @@ -2141,8 +2147,9 @@ print("_prep R click" end -- Level 4 + -- Profiles => Server / Realm list => Character on realm list => load / delete if ( lev == 4 ) then - BuildAProfileMenu() -- only load / delete profiles for now + BuildAProfileMenu() return; end @@ -2173,3 +2180,341 @@ function TitanPanel_GetPluginSide(id) return TITAN_LEFT; end end + +-- +--========================== +-- Routines to handle moving and sizing of short bars +-- + +--[[ local +NAME: TitanPanel_SetScale +DESC: Set the scale of each plugin and each Titan bar. +VAR: None +OUT: None +--]] +local function CheckBarBounds(self, width) + local result = {} + local err = "" + local res = "" + + local f_name = self:GetName() + local bar_name = TitanBarData[f_name].name + local locale_name = TitanBarData[f_name].locale_name + local escale = UIParent:GetEffectiveScale() + + if TitanBarData[f_name].user_move + and TitanBarDataVars[f_name].show + then + local tscale = TitanPanelGetVar("Scale") +-- local tscale = self:GetEffectiveScale() + local screen = TitanUtils_ScreenSize() + local screen_right_scaled = screen.scaled_x + local screen_top_scaled = screen.scaled_y + local screen_right = screen.x + local screen_top = screen.y + + -- Assumes BOTTOMLEFT of screen per Short bar defaults. + -- Top and right adjust an addition pixel, + -- if resolution is not 'pixel perfect' rounding could cause algorithm to think bar is off screen + + --- Back out the Titan scaling to get 'real' position within unscaled WoW window + -- Use floor to trunc decimal places where the side could be right on the edge of the screen. + local orig_w = self:GetWidth() + local l_off = math.floor(self:GetLeft() * tscale) + local r_off = math.floor(self:GetRight() * tscale) + local t_off = math.floor(self:GetTop() * tscale) + local b_off = math.floor(self:GetBottom() * tscale) + + local w = 0 + local x_off = 0 + local y_off = 0 + local w_off = 0 + + -- Assume all ok :) + x_off = l_off + y_off = b_off + +local show_errs = false + if (width == 0) then -- drag and drop + -- Keep the width + w_off = orig_w + res = "Ok" + + if l_off < 0 then + x_off = 0 + err = "Off left of screen, leaving on the edge." + res = "Off L" + elseif (r_off) > screen_right then +-- x_off = math.floor(l_off - math.abs((r_off - screen_right))) + x_off = math.floor(screen_right - (r_off - l_off)) + err = "Off right side of screen, leaving on the edge." + res = "Off R" + end + if show_errs and err ~= "" then + TitanPrint(locale_name.." "..err.."!!!!" + .." ["..tostring(format("%0.1f", x_off)).."]" + .." ["..tostring(format("%0.1f", y_off)).."]" + , "warning") + end + err = "" + if (t_off) > screen_top then +-- y_off = math.floor(b_off - ((t_off) - screen_top)) + y_off = math.floor(screen_top - (t_off - b_off)) + err = "Off top of screen, leaving on the edge." + res = "Off T" + elseif b_off < 0 then + y_off = 0 + err = "Off bottom of screen, leaving on the edge." + res = "Off B" + end + if show_errs and err ~= "" then + TitanPrint(locale_name.." "..err.."!!!!" + .." ["..tostring(format("%0.1f", x_off)).."]" + .." ["..tostring(format("%0.1f", y_off)).."]" + , "warning") + end + else -- width change + local min_w, min_h, max_w, max_h = self:GetResizeBounds() + -- Keep the X and Y + w_new = orig_w + width + + if w_new < min_w then + -- do nothing - too small + w_off = min_w + err = "Width too small. Set to min width." + res = "Too small" + elseif w_new > max_w then + w_off = max_w + err = "Width too big. Set to max width." -- too wide + res = "Too big" + elseif x_off + w_new > screen_right then + w_off = orig_w + err = "Off right of screen, leaving on the edge." + res = "Off R" + else + w_off = w_new + res = "Ok" + end + + self:SetSize(w_off, TITAN_PANEL_BAR_HEIGHT) +-- self:SetWidth(w_off) + if show_errs and err ~= "" then + TitanPrint(locale_name.." "..err.."!!!!" + .." ["..tostring(format("%0.1f", orig_w)).."]" + .." ["..tostring(format("%0.1f", w_off)).."]" + , "warning") + end + end + + -- Offsets are saved in without scale + TitanVariables_SetBarPos(self, false, x_off, y_off, w_off) + else + -- Controlled with anchor points; cannot move so no check is needed + end + + if err == "" then + -- all is good + result.ok = true + else + result.ok = false + end + + return result +end + +--[[ local +NAME: OnMoveStart +DESC: Start the grap of a Short Titan bar if Shift and left mouse are held. +VAR: self - the bar frame +OUT: None +--]] +local function OnMoveStart(self) + if IsShiftKeyDown() then + if self:IsMovable() then + self.isMoving = true + self:StartMoving() + _G.GameTooltip:Hide() + end + else + -- Do not move + end +end + +--[[ +print("OnMoveStart" +.." "..tostring(self:GetName()).."" +.." "..tostring(IsShiftKeyDown()).."" +.." "..tostring(IsAltKeyDown()).."" +.."\n" +.." x "..tostring(format("%0.1f", self:GetLeft())).."" +.." y "..tostring(format("%0.1f", self:GetTop())).."" +) +--]] + +--[[ local +NAME: OnMovingStop +DESC: When a Short Titan bar drag is stopped. +VAR: self - the bar frame +OUT: None +--]] +local function OnMovingStop(self) + + self:StopMovingOrSizing() + self.isMoving = nil + + local res = CheckBarBounds(self, 0) + if res.ok then + else + end + -- Seems overkill - this will recalc all bars... + TitanPanel_InitPanelBarButton("OnMovingStop") +end + +--[[ local +NAME: OnMouseWheel +DESC: Change the width of a Short Titan bar when mouse is over the bar and Shift is held when the mouse wheel is used. +VAR: self - the bar frame +VAR: d - mouse wheel direction; assuming a 1 'click' is a pixel +OUT: None +NOTE: +- Can get noisy, "Initializes" all bars at each click to ensure the bar is drawn. +:NOTE +--]] +local function OnMouseWheel(self, d) + if IsShiftKeyDown() then + local old_w = self:GetWidth() + local res = CheckBarBounds(self, d) + if res.ok then + end +--[[ +print("wheel" +.." "..tostring(self:GetName()).."" +.." "..tostring(d).."" +.." old: "..tostring(format("%0.1f", old_w)).."" +.." new: "..tostring(format("%0.1f", self:GetWidth())).."" +.." ok: "..tostring(res.ok).."" +) +--]] + -- Seems overkill - this will recalc all bars but recalc of textures could be needed... + TitanPanel_InitPanelBarButton("OnMouseWheel") + end +end + +--[[ Titan +NAME: TitanPanel_InitPanelBarButton +DESC: Set the scale, texture (graphic), and transparancy of all the Titan bars based on the user selection. +VAR: None +OUT: None +--]] +function TitanPanel_InitPanelBarButton() + -- Set initial Panel Scale + TitanPanel_SetScale(); + + for idx,v in pairs (TitanBarData) do + CheckBarBounds(_G[idx], 0) + TitanPanel_SetBarTexture(idx) + end + + TitanPanelBarButton_DisplayBarsWanted("InitPanelBarButton") +end + +-- +--========================== +-- Routines to handle creation of Titan bars +-- +--[[ Titan +NAME: TitanPanelButton_CreateBar(frame_str) +DESC: Create a Titan bar that can show plugins. +VAR: frame_str - name of the frame +NOTE: +- This assumes ... +:NOTE +--]] +function TitanPanelButton_CreateBar(frame_str) + local this_bar = frame_str + local a_bar = CreateFrame("Button", this_bar, UIParent, "Titan_Bar__Display_Template") + + local bar_data = TitanBarData[this_bar] + + -- ====== + -- Scripts + a_bar:SetScript("OnEnter", function(self) TitanPanelBarButton_OnEnter(self) end) + a_bar:SetScript("OnLeave", function(self) TitanPanelBarButton_OnLeave(self) end) + a_bar:SetFrameStrata("DIALOG") + + local x, y, w = TitanVariables_GetBarPos(frame_str) + local tscale = TitanPanelGetVar("Scale") +--[[ +print("_Create bar" +.." "..tostring(bar_data.name).."" +.."\n " +.." "..tostring(bar_data.name).."" +.." "..tostring(bar_data.show.pt).."" +.." "..tostring(bar_data.show.rel_fr).."" +.." "..tostring(bar_data.show.rel_pt).."" +.."\n " +.." "..tostring(bar_data.name).."" +.." "..tostring(format("%0.1f", x)).."" +.." "..tostring(format("%0.1f", y)).."" +.." "..tostring(format("%0.1f", w)).."" +) +--]] + if bar_data.user_move then + a_bar:SetPoint(bar_data.show.pt, bar_data.show.rel_fr, bar_data.show.rel_pt, x, y) + a_bar:SetMovable(true) + a_bar:SetResizable(true) + a_bar:EnableMouse(true) + a_bar:RegisterForDrag("LeftButton") + a_bar:SetScript("OnDragStart", OnMoveStart) + a_bar:SetScript("OnDragStop", OnMovingStop) + a_bar:SetScript("OnMouseWheel", OnMouseWheel) + a_bar:SetSize(w / tscale, TITAN_PANEL_BAR_HEIGHT) + else + -- Static full width bar + a_bar:SetPoint(bar_data.show.pt, bar_data.show.rel_fr, bar_data.show.rel_pt, x, y) + a_bar:SetPoint(bar_data.show.pt, bar_data.show.rel_fr, bar_data.show.rel_pt, x, y - TITAN_PANEL_BAR_HEIGHT) + end + + -- ====== + -- Bounds only effective on Short bars for now + -- Min : No smaller than the padding & one icon + -- Max : No wider than the screen + -- does not seem to work to restrict size automatically... + local screen = TitanUtils_ScreenSize() + a_bar:SetResizeBounds(TitanBarData[this_bar].plugin_x_offset + 16, TITAN_PANEL_BAR_HEIGHT, screen.x, TITAN_PANEL_BAR_HEIGHT) + + a_bar:RegisterForClicks("LeftButtonUp", "RightButtonUp"); + a_bar:SetScript("OnClick", function(self, button) TitanPanelBarButton_OnClick(self, button) end) + + -- ====== + -- Frame for right clicks + f = CreateFrame("Frame", this_bar..TITAN_PANEL_CLICK_MENU_SUFFIX, UIParent, "UIDropDownMenuTemplate") + + -- ====== + -- Hider for auto hide feature + local hide_bar_name = TITAN_PANEL_HIDE_PREFIX..bar_data.name + if bar_data.hider then +--[[ +print("_Create hide bar" +.." "..tostring(bar_data.name).."" +.." "..tostring(hide_bar_name).."" +) +--]] + + local hide_bar = CreateFrame("Button", hide_bar_name, UIParent, "TitanPanelBarButtonHiderTemplate") + hide_bar:SetFrameStrata("DIALOG") + hide_bar:SetPoint(bar_data.show.pt, bar_data.show.rel_fr, bar_data.show.rel_pt, x, -y) + + -- Set script handlers for display + hide_bar:RegisterForClicks("LeftButtonUp", "RightButtonUp"); + hide_bar:SetScript("OnEnter", function(self) TitanPanelBarButtonHider_OnEnter(self) end) + hide_bar:SetScript("OnLeave", function(self) TitanPanelBarButtonHider_OnLeave(self) end) + hide_bar:SetScript("OnClick", function(self, button) TitanPanelBarButton_OnClick(self, button) end) + + hide_bar:SetFrameStrata("BACKGROUND") + hide_bar:SetSize(screen.x / tscale, TITAN_PANEL_BAR_HEIGHT) + else + -- Not allowed for this bar + end +end + diff --git a/Titan/Titan.xml b/Titan/Titan.xml new file mode 100644 index 0000000..a761d2a --- /dev/null +++ b/Titan/Titan.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/Titan/TitanPanel.xml b/Titan/TitanPanel.xml deleted file mode 100644 index eb6f9e6..0000000 --- a/Titan/TitanPanel.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - diff --git a/Titan/TitanTemplate.lua b/Titan/TitanTemplate.lua index 881e206..3021b6d 100644 --- a/Titan/TitanTemplate.lua +++ b/Titan/TitanTemplate.lua @@ -1548,7 +1548,7 @@ print("_Create bar" -- ====== -- Frame for right clicks - f = CreateFrame("Frame", this_bar.."RightClickMenu", UIParent, "UIDropDownMenuTemplate") + f = CreateFrame("Frame", this_bar..TITAN_PANEL_CLICK_MENU_SUFFIX, UIParent, "UIDropDownMenuTemplate") -- ====== -- Hider for auto hide feature diff --git a/Titan/TitanUtils.lua b/Titan/TitanUtils.lua index 4562475..2f80c7d 100644 --- a/Titan/TitanUtils.lua +++ b/Titan/TitanUtils.lua @@ -1363,9 +1363,8 @@ function TitanUtils_PluginToRegister(self, isChildButton) --[[ For updated menu lib (Dec 2018) Old way was to use the XML file to declare the frame, now it needs to be in Lua - --]] - local f = CreateFrame("Frame", self:GetName().."RightClickMenu", self or nil, "UIDropDownMenuTemplate") + local f = CreateFrame("Frame", self:GetName()..TITAN_PANEL_CLICK_MENU_SUFFIX, self or nil, "UIDropDownMenuTemplate") end --[[ Titan @@ -1730,7 +1729,7 @@ function TitanPanelRightClickMenu_Toggle(self) -- 1) Titan bar - creates same menu -- 2) Plugin creation via the .registry local frame = self:GetName() - local menu = _G[self:GetName().."RightClickMenu"] + local menu = _G[self:GetName()..TITAN_PANEL_CLICK_MENU_SUFFIX] --[[ print("_ toggle R menu" .." "..tostring(frame).."" diff --git a/Titan/TitanVariables.lua b/Titan/TitanVariables.lua index 53cbef3..cad06b5 100644 --- a/Titan/TitanVariables.lua +++ b/Titan/TitanVariables.lua @@ -82,6 +82,7 @@ TITAN_PANEL_HIDE_PREFIX = "Titan_Bar__Hider_" TITAN_PANEL_DISPLAY_PREFIX = "Titan_Bar__Display_" TITAN_PANEL_DISPLAY_MENU = "Menu_" TITAN_PANEL_BACKGROUND_PREFIX = "TitanPanelBackground_" +TITAN_PANEL_CLICK_MENU_SUFFIX = "RightClickMenu" TITAN_PANEL_TEXT = "Text" TITAN_PANEL_TEXTURE_VAR = "Texture" TITAN_PANEL_BUTTON_TEXT = "Button"..TITAN_PANEL_TEXT -- 1.7.9.5