Project

General

Profile

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

magiccube / src / main / java / org / distorted / bandaged / BandagedScreen.java @ d7f9a1a7

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.annotation.SuppressLint;
16
import android.app.Activity;
17
import android.content.SharedPreferences;
18
import android.graphics.Bitmap;
19
import android.util.TypedValue;
20
import android.view.View;
21
import android.view.ViewGroup;
22
import android.widget.AdapterView;
23
import android.widget.ArrayAdapter;
24
import android.widget.ImageView;
25
import android.widget.LinearLayout;
26
import android.widget.Spinner;
27
import android.widget.TextView;
28

    
29
import org.distorted.helpers.RubikFiles;
30
import org.distorted.helpers.TransparentImageButton;
31
import org.distorted.main.R;
32
import org.distorted.objectlib.bandaged.LocallyBandagedList;
33

    
34
///////////////////////////////////////////////////////////////////////////////////////////////////
35

    
36
public class BandagedScreen implements AdapterView.OnItemSelectedListener
37
{
38
  private WeakReference<BandagedActivity> mAct;
39
  private TransparentImageButton mBackButton, mResetButton, mUndoButton, mDoneButton;
40
  private LinearLayout mObjectView;
41
  private int mNumObjects, mX, mY, mZ;
42
  private final ArrayList<BandagedObjectView> mViews;
43
  private Spinner mSpinnerX, mSpinnerY, mSpinnerZ;
44
  private boolean mSpinnersReady;
45
  private float mTextSize;
46
  private final int mOrdinal;
47
  private final int mDimension;
48
  private final int mMaxSupported;
49
  private final int mMinSupported;
50

    
51
///////////////////////////////////////////////////////////////////////////////////////////////////
52

    
53
  public BandagedScreen(int ordinal)
54
    {
55
    mOrdinal      = ordinal;
56
    mMinSupported = LocallyBandagedList.getMinSupported(ordinal);
57
    mMaxSupported = LocallyBandagedList.getMaxSupported(ordinal);
58
    mDimension    = LocallyBandagedList.getDimension(ordinal);
59
    mSpinnersReady= false;
60
    mNumObjects = 0;
61
    mViews = new ArrayList<>();
62
    }
63

    
64
///////////////////////////////////////////////////////////////////////////////////////////////////
65

    
66
  private void setupBackButton(final BandagedActivity act)
67
    {
68
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
69
    mBackButton = new TransparentImageButton(act,R.drawable.ui_smallback,params);
70

    
71
    mBackButton.setOnClickListener( new View.OnClickListener()
72
      {
73
      @Override
74
      public void onClick(View v)
75
        {
76
        act.finish();
77
        }
78
      });
79
    }
80

    
81
///////////////////////////////////////////////////////////////////////////////////////////////////
82

    
83
  private void setupDoneButton(final BandagedActivity act)
84
    {
85
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
86
    mDoneButton = new TransparentImageButton(act,R.drawable.ui_done,params);
87

    
88
    mDoneButton.setOnClickListener( new View.OnClickListener()
89
      {
90
      @Override
91
      public void onClick(View v)
92
        {
93
        BandagedRenderer renderer = act.getRenderer();
94
        if( !renderer.isBusy() ) renderer.displaySavingDialog();
95
        }
96
      });
97
    }
98

    
99
///////////////////////////////////////////////////////////////////////////////////////////////////
100

    
101
  private void setupUndoButton(final BandagedActivity act)
102
    {
103
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
104
    mUndoButton = new TransparentImageButton(act,R.drawable.ui_left,params);
105

    
106
    mUndoButton.setOnClickListener( new View.OnClickListener()
107
    {
108
      @Override
109
      public void onClick(View v)
110
        {
111
        BandagedRenderer renderer = act.getRenderer();
112
        if( !renderer.isBusy() ) renderer.setupUndo();
113
        }
114
    });
115
    }
116

    
117
///////////////////////////////////////////////////////////////////////////////////////////////////
118

    
119
  private void setupResetButton(final BandagedActivity act)
120
    {
121
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
122
    mResetButton = new TransparentImageButton(act,R.drawable.ui_reset,params);
123

    
124
    mResetButton.setOnClickListener( new View.OnClickListener()
125
      {
126
      @Override
127
      public void onClick(View v)
128
        {
129
        BandagedRenderer renderer = act.getRenderer();
130
        if( !renderer.isBusy() ) renderer.setupReset();
131
        }
132
      });
133
    }
134

    
135
///////////////////////////////////////////////////////////////////////////////////////////////////
136

    
137
  private String[] createSizes(String mark)
138
    {
139
    int num = mMaxSupported-mMinSupported+1;
140
    String[] ret = new String[num];
141

    
142
    for(int i=1; i<=num; i++)
143
      {
144
      ret[i-1] = mark+" : "+(mMinSupported+i-1);
145
      }
146

    
147
    return ret;
148
    }
149

    
150
///////////////////////////////////////////////////////////////////////////////////////////////////
151

    
152
  private void changeObject()
153
    {
154
    if( mSpinnersReady )
155
      {
156
      BandagedActivity act = mAct.get();
157
      if( act!=null ) act.changeObject(mX+mMinSupported,mY+mMinSupported,mZ+mMinSupported);
158
      }
159
    }
160

    
161
///////////////////////////////////////////////////////////////////////////////////////////////////
162

    
163
  void onAttachedToWindow(final BandagedActivity act)
164
    {
165
    mAct = new WeakReference<>(act);
166
    mObjectView = act.findViewById(R.id.bandagedCreatorView);
167
    mTextSize = act.getScreenHeightInPixels()*BandagedActivity.SPINNER_TEXT_SIZE;
168

    
169
    int width  = act.getScreenWidthInPixels();
170
    int height = act.getScreenHeightInPixels();
171
    int padding= (int)(height*BandagedActivity.PADDING/3);
172

    
173
    LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
174
    LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
175
    LinearLayout.LayoutParams params3 = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
176
    LinearLayout.LayoutParams params4 = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
177

    
178
    LinearLayout layout1 = new LinearLayout(act);
179
    layout1.setLayoutParams(params1);
180
    LinearLayout layout2 = new LinearLayout(act);
181
    layout2.setLayoutParams(params2);
182
    LinearLayout layout3 = new LinearLayout(act);
183
    layout3.setLayoutParams(params3);
184
    LinearLayout layout4 = new LinearLayout(act);
185
    layout4.setLayoutParams(params4);
186

    
187
    setupBackButton(act);
188
    layout4.addView(mBackButton);
189
    setupDoneButton(act);
190
    layout3.addView(mDoneButton);
191
    setupUndoButton(act);
192
    layout2.addView(mUndoButton);
193
    setupResetButton(act);
194
    layout1.addView(mResetButton);
195

    
196
    LinearLayout layout = act.findViewById(R.id.lowerBar);
197
    layout.removeAllViews();
198
    layout.addView(layout1);
199
    layout.addView(layout2);
200
    layout.addView(layout3);
201
    layout.addView(layout4);
202

    
203
    mSpinnerX = act.findViewById(R.id.bandagedCreatorX);
204
    mSpinnerY = act.findViewById(R.id.bandagedCreatorY);
205
    mSpinnerZ = act.findViewById(R.id.bandagedCreatorZ);
206

    
207
    if( mDimension>=1 )
208
      {
209
      mSpinnerX.setOnItemSelectedListener(this);
210
      ArrayAdapter<String> adX=new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("X"));
211
      mSpinnerX.setAdapter(adX);
212
      ViewGroup.MarginLayoutParams paramsX=(ViewGroup.MarginLayoutParams) mSpinnerX.getLayoutParams();
213
      paramsX.setMargins(0, 0, 2*padding, 0);
214
      }
215
    else
216
      {
217
      mSpinnerX.setVisibility(View.INVISIBLE);
218
      }
219

    
220
    if( mDimension>=2 )
221
      {
222
      mSpinnerY.setOnItemSelectedListener(this);
223
      ArrayAdapter<String> adY=new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("Y"));
224
      mSpinnerY.setAdapter(adY);
225
      ViewGroup.MarginLayoutParams paramsY=(ViewGroup.MarginLayoutParams) mSpinnerY.getLayoutParams();
226
      paramsY.setMargins(padding, 0, padding, 0);
227
      }
