Files
coa-vanillaguide/Frame_MainFrame.lua
T

971 lines
33 KiB
Lua

--[[--------------------------------------------------
----- VanillaGuide -----
------------------
Frame_MainFrame.lua
Authors: mrmr
Version: 1.04.2
------------------------------------------------------
Description:
Main Frame Object
1.00
-- Initial Ace2 release
1.99a
-- Ally addition starter version
1.03
-- No Changes. Just adjusting "version".
1.99x for a beta release was a weird choise.
1.04.1
-- Main Frame object
1.04.2
-- Reworked "MetaMapBWP" and renamed to "MetaMap"
cause now there's support for MetaMapNotes too
Now, the methods are called:
obj.RefreshMetaMap()
obj.SetMetaMapDestination(self, nX, nY, sZone, title, step, label, mode)
Diffentes modes, produces different behaviour,
see the source for insight
------------------------------------------------------
Connection:
--]]--------------------------------------------------
--local VGuide = VGuide
Dv(" VGuide Frame_MainFrame.lua Start")
objMainFrame = {}
objMainFrame.__index = objMainFrame
function objMainFrame:new(fParent, tTexture, oSettings, oDisplay)
fParent = fParent or nil
local obj = {}
setmetatable(obj, self)
local tUI = oSettings:GetSettingsUI()
local function Render_MF(fParent, sName, tTexture, tUI)
local bLocked = tUI.Locked
local tSize = tUI.MainFrameSize
local tAnch = tUI.MainFrameAnchor
local tColor = tUI.MainFrameColor
local frame = CreateFrame("Frame", sName, fParent)
frame:ClearAllPoints()
frame:SetPoint(tAnch.sFrom, UIParent, tAnch.sTo, tAnch.nX, tAnch.nY)
frame:SetMinResize(320,320)
frame:SetMaxResize(640,840)
frame:SetWidth(tSize.nWidth)
frame:SetHeight(tSize.nHeight)
frame:SetMovable(true)
frame:SetResizable(true)
if bLocked then
frame:SetMovable(false)
frame:SetResizable(false)
end
frame:SetBackdrop(tTexture.BACKDROP)
frame:SetBackdropColor(tColor.nR, tColor.nG, tColor.nB, tColor.nA)
frame:EnableMouse(true)
frame:SetClampedToScreen(true)
frame:RegisterForDrag("LeftButton")
frame:SetScript("OnMouseDown", function()
local fStep = getglobal("VG_MainFrame_StepFrame")
local fScroll = getglobal("VG_MainFrame_ScrollFrame")
local StepFrame = tUI.StepFrameVisible
local ScrollFrame = tUI.ScrollFrameVisible
local bLocked = tUI.Locked
local x, y = GetCursorPosition()
local s = this:GetEffectiveScale()
x = x / s
y = y / s
local bottom = this:GetBottom();
local top = this:GetTop();
local left = this:GetLeft();
local right = this:GetRight();
local bottomStep = fStep:GetBottom()
local topScroll = fScroll:GetTop()
if arg1 == "LeftButton" and not this.isMoving and not this.isResizing and not bLocked then
if (x < left + 5 and y < bottom + 5) then
this:StartSizing("BOTTOMLEFT")
this.isResizing = true
elseif (x < left + 5 and y > top - 5) then
this:StartSizing("TOPLEFT")
this.isResizing = true
elseif (x > right - 5 and y < bottom + 5) then
this:StartSizing("BOTTOMRIGHT")
this.isResizing = true
elseif (x > right - 5 and y > top - 5) then
this:StartSizing("TOPRIGHT")
this.isResizing = true
elseif (x < left + 5) then
this:StartSizing("LEFT")
this.isResizing = true
elseif (x > right - 5) then
this:StartSizing("RIGHT")
this.isResizing = true
elseif (y < bottom + 5) then
this:StartSizing("BOTTOM")
this.isResizing = true
elseif (y > top - 5) then
this:StartSizing("TOP")
this.isResizing = true
elseif StepFrame and ScrollFrame and
(x > left + 5 and y > topScroll and y < bottomStep and x < right +5) then
local nH = this:GetHeight()
local nGapMin = nH * 0.85 - (nH /2)
local nGapMax = nH * 0.45 - (nH /2)
local nC = nH / 2
local nT = fStep:GetTop()
local nMinH = nC - nGapMin - 23
local nMaxH = nC - nGapMax - 23
fStep:SetMinResize(fStep:GetWidth(), nMinH)
fStep:SetMaxResize(fStep:GetWidth(), nMaxH)
fStep.isResizing = true
fStep:StartSizing("BOTTOM")
--elseif
else
this:StartMoving()
this.isMoving = true
end
end
end)
frame:SetScript("OnMouseUp", function()
local fStep = getglobal("VG_MainFrame_StepFrame")
local fSlider = getglobal("VG_SettingsFrame_StepScrollSlider")
if arg1 == "LeftButton" then
if this.isMoving then
this:StopMovingOrSizing()
this.isMoving = false
local from, _, to, x, y = this:GetPoint(1)
tUI.MainFrameAnchor = {
sFrom = from,
sTo = to,
nX = x,
nY = y,
}
oSettings:SetSettingsUI(tUI)
elseif this.isResizing then
this:StopMovingOrSizing()
this.isResizing = false
end
if fStep.isResizing then
fStep:StopMovingOrSizing()
fStep.isResizing = false
local nH = fStep:GetHeight()
local oldVal = fSlider:GetValue()
local newVal = math.floor(nH * 100 / this:GetHeight() + 4)
if newVal ~= oldVal then
fSlider:SetValue(newVal)
end
end
end
end)
frame:SetScript("OnSizeChanged", function()
local fStep = getglobal("VG_MainFrame_StepFrame")
local fScroll = getglobal("VG_MainFrame_ScrollFrame")
local StepFrame = tUI.StepFrameVisible
local ScrollFrame = tUI.ScrollFrameVisible
local StepScroll = tUI.StepScroll
local width = this:GetWidth()
local height = this:GetHeight()
if StepFrame and not ScrollFrame then
height = height / StepScroll
elseif StepFrame and ScrollFrame then
local Per = height * (1 - StepScroll)
local Gap = Per - (height / 2)
fStep:SetPoint("BOTTOMRIGHT", this, "RIGHT", -5, Gap)
fScroll:SetPoint("TOPLEFT", fStep, "BOTTOMLEFT", 0, -2)
end
tUI.MainFrameSize = {
nWidth = width,
nHeight = height,
}
oSettings:SetSettingsUI(tUI)
end)
frame:SetScript("OnHide", function()
if this.isMoving then
this:StopMovingOrSizing();
this.isMoving = false;
end
if this.isResizing then
this:StopMovingOrSizing();
this.isResizing = false;
end
end)
return frame
end
local function Render_MFTitle(fParent, sName)
local version = GetAddOnMetadata("VanillaGuide", "Version")
local fs = fParent:CreateFontString(sName, "ARTWORK", "GameFontNormalSmall")
fs:SetPoint("TOPLEFT", fParent, "TOPLEFT", 31, -6)
fs:SetTextColor(.91, .79, .11, 1)
fs:SetJustifyH("CENTER")
fs:SetJustifyV("CENTER")
fs:SetText("|cccff1919Vanilla|ccceeeeeeGuide |ccca1a1a1v|ccc4a4aa1" .. version .. "|r")
return fs
end
local function Render_Button(fParent, sName, nWidth, nHeight, tTexture)
local btn = CreateFrame("Button", sName, fParent)
btn:SetWidth(nWidth)
btn:SetHeight(nHeight)
btn:SetNormalTexture(tTexture.NORMAL)
btn:SetPushedTexture(tTexture.PUSHED)
btn:SetHighlightTexture(tTexture.HIGHLIGHT)
btn:RegisterForClicks("LeftButtonUp")
return btn
end
local function Render_MFStepNumberFrame(fParent, sName, nWidth, nHeight, tTexture)
local frame = CreateFrame("Frame", sName, fParent)
frame:SetWidth(nWidth)
frame:SetHeight(nHeight)
frame:SetBackdrop(tTexture.BACKDROP)
frame:SetBackdropColor(.1, .1, .1, .9)
return frame
end
local function Render_MFStepNumberLabel(fParent, sName)
local fs = fParent:CreateFontString(sName, "ARTWORK", "GameFontNormalSmall")
fs:SetPoint("CENTER", fParent, "CENTER", 0, 0)
fs:SetTextColor(.71, .71, .71, 1)
fs:SetJustifyH("CENTER")
fs:SetJustifyV("CENTER")
return fs
end
local function Render_MFDropDownMenu(fParent, sName)
local frame= CreateFrame("Frame", sName, fParent)
frame.UncheckHack = function()
getglobal(this:GetName().."Check"):Hide()
end
frame.displayMode = "MENU"
frame.info = {}
frame:SetHeight(25)
frame:SetWidth(25)
return frame
end
local function Render_MFDropDownMenuZoneFrame(fParent, sName, tTexture)
local frame = CreateFrame("Frame", sName, fParent)
frame:SetBackdrop(tTexture.BACKDROP);
frame:SetBackdropColor(.1, .1, .1, .7)
return frame
end
local function Render_MFDropDownMenuZoneLabel(fParent, sName)
local fs = fParent:CreateFontString(sName, "ARTWORK", "GameFontNormalSmall")
fs:SetTextColor(.91, .91, .91, 1)
fs:SetJustifyH("CENTER")
fs:SetJustifyV("CENTER")
fs:SetPoint("BOTTOMLEFT", fParent, "BOTTOMLEFT", 15, 6)
return fs
end
local function Render_MFStepFrame(fParent, sName, tTexture, tUI)
local tColor = tUI.StepFrameColor
local frame = CreateFrame("Frame", sName, fParent)
frame:SetResizable(true)
frame:SetBackdrop(tTexture.BACKDROP)
frame:SetBackdropColor(tColor.nR, tColor.nG, tColor.nB, tColor.nA)
--frame:SetScript("OnSizeChanged" , function()
--end)
frame:SetScript("OnHide" , function()
if this.isMoving then
this:StopMovingOrSizing();
this.isMoving = false;
end
if this.isResizing then
this:StopMovingOrSizing();
this.isResizing = false;
end
end)
return frame
end
local function Render_MFStepLabel(fParent, sName, tUI)
local tColor = tUI.StepFrameTextColor
local fs = fParent:CreateFontString(sName, "ARTWORK", "GameFontNormalSmall")
fs:SetPoint("TOPLEFT", fParent, "TOPLEFT", 5, -5)
fs:SetPoint("BOTTOMRIGHT", fParent, "BOTTOMRIGHT", -5, 5)
fs:SetTextColor(tColor.nR, tColor.nG, tColor.nB, tColor.nA)
fs:SetJustifyH("LEFT")
fs:SetJustifyV("TOP")
return fs
end
local function Render_MFScrollFrame(fParent, sName, tTexture, tUI)
local tColor = tUI.ScrollFrameColor
local frame = CreateFrame("ScrollFrame", sName, fParent)
frame:SetBackdrop(tTexture.BACKDROP)
frame:SetBackdropColor(tColor.nR, tColor.nG, tColor.nB, tColor.nA)
frame:EnableMouseWheel(true)
frame:SetScript("OnSizeChanged", function()
obj:RefreshScrollFrame()
end)
frame:SetScript("OnMouseWheel", function()
local fSlider = getglobal("VG_MainFrame_ScrollFrameSlider")
local current = fSlider:GetValue()
local step = fSlider:GetValueStep()
local smin, smax = fSlider:GetMinMaxValues()
local delta = arg1
if IsShiftKeyDown() and (delta > 0) then
fSlider:SetValue(0)
elseif IsShiftKeyDown() and (delta < 0) then
fSlider:SetValue(smax)
elseif (delta < 0) and (current < smax) then
fSlider:SetValue(current + 20)
elseif (delta > 0) and (current > 1) then
fSlider:SetValue(current - 20)
end
end)
return frame
end
local function Render_MFScrollFrameChild(fParent, sName)
local nScrollFrameChildWidth = fParent:GetWidth() - 10
local nScrollFrameChildHeight = fParent:GetHeight() - 10
local frame = CreateFrame("Frame", sName, fParent)
frame:SetWidth(nScrollFrameChildWidth)
frame:SetHeight(nScrollFrameChildHeight)
return frame
end
local function Render_MFScrollFrameSlider(fParent, sName)
local sld = CreateFrame("Slider", sName, fParent)
sld.background = sld:CreateTexture(nil, "BACKGROUND")
sld.background:SetAllPoints(true)
sld.background:SetTexture(.0, .0, .0, 0.5)
sld.thumb = fParent:CreateTexture(nil, "OVERLAY")
--sld.thumb:SetTexture("Interface\\AddOns\\VanillaGuide\\Textures\\Buttons\\Button-Flash-Normal")
sld.thumb:SetTexture("Interface\\Buttons\\UI-ScrollBar-Knob")
sld.thumb:SetWidth(31)
sld.thumb:SetHeight(31)
sld:SetThumbTexture(sld.thumb)
sld:SetWidth(14)
sld:SetOrientation("VERTICAL");
sld:SetValueStep(10)
sld:SetScript("OnValueChanged", function()
local fScroll = getglobal("VG_MainFrame_ScrollFrame")
fScroll:SetVerticalScroll(arg1)
end)
return sld
end
local function ChangeView(tUI)
local fMain = getglobal("VG_MainFrame")
local fStep = getglobal("VG_MainFrame_StepFrame")
local fScroll = getglobal("VG_MainFrame_ScrollFrame")
local nStepScroll = tUI.StepScroll
local bStepFrame = tUI.StepFrameVisible
local bScrollFrame = tUI.ScrollFrameVisible
local nMainFrameHeight = tUI.MainFrameSize.nHeight
if bScrollFrame then
fMain:SetHeight(nMainFrameHeight)
fMain:SetMinResize(320, 320)
fMain:SetMaxResize(640, 640)
else
fMain:SetHeight(nMainFrameHeight*nStepScroll)
fMain:SetMinResize(320, 320*nStepScroll)
fMain:SetMaxResize(640, 640*nStepScroll)
end
if bStepFrame and not bScrollFrame then
fScroll:Hide()
fStep:SetPoint("BOTTOMRIGHT", fMain, "BOTTOMRIGHT", -5, 27)
fStep:Show()
elseif not bStepFrame and bScrollFrame then
fStep:Hide()
fScroll:SetPoint("TOPLEFT", fMain, "TOPLEFT", 5, -23)
fScroll:Show()
elseif bStepFrame and bScrollFrame then
local nH = fMain:GetHeight()
local nGap = (nH - 2 * nStepScroll * nH) / 2
fStep:SetPoint("BOTTOMRIGHT", fMain, "RIGHT", -5, nGap)
fScroll:SetPoint("TOPLEFT", fStep, "BOTTOMLEFT", 0, -2)
fStep:Show()
fScroll:Show()
end
end
obj.tWidgets = {}
-------------------------------
--- Rendering
-------------------------------
--do
-- Addon Main Frame and Title
obj.tWidgets.frame_MainFrame = Render_MF(nil, "VG_MainFrame", tTexture, tUI)
obj.tWidgets.frame_MainFrame.isMoving = nil
obj.tWidgets.frame_MainFrame.isResizing = nil
obj.tWidgets.fs_Title = Render_MFTitle(obj.tWidgets.frame_MainFrame, nil)
-- Close, Settings and About Buttons
obj.tWidgets.button_CloseButton = Render_Button(obj.tWidgets.frame_MainFrame, nil, 16, 16, tTexture.B_CLOSE)
obj.tWidgets.button_CloseButton:SetPoint("TOPRIGHT", obj.tWidgets.frame_MainFrame, "TOPRIGHT", -6, -5)
obj.tWidgets.button_SettingsButton = Render_Button(obj.tWidgets.frame_MainFrame, nil, 20, 20, tTexture.B_OPTION)
obj.tWidgets.button_SettingsButton:SetPoint("BOTTOMRIGHT", obj.tWidgets.frame_MainFrame, "BOTTOMRIGHT", -6, 5)
obj.tWidgets.button_AboutButton = Render_Button(obj.tWidgets.frame_MainFrame, nil, 20, 20, tTexture.B_ABOUT)
obj.tWidgets.button_AboutButton:SetPoint("BOTTOMRIGHT", obj.tWidgets.frame_MainFrame, "BOTTOMRIGHT", -27, 5)
-- Lock Button
if tUI.Locked then
obj.tWidgets.button_LockButton = Render_Button(obj.tWidgets.frame_MainFrame, nil, 16, 16, tTexture.B_LOCKED)
else
obj.tWidgets.button_LockButton = Render_Button(obj.tWidgets.frame_MainFrame, nil, 16, 16, tTexture.B_UNLOCKED)
end
obj.tWidgets.button_LockButton:SetPoint("TOPLEFT", obj.tWidgets.frame_MainFrame, "TOPLEFT", 6, -5)
-- ChangeView Button
obj.tWidgets.button_ChangeViewButton = Render_Button(obj.tWidgets.frame_MainFrame, nil, 16, 16, tTexture.B_FLASH)
obj.tWidgets.button_ChangeViewButton:SetPoint("TOPRIGHT", obj.tWidgets.frame_MainFrame, "TOPRIGHT", -105, -5)
-- Prev and Next Guide Buttons
obj.tWidgets.button_PrevGuideButton = Render_Button(obj.tWidgets.frame_MainFrame, nil, 25, 16, tTexture.B_DOUBLEARROWLEFT)
obj.tWidgets.button_PrevGuideButton:SetPoint("BOTTOMRIGHT", obj.tWidgets.frame_MainFrame, "BOTTOMRIGHT", -75, 7)
obj.tWidgets.button_NextGuideButton = Render_Button(obj.tWidgets.frame_MainFrame, nil, 25, 16, tTexture.B_DOUBLEARROWRIGHT)
obj.tWidgets.button_NextGuideButton:SetPoint("BOTTOMRIGHT", obj.tWidgets.frame_MainFrame, "BOTTOMRIGHT", -50, 7)
-- DropDown Menu, Button, ZoneFrame and ZoneLabel
obj.tWidgets.frame_DropDownMenu = Render_MFDropDownMenu(obj.tWidgets.frame_MainFrame, "VG_MainFrame_DropDownMenu")
obj.tWidgets.frame_DropDownMenu:SetPoint("TOPLEFT", obj.tWidgets.frame_MainFrame, "BOTTOMLEFT", 12, 26)
obj.tWidgets.frame_DropDownMenu:SetPoint("BOTTOMRIGHT", obj.tWidgets.frame_MainFrame, "BOTTOMLEFT", 22, 3)
obj.tWidgets.button_DropDownMenu = Render_Button(obj.tWidgets.frame_DropDownMenu, nil, 16, 16, tTexture.B_DDMRIGHT_DOWN)
obj.tWidgets.button_DropDownMenu:SetPoint("CENTER", obj.tWidgets.frame_DropDownMenu, "LEFT", 3, 0)
obj.tWidgets.button_DropDownMenu:RegisterForClicks("LeftButtonUp", "RightButtonUp")
obj.tWidgets.frame_DropDownMenuZoneFrame = Render_MFDropDownMenuZoneFrame(obj.tWidgets.frame_DropDownMenu, nil, tTexture)
obj.tWidgets.frame_DropDownMenuZoneFrame:SetPoint("TOPLEFT", obj.tWidgets.frame_DropDownMenu, "TOPLEFT", 5, -2)
obj.tWidgets.frame_DropDownMenuZoneFrame:SetPoint("BOTTOMRIGHT", obj.tWidgets.button_PrevGuideButton, "LEFT", -5, -10)
obj.tWidgets.fs_DropDownMenuZone = Render_MFDropDownMenuZoneLabel(obj.tWidgets.frame_DropDownMenuZoneFrame, "VG_MainFrame_DropDownMenuLabel")
-- Pren and Next Step Buttons
obj.tWidgets.button_PrevStepButton = Render_Button(obj.tWidgets.frame_MainFrame, nil, 25, 16, tTexture.B_DOUBLEARROWLEFT)
obj.tWidgets.button_PrevStepButton:SetPoint("TOPRIGHT", obj.tWidgets.frame_MainFrame, "TOPRIGHT", -76, -5)
obj.tWidgets.button_NextStepButton = Render_Button(obj.tWidgets.frame_MainFrame, nil, 25, 16, tTexture.B_DOUBLEARROWRIGHT)
obj.tWidgets.button_NextStepButton:SetPoint("TOPRIGHT", obj.tWidgets.frame_MainFrame, "TOPRIGHT", -26, -5)
-- Step Number Frame & Label
obj.tWidgets.frame_StepNumberFrame = Render_MFStepNumberFrame(obj.tWidgets.frame_MainFrame, nil, 25, 18, tTexture)
obj.tWidgets.frame_StepNumberFrame:SetPoint("TOPRIGHT", obj.tWidgets.frame_MainFrame, "TOPRIGHT", -51, -4)
obj.tWidgets.fs_StepNumber = Render_MFStepNumberLabel(obj.tWidgets.frame_StepNumberFrame, "VG_MainFrame_StepNumberFrameLabel")
-- Step Frame & Label
obj.tWidgets.frame_StepFrame = Render_MFStepFrame(obj.tWidgets.frame_MainFrame, "VG_MainFrame_StepFrame", tTexture, tUI)
obj.tWidgets.frame_StepFrame:SetPoint("TOPLEFT", obj.tWidgets.frame_MainFrame, "TOPLEFT", 5, -23)
-- Uncomment those will just make the frame visible at start, but we call GuideChange just after, so, not needed here
-- see ***
--local fMHeight = obj.tWidgets.fMF:GetHeight()
--local nPer = fMHeight * (1 - tUIoptions.nStepScroll)
--local nGap = nPer - (fMHeight/2)
--obj.tWidgets.frame_StepFrame:SetPoint("BOTTOMRIGHT", obj.tWidgets.frame_MainFrame, "RIGHT", -5, nGap)
obj.tWidgets.fs_StepFrame = Render_MFStepLabel(obj.tWidgets.frame_StepFrame, "VG_MainFrame_StepFrameLabel", tUI)
-- Scroll Frame, ScrollChild and Slider
obj.tWidgets.frame_ScrollFrame = Render_MFScrollFrame(obj.tWidgets.frame_MainFrame, "VG_MainFrame_ScrollFrame", tTexture, tUI)
-- ***
--obj.tWidgets.frame_ScrollFrame:SetPoint("TOPLEFT", obj.tWidgets.frame_StepFrame, "BOTTOMLEFT", 0, -2)
obj.tWidgets.frame_ScrollFrame:SetPoint("BOTTOMRIGHT", obj.tWidgets.frame_MainFrame, "BOTTOMRIGHT", -25, 27)
obj.tWidgets.frame_ScrollFrameChild = Render_MFScrollFrameChild(obj.tWidgets.frame_ScrollFrame, "VG_MainFrame_ScrollFrameChild")
obj.tWidgets.frame_ScrollFrameChild.Entries = {}
obj.tWidgets.frame_ScrollFrameChild.nFSTotalWidth = 0
obj.tWidgets.frame_ScrollFrameChild.nFSTotalHeight = 0
obj.tWidgets.frame_ScrollFrameChild:SetPoint("TOPLEFT", obj.tWidgets.frame_ScrollFrame, "TOPLEFT", 0, 0)
obj.tWidgets.frame_ScrollFrameChild:SetPoint("BOTTOMRIGHT", obj.tWidgets.frame_ScrollFrame, "BOTTOMRIGHT", 0, 0)
obj.tWidgets.slider_ScrollFrameSlider = Render_MFScrollFrameSlider(obj.tWidgets.frame_ScrollFrame, "VG_MainFrame_ScrollFrameSlider")
obj.tWidgets.slider_ScrollFrameSlider:SetPoint("TOPLEFT", obj.tWidgets.frame_ScrollFrame, "TOPRIGHT", 2, -5)
obj.tWidgets.slider_ScrollFrameSlider:SetPoint("BOTTOMLEFT", obj.tWidgets.frame_ScrollFrame, "BOTTOMRIGHT", 2, 5)
--end
-------------------------------
--- UI Events Handling
-------------------------------
do
-- Close Button
obj.tWidgets.button_CloseButton:SetScript("OnClick", function()
local fMain = getglobal("VG_MainFrame")
local fSettings = getglobal("VG_SettingsFrame")
local fAbout = getglobal("VG_AboutFrame")
fMain:Hide()
if fSettings:IsVisible() then
fSettings:Hide()
fSettings.showthis = true
end
if fAbout:IsVisible() then
fAbout:Hide()
end
end)
-- Lock Button
obj.tWidgets.button_LockButton:SetScript("OnClick", function()
local bLocked = tUI.Locked
local frame = getglobal("VG_MainFrame")
if bLocked then
this:SetNormalTexture(tTexture.B_UNLOCKED.NORMAL)
this:SetPushedTexture(tTexture.B_UNLOCKED.PUSHED)
tUI.Locked = false
oSettings:SetSettingsUI(tUI)
frame:SetMovable(true)
frame:SetResizable(true)
else
this:SetNormalTexture(tTexture.B_LOCKED.NORMAL)
this:SetPushedTexture(tTexture.B_LOCKED.PUSHED)
tUI.Locked = true
oSettings:SetSettingsUI(tUI)
frame:SetMovable(false)
frame:SetResizable(false)
end
end)
-- Settings Button
obj.tWidgets.button_SettingsButton:SetScript("OnClick", function()
local fSettings = getglobal("VG_SettingsFrame")
if fSettings:IsVisible() then
fSettings:Hide()
else
fSettings:Show()
end
end)
-- About Button
obj.tWidgets.button_AboutButton:SetScript("OnClick", function()
local fAbout = getglobal("VG_AboutFrame")
if fAbout:IsVisible() then
fAbout:Hide()
else
fAbout:Show()
end
end)
-- Change View Button
obj.tWidgets.button_ChangeViewButton:SetScript("OnClick", function()
local fChild = getglobal("VG_MainFrame_ScrollFrameChild")
local bStepFrame = tUI.StepFrameVisible
local bScrollFrame = tUI.ScrollFrameVisible
local nMainFrameHeight = tUI.MainFrameSize.nHeight
if bStepFrame and bScrollFrame then
bStepFrame = true
bScrollFrame = false
elseif bStepFrame and not bScrollFrame then
bStepFrame = false
bScrollFrame = true
else
bStepFrame = true
bScrollFrame = true
end
tUI.StepFrameVisible = bStepFrame
tUI.ScrollFrameVisible = bScrollFrame
oSettings:SetSettingsUI(tUI)
ChangeView(tUI)
--UI.SetSliderMinMax(fChild.nFSTotalHeight)
end)
-- Prev and Next Guide Buttons
obj.tWidgets.button_PrevGuideButton:SetScript("OnClick", function()
--Dv(" --- Prev Guide ---")
oDisplay:PrevGuide()
obj:RefreshData()
end)
obj.tWidgets.button_NextGuideButton:SetScript("OnClick", function()
--Dv(" --- Next Guide ---")
oDisplay:NextGuide()
obj:RefreshData()
end)
-- Prev and Next Step Buttons
obj.tWidgets.button_PrevStepButton:SetScript("OnClick", function()
--Dv(" --- Prev Step ---")
oDisplay:PrevStep()
obj:RefreshData()
end)
obj.tWidgets.button_NextStepButton:SetScript("OnClick", function()
--Dv(" --- Next Step ---")
oDisplay:NextStep()
obj:RefreshData()
end)
-- DropDown Menu
obj.tWidgets.button_DropDownMenu:SetScript("OnClick", function()
ToggleDropDownMenu(1, nil, obj.tWidgets.frame_DropDownMenu, obj.tWidgets.button_DropDownMenu, 0, 0);
end)
end
-------------------------------
--- External Methods
-------------------------------
obj.RefreshStepFrameLabel = function(self)
local s = oDisplay:GetStepLabel()
local fs = obj.tWidgets.fs_StepFrame
fs:SetText(s)
end
obj.RefreshStepNumberFrameLabel = function(self)
local t = oDisplay:GetCurrentStep()
local fs = obj.tWidgets.fs_StepNumber
fs:SetText(t)
end
obj.RefreshDropDownMenuLabel = function(self)
local t = oDisplay:GetGuideTitle()
local fs = obj.tWidgets.fs_DropDownMenuZone
fs:SetText(t)
end
obj.ScrollFrameChildEntriesCreate = function(self, tEntries)
local UI = oSettings:GetSettingsUI()
local tColF = UI.StepFrameColor
local tColT = UI.ScrollFrameTextColor
local sfc = obj.tWidgets.frame_ScrollFrameChild
sfc:Hide()
t = {}
for k,_ in ipairs(tEntries) do
local sh
sh = CreateFrame("SimpleHTML", "VG_shEntry"..k, sfc)
sh:Hide()
sh:EnableMouse(true)
sh:SetFont(tTexture.FONT_PATH, tTexture.FONT_HEIGHT)
sh:SetTextColor(tColT.nR, tColT.nG, tColT.nB, tColT.nA)
sh:SetBackdrop(tTexture.BACKDROPSH)
sh:SetBackdropColor(.1, .1, .1, .5)
sh:SetJustifyH("LEFT")
sh:SetJustifyV("TOP")
if k > 1 then
sh:SetPoint("TOPLEFT", t[k-1], "BOTTOMLEFT", 0, -tTexture.SCROLLFRAME_PADDING)
else
sh:SetPoint("TOPLEFT", sfc, "TOPLEFT", 5, -15)
end
sh:SetScript("OnEnter", function()
this:SetTextColor(.91, .91, .91, .99)
this:SetBackdropColor(.3, .3, .3, .7)
local tx = tonumber(strsub(this:GetName(), 11))
end)
sh:SetScript("OnLeave", function()
local UI = oSettings:GetSettingsUI()
local tColF = UI.StepFrameColor
local step = oDisplay:GetCurrentStep()
local tx = tonumber(strsub(this:GetName(), 11))
this:SetTextColor(tColT.nR, tColT.nG, tColT.nB, tColT.nA)
if tx == step then
this:SetBackdropColor(tColF.nR, tColF.nG, tColF.nB, tColF.nA)
else
this:SetBackdropColor(.1, .1, .1, .5)
end
end)
sh:SetScript("OnMouseUp", function()
if arg1 == "LeftButton" then
local step = oDisplay:GetCurrentStep()
this:GetParent().Entries[step]:SetBackdropColor(.1, .1, .1, .5)
local tx = strsub(this:GetName(), 11)
oDisplay:StepByID(tonumber(tx))
obj:RefreshData(false)
end
end)
t[k] = sh
end
sfc:Show()
return t
end
obj.ScrollFrameChildEntriesHide = function(self)
for _,v in ipairs(obj.tWidgets.frame_ScrollFrameChild.Entries) do
v:Hide()
end
end
-- not needed?
obj.ScrollFrameChildEntriesDelete = function(self)
for k,_ in ipairs(obj.tWidgets.frame_ScrollFrameChild.Entries) do
obj.tWidgets.frame_ScrollFrameChild.Entries[k] = nil
end
end
-- not needed?
obj.ScrollFrameChildEntriesCount = function(self)
local count = 0
for _,_ in ipairs(obj.tWidgets.frame_ScrollFrameChild.Entries) do
count = count + 1
end
return count
end
obj.RefreshScrollFrame = function(self)
local function ScrollFrameChildHeight(tTexture, nWidth, tEntries)
tEntries.textWidth = {}
tEntries.textHeight = {}
local tHeight = 0
local frame = CreateFrame("Frame", nil, nil)
local fs = frame:CreateFontString(nil, "ARTWORK", tTexture.FONT)
fs:SetFont(tTexture.FONT_PATH, tTexture.FONT_HEIGHT)
nWidth = math.floor(nWidth)
for k,v in ipairs(tEntries) do
fs:SetText(tEntries[k])
tEntries.textWidth[k] = fs:GetWidth()
local val = math.floor((tEntries.textWidth[k]) / (nWidth))
tEntries.textHeight[k] = (val + 1) * tTexture.FONT_HEIGHT + 5
tHeight = tHeight + tEntries.textHeight[k] + tTexture.SCROLLFRAME_PADDING
end
return tHeight, tEntries
end
local fMain = obj.tWidgets.frame_MainFrame
local fScroll = obj.tWidgets.frame_ScrollFrame
local fChild = obj.tWidgets.frame_ScrollFrameChild
local fSlider = obj.tWidgets.slider_ScrollFrameSlider
local mainFrameWidth = fMain:GetWidth()
local scrollFrameWidth = fScroll:GetWidth()
local s = fScroll:GetEffectiveScale()
scrollFrameWidth = scrollFrameWidth * (1/s)
obj:ScrollFrameChildEntriesHide()
local t = {}
t = oDisplay:GetScrollFrameDisplay()
fChild.Entries = obj:ScrollFrameChildEntriesCreate(t)
-- inside t we've the "lenght" of the rendered string
-- We need this to get how many lines there are in every
-- ScrollFrameChildEntries entity
local totalHeight = 0
totalHeight, t = ScrollFrameChildHeight(tTexture, scrollFrameWidth, t)
-- let's see if we need a slider or not....
-- ...ohh...and let's set the slider object accordingly
-- we use the totalHeight from plain string to decide this...
local nFrameH = nil
local sliderVisible = nil
local shWidth = nil
nFrameH = fScroll:GetHeight() + 5
if totalHeight - nFrameH + 10 > 0 then
fSlider:SetMinMaxValues(0, totalHeight - nFrameH + 10)
fSlider:Show()
fScroll:SetPoint("BOTTOMRIGHT", fMain, "BOTTOMRIGHT", -25, 27)
sliderVisible = true
shWidth = mainFrameWidth - 40
else
fSlider:SetMinMaxValues(0, 0)
fSlider:SetValue(0)
fSlider:Hide()
fScroll:SetPoint("BOTTOMRIGHT", fMain, "BOTTOMRIGHT", -5, 27)
sliderVisible = false
shWidth = mainFrameWidth - 40 + 20
end
-- we now zero totalHeight, and we rebuild it, frameXframe, to get the total
-- ScrollFrameChild total height
totalHeight = 0
local UI = oSettings:GetSettingsUI()
local tColF = UI.StepFrameColor
for k, v in pairs(fChild.Entries) do
if k <= oDisplay:GetCurrentStepCount() then
if not sliderVisible then
local val = math.floor(t.textWidth[k] / (scrollFrameWidth + 20))
t.textHeight[k] = (val+1) * tTexture.FONT_HEIGHT + 5
end
totalHeight = totalHeight + t.textHeight[k] + tTexture.SCROLLFRAME_PADDING
v:SetWidth(shWidth)
v:SetHeight(t.textHeight[k])
v:SetText(t[k])
v:Show()
v.scrollFrameWidth = scrollFrameWidth
v.textHeight = t.textHeight[k]
v.textWidth = t.textWidth[k]
if k == oDisplay:GetCurrentStep() then
v:SetBackdropColor(tColF.nR, tColF.nG, tColF.nB, tColF.nA)
else
v:SetBackdropColor(.1, .1, .1, .5)
end
else
v:Hide()
v = nil
end
end
totalHeight = totalHeight - tTexture.SCROLLFRAME_PADDING
fChild:SetHeight(totalHeight)
fScroll:UpdateScrollChildRect()
end
obj.RefreshMetaMap = function(self)
local tMetaMap = oSettings:GetSettingsMetaMap()
-- mode can be:
-- nil == no MetaMap
-- 1 = Notes Enabled
-- 2 = BWP Enabled
-- 3 = Notes & BWP Enabled
local mode
if tMetaMap.Presence then
local mode
if (tMetaMap.NotesPresence and tMetaMap.NotesEnable) and
not (tMetaMap.BWPPresence and tMetaMap.BWPEnable) then
mode = 1
elseif not (tMetaMap.NotesPresence and tMetaMap.NotesEnable) and
(tMetaMap.BWPPresence and tMetaMap.BWPEnable) then
mode = 2
elseif (tMetaMap.NotesPresence and tMetaMap.NotesEnable) and
(tMetaMap.BWPPresence and tMetaMap.BWPEnable) then
mode = 3
else
mode = nil
end
local title = oDisplay:GetGuideTitle()
local step = oDisplay:GetCurrentStep()
local label = oDisplay:GetStepLabel()
local t = oDisplay:GetCurrentStepInfo()
obj:SetMetaMapDestination(t.x, t.y, t.zone, title, step, label, mode)
end
end
obj.RefreshData = function(self)
obj:RefreshStepFrameLabel()
obj:RefreshStepNumberFrameLabel()
obj:RefreshDropDownMenuLabel()
obj:RefreshDropDownMenuLabel()
obj:RefreshScrollFrame()
obj:RefreshMetaMap()
end
local function AddToDDM(nLevel, sType, sLabel, nID)
local info = {}
info.isTitle = false
info.keepShownOnClick = false
info.disabled = nil
info.notCheckable = true --1?
info.text = sLabel
info.value = sLabel
info.arg1 = nID
info.arg2 = sLabel
if sType == "s" then
info.hasArrow = true
info.func = this.UncheckHack
else
info.hasArrow = false --nil?
info.func = function(arg1, arg2)
oDisplay:GuideByID(arg1)
obj:RefreshData()
CloseDropDownMenus()
end
end
UIDropDownMenu_AddButton(info, nLevel)
end
local function DropDown_Init(level)
local tDDM = oDisplay:RetriveTableDDM()
local tCharInfo = oSettings:GetSettingsCharInfo()
local info = {}
level = level or 1
if level == 1 then
-- Title
info.isTitle = 1
info.text = "Vanilla Guide"
info.notCheckable = true
UIDropDownMenu_AddButton(info, level)
-- Voices from Table DDM
for k,v in ipairs(tDDM.lvl1) do
AddToDDM(level, v[1], v[2], v.id)
end
-- Close menu item
info.text = CLOSE--"Close"
info.keepShownOnClick = false
info.disabled = nil
info.hasArrow = nil
info.notCheckable = 1
info.value = nil
info.func = function()
CloseDropDownMenus()
end
UIDropDownMenu_AddButton(info, level)
elseif level == 2 then
local s = UIDROPDOWNMENU_MENU_VALUE
if s == "Starting Zones" then
if tCharInfo.Faction == "Horde" then
s = "[H] " .. s
else
s = "[A] " .. s
end
end
for k,v in ipairs(tDDM.lvl2[s]) do
AddToDDM(level, v[1], v[2], v.id)
end
elseif level == 3 then
local s = UIDROPDOWNMENU_MENU_VALUE
-- to handle both factions, we check if there's a 0 at the 4th place!
-- so that we won't get in the way of Starting Zones
if string.find(s, "0", 4) then
if tCharInfo.Faction == "Horde" then
s = "[H] " .. s
else
s = "[A] " .. s
end
end
for k,v in ipairs(tDDM.lvl3[s]) do
AddToDDM(level, v[1], v[2], v.id)
end
end
end
obj.InitializeDDM = function(self)
UIDropDownMenu_Initialize(obj.tWidgets.frame_DropDownMenu, DropDown_Init)
end
obj.SetMetaMapDestination = function(self, nX, nY, sZone, title, step, label, mode)
-- mode can be:
-- nil == no MetaMap
-- 1 = Notes Enabled
-- 2 = BWP Enabled
-- 3 = Notes & BWP Enabled
if nX and nY and sZone and MetaMap_GetCurrentMapInfo then
local continent, zone, _, mapName = MetaMap_GetCurrentMapInfo()
local normX = nX/100
local normY = nY/100
if mode == 2 or mode == 3 then
BWP_Destination = {}
BWP_Destination.name = sZone
BWP_Destination.x = normX
BWP_Destination.y = normY
BWP_Destination.zone = MetaMap_ZoneNames[continent][zone]
if sZone == mapName then
local frame = getglobal("BWPDestText")
frame:SetText("["..BWP_Destination.name.."] - [" .. BWP_Destination.x*100 .. "," .. BWP_Destination.y*100 .. "]")
local frame = getglobal("BWPDistanceText")
frame:SetText(BWP_GetDistText())
local frame = getglobal("BWP_DisplayFrame")
frame:Show()
end
end
if mode == 1 or mode == 3 then
if sZone == mapName then
-- function MetaMapNotes_AddNewNote(continent, zone,
-- xPos, yPos,
-- name, inf1, inf2,
-- creator,
-- icon,
-- ncol, in1c, in2c, mininote)
--
-- Colors
-- 0 "Yellow" (standard WoW Text Color?)
-- 1 "Dark Yellow"
-- 2 "Red"
-- 3 "Dark Red"
-- 4 "Green"
-- 5 "Dark Green"
-- 6 "Blu"
-- 7 "Dark Blu"
-- 8 "White"
-- 9 "Dark White"
-- Icon can be from 1 to 9
-- mininote can be 0,1,2 everything else, default to 0 (even nil)
-- 0 - MapNote only
-- 1 - MapNote & mininote
-- 2 - mininote only
MetaMapNotes_AddNewNote(continent, zone, normX, normY,
"VG: Step[" .. step .. "] " .. title,
mapName, label, "VanillaGuide", 6, 6, 9, 8, 1)
end
end
else
if BWP_ClearDest then
BWP_ClearDest()
local frame = getglobal("BWP_DisplayFrame")
frame:Hide()
end
end
end
-------------------------------
--- Initialization
-------------------------------
do
ChangeView(tUI)
obj:InitializeDDM()
obj.tWidgets.frame_ScrollFrame:SetScrollChild(obj.tWidgets.frame_ScrollFrameChild)
obj:RefreshData(true)
obj.tWidgets.frame_MainFrame:SetAlpha(tUI.Opacity)
obj.tWidgets.frame_MainFrame:SetScale(tUI.Scale)
obj.tWidgets.frame_MainFrame:SetFrameStrata(tUI.Layer)
end
return obj
end
Dv(" VGuide Frame_MainFrame.lua End")