├── .gitignore ├── LICENSE.txt ├── README.md ├── RetailUI ├── Atlas.lua ├── Config.lua ├── Core.lua ├── Libs.xml ├── Libs │ ├── AceAddon-3.0 │ │ ├── AceAddon-3.0.lua │ │ └── AceAddon-3.0.xml │ ├── AceConfig-3.0 │ │ ├── AceConfig-3.0.lua │ │ ├── AceConfig-3.0.xml │ │ ├── AceConfigCmd-3.0 │ │ │ ├── AceConfigCmd-3.0.lua │ │ │ └── AceConfigCmd-3.0.xml │ │ ├── AceConfigDialog-3.0 │ │ │ ├── AceConfigDialog-3.0.lua │ │ │ └── AceConfigDialog-3.0.xml │ │ └── AceConfigRegistry-3.0 │ │ │ ├── AceConfigRegistry-3.0.lua │ │ │ └── AceConfigRegistry-3.0.xml │ ├── AceConsole-3.0 │ │ ├── AceConsole-3.0.lua │ │ └── AceConsole-3.0.xml │ ├── AceDB-3.0 │ │ ├── AceDB-3.0.lua │ │ └── AceDB-3.0.xml │ ├── AceEvent-3.0 │ │ ├── AceEvent-3.0.lua │ │ └── AceEvent-3.0.xml │ ├── AceGUI-3.0 │ │ ├── AceGUI-3.0.lua │ │ ├── AceGUI-3.0.xml │ │ └── widgets │ │ │ ├── AceGUIContainer-BlizOptionsGroup.lua │ │ │ ├── AceGUIContainer-DropDownGroup.lua │ │ │ ├── AceGUIContainer-Frame.lua │ │ │ ├── AceGUIContainer-InlineGroup.lua │ │ │ ├── AceGUIContainer-ScrollFrame.lua │ │ │ ├── AceGUIContainer-SimpleGroup.lua │ │ │ ├── AceGUIContainer-TabGroup.lua │ │ │ ├── AceGUIContainer-TreeGroup.lua │ │ │ ├── AceGUIContainer-Window.lua │ │ │ ├── AceGUIWidget-Button.lua │ │ │ ├── AceGUIWidget-CheckBox.lua │ │ │ ├── AceGUIWidget-ColorPicker.lua │ │ │ ├── AceGUIWidget-DropDown-Items.lua │ │ │ ├── AceGUIWidget-DropDown.lua │ │ │ ├── AceGUIWidget-EditBox.lua │ │ │ ├── AceGUIWidget-Heading.lua │ │ │ ├── AceGUIWidget-Icon.lua │ │ │ ├── AceGUIWidget-InteractiveLabel.lua │ │ │ ├── AceGUIWidget-Keybinding.lua │ │ │ ├── AceGUIWidget-Label.lua │ │ │ ├── AceGUIWidget-MultiLineEditBox.lua │ │ │ └── AceGUIWidget-Slider.lua │ ├── AceHook-3.0 │ │ ├── AceHook-3.0.lua │ │ └── AceHook-3.0.xml │ ├── CallbackHandler-1.0 │ │ ├── CallbackHandler-1.0.lua │ │ └── CallbackHandler-1.0.xml │ ├── LibDBIcon-1.0 │ │ ├── LibDBIcon-1.0.lua │ │ └── LibDBIcon-1.0.xml │ ├── LibDataBroker-1.1 │ │ └── LibDataBroker-1.1.lua │ └── LibStub │ │ └── LibStub.lua ├── Modules │ ├── ActionBar.lua │ ├── BuffFrame.lua │ ├── CastingBar.lua │ ├── EditorMode.lua │ ├── Minimap.lua │ ├── QuestLog.lua │ ├── QuestTracker.lua │ └── UnitFrame.lua ├── NineSlice.lua ├── RetailUI.toc └── Textures │ ├── Minimap │ ├── Calendar.blp │ ├── EyeGroupFinderFlipbook.blp │ ├── GuildBanner.blp │ └── MinimapBorder.blp │ ├── PlayerFrame │ ├── ClassOverlayComboPoints.BLP │ ├── ClassOverlayDeathKnightRunes.BLP │ ├── LFGRoleIcons.blp │ └── PlayerRestFlipbook.blp │ ├── TargetFrame │ ├── BossFrame.blp │ └── NameBackground.blp │ └── UI │ ├── ActionBar.blp │ ├── ActionBarHorizontal.blp │ ├── ActionBarVertical.blp │ ├── BagSlots.blp │ ├── BagSlotsKey.blp │ ├── CastingBar.blp │ ├── CollapseButton.blp │ ├── EditorGrid.blp │ ├── ExperienceBar.blp │ ├── MicroMenu.blp │ ├── Minimap.blp │ ├── QuestTracker.BLP │ └── UnitFrame.blp └── media ├── RUI-1.png ├── RUI-2.png ├── RUI-3.png ├── RUI-4.png └── RUI-5.png /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Dmitriy 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Retail UI 2 | 3 | ![Client](https://img.shields.io/badge/Client-3%2E3%2E5a-blue) ![Version](https://img.shields.io/badge/Version-1%2E3-blue) ![License](https://img.shields.io/badge/License-MIT-green) 4 | 5 | UI inspired by the Retail version. This addon retextures the existing interface. 6 | 7 | ![Preview](media/RUI-1.png) 8 | 9 | ## Features 10 | 11 | - Action Bars 12 | - Unit Frames 13 | - Minimap 14 | - Casting Bars 15 | - Vehicle UI 16 | - Grid Layout to adjust the possition of UI elements 17 | - Target Health Bar class colored 18 | - scaling the UI 19 | 20 | ## Quick Start 21 | 22 | Type ``/rui edit`` for open grid layout. 23 | 24 | Type ``/rui default`` for reset settings. 25 | 26 | ## Screenshots 27 | 28 | ![Screenshot-1](media/RUI-2.png) 29 | ![Screenshot-2](media/RUI-3.png) 30 | ![Screenshot-3](media/RUI-4.png) 31 | ![Screenshot-4](media/RUI-5.png) 32 | 33 | ## Contributing 34 | 35 | If you are interested in improving this addon, please pull request your changes. 36 | When making a pull request, please adhere to the style and structure of the source code. 37 | -------------------------------------------------------------------------------- /RetailUI/Config.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | Copyright (c) Dmitriy. All rights reserved. 3 | Licensed under the MIT license. See LICENSE file in the project root for details. 4 | ]] 5 | 6 | local RUI = LibStub('AceAddon-3.0'):GetAddon('RetailUI') 7 | 8 | RUI.optionsSlash = { 9 | name = "RetailUI Commands", 10 | order = 0, 11 | type = "group", 12 | args = { 13 | edit = { 14 | name = "Enable Edit Mode", 15 | type = 'execute', 16 | order = 0, 17 | func = function() 18 | local EditorMode = RUI:GetModule('EditorMode') 19 | if EditorMode:IsShown() then 20 | EditorMode:Hide() 21 | else 22 | EditorMode:Show() 23 | end 24 | end, 25 | dialogHidden = true 26 | }, 27 | scale = { 28 | name = "Scale", 29 | order = 1, 30 | type = "group", 31 | args = { 32 | player = { 33 | name = "Player Frame Scale", 34 | type = 'input', 35 | order = 0, 36 | set = function(info, input) 37 | SaveUIFrameScale(input, "player") 38 | end, 39 | dialogHidden = true 40 | }, 41 | target = { 42 | name = "Target Frame Scale", 43 | type = 'input', 44 | order = 1, 45 | set = function(info, input) 46 | SaveUIFrameScale(input, "target") 47 | end, 48 | dialogHidden = true 49 | }, 50 | focus = { 51 | name = "Focus Frame Scale", 52 | type = 'input', 53 | order = 1, 54 | set = function(info, input) 55 | SaveUIFrameScale(input, "focus") 56 | end, 57 | dialogHidden = true 58 | }, 59 | tot = { 60 | name = "Target of Target Frame Scale", 61 | type = 'input', 62 | order = 1, 63 | set = function(info, input) 64 | SaveUIFrameScale(input, "targetOfTarget") 65 | end, 66 | dialogHidden = true 67 | }, 68 | pet = { 69 | name = "Pet Frame Scale", 70 | type = 'input', 71 | order = 1, 72 | set = function(info, input) 73 | SaveUIFrameScale(input, "pet") 74 | end, 75 | dialogHidden = true 76 | }, 77 | } 78 | }, 79 | default = { 80 | name = "Load Default Settings", 81 | type = 'execute', 82 | order = 0, 83 | func = function() 84 | local UnitFrameModule = RUI:GetModule("UnitFrame") 85 | local CastingBarModule = RUI:GetModule("CastingBar") 86 | local ActionBarModule = RUI:GetModule("ActionBar") 87 | local MinimapModule = RUI:GetModule("Minimap") 88 | local QuestTrackerModule = RUI:GetModule("QuestTracker") 89 | local BuffFrameModule = RUI:GetModule("BuffFrame") 90 | 91 | ActionBarModule:LoadDefaultSettings() 92 | ActionBarModule:UpdateWidgets() 93 | 94 | UnitFrameModule:LoadDefaultSettings() 95 | UnitFrameModule:UpdateWidgets() 96 | 97 | CastingBarModule:LoadDefaultSettings() 98 | CastingBarModule:UpdateWidgets() 99 | 100 | MinimapModule:LoadDefaultSettings() 101 | MinimapModule:UpdateWidgets() 102 | 103 | QuestTrackerModule:LoadDefaultSettings() 104 | QuestTrackerModule:UpdateWidgets() 105 | 106 | BuffFrameModule:LoadDefaultSettings() 107 | BuffFrameModule:UpdateWidgets() 108 | end, 109 | dialogHidden = true 110 | } 111 | } 112 | } 113 | 114 | RUI.default = { 115 | profile = { 116 | widgets = {} 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /RetailUI/Core.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | Copyright (c) Dmitriy. All rights reserved. 3 | Licensed under the MIT license. See LICENSE file in the project root for details. 4 | ]] 5 | 6 | local RUI = LibStub('AceAddon-3.0'):NewAddon('RetailUI', 'AceConsole-3.0') 7 | local AceConfig = LibStub("AceConfig-3.0") 8 | local AceDB = LibStub("AceDB-3.0") 9 | RetailUIDB = RetailUIDB or {} 10 | if RetailUIDB.bagsExpanded == nil then 11 | RetailUIDB.bagsExpanded = false -- Standard: sichtbar 12 | end 13 | 14 | RUI.InterfaceVersion = select(4, GetBuildInfo()) 15 | RUI.Wrath = (RUI.InterfaceVersion >= 30300) 16 | RUI.DB = nil 17 | 18 | function RUI:OnInitialize() 19 | RUI.DB = AceDB:New("RetailUIDB", RUI.default, true) 20 | AceConfig:RegisterOptionsTable("RUI Commands", RUI.optionsSlash, "rui") 21 | end 22 | 23 | function RUI:OnEnable() 24 | if GetCVar("useUiScale") == "0" then 25 | SetCVar("useUiScale", 1) 26 | SetCVar("uiScale", 0.75) 27 | end 28 | end 29 | 30 | function RUI:OnDisable() end 31 | 32 | function CreateUIFrame(width, height, frameName) 33 | local frame = CreateFrame("Frame", 'RUI_' .. frameName, UIParent) 34 | frame:SetSize(width, height) 35 | 36 | frame:RegisterForDrag("LeftButton") 37 | frame:EnableMouse(false) 38 | frame:SetMovable(false) 39 | frame:SetScript("OnDragStart", function(self, button) 40 | self:StartMoving() 41 | end) 42 | frame:SetScript("OnDragStop", function(self) 43 | self:StopMovingOrSizing() 44 | end) 45 | 46 | frame:SetFrameLevel(100) 47 | frame:SetFrameStrata('FULLSCREEN') 48 | 49 | do 50 | local texture = frame:CreateTexture(nil, 'BACKGROUND') 51 | texture:SetAllPoints(frame) 52 | texture:SetTexture("Interface\\AddOns\\RetailUI\\Textures\\UI\\ActionBarHorizontal.blp") 53 | texture:SetTexCoord(0, 512 / 512, 14 / 2048, 85 / 2048) 54 | texture:Hide() 55 | 56 | frame.editorTexture = texture 57 | end 58 | 59 | do 60 | local fontString = frame:CreateFontString(nil, "BORDER", 'GameFontNormal') 61 | fontString:SetAllPoints(frame) 62 | fontString:SetText(frameName) 63 | fontString:Hide() 64 | 65 | frame.editorText = fontString 66 | end 67 | 68 | return frame 69 | end 70 | 71 | RUI.frames = {} 72 | 73 | function ShowUIFrame(frame) 74 | frame:SetMovable(false) 75 | frame:EnableMouse(false) 76 | 77 | frame.editorTexture:Hide() 78 | frame.editorText:Hide() 79 | 80 | for _, target in pairs(RUI.frames[frame]) do 81 | target:SetAlpha(1) 82 | end 83 | 84 | RUI.frames[frame] = nil 85 | end 86 | 87 | function HideUIFrame(frame, exclude) 88 | frame:SetMovable(true) 89 | frame:EnableMouse(true) 90 | 91 | frame.editorTexture:Show() 92 | frame.editorText:Show() 93 | 94 | RUI.frames[frame] = {} 95 | 96 | exclude = exclude or {} 97 | 98 | for _, target in pairs(exclude) do 99 | target:SetAlpha(0) 100 | tinsert(RUI.frames[frame], target) 101 | end 102 | end 103 | 104 | function SaveUIFramePosition(frame, widgetName) 105 | local _, _, relativePoint, posX, posY = frame:GetPoint('CENTER') 106 | RUI.DB.profile.widgets[widgetName].anchor = relativePoint 107 | RUI.DB.profile.widgets[widgetName].posX = posX 108 | RUI.DB.profile.widgets[widgetName].posY = posY 109 | end 110 | 111 | function SaveUIFrameScale(input, widgetName) 112 | local scale = tonumber(input) -- Convert input to a number 113 | if not scale or scale <= 0 then -- validate 114 | print("Invalid scale. Please provide a positive number.") 115 | return 116 | end 117 | 118 | RUI.DB.profile.widgets[widgetName].scale = scale -- save the scale 119 | 120 | local UnitFrameModule = RUI:GetModule("UnitFrame") -- update the UI to reflect the changes 121 | UnitFrameModule:UpdateWidgets() 122 | print(widgetName .. " Frame Scale saved as " .. GetUIFrameScale(widgetName)) -- print confirmation to a user 123 | end 124 | 125 | function GetUIFrameScale(widgetName) 126 | return RUI.DB.profile.widgets[widgetName].scale 127 | end 128 | 129 | function CheckSettingsExists(self, widgets) 130 | for _, widget in pairs(widgets) do 131 | if RUI.DB.profile.widgets[widget] == nil then 132 | self:LoadDefaultSettings() 133 | break 134 | end 135 | end 136 | self:UpdateWidgets() 137 | end 138 | 139 | local function MoveChatOnFirstLoad() 140 | local chat = ChatFrame1 141 | if not chat then return end 142 | 143 | if chat:IsUserPlaced() then return end 144 | 145 | chat:ClearAllPoints() 146 | chat:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", 32, 32) 147 | chat:SetWidth(chat:GetWidth() - 40) 148 | chat:SetMovable(true) 149 | chat:SetUserPlaced(true) 150 | end 151 | 152 | local f = CreateFrame("Frame") 153 | f:RegisterEvent("PLAYER_ENTERING_WORLD") 154 | f:SetScript("OnEvent", function(self, event) 155 | MoveChatOnFirstLoad() 156 | self:UnregisterEvent("PLAYER_ENTERING_WORLD") 157 | end) 158 | -------------------------------------------------------------------------------- /RetailUI/Libs.xml: -------------------------------------------------------------------------------- 1 | 2 |