228
    else
229
      {
230
      mSpinnerY.setVisibility(View.INVISIBLE);
231
      }
232

    
233
    if( mDimension>=3 )
234
      {
235
      mSpinnerZ.setOnItemSelectedListener(this);
236
      ArrayAdapter<String> adZ=new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("Z"));
237
      mSpinnerZ.setAdapter(adZ);
238
      ViewGroup.MarginLayoutParams paramsZ=(ViewGroup.MarginLayoutParams) mSpinnerZ.getLayoutParams();
239
      paramsZ.setMargins(2*padding, 0, 0, 0);
240
      }
241
    else
242
      {
243
      mSpinnerZ.setVisibility(View.INVISIBLE);
244
      }
245
    }
246

    
247
///////////////////////////////////////////////////////////////////////////////////////////////////
248

    
249
  boolean objectDoesntExist(String name)
250
    {
251
    for( BandagedObjectView view : mViews )
252
      {
253
      String viewName = view.getName();
254
      if( viewName.equals(name) ) return false;
255
      }
256

    
257
    return true;
258
    }
259

    
260
///////////////////////////////////////////////////////////////////////////////////////////////////
261

    
262
  private void addObjects(BandagedActivity act, String objectString)
263
    {
264
    if( !objectString.isEmpty() )
265
      {
266
      String[] objects = objectString.split(" ");
267
      RubikFiles files = RubikFiles.getInstance();
268

    
269
      for(String object : objects)
270
        {
271
        if( objectDoesntExist(object) )
272
          {
273
          addObject(act, object);
274
          Bitmap bmp = files.getIcon(act, object + ".png");
275
          iconCreationDone(act, bmp);
276
          }
277
        }
278
      }
279
    }
