Project

General

Profile

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

magiccube / src / main / java / org / distorted / bandaged / BandagedCreatorScreen.java @ 80f574a1

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2022 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.bandaged;
11

    
12
import java.lang.ref.WeakReference;
13
import java.util.ArrayList;
14

    
15
import android.app.Activity;
16
import android.content.SharedPreferences;
17
import android.graphics.Bitmap;
18
import android.util.TypedValue;
19
import android.view.View;
20
import android.view.ViewGroup;
21
import android.widget.AdapterView;
22
import android.widget.ArrayAdapter;
23
import android.widget.ImageView;
24
import android.widget.LinearLayout;
25
import android.widget.Spinner;
26
import android.widget.TextView;
27

    
28
import org.distorted.external.RubikFiles;
29
import org.distorted.helpers.TransparentImageButton;
30
import org.distorted.main.R;
31
import org.distorted.main.RubikActivity;
32

    
33
import static org.distorted.objectlib.scrambling.ScrambleStateBandagedCuboid.MAX_SUPPORTED_SIZE;
34

    
35
///////////////////////////////////////////////////////////////////////////////////////////////////
36

    
37
public class BandagedCreatorScreen implements AdapterView.OnItemSelectedListener
38
{
39
  private WeakReference<BandagedCreatorActivity> mAct;
40
  private TransparentImageButton mBackButton, mResetButton, mDoneButton;
41
  private LinearLayout mObjectView;
42
  private int mNumObjects, mX, mY, mZ;
43
  private final ArrayList<BandagedCreatorObjectView> mViews;
44
  private Spinner mSpinnerX, mSpinnerY, mSpinnerZ;
45
  private boolean mSpinnersReady;
46
  private float mTextSize;
47

    
48
///////////////////////////////////////////////////////////////////////////////////////////////////
49

    
50
  public BandagedCreatorScreen()
51
    {
52
    mSpinnersReady = false;
53
    mNumObjects = 0;
54
    mViews = new ArrayList<>();
55
    }
56

    
57
///////////////////////////////////////////////////////////////////////////////////////////////////
58

    
59
  private void setupBackButton(final BandagedCreatorActivity act)
60
    {
61
    int icon = RubikActivity.getDrawable(R.drawable.ui_small_smallback,R.drawable.ui_medium_smallback, R.drawable.ui_big_smallback, R.drawable.ui_huge_smallback);
62
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
63
    mBackButton = new TransparentImageButton(act, icon, TransparentImageButton.GRAVITY_MIDDLE, params);
64

    
65
    mBackButton.setOnClickListener( new View.OnClickListener()
66
      {
67
      @Override
68
      public void onClick(View v)
69
        {
70
        act.finish();
71
        }
72
      });
73
    }
74

    
75
///////////////////////////////////////////////////////////////////////////////////////////////////
76

    
77
  private void setupDoneButton(final BandagedCreatorActivity act)
78
    {
79
    int icon = RubikActivity.getDrawable(R.drawable.ui_small_done,R.drawable.ui_medium_done, R.drawable.ui_big_done, R.drawable.ui_huge_done);
80
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
81
    mDoneButton = new TransparentImageButton(act, icon, TransparentImageButton.GRAVITY_MIDDLE, params);
82

    
83
    mDoneButton.setOnClickListener( new View.OnClickListener()
84
      {
85
      @Override
86
      public void onClick(View v)
87
        {
88
        BandagedCreatorRenderer renderer = act.getRenderer();
89
        if( !renderer.isBusy() ) renderer.displaySavingDialog();
90
        }
91
      });
92
    }
93

    
94
///////////////////////////////////////////////////////////////////////////////////////////////////
95

    
96
  private void setupResetButton(final BandagedCreatorActivity act)
97
    {
98
    int icon = RubikActivity.getDrawable(R.drawable.ui_small_reset,R.drawable.ui_medium_reset, R.drawable.ui_big_reset, R.drawable.ui_huge_reset);
99
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
100
    mResetButton = new TransparentImageButton(act, icon, TransparentImageButton.GRAVITY_MIDDLE, params);
101

    
102
    mResetButton.setOnClickListener( new View.OnClickListener()
103
      {
104
      @Override
105
      public void onClick(View v)
106
        {
107
        BandagedCreatorRenderer renderer = act.getRenderer();
108
        if( !renderer.isBusy() ) renderer.setupReset();
109
        }
110
      });
111
    }
112

    
113
///////////////////////////////////////////////////////////////////////////////////////////////////
114

    
115
  private String[] createSizes(String mark)
116
    {
117
    String[] ret = new String[MAX_SUPPORTED_SIZE];
118

    
119
    for(int i=1; i<=MAX_SUPPORTED_SIZE; i++)
120
      {
121
      ret[i-1] = mark+" : "+i;
122
      }
123

    
124
    return ret;
125
    }
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
///////////////////////////////////////////////////////////////////////////////////////////////////
140

    
141
  void onAttachedToWindow(final BandagedCreatorActivity act)
142
    {
143
    mAct = new WeakReference<>(act);
144
    mObjectView = act.findViewById(R.id.bandagedCreatorView);
145
    mTextSize = act.getScreenHeightInPixels()*BandagedCreatorActivity.SPINNER_TEXT_SIZE;
146

    
147
    int width  = act.getScreenWidthInPixels();
148
    int height = act.getScreenHeightInPixels();
149
    int padding= (int)(height*RubikActivity.PADDING/3);
150

    
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

    
175
    mSpinnerX = act.findViewById(R.id.bandagedCreatorX);
176
    mSpinnerX.setOnItemSelectedListener(this);
177
    ArrayAdapter<String> adX = new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("X") );
178
    mSpinnerX.setAdapter(adX);
179

    
180
    mSpinnerY = act.findViewById(R.id.bandagedCreatorY);
181
    mSpinnerY.setOnItemSelectedListener(this);
182
    ArrayAdapter<String> adY = new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("Y") );
