atom0s
8 years ago
1 changed files with 235 additions and 0 deletions
@ -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); |
Loading…
Reference in new issue