Project

General

Profile

Download (9.43 KB) Statistics
| Branch: | Tag: | Revision:

magiccube / src / main / java / org / distorted / main / MainObjectPopup.java @ 7bb30586

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2023 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9

    
10
package org.distorted.main;
11

    
12
import static android.view.View.GONE;
13

    
14
import android.content.Context;
15
import android.util.TypedValue;
16
import android.view.Gravity;
17
import android.view.LayoutInflater;
18
import android.view.View;
19
import android.widget.Button;
20
import android.widget.LinearLayout;
21
import android.widget.PopupWindow;
22
import android.widget.TextView;
23

    
24
import org.distorted.objects.RubikObject;
25
import org.distorted.objects.RubikObjectList;
26

    
27
///////////////////////////////////////////////////////////////////////////////////////////////////
28

    
29
public class MainObjectPopup
30
  {
31
  private static final float MENU_TEXT_SIZE= 0.024f;
32
  private static final float MENU_MARGIN   = 0.008f;
33
  private static final float BUTTON_HEIGHT = 0.150f;
34
  private static final float MENU_WIDTH    = 0.550f;
35

    
36
  public static final int LEVELS_SHOWN = 8;
37

    
38
  private final PopupWindow mPopup;
39
  private final int mMenuTextSize;
40
  private Button[] mLevel;
41

    
42
///////////////////////////////////////////////////////////////////////////////////////////////////
43

    
44
  MainObjectPopup(MainActivity act, int ordinal, int width, int height)
45
    {
46
    LayoutInflater layoutInflater = (LayoutInflater)act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
47
    final View layout = layoutInflater.inflate(R.layout.object_popup, null);
48
    mPopup = new PopupWindow(act);
49
    mPopup.setContentView(layout);
50
    mPopup.setFocusable(true);
51

    
52
    boolean firstButtonShown = false;
53

    
54
    mMenuTextSize = (int)(height*MENU_TEXT_SIZE);
55
    int padding   = (int)(height*MENU_MARGIN);
56
    int marginH   = padding/2;
57
    int marginV   =-padding/4;
58
    layout.setPadding(padding,0,padding,0);
59
    int levelHeight = (int)(width*BUTTON_HEIGHT);
60

    
61
    RubikObject object = RubikObjectList.getObject(ordinal);
62

    
63
    Button b1 = layout.findViewById(R.id.objectSolver);
64

    
65
    if( object!=null && object.hasSolver() )
66
      {
67
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,levelHeight);
68
      params.setMargins(marginH,marginH,marginH,marginV);
69
      b1.setLayoutParams(params);
70
      b1.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
71

    
72
      b1.setOnClickListener(new View.OnClickListener()
73
        {
74
        @Override
75
        public void onClick(View v)
76
          {
77
          mPopup.dismiss();
78
          act.switchToSolver(ordinal);
79
          }
80
        });
81

    
82
      firstButtonShown = true;
83
      }
84
    else b1.setVisibility(GONE);
85

    
86
    Button b2 = layout.findViewById(R.id.objectPattern);
87

    
88
    if( object!=null && object.hasPatterns() )
89
      {
90
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,levelHeight);
91
      params.setMargins(marginH, firstButtonShown ? marginV : marginH ,marginH,marginV);
92
      b2.setLayoutParams(params);
93
      b2.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
94

    
95
      b2.setOnClickListener(new View.OnClickListener()
96
        {
97
        @Override
98
        public void onClick(View v)
99
          {
100
          mPopup.dismiss();
101
          act.switchToPattern(ordinal);
102
          }
103
        });
104

    
105
      firstButtonShown = true;
106
      }
107
    else b2.setVisibility(GONE);
108

    
109
    Button b3 = layout.findViewById(R.id.objectTutorial);
110

    
111
    if( object!=null && object.hasExtras() )
112
      {
113
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,levelHeight);
114
      params.setMargins(marginH,firstButtonShown ? marginV : marginH,marginH,marginV);
115
      b3.setLayoutParams(params);
116
      b3.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
117

    
118
      b3.setOnClickListener(new View.OnClickListener()
119
        {
120
        @Override
121
        public void onClick(View v)
122
          {
123
          mPopup.dismiss();
124
          act.switchToTutorial(ordinal);
125
          }
126
        });
127

    
128
      firstButtonShown = true;
129
      }
130
    else b3.setVisibility(GONE);
131

    
132
    Button b4 = layout.findViewById(R.id.objectInfo);
133

    
134
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,levelHeight);
135
    params.setMargins(marginH,firstButtonShown ? marginV : marginH,marginH,marginV);
136
    b4.setLayoutParams(params);
137
    b4.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
138

    
139
    b4.setOnClickListener( new View.OnClickListener()
140
      {
141
      @Override
142
      public void onClick(View v)
143
        {
144
        mPopup.dismiss();
145
        act.switchToConfig(ordinal);
146
        }
147
      });
148

    
149
    TextView levels = layout.findViewById(R.id.objectLevels);
150
    levels.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
151

    
152
    setupLevelButtons(act,object,layout,width,padding,marginH);
153
    }
