Project

General

Profile

« Previous | Next » 

Revision 9df01f21

Added by Leszek Koltunski almost 4 years ago

Progress with Predeform: UI for the list of Vertex effects to preapply.

View differences:

src/main/java/org/distorted/examples/predeform/PredeformActivity.java
22 22
import android.app.Activity;
23 23
import android.content.Intent;
24 24
import android.os.Bundle;
25
import android.view.Gravity;
26 25
import android.view.View;
27 26
import android.widget.AdapterView;
28 27
import android.widget.ArrayAdapter;
......
30 29
import android.widget.LinearLayout;
31 30
import android.widget.NumberPicker;
32 31
import android.widget.Spinner;
33
import android.widget.TableRow;
34 32

  
35 33
import org.distorted.examples.R;
34
import org.distorted.library.effect.Effect;
35
import org.distorted.library.effect.EffectName;
36
import org.distorted.library.effect.EffectType;
37
import org.distorted.library.type.Static4D;
38

  
39
import java.util.ArrayList;
36 40

  
37 41
///////////////////////////////////////////////////////////////////////////////////////////////////
38 42

  
39
public class PredeformActivity extends Activity
40
                               implements View.OnClickListener, AdapterView.OnItemSelectedListener
43
public class PredeformActivity extends Activity implements View.OnClickListener, AdapterView.OnItemSelectedListener
41 44
  {
42
  private static final int COLOR_OFF = 0xffffe81f;
43
  private static final int COLOR_ON  = 0xff0000ff;
44
  private static final int COLOR_INAC= 0xff999999;
45

  
46 45
  private int mNumCols = 1;
47 46
  private int mNumRows = 1;
48 47
  private int mNumSlic = 1;
49
  private boolean mGridInitialized;
50 48
  private NumberPicker mColsPicker, mRowsPicker, mSlicPicker;
51
  private boolean[] mShape;
52 49
  private int mObjectType;
53 50
  private int mBitmapID;
54
  private LinearLayout mLay;
51
  private EffectName[] mEffectNames;
52
  private int mEffectAdd;
53
  private LinearLayout mLayout;
54
  private int mChildren;
55
  private ArrayList<PredeformEffect> mList;
55 56

  
56 57
///////////////////////////////////////////////////////////////////////////////////////////////////
57 58

  
......
60 61
    {
61 62
    super.onCreate(savedState);
62 63

  
63
    setContentView(R.layout.objectpickerlayout);
64
    setContentView(R.layout.predeformpickerlayout);
64 65

  
65
    mLay = findViewById(R.id.objectpicker_buttongrid);
66
    mLayout = findViewById(R.id.predeformLayout);
67
    mChildren = 0;
68
    mList = new ArrayList<>();
66 69

  
67
    mColsPicker = findViewById(R.id.objectpicker_cols);
68
    mRowsPicker = findViewById(R.id.objectpicker_rows);
69
    mSlicPicker = findViewById(R.id.objectpicker_slices);
70
    mColsPicker = findViewById(R.id.predeformCols);
71
    mRowsPicker = findViewById(R.id.predeformRows);
72
    mSlicPicker = findViewById(R.id.predeformSlices);
70 73

  
71 74
    mColsPicker.setMaxValue(40);
72 75
    mColsPicker.setMinValue( 1);
......
80 83
         @Override
81 84
         public void onValueChange(NumberPicker picker, int oldVal, int newVal)
82 85
           {
83
           setGrid();
86
           mNumCols = newVal;
84 87
           }
85 88
         });
86 89

  
......
89 92
         @Override
90 93
         public void onValueChange(NumberPicker picker, int oldVal, int newVal)
91 94
           {
92
           setGrid();
95
           mNumRows = newVal;
93 96
           }
94 97
         });
95 98

  
......
98 101
         @Override
99 102
         public void onValueChange(NumberPicker picker, int oldVal, int newVal)
100 103
           {
101
           mNumSlic = mSlicPicker.getValue();
104
           mNumSlic = newVal;
102 105
           }
103 106
         });
104 107

  
105 108
    mObjectType = 0;
106
    mGridInitialized = false;
107 109

  
108
    Spinner typeSpinner  = findViewById(R.id.objectpicker_spinnerType);
110
    Spinner typeSpinner  = findViewById(R.id.predeformSpinnerType);
109 111
    typeSpinner.setOnItemSelectedListener(this);
110 112

  
111 113
    String[] objectType = new String[PredeformMeshList.LENGTH];
......
119 121
    adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
120 122
    typeSpinner.setAdapter(adapterType);
121 123

  
122
    Spinner bitmapSpinner  = findViewById(R.id.objectpicker_spinnerBitmap);
