Project

General

Profile

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

magiccube / src / main / java / org / distorted / bandaged / BandagedCreatorScreen.java @ f404152d

1 9530f6b0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2 da56b12f Leszek Koltunski
// Copyright 2022 Leszek Koltunski                                                               //
3 9530f6b0 Leszek Koltunski
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6 44fec653 Leszek Koltunski
// 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 9530f6b0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
9
10
package org.distorted.bandaged;
11
12 b9d062cf Leszek Koltunski
import java.lang.ref.WeakReference;
13 d3d639b1 Leszek Koltunski
import java.util.ArrayList;
14
15 f404152d Leszek Koltunski
import android.annotation.SuppressLint;
16 20b60ad9 Leszek Koltunski
import android.app.Activity;
17 b9d062cf Leszek Koltunski
import android.content.SharedPreferences;
18 7cb8d4b0 Leszek Koltunski
import android.graphics.Bitmap;
19 39176a1f Leszek Koltunski
import android.util.TypedValue;
20 9530f6b0 Leszek Koltunski
import android.view.View;
21 b9d062cf Leszek Koltunski
import android.view.ViewGroup;
22
import android.widget.AdapterView;
23
import android.widget.ArrayAdapter;
24 7cb8d4b0 Leszek Koltunski
import android.widget.ImageView;
25 9530f6b0 Leszek Koltunski
import android.widget.LinearLayout;
26 b9d062cf Leszek Koltunski
import android.widget.Spinner;
27 39176a1f Leszek Koltunski
import android.widget.TextView;
28 9530f6b0 Leszek Koltunski
29 a41e3c94 Leszek Koltunski
import org.distorted.external.RubikFiles;
30 9530f6b0 Leszek Koltunski
import org.distorted.helpers.TransparentImageButton;
31
import org.distorted.main.R;
32
import org.distorted.main.RubikActivity;
33
34 ca280c3f Leszek Koltunski
import static org.distorted.objectlib.scrambling.ScrambleStateBandagedCuboid.MAX_SUPPORTED_SIZE;
35
36 9530f6b0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
37
38 b9d062cf Leszek Koltunski
public class BandagedCreatorScreen implements AdapterView.OnItemSelectedListener
39 9530f6b0 Leszek Koltunski
{
40 b9d062cf Leszek Koltunski
  private WeakReference<BandagedCreatorActivity> mAct;
41 9530f6b0 Leszek Koltunski
  private TransparentImageButton mBackButton, mResetButton, mDoneButton;
42 e48ad1af Leszek Koltunski
  private LinearLayout mObjectView;
43 b9d062cf Leszek Koltunski
  private int mNumObjects, mX, mY, mZ;
44
  private final ArrayList<BandagedCreatorObjectView> mViews;
45
  private Spinner mSpinnerX, mSpinnerY, mSpinnerZ;
46
  private boolean mSpinnersReady;
47 39176a1f Leszek Koltunski
  private float mTextSize;
48 9530f6b0 Leszek Koltunski
49
///////////////////////////////////////////////////////////////////////////////////////////////////
50
51
  public BandagedCreatorScreen()
52
    {
53 b9d062cf Leszek Koltunski
    mSpinnersReady = false;
54 e48ad1af Leszek Koltunski
    mNumObjects = 0;
55 d3d639b1 Leszek Koltunski
    mViews = new ArrayList<>();
56 9530f6b0 Leszek Koltunski
    }
57
58
///////////////////////////////////////////////////////////////////////////////////////////////////
59
60
  private void setupBackButton(final BandagedCreatorActivity act)
61
    {
62
    int icon = RubikActivity.getDrawable(R.drawable.ui_small_smallback,R.drawable.ui_medium_smallback, R.drawable.ui_big_smallback, R.drawable.ui_huge_smallback);
63
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
64
    mBackButton = new TransparentImageButton(act, icon, TransparentImageButton.GRAVITY_MIDDLE, params);
65
66
    mBackButton.setOnClickListener( new View.OnClickListener()
67
      {
68
      @Override
69
      public void onClick(View v)
70
        {
71
        act.finish();
72
        }
73
      });
74
    }
75
76
///////////////////////////////////////////////////////////////////////////////////////////////////
77
78
  private void setupDoneButton(final BandagedCreatorActivity act)
79
    {
80 f802924b Leszek Koltunski
    int icon = RubikActivity.getDrawable(R.drawable.ui_small_done,R.drawable.ui_medium_done, R.drawable.ui_big_done, R.drawable.ui_huge_done);
81 9530f6b0 Leszek Koltunski
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
82
    mDoneButton = new TransparentImageButton(act, icon, TransparentImageButton.GRAVITY_MIDDLE, params);
83
84
    mDoneButton.setOnClickListener( new View.OnClickListener()
85
      {
86
      @Override
87
      public void onClick(View v)
88
        {
89 e0b71e6e Leszek Koltunski
        BandagedCreatorRenderer renderer = act.getRenderer();
90 72e386ef Leszek Koltunski
        if( !renderer.isBusy() ) renderer.displaySavingDialog();
91 9530f6b0 Leszek Koltunski
        }
92
      });
93
    }
94
95
///////////////////////////////////////////////////////////////////////////////////////////////////
96
97
  private void setupResetButton(final BandagedCreatorActivity act)
98
    {
99 1b185a91 Leszek Koltunski
    int icon = RubikActivity.getDrawable(R.drawable.ui_small_reset,R.drawable.ui_medium_reset, R.drawable.ui_big_reset, R.drawable.ui_huge_reset);
100 9530f6b0 Leszek Koltunski
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
101
    mResetButton = new TransparentImageButton(act, icon, TransparentImageButton.GRAVITY_MIDDLE, params);
102
103
    mResetButton.setOnClickListener( new View.OnClickListener()
104
      {
105
      @Override
106
      public void onClick(View v)
107
        {
108 50ec342b Leszek Koltunski
        BandagedCreatorRenderer renderer = act.getRenderer();
109 e0b71e6e Leszek Koltunski
        if( !renderer.isBusy() ) renderer.setupReset();
110 9530f6b0 Leszek Koltunski
        }
111
      });
112
    }
113
114 b9d062cf Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
115
116
  private String[] createSizes(String mark)
117
    {
118
    String[] ret = new String[MAX_SUPPORTED_SIZE];
119
120
    for(int i=1; i<=MAX_SUPPORTED_SIZE; i++)
121
      {
122
      ret[i-1] = mark+" : "+i;
123
      }
124
125
    return ret;
126
    }
127
128
///////////////////////////////////////////////////////////////////////////////////////////////////
129
130
  private void changeObject()
131
    {
132
    if( mSpinnersReady )
133
      {
134
      BandagedCreatorActivity act = mAct.get();
135
      if( act!=null ) act.changeObject(mX+1,mY+1,mZ+1);
136
      }
137
    }
138
139 9530f6b0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
140
141 bebd7af5 Leszek Koltunski
  void onAttachedToWindow(final BandagedCreatorActivity act)
142 9530f6b0 Leszek Koltunski
    {
143 b9d062cf Leszek Koltunski
    mAct = new WeakReference<>(act);
144 e48ad1af Leszek Koltunski
    mObjectView = act.findViewById(R.id.bandagedCreatorView);
145 39176a1f Leszek Koltunski
    mTextSize = act.getScreenHeightInPixels()*BandagedCreatorActivity.SPINNER_TEXT_SIZE;
146 e48ad1af Leszek Koltunski
147 b9d062cf Leszek Koltunski
    int width  = act.getScreenWidthInPixels();
148
    int height = act.getScreenHeightInPixels();
149
    int padding= (int)(height*RubikActivity.PADDING/3);
150 9530f6b0 Leszek Koltunski
151
    LinearLayout.LayoutParams paramsL = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
152
    LinearLayout.LayoutParams paramsM = new LinearLayout.LayoutParams(width/2, LinearLayout.LayoutParams.MATCH_PARENT);
153
    LinearLayout.LayoutParams paramsR = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
154
155
    LinearLayout layoutLeft = new LinearLayout(act);
156
    layoutLeft.setLayoutParams(paramsL);
157
    LinearLayout layoutMid  = new LinearLayout(act);
158
    layoutMid.setLayoutParams(paramsM);
159
    LinearLayout layoutRight= new LinearLayout(act);
160
    layoutRight.setLayoutParams(paramsR);
161
162
    setupBackButton(act);
163
    layoutRight.addView(mBackButton);
164
    setupDoneButton(act);
165
    layoutMid.addView(mDoneButton);
166
    setupResetButton(act);
167
    layoutLeft.addView(mResetButton);
168
169
    LinearLayout layout = act.findViewById(R.id.lowerBar);
170
    layout.removeAllViews();
171
    layout.addView(layoutLeft);
172
    layout.addView(layoutMid);
173
    layout.addView(layoutRight);
174 b9d062cf Leszek Koltunski
175
    mSpinnerX = act.findViewById(R.id.bandagedCreatorX);
176
    mSpinnerX.setOnItemSelectedListener(this);
177 39176a1f Leszek Koltunski
    ArrayAdapter<String> adX = new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("X") );
178 b9d062cf Leszek Koltunski
    mSpinnerX.setAdapter(adX);
179
180
    mSpinnerY = act.findViewById(R.id.bandagedCreatorY);
181
    mSpinnerY.setOnItemSelectedListener(this);
182 39176a1f Leszek Koltunski
    ArrayAdapter<String> adY = new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("Y") );
