Browse Source

Merge pull request #501 from neph1/fix_material_name_parsing

fixes texture name parsing issue in texturepanel
Rickard Edén 2 years ago
parent
commit
88ef54e8cf

+ 30 - 17
jme3-materialeditor/src/com/jme3/gde/materials/multiview/widgets/TexturePanel.java

@@ -3,7 +3,7 @@
  * and open the template in the editor.
  */
 
-/*
+ /*
  * SelectionPanel.java
  *
  * Created on 14.06.2010, 16:52:22
@@ -25,20 +25,31 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 /**
- * The TexturePanel is a row in the material editor representing a special texture
+ * The TexturePanel is a row in the material editor representing a special
+ * texture
+ *
  * @author normenhansen
  */
 public class TexturePanel extends MaterialPropertyWidget {
 
-    private final TexturePropertyEditor editor;
-    private final ProjectAssetManager manager;
+    private TexturePropertyEditor editor;
+    private ProjectAssetManager manager;
     private boolean flip = false;
     private boolean repeat = false;
     protected String textureName = null; // always enclosed with ""
     private TexturePreview texPreview;
     private final ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
 
-    /** Creates new form SelectionPanel */
+    /**
+     * Used by tests
+     */
+    protected TexturePanel() {
+        
+    }
+    
+    /**
+     * Creates new form SelectionPanel
+     */
     public TexturePanel(ProjectAssetManager manager) {
         this.manager = manager;
         editor = new TexturePropertyEditor(manager);
@@ -50,12 +61,11 @@ public class TexturePanel extends MaterialPropertyWidget {
             exec.execute(new Runnable() {
                 @Override
                 public void run() {
-                    try{
+                    try {
                         if (texPreview == null) {
                             texPreview = new TexturePreview(manager);
                         }
-                        final String[] textureNameComponents = textureName.split(" ");
-                        texPreview.requestPreview(stripQuotes(textureNameComponents[textureNameComponents.length - 1]), "", 80, 25, texturePreview, null);
+                        texPreview.requestPreview(extractTextureName(textureName), "", 80, 25, texturePreview, null);
                     } catch (AssetNotFoundException a) {
                         Logger.getLogger(MaterialEditorTopComponent.class.getName()).log(Level.WARNING, "Could not load texture {0}", textureName);
                     }
@@ -63,12 +73,15 @@ public class TexturePanel extends MaterialPropertyWidget {
             });
         }
     }
-    
-    private String stripQuotes(String s) {
-        return s.substring(1, s.length() - 1);
+
+    // visible for tests
+    protected String extractTextureName(String textureName) {
+        final String[] textureNameComponents = textureName.split("\"");
+        return textureNameComponents[textureNameComponents.length - 1];
     }
 
-    private void updateFlipRepeat() {
+    // visible for tests
+    protected void updateFlipRepeat() {
         String propertyValue = property.getValue();
         propertyValue = propertyValue.replaceFirst(textureName, "");
         if (flip && !propertyValue.contains("Flip ")) {
@@ -104,10 +117,10 @@ public class TexturePanel extends MaterialPropertyWidget {
         return resizedImage;
     }
 
-    /** This method is called from within the constructor to
-     * initialize the form.
-     * WARNING: Do NOT modify this code. The content of this method is
-     * always regenerated by the Form Editor.
+    /**
+     * This method is called from within the constructor to initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is always
+     * regenerated by the Form Editor.
      */
     @SuppressWarnings("unchecked")
     // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
@@ -263,6 +276,7 @@ public class TexturePanel extends MaterialPropertyWidget {
 
     private void texturePreviewMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_texturePreviewMouseClicked
         Component view = editor.getCustomEditor();
+        property.setValue("");
         view.setVisible(true);
         if (editor.getValue() != null) {
             textureName = "\"" + editor.getAsText() + "\"";
@@ -273,7 +287,6 @@ public class TexturePanel extends MaterialPropertyWidget {
             textureName = "\"\"";
             texturePreview.setIcon(null);
             texturePreview.setToolTipText("");
-            property.setValue("");
             fireChanged();
         }
     }//GEN-LAST:event_texturePreviewMouseClicked

+ 74 - 0
jme3-materialeditor/test/unit/src/com/jme3/gde/materials/multiview/widgets/TexturePanelTest.java

@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2009-2023 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.gde.materials.multiview.widgets;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import org.junit.jupiter.api.Test;
+
+
+/**
+ *
+ * @author rickard
+ */
+public class TexturePanelTest {
+    
+    public TexturePanelTest() {
+    }
+
+    @Test
+    public void testExtractTextureName() {
+        TexturePanel texturePanel = new TexturePanel();
+        String textureName = "\"simple_name.jpg\"";
+        String extractedName = texturePanel.extractTextureName(textureName);
+        assertEquals("simple_name.jpg", extractedName);
+        
+        String textureNameWithModifier = "Flip Repeat \"simple_name.jpg\"";
+        extractedName = texturePanel.extractTextureName(textureNameWithModifier);
+        assertEquals("simple_name.jpg", extractedName);
+        
+        String textureNameWithSpaces = "\"texture name with spaces.jpg\"";
+        extractedName = texturePanel.extractTextureName(textureNameWithSpaces);
+        assertEquals("texture name with spaces.jpg", extractedName);
+        
+        String textureNameWithSpaceAndModifier = "Flip Repeat \"texture name with spaces.jpg\"";
+        extractedName = texturePanel.extractTextureName(textureNameWithSpaceAndModifier);
+        assertEquals("texture name with spaces.jpg", extractedName);
+    }
+
+    /**
+     * Test of updateFlipRepeat method, of class TexturePanel.
+     */
+    @org.junit.Test
+    public void testUpdateFlipRepeat() {
+    }
+
+}