Project

General

Profile

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

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

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.external.RubikFiles;
30
import org.distorted.helpers.TransparentImageButton;
31
import org.distorted.main.R;
32
import org.distorted.main.RubikActivity;
33

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

    
36
///////////////////////////////////////////////////////////////////////////////////////////////////
37

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

    
49
///////////////////////////////////////////////////////////////////////////////////////////////////
50

    
51
  public BandagedCreatorScreen()
52
    {
53
    mSpinnersReady = false;
54
    mNumObjects = 0;
55
    mViews = new ArrayList<>();
56
    }
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
    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
    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
        BandagedCreatorRenderer renderer = act.getRenderer();
90
        if( !renderer.isBusy() ) renderer.displaySavingDialog();
91
        }
92
      });
93
    }
94

    
95
///////////////////////////////////////////////////////////////////////////////////////////////////
96

    
97
  private void setupResetButton(final BandagedCreatorActivity act)
98
    {
99
    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
    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
        BandagedCreatorRenderer renderer = act.getRenderer();
109
        if( !renderer.isBusy() ) renderer.setupReset();
110
        }
111
      });
112
    }
113

    
114
///////////////////////////////////////////////////////////////////////////////////////////////////
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
///////////////////////////////////////////////////////////////////////////////////////////////////
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
          BandagedCreatorObjectView v2 = mViews.get(v);
262
          LinearLayout p2 = v2.getPane();
263
          int height = act.getScreenHeightInPixels();
264
          LinearLayout.LayoutParams params = BandagedCreatorObjectView.createPaneParams(height,true,act.isRTL());
265
          p2.setLayoutParams(params);
266
          }
267

    
268
        break;
269
        }
270
      }
271
    }
272

    
273
///////////////////////////////////////////////////////////////////////////////////////////////////
274

    
275
  void iconCreationDone(Activity act, Bitmap bmp)
276
    {
277
    int numChildren = mObjectView.getChildCount();
278

    
279
    if( numChildren>0 )
280
      {
281
      LinearLayout pane = (LinearLayout)mObjectView.getChildAt(numChildren-1);
282
      ImageView view = pane.findViewById(R.id.bandagedCreatorObjectIcon);
283

    
284
      if( view!=null )
285
        {
286
        act.runOnUiThread(new Runnable()
287
          {
288
          @Override
289
          public void run()
290
          {
291
          view.setImageBitmap(bmp);
292
          }
293
          });
294
        }
295
      else
296
        {
297
        android.util.Log.e("D", "ImageView not found!");
298
        }
299
      }
300
    }
301

    
302
///////////////////////////////////////////////////////////////////////////////////////////////////
303

    
304
  private String generateObjectStrings()
305
    {
306
    StringBuilder result = new StringBuilder();
307
    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
      if( v>0 ) result.append(' ');
314
      result.append(name);
315
      }
316

    
317
    return result.toString();
318
    }
319

    
320
///////////////////////////////////////////////////////////////////////////////////////////////////
321

    
322
    @SuppressLint("SuspiciousIndentation")
323
    @Override
324
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
325
      {
326
      int spinnerID = parent.getId();
327

    
328
      if( view!=null ) ((TextView) view).setTextSize(TypedValue.COMPLEX_UNIT_PX,mTextSize);
329

    
330
           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

    
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
}
(4-4/14)