Project

General

Profile

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

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

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