280

    
281
///////////////////////////////////////////////////////////////////////////////////////////////////
282

    
283
  void addObject(BandagedActivity act, String name)
284
    {
285
    BandagedObjectView view = new BandagedObjectView(act,name,mNumObjects==0);
286
    LinearLayout pane = view.getPane();
287
    mObjectView.addView(pane);
288
    mNumObjects++;
289
    mViews.add(view);
290
    }
291

    
292
///////////////////////////////////////////////////////////////////////////////////////////////////
293

    
294
  void deleteObject(BandagedActivity act, String name)
295
    {
296
    for(int v=0; v<mNumObjects; v++)
297
      {
298
      BandagedObjectView view = mViews.get(v);
299
      String viewName = view.getName();
300

    
301
      if( viewName.equals(name) )
302
        {
303
        LinearLayout pane = view.getPane();
304
        mObjectView.removeView(pane);
305
        mViews.remove(view);
306
        mNumObjects--;
307

    
308
        if( v==0 && mNumObjects>0 )
309
          {
310
          BandagedObjectView v2 = mViews.get(v);
311
          LinearLayout p2 = v2.getPane();
312
          int height = act.getScreenHeightInPixels();
313
          LinearLayout.LayoutParams params = BandagedObjectView.createPaneParams(height,true,act.isRTL());
314
          p2.setLayoutParams(params);
315
          }
316

    
317
        break;
318
        }
319
      }
320
    }
321

    
322
///////////////////////////////////////////////////////////////////////////////////////////////////
323

    
324
  void iconCreationDone(Activity act, Bitmap bmp)
