22
33import com .formdev .flatlaf .extras .FlatSVGIcon ;
44import io .github .pixelclover .uview .App ;
5+ import io .github .pixelclover .uview .core .PackageManager ;
56import io .github .pixelclover .uview .core .SettingsManager ;
6- import java .awt .*;
7+ import io .github .pixelclover .uview .model .UnityAsset ;
8+ import java .awt .BorderLayout ;
9+ import java .awt .Component ;
10+ import java .awt .Cursor ;
11+ import java .awt .Desktop ;
12+ import java .awt .Dimension ;
713import java .awt .datatransfer .DataFlavor ;
814import java .awt .datatransfer .Transferable ;
915import java .awt .event .MouseAdapter ;
1420import java .io .IOException ;
1521import java .io .InputStream ;
1622import java .nio .file .Path ;
23+ import java .util .HashMap ;
1724import java .util .List ;
25+ import java .util .Map ;
1826import java .util .Properties ;
19- import javax .swing .*;
27+ import javax .swing .BorderFactory ;
28+ import javax .swing .Box ;
29+ import javax .swing .BoxLayout ;
30+ import javax .swing .Icon ;
31+ import javax .swing .JDialog ;
32+ import javax .swing .JFileChooser ;
33+ import javax .swing .JFrame ;
34+ import javax .swing .JLabel ;
35+ import javax .swing .JMenu ;
36+ import javax .swing .JMenuBar ;
37+ import javax .swing .JMenuItem ;
38+ import javax .swing .JOptionPane ;
39+ import javax .swing .JPanel ;
40+ import javax .swing .JSeparator ;
41+ import javax .swing .JTabbedPane ;
42+ import javax .swing .SwingWorker ;
43+ import javax .swing .Timer ;
44+ import javax .swing .TransferHandler ;
2045import javax .swing .event .MenuEvent ;
2146import javax .swing .event .MenuListener ;
2247import javax .swing .filechooser .FileNameExtensionFilter ;
@@ -26,6 +51,11 @@ public class MainWindow extends JFrame {
2651
2752 private final SettingsManager settingsManager = new SettingsManager ();
2853 private final JTabbedPane tabbedPane ;
54+
55+ // --- ADDED: Maps to track open editor/viewer frames ---
56+ private final Map <String , JFrame > openAssetViewers = new HashMap <>();
57+ private final Map <String , JDialog > openMetaEditors = new HashMap <>();
58+
2959 private JMenuItem saveMenuItem ;
3060 private JMenuItem saveAsMenuItem ;
3161 private JMenuItem closeMenuItem ;
@@ -63,11 +93,104 @@ public void windowClosing(WindowEvent e) {
6393 updateState ();
6494 }
6595
66- private static String formatSize (long bytes ) {
67- if (bytes < 1024 ) return bytes + " B" ;
68- int exp = (int ) (Math .log (bytes ) / Math .log (1024 ));
69- char pre = "KMGTPE" .charAt (exp - 1 );
70- return String .format ("%.1f %sB" , bytes / Math .pow (1024 , exp ), pre );
96+ // --- ADDED: Method to show the asset viewer ---
97+ /**
98+ * Shows the asset viewer for a given asset. If a viewer for this asset is already open, it brings
99+ * that window to the front. Otherwise, it creates a new viewer.
100+ *
101+ * @param asset The asset to view.
102+ * @param packageManager The package manager instance.
103+ * @param onSaveCallback A callback to run when the asset is modified.
104+ */
105+ public void showAssetViewer (
106+ UnityAsset asset , PackageManager packageManager , Runnable onSaveCallback ) {
107+ String assetPath = asset .assetPath ();
108+ if (openAssetViewers .containsKey (assetPath )) {
109+ JFrame frame = openAssetViewers .get (assetPath );
110+ frame .toFront ();
111+ frame .requestFocus ();
112+ } else {
113+ AssetViewerFrame viewer = new AssetViewerFrame (this , asset , packageManager , onSaveCallback );
114+ viewer .addWindowListener (
115+ new WindowAdapter () {
116+ @ Override
117+ public void windowClosed (WindowEvent e ) {
118+ openAssetViewers .remove (assetPath );
119+ }
120+ });
121+ openAssetViewers .put (assetPath , viewer );
122+ viewer .setVisible (true );
123+ }
124+ }
125+
126+ // --- ADDED: Method to show the meta editor ---
127+ /**
128+ * Shows the meta editor for a given asset. If an editor for this asset is already open, it brings
129+ * that window to the front. Otherwise, it creates a new editor.
130+ *
131+ * @param asset The asset whose metadata is to be edited.
132+ * @param packageManager The package manager instance.
133+ * @param onSaveCallback A callback to run when the metadata is modified.
134+ */
135+ public void showMetaEditor (
136+ UnityAsset asset , PackageManager packageManager , Runnable onSaveCallback ) {
137+ String assetPath = asset .assetPath ();
138+ if (openMetaEditors .containsKey (assetPath )) {
139+ JDialog dialog = openMetaEditors .get (assetPath );
140+ dialog .toFront ();
141+ dialog .requestFocus ();
142+ } else {
143+ MetaEditorFrame editor = new MetaEditorFrame (this , asset , packageManager , onSaveCallback );
144+ editor .addWindowListener (
145+ new WindowAdapter () {
146+ @ Override
147+ public void windowClosed (WindowEvent e ) {
148+ openMetaEditors .remove (assetPath );
149+ }
150+ });
151+ openMetaEditors .put (assetPath , editor );
152+ editor .setVisible (true );
153+ }
154+ }
155+
156+ private class FileDropHandler extends TransferHandler {
157+ @ Override
158+ public boolean canImport (TransferSupport support ) {
159+ if (!support .isDataFlavorSupported (DataFlavor .javaFileListFlavor )) {
160+ return false ;
161+ }
162+ try {
163+ Transferable t = support .getTransferable ();
164+ List <File > files = (List <File >) t .getTransferData (DataFlavor .javaFileListFlavor );
165+ for (File file : files ) {
166+ if (file .isFile () && file .getName ().toLowerCase ().endsWith (".unitypackage" )) {
167+ return true ; // Accept drop if at least one unitypackage is present
168+ }
169+ }
170+ } catch (Exception e ) {
171+ return false ;
172+ }
173+ return false ;
174+ }
175+
176+ @ Override
177+ public boolean importData (TransferSupport support ) {
178+ if (!canImport (support )) {
179+ return false ;
180+ }
181+ try {
182+ Transferable t = support .getTransferable ();
183+ List <File > files = (List <File >) t .getTransferData (DataFlavor .javaFileListFlavor );
184+ for (File file : files ) {
185+ if (file .isFile () && file .getName ().toLowerCase ().endsWith (".unitypackage" )) {
186+ openPackage (file );
187+ }
188+ }
189+ return true ;
190+ } catch (Exception e ) {
191+ return false ;
192+ }
193+ }
71194 }
72195
73196 private JPanel createStatusBar () {
@@ -100,6 +223,13 @@ private void updateMemoryUsage() {
100223 memoryUsageLabel .setText (String .format ("Mem: %s" , formatSize (usedMemory )));
101224 }
102225
226+ private static String formatSize (long bytes ) {
227+ if (bytes < 1024 ) return bytes + " B" ;
228+ int exp = (int ) (Math .log (bytes ) / Math .log (1024 ));
229+ char pre = "KMGTPE" .charAt (exp - 1 );
230+ return String .format ("%.1f %sB" , bytes / Math .pow (1024 , exp ), pre );
231+ }
232+
103233 private JMenuBar createMenuBar () {
104234 JMenuBar menuBar = new JMenuBar ();
105235 JMenu fileMenu = new JMenu ("File" );
@@ -198,7 +328,7 @@ public void mouseClicked(MouseEvent e) {
198328 private String getAppVersion () {
199329 try (InputStream is =
200330 App .class .getResourceAsStream (
201- "/META-INF/maven/io.github.pixelclover.uview /uview/pom.properties" )) {
331+ "/META-INF/maven/io.github.pixelclover/uview/pom.properties" )) {
202332 if (is == null ) return "N/A" ;
203333 Properties props = new Properties ();
204334 props .load (is );
@@ -464,44 +594,4 @@ private void setWorking(boolean working, String status) {
464594 statusLabel .setText (status );
465595 }
466596 }
467-
468- private class FileDropHandler extends TransferHandler {
469- @ Override
470- public boolean canImport (TransferSupport support ) {
471- if (!support .isDataFlavorSupported (DataFlavor .javaFileListFlavor )) {
472- return false ;
473- }
474- try {
475- Transferable t = support .getTransferable ();
476- List <File > files = (List <File >) t .getTransferData (DataFlavor .javaFileListFlavor );
477- for (File file : files ) {
478- if (file .isFile () && file .getName ().toLowerCase ().endsWith (".unitypackage" )) {
479- return true ; // Accept drop if at least one unitypackage is present
480- }
481- }
482- } catch (Exception e ) {
483- return false ;
484- }
485- return false ;
486- }
487-
488- @ Override
489- public boolean importData (TransferSupport support ) {
490- if (!canImport (support )) {
491- return false ;
492- }
493- try {
494- Transferable t = support .getTransferable ();
495- List <File > files = (List <File >) t .getTransferData (DataFlavor .javaFileListFlavor );
496- for (File file : files ) {
497- if (file .isFile () && file .getName ().toLowerCase ().endsWith (".unitypackage" )) {
498- openPackage (file );
499- }
500- }
501- return true ;
502- } catch (Exception e ) {
503- return false ;
504- }
505- }
506- }
507597}
0 commit comments