@@ -37,6 +37,8 @@ namespace Snowcloak.UI;
3737public partial class CompactUi
3838{
3939 private const float ExpandedSidebarWidth = ModernSidebar . ExpandedWidth ;
40+ private const float CollapsedSidebarWidth = 28f ;
41+ private const float CollapseToggleRowHeight = 26f ;
4042
4143 private static void DrawSidebarSeparator ( ) => ModernSidebar . DrawSeparator ( ) ;
4244
@@ -69,12 +71,19 @@ private string GetFrostbrandSidebarLabel()
6971 }
7072 private void DrawSidebar ( )
7173 {
72- var sidebarWidth = ExpandedSidebarWidth * ImGuiHelpers . GlobalScale ;
74+ bool collapsed = _configService . Current . CompactUiSidebarCollapsed ;
75+ var sidebarWidth = ( collapsed ? CollapsedSidebarWidth : ExpandedSidebarWidth ) * ImGuiHelpers . GlobalScale ;
7376
7477 using var childBg = ImRaii . PushColor ( ImGuiCol . ChildBg , SnowcloakColours . CompactPanel ) ;
7578 using var childPadding = ImRaii . PushStyle ( ImGuiStyleVar . WindowPadding , new Vector2 ( 14f , 12f ) * ImGuiHelpers . GlobalScale ) ;
7679 using ( var child = ImRaii . Child ( "Sidebar" , new Vector2 ( sidebarWidth , - 1 ) , false ) )
7780 {
81+ if ( collapsed )
82+ {
83+ DrawCollapsedSidebar ( ) ;
84+ return ;
85+ }
86+
7887 using var sidebarPadding = ImRaii . PushStyle ( ImGuiStyleVar . FramePadding , new Vector2 ( 10f , 9f ) * ImGuiHelpers . GlobalScale ) ;
7988 using var sidebarSpacing = ImRaii . PushStyle ( ImGuiStyleVar . ItemSpacing , new Vector2 ( ImGui . GetStyle ( ) . ItemSpacing . X , 8f * ImGuiHelpers . GlobalScale ) ) ;
8089 ImGuiHelpers . ScaledDummy ( 9 ) ;
@@ -114,20 +123,69 @@ private void DrawSidebar()
114123
115124 DrawSidebarAction ( FontAwesomeIcon . Book , "User Guide" ,
116125 ( ) => Util . OpenLink ( "https://docs.snowcloak-sync.com" ) ) ;
117- float bottomElementsHeight = 108f * ImGuiHelpers . GlobalScale ;
126+
127+ float bottomElementsHeight = 108f * ImGuiHelpers . GlobalScale
128+ + CollapseToggleRowHeight * ImGuiHelpers . GlobalScale + ImGui . GetStyle ( ) . ItemSpacing . Y ;
118129 var availableSpace = ImGui . GetContentRegionAvail ( ) . Y ;
119130 if ( availableSpace > bottomElementsHeight )
120131 {
121132 ImGui . SetCursorPosY ( ImGui . GetCursorPosY ( ) + availableSpace - bottomElementsHeight ) ;
122133 }
123134
135+ DrawSidebarCollapseToggle ( collapsed : false ) ;
136+
124137 var connectedIcon = _serverManager . CurrentServer ! . FullPause ? FontAwesomeIcon . Unlink : FontAwesomeIcon . Link ;
125138 var color = ! _serverManager . CurrentServer ! . FullPause ? SnowcloakColours . OnlineBlue : SnowcloakColours . CompactOffline ;
126139
127140 DrawSidebarServerFooter ( connectedIcon , color ) ;
128141 }
129142 }
130143
144+ private void DrawCollapsedSidebar ( )
145+ {
146+ var availableSpace = ImGui . GetContentRegionAvail ( ) . Y ;
147+ var toggleHeight = CollapseToggleRowHeight * ImGuiHelpers . GlobalScale ;
148+ if ( availableSpace > toggleHeight )
149+ {
150+ ImGui . SetCursorPosY ( ImGui . GetCursorPosY ( ) + availableSpace - toggleHeight ) ;
151+ }
152+
153+ DrawSidebarCollapseToggle ( collapsed : true ) ;
154+ }
155+
156+ private void DrawSidebarCollapseToggle ( bool collapsed )
157+ {
158+ var scale = ImGuiHelpers . GlobalScale ;
159+ var width = ImGui . GetContentRegionAvail ( ) . X ;
160+ var height = CollapseToggleRowHeight * scale ;
161+ var min = ImGui . GetCursorScreenPos ( ) ;
162+
163+ ImGui . InvisibleButton ( "##sidebar-collapse-toggle" , new Vector2 ( width , height ) ) ;
164+ var clicked = ImGui . IsItemClicked ( ImGuiMouseButton . Left ) ;
165+ var hovered = ImGui . IsItemHovered ( ) ;
166+ var drawList = ImGui . GetWindowDrawList ( ) ;
167+
168+ if ( hovered )
169+ {
170+ drawList . AddRectFilled ( min , min + new Vector2 ( width , height ) , Colour . Vector4ToColour ( new Vector4 ( 0.090f , 0.150f , 0.220f , 0.54f ) ) , 3f * scale ) ;
171+ }
172+
173+ var icon = collapsed ? FontAwesomeIcon . ChevronRight : FontAwesomeIcon . ChevronLeft ;
174+ var iconText = icon . ToIconString ( ) ;
175+ ImGui . PushFont ( UiBuilder . IconFont ) ;
176+ var iconSize = ImGui . CalcTextSize ( iconText ) ;
177+ var iconPos = min + new Vector2 ( ( width - iconSize . X ) * 0.5f , ( height - iconSize . Y ) * 0.5f ) ;
178+ drawList . AddText ( iconPos , Colour . Vector4ToColour ( SnowcloakColours . CompactTextMuted ) , iconText ) ;
179+ ImGui . PopFont ( ) ;
180+
181+ if ( clicked )
182+ {
183+ _configService . Update ( c => c . CompactUiSidebarCollapsed = ! collapsed ) ;
184+ }
185+
186+ ElezenImgui . AttachTooltip ( collapsed ? "Expand sidebar" : "Collapse sidebar" ) ;
187+ }
188+
131189 private void DrawSidebarServerFooter ( FontAwesomeIcon connectedIcon , Vector4 connectionColor )
132190 {
133191 var scale = ImGuiHelpers . GlobalScale ;
0 commit comments