Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local httpService = game:GetService('HttpService')
- local ThemeManager = {} do
- ThemeManager.Folder = 'LinoriaLibSettings'
- -- if not isfolder(ThemeManager.Folder) then makefolder(ThemeManager.Folder) end
- ThemeManager.Library = nil
- ThemeManager.BuiltInThemes = {
- ['Default'] = { 1, httpService:JSONDecode('{"FontColor":"ffffff","MainColor":"1c1c1c","AccentColor":"0055ff","BackgroundColor":"141414","OutlineColor":"323232"}') },
- ['Dracula'] = { 2, httpService:JSONDecode('{"FontColor":"ffffff","MainColor":"232533","AccentColor":"6271a5","BackgroundColor":"1b1c27","OutlineColor":"7c82a7"}') },
- ['Bitch Bot'] = { 3, httpService:JSONDecode('{"FontColor":"ffffff","MainColor":"1e1e1e","AccentColor":"7e48a3","BackgroundColor":"232323","OutlineColor":"141414"}') },
- ['Kiriot Hub'] = { 4, httpService:JSONDecode('{"FontColor":"ffffff","MainColor":"30333b","AccentColor":"ffaa00","BackgroundColor":"1a1c20","OutlineColor":"141414"}') },
- ['Fatality'] = { 5, httpService:JSONDecode('{"FontColor":"ffffff","MainColor":"1e1842","AccentColor":"c50754","BackgroundColor":"191335","OutlineColor":"3c355d"}') },
- ['Green'] = { 6, httpService:JSONDecode('{"FontColor":"ffffff","MainColor":"141414","AccentColor":"00ff8b","BackgroundColor":"1c1c1c","OutlineColor":"3c3c3c"}') },
- ['Jester'] = { 7, httpService:JSONDecode('{"FontColor":"ffffff","MainColor":"242424","AccentColor":"db4467","BackgroundColor":"1c1c1c","OutlineColor":"373737"}') },
- ['Mint'] = { 8, httpService:JSONDecode('{"FontColor":"ffffff","MainColor":"242424","AccentColor":"3db488","BackgroundColor":"1c1c1c","OutlineColor":"373737"}') },
- ['Tokyo Night'] = { 9, httpService:JSONDecode('{"FontColor":"ffffff","MainColor":"191925","AccentColor":"6759b3","BackgroundColor":"16161f","OutlineColor":"323232"}') },
- ['Ubuntu'] = { 10, httpService:JSONDecode('{"FontColor":"ffffff","MainColor":"3e3e3e","AccentColor":"e2581e","BackgroundColor":"323232","OutlineColor":"191919"}') },
- }
- function ThemeManager:ApplyTheme(theme)
- local customThemeData = self:GetCustomTheme(theme)
- local data = customThemeData or self.BuiltInThemes[theme]
- if not data then return end
- -- custom themes are just regular dictionaries instead of an array with { index, dictionary }
- local scheme = data[2]
- for idx, col in next, customThemeData or scheme do
- self.Library[idx] = Color3.fromHex(col)
- if Options[idx] then
- Options[idx]:SetValueRGB(Color3.fromHex(col))
- end
- end
- self:ThemeUpdate()
- end
- function ThemeManager:ThemeUpdate()
- self.Library.FontColor = Options.FontColor.Value
- self.Library.MainColor = Options.MainColor.Value
- self.Library.AccentColor = Options.AccentColor.Value
- self.Library.BackgroundColor = Options.BackgroundColor.Value
- self.Library.OutlineColor = Options.OutlineColor.Value
- self.Library.AccentColorDark = self.Library:GetDarkerColor(self.Library.AccentColor);
- self.Library:UpdateColorsUsingRegistry()
- end
- function ThemeManager:LoadDefault()
- local theme = 'Default'
- local content = isfile(self.Folder .. '/themes/default.txt') and readfile(self.Folder .. '/themes/default.txt')
- local isDefault = true
- if content then
- if self.BuiltInThemes[content] then
- theme = content
- elseif self:GetCustomTheme(content) then
- theme = content
- isDefault = false;
- end
- elseif self.BuiltInThemes[self.DefaultTheme] then
- theme = self.DefaultTheme
- end
- if isDefault then
- Options.ThemeManager_ThemeList:SetValue(theme)
- else
- self:ApplyTheme(theme)
- end
- end
- function ThemeManager:SaveDefault(theme)
- writefile(self.Folder .. '/themes/default.txt', theme)
- end
- function ThemeManager:CreateThemeManager(groupbox)
- groupbox:AddLabel('Background color'):AddColorPicker('BackgroundColor', { Default = self.Library.BackgroundColor });
- groupbox:AddLabel('Main color') :AddColorPicker('MainColor', { Default = self.Library.MainColor });
- groupbox:AddLabel('Accent color'):AddColorPicker('AccentColor', { Default = self.Library.AccentColor });
- groupbox:AddLabel('Outline color'):AddColorPicker('OutlineColor', { Default = self.Library.OutlineColor });
- groupbox:AddLabel('Font color') :AddColorPicker('FontColor', { Default = self.Library.FontColor });
- local rainbowDisabled = false
- groupbox:AddToggle('RainbowTGGLE', {
- Text = 'Rainbow',
- Default = false, -- Default value (true / false)
- Tooltip = 'Rainbow colors hehe', -- Information shown when you hover over the toggle
- }):OnChanged(function()
- if Toggles.RainbowTGGLE.Value then
- rainbowDisabled = true
- else
- rainbowDisabled = false
- end
- end)
- local objects = {
- self.Library.AccentColor
- }
- local time = 1 -- time in seconds for the color to transition
- local step = 5 -- step size for RGB values
- local ThemesArray = {}
- for Name, Theme in next, self.BuiltInThemes do
- table.insert(ThemesArray, Name)
- end
- table.sort(ThemesArray, function(a, b) return self.BuiltInThemes[a][1] < self.BuiltInThemes[b][1] end)
- groupbox:AddDivider()
- groupbox:AddDropdown('ThemeManager_ThemeList', { Text = 'Theme list', Values = ThemesArray, Default = 1 })
- groupbox:AddButton('Set as default', function()
- self:SaveDefault(Options.ThemeManager_ThemeList.Value)
- self.Library:Notify(string.format('Set default theme to %q', Options.ThemeManager_ThemeList.Value))
- end)
- Options.ThemeManager_ThemeList:OnChanged(function()
- self:ApplyTheme(Options.ThemeManager_ThemeList.Value)
- end)
- groupbox:AddDivider()
- groupbox:AddDropdown('ThemeManager_CustomThemeList', { Text = 'Custom themes', Values = self:ReloadCustomThemes(), AllowNull = true, Default = 1 })
- groupbox:AddInput('ThemeManager_CustomThemeName', { Text = 'Custom theme name' })
- groupbox:AddButton('Load custom theme', function()
- self:ApplyTheme(Options.ThemeManager_CustomThemeList.Value)
- end)
- groupbox:AddButton('Save custom theme', function()
- self:SaveCustomTheme(Options.ThemeManager_CustomThemeName.Value)
- Options.ThemeManager_CustomThemeList.Values = self:ReloadCustomThemes()
- Options.ThemeManager_CustomThemeList:SetValues()
- Options.ThemeManager_CustomThemeList:SetValue(nil)
- end)
- groupbox:AddButton('Refresh list', function()
- Options.ThemeManager_CustomThemeList.Values = self:ReloadCustomThemes()
- Options.ThemeManager_CustomThemeList:SetValues()
- Options.ThemeManager_CustomThemeList:SetValue(nil)
- end)
- groupbox:AddButton('Set as default', function()
- if Options.ThemeManager_CustomThemeList.Value ~= nil and Options.ThemeManager_CustomThemeList.Value ~= '' then
- self:SaveDefault(Options.ThemeManager_CustomThemeList.Value)
- self.Library:Notify(string.format('Set default theme to %q', Options.ThemeManager_CustomThemeList.Value))
- end
- end)
- ThemeManager:LoadDefault()
- local function UpdateTheme()
- self:ThemeUpdate()
- end
- Options.BackgroundColor:OnChanged(UpdateTheme)
- Options.MainColor:OnChanged(UpdateTheme)
- Options.AccentColor:OnChanged(UpdateTheme)
- Options.OutlineColor:OnChanged(UpdateTheme)
- Options.FontColor:OnChanged(UpdateTheme)
- task.spawn(function()
- while task.wait(0.1) do
- if rainbowDisabled == true then
- UpdateTheme()
- for hue = 0, 255, step do
- local color = Color3.fromRGB(255 - hue, hue, 0) -- red to yellow
- for i = 1, #objects do
- objects[i] = color
- end
- task.wait(time/255*step)
- end
- for hue = 0, 255, step do
- local color = Color3.fromRGB(0, 255 - hue, hue) -- yellow to green
- for i = 1, #objects do
- objects[i] = color
- end
- task.wait(time/255*step)
- end
- for hue = 0, 255, step do
- local color = Color3.fromRGB(hue, 0, 255 - hue) -- green to blue
- for i = 1, #objects do
- objects[i] = color
- end
- task.wait(time/255*step)
- end
- for hue = 0, 255, step do
- local color = Color3.fromRGB(255 - hue, 0, hue) -- blue to magenta
- for i = 1, #objects do
- objects[i] = color
- end
- task.wait(time/255*step)
- end
- for hue = 0, 255, step do
- local color = Color3.fromRGB(hue, 0, 255) -- magenta to red
- for i = 1, #objects do
- objects[i] = color
- end
- task.wait(time/255*step)
- end
- end
- end
- end)
- end
- function ThemeManager:GetCustomTheme(file)
- local path = self.Folder .. '/themes/' .. file
- if not isfile(path) then
- return nil
- end
- local data = readfile(path)
- local success, decoded = pcall(httpService.JSONDecode, httpService, data)
- if not success then
- return nil
- end
- return decoded
- end
- function ThemeManager:SaveCustomTheme(file)
- if file:gsub(' ', '') == '' then
- return self.Library:Notify('Invalid file name for theme (empty)', 3)
- end
- local theme = {}
- local fields = { "FontColor", "MainColor", "AccentColor", "BackgroundColor", "OutlineColor" }
- for _, field in next, fields do
- theme[field] = Options[field].Value:ToHex()
- end
- writefile(self.Folder .. '/themes/' .. file .. '.json', httpService:JSONEncode(theme))
- end
- function ThemeManager:ReloadCustomThemes()
- local list = listfiles(self.Folder .. '/themes')
- local out = {}
- for i = 1, #list do
- local file = list[i]
- if file:sub(-5) == '.json' then
- -- i hate this but it has to be done ...
- local pos = file:find('.json', 1, true)
- local char = file:sub(pos, pos)
- while char ~= '/' and char ~= '\\' and char ~= '' do
- pos = pos - 1
- char = file:sub(pos, pos)
- end
- if char == '/' or char == '\\' then
- table.insert(out, file:sub(pos + 1))
- end
- end
- end
- return out
- end
- function ThemeManager:SetLibrary(lib)
- self.Library = lib
- end
- function ThemeManager:BuildFolderTree()
- local paths = {}
- -- build the entire tree if a path is like some-hub/phantom-forces
- -- makefolder builds the entire tree on Synapse X but not other exploits
- local parts = self.Folder:split('/')
- for idx = 1, #parts do
- paths[#paths + 1] = table.concat(parts, '/', 1, idx)
- end
- table.insert(paths, self.Folder .. '/themes')
- table.insert(paths, self.Folder .. '/settings')
- for i = 1, #paths do
- local str = paths[i]
- if not isfolder(str) then
- makefolder(str)
- end
- end
- end
- function ThemeManager:SetFolder(folder)
- self.Folder = folder
- self:BuildFolderTree()
- end
- function ThemeManager:CreateGroupBox(tab)
- assert(self.Library, 'Must set ThemeManager.Library first!')
- return tab:AddLeftGroupbox('Themes')
- end
- function ThemeManager:ApplyToTab(tab)
- assert(self.Library, 'Must set ThemeManager.Library first!')
- local groupbox = self:CreateGroupBox(tab)
- self:CreateThemeManager(groupbox)
- end
- function ThemeManager:ApplyToGroupbox(groupbox)
- assert(self.Library, 'Must set ThemeManager.Library first!')
- self:CreateThemeManager(groupbox)
- end
- ThemeManager:BuildFolderTree()
- end
- return ThemeManager
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement