diff --git a/imguistyle.lua b/imguistyle.lua new file mode 100644 index 0000000..5f16c1d --- /dev/null +++ b/imguistyle.lua @@ -0,0 +1,235 @@ +--[[ +* Ashita - Copyright (c) 2014 - 2016 atom0s [atom0s@live.com] +* +* This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. +* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/ or send a letter to +* Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. +* +* By using Ashita, you agree to the above license and its terms. +* +* Attribution - You must give appropriate credit, provide a link to the license and indicate if changes were +* made. You must do so in any reasonable manner, but not in any way that suggests the licensor +* endorses you or your use. +* +* Non-Commercial - You may not use the material (Ashita) for commercial purposes. +* +* No-Derivatives - If you remix, transform, or build upon the material (Ashita), you may not distribute the +* modified material. You are, however, allowed to submit the modified works back to the original +* Ashita project in attempt to have it added to the original project. +* +* You may not apply legal terms or technological measures that legally restrict others +* from doing anything the license permits. +* +* No warranties are given. +]]-- + +_addon.author = 'atom0s'; +_addon.name = 'ImGui Style'; +_addon.version = '3.0.0'; + +require 'common' + +---------------------------------------------------------------------------------------------------- +-- Variables +---------------------------------------------------------------------------------------------------- +local show_style_window = nil; + +--------------------------------------------------------------------------------------------------- +-- func: SaveImGuiStyle +-- desc: Saves the current ImGui style for the current player. +--------------------------------------------------------------------------------------------------- +local function SaveImGuiStyle() + -- Obtain the local player entity.. + local p = GetPlayerEntity(); + if (p == nil) then return; end; + + -- Ensure we have a name.. + if (p.Name == nil or string.len(p.Name) == 0) then + return; + end + + -- Obtain the current style.. + local s = imgui.style; + + -- Build a style block to save.. + local f = { }; + f.Alpha = s.Alpha; + f.WindowPadding = { s.WindowPadding.x, s.WindowPadding.y }; + f.WindowMinSize = { s.WindowMinSize.x, s.WindowMinSize.y }; + f.WindowRounding = s.WindowRounding; + f.WindowTitleAlign = s.WindowTitleAlign; + f.ChildWindowRounding = s.ChildWindowRounding; + f.FramePadding = { s.FramePadding.x, s.FramePadding.y }; + f.FrameRounding = s.FrameRounding; + f.ItemSpacing = { s.ItemSpacing.x, s.ItemSpacing.y }; + f.ItemInnerSpacing = { s.ItemInnerSpacing.x, s.ItemInnerSpacing.y }; + f.TouchExtraPadding = { s.TouchExtraPadding.x, s.TouchExtraPadding.y }; + f.IndentSpacing = s.IndentSpacing; + f.ColumnsMinSpacing = s.ColumnsMinSpacing; + f.ScrollbarSize = s.ScrollbarSize; + f.ScrollbarRounding = s.ScrollbarRounding; + f.GrabMinSize = s.GrabMinSize; + f.GrabRounding = s.GrabRounding; + f.DisplayWindowPadding = { s.DisplayWindowPadding.x, s.DisplayWindowPadding.y }; + f.DisplaySafeAreaPadding = { s.DisplaySafeAreaPadding.x, s.DisplaySafeAreaPadding.y }; + f.AntiAliasedLines = s.AntiAliasedLines; + f.AntiAliasedShapes = s.AntiAliasedShapes; + f.CurveTessellationTol = s.CurveTessellationTol; + + f.colors = { }; + for x = 0, ImGuiCol_ModalWindowDarkening do + f.colors[x] = { s.Colors[x].x, s.Colors[x].y, s.Colors[x].z, s.Colors[x].w }; + end + + -- Save the style.. + ashita.settings.save(_addon.path .. 'settings/' .. p.Name .. '.json', f); + + print('[ImGuiStyle] Saved player UI configurations!'); +end + +--------------------------------------------------------------------------------------------------- +-- func: LoadImGuiStyle +-- desc: Loads the current players style. +--------------------------------------------------------------------------------------------------- +local function LoadImGuiStyle(name) + local f = ashita.settings.load(_addon.path .. 'settings/' .. name .. '.json', f); + if (f == nil) then return; end + + local s = imgui.style; + + s.Alpha = f.Alpha; + s.WindowPadding = ImVec2(f.WindowPadding[1], f.WindowPadding[2]); + s.WindowMinSize = ImVec2(f.WindowMinSize[1], f.WindowMinSize[2]); + s.WindowRounding = f.WindowRounding; + s.WindowTitleAlign = f.WindowTitleAlign; + s.ChildWindowRounding = f.ChildWindowRounding; + s.FramePadding = ImVec2(f.FramePadding[1], f.FramePadding[2]); + s.FrameRounding = f.FrameRounding; + s.ItemSpacing = ImVec2(f.ItemSpacing[1], f.ItemSpacing[2]); + s.ItemInnerSpacing = ImVec2(f.ItemInnerSpacing[1], f.ItemInnerSpacing[2]); + s.TouchExtraPadding = ImVec2(f.TouchExtraPadding[1], f.TouchExtraPadding[2]); + s.IndentSpacing = f.IndentSpacing; + s.ColumnsMinSpacing = f.ColumnsMinSpacing; + s.ScrollbarSize = f.ScrollbarSize; + s.ScrollbarRounding = f.ScrollbarRounding; + s.GrabMinSize = f.GrabMinSize; + s.GrabRounding = f.GrabRounding; + s.DisplayWindowPadding = ImVec2(f.DisplayWindowPadding[1], f.DisplayWindowPadding[2]); + s.DisplaySafeAreaPadding = ImVec2(f.DisplaySafeAreaPadding[1], f.DisplaySafeAreaPadding[2]); + s.AntiAliasedLines = f.AntiAliasedLines; + s.AntiAliasedShapes = f.AntiAliasedShapes; + s.CurveTessellationTol = f.CurveTessellationTol; + + for x = 0, ImGuiCol_ModalWindowDarkening do + ashita.gui.stylecolor(x, ImVec4(f.colors[tostring(x)][1], f.colors[tostring(x)][2], f.colors[tostring(x)][3], f.colors[tostring(x)][4])); + end +end + +---------------------------------------------------------------------------------------------------- +-- func: print_help +-- desc: Displays a help block for proper command usage. +---------------------------------------------------------------------------------------------------- +local function print_help(cmd, help) + -- Print the invalid format header.. + print('\31\200[\31\05' .. _addon.name .. '\31\200]\30\01 ' .. '\30\68Invalid format for command:\30\02 ' .. cmd .. '\30\01'); + + -- Loop and print the help commands.. + for k, v in pairs(help) do + print('\31\200[\31\05' .. _addon.name .. '\31\200]\30\01 ' .. '\30\68Syntax:\30\02 ' .. v[1] .. '\30\71 ' .. v[2]); + end +end + +---------------------------------------------------------------------------------------------------- +-- func: load +-- desc: Event called when the addon is being loaded. +---------------------------------------------------------------------------------------------------- +ashita.register_event('load', function() + show_style_window = imgui.CreateVar(1); + + -- Obtain the local player entity.. + local p = GetPlayerEntity(); + if (p == nil) then return; end; + + -- Ensure we have a name.. + if (p.Name == nil or string.len(p.Name) == 0) then + return; + end + + -- Load the current players settings.. + LoadImGuiStyle(p.Name); +end); + +---------------------------------------------------------------------------------------------------- +-- func: unload +-- desc: Event called when the addon is being unloaded. +---------------------------------------------------------------------------------------------------- +ashita.register_event('unload', function() + if (show_style_window ~= nil) then + imgui.DeleteVar(show_style_window); + end +end); + +---------------------------------------------------------------------------------------------------- +-- func: command +-- desc: Event called when a command was entered. +---------------------------------------------------------------------------------------------------- +ashita.register_event('command', function(command, ntype) + local args = command:args(); + + -- Ensure this is an imguistyle command.. + if (args[1] ~= '/imguistyle') then + return false; + end + + -- Toggles the editor.. + if (#args == 1 or args[2] == 'show') then + if (show_style_window ~= nil) then + imgui.SetVarValue(show_style_window, not imgui.GetVarValue(show_style_window)); + end + return true; + end + + -- Saves the style.. + if (#args == 2 and args[2] == 'save') then + SaveImGuiStyle(); + return true; + end + + print_help('/imguistyle', { + { '/imguistyle show', '- Toggles the ImGui style editor window on and off.' }, + { '/imguistyle save', '- Saves the current style to the players personal settings file.' }, + }); + return true; +end); + +---------------------------------------------------------------------------------------------------- +-- func: render +-- desc: Event called when the addon is being rendered. +---------------------------------------------------------------------------------------------------- +ashita.register_event('render', function() + if (show_style_window == nil) then + return; + end + + if (imgui.GetVarValue(show_style_window) == true) then + imgui.Begin('Style Editor'); + imgui.ShowStyleEditor(); + imgui.End(); + end +end); + +--------------------------------------------------------------------------------------------------- +-- func: incoming_packet +-- desc: Called when our addon receives an incoming packet. +--------------------------------------------------------------------------------------------------- +ashita.register_event('incoming_packet', function(id, size, data) + -- Look for zoning / login packets to load + -- player specific configs.. + if (id == 0x000A) then + -- Get the players name and load their config.. + local name = struct.unpack('s', data, 0x84 + 1); + LoadImGuiStyle(name); + end + + return false; +end); \ No newline at end of file