@@ -13,8 +13,6 @@ namespace UICustomizer.Edit.Helpers
1313{
1414 public static class LayoutHelper
1515 {
16- public static string CurrentLayoutName { get ; set ; } = "Vanilla" ;
17-
1816 #region save layouts
1917
2018 public static void WriteLayoutFile ( string layoutName , LayoutData data )
@@ -49,6 +47,48 @@ public static void WriteLayoutFile(string layoutName, LayoutData data)
4947 }
5048 }
5149
50+ public static void SaveCurrentAs ( string layoutName , bool setAsActiveInConfig = true )
51+ {
52+ if ( string . IsNullOrWhiteSpace ( layoutName ) )
53+ layoutName = "CustomLayout" ;
54+
55+ GetActiveResourceTheme ( out ResourceTheme currentTheme ) ;
56+ GetActiveMapTheme ( out MapTheme mapTheme ) ;
57+
58+ var data = new LayoutData
59+ {
60+ ResourceTheme = currentTheme ,
61+ MapTheme = mapTheme ,
62+ Offsets = new Dictionary < Element , Vector2 >
63+ {
64+ [ Element . Chat ] = new Vector2 ( ChatHook . OffsetX , ChatHook . OffsetY ) ,
65+ [ Element . Hotbar ] = new Vector2 ( HotbarHook . OffsetX , HotbarHook . OffsetY ) ,
66+ [ Element . Map ] = new Vector2 ( MapHook . OffsetX , MapHook . OffsetY ) ,
67+ [ Element . InfoAccs ] = new Vector2 ( InfoAccsHook . OffsetX , InfoAccsHook . OffsetY ) ,
68+ [ Element . ClassicLife ] = new Vector2 ( ClassicLifeHook . OffsetX , ClassicLifeHook . OffsetY ) ,
69+ [ Element . ClassicMana ] = new Vector2 ( ClassicManaHook . OffsetX , ClassicManaHook . OffsetY ) ,
70+ [ Element . FancyLife ] = new Vector2 ( FancyLifeHook . OffsetX , FancyLifeHook . OffsetY ) ,
71+ [ Element . FancyMana ] = new Vector2 ( FancyManaHook . OffsetX , FancyManaHook . OffsetY ) ,
72+ [ Element . HorizontalBars ] = new Vector2 ( HorizontalBarsHook . OffsetX , HorizontalBarsHook . OffsetY ) ,
73+ [ Element . BarLifeText ] = new Vector2 ( BarLifeTextHook . OffsetX , BarLifeTextHook . OffsetY ) ,
74+ [ Element . BarManaText ] = new Vector2 ( BarManaTextHook . OffsetX , BarManaTextHook . OffsetY ) ,
75+ [ Element . Buffs ] = new Vector2 ( BuffHook . OffsetX , BuffHook . OffsetY ) ,
76+ [ Element . Inventory ] = new Vector2 ( InventoryHook . OffsetX , InventoryHook . OffsetY )
77+ }
78+ } ;
79+
80+ WriteLayoutFile ( layoutName , data ) ;
81+
82+ if ( setAsActiveInConfig )
83+ {
84+ var cfg = ModContent . GetInstance < Config > ( ) ;
85+ cfg . Layout = layoutName ;
86+ Terraria . ModLoader . Config . ConfigManager . Save ( cfg ) ;
87+ }
88+
89+ Log . Info ( $ "Saved layout '{ layoutName } ' with resource theme '{ currentTheme } ' and map theme '{ mapTheme } '.") ;
90+ }
91+
5292 #endregion
5393
5494 #region load layouts
@@ -97,6 +137,7 @@ public static void ApplyLayout(string layoutName)
97137 Log . Error ( $ "Error applying layout '{ layoutName } ': { ex . Message } ") ;
98138 }
99139 }
140+
100141 public static void TryApplyLayoutFromConfig ( )
101142 {
102143 var cfg = ModContent . GetInstance < Config > ( ) ;
@@ -117,18 +158,25 @@ public static void TryApplyLayoutFromConfig()
117158
118159 #endregion
119160
120- public static void SaveCurrentAs ( string layoutName , bool setAsActiveInConfig = true )
161+ public static void CreateAndOpenNewLayoutFile ( string layoutName )
121162 {
122- if ( string . IsNullOrWhiteSpace ( layoutName ) )
123- layoutName = "CustomLayout" ;
163+ string basePath = FileHelper . GetLayoutFilePath ( layoutName ) ;
164+ string path = basePath ;
165+ int counter = 1 ;
124166
167+ // Generate unique filename if needed
168+ while ( File . Exists ( path ) )
169+ {
170+ path = FileHelper . GetLayoutFilePath ( $ "{ layoutName } { counter } ") ;
171+ counter ++ ;
172+ }
173+
174+ // Get current theme and positions
125175 GetActiveResourceTheme ( out ResourceTheme currentTheme ) ;
126- GetActiveMapTheme ( out MapTheme mapTheme ) ;
127176
128- var data = new LayoutData
177+ var layoutData = new LayoutData
129178 {
130179 ResourceTheme = currentTheme ,
131- MapTheme = mapTheme ,
132180 Offsets = new Dictionary < Element , Vector2 >
133181 {
134182 [ Element . Chat ] = new Vector2 ( ChatHook . OffsetX , ChatHook . OffsetY ) ,
@@ -143,20 +191,13 @@ public static void SaveCurrentAs(string layoutName, bool setAsActiveInConfig = t
143191 [ Element . BarLifeText ] = new Vector2 ( BarLifeTextHook . OffsetX , BarLifeTextHook . OffsetY ) ,
144192 [ Element . BarManaText ] = new Vector2 ( BarManaTextHook . OffsetX , BarManaTextHook . OffsetY ) ,
145193 [ Element . Buffs ] = new Vector2 ( BuffHook . OffsetX , BuffHook . OffsetY ) ,
146- [ Element . Inventory ] = new Vector2 ( InventoryHook . OffsetX , InventoryHook . OffsetY )
194+ [ Element . Inventory ] = new Vector2 ( InventoryHook . OffsetX , InventoryHook . OffsetY ) ,
147195 }
148196 } ;
149197
150- WriteLayoutFile ( layoutName , data ) ;
198+ LayoutHelper . WriteLayoutFile ( Path . GetFileNameWithoutExtension ( path ) , layoutData ) ;
151199
152- if ( setAsActiveInConfig )
153- {
154- var cfg = ModContent . GetInstance < Config > ( ) ;
155- cfg . Layout = layoutName ;
156- Terraria . ModLoader . Config . ConfigManager . Save ( cfg ) ;
157- }
158-
159- Log . Info ( $ "Saved layout '{ layoutName } ' with resource theme '{ currentTheme } ' and map theme '{ mapTheme } '.") ;
200+ FileHelper . OpenFileAtPath ( path ) ;
160201 }
161202
162203 private static void ApplyPositions ( Dictionary < Element , Vector2 > positions )
0 commit comments