Editor/Widgets/ToolsControls.cs
using Editor;
using Sandbox;
using Todo.Dialogs;

namespace Todo.Widgets;

public sealed class ToolsControls : Widget
{
	public ToolsControls( Widget parent ) : base( parent )
	{
		Layout = Layout.Row();
		Layout.Spacing = 2f;

		ToolButton refreshButton = Layout.Add( new ToolButton( "", "refresh", this ) );
		refreshButton.MouseClick = TodoDock.Instance.RefreshItems;
		refreshButton.ToolTip = "Refresh All";

		ToolButton showVisibilityButton = Layout.Add( new ToolButton( "", "visibility", this ) );
		showVisibilityButton.MouseClick = OpenVisibilityMenu;
		showVisibilityButton.ToolTip = "Change Visibility";
		showVisibilityButton.OnPaintOverride = () =>
		{
			OnVisibilityPaint( showVisibilityButton.LocalRect, showVisibilityButton );
			return true;
		};

		ToolButton moreButton = Layout.Add( new ToolButton( "", "more_vert", this ) );
		moreButton.MouseClick = OpenMoreMenu;
		moreButton.ToolTip = "More";
	}

	protected override void OnPaint()
	{
		Paint.ClearPen();
		Paint.SetBrush( Theme.ControlBackground );
		Paint.DrawRect( LocalRect, 4 );
	}

	// Edited version of ToolButton's OnPaint method
	private void OnVisibilityPaint( Rect rect, ToolButton button )
	{
		Color color = Color.White;

		bool showManual = TodoDock.Cookies.ShowManualEntries;
		bool showCode = TodoDock.Cookies.ShowCodeEntries;

		if ( showManual && showCode )
		{
			color = Theme.Blue;
		}
		else if ( showCode )
		{
			color = Theme.Green;
		}
		else if ( showManual is false && showCode is false )
		{
			color = Theme.TextDisabled;
		}

		Paint.ClearPen();
		if ( Paint.HasMouseOver )
			Paint.SetBrush( Theme.SurfaceBackground );
		else
			Paint.SetBrush( Theme.ControlBackground );

		Paint.DrawRect( rect.Shrink( 1.0f ), Theme.ControlRadius );

		Paint.SetPen( color );
		Paint.DrawIcon( rect, button.Icon, 14, TextFlag.Center );

		Update();
	}

	private void OpenVisibilityMenu()
	{
		var menu = new Menu( this );

		{
			var option = menu.AddOption( new Option( this, "Show Manual Entries", "checklist" ) );
			option.Checkable = true;
			option.Checked = TodoDock.Cookies.ShowManualEntries;
			option.Toggled = SetManual;
		}

		{
			var option = menu.AddOption( new Option( this, "Show Code Entries", "code" ) );
			option.Checkable = true;
			option.Checked = TodoDock.Cookies.ShowCodeEntries;
			option.Toggled = SetCode;
		}

		menu.DeleteOnClose = true;
		menu.OpenAtCursor( true );
	}

	[Shortcut( "todo.toggle-manual-entries", "CTRL+1", typeof( TodoDock ), ShortcutType.Application )]
	private void ToggleManual()
	{
		SetManual( !TodoDock.Cookies.ShowManualEntries );
	}

	[Shortcut( "todo.toggle-code-entries", "CTRL+2", typeof( TodoDock ), ShortcutType.Application )]
	private void ToggleCode()
	{
		SetCode( !TodoDock.Cookies.ShowCodeEntries );
	}

	private void SetManual( bool state )
	{
		TodoDock.Cookies.ShowManualEntries = state;
		TodoDock.Instance.SaveAndRefresh();
	}

	private void SetCode( bool state )
	{
		TodoDock.Cookies.ShowCodeEntries = state;
		TodoDock.Instance.SaveAndRefresh();
	}

	private void OpenMoreMenu()
	{
		var menu = new Menu( this );

		{
			var option = menu.AddOption( new Option( this, "Import Entries", "download" ) );
			option.Triggered = TodoDock.Instance.Import;
		}

		{
			var option = menu.AddOption( new Option( this, "Export Entries", "upload" ) );
			option.Triggered = TodoDock.Instance.Export;
		}

		menu.AddSeparator();

		{
			var option = menu.AddOption( new Option( this, "Settings", "settings" ) );
			option.Triggered = OpenSettingsWidget;
		}

		{
			var option = menu.AddOption( new Option( this, "Help", "question_mark" ) );
			option.Triggered = OpenHelpWidget;
		}

		menu.DeleteOnClose = true;
		menu.OpenAtCursor( true );
	}

	private void OpenHelpWidget()
	{
		var widget = new HelpDialog( null );
		widget.Show();
	}

	private void OpenSettingsWidget()
	{
		var widget = new SettingsDialog( null );
		widget.Show();
	}
}