local s={[Enum.Material.SmoothPlastic]="\083\109\111\111\116\104 \080\108\097\115\116\105\099",[Enum.Material.Plastic]="\080\108\097\115\116\105\099",[Enum.Material.Brick]="\066\114\105\099\107",[Enum.Material.Cobblestone]="\067\111\098\098\108\101\115\116\111\110\101",[Enum.Material.Concrete]="\067\111\110\099\114\101\116\101";[Enum.Material.CorrodedMetal]="\067\111\114\114\111\100\101\100 \077\101\116\097\108",[Enum.Material.DiamondPlate]="\068\105\097\109\111\110\100 \080\108\097\116\101";[Enum.Material.Fabric]="\070\097\098\114\105\099";[Enum.Material.Foil]="\070\111\105\108";[Enum.Material.Granite]="\071\114\097\110\105\116\101";[Enum.Material.Grass]="\071\114\097\115\115",[Enum.Material.Ice]="\073\099\101",[Enum.Material.Marble]="\077\097\114\098\108\101";[Enum.Material.Metal]="\077\101\116\097\108",[Enum.Material.Neon]="\078\101\111\110";[Enum.Material.Pebble]="\080\101\098\098\108\101";[Enum.Material.Sand]="\083\097\110\100",[Enum.Material.Slate]="\083\108\097\116\101",[Enum.Material.Wood]="\087\111\111\100";[Enum.Material.WoodPlanks]="\087\111\111\100 \080\108\097\110\107\115",[Enum.Material.Glass]="\071\108\097\115\115"}function ShowUI()if UI then UI.Visible=true UIUpdater=Support.ScheduleRecurringTask(UpdateUI,.1)return end UI=Core.Tool.Interfaces.BTMaterialToolGUI:Clone()UI.Parent=Core.UI UI.Visible=true local m=UI.TransparencyOption.Input.TextBox local h=UI.ReflectanceOption.Input.TextBox local f=Support.Values(s)table.sort(f)MaterialDropdown=(Core.Cheer(UI.MaterialOption.Dropdown)).Start(f,"",function(m)SetProperty("\077\097\116\101\114\105\097\108",Support.FindTableOccurrence(s,m))end)SyncInputToProperty("\084\114\097\110\115\112\097\114\101\110\099\121",m)SyncInputToProperty("\082\101\102\108\101\099\116\097\110\099\101",h)UIUpdater=Support.ScheduleRecurringTask(UpdateUI,.1)end function HideUI()if not UI then return end UI.Visible=false UIUpdater:Stop()end function SyncInputToProperty(s,m)m.FocusLost:connect(function()SetProperty(s,tonumber(m.Text))end)end function SetProperty(s,m)if m==nil then return end TrackChange()for h,f in pairs(Selection.Items)do table.insert(HistoryRecord.Before,{Part=f;[s]=f[s]})table.insert(HistoryRecord.After,{Part=f,[s]=m})end RegisterChange()end function UpdateDataInputs(s)for s,m in pairs(s)do if not s:IsFocused()then s.Text=tostring(m)end end end

local Materials = {
	[Enum.Material.SmoothPlastic] = 'Smooth Plastic';
	[Enum.Material.Plastic] = 'Plastic';
	[Enum.Material.Brick] = 'Brick';
	[Enum.Material.Cobblestone] = 'Cobblestone';
	[Enum.Material.Concrete] = 'Concrete';
	[Enum.Material.CorrodedMetal] = 'Corroded Metal';
	[Enum.Material.DiamondPlate] = 'Diamond Plate';
	[Enum.Material.Fabric] = 'Fabric';
	[Enum.Material.Foil] = 'Foil';
	[Enum.Material.Granite] = 'Granite';
	[Enum.Material.Grass] = 'Grass';
	[Enum.Material.Ice] = 'Ice';
	[Enum.Material.Marble] = 'Marble';
	[Enum.Material.Metal] = 'Metal';
	[Enum.Material.Neon] = 'Neon';
	[Enum.Material.Pebble] = 'Pebble';
	[Enum.Material.Sand] = 'Sand';
	[Enum.Material.Slate] = 'Slate';
	[Enum.Material.Wood] = 'Wood';
	[Enum.Material.WoodPlanks] = 'Wood Planks';
	[Enum.Material.Glass] = 'Glass';
};

function ShowUI()
	-- Creates and reveals the UI

	-- Reveal UI if already created
	if UI then

		-- Reveal the UI
		UI.Visible = true;

		-- Update the UI every 0.1 seconds
		UIUpdater = Support.ScheduleRecurringTask(UpdateUI, 0.1);

		-- Skip UI creation
		return;

	end;

	-- Create the UI
	UI = Core.Tool.Interfaces.BTMaterialToolGUI:Clone();
	UI.Parent = Core.UI;
	UI.Visible = true;

	-- References to inputs
	local TransparencyInput = UI.TransparencyOption.Input.TextBox;
	local ReflectanceInput = UI.ReflectanceOption.Input.TextBox;

	-- Sort the material list
	local MaterialList = Support.Values(Materials);
	table.sort(MaterialList);

	-- Create the material selection dropdown
	MaterialDropdown = Core.Cheer(UI.MaterialOption.Dropdown).Start(MaterialList, '', function (Material)
		SetProperty('Material', Support.FindTableOccurrence(Materials, Material));
	end);

	-- Enable the transparency and reflectance inputs
	SyncInputToProperty('Transparency', TransparencyInput);
	SyncInputToProperty('Reflectance', ReflectanceInput);

	-- Update the UI every 0.1 seconds
	UIUpdater = Support.ScheduleRecurringTask(UpdateUI, 0.1);

end;

function HideUI()
	-- Hides the tool UI

	-- Make sure there's a UI
	if not UI then
		return;
	end;

	-- Hide the UI
	UI.Visible = false;

	-- Stop updating the UI
	UIUpdater:Stop();

end;

function SyncInputToProperty(Property, Input)
	-- Enables `Input` to change the given property

	-- Enable inputs
	Input.FocusLost:connect(function ()
		SetProperty(Property, tonumber(Input.Text));
	end);

end;

function SetProperty(Property, Value)

	-- Make sure the given value is valid
	if Value == nil then
		return;
	end;

	-- Start a history record
	TrackChange();

	-- Go through each part
	for _, Part in pairs(Selection.Items) do

		-- Store the state of the part before modification
		table.insert(HistoryRecord.Before, { Part = Part, [Property] = Part[Property] });

		-- Create the change request for this part
		table.insert(HistoryRecord.After, { Part = Part, [Property] = Value });

	end;

	-- Register the changes
	RegisterChange();

end;

function UpdateDataInputs(Data)
	-- Updates the data in the given TextBoxes when the user isn't typing in them

	-- Go through the inputs and data
	for Input, UpdatedValue in pairs(Data) do

		-- Makwe sure the user isn't typing into the input
		if not Input:IsFocused() then

			-- Set the input's value
			Input.Text = tostring(UpdatedValue);

		end;

	end;

end;
