Project

General

Profile

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

magiccube / src / main / java / org / distorted / states / RubikStatePattern.java @ e3c74c0f

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is free software: you can redistribute it and/or modify                            //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Magic Cube is distributed in the hope that it will be useful,                                 //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

    
20
package org.distorted.states;
21

    
22
import android.content.SharedPreferences;
23
import android.os.Bundle;
24
import androidx.fragment.app.FragmentManager;
25
import android.util.DisplayMetrics;
26
import android.util.TypedValue;
27
import android.view.Gravity;
28
import android.view.LayoutInflater;
29
import android.view.View;
30
import android.widget.Button;
31
import android.widget.ImageButton;
32
import android.widget.LinearLayout;
33
import android.widget.TextView;
34

    
35
import org.distorted.dialogs.RubikDialogPattern;
36
import org.distorted.main.R;
37
import org.distorted.main.RubikActivity;
38
import org.distorted.main.RubikPreRender;
39
import org.distorted.objects.RubikObjectList;
40
import org.distorted.patterns.RubikPattern;
41
import org.distorted.patterns.RubikPatternList;
42

    
43
///////////////////////////////////////////////////////////////////////////////////////////////////
44

    
45
public class RubikStatePattern extends RubikStateAbstract
46
  {
47
  private TextView mText;
48
  private Button mBackButton;
49
  private ImageButton mPrevButton, mNextButton;
50
  private TextView mMovesText;
51
  private int mNumMoves;
52
  private int mPatternOrdinal, mCategory, mPattern;
53
  private float mButtonSize, mTitleSize;
54

    
55
///////////////////////////////////////////////////////////////////////////////////////////////////
56

    
57
  RubikStatePattern()
58
    {
59

    
60
    }
61

    
62
///////////////////////////////////////////////////////////////////////////////////////////////////
63

    
64
  void leaveState(RubikActivity act)
65
    {
66
    RubikStatePlay play = (RubikStatePlay)RubikState.PLAY.getStateClass();
67

    
68
    RubikObjectList object = RubikPatternList.getObject(mPatternOrdinal);
69
    int size = RubikPatternList.getSize(mPatternOrdinal);
70

    
71
    if( !play.setObjectAndSize(act,object,size) )
72
      {
73
      int objectPlay= play.getObject();
74
      int sizePlay  = play.getSize();
75

    
76
      act.changeObject(RubikObjectList.getObject(objectPlay),sizePlay, false);
77
      }
78
    }
79

    
80
///////////////////////////////////////////////////////////////////////////////////////////////////
81

    
82
  void enterState(final RubikActivity act)
83
    {
84
    float width = act.getScreenWidthInPixels();
85
    mButtonSize = width*RubikActivity.BUTTON_TEXT_SIZE;
86
    mTitleSize  = width*RubikActivity.TITLE_TEXT_SIZE;
87

    
88
    RubikStatePlay play = (RubikStatePlay)RubikState.PLAY.getStateClass();
89
    int obj  = play.getObject();
90
    int size = play.getSize();
91

    
92
    mPatternOrdinal = RubikPatternList.getOrdinal(obj,size);
93

    
94
    if( mPatternOrdinal<0 )
95
      {
96
      mPatternOrdinal = RubikObjectList.getSizeIndex(RubikStatePlay.DEF_OBJECT,RubikStatePlay.DEF_SIZE);
97
      }
98

    
99
    FragmentManager mana = act.getSupportFragmentManager();
100
    RubikDialogPattern diag = (RubikDialogPattern) mana.findFragmentByTag(RubikDialogPattern.getDialogTag());
101

    
102
    if( diag==null ) showDialog(mana);
103

    
104
    LayoutInflater inflater = act.getLayoutInflater();
105

    
106
    // TOP ////////////////////////////
107
    LinearLayout layoutTop = act.findViewById(R.id.upperBar);
108
    layoutTop.removeAllViews();
109
    mText = (TextView)inflater.inflate(R.layout.upper_pattern_text, null);
110
    mText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTitleSize);
111
    mText.setText(R.string.patterns);
112
    layoutTop.addView(mText);
113

    
114
    // BOT ////////////////////////////
115
    DisplayMetrics metrics = act.getResources().getDisplayMetrics();
116
    final float scale = metrics.density;
117

    
118
    setupPrevButton(act,scale);
119
    setupNextButton(act,scale);
120
    setupTextView(act,scale);
121

    
122
    setTrioState(false);
123

    
124
    LinearLayout layoutLeft = act.findViewById(R.id.mainBarLeft);
125
    layoutLeft.removeAllViews();
126
    layoutLeft.addView(mPrevButton);
127
    layoutLeft.addView(mMovesText);
128
    layoutLeft.addView(mNextButton);
129

    
130
    setupBackButton(act,scale);
131

    
132
    LinearLayout layoutRight = act.findViewById(R.id.mainBarRight);
133
    layoutRight.removeAllViews();
134
    layoutRight.addView(mBackButton);
135
    }
136

    
137
///////////////////////////////////////////////////////////////////////////////////////////////////
138

    
139
  private void showDialog(FragmentManager manager)
140
    {
141
    RubikDialogPattern diag = new RubikDialogPattern();
142
    Bundle bundle = new Bundle();
143
    bundle.putInt("tab", mPatternOrdinal );
144
    diag.setArguments(bundle);
145
    diag.show( manager, RubikDialogPattern.getDialogTag() );
146
    }
147

    
148
///////////////////////////////////////////////////////////////////////////////////////////////////
149

    
150
  private void setTrioState(boolean enable)
