/*
* Catroid: An on-device visual programming system for Android devices
* Copyright (C) 2010-2016 The Catrobat Team
* (<http://developer.catrobat.org/credits>)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* An additional term exception under section 7 of the GNU Affero
* General Public License, version 3, is available at
* http://developer.catrobat.org/license_additional_term
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.catrobat.catroid.ui.fragment;
import android.content.Context;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;
import org.catrobat.catroid.R;
import org.catrobat.catroid.common.BrickValues;
import org.catrobat.catroid.content.bricks.Brick;
import org.catrobat.catroid.content.bricks.FormulaBrick;
import org.catrobat.catroid.formulaeditor.Formula;
public class AdvancedConfigSeekbar {
private final FormulaBrick formulaBrick;
private final Brick.BrickField altitudeLimit;
private final Brick.BrickField verticalSpeedLimit;
private final Brick.BrickField rotationSpeedLimit;
private final Brick.BrickField tiltAngleLimit;
private TextView formulaEditorEditTextAltitude;
private TextView formulaEditorEditTextVerticalSpeed;
private TextView formulaEditorEditTextRotationSpeed;
private TextView formulaEditorEditTextTiltAngle;
private View seekbarView;
public AdvancedConfigSeekbar(FormulaBrick formulaBrick, Brick.BrickField altitudeLimit,
Brick.BrickField verticalSpeedLimit, Brick.BrickField rotationSpeedLimit,
Brick.BrickField tiltAngleLimit) {
this.formulaBrick = formulaBrick;
this.altitudeLimit = altitudeLimit;
this.verticalSpeedLimit = verticalSpeedLimit;
this.rotationSpeedLimit = rotationSpeedLimit;
this.tiltAngleLimit = tiltAngleLimit;
}
public View getView(Context context) {
seekbarView = View.inflate(context, R.layout.fragment_drone_config_cooser, null);
seekbarView.setFocusableInTouchMode(true);
seekbarView.requestFocus();
formulaEditorEditTextAltitude = (TextView) seekbarView.findViewById(R.id.altitude_limit_value);
formulaBrick.getFormulaWithBrickField(altitudeLimit).setTextFieldId(R.id.altitude_limit_value);
formulaBrick.getFormulaWithBrickField(altitudeLimit).refreshTextField(seekbarView);
formulaEditorEditTextRotationSpeed = (TextView) seekbarView.findViewById(R.id.vertical_speed_limit_value);
formulaBrick.getFormulaWithBrickField(verticalSpeedLimit).setTextFieldId(R.id.vertical_speed_limit_value);
formulaBrick.getFormulaWithBrickField(verticalSpeedLimit).refreshTextField(seekbarView);
formulaEditorEditTextVerticalSpeed = (TextView) seekbarView.findViewById(R.id.rotation_speed_limit_value);
formulaBrick.getFormulaWithBrickField(rotationSpeedLimit).setTextFieldId(R.id.rotation_speed_limit_value);
formulaBrick.getFormulaWithBrickField(rotationSpeedLimit).refreshTextField(seekbarView);
formulaEditorEditTextTiltAngle = (TextView) seekbarView.findViewById(R.id.tilt_angle_limit_value);
formulaBrick.getFormulaWithBrickField(tiltAngleLimit).setTextFieldId(R.id.tilt_angle_limit_value);
formulaBrick.getFormulaWithBrickField(tiltAngleLimit).refreshTextField(seekbarView);
SeekBar altitudeSeekBar = (SeekBar) seekbarView.findViewById(R.id.altitude_limit_seekbar);
SeekBar verticalSpeedSeekBar = (SeekBar) seekbarView.findViewById(R.id.vertical_speed_limit_seekbar);
SeekBar rotationSpeedSeekBar = (SeekBar) seekbarView.findViewById(R.id.rotation_speed_limit_seekbar);
SeekBar tiltAngleSeekBar = (SeekBar) seekbarView.findViewById(R.id.tilt_angle_limit_seekbar);
altitudeSeekBar.setMax(BrickValues.DRONE_ALTITUDE_MAX);
verticalSpeedSeekBar.setMax(BrickValues.DRONE_VERTICAL_MAX);
rotationSpeedSeekBar.setMax(BrickValues.DRONE_ROTATION_MAX);
tiltAngleSeekBar.setMax(BrickValues.DRONE_TILT_MAX);
altitudeSeekBar.setProgress(getCurrentBrickFieldValue(altitudeLimit));
verticalSpeedSeekBar.setProgress(getCurrentBrickFieldValue(verticalSpeedLimit));
rotationSpeedSeekBar.setProgress(getCurrentBrickFieldValue(rotationSpeedLimit));
tiltAngleSeekBar.setProgress(getCurrentBrickFieldValue(tiltAngleLimit));
SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
switch (seekBar.getId()) {
case R.id.altitude_limit_seekbar:
if (seekBar.getProgress() + BrickValues.DRONE_ALTITUDE_MIN < BrickValues.DRONE_ALTITUDE_MAX) {
formulaEditorEditTextAltitude.setText(String.valueOf(seekBar.getProgress() + BrickValues.DRONE_ALTITUDE_MIN));
} else {
formulaEditorEditTextAltitude.setText(String.valueOf(BrickValues.DRONE_ALTITUDE_MAX));
}
break;
case R.id.vertical_speed_limit_seekbar:
if (seekBar.getProgress() + BrickValues.DRONE_VERTICAL_MIN < BrickValues.DRONE_VERTICAL_MAX) {
formulaEditorEditTextRotationSpeed.setText(String.valueOf(seekBar.getProgress() + BrickValues.DRONE_VERTICAL_MIN));
} else {
formulaEditorEditTextRotationSpeed.setText(String.valueOf(BrickValues.DRONE_VERTICAL_MAX));
}
break;
case R.id.rotation_speed_limit_seekbar:
if (seekBar.getProgress() + BrickValues.DRONE_ROTATION_MIN < BrickValues.DRONE_ROTATION_MAX) {
formulaEditorEditTextVerticalSpeed.setText(String.valueOf(seekBar.getProgress() + BrickValues.DRONE_ROTATION_MIN));
} else {
formulaEditorEditTextVerticalSpeed.setText(String.valueOf(BrickValues.DRONE_ROTATION_MAX));
}
break;
case R.id.tilt_angle_limit_seekbar:
if (seekBar.getProgress() + BrickValues.DRONE_TILT_MIN < BrickValues.DRONE_TILT_MAX) {
formulaEditorEditTextTiltAngle.setText(String.valueOf(seekBar.getProgress() + BrickValues.DRONE_TILT_MIN));
} else {
formulaEditorEditTextTiltAngle.setText(String.valueOf(BrickValues.DRONE_TILT_MAX));
}
break;
default:
break;
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
Brick.BrickField changedBrickField = null;
switch (seekBar.getId()) {
case R.id.altitude_limit_seekbar:
FormulaEditorFragment.changeInputField(seekbarView, altitudeLimit);
changedBrickField = altitudeLimit;
if (seekBar.getProgress() < BrickValues.DRONE_ALTITUDE_MIN) {
FormulaEditorFragment.overwriteFormula(seekbarView, new Formula(BrickValues.DRONE_ALTITUDE_MIN));
} else if (seekBar.getProgress() + BrickValues.DRONE_ALTITUDE_MIN > BrickValues.DRONE_ALTITUDE_MAX) {
FormulaEditorFragment.overwriteFormula(seekbarView, new Formula(BrickValues.DRONE_ALTITUDE_MAX));
} else {
FormulaEditorFragment.overwriteFormula(seekbarView, new Formula(seekBar.getProgress() + BrickValues.DRONE_ALTITUDE_MIN));
}
break;
case R.id.vertical_speed_limit_seekbar:
FormulaEditorFragment.changeInputField(seekbarView, verticalSpeedLimit);
changedBrickField = verticalSpeedLimit;
if (seekBar.getProgress() + BrickValues.DRONE_VERTICAL_MIN < BrickValues.DRONE_VERTICAL_MAX) {
FormulaEditorFragment.overwriteFormula(seekbarView, new Formula(seekBar.getProgress() + BrickValues.DRONE_VERTICAL_MIN));
} else {
FormulaEditorFragment.overwriteFormula(seekbarView, new Formula(BrickValues.DRONE_VERTICAL_MAX));
}
break;
case R.id.rotation_speed_limit_seekbar:
FormulaEditorFragment.changeInputField(seekbarView, rotationSpeedLimit);
changedBrickField = rotationSpeedLimit;
if (seekBar.getProgress() + BrickValues.DRONE_ROTATION_MIN < BrickValues.DRONE_ROTATION_MAX) {
FormulaEditorFragment.overwriteFormula(seekbarView, new Formula(seekBar.getProgress() + BrickValues.DRONE_ROTATION_MIN));
} else {
FormulaEditorFragment.overwriteFormula(seekbarView, new Formula(BrickValues.DRONE_ROTATION_MAX));
}
break;
case R.id.tilt_angle_limit_seekbar:
FormulaEditorFragment.changeInputField(seekbarView, tiltAngleLimit);
changedBrickField = tiltAngleLimit;
if (seekBar.getProgress() + BrickValues.DRONE_TILT_MIN < BrickValues.DRONE_TILT_MAX) {
FormulaEditorFragment.overwriteFormula(seekbarView, new Formula(seekBar.getProgress() + BrickValues.DRONE_TILT_MIN));
} else {
FormulaEditorFragment.overwriteFormula(seekbarView, new Formula(BrickValues.DRONE_TILT_MAX));
}
break;
default:
break;
}
// FormulaEditorFragment.overwriteFormula(seekbarView, new Formula(seekBar.getProgress()));
// ToDo: this is a hack for saving the value immediately
FormulaEditorFragment.changeInputField(seekbarView, getOtherField(changedBrickField));
FormulaEditorFragment.changeInputField(seekbarView, changedBrickField);
// end of hack
}
};
altitudeSeekBar.setOnSeekBarChangeListener(seekBarChangeListener);
verticalSpeedSeekBar.setOnSeekBarChangeListener(seekBarChangeListener);
rotationSpeedSeekBar.setOnSeekBarChangeListener(seekBarChangeListener);
tiltAngleSeekBar.setOnSeekBarChangeListener(seekBarChangeListener);
return seekbarView;
}
private Brick.BrickField getOtherField(Brick.BrickField brickField) {
if (brickField == rotationSpeedLimit) {
return altitudeLimit;
}
return rotationSpeedLimit;
}
private int getCurrentBrickFieldValue(Brick.BrickField brickField) {
String stringValue = formulaBrick.getFormulaWithBrickField(brickField)
.getDisplayString(seekbarView.getContext());
return Double.valueOf(stringValue.replace(",", ".")).intValue();
}
}