22using Popstation . Pbp ;
33using PSXPackagerGUI . Models . Resource ;
44using PSXPackagerGUI . Pages ;
5+ using PSXPackagerGUI . Templates ;
56using System ;
67using System . ComponentModel ;
78using System . IO ;
1112using System . Windows . Controls ;
1213using System . Windows . Input ;
1314using System . Windows . Media ;
15+ using ImageLayer = PSXPackagerGUI . Models . Resource . ImageLayer ;
16+ using Layer = PSXPackagerGUI . Models . Resource . Layer ;
17+ using TextLayer = PSXPackagerGUI . Models . Resource . TextLayer ;
1418
1519namespace PSXPackagerGUI . Controls
1620{
17-
1821 /// <summary>
1922 /// Interaction logic for Resource.xaml
2023 /// </summary>
@@ -90,9 +93,21 @@ public string Text
9093 }
9194 }
9295
96+ public Selection ? Selection
97+ {
98+ get => _selection ;
99+ set
100+ {
101+ _selection = value ;
102+ OnPropertyChanged ( ) ;
103+ }
104+ }
105+
93106 public ResourceControl ( )
94107 {
95108 InitializeComponent ( ) ;
109+ Selection = new Selection ( ) ;
110+ SizeChanged += ( s , e ) => UpdateSelection ( ) ;
96111 }
97112
98113 private void More_OnClick ( object sender , RoutedEventArgs e )
@@ -118,10 +133,7 @@ public Layer? SelectedLayer
118133 {
119134 get => _selectedLayer ;
120135 set { _selectedLayer = value ;
121- if ( Resource . Composite != null )
122- {
123- Resource . Composite . SelectedLayer = _selectedLayer ;
124- }
136+ UpdateSelection ( ) ;
125137 OnPropertyChanged ( ) ;
126138 }
127139 }
@@ -131,6 +143,50 @@ public Layer? SelectedLayer
131143 private Layer ? _selectedLayer ;
132144 private bool resizeMode ;
133145 private bool dragStarted ;
146+ private Selection ? _selection ;
147+
148+ private void UpdateSelection ( )
149+ {
150+ if ( SelectedLayer == null )
151+ {
152+ Selection . Visibility = Visibility . Hidden ;
153+ return ;
154+ }
155+
156+ Selection . Visibility = Visibility . Visible ;
157+ var offsetX = ( Grid . ActualWidth - Resource . Composite . Width ) / 2 ;
158+ var offsetY = ( Grid . ActualHeight - Resource . Composite . Height ) / 2 ;
159+
160+ var left = offsetX + SelectedLayer . OffsetX ;
161+ var top = offsetY + SelectedLayer . OffsetY ;
162+ var width = SelectedLayer . Width ;
163+ var height = SelectedLayer . Height ;
164+
165+ Selection . C1 . X = left - 2 ;
166+ Selection . C1 . Y = top - 2 ;
167+
168+ Selection . C2 . X = left + width - 2 ;
169+ Selection . C2 . Y = top - 2 ;
170+
171+ Selection . C3 . X = left + width - 2 ;
172+ Selection . C3 . Y = top + height - 2 ;
173+
174+ Selection . C4 . X = left - 2 ;
175+ Selection . C4 . Y = top + height - 2 ;
176+
177+ Selection . E1 . X = left ;
178+ Selection . E1 . Y = top ;
179+
180+ Selection . E2 . X = left + width ;
181+ Selection . E2 . Y = top ;
182+
183+ Selection . E3 . X = left + width ;
184+ Selection . E3 . Y = top + height ;
185+
186+ Selection . E4 . X = left ;
187+ Selection . E4 . Y = top + height ;
188+
189+ }
134190
135191 private void UIElement_OnMouseDown ( object sender , MouseButtonEventArgs e )
136192 {
@@ -160,13 +216,18 @@ private void UIElement_OnMouseDown(object sender, MouseButtonEventArgs e)
160216
161217 var slayer = SelectedLayer ;
162218
219+ var offsetX = ( Grid . ActualWidth - Resource . Composite . Width ) / 2 ;
220+ var offsetY = ( Grid . ActualHeight - Resource . Composite . Height ) / 2 ;
221+
222+
163223 if ( slayer != null )
164224 {
165- var cornerX = slayer . OffsetX + slayer . Width ;
166- var cornerY = slayer . OffsetY + slayer . Height ;
167225
168- if ( pos . X >= cornerX - 2 && pos . X <= cornerX + 2 &&
169- pos . Y >= cornerY - 2 && pos . Y <= cornerY + 2 )
226+ var cornerX = offsetX + slayer . OffsetX + slayer . Width ;
227+ var cornerY = offsetY + slayer . OffsetY + slayer . Height ;
228+
229+ if ( pos . X >= cornerX - 4 && pos . X <= cornerX + 4 &&
230+ pos . Y >= cornerY - 4 && pos . Y <= cornerY + 4 )
170231 {
171232 resizeMode = true ;
172233 }
@@ -177,11 +238,10 @@ private void UIElement_OnMouseDown(object sender, MouseButtonEventArgs e)
177238 {
178239 foreach ( var layer in Resource . Composite . Layers . Reverse ( ) )
179240 {
180- if ( pos . X >= layer . OffsetX && pos . X <= layer . OffsetX + layer . Width &&
181- pos . Y >= layer . OffsetY && pos . Y <= layer . OffsetY + layer . Height )
241+ if ( pos . X >= offsetX + layer . OffsetX && pos . X <= offsetX + layer . OffsetX + layer . Width &&
242+ pos . Y >= offsetY + layer . OffsetY && pos . Y <= offsetY + layer . OffsetY + layer . Height )
182243 {
183244 SelectedLayer = layer ;
184- Resource . RefreshIcon ( ) ;
185245 break ;
186246 }
187247 }
@@ -218,7 +278,7 @@ private void UIElement_OnMouseMove(object sender, MouseEventArgs e)
218278
219279 if ( resizeMode || dragStarted )
220280 {
221- Resource . Composite . Render ( ) ;
281+ UpdateSelection ( ) ;
222282 Resource . RefreshIcon ( ) ;
223283 }
224284 }
@@ -243,7 +303,6 @@ private void Layer_OnMouseDown(object sender, MouseButtonEventArgs e)
243303 Resource . RefreshIcon ( ) ;
244304 }
245305 }
246- Resource . RefreshIcon ( ) ;
247306 }
248307
249308 private void MoveDownLayer_OnClick ( object sender , RoutedEventArgs e )
@@ -270,6 +329,7 @@ private void AppendImageLayer_OnClick(object sender, RoutedEventArgs e)
270329 Resource . Composite . AddLayer ( newLayer ) ;
271330
272331 SelectedLayer = newLayer ;
332+ UpdateSelection ( ) ;
273333 Resource . RefreshIcon ( ) ;
274334 }
275335
@@ -292,6 +352,7 @@ private void AppendTextLayer_OnClick(object sender, RoutedEventArgs e)
292352 Resource . Composite . AddLayer ( newLayer ) ;
293353
294354 SelectedLayer = newLayer ;
355+ UpdateSelection ( ) ;
295356 Resource . RefreshIcon ( ) ;
296357 }
297358 }
@@ -308,11 +369,41 @@ private void InsertImageLayer_OnClick(object sender, RoutedEventArgs e)
308369 return ;
309370
310371 using var stream = new FileStream ( openFileDialog . FileName , FileMode . Open , FileAccess . Read ) ;
311- var newLayer = new ImageLayer ( ImageProcessing . GetBitmapImage ( stream ) , "image" , openFileDialog . FileName ) ;
372+
373+ var image = ImageProcessing . GetBitmapImage ( stream ) ;
374+
375+ double scale = Math . Min (
376+ ( double ) Resource . Composite . Width / image . PixelWidth ,
377+ ( double ) Resource . Composite . Height / image . PixelHeight ) ;
378+
379+ int width = image . PixelWidth ;
380+ int height = image . PixelHeight ;
381+
382+ if ( scale >= 1 )
383+ {
384+ var resizeResult = MessageBox . Show ( App . Current . MainWindow ,
385+ "The selected image is larger than the content area. Do you want to resize it to fit?" ,
386+ "Load image" , MessageBoxButton . YesNoCancel ) ;
387+
388+ if ( resizeResult == MessageBoxResult . Yes )
389+ {
390+ width = ( int ) ( width * scale ) ;
391+ height = ( int ) ( width * scale ) ;
392+
393+ }
394+ }
395+
396+ var newLayer = new Models . Resource . ImageLayer ( image , "image" , openFileDialog . FileName ) ;
397+
398+ newLayer . Width = width ;
399+ newLayer . Height = height ;
400+ newLayer . OriginalWidth = width ;
401+ newLayer . OriginalHeight = height ;
312402
313403 Resource . Composite . InsertLayerAfter ( newLayer , layer ) ;
314404
315405 SelectedLayer = newLayer ;
406+ UpdateSelection ( ) ;
316407 Resource . RefreshIcon ( ) ;
317408 }
318409 }
@@ -338,6 +429,7 @@ private void InsertTextLayer_OnClick(object sender, RoutedEventArgs e)
338429 Resource . Composite . InsertLayerAfter ( newLayer , layer ) ;
339430
340431 SelectedLayer = newLayer ;
432+ UpdateSelection ( ) ;
341433 Resource . RefreshIcon ( ) ;
342434 }
343435 }
@@ -352,6 +444,7 @@ private void RemoveLayer_OnClick(object sender, RoutedEventArgs e)
352444 {
353445 SelectedLayer = null ;
354446 }
447+ UpdateSelection ( ) ;
355448 Resource . RefreshIcon ( ) ;
356449 }
357450 }
@@ -378,6 +471,7 @@ private void ResetLayer_OnClick(object sender, RoutedEventArgs e)
378471 if ( Resource . Composite != null && TryGetLayer ( sender , out var layer ) )
379472 {
380473 layer . Reset ( ) ;
474+ UpdateSelection ( ) ;
381475 Resource . RefreshIcon ( ) ;
382476 }
383477
0 commit comments