183
    mSpinnerY.setAdapter(adY);
184

    
185
    mSpinnerZ = act.findViewById(R.id.bandagedCreatorZ);
186
    mSpinnerZ.setOnItemSelectedListener(this);
187
    ArrayAdapter<String> adZ = new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("Z") );
188
    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
    }
197

    
198
///////////////////////////////////////////////////////////////////////////////////////////////////
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
  private void addObjects(BandagedCreatorActivity act, String objectString)
214
    {
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
///////////////////////////////////////////////////////////////////////////////////////////////////
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
    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
      String viewName = view.getName();
251

    
252
      if( viewName.equals(name) )
253
        {
254
        LinearLayout pane = view.getPane();
255
        mObjectView.removeView(pane);
256
        mViews.remove(view);
257
        mNumObjects--;
258

    
259
        if( v==0 && mNumObjects>0 )
260
          {
261
          int width = act.getScreenWidthInPixels();
262
          BandagedCreatorObjectView v2 = mViews.get(v);
263
          LinearLayout p2 = v2.getPane();
264
          int margin = (int)(width*RubikActivity.LARGE_MARGIN);;
265
          int w = (int)(width*BandagedCreatorObjectView.RATIO_PANE);
266
          LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( w, LinearLayout.LayoutParams.MATCH_PARENT);
267
          params.bottomMargin = margin;
268
          params.topMargin    = margin;
269
          params.leftMargin   = margin;
270
          params.rightMargin  = margin;
271

    
272
          p2.setLayoutParams(params);
273
          }
274

    
275
        break;
276
        }
277
      }
278
    }
279

    
280
///////////////////////////////////////////////////////////////////////////////////////////////////
281

    
282
  void iconCreationDone(Activity act, Bitmap bmp)
283
    {
284
    int numChildren = mObjectView.getChildCount();
285

    
286
    if( numChildren>0 )
287
      {
288
      LinearLayout pane = (LinearLayout)mObjectView.getChildAt(numChildren-1);
289
      ImageView view = pane.findViewById(R.id.bandagedCreatorObjectIcon);
290

    
291
      if( view!=null )
292
        {
293
        act.runOnUiThread(new Runnable()
294
          {
295
          @Override
296
          public void run()
297
          {
298
          view.setImageBitmap(bmp);
299
          }
300
          });
301
        }
302
      else
303
        {
304
        android.util.Log.e("D", "ImageView not found!");
305
        }
306
      }
307
    }
308

    
309
///////////////////////////////////////////////////////////////////////////////////////////////////
310

    
311
  private String generateObjectStrings()
312
    {
313
    String result = "";
314
    int numViews = mViews.size();
315

    
316
    for( int v=0; v<numViews; v++ )
317
      {
318
      BandagedCreatorObjectView view = mViews.get(v);
319
      String name = view.getName();
320

    
321
      if( v>0 ) result += " ";
322
      result += name;
323
      }
324

    
325
    return result;
326
    }
327

    
328
///////////////////////////////////////////////////////////////////////////////////////////////////
329

    
330
    @Override
331
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
332
      {
333
      int spinnerID = parent.getId();
334

    
335
      if( view!=null ) ((TextView) view).setTextSize(TypedValue.COMPLEX_UNIT_PX,mTextSize);
336

    
337
      if( spinnerID==R.id.bandagedCreatorX )
338
        {
339
        mX = pos;
340
        }
341
      else if( spinnerID==R.id.bandagedCreatorY )
342
        {
343
        mY = pos;
344
        }
345
      else if( spinnerID==R.id.bandagedCreatorZ )
346
        {
347
        mZ = pos;
348
        }
349

    
350
      changeObject();
351
      }
352

    
353
///////////////////////////////////////////////////////////////////////////////////////////////////
354

    
355
    @Override
356
    public void onNothingSelected(AdapterView<?> parent) { }
357

    
358
///////////////////////////////////////////////////////////////////////////////////////////////////
359

    
360
    public void savePreferences(SharedPreferences.Editor editor)
361
      {
362
      String objects = generateObjectStrings();
363
      editor.putString("bandagedObjects", objects );
364

    
365
      editor.putInt("bandagedX", mX);
366
      editor.putInt("bandagedY", mY);
367
      editor.putInt("bandagedZ", mZ);
368
      }
369

    
370
///////////////////////////////////////////////////////////////////////////////////////////////////
371

    
372
    public void restorePreferences(BandagedCreatorActivity act, SharedPreferences preferences)
373
      {
374
      String objects = preferences.getString("bandagedObjects","");
375
      addObjects(act,objects);
376

    
377
      mX = preferences.getInt("bandagedX", 2);
378
      mY = preferences.getInt("bandagedY", 2);
379
      mZ = preferences.getInt("bandagedZ", 2);
380

    
381
      mSpinnerX.setSelection(mX);
382
      mSpinnerY.setSelection(mY);
383
      mSpinnerZ.setSelection(mZ);
384

    
385
      mSpinnersReady = true;
386
      changeObject();
387
      }
388
}
(4-4/13)