commit fa67911153665e1cca36b4a8f94b8e7be816d10b
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Sep 11 12:01:17 2020 +0100

    Make the ObjectPopup a 2D grid - corrections.

diff --git a/src/main/java/org/distorted/objects/RubikObjectList.java b/src/main/java/org/distorted/objects/RubikObjectList.java
index b55a868b..16220f06 100644
--- a/src/main/java/org/distorted/objects/RubikObjectList.java
+++ b/src/main/java/org/distorted/objects/RubikObjectList.java
@@ -42,7 +42,8 @@ public enum RubikObjectList
                        {5 , 24, R.raw.cube5, R.drawable.ui_small_cube5, R.drawable.ui_medium_cube5, R.drawable.ui_big_cube5, R.drawable.ui_huge_cube5}
                      },
          RubikCube.class,
-         new RubikMovementCube()
+         new RubikMovementCube(),
+         0
        ),
 
   PYRA (
@@ -52,7 +53,8 @@ public enum RubikObjectList
                        {5 , 20, R.raw.pyra5, R.drawable.ui_small_pyra5, R.drawable.ui_medium_pyra5, R.drawable.ui_big_pyra5, R.drawable.ui_huge_pyra5}
                      },
          RubikPyraminx.class,
-         new RubikMovementPyraminx()
+         new RubikMovementPyraminx(),
+         1
        ),
 
   DINO (
@@ -60,7 +62,8 @@ public enum RubikObjectList
                        {3 , 10, R.raw.dino, R.drawable.ui_small_dino, R.drawable.ui_medium_dino, R.drawable.ui_big_dino, R.drawable.ui_huge_dino} ,
                      },
          RubikDino.class,
-         new RubikMovementDino()
+         new RubikMovementDino(),
+         2
        ),
   ;
 
@@ -72,9 +75,12 @@ public enum RubikObjectList
   private final int[] mObjectSizes, mMaxLevels, mSmallIconIDs, mMediumIconIDs, mBigIconIDs, mHugeIconIDs, mResourceIDs;
   private final Class<? extends RubikObject> mObjectClass;
   private final RubikMovement mObjectMovementClass;
+  private final int mColumn, mNumSizes;
+
   private static final RubikObjectList[] objects;
   private static int mNumAll;
   private static int[] mIndices;