154

    
155
///////////////////////////////////////////////////////////////////////////////////////////////////
156

    
157
  private void setupLevelButtons(MainActivity act, RubikObject object, View layout, int width,int padding, int margin)
158
    {
159
    int layoutWidth = (int)(width*MENU_WIDTH);
160
    int levelHeight = (int)(width*BUTTON_HEIGHT);
161
    int levelWidth  = (layoutWidth-4*padding)/3;
162

    
163
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(levelWidth,levelHeight);
164
    params.setMargins(margin,-margin,margin,-margin);
165

    
166
    mLevel = new Button[LEVELS_SHOWN+1];
167

    
168
    mLevel[0] = layout.findViewById(R.id.level0);
169
    mLevel[1] = layout.findViewById(R.id.level1);
170
    mLevel[2] = layout.findViewById(R.id.level2);
171
    mLevel[3] = layout.findViewById(R.id.level3);
172
    mLevel[4] = layout.findViewById(R.id.level4);
173
    mLevel[5] = layout.findViewById(R.id.level5);
174
    mLevel[6] = layout.findViewById(R.id.level6);
175
    mLevel[7] = layout.findViewById(R.id.level7);
176
    mLevel[8] = layout.findViewById(R.id.levelM);
177

    
178
    int numScramble  = object==null ? 1 : object.getNumScramble();
179
    int min = Math.min(numScramble,LEVELS_SHOWN);
180

    
181
    if( numScramble>=1 && numScramble<=7 )
182
      {
183
      mLevel[numScramble].setText(R.string.levelM);
184
      for(int i=numScramble+1; i<=8; i++) mLevel[i].setVisibility(GONE);
185
      }
186

    
187
    for(int i=0; i<=min; i++)
188
      {
189
      mLevel[i].setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
190
      mLevel[i].setLayoutParams(params);
191
      mLevel[i].setPadding(0,0,0,0);
192

    
193
      final int ii=i;
194
      boolean free = i==0;
195
      int scrambles = (i>0 && i<min) ? i : numScramble;
196

    
197
      mLevel[i].setOnClickListener( new View.OnClickListener()
198
        {
199
        @Override
200
        public void onClick(View v)
201
          {
202
          mPopup.dismiss();
203
          act.switchToPlay(object,scrambles,free,ii);
204
          }
205
        });
206
      }
207

    
208
    int index = (numScramble>=1 && numScramble<=7) ? numScramble : LEVELS_SHOWN;
209
    LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(levelWidth,levelHeight);
210
    params2.setMargins(margin,-margin,margin,margin);
211
    mLevel[index].setLayoutParams(params2);
212

    
213
    setupLevelButtonVisibilityAndColor(act);
214
    }
215

    
216
///////////////////////////////////////////////////////////////////////////////////////////////////
217

    
218
  private void setupLevelButtonVisibilityAndColor(MainActivity act)
219
    {
220
    /*
221
    int currObject = RubikObjectList.getCurrObject();
222
    RubikObject object = RubikObjectList.getObject(currObject);
223
    int numScramble = object==null ? 1 : object.getNumScramble();
224
    RubikScores scores = RubikScores.getInstance();
225
    Resources res = act.getResources();
226
    ColorStateList colorG = ColorStateList.valueOf(res.getColor(R.color.green));
227
    ColorStateList colorD = ColorStateList.valueOf(res.getColor(R.color.dark_grey));
228

    
229
    for(int level=0; level<=LEVELS_SHOWN; level++)
230
      {
231
      boolean isSolved = scores.isSolved(currObject,level);
232
      mLevel[level].setBackgroundTintList( isSolved ? colorG : colorD);
233
      }
234

    
235
    if( numScramble<=LEVELS_SHOWN || mOldNumScramble<=LEVELS_SHOWN )
236
      {
237
      if( numScramble<mOldNumScramble )
238
        {
239
        int max = Math.min(LEVELS_SHOWN,mOldNumScramble-1);
240
        for(int level=numScramble; level<=max; level++) mLevel[level].setVisibility(View.INVISIBLE);
241
        mLevel[numScramble-1].setText(R.string.levelM);
242
        }
243
      if( numScramble>mOldNumScramble )
244
        {
245
        int max = Math.min(LEVELS_SHOWN,numScramble-1);
246
        mLevel[mOldNumScramble-1].setText( String.valueOf(mOldNumScramble) );
247

    
248
        for(int level=mOldNumScramble; level<=max; level++)
249
          {
250
          mLevel[level].setVisibility(View.VISIBLE);
251
          if( level<max ) mLevel[level].setText( String.valueOf(level+1) );
252
          else            mLevel[level].setText( R.string.levelM );
253
          }
254
        }
255
      }
256

    
257
    mOldNumScramble = numScramble;
258
    */
259
    }
260

    
261
///////////////////////////////////////////////////////////////////////////////////////////////////
262

    
263
  void show(View v)
264
    {
265
    View popupView = mPopup.getContentView();
266
    popupView.setSystemUiVisibility(MainActivity.FLAGS);
267
    mPopup.showAtLocation(v, Gravity.CENTER, 0, 0);
268
    }
269
  }
270

    
(2-2/3)