151
    {
152
    int state = enable ? View.VISIBLE : View.INVISIBLE;
153

    
154
    if( mPrevButton!=null ) mPrevButton.setVisibility(state);
155
    if( mNextButton!=null ) mNextButton.setVisibility(state);
156
    if( mMovesText !=null ) mMovesText.setVisibility(state);
157
    }
158

    
159
///////////////////////////////////////////////////////////////////////////////////////////////////
160

    
161
  private void setupBackButton(final RubikActivity act, final float scale)
162
    {
163
    int padding = (int)(3*scale + 0.5f);
164
    LinearLayout.LayoutParams backParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
165
    mBackButton = new Button(act);
166
    mBackButton.setLayoutParams(backParams);
167
    mBackButton.setPadding(padding,0,padding,0);
168
    mBackButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
169
    mBackButton.setText(R.string.back);
170

    
171
    mBackButton.setOnClickListener( new View.OnClickListener()
172
      {
173
      @Override
174
      public void onClick(View v)
175
        {
176
        FragmentManager mana = act.getSupportFragmentManager();
177
        RubikDialogPattern diag = (RubikDialogPattern) mana.findFragmentByTag(RubikDialogPattern.getDialogTag());
178

    
179
        if( diag==null )
180
          {
181
          showDialog(mana);
182
          setTrioState(false);
183
          }
184
        else
185
          {
186
          diag.rememberState();
187
          diag.dismiss();
188
          RubikState.goBack(act);
189
          }
190
        }
191
      });
192
    }
193

    
194
///////////////////////////////////////////////////////////////////////////////////////////////////
195

    
196
  private void setupPrevButton(final RubikActivity act, final float scale)
197
    {
198
    int padding = (int)(3*scale + 0.5f);
199
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
200
    mPrevButton = new ImageButton(act);
201
    mPrevButton.setLayoutParams(params);
202
    mPrevButton.setPadding(padding,0,padding,0);
203
    mPrevButton.setImageResource(R.drawable.left);
204

    
205
    mPrevButton.setOnClickListener( new View.OnClickListener()
206
      {
207
      @Override
208
      public void onClick(View v)
209
        {
210
        RubikPattern pattern = RubikPattern.getInstance();
211
        RubikPreRender pre = act.getPreRender();
212
        pattern.backMove( pre, mPatternOrdinal, mCategory, mPattern);
213
        int currMove = pattern.getCurMove(mPatternOrdinal, mCategory, mPattern);
214
        mMovesText.setText(act.getString(R.string.mo_placeholder,currMove,mNumMoves));
215
        }
216
      });
217
    }
218

    
219
///////////////////////////////////////////////////////////////////////////////////////////////////
220

    
221
  private void setupNextButton(final RubikActivity act, final float scale)
222
    {
223
    int padding = (int)( 3*scale + 0.5f);
224
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT, 1.0f);
225
    mNextButton = new ImageButton(act);
226
    mNextButton.setLayoutParams(params);
227
    mNextButton.setPadding(padding,0,padding,0);
228
    mNextButton.setImageResource(R.drawable.right);
229

    
230
    mNextButton.setOnClickListener( new View.OnClickListener()
231
      {
232
      @Override
233
      public void onClick(View v)
234
        {
235
        RubikPattern pattern = RubikPattern.getInstance();
236
        RubikPreRender pre = act.getPreRender();
237
        pattern.makeMove( pre, mPatternOrdinal, mCategory, mPattern);
238
        int currMove = pattern.getCurMove(mPatternOrdinal, mCategory, mPattern);
239
        mMovesText.setText(act.getString(R.string.mo_placeholder,currMove,mNumMoves));
240
        }
241
      });
242
    }
243

    
244
///////////////////////////////////////////////////////////////////////////////////////////////////
245

    
246
  private void setupTextView(final RubikActivity act, final float scale)
247
    {
248
    int padding = (int)( 3*scale + 0.5f);
249
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT,2.0f);
250

    
251
    mMovesText = new TextView(act);
252
    mMovesText.setTextSize(20);
253
    mMovesText.setLayoutParams(params);
254
    mMovesText.setPadding(padding,0,padding,0);
255
    mMovesText.setGravity(Gravity.CENTER);
256
    mMovesText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
257
    mMovesText.setText(act.getString(R.string.mo_placeholder,0,0));
258
    }
259

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

    
262
  public void setPattern(final RubikActivity act, int ordinal, int category, int pattern)
263
    {
264
    mPatternOrdinal = ordinal;
265
    mCategory       = category;
266
    mPattern        = pattern;
267

    
268
    setTrioState(true);
269

    
270
    RubikPattern patt = RubikPattern.getInstance();
271
    String patternName = patt.getPatternName(ordinal,category,pattern);
272
    mText.setText(patternName);
273

    
274
    mNumMoves   = patt.getNumMoves(ordinal,category,pattern);
275
    int currMove= patt.getCurMove(ordinal,category,pattern);
276

    
277
    mMovesText.setText(act.getString(R.string.mo_placeholder,currMove,mNumMoves));
278
    }
279

    
280
///////////////////////////////////////////////////////////////////////////////////////////////////
281

    
282
  public void savePreferences(SharedPreferences.Editor editor)
283
    {
284

    
285
    }
286

    
287
///////////////////////////////////////////////////////////////////////////////////////////////////
288

    
289
  public void restorePreferences(SharedPreferences preferences)
290
    {
291

    
292
    }
293
  }
(5-5/10)