+  private static int mColCount, mRowCount;
 
   static
     {
@@ -85,8 +91,6 @@ public enum RubikObjectList
     int maxLevel= Integer.MIN_VALUE;
     int maxSize = Integer.MIN_VALUE;
 
-    mIndices = new int[] {0,1,2};
-
     for(RubikObjectList object: RubikObjectList.values())
       {
       objects[i] = object;
@@ -108,23 +112,68 @@ public enum RubikObjectList
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// TODO
+
+  private static void setUpColAndRow()
+    {
+    mIndices = new int[NUM_OBJECTS];
+    mColCount= 0;
+
+    for(int obj=0; obj<NUM_OBJECTS; obj++)
+      {
+      mIndices[obj] = objects[obj].mColumn;
+      if( mIndices[obj]>=mColCount ) mColCount = mIndices[obj]+1;
+      }
+
+    mRowCount = 0;
+
+    for(int col=0; col<mColCount; col++)
+      {
+      int numObjects = computeNumObjectsInColumn(col);
+      if( numObjects>mRowCount ) mRowCount = numObjects;
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private static int computeNumObjectsInColumn(int column)
+    {
+    int num=0;
+
+    for(int object=0; object<NUM_OBJECTS; object++)
+      {
+      if( objects[object].mColumn == column )
+        {
+        num += objects[object].mNumSizes;
+        }
+      }
+
+    return num;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
   public static int getColumnCount()
     {
-    return 3;
+    if( mIndices==null ) setUpColAndRow();
+
+    return mColCount;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// TODO
+
   public static int getRowCount()
     {
-    return 4;
+    if( mIndices==null ) setUpColAndRow();
+
+    return mRowCount;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// TODO
+
   public static int[] getIndices()
     {
+    if( mIndices==null ) setUpColAndRow();
+
     return mIndices;
     }
 
@@ -307,19 +356,19 @@ public enum RubikObjectList
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  RubikObjectList(int[][] info, Class<? extends RubikObject> object , RubikMovement movement)
+  RubikObjectList(int[][] info, Class<? extends RubikObject> object , RubikMovement movement, int column)
     {
-    int length = info.length;
+    mNumSizes = info.length;
 
-    mObjectSizes  = new int[length];
-    mMaxLevels    = new int[length];
-    mResourceIDs  = new int[length];
-    mSmallIconIDs = new int[length];
-    mMediumIconIDs= new int[length];
-    mBigIconIDs   = new int[length];
-    mHugeIconIDs  = new int[length];
+    mObjectSizes  = new int[mNumSizes];
+    mMaxLevels    = new int[mNumSizes];
+    mResourceIDs  = new int[mNumSizes];
+    mSmallIconIDs = new int[mNumSizes];
+    mMediumIconIDs= new int[mNumSizes];
+    mBigIconIDs   = new int[mNumSizes];
+    mHugeIconIDs  = new int[mNumSizes];
 
-    for(int i=0; i<length; i++)
+    for(int i=0; i<mNumSizes; i++)
       {
       mObjectSizes[i]  = info[i][0];
       mMaxLevels[i]    = info[i][1];
@@ -332,6 +381,7 @@ public enum RubikObjectList
 
     mObjectClass         = object;
     mObjectMovementClass = movement;
+    mColumn              = column;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/states/RubikStatePlay.java b/src/main/java/org/distorted/states/RubikStatePlay.java
index f4d83928..4af628d2 100644
--- a/src/main/java/org/distorted/states/RubikStatePlay.java
+++ b/src/main/java/org/distorted/states/RubikStatePlay.java
@@ -175,14 +175,11 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
           {
           boolean vertical = act.isVertical();
           mObjectGrid.setOrientation(vertical ? GridLayout.VERTICAL:GridLayout.HORIZONTAL);
-          mObjectPopup.showAsDropDown(view, 0, margin, Gravity.LEFT);
+          mObjectPopup.showAsDropDown(view, margin, margin, Gravity.LEFT);
 
-          if( android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1 )
-            {
-            int layhei = mObjectSize * (vertical? mRowCount:mColCount);
-            int laywid = mObjectSize * (vertical? mColCount:mRowCount);
-            mObjectPopup.update(view, laywid, layhei);
-            }
+          int layhei = mObjectSize * (vertical? mRowCount:mColCount);
+          int laywid = mObjectSize * (vertical? mColCount:mRowCount);
+          mObjectPopup.update(view, laywid, layhei);
           }
         }
       });
@@ -383,6 +380,8 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     mObjectGrid.setColumnCount(mColCount);
     mObjectGrid.setRowCount(mRowCount);
 
+    int[] nextInColumn = new int[mColCount];
+
     for(int row=0; row<mRowCount; row++)
       {
       rowSpecs[row] = GridLayout.spec(row);
@@ -390,6 +389,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
     for(int col=0; col<mColCount; col++)
       {
       colSpecs[col] = GridLayout.spec(col);
+      nextInColumn[col] =0;
       }
 
     mObjectPopup = new PopupWindow(act);
@@ -409,6 +409,7 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
       int[] icons = list.getIconIDs();
       int len = sizes.length;
       final int obj = object;
+      int col = indices[object];
 
       for(int i=0; i<len; i++)
         {
@@ -434,12 +435,14 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
             }
           });
 
-        GridLayout.LayoutParams params = new GridLayout.LayoutParams(rowSpecs[index],colSpecs[indices[object]]);
+        GridLayout.LayoutParams params = new GridLayout.LayoutParams(rowSpecs[nextInColumn[col]],colSpecs[col]);
         params.bottomMargin = margin;
         params.topMargin    = margin;
         params.leftMargin   = margin;
         params.rightMargin  = margin;
 
+        nextInColumn[col]++;
+
         mObjectGrid.addView(button, params);
         }
       }