325
    {
326
    int numChildren = mObjectView.getChildCount();
327

    
328
    if( numChildren>0 )
329
      {
330
      LinearLayout pane = (LinearLayout)mObjectView.getChildAt(numChildren-1);
331
      ImageView view = pane.findViewById(R.id.bandagedCreatorObjectIcon);
332

    
333
      if( view!=null )
334
        {
335
        act.runOnUiThread(new Runnable()
336
          {
337
          @Override
338
          public void run()
339
          {
340
          view.setImageBitmap(bmp);
341
          }
342
          });
343
        }
344
      else
345
        {
346
        android.util.Log.e("D", "ImageView not found!");
347
        }
348
      }
349
    }
350

    
351
///////////////////////////////////////////////////////////////////////////////////////////////////
352

    
353
  private String generateObjectStrings()
354
    {
355
    StringBuilder result = new StringBuilder();
356
    int numViews = mViews.size();
357

    
358
    for( int v=0; v<numViews; v++ )
359
      {
360
      BandagedObjectView view = mViews.get(v);
361
      String name = view.getName();
362
      if( v>0 ) result.append(' ');
363
      result.append(name);
364
      }
365

    
366
    return result.toString();
367
    }
368

    
369
///////////////////////////////////////////////////////////////////////////////////////////////////
370

    
371
    @SuppressLint("SuspiciousIndentation")
372
    @Override
373
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
374
      {
375
      int spinnerID = parent.getId();
376

    
377
      if( view!=null ) ((TextView) view).setTextSize(TypedValue.COMPLEX_UNIT_PX,mTextSize);
378

    
379
           if( spinnerID==R.id.bandagedCreatorX ) mX = pos;
380
      else if( spinnerID==R.id.bandagedCreatorY ) mY = pos;
381
      else if( spinnerID==R.id.bandagedCreatorZ ) mZ = pos;
382

    
383
      changeObject();
384
      }
385

    
386
///////////////////////////////////////////////////////////////////////////////////////////////////
387

    
388
    @Override
389
    public void onNothingSelected(AdapterView<?> parent) { }
390

    
391
///////////////////////////////////////////////////////////////////////////////////////////////////
392

    
393
    private String generateObjectKey()
394
      {
395
      return mOrdinal==0 ? "bandagedObjects" : "bandagedObjects"+mOrdinal;
396
      }
397

    
398
///////////////////////////////////////////////////////////////////////////////////////////////////
399

    
400
    public void savePreferences(SharedPreferences.Editor editor)
401
      {
402
      String objects = generateObjectStrings();
403
      editor.putString(generateObjectKey(), objects );
404

    
405
      editor.putInt("bandagedX"+mOrdinal, mX);
406
      editor.putInt("bandagedY"+mOrdinal, mY);
407
      editor.putInt("bandagedZ"+mOrdinal, mZ);
408
      }
409

    
410
///////////////////////////////////////////////////////////////////////////////////////////////////
411

    
412
    public void restorePreferences(BandagedActivity act, SharedPreferences preferences)
413
      {
414
      String objects = preferences.getString(generateObjectKey(),"");
415
      addObjects(act,objects);
416

    
417
      mX = preferences.getInt("bandagedX"+mOrdinal, 2);
418
      mY = preferences.getInt("bandagedY"+mOrdinal, 2);
419
      mZ = preferences.getInt("bandagedZ"+mOrdinal, 2);
420

    
421
      int max = mMaxSupported-mMinSupported+1;
422

    
423
      if( mX>=max ) mX = 0;//max-1;
424
      if( mY>=max ) mY = 0;//max-1;
425
      if( mZ>=max ) mZ = 0;//max-1;
426

    
427
      mSpinnerX.setSelection(mX);
428
      mSpinnerY.setSelection(mY);
429
      mSpinnerZ.setSelection(mZ);
430

    
431
      mSpinnersReady = true;
432
      changeObject();
433
      }
434
}
(4-4/7)