124
    Spinner bitmapSpinner  = findViewById(R.id.predeformSpinnerBitmap);
123 125
    bitmapSpinner.setOnItemSelectedListener(this);
124 126

  
125 127
    String[] objectBitmap = new String[] { "Texture: Grid", "Texture: Girl", "Texture: Dog", "Texture: Cat",
......
128 130
    ArrayAdapter<String> adapterBitmap = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, objectBitmap);
129 131
    adapterBitmap.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
130 132
    bitmapSpinner.setAdapter(adapterBitmap);
131
    }
132 133

  
133
///////////////////////////////////////////////////////////////////////////////////////////////////
134
    Spinner effectSpinner  = findViewById(R.id.predeformSpinnerEffect);
135
    effectSpinner.setOnItemSelectedListener(this);
134 136

  
135
  private void setGrid()
136
    {
137
    mGridInitialized = true;
137
    ArrayAdapter<String> adapterEffect = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, createEffectNames());
138
    adapterEffect.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
139
    effectSpinner.setAdapter(adapterEffect);
138 140

  
139
    mNumCols = mColsPicker.getValue();
140
    mNumRows = mRowsPicker.getValue();
141
    Button add = findViewById(R.id.predeformAddEffect);
142
    add.setOnClickListener(this);
143
    Button rem = findViewById(R.id.predeformRemoveEffect);
144
    rem.setOnClickListener(this);
145
    Button cre = findViewById(R.id.predeformCreate);
146
    cre.setOnClickListener(this);
147
    }
141 148

  
142
    int width = mLay.getWidth();
143
    int height= mLay.getHeight();
144
    int w = mNumCols>0 ? (int)( 0.9f*width / mNumCols) : 0;
145
    int h = mNumRows>0 ? (int)( 0.9f*height/ mNumRows) : 0;
146
    int size= Math.min(w, h);
147
    int pad = size<20 ? 1 : size/20;
149
///////////////////////////////////////////////////////////////////////////////////////////////////
148 150

  
149
    mLay.removeAllViews();
151
    private String[] createEffectNames()
152
      {
153
      EffectType type;
154
      EffectName[] names = EffectName.values();
150 155

  
151
    mShape = new boolean[mNumRows*mNumCols];
156
      int numEffects=0;
152 157

  
153
    TableRow.LayoutParams p = new TableRow.LayoutParams();
158
      for (EffectName effectName : names)
159
        {
160
        type = effectName.getType();
161
        if (type == EffectType.VERTEX) numEffects++;
162
        }
154 163

  
155
    p.rightMargin  = pad;
156
    p.leftMargin   = pad;
157
    p.topMargin    = pad;
158
    p.bottomMargin = pad;
159
    p.height       = size;
160
    p.width        = size;
164
      mEffectNames = new EffectName[numEffects];
165
      String[] effectStrings = new String[numEffects];
161 166

  
162
    for (int rows=0; rows<mNumRows; rows++)
163
      {
164
      TableRow tr = new TableRow(this);
165
      tr.setGravity(Gravity.CENTER);
167
      numEffects=0;
166 168

  
167
      for(int cols=0; cols<mNumCols; cols++)
169
      for (EffectName name : names)
168 170
        {
169
        Button b = new Button(this);
170
        b.setOnClickListener(this);
171
        b.setId(rows*mNumCols+cols);
172
        b.setLayoutParams(p);
173
        b.setBackgroundColor(mObjectType==0 ? COLOR_ON:COLOR_INAC);
174
        tr.addView(b, p);
175
        mShape[rows*mNumCols+cols] = true;
171
        type = name.getType();
172

  
173
        if (type == EffectType.VERTEX)
174
          {
175
          mEffectNames[numEffects] = name;
176
          effectStrings[numEffects] = name.name();
177

  
178
          numEffects++;
179
          }
176 180
        }
177 181

  
178
      mLay.addView(tr);
182
      return effectStrings;
179 183
      }
180
    }
181 184

  
182 185
///////////////////////////////////////////////////////////////////////////////////////////////////
183 186

  
184
  public void onClick(View view)
187
  public void newEffect()
185 188
    {
186
    if( mObjectType==0 )  // cubes
189
    PredeformEffect eff = new PredeformEffect(mEffectNames[mEffectAdd], this );
190
    mList.add(eff);
191

  
192
    mChildren++;
193

  
194
    View view = eff.createView(mChildren);
195
    mLayout.addView(view);
196

  
197
    int dimension = eff.getDimension();
198
    Button butt;
199

  
200
    switch(dimension)
201
      {
202
      case 1: butt = view.findViewById(R.id.button1dRemove);
203
              butt.setOnClickListener(this);
204
              break;
205
      case 2: butt = view.findViewById(R.id.button2dRemove);
206
              butt.setOnClickListener(this);
207
              break;
208
      case 3: butt = view.findViewById(R.id.button3dRemove);
209
              butt.setOnClickListener(this);
210
              break;
211
      case 4: butt = view.findViewById(R.id.button4dRemove);
212
              butt.setOnClickListener(this);
213
              break;
214
      case 5: butt = view.findViewById(R.id.button5dRemove);
215
              butt.setOnClickListener(this);
216
              break;
217
      }
218

  
219
    if( mEffectNames[mEffectAdd].getCenterDimension() > 0 )
220
      {
221
      View center = eff.createCenter(mChildren);
222
      mLayout.addView(center);
223
      }
224

  
225
    if( mEffectNames[mEffectAdd].getRegionDimension() > 0 )
187 226
      {
188
      Button tmp = (Button)view;
189
      int id = tmp.getId();
190
      mShape[id] = !mShape[id];
191
      tmp.setBackgroundColor(mShape[id] ? COLOR_ON:COLOR_OFF);
227
      View region = eff.createRegion(mChildren);
228
      mLayout.addView(region);
192 229
      }
230

  
231
    Effect effect = eff.createEffect();
232

  
233
    PredeformEffectList.addNew(effect);
193 234
    }
194 235

  
195 236
///////////////////////////////////////////////////////////////////////////////////////////////////
196 237

  
197
  private void uncheckAll()
238
  public void removeAll()
198 239
    {
199
    TableRow tr;
200
    Button butt;
240
    mChildren = 0;
241
    mList.clear();
242
    mLayout.removeAllViews();
243
    PredeformEffectList.removeAll();
244
    }
201 245

  
202
    for (int row=0; row<mNumRows; row++)
