commit f12e4de950e92f6accd9d7e8c5527bbf8ec37b3f
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Dec 6 23:36:38 2021 +0100

    Progress with Config UI.

diff --git a/src/main/java/org/distorted/config/ConfigScreenPane.java b/src/main/java/org/distorted/config/ConfigScreenPane.java
index 30916188..3b187481 100644
--- a/src/main/java/org/distorted/config/ConfigScreenPane.java
+++ b/src/main/java/org/distorted/config/ConfigScreenPane.java
@@ -34,12 +34,13 @@ import org.distorted.objects.RubikObjectList;
 
 import java.io.InputStream;
 
-import static android.view.View.inflate;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 public class ConfigScreenPane
 {
+  public static final int MESH_NICE = 0;
+  public static final int MESH_FAST = 1;
+
   private static final int[] IMAGES =
     {
     R.id.configDifficulty0,
@@ -56,12 +57,15 @@ public class ConfigScreenPane
 
   private JsonReader mReader;
   private int mObjectOrdinal;
+  private boolean mProgramatic;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private void switchMesh(ConfigActivity act, boolean simple)
+  private void switchMeshState(ConfigActivity act, int meshState)
     {
+    RubikObjectList.setMeshState(mObjectOrdinal,meshState);
 
+    // TODO: rebuild the mesh
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -98,6 +102,14 @@ public class ConfigScreenPane
       ImageView image = layout.findViewById(IMAGES[i]);
       image.setImageResource( i==difficulty ? R.drawable.ui_difficulty_checked : R.drawable.ui_difficulty_unchecked );
       }
+
+    int meshState = object.getMeshState();
+    int id = meshState==MESH_NICE ? R.id.meshNice : R.id.meshSimple;
+    RadioButton button = act.findViewById(id);
+
+    mProgramatic = true;
+    button.setChecked(true);
+    mProgramatic = false;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -159,7 +171,11 @@ public class ConfigScreenPane
       @Override
       public void onCheckedChanged(RadioGroup group, int checkedId)
         {
-        switchMesh( act, checkedId != R.id.meshNice );
+        if( !mProgramatic )
+          {
+          int meshState = checkedId == R.id.meshNice ? MESH_NICE : MESH_FAST;
+          switchMeshState( act, meshState );
+          }
         }
       });
 
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index a4219feb..02280698 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -254,6 +254,8 @@ public class RubikActivity extends AppCompatActivity
         RubikScores scores = RubikScores.getInstance();
         scores.incrementNumRuns();
         scores.setCountry(this);
+        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
+        RubikObjectList.restoreMeshState(preferences);
         }
 
       int object = RubikObjectList.getCurrObject();
@@ -307,6 +309,7 @@ public class RubikActivity extends AppCompatActivity
         }
 
       RubikObjectList.savePreferences(editor);
+      RubikObjectList.saveMeshState(editor);
       ScreenList.savePreferences(editor);
       RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
       view.getObjectControl().savePreferences(editor);
diff --git a/src/main/java/org/distorted/objects/RubikObject.java b/src/main/java/org/distorted/objects/RubikObject.java
index d5fce5db..cb01c80a 100644
--- a/src/main/java/org/distorted/objects/RubikObject.java
+++ b/src/main/java/org/distorted/objects/RubikObject.java
@@ -24,6 +24,8 @@ import org.distorted.jsons.ObjectJson;
 import org.distorted.objectlib.main.ObjectType;
 import org.distorted.patterns.RubikPatternList;
 
+import static org.distorted.config.ConfigScreenPane.MESH_NICE;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 public class RubikObject
@@ -37,6 +39,8 @@ public class RubikObject
   private final int[] mIconID;
   private final String[][] mPatterns;
 
+  private int mMeshState;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   RubikObject(ObjectType type)
@@ -52,6 +56,22 @@ public class RubikObject
 
     int patternOrdinal  = RubikPatternList.getOrdinal(mOrdinal);
     mPatterns = RubikPatternList.getPatterns(patternOrdinal);
+
+    mMeshState = MESH_NICE;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void setMeshState(int state)
+    {
+    mMeshState = state;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getMeshState()
+    {
+    return mMeshState;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/RubikObjectList.java b/src/main/java/org/distorted/objects/RubikObjectList.java
index a28b8190..143a6125 100644
--- a/src/main/java/org/distorted/objects/RubikObjectList.java
+++ b/src/main/java/org/distorted/objects/RubikObjectList.java
@@ -28,6 +28,8 @@ import org.distorted.screens.RubikScreenPlay;
 import org.distorted.screens.ScreenList;
 
 import java.util.ArrayList;
+
+import static org.distorted.config.ConfigScreenPane.MESH_NICE;
 import static org.distorted.objectlib.main.ObjectType.NUM_OBJECTS;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -107,15 +109,41 @@ public class RubikObjectList
     return type.getNumScramble();
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static void setMeshState(int ordinal, int state)
+    {
+    if( ordinal>=0 && ordinal<mNumObjects ) mObjects.get(ordinal).setMeshState(state);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static int getMeshState(int ordinal)
+    {
+    return (ordinal>=0 && ordinal<mNumObjects) ? mObjects.get(ordinal).getMeshState() : MESH_NICE;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public static void savePreferences(SharedPreferences.Editor editor)
     {
-    RubikObject object = getObject(mObject);
+    RubikObject obj = getObject(mObject);
+    if( obj!=null ) editor.putString("rol_objName", obj.getName() );
+    }
 
-    if( object!=null )
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static void saveMeshState(SharedPreferences.Editor editor)
+    {
+    for(int i=0; i<mNumObjects; i++)
       {
-      editor.putString("statePlay_objName", object.getName() );
+      RubikObject obj = getObject(i);
+
+      if( obj!=null )
+        {
+        String name = obj.getName();
+        editor.putInt("rol_"+name, obj.getMeshState() );
+        }
       }
     }
 
@@ -125,12 +153,29 @@ public class RubikObjectList
     {
     RubikObject object = getObject(DEF_OBJECT);
     String defName = object==null ? "CUBE_3" : object.getName();
-    String objName= preferences.getString("statePlay_objName",defName);
+    String objName= preferences.getString("rol_objName",defName);
     mObject = getOrdinal(objName);
 
     if( mObject<0 || mObject>=mNumObjects ) mObject = DEF_OBJECT;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static void restoreMeshState(SharedPreferences preferences)
+    {
+    for(int i=0; i<mNumObjects; i++)
+      {
+      RubikObject obj = getObject(i);
+
+      if( obj!=null )
+        {
+        String name  = obj.getName();
+        int meshState= preferences.getInt("rol_"+name,MESH_NICE);
+        obj.setMeshState(meshState);
+        }
+      }
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public static boolean setCurrObject(RubikActivity act, int ordinal)
diff --git a/src/main/java/org/distorted/screens/RubikScreenPlay.java b/src/main/java/org/distorted/screens/RubikScreenPlay.java
index b2959058..b71abce5 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPlay.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPlay.java
@@ -337,6 +337,7 @@ public class RubikScreenPlay extends RubikScreenBase
       @Override
       public void onClick(View v)
         {
+        if( mObjectPopup!=null ) mObjectPopup.dismiss();
         int currObject = RubikObjectList.getCurrObject();
         act.switchConfig(currObject);
         }
