Project

General

Profile

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

magiccube / src / main / java / org / distorted / bandaged / BandagedCreatorScreen.java @ 306aa049

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
    adX.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
179
    mSpinnerX.setAdapter(adX);
180

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

    
187
    mSpinnerZ = act.findViewById(R.id.bandagedCreatorZ);
188
    mSpinnerZ.setOnItemSelectedListener(this);
189
    ArrayAdapter<String> adZ = new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("Z") );
190
    adZ.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
191
    mSpinnerZ.setAdapter(adZ);
192

    
193
    ViewGroup.MarginLayoutParams paramsX = (ViewGroup.MarginLayoutParams) mSpinnerX.getLayoutParams();
194
    paramsX.setMargins(0,0,2*padding,0);
195
    ViewGroup.MarginLayoutParams paramsY = (ViewGroup.MarginLayoutParams) mSpinnerY.getLayoutParams();
196
    paramsY.setMargins(padding,0,padding,0);
197
    ViewGroup.MarginLayoutParams paramsZ = (ViewGroup.MarginLayoutParams) mSpinnerZ.getLayoutParams();
198
    paramsZ.setMargins(2*padding,0,0,0);
199
    }
200

    
201
///////////////////////////////////////////////////////////////////////////////////////////////////
202

    
203
  boolean objectDoesntExist(String name)
204
    {
205
    for( BandagedCreatorObjectView view : mViews )
206
      {
207
      String viewName = view.getName();
208
      if( viewName.equals(name) ) return false;
209
      }
210

    
211
    return true;
212
    }
213

    
214
///////////////////////////////////////////////////////////////////////////////////////////////////
215

    
216
  private void addObjects(BandagedCreatorActivity act, String objectString)
217
    {
218
    if( objectString.length()>0 )
219
      {
220
      String[] objects = objectString.split(" ");
221
      RubikFiles files = RubikFiles.getInstance();
222

    
223
      for(String object : objects)
224
        {
225
        if( objectDoesntExist(object) )
226
          {
227
          addObject(act, object);
228
          Bitmap bmp = files.getIcon(act, object + ".png");
229
          iconCreationDone(act, bmp);
230
          }
231
        }
232
      }
233
    }
234

    
235
///////////////////////////////////////////////////////////////////////////////////////////////////
236

    
237
  void addObject(BandagedCreatorActivity act, String name)
238
    {
239
    BandagedCreatorObjectView view = new BandagedCreatorObjectView(act,name,mNumObjects==0);
240
    LinearLayout pane = view.getPane();
241
    mObjectView.addView(pane);
242
    mNumObjects++;
243
    mViews.add(view);
244
    }
245

    
246
///////////////////////////////////////////////////////////////////////////////////////////////////
247

    
248
  void deleteObject(BandagedCreatorActivity act, String name)
249
    {
250
    for(int v=0; v<mNumObjects; v++)
251
      {
252
      BandagedCreatorObjectView view = mViews.get(v);
253
      String viewName = view.getName();
254

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

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

    
275
          p2.setLayoutParams(params);
276
          }
277

    
278
        break;
279
        }
280
      }
281
    }
282

    
283
///////////////////////////////////////////////////////////////////////////////////////////////////
284

    
285
  void iconCreationDone(Activity act, Bitmap bmp)
286
    {
287
    int numChildren = mObjectView.getChildCount();
288

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

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

    
312
///////////////////////////////////////////////////////////////////////////////////////////////////
313

    
314
  private String generateObjectStrings()
315
    {
316
    String result = "";
317
    int numViews = mViews.size();
318

    
319
    for( int v=0; v<numViews; v++ )
320
      {
321
      BandagedCreatorObjectView view = mViews.get(v);
322
      String name = view.getName();
323

    
324
      if( v>0 ) result += " ";
325
      result += name;
326
      }
327

    
328
    return result;
329
    }
330

    
331
///////////////////////////////////////////////////////////////////////////////////////////////////
332

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

    
338
      if( view!=null ) ((TextView) view).setTextSize(TypedValue.COMPLEX_UNIT_PX,mTextSize);
339

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

    
353
      changeObject();
354
      }
355

    
356
///////////////////////////////////////////////////////////////////////////////////////////////////
357

    
358
    @Override
359
    public void onNothingSelected(AdapterView<?> parent) { }
360

    
361
///////////////////////////////////////////////////////////////////////////////////////////////////
362

    
363
    public void savePreferences(SharedPreferences.Editor editor)
364
      {
365
      String objects = generateObjectStrings();
366
      editor.putString("bandagedObjects", objects );
367

    
368
      editor.putInt("bandagedX", mX);
369
      editor.putInt("bandagedY", mY);
370
      editor.putInt("bandagedZ", mZ);
371
      }
372

    
373
///////////////////////////////////////////////////////////////////////////////////////////////////
374

    
375
    public void restorePreferences(BandagedCreatorActivity act, SharedPreferences preferences)
376
      {
377
      String objects = preferences.getString("bandagedObjects","");
378
      addObjects(act,objects);
379

    
380
      mX = preferences.getInt("bandagedX", 2);
381
      mY = preferences.getInt("bandagedY", 2);
382
      mZ = preferences.getInt("bandagedZ", 2);
383

    
384
      mSpinnerX.setSelection(mX);
385
      mSpinnerY.setSelection(mY);
386
      mSpinnerZ.setSelection(mZ);
387

    
388
      mSpinnersReady = true;
389
      changeObject();
390
      }
391
}
(4-4/13)