203
      {
204
      tr = (TableRow)mLay.getChildAt(row);
246
///////////////////////////////////////////////////////////////////////////////////////////////////
205 247

  
206
      for(int col=0; col<mNumCols; col++)
248
  public void remove(View v)
249
    {
250
    for(PredeformEffect effect: mList)
251
      {
252
      if( effect.thisView(v) )
207 253
        {
208
        butt = (Button)tr.getVirtualChildAt(col);
209
        butt.setBackgroundColor(mObjectType==0 ? COLOR_ON : COLOR_INAC);
210
        mShape[row*mNumCols+col] = true;
254
        View view;
255

  
256
        view = effect.getEffect();
257
        if( view!=null ) mLayout.removeView(view);
258
        view = effect.getCenter();
259
        if( view!=null ) mLayout.removeView(view);
260
        view = effect.getRegion();
261
        if( view!=null ) mLayout.removeView(view);
262

  
263
        PredeformEffectList.remove(effect.getId());
264

  
265
        int index = mList.indexOf(effect);
266
        int capac = mList.size();
267

  
268
        for(int i=index+1; i<capac; i++)
269
          {
270
          mList.get(i).setBackground(i-1);
271
          }
272

  
273
        mList.remove(effect);
274
        mChildren--;
275

  
276
        break;
211 277
        }
212 278
      }
213 279
    }
214 280

  
215 281
///////////////////////////////////////////////////////////////////////////////////////////////////
216 282

  
217
  public void Create(View v)
283
  public void create()
218 284
    {
219 285
    Intent mainInt = new Intent( getApplicationContext(), PredeformActivity2.class);
220 286
    Bundle b = new Bundle();
......
225 291
    b.putInt("slices", PredeformMeshList.getSlic(mObjectType, mNumCols, mNumRows, mNumSlic) );
226 292
    b.putInt("bitmap", mBitmapID);
227 293

  
228
    b.putString("string", PredeformMeshList.getString(mObjectType, mNumCols, mNumRows, mShape));
229

  
230 294
    mainInt.putExtras(b);
231 295
    startActivity(mainInt);
232 296
    }
233 297

  
234 298
///////////////////////////////////////////////////////////////////////////////////////////////////
299
// TODO
235 300

  
236
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
301
  int getScreenWidth()
237 302
    {
238
    switch(parent.getId())
239
      {
240
      case R.id.objectpicker_spinnerType  : if( mObjectType!=pos )
241
                                              {
242
                                              mObjectType = pos;
243
                                              uncheckAll();
244

  
245
                                              int dim = PredeformMeshList.getDimension(mObjectType);
246

  
247
                                              mRowsPicker.setEnabled(dim>=1);
248
                                              mColsPicker.setEnabled(dim>=2);
249
                                              mSlicPicker.setEnabled(dim>=3);
250
                                              }
251
                                            break;
252
      case R.id.objectpicker_spinnerBitmap: switch(pos)
253
                                              {
254
                                              case 0: mBitmapID = -1            ; break;
255
                                              case 1: mBitmapID = R.raw.face    ; break;
256
                                              case 2: mBitmapID = R.raw.dog     ; break;
257
                                              case 3: mBitmapID = R.raw.cat     ; break;
258
                                              case 4: mBitmapID = R.raw.grid    ; break;
259
                                              case 5: mBitmapID = R.raw.bean    ; break;
260
                                              case 6: mBitmapID = R.raw.monalisa; break;
261
                                              case 7: mBitmapID = R.raw.world   ; break;
262
                                              }
263
                                            break;
264
      }
303
    return 1080;
265 304
    }
266 305

  
267 306
///////////////////////////////////////////////////////////////////////////////////////////////////
307
// only important for matrix effects, ignore here
268 308

  
269
  public void onNothingSelected(AdapterView<?> parent)
309
  float getScaleFactor()
270 310
    {
311
    return 1.0f;
271 312
    }
272 313

  
273 314
///////////////////////////////////////////////////////////////////////////////////////////////////
274
// Overrides
315
// TODO
316

  
317
  void setCenter(float x, float y, float z)
318
    {
319

  
320
    }
321

  
322
///////////////////////////////////////////////////////////////////////////////////////////////////
323
// TODO
324

  
325
  void setRegion(Static4D region)
326
    {
327

  
328
    }
329

  
330
///////////////////////////////////////////////////////////////////////////////////////////////////
331

  
332
  int getWidth()
333
    {
334
    return mNumCols;
335
    }
336

  
337
///////////////////////////////////////////////////////////////////////////////////////////////////
338

  
339
  int getHeight()
340
    {
341
    return mNumRows;
342
    }
343

  
344
///////////////////////////////////////////////////////////////////////////////////////////////////
345

  
346
  int getDepth()
347
    {
348
    return mNumSlic;
349
    }
350

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

  
353
  @Override
354
  public void onClick(View v)
355
    {
356
    switch (v.getId())
357
      {
358
      case R.id.predeformAddEffect   : newEffect(); break;
359
      case R.id.predeformRemoveEffect: removeAll(); break;
360
      case R.id.predeformCreate      : create();    break;
361
      case R.id.button1dRemove       :
362
      case R.id.button2dRemove       :
363
      case R.id.button3dRemove       :
364
      case R.id.button4dRemove       :
365
      case R.id.button5dRemove       : remove(v)  ; break;
366
      }
367
    }
368

  
275 369
///////////////////////////////////////////////////////////////////////////////////////////////////
276 370

  
277 371
  @Override
......
282 376
    mColsPicker.setValue(mNumCols);
283 377
    mRowsPicker.setValue(mNumRows);
284 378
    mSlicPicker.setValue(mNumSlic);
379
    }
380

  
381
///////////////////////////////////////////////////////////////////////////////////////////////////
285 382

  
286
    if( !mGridInitialized ) setGrid();
383
  @Override
384
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
385
    {
386
    switch(parent.getId())
387
      {
388
      case R.id.predeformSpinnerType  : if( mObjectType!=pos )
389
                                          {
390
                                          mObjectType = pos;
391

  
392
                                          int dim = PredeformMeshList.getDimension(mObjectType);
393

  
394
                                          mRowsPicker.setEnabled(dim>=1);
395
                                          mColsPicker.setEnabled(dim>=2);
396
                                          mSlicPicker.setEnabled(dim>=3);
397
                                          }
398
                                        break;
399
      case R.id.predeformSpinnerBitmap: switch(pos)
400
                                          {
401
                                          case 0: mBitmapID = -1            ; break;
402
                                          case 1: mBitmapID = R.raw.face    ; break;
403
                                          case 2: mBitmapID = R.raw.dog     ; break;
404
                                          case 3: mBitmapID = R.raw.cat     ; break;
405
                                          case 4: mBitmapID = R.raw.grid    ; break;
406
                                          case 5: mBitmapID = R.raw.bean    ; break;
407
                                          case 6: mBitmapID = R.raw.monalisa; break;
408
                                          case 7: mBitmapID = R.raw.world   ; break;
409
                                          }
410
                                        break;
411
      case R.id.predeformSpinnerEffect: mEffectAdd = pos;
412
                                        break;
413
      }
414
    }
415

  
416
///////////////////////////////////////////////////////////////////////////////////////////////////
417

  
418
  @Override
419
  public void onNothingSelected(AdapterView<?> parent)
420
    {
287 421
    }
288 422
  }

Also available in: Unified diff