183 b9d062cf Leszek Koltunski
    mSpinnerY.setAdapter(adY);
184
185
    mSpinnerZ = act.findViewById(R.id.bandagedCreatorZ);
186
    mSpinnerZ.setOnItemSelectedListener(this);
187 39176a1f Leszek Koltunski
    ArrayAdapter<String> adZ = new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("Z") );
188 b9d062cf Leszek Koltunski
    mSpinnerZ.setAdapter(adZ);
189
190
    ViewGroup.MarginLayoutParams paramsX = (ViewGroup.MarginLayoutParams) mSpinnerX.getLayoutParams();
191
    paramsX.setMargins(0,0,2*padding,0);
192
    ViewGroup.MarginLayoutParams paramsY = (ViewGroup.MarginLayoutParams) mSpinnerY.getLayoutParams();
193
    paramsY.setMargins(padding,0,padding,0);
194
    ViewGroup.MarginLayoutParams paramsZ = (ViewGroup.MarginLayoutParams) mSpinnerZ.getLayoutParams();
195
    paramsZ.setMargins(2*padding,0,0,0);
196 9530f6b0 Leszek Koltunski
    }
197 e48ad1af Leszek Koltunski
198 a41e3c94 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
199
200
  boolean objectDoesntExist(String name)
201
    {
202
    for( BandagedCreatorObjectView view : mViews )
203
      {
204
      String viewName = view.getName();
205
      if( viewName.equals(name) ) return false;
206
      }
207
208
    return true;
209
    }
