From 37ab40d742d5317cf9f257f9a3af3f1d6e275d2a Mon Sep 17 00:00:00 2001 From: Jim Whitehead Date: Fri, 27 Jan 2017 09:10:47 +0100 Subject: [PATCH] Update for 7.1 --- WowLua.lua | 1931 ++++++++++++++++++++++++++++++------------------------------ WowLua.toc | 30 +- WowLua.xml | 6 +- 3 files changed, 982 insertions(+), 985 deletions(-) diff --git a/WowLua.lua b/WowLua.lua index 4c685bd..e48268a 100644 --- a/WowLua.lua +++ b/WowLua.lua @@ -1,969 +1,962 @@ ---[[-------------------------------------------------------------------------- - Copyright (c) 2007, James Whitehead II - All rights reserved. - - WowLua is an interactive interpreter for World of Warcraft ---------------------------------------------------------------------------]]-- - -local addon = ... -local version = GetAddOnMetadata("WowLua", "Version") or "SVN" -WowLua = { - VERSION = "WowLua v" .. version .. " Interactive Interpreter", - queue = {}, - queuePos = 0, -} -local L = WowLuaLocals - -WowLua_DB = { - pages = { - [1] = {name = format(L.NEW_PAGE_TITLE, 1), content = "", untitled = true} - }, - currentPage = 1, - untitled = 2, - fontSize = 14, -} - -local DB = {} - -local eframe = CreateFrame("Frame") -eframe:RegisterEvent("ADDON_LOADED") -eframe:SetScript("OnEvent", function(self, event, ...) - if event == "ADDON_LOADED" then - local arg1 = ... - if arg1 == addon then - if WowLua_DB.fontSize then - local file, height, flags = WowLuaMonoFont:GetFont() - WowLuaMonoFont:SetFont(file, WowLua_DB.fontSize, flags) - end - end - end -end) - -function WowLua:CreateNewPage() - local name = format(L.NEW_PAGE_TITLE, WowLua_DB.untitled) - WowLua_DB.untitled = WowLua_DB.untitled + 1 - local entry = { - name = name, - content = "", - untitled = true - } - table.insert(WowLua_DB.pages, entry) - WowLua_DB.currentPage = #WowLua_DB.pages - return entry, #WowLua_DB.pages -end - -function WowLua:GetNumPages() - return #WowLua_DB.pages -end - -function WowLua:SavePage(num, content) - local entry = WowLua_DB.pages[num] - entry.content = content -end - -function WowLua:RenamePage(num, name) - local entry = WowLua_DB.pages[num] - entry.name = name - entry.untitled = nil -end - -function WowLua:DeletePage(num) - table.remove(WowLua_DB.pages, num) -end - -function WowLua:LockPage(num, locked) - local entry = WowLua_DB.pages[num] - entry.locked = locked -end - -function WowLua:IsPageLocked(num) - local entry = WowLua_DB.pages[num] - return entry.locked -end - -function WowLua:GetCurrentPage() - local page = WowLua_DB.currentPage - return page, WowLua_DB.pages[page] -end - -function WowLua:SelectPage(id) - if type(id) == "number" then - WowLua_DB.currentPage = id - return WowLua_DB.pages[id], id - elseif type(id) == "string" then - for idx,entry in ipairs(WowLua_DB.pages) do - if entry.name == id then - WowLua_DB.currentPage = idx - return entry, idx - end - end - end -end - -local function wowpad_print(...) - local out = "" - for i=1,select("#", ...) do - -- Comma seperate values - if i > 1 then - out = out .. ", " - end - - out = out .. tostring(select(i, ...)) - end - WowLuaFrameOutput:AddMessage("|cff999999" .. out .. "|r") -end - -if not print then - print = wowpad_print -end - -local function processSpecialCommands(txt) - if txt == L.RELOAD_COMMAND then - ReloadUI() - return true - elseif txt == L.RESET_COMMAND then - WowLuaFrame:ClearAllPoints() - WowLuaFrame:SetPoint("CENTER") - WowLuaFrame:SetWidth(640) - WowLuaFrame:SetHeight(512) - WowLuaFrameResizeBar:ClearAllPoints() - WowLuaFrameResizeBar:SetPoint("TOPLEFT", WowLuaFrame, "BOTTOMLEFT", 14, 100) - WowLuaFrameResizeBar:SetPoint("TOPRIGHT", WowLuaFrame, "BOTTOMRIGHT", 0, 100) - return true - end -end - -function WowLua:ProcessLine(text) - WowLuaFrameCommandEditBox:SetText("") - - if processSpecialCommands(text) then - return - end - - -- escape any color codes: - local output = text:gsub("\124", "\124\124") - - WowLuaFrameOutput:AddMessage(WowLuaFrameCommandPrompt:GetText() .. output) - - WowLuaFrameCommandEditBox:AddHistoryLine(output) - - -- If they're using "= value" syntax, just print it - text = text:gsub("^%s*=%s*(.+)", "print(%1)") - - -- Store this command into self.cmd in case we have multiple lines - if self.cmd then - self.cmd = self.cmd .. "\n" .. text - self.orig = self.orig .. "\n" .. text - else - self.cmd = text - self.orig = text - end - - -- Trim the command before we run it - self.cmd = string.trim(self.cmd) - - -- Process the current command - local func,err = loadstring(self.cmd) - - -- Fail to compile? Give it a return - -- Check to see if this just needs a return in front of it - if not func then - local newfunc,newerr = loadstring("print(" .. self.cmd .. ")") - if newfunc then - func,err = newfunc,newerr - end - end - - if not func then - -- Check to see if this is just an unfinished block - if err:sub(-7, -1) == "''" then - -- Change the prompt - WowLuaFrameCommandPrompt:SetText(">> ") - return - end - - WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r") - self.cmd = nil - WowLuaFrameCommandPrompt:SetText("> ") - else - -- Make print a global function - local old_print = print - print = wowpad_print - - -- Call the function - local succ,err = pcall(func) - - -- Restore the value of print - print = old_print - - if not succ then - WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r") - end - - self.cmd = nil - WowLuaFrameCommandPrompt:SetText("> ") - end -end - -function WowLua:RunScript(text) - -- escape any color codes: - local output = text:gsub("\124", "\124\124") - - if text == L.RELOAD_COMMAND then - ReloadUI() - end - - -- If they're using "= value" syntax, just print it - text = text:gsub("^%s*=%s*(.+)", "print(%1)") - - -- Trim the command before we run it - text = string.trim(text) - - -- Process the current command - local func,err = loadstring(text, "WowLua") - - if not func then - WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r") - return false, err - else - -- Make print a global function - local old_print = print - print = wowpad_print - - -- Call the function - local succ,err = pcall(func) - - -- Restore the value of print - print = old_print - - if not succ then - WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r") - return false, err - end - end - - return true -end - -function WowLua:Initialize(frame) - WowLua:OnSizeChanged(frame) - table.insert(UISpecialFrames, "WowLuaFrame") - PlaySound("igMainMenuOpen"); - self:UpdateButtons() -end - -function WowLua:Button_OnEnter(frame) - GameTooltip:SetOwner(frame, "ANCHOR_BOTTOM"); - local operation = frame:GetName():match("WowLuaButton_(.+)"):gsub("_", " ") - local tooltip = L.TOOLTIPS[operation] - GameTooltip:SetText(tooltip and tooltip.name or operation) - if tooltip then - GameTooltip:AddLine(tooltip.text, 1, 1, 1) - end - GameTooltip:Show(); -end - -function WowLua:Button_OnLeave(frame) - GameTooltip:Hide() -end - -function WowLua:Button_OnClick(button) - local operation = button:GetName():match("WowLuaButton_(.+)") - if operation == "New" then - WowLua:Button_New(button) - elseif operation == "Open" then - WowLua:Button_Open(button) - elseif operation == "Save" then - WowLua:Button_Save(button) - elseif operation == "Undo" then - WowLua:Button_Undo(button) - elseif operation == "Redo" then - WowLua:Button_Redo(button) - elseif operation == "Delete" then - WowLua:Button_Delete(button) - elseif operation == "Lock" then - WowLua:Button_Lock(button) - elseif operation == "Unlock" then - WowLua:Button_Unlock(button) - elseif operation == "Previous" then - WowLua:Button_Previous(button) - elseif operation == "Next" then - WowLua:Button_Next(button) - elseif operation == "Run" then - WowLua:Button_Run(button) - elseif operation == "Config" then - WowLua:Button_Config(button) - elseif operation == "Close" then - WowLua:Button_Close(button) - end -end - -function WowLua:DebugQueue() - print("Current queue position: " .. self.queuePos) - for k,v in pairs(self.queue) do - print(k, v:sub(1, 20)) - end -end - -function WowLua:FlushQueue() - table.wipe(self.queue) - self.queuePos = 0 -end - -function WowLua:Queue(text) - if #self.queue == 0 then - local page, entry = WowLua:GetCurrentPage() - self.queue[1] = entry.content - self.queuePos = 1 - end - - if text ~= self.queue[self.queuePos] then - self.queuePos = self.queuePos+1 - self.queue[self.queuePos] = text - for i=self.queuePos+1,#self.queue do - self.queue[i]=nil - end - end -end - -function WowLua:GetUndoPage() - -- Before we do any "Undo", queue the current text - WowLua:Queue(WowLuaFrameEditBox:GetText()) - - local item = self.queue[self.queuePos-1] - if item then - self.queuePos = self.queuePos-1 - return item - end - - return self.queue[self.queuePos] -end - -function WowLua:GetRedoPage() - local item = self.queue[self.queuePos+1] - if item then - self.queuePos = self.queuePos+1 - return item - end - return self.queue[self.queuePos] -end - -function WowLua:Button_New(button) - if self:IsModified() then - -- Display the unsaved changes dialog - local dialog = StaticPopup_Show("WOWLUA_UNSAVED") - dialog.data = "Button_New" - return - end - - -- Create a new page and display it - local entry, num = WowLua:CreateNewPage() - - WowLuaFrameEditBox:SetText(entry.content) - WowLua:UpdateButtons() - WowLua:SetTitle(false) - WowLua:FlushQueue() -end - -function WowLua:Button_Open(button) - ToggleDropDownMenu(1, nil, WowLuaOpenDropDown, button:GetName(), 0, 0) -end - -function WowLua:OpenDropDownOnLoad(frame) - UIDropDownMenu_Initialize(frame, self.OpenDropDownInitialize) -end - -local function dropDownFunc(button, page) - WowLua:GoToPage(page) -end - -function WowLua.OpenDropDownInitialize() - UIDropDownMenu_AddButton{ - text = L.OPEN_MENU_TITLE, - isTitle = 1 - } - - for page, entry in ipairs(WowLua_DB.pages) do - UIDropDownMenu_AddButton{ - text = entry.name, - func = dropDownFunc, - arg1 = page - } - end -end - -StaticPopupDialogs["WOWLUA_SAVE_AS"] = { - text = L.SAVE_AS_TEXT, - button1 = TEXT(OKAY), - button2 = TEXT(CANCEL), - OnAccept = function(self) - local name = self:GetName().."EditBox" - local button = _G[name] - local text = button:GetText() - WowLua:RenamePage(WowLua.save_as, text) - WowLua:SetTitle() - end, - timeout = 0, - whileDead = 1, - exclusive = 1, - showAlert = 1, - hideOnEscape = 1, - hasEditBox = 1, - maxLetters = 32, - OnShow = function(self) - getglobal(self:GetName().."Button1"):Disable(); - local editBox = _G[self:GetName().."EditBox"] - editBox:SetFocus() - editBox:SetText(WowLua.save_as_name) - editBox:HighlightText() - end, - OnHide = function(self) - local activeWindow = ChatEdit_GetActiveWindow() - if activeWindow then - activeWindow:SetText("") - end - end, - EditBoxOnEnterPressed = function(self) - if _G[self:GetParent():GetName().."Button1"]:IsEnabled() == 1 then - local name = self:GetParent():GetName().."EditBox" - local button = _G[name] - local text = button:GetText() - WowLua:RenamePage(WowLua.save_as, text) - WowLua:SetTitle() - self:GetParent():Hide(); - end - end, - EditBoxOnTextChanged = function (self) - local editBox = _G[self:GetParent():GetName().."EditBox"]; - local txt = editBox:GetText() - if #txt > 0 then - _G[self:GetParent():GetName().."Button1"]:Enable(); - else - _G[self:GetParent():GetName().."Button1"]:Disable(); - end - end, - EditBoxOnEscapePressed = function(self) - self:GetParent():Hide(); - ClearCursor(); - end -} - -function WowLua:Button_Save(button) - if button and IsShiftKeyDown() then - -- Show the static popup for renaming - local page, entry = self:GetCurrentPage() - WowLua.save_as = page - WowLua.save_as_name = entry.name - StaticPopup_Show("WOWLUA_SAVE_AS", entry.name) - return - else - local text = WowLuaFrameEditBox:GetText() - local page = self:GetCurrentPage() - self:SavePage(page, text) - self:UpdateButtons() - self:SetTitle(false) - WowLua:Queue(text) - end -end - -function WowLua:Button_Undo(button) - local page, entry = self:GetCurrentPage() - local undo = WowLua:GetUndoPage() - WowLuaFrameEditBox:SetText(undo or entry.content) -end - -function WowLua:Button_Redo(button) - local page, entry = self:GetCurrentPage() - local redo = WowLua:GetRedoPage() - WowLuaFrameEditBox:SetText(redo) -end - -function WowLua:Button_Delete(button) - if self:IsModified() then - -- Display the unsaved changes dialog - local dialog = StaticPopup_Show("WOWLUA_UNSAVED") - dialog.data = "Button_Delete" - return - end - - local page, entry = self:GetCurrentPage() - if self:GetNumPages() == 1 then - self:Button_New() - self:Button_Previous() - end - - self:DeletePage(page) - - if page > 1 then page = page - 1 end - local entry = self:SelectPage(page) - WowLuaFrameEditBox:SetText(entry.content) - self:UpdateButtons() - self:SetTitle(false) -end - -function WowLua:Button_Lock(button) - local id = self:GetCurrentPage() - self:LockPage(id, true) - self:UpdateButtons() -end - -function WowLua:Button_Unlock(button) - local id = self:GetCurrentPage() - self:LockPage(id, false) - self:UpdateButtons() -end - -StaticPopupDialogs["WOWLUA_UNSAVED"] = { - text = L.UNSAVED_TEXT, - button1 = TEXT(OKAY), - button2 = TEXT(CANCEL), - OnAccept = function(self) - local page,entry = WowLua:GetCurrentPage() - WowLuaFrameEditBox:SetText(entry.content) - local action = self:GetParent().data - if type(action) == "string" then - WowLua[action](WowLua) - else - WowLua:GoToPage(self:GetParent().data) - end - end, - timeout = 0, - whileDead = 1, - exclusive = 1, - showAlert = 1, - hideOnEscape = 1, - EditBoxOnEscapePressed = function(self) - self:GetParent():Hide(); - ClearCursor(); - end -} - -function WowLua:Button_Previous() - self:GoToPage(self:GetCurrentPage() - 1) -end - -function WowLua:Button_Next() - self:GoToPage(self:GetCurrentPage() + 1) -end - -function WowLua:GoToPage(page) - if self:IsModified() then - -- Display the unsaved changes dialog - local dialog = StaticPopup_Show("WOWLUA_UNSAVED") - dialog.data = page - return - end - - local entry = self:SelectPage(page) - if not entry then - return - end - - WowLuaFrameEditBox:SetText(entry.content) - self:UpdateButtons() - self:SetTitle(false) - WowLua:FlushQueue() -end - -function WowLua:UpdateButtons() - local current = self:GetCurrentPage() - local max = self:GetNumPages() - - if current == 1 then - WowLuaButton_Previous:Disable() - else - WowLuaButton_Previous:Enable() - end - - if current == max then - WowLuaButton_Next:Disable() - else - WowLuaButton_Next:Enable() - end - - self.indent.indentEditbox(WowLuaFrameEditBox) - - if self:IsPageLocked(current) then - WowLuaButton_Unlock:Show() - WowLuaButton_Lock:Hide() - WowLuaButton_Delete:Disable() - WowLuaFrameEditBox:SetScript("OnTextChanged", self.lockedTextChanged) - else - WowLuaButton_Unlock:Hide() - WowLuaButton_Lock:Show() - WowLuaButton_Delete:Enable() - WowLuaFrameEditBox:SetScript("OnTextChanged", self.unlockedTextChanged) - end -end - -function WowLua.lockedTextChanged(box) - if WowLua.reverting then - WowLua.reverting = false - else - WowLua.reverting = true - local entry = select(2, WowLua:GetCurrentPage()) - local pos = WowLua.lastCursorPos - box:SetText(entry.content) - WowLua.indent.indentEditbox(WowLuaFrameEditBox) - if pos then - box:SetCursorPosition(pos) - end - end -end - -function WowLua:Button_Run() - local text = WowLuaFrameEditBox:GetText() - - -- Run the script, if there is an error then highlight it - if text then - -- Add the current state of the page to the queue - WowLua:Queue(text) - - local succ,err = WowLua:RunScript(text) - if not succ then - local chunkName,lineNum = err:match("(%b[]):(%d+):") - lineNum = tonumber(lineNum) - WowLua:UpdateLineNums(lineNum) - - -- Highlight the text in the editor by finding the char of the line number we're on - text = WowLua.indent.coloredGetText(WowLuaFrameEditBox) - - local curLine,start = 1,1 - while curLine < lineNum do - local s,e = text:find("\n", start) - start = e + 1 - curLine = curLine + 1 - end - - local nextLine = select(2, text:find("\n", start)) - - WowLuaFrameEditBox:SetFocus() - WowLuaFrameEditBox:SetCursorPosition(start - 1) - end - end -end - -function WowLua:Button_Config() - InterfaceOptionsFrame_OpenToCategory("WowLua") -end - -function WowLua:Button_Close() - if self:IsModified() then - -- Display the unsaved changes dialog - local dialog = StaticPopup_Show("WOWLUA_UNSAVED") - dialog.data = "Button_Close" - return - end - - HideUIPanel(WowLuaFrame) -end - -function WowLua:IsModified() - local page,entry = self:GetCurrentPage() - local orig = entry.content - local current = WowLuaFrameEditBox:GetText(true) - return orig ~= current -end - -function WowLua:IsUntitled() - local page, entry = self:GetCurrentPage() - return entry.untitled -end - -function WowLua:SetTitle(modified) - local page,entry = self:GetCurrentPage() - WowLuaFrameTitle:SetFormattedText("%s%s - WowLua Editor", entry.name, self:IsModified() and "*" or "") -end - -function WowLua:OnSizeChanged(frame) - -- The first graphic is offset 13 pixels to the right - local width = frame:GetWidth() - 13 - local bg2w,bg3w,bg4w = 0,0,0 - - -- Resize bg2 up to 256 width - local bg2w = width - 256 - if bg2w > 256 then - bg3w = bg2w - 256 - bg2w = 256 - end - - if bg3w > 256 then - bg4w = bg3w - 256 - bg3w = 256 - end - - local bg2 = WowLuaFrameBG2 - local bg3 = WowLuaFrameBG3 - local bg4 = WowLuaFrameBG4 - - if bg2w > 0 then - bg2:SetWidth(bg2w) - bg2:SetTexCoord(0, (bg2w / 256), 0, 1) - bg2:Show() - else - bg2:Hide() - end - - if bg3w and bg3w > 0 then - bg3:SetWidth(bg3w) - bg3:SetTexCoord(0, (bg3w / 256), 0, 1) - bg3:Show() - else - bg3:Hide() - end - - if bg4w and bg4w > 0 then - bg4:SetWidth(bg4w) - bg4:SetTexCoord(0, (bg4w / 256), 0, 1) - bg4:Show() - else - bg4:Hide() - end - - if WowLuaFrameResizeBar and false then - local parent = WowLuaFrameResizeBar:GetParent() - local cursorY = select(2, GetCursorPosition()) - local newPoint = select(5, WowLuaFrameResizeBar:GetPoint()) - local maxPoint = parent:GetHeight() - 175; - - if newPoint < 100 then - newPoint = 100 - elseif newPoint > maxPoint then - newPoint = maxPoint - end - - WowLuaFrameResizeBar:ClearAllPoints() - WowLuaFrameResizeBar:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", 14, newPoint) - WowLuaFrameResizeBar:SetPoint("TOPRIGHT", parent, "BOTTOMRIGHT", 0, newPoint) - end -end - -function WowLua:ResizeBar_OnMouseDown(frame, button) - frame.cursorStart = select(2, GetCursorPosition()) - frame.anchorStart = select(5, frame:GetPoint()) - frame:SetScript("OnUpdate", function(...) WowLua:ResizeBar_OnUpdate(...) end) -end - -function WowLua:ResizeBar_OnMouseUp(frame, button) - frame:SetScript("OnUpdate", nil) -end - -function WowLua:ResizeBar_OnUpdate(frame, elapsed) - local parent = frame:GetParent() - local cursorY = select(2, GetCursorPosition()) - local newPoint = frame.anchorStart - (frame.cursorStart - cursorY)/frame:GetEffectiveScale() - local maxPoint = parent:GetHeight() - 175; - - if newPoint < 100 then - newPoint = 100 - elseif newPoint > maxPoint then - newPoint = maxPoint - end - - frame:ClearAllPoints() - frame:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", 14, newPoint) - frame:SetPoint("TOPRIGHT", parent, "BOTTOMRIGHT", 0, newPoint) -end - -function WowLua:OnVerticalScroll(scrollFrame) - local offset = scrollFrame:GetVerticalScroll(); - local scrollbar = getglobal(scrollFrame:GetName().."ScrollBar"); - - scrollbar:SetValue(offset); - local min, max = scrollbar:GetMinMaxValues(); - local display = false; - if ( offset == 0 ) then - getglobal(scrollbar:GetName().."ScrollUpButton"):Disable(); - else - getglobal(scrollbar:GetName().."ScrollUpButton"):Enable(); - display = true; - end - if ((scrollbar:GetValue() - max) == 0) then - getglobal(scrollbar:GetName().."ScrollDownButton"):Disable(); - else - getglobal(scrollbar:GetName().."ScrollDownButton"):Enable(); - display = true; - end - if ( display ) then - scrollbar:Show(); - else - scrollbar:Hide(); - end -end - -function WowLua:UpdateLineNums(highlightNum) - -- highlightNum is the line number indicated by the error message - if highlightNum then - WowLua.highlightNum = highlightNum - else - highlightNum = WowLua.highlightNum - end - - -- Since we know this is FAIAP enabled, we need to pass true in order - -- to get the raw values - local editbox = WowLuaFrameEditBox - local linebox = WowLuaFrameLineNumEditBox - local linetest = WowLuaFrameEditBoxLineTest - local linescroll = WowLuaFrameLineNumScrollFrame - - local width = editbox:GetWidth() - local text = editbox:GetText(true) - - local linetext = "" - local count = 1 - for line in text:gmatch("([^\n]*\n?)") do - if #line > 0 then - if count == highlightNum then - linetext = linetext .. "|cFFFF1111" .. count .. "|r" .. "\n" - else - linetext = linetext .. count .. "\n" - end - count = count + 1 - - -- Check to see if the line of text spans more than one actual line - linetest:SetText(line:gsub("|", "||")) - local testwidth = linetest:GetWidth() - if testwidth >= width then - linetext = linetext .. string.rep("\n", testwidth / width) - end - end - end - - if text:sub(-1, -1) == "\n" then - linetext = linetext .. count .. "\n" - count = count + 1 - end - - -- Make the line number frame wider as necessary - local offset = tostring(count):len() * 10 - linescroll:ClearAllPoints() - linescroll:SetPoint("TOPLEFT", WowLuaFrame, "TOPLEFT", 18, -74) - linescroll:SetPoint("BOTTOMRIGHT", WowLuaFrameResizeBar, "TOPLEFT", 15 + offset, -4) - - linebox:SetText(linetext) - linetest:SetText(text) -end - -local function canScroll(scroll, direction) - local num, displayed, currScroll = scroll:GetNumMessages(), - scroll:GetNumLinesDisplayed(), - scroll:GetCurrentScroll(); - if ( direction == "up" and - ( - num == displayed or - num == ( currScroll + displayed ) - ) - ) then - return false; - elseif ( direction == "down" and currScroll == 0 ) then - return false; - end - return true; -end - -function WowLua:UpdateScrollingMessageFrame(frame) - local name = frame:GetName(); - local display = false; - - if ( canScroll(frame, "up") ) then - getglobal(name.."UpButton"):Enable(); - display = true; - else - getglobal(name.."UpButton"):Disable(); - end - - if ( canScroll(frame, "down") ) then - getglobal(name.."DownButton"):Enable(); - display = true; - else - getglobal(name.."DownButton"):Disable(); - end - - if ( display ) then - getglobal(name.."UpButton"):Show(); - getglobal(name.."DownButton"):Show(); - else - getglobal(name.."UpButton"):Hide(); - getglobal(name.."DownButton"):Hide(); - end -end - -local scrollMethods = { - ["line"] = { ["up"] = "ScrollUp", ["down"] = "ScrollDown" }, - ["page"] = { ["up"] = "PageUp", ["down"] = "PageDown" }, - ["end"] = { ["up"] = "ScrollToTop", ["down"] = "ScrollToBottom" }, -}; - -function WowLua:ScrollingMessageFrameScroll(scroll, direction, type) - -- Make sure we can scroll first - if ( not canScroll(scroll, direction) ) then - return; - end - local method = scrollMethods[type][direction]; - scroll[method](scroll); -end - -function WowLua:OnTextChanged(frame) - frame.highlightNum = nil -end - -function WowLua:OnCursorChanged(frame) - WowLua.dirty = true -end - -BINDING_HEADER_WOWLUA = "WowLua Editor/Interpreter" -BINDING_NAME_TOGGLE_WOWLUA = "Show/Hide window" -BINDING_NAME_RUN_WOWLUA = "Run current page" -BINDING_NAME_SAVE_WOWLUA = "Save current page" - -SLASH_WOWLUA1 = "/lua" -SLASH_WOWLUA2 = "/wowlua" -local first = true -SlashCmdList["WOWLUA"] = function(txt) - local page, entry = WowLua:GetCurrentPage() - if first then - WowLuaFrameEditBox:SetText(entry.content) - WowLuaFrameEditBox:SetWidth(WowLuaFrameEditScrollFrame:GetWidth()) - WowLua:SetTitle(false) - first = false - end - - WowLuaFrame:Show() - - if processSpecialCommands(txt) then - return - end - - if txt:match("%S") then - WowLua:ProcessLine(txt) - end - - WowLuaFrameCommandEditBox:SetFocus() -end - -local function printf(fmt, ...) - print(fmt:format(...)) -end - -SLASH_WOWLUARUN1 = "/luarun" -SLASH_WOWLUARUN2 = "/wowluarun" -SlashCmdList["WOWLUARUN"] = function(txt, editbox) - local entry, idx = WowLua:SelectPage(txt) - if not entry then - printf("|cFF33FF99WowLua|r: Unable to find a page named '%s'", txt) - return - else - printf("|cFF33FF99WowLua|r: Running page '%s'", txt) - local func, err = loadstring(entry.content, "WowLua") - if not func then - printf("|cFF33FF99WowLua|r: Error compiling page '%s': %s", txt, err) - else - -- Call the function - local succ, err = pcall(func) - - if not succ then - printf("|cFF33FF99WowLua|r: Error while running page '%s': %s", txt, err) - end - end - end -end +--[[-------------------------------------------------------------------------- + Copyright (c) 2007-2017, James Whitehead II + All rights reserved. + + WowLua is an interactive interpreter for World of Warcraft +--------------------------------------------------------------------------]]-- + +local addon = ... +local version = GetAddOnMetadata("WowLua", "Version") or "SVN" +WowLua = { + VERSION = "WowLua v" .. version .. " Interactive Interpreter", + queue = {}, + queuePos = 0, +} +local L = WowLuaLocals + +WowLua_DB = { + pages = { + [1] = {name = format(L.NEW_PAGE_TITLE, 1), content = "", untitled = true} + }, + currentPage = 1, + untitled = 2, + fontSize = 14, +} + +local DB = {} + +local eframe = CreateFrame("Frame") +eframe:RegisterEvent("ADDON_LOADED") +eframe:SetScript("OnEvent", function(self, event, ...) + if event == "ADDON_LOADED" then + local arg1 = ... + if arg1 == addon then + if WowLua_DB.fontSize then + local file, height, flags = WowLuaMonoFont:GetFont() + WowLuaMonoFont:SetFont(file, WowLua_DB.fontSize, flags) + end + end + end +end) + +function WowLua:CreateNewPage() + local name = format(L.NEW_PAGE_TITLE, WowLua_DB.untitled) + WowLua_DB.untitled = WowLua_DB.untitled + 1 + local entry = { + name = name, + content = "", + untitled = true + } + table.insert(WowLua_DB.pages, entry) + WowLua_DB.currentPage = #WowLua_DB.pages + return entry, #WowLua_DB.pages +end + +function WowLua:GetNumPages() + return #WowLua_DB.pages +end + +function WowLua:SavePage(num, content) + local entry = WowLua_DB.pages[num] + entry.content = content +end + +function WowLua:RenamePage(num, name) + local entry = WowLua_DB.pages[num] + entry.name = name + entry.untitled = nil +end + +function WowLua:DeletePage(num) + table.remove(WowLua_DB.pages, num) +end + +function WowLua:LockPage(num, locked) + local entry = WowLua_DB.pages[num] + entry.locked = locked +end + +function WowLua:IsPageLocked(num) + local entry = WowLua_DB.pages[num] + return entry.locked +end + +function WowLua:GetCurrentPage() + local page = WowLua_DB.currentPage + return page, WowLua_DB.pages[page] +end + +function WowLua:SelectPage(id) + if type(id) == "number" then + WowLua_DB.currentPage = id + return WowLua_DB.pages[id], id + elseif type(id) == "string" then + for idx,entry in ipairs(WowLua_DB.pages) do + if entry.name == id then + WowLua_DB.currentPage = idx + return entry, idx + end + end + end +end + +local function wowpad_print(...) + local out = "" + for i=1,select("#", ...) do + -- Comma seperate values + if i > 1 then + out = out .. ", " + end + + out = out .. tostring(select(i, ...)) + end + WowLuaFrameOutput:AddMessage("|cff999999" .. out .. "|r") +end + +if not print then + print = wowpad_print +end + +local function processSpecialCommands(txt) + if txt == L.RELOAD_COMMAND then + ReloadUI() + return true + elseif txt == L.RESET_COMMAND then + WowLuaFrame:ClearAllPoints() + WowLuaFrame:SetPoint("CENTER") + WowLuaFrame:SetWidth(640) + WowLuaFrame:SetHeight(512) + WowLuaFrameResizeBar:ClearAllPoints() + WowLuaFrameResizeBar:SetPoint("TOPLEFT", WowLuaFrame, "BOTTOMLEFT", 14, 100) + WowLuaFrameResizeBar:SetPoint("TOPRIGHT", WowLuaFrame, "BOTTOMRIGHT", 0, 100) + return true + end +end + +function WowLua:ProcessLine(text) + WowLuaFrameCommandEditBox:SetText("") + + if processSpecialCommands(text) then + return + end + + -- escape any color codes: + local output = text:gsub("\124", "\124\124") + + WowLuaFrameOutput:AddMessage(WowLuaFrameCommandPrompt:GetText() .. output) + + WowLuaFrameCommandEditBox:AddHistoryLine(output) + + -- If they're using "= value" syntax, just print it + text = text:gsub("^%s*=%s*(.+)", "print(%1)") + + -- Store this command into self.cmd in case we have multiple lines + if self.cmd then + self.cmd = self.cmd .. "\n" .. text + self.orig = self.orig .. "\n" .. text + else + self.cmd = text + self.orig = text + end + + -- Trim the command before we run it + self.cmd = string.trim(self.cmd) + + -- Process the current command + local func,err = loadstring(self.cmd) + + -- Fail to compile? Give it a return + -- Check to see if this just needs a return in front of it + if not func then + local newfunc,newerr = loadstring("print(" .. self.cmd .. ")") + if newfunc then + func,err = newfunc,newerr + end + end + + if not func then + -- Check to see if this is just an unfinished block + if err:sub(-7, -1) == "''" then + -- Change the prompt + WowLuaFrameCommandPrompt:SetText(">> ") + return + end + + WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r") + self.cmd = nil + WowLuaFrameCommandPrompt:SetText("> ") + else + -- Make print a global function + local old_print = print + print = wowpad_print + + -- Call the function + local succ,err = pcall(func) + + -- Restore the value of print + print = old_print + + if not succ then + WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r") + end + + self.cmd = nil + WowLuaFrameCommandPrompt:SetText("> ") + end +end + +function WowLua:RunScript(text) + -- escape any color codes: + local output = text:gsub("\124", "\124\124") + + if text == L.RELOAD_COMMAND then + ReloadUI() + end + + -- If they're using "= value" syntax, just print it + text = text:gsub("^%s*=%s*(.+)", "print(%1)") + + -- Trim the command before we run it + text = string.trim(text) + + -- Process the current command + local func,err = loadstring(text, "WowLua") + + if not func then + WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r") + return false, err + else + -- Make print a global function + local old_print = print + print = wowpad_print + + -- Call the function + local succ,err = pcall(func) + + -- Restore the value of print + print = old_print + + if not succ then + WowLuaFrameOutput:AddMessage("|cffff0000" .. err .. "|r") + return false, err + end + end + + return true +end + +function WowLua:Initialize(frame) + WowLua:OnSizeChanged(frame) + table.insert(UISpecialFrames, "WowLuaFrame") + PlaySound("igMainMenuOpen"); + self:UpdateButtons() +end + +function WowLua:Button_OnEnter(frame) + GameTooltip:SetOwner(frame, "ANCHOR_BOTTOM"); + local operation = frame:GetName():match("WowLuaButton_(.+)"):gsub("_", " ") + local tooltip = L.TOOLTIPS[operation] + GameTooltip:SetText(tooltip and tooltip.name or operation) + if tooltip then + GameTooltip:AddLine(tooltip.text, 1, 1, 1) + end + GameTooltip:Show(); +end + +function WowLua:Button_OnLeave(frame) + GameTooltip:Hide() +end + +function WowLua:Button_OnClick(button) + local operation = button:GetName():match("WowLuaButton_(.+)") + if operation == "New" then + WowLua:Button_New(button) + elseif operation == "Open" then + WowLua:Button_Open(button) + elseif operation == "Save" then + WowLua:Button_Save(button) + elseif operation == "Undo" then + WowLua:Button_Undo(button) + elseif operation == "Redo" then + WowLua:Button_Redo(button) + elseif operation == "Delete" then + WowLua:Button_Delete(button) + elseif operation == "Lock" then + WowLua:Button_Lock(button) + elseif operation == "Unlock" then + WowLua:Button_Unlock(button) + elseif operation == "Previous" then + WowLua:Button_Previous(button) + elseif operation == "Next" then + WowLua:Button_Next(button) + elseif operation == "Run" then + WowLua:Button_Run(button) + elseif operation == "Config" then + WowLua:Button_Config(button) + elseif operation == "Close" then + WowLua:Button_Close(button) + end +end + +function WowLua:DebugQueue() + print("Current queue position: " .. self.queuePos) + for k,v in pairs(self.queue) do + print(k, v:sub(1, 20)) + end +end + +function WowLua:FlushQueue() + table.wipe(self.queue) + self.queuePos = 0 +end + +function WowLua:Queue(text) + if #self.queue == 0 then + local page, entry = WowLua:GetCurrentPage() + self.queue[1] = entry.content + self.queuePos = 1 + end + + if text ~= self.queue[self.queuePos] then + self.queuePos = self.queuePos+1 + self.queue[self.queuePos] = text + for i=self.queuePos+1,#self.queue do + self.queue[i]=nil + end + end +end + +function WowLua:GetUndoPage() + -- Before we do any "Undo", queue the current text + WowLua:Queue(WowLuaFrameEditBox:GetText()) + + local item = self.queue[self.queuePos-1] + if item then + self.queuePos = self.queuePos-1 + return item + end + + return self.queue[self.queuePos] +end + +function WowLua:GetRedoPage() + local item = self.queue[self.queuePos+1] + if item then + self.queuePos = self.queuePos+1 + return item + end + return self.queue[self.queuePos] +end + +function WowLua:Button_New(button) + if self:IsModified() then + -- Display the unsaved changes dialog + local dialog = StaticPopup_Show("WOWLUA_UNSAVED") + dialog.data = "Button_New" + return + end + + -- Create a new page and display it + local entry, num = WowLua:CreateNewPage() + + WowLuaFrameEditBox:SetText(entry.content) + WowLua:UpdateButtons() + WowLua:SetTitle(false) + WowLua:FlushQueue() +end + +function WowLua:Button_Open(button) + ToggleDropDownMenu(1, nil, WowLuaOpenDropDown, button:GetName(), 0, 0) +end + +function WowLua:OpenDropDownOnLoad(frame) + UIDropDownMenu_Initialize(frame, self.OpenDropDownInitialize) +end + +local function dropDownFunc(button, page) + WowLua:GoToPage(page) +end + +function WowLua.OpenDropDownInitialize() + UIDropDownMenu_AddButton{ + text = L.OPEN_MENU_TITLE, + isTitle = 1 + } + + for page, entry in ipairs(WowLua_DB.pages) do + UIDropDownMenu_AddButton{ + text = entry.name, + func = dropDownFunc, + arg1 = page + } + end +end + +StaticPopupDialogs["WOWLUA_SAVE_AS"] = { + text = L.SAVE_AS_TEXT, + button1 = TEXT(OKAY), + button2 = TEXT(CANCEL), + OnAccept = function(self) + local name = self:GetName().."EditBox" + local button = _G[name] + local text = button:GetText() + WowLua:RenamePage(WowLua.save_as, text) + WowLua:SetTitle() + end, + timeout = 0, + whileDead = 1, + exclusive = 1, + showAlert = 1, + hideOnEscape = 1, + hasEditBox = 1, + maxLetters = 32, + OnShow = function(self) + getglobal(self:GetName().."Button1"):Disable(); + local editBox = _G[self:GetName().."EditBox"] + editBox:SetFocus() + editBox:SetText(WowLua.save_as_name) + editBox:HighlightText() + end, + OnHide = function(self) + local activeWindow = ChatEdit_GetActiveWindow() + if activeWindow then + activeWindow:SetText("") + end + end, + EditBoxOnEnterPressed = function(self) + if _G[self:GetParent():GetName().."Button1"]:IsEnabled() == 1 then + local name = self:GetParent():GetName().."EditBox" + local button = _G[name] + local text = button:GetText() + WowLua:RenamePage(WowLua.save_as, text) + WowLua:SetTitle() + self:GetParent():Hide(); + end + end, + EditBoxOnTextChanged = function (self) + local editBox = _G[self:GetParent():GetName().."EditBox"]; + local txt = editBox:GetText() + if #txt > 0 then + _G[self:GetParent():GetName().."Button1"]:Enable(); + else + _G[self:GetParent():GetName().."Button1"]:Disable(); + end + end, + EditBoxOnEscapePressed = function(self) + self:GetParent():Hide(); + ClearCursor(); + end +} + +function WowLua:Button_Save(button) + if button and IsShiftKeyDown() then + -- Show the static popup for renaming + local page, entry = self:GetCurrentPage() + WowLua.save_as = page + WowLua.save_as_name = entry.name + StaticPopup_Show("WOWLUA_SAVE_AS", entry.name) + return + else + local text = WowLuaFrameEditBox:GetText() + local page = self:GetCurrentPage() + self:SavePage(page, text) + self:UpdateButtons() + self:SetTitle(false) + WowLua:Queue(text) + end +end + +function WowLua:Button_Undo(button) + local page, entry = self:GetCurrentPage() + local undo = WowLua:GetUndoPage() + WowLuaFrameEditBox:SetText(undo or entry.content) +end + +function WowLua:Button_Redo(button) + local page, entry = self:GetCurrentPage() + local redo = WowLua:GetRedoPage() + WowLuaFrameEditBox:SetText(redo) +end + +function WowLua:Button_Delete(button) + if self:IsModified() then + -- Display the unsaved changes dialog + local dialog = StaticPopup_Show("WOWLUA_UNSAVED") + dialog.data = "Button_Delete" + return + end + + local page, entry = self:GetCurrentPage() + if self:GetNumPages() == 1 then + self:Button_New() + self:Button_Previous() + end + + self:DeletePage(page) + + if page > 1 then page = page - 1 end + local entry = self:SelectPage(page) + WowLuaFrameEditBox:SetText(entry.content) + self:UpdateButtons() + self:SetTitle(false) +end + +function WowLua:Button_Lock(button) + local id = self:GetCurrentPage() + self:LockPage(id, true) + self:UpdateButtons() +end + +function WowLua:Button_Unlock(button) + local id = self:GetCurrentPage() + self:LockPage(id, false) + self:UpdateButtons() +end + +StaticPopupDialogs["WOWLUA_UNSAVED"] = { + text = L.UNSAVED_TEXT, + button1 = TEXT(OKAY), + button2 = TEXT(CANCEL), + OnAccept = function(self) + local page,entry = WowLua:GetCurrentPage() + WowLuaFrameEditBox:SetText(entry.content) + local action = self:GetParent().data + if type(action) == "string" then + WowLua[action](WowLua) + else + WowLua:GoToPage(self:GetParent().data) + end + end, + timeout = 0, + whileDead = 1, + exclusive = 1, + showAlert = 1, + hideOnEscape = 1, + EditBoxOnEscapePressed = function(self) + self:GetParent():Hide(); + ClearCursor(); + end +} + +function WowLua:Button_Previous() + self:GoToPage(self:GetCurrentPage() - 1) +end + +function WowLua:Button_Next() + self:GoToPage(self:GetCurrentPage() + 1) +end + +function WowLua:GoToPage(page) + if self:IsModified() then + -- Display the unsaved changes dialog + local dialog = StaticPopup_Show("WOWLUA_UNSAVED") + dialog.data = page + return + end + + local entry = self:SelectPage(page) + if not entry then + return + end + + WowLuaFrameEditBox:SetText(entry.content) + self:UpdateButtons() + self:SetTitle(false) + WowLua:FlushQueue() +end + +function WowLua:UpdateButtons() + local current = self:GetCurrentPage() + local max = self:GetNumPages() + + if current == 1 then + WowLuaButton_Previous:Disable() + else + WowLuaButton_Previous:Enable() + end + + if current == max then + WowLuaButton_Next:Disable() + else + WowLuaButton_Next:Enable() + end + + self.indent.indentEditbox(WowLuaFrameEditBox) + + if self:IsPageLocked(current) then + WowLuaButton_Unlock:Show() + WowLuaButton_Lock:Hide() + WowLuaButton_Delete:Disable() + WowLuaFrameEditBox:SetScript("OnTextChanged", self.lockedTextChanged) + else + WowLuaButton_Unlock:Hide() + WowLuaButton_Lock:Show() + WowLuaButton_Delete:Enable() + WowLuaFrameEditBox:SetScript("OnTextChanged", self.unlockedTextChanged) + end +end + +function WowLua.lockedTextChanged(box) + if WowLua.reverting then + WowLua.reverting = false + else + WowLua.reverting = true + local entry = select(2, WowLua:GetCurrentPage()) + local pos = WowLua.lastCursorPos + box:SetText(entry.content) + WowLua.indent.indentEditbox(WowLuaFrameEditBox) + if pos then + box:SetCursorPosition(pos) + end + end +end + +function WowLua:Button_Run() + local text = WowLuaFrameEditBox:GetText() + + -- Run the script, if there is an error then highlight it + if text then + -- Add the current state of the page to the queue + WowLua:Queue(text) + + local succ,err = WowLua:RunScript(text) + if not succ then + local chunkName,lineNum = err:match("(%b[]):(%d+):") + lineNum = tonumber(lineNum) + WowLua:UpdateLineNums(lineNum) + + -- Highlight the text in the editor by finding the char of the line number we're on + text = WowLua.indent.coloredGetText(WowLuaFrameEditBox) + + local curLine,start = 1,1 + while curLine < lineNum do + local s,e = text:find("\n", start) + start = e + 1 + curLine = curLine + 1 + end + + local nextLine = select(2, text:find("\n", start)) + + WowLuaFrameEditBox:SetFocus() + WowLuaFrameEditBox:SetCursorPosition(start - 1) + end + end +end + +function WowLua:Button_Config() + InterfaceOptionsFrame_OpenToCategory("WowLua") +end + +function WowLua:Button_Close() + if self:IsModified() then + -- Display the unsaved changes dialog + local dialog = StaticPopup_Show("WOWLUA_UNSAVED") + dialog.data = "Button_Close" + return + end + + HideUIPanel(WowLuaFrame) +end + +function WowLua:IsModified() + local page,entry = self:GetCurrentPage() + local orig = entry.content + local current = WowLuaFrameEditBox:GetText(true) + return orig ~= current +end + +function WowLua:IsUntitled() + local page, entry = self:GetCurrentPage() + return entry.untitled +end + +function WowLua:SetTitle(modified) + local page,entry = self:GetCurrentPage() + WowLuaFrameTitle:SetFormattedText("%s%s - WowLua Editor", entry.name, self:IsModified() and "*" or "") +end + +function WowLua:OnSizeChanged(frame) + -- The first graphic is offset 13 pixels to the right + local width = frame:GetWidth() - 13 + local bg2w,bg3w,bg4w = 0,0,0 + + -- Resize bg2 up to 256 width + local bg2w = width - 256 + if bg2w > 256 then + bg3w = bg2w - 256 + bg2w = 256 + end + + if bg3w > 256 then + bg4w = bg3w - 256 + bg3w = 256 + end + + local bg2 = WowLuaFrameBG2 + local bg3 = WowLuaFrameBG3 + local bg4 = WowLuaFrameBG4 + + if bg2w > 0 then + bg2:SetWidth(bg2w) + bg2:SetTexCoord(0, (bg2w / 256), 0, 1) + bg2:Show() + else + bg2:Hide() + end + + if bg3w and bg3w > 0 then + bg3:SetWidth(bg3w) + bg3:SetTexCoord(0, (bg3w / 256), 0, 1) + bg3:Show() + else + bg3:Hide() + end + + if bg4w and bg4w > 0 then + bg4:SetWidth(bg4w) + bg4:SetTexCoord(0, (bg4w / 256), 0, 1) + bg4:Show() + else + bg4:Hide() + end + + if WowLuaFrameResizeBar and false then + local parent = WowLuaFrameResizeBar:GetParent() + local cursorY = select(2, GetCursorPosition()) + local newPoint = select(5, WowLuaFrameResizeBar:GetPoint()) + local maxPoint = parent:GetHeight() - 175; + + if newPoint < 100 then + newPoint = 100 + elseif newPoint > maxPoint then + newPoint = maxPoint + end + + WowLuaFrameResizeBar:ClearAllPoints() + WowLuaFrameResizeBar:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", 14, newPoint) + WowLuaFrameResizeBar:SetPoint("TOPRIGHT", parent, "BOTTOMRIGHT", 0, newPoint) + end +end + +function WowLua:ResizeBar_OnMouseDown(frame, button) + frame.cursorStart = select(2, GetCursorPosition()) + frame.anchorStart = select(5, frame:GetPoint()) + frame:SetScript("OnUpdate", function(...) WowLua:ResizeBar_OnUpdate(...) end) +end + +function WowLua:ResizeBar_OnMouseUp(frame, button) + frame:SetScript("OnUpdate", nil) +end + +function WowLua:ResizeBar_OnUpdate(frame, elapsed) + local parent = frame:GetParent() + local cursorY = select(2, GetCursorPosition()) + local newPoint = frame.anchorStart - (frame.cursorStart - cursorY)/frame:GetEffectiveScale() + local maxPoint = parent:GetHeight() - 175; + + if newPoint < 100 then + newPoint = 100 + elseif newPoint > maxPoint then + newPoint = maxPoint + end + + frame:ClearAllPoints() + frame:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", 14, newPoint) + frame:SetPoint("TOPRIGHT", parent, "BOTTOMRIGHT", 0, newPoint) +end + +function WowLua:OnVerticalScroll(scrollFrame) + local offset = scrollFrame:GetVerticalScroll(); + local scrollbar = getglobal(scrollFrame:GetName().."ScrollBar"); + + scrollbar:SetValue(offset); + local min, max = scrollbar:GetMinMaxValues(); + local display = false; + if ( offset == 0 ) then + getglobal(scrollbar:GetName().."ScrollUpButton"):Disable(); + else + getglobal(scrollbar:GetName().."ScrollUpButton"):Enable(); + display = true; + end + if ((scrollbar:GetValue() - max) == 0) then + getglobal(scrollbar:GetName().."ScrollDownButton"):Disable(); + else + getglobal(scrollbar:GetName().."ScrollDownButton"):Enable(); + display = true; + end + if ( display ) then + scrollbar:Show(); + else + scrollbar:Hide(); + end +end + +function WowLua:UpdateLineNums(highlightNum) + -- highlightNum is the line number indicated by the error message + if highlightNum then + WowLua.highlightNum = highlightNum + else + highlightNum = WowLua.highlightNum + end + + -- Since we know this is FAIAP enabled, we need to pass true in order + -- to get the raw values + local editbox = WowLuaFrameEditBox + local linebox = WowLuaFrameLineNumEditBox + local linetest = WowLuaFrameEditBoxLineTest + local linescroll = WowLuaFrameLineNumScrollFrame + + local width = editbox:GetWidth() + local text = editbox:GetText(true) + + local linetext = "" + local count = 1 + for line in text:gmatch("([^\n]*\n?)") do + if #line > 0 then + if count == highlightNum then + linetext = linetext .. "|cFFFF1111" .. count .. "|r" .. "\n" + else + linetext = linetext .. count .. "\n" + end + count = count + 1 + + -- Check to see if the line of text spans more than one actual line + linetest:SetText(line:gsub("|", "||")) + local testwidth = linetest:GetWidth() + if testwidth >= width then + linetext = linetext .. string.rep("\n", testwidth / width) + end + end + end + + if text:sub(-1, -1) == "\n" then + linetext = linetext .. count .. "\n" + count = count + 1 + end + + -- Make the line number frame wider as necessary + local offset = tostring(count):len() * 10 + linescroll:ClearAllPoints() + linescroll:SetPoint("TOPLEFT", WowLuaFrame, "TOPLEFT", 18, -74) + linescroll:SetPoint("BOTTOMRIGHT", WowLuaFrameResizeBar, "TOPLEFT", 15 + offset, -4) + + linebox:SetText(linetext) + linetest:SetText(text) +end + +local function canScroll(scroll, direction) + if direction == "up" then + return not scroll:AtTop() + end + if direction == "down" then + return not scroll:AtBottom() + end + return true; +end + +function WowLua:UpdateScrollingMessageFrame(frame) + local name = frame:GetName(); + local display = false; + + if ( canScroll(frame, "up") ) then + getglobal(name.."UpButton"):Enable(); + display = true; + else + getglobal(name.."UpButton"):Disable(); + end + + if ( canScroll(frame, "down") ) then + getglobal(name.."DownButton"):Enable(); + display = true; + else + getglobal(name.."DownButton"):Disable(); + end + + if ( display ) then + getglobal(name.."UpButton"):Show(); + getglobal(name.."DownButton"):Show(); + else + getglobal(name.."UpButton"):Hide(); + getglobal(name.."DownButton"):Hide(); + end +end + +local scrollMethods = { + ["line"] = { ["up"] = "ScrollUp", ["down"] = "ScrollDown" }, + ["page"] = { ["up"] = "PageUp", ["down"] = "PageDown" }, + ["end"] = { ["up"] = "ScrollToTop", ["down"] = "ScrollToBottom" }, +}; + +function WowLua:ScrollingMessageFrameScroll(scroll, direction, type) + -- Make sure we can scroll first + if ( not canScroll(scroll, direction) ) then + return; + end + local method = scrollMethods[type][direction]; + scroll[method](scroll); +end + +function WowLua:OnTextChanged(frame) + frame.highlightNum = nil +end + +function WowLua:OnCursorChanged(frame) + WowLua.dirty = true +end + +BINDING_HEADER_WOWLUA = "WowLua Editor/Interpreter" +BINDING_NAME_TOGGLE_WOWLUA = "Show/Hide window" +BINDING_NAME_RUN_WOWLUA = "Run current page" +BINDING_NAME_SAVE_WOWLUA = "Save current page" + +SLASH_WOWLUA1 = "/lua" +SLASH_WOWLUA2 = "/wowlua" +local first = true +SlashCmdList["WOWLUA"] = function(txt) + local page, entry = WowLua:GetCurrentPage() + if first then + WowLuaFrameEditBox:SetText(entry.content) + WowLuaFrameEditBox:SetWidth(WowLuaFrameEditScrollFrame:GetWidth()) + WowLua:SetTitle(false) + first = false + end + + WowLuaFrame:Show() + + if processSpecialCommands(txt) then + return + end + + if txt:match("%S") then + WowLua:ProcessLine(txt) + end + + WowLuaFrameCommandEditBox:SetFocus() +end + +local function printf(fmt, ...) + print(fmt:format(...)) +end + +SLASH_WOWLUARUN1 = "/luarun" +SLASH_WOWLUARUN2 = "/wowluarun" +SlashCmdList["WOWLUARUN"] = function(txt, editbox) + local entry, idx = WowLua:SelectPage(txt) + if not entry then + printf("|cFF33FF99WowLua|r: Unable to find a page named '%s'", txt) + return + else + printf("|cFF33FF99WowLua|r: Running page '%s'", txt) + local func, err = loadstring(entry.content, "WowLua") + if not func then + printf("|cFF33FF99WowLua|r: Error compiling page '%s': %s", txt, err) + else + -- Call the function + local succ, err = pcall(func) + + if not succ then + printf("|cFF33FF99WowLua|r: Error while running page '%s': %s", txt, err) + end + end + end +end diff --git a/WowLua.toc b/WowLua.toc index aa48928..2d53fc3 100644 --- a/WowLua.toc +++ b/WowLua.toc @@ -1,15 +1,15 @@ -## Interface: 60200 -## Title: WowLua -## Version: @project-version@ -## Author: Cladhaire -## Notes: Interactive Lua interpreter and scratchpad -## LoadManagers: AddonLoader -## X-LoadOn-Slash: /wowlua, /lua, /wowluarun, /luarun -## SavedVariables: WowLua_DB - -Localization.enUS.lua - -WowLua.lua -FAIAP.lua -WowLua.xml -WowLua_Config.lua +## Interface: 70100 +## Title: WowLua +## Version: @project-version@ +## Author: Cladhaire +## Notes: Interactive Lua interpreter and scratchpad +## LoadManagers: AddonLoader +## X-LoadOn-Slash: /wowlua, /lua, /wowluarun, /luarun +## SavedVariables: WowLua_DB + +Localization.enUS.lua + +WowLua.lua +FAIAP.lua +WowLua.xml +WowLua_Config.lua diff --git a/WowLua.xml b/WowLua.xml index 3480342..a725d9d 100644 --- a/WowLua.xml +++ b/WowLua.xml @@ -665,8 +665,12 @@ WowLuaFrameCommandEditBox:SetFocus() + + self:SetFont([[Interface\AddOns\WowLua\fonts\VeraMono.ttf]], 14) + self:SetJustifyH("LEFT") + self:SetFading(False) + - -- 1.7.9.5