210
211
///////////////////////////////////////////////////////////////////////////////////////////////////
212
213 b9d062cf Leszek Koltunski
  private void addObjects(BandagedCreatorActivity act, String objectString)
214 a41e3c94 Leszek Koltunski
    {
215
    if( objectString.length()>0 )
216
      {
217
      String[] objects = objectString.split(" ");
218
      RubikFiles files = RubikFiles.getInstance();
219
220
      for(String object : objects)
221
        {
222
        if( objectDoesntExist(object) )
223
          {
224
          addObject(act, object);
225
          Bitmap bmp = files.getIcon(act, object + ".png");
226
          iconCreationDone(act, bmp);
227
          }
228
        }
229
      }
230
    }
231
232 e48ad1af Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
233
234
  void addObject(BandagedCreatorActivity act, String name)
235
    {
236
    BandagedCreatorObjectView view = new BandagedCreatorObjectView(act,name,mNumObjects==0);
237
    LinearLayout pane = view.getPane();
238
    mObjectView.addView(pane);
239
    mNumObjects++;
240 d3d639b1 Leszek Koltunski
    mViews.add(view);
241
    }
242
243
///////////////////////////////////////////////////////////////////////////////////////////////////
244
245
  void deleteObject(BandagedCreatorActivity act, String name)
246
    {
247
    for(int v=0; v<mNumObjects; v++)
248
      {
249
      BandagedCreatorObjectView view = mViews.get(v);
250 66cbab36 Leszek Koltunski
      String viewName = view.getName();
251 d3d639b1 Leszek Koltunski
252 66cbab36 Leszek Koltunski
      if( viewName.equals(name) )
253 d3d639b1 Leszek Koltunski
        {
254
        LinearLayout pane = view.getPane();
255
        mObjectView.removeView(pane);
256
        mViews.remove(view);
257
        mNumObjects--;
258
259
        if( v==0 && mNumObjects>0 )
260
          {
261
          BandagedCreatorObjectView v2 = mViews.get(v);
262
          LinearLayout p2 = v2.getPane();
263 35e32f0c Leszek Koltunski
          int height = act.getScreenHeightInPixels();
264 2ceeb6b5 Leszek Koltunski
          LinearLayout.LayoutParams params = BandagedCreatorObjectView.createPaneParams(height,true,act.isRTL());
265 d3d639b1 Leszek Koltunski
          p2.setLayoutParams(params);
266
          }
267
268
        break;
269
        }
270
      }
271 e48ad1af Leszek Koltunski
    }
272 7cb8d4b0 Leszek Koltunski
273
///////////////////////////////////////////////////////////////////////////////////////////////////
274
275 20b60ad9 Leszek Koltunski
  void iconCreationDone(Activity act, Bitmap bmp)
276 7cb8d4b0 Leszek Koltunski
    {
277
    int numChildren = mObjectView.getChildCount();
278
279 83e021c5 Leszek Koltunski
    if( numChildren>0 )
280 7cb8d4b0 Leszek Koltunski
      {
281 83e021c5 Leszek Koltunski
      LinearLayout pane = (LinearLayout)mObjectView.getChildAt(numChildren-1);
282
      ImageView view = pane.findViewById(R.id.bandagedCreatorObjectIcon);
283
284
      if( view!=null )
285 20b60ad9 Leszek Koltunski
        {
286 83e021c5 Leszek Koltunski
        act.runOnUiThread(new Runnable()
287
          {
288
          @Override
289
          public void run()
290 20b60ad9 Leszek Koltunski
          {
291
          view.setImageBitmap(bmp);
292
          }
293 83e021c5 Leszek Koltunski
          });
294
        }
295
      else
296
        {
297
        android.util.Log.e("D", "ImageView not found!");
298
        }
299 7cb8d4b0 Leszek Koltunski
      }
300
    }
301 a41e3c94 Leszek Koltunski
302
///////////////////////////////////////////////////////////////////////////////////////////////////
303
304 b9d062cf Leszek Koltunski
  private String generateObjectStrings()
305 a41e3c94 Leszek Koltunski
    {
306 576afdf9 Leszek Koltunski
    StringBuilder result = new StringBuilder();
307 a41e3c94 Leszek Koltunski
    int numViews = mViews.size();
308
309
    for( int v=0; v<numViews; v++ )
310
      {
311
      BandagedCreatorObjectView view = mViews.get(v);
312
      String name = view.getName();
313 576afdf9 Leszek Koltunski
      if( v>0 ) result.append(' ');
314
      result.append(name);
315 a41e3c94 Leszek Koltunski
      }
316
317 576afdf9 Leszek Koltunski
    return result.toString();
318 a41e3c94 Leszek Koltunski
    }
319 b9d062cf Leszek Koltunski
320
///////////////////////////////////////////////////////////////////////////////////////////////////
321
322 f404152d Leszek Koltunski
    @SuppressLint("SuspiciousIndentation")
323 b9d062cf Leszek Koltunski
    @Override
324
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
325
      {
326
      int spinnerID = parent.getId();
327
328 9685735b Leszek Koltunski
      if( view!=null ) ((TextView) view).setTextSize(TypedValue.COMPLEX_UNIT_PX,mTextSize);
329 39176a1f Leszek Koltunski
330 576afdf9 Leszek Koltunski
           if( spinnerID==R.id.bandagedCreatorX ) mX = pos;
331
      else if( spinnerID==R.id.bandagedCreatorY ) mY = pos;
332
      else if( spinnerID==R.id.bandagedCreatorZ ) mZ = pos;
333 b9d062cf Leszek Koltunski
334
      changeObject();
335
      }
336
337
///////////////////////////////////////////////////////////////////////////////////////////////////
338
339
    @Override
340
    public void onNothingSelected(AdapterView<?> parent) { }
341
342
///////////////////////////////////////////////////////////////////////////////////////////////////
343
344
    public void savePreferences(SharedPreferences.Editor editor)
345
      {
346
      String objects = generateObjectStrings();
347
      editor.putString("bandagedObjects", objects );
348
349
      editor.putInt("bandagedX", mX);
350
      editor.putInt("bandagedY", mY);
351
      editor.putInt("bandagedZ", mZ);
352
      }
353
354
///////////////////////////////////////////////////////////////////////////////////////////////////
355
356
    public void restorePreferences(BandagedCreatorActivity act, SharedPreferences preferences)
357
      {
358
      String objects = preferences.getString("bandagedObjects","");
359
      addObjects(act,objects);
360
361
      mX = preferences.getInt("bandagedX", 2);
362
      mY = preferences.getInt("bandagedY", 2);
363
      mZ = preferences.getInt("bandagedZ", 2);
364
365
      mSpinnerX.setSelection(mX);
366
      mSpinnerY.setSelection(mY);
367
      mSpinnerZ.setSelection(mZ);
368
369
      mSpinnersReady = true;
370
      changeObject();
371
      }
372 9530f6b0 Leszek Koltunski
}