blob: 059121634f0f583fdeef998f1596d30e57fc38fa [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.gallery3d.filtershow.editors;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.PopupMenu;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.ToggleButton;
import com.android.gallery3d.R;
import com.android.gallery3d.filtershow.FilterShowActivity;
import com.android.gallery3d.filtershow.controller.Control;
import com.android.gallery3d.filtershow.controller.FilterView;
import com.android.gallery3d.filtershow.controller.Parameter;
import com.android.gallery3d.filtershow.controller.ParameterActionAndInt;
import com.android.gallery3d.filtershow.filters.FilterGradRepresentation;
import com.android.gallery3d.filtershow.filters.FilterRepresentation;
import com.android.gallery3d.filtershow.imageshow.ImageGrad;
import com.android.gallery3d.filtershow.imageshow.MasterImage;
public class EditorGrad extends ParametricEditor
implements OnSeekBarChangeListener, ParameterActionAndInt {
private static final String LOGTAG = "EditorGrad";
public static final int ID = R.id.editorGrad;
PopupMenu mPopupMenu;
ToggleButton mAddModeButton;
String mEffectName = "";
private static final int MODE_BRIGHTNESS = FilterGradRepresentation.PARAM_BRIGHTNESS;
private static final int MODE_SATURATION = FilterGradRepresentation.PARAM_SATURATION;
private static final int MODE_CONTRAST = FilterGradRepresentation.PARAM_CONTRAST;
private static final int ADD_ICON = R.drawable.ic_grad_add;
private static final int DEL_ICON = R.drawable.ic_grad_del;
private int mSliderMode = MODE_BRIGHTNESS;
ImageGrad mImageGrad;
ParamAdapter []mAdapters = new ParamAdapter[3];
public EditorGrad() {
super(ID, R.layout.filtershow_grad_editor, R.id.gradEditor);
}
@Override
public void createEditor(Context context, FrameLayout frameLayout) {
super.createEditor(context, frameLayout);
mImageGrad = (ImageGrad) mImageShow;
mImageGrad.setEditor(this);
}
public void clearAddMode() {
mAddModeButton.setChecked(false);
FilterRepresentation tmpRep = getLocalRepresentation();
if (tmpRep instanceof FilterGradRepresentation) {
updateMenuItems((FilterGradRepresentation) tmpRep);
}
}
@Override
public void reflectCurrentFilter() {
super.reflectCurrentFilter();
FilterRepresentation tmpRep = getLocalRepresentation();
if (tmpRep instanceof FilterGradRepresentation) {
FilterGradRepresentation rep = (FilterGradRepresentation) tmpRep;
boolean f = rep.showParameterValue();
mImageGrad.setRepresentation(rep);
}
}
public void updateSeekBar(FilterGradRepresentation rep) {
if (ParametricEditor.useCompact(mContext)) {
mControl.updateUI();
} else {
updateParameters();
}
}
@Override
public void onProgressChanged(SeekBar sbar, int progress, boolean arg2) {
FilterRepresentation tmpRep = getLocalRepresentation();
if (tmpRep instanceof FilterGradRepresentation) {
FilterGradRepresentation rep = (FilterGradRepresentation) tmpRep;
int min = rep.getParameterMin(mSliderMode);
int value = progress + min;
rep.setParameter(mSliderMode, value);
mView.invalidate();
commitLocalRepresentation();
}
}
@Override
public void openUtilityPanel(final LinearLayout accessoryViewList) {
Button view = (Button) accessoryViewList.findViewById(R.id.applyEffect);
if (useCompact(mContext)) {
view.setText(mContext.getString(R.string.editor_grad_brightness));
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
showPopupMenu(accessoryViewList);
}
});
setUpPopupMenu(view);
setEffectName();
} else {
view.setText(mContext.getString(R.string.grad));
}
}
private void updateMenuItems(FilterGradRepresentation rep) {
int n = rep.getNumberOfBands();
}
public void setEffectName() {
if (mPopupMenu != null) {
MenuItem item = mPopupMenu.getMenu().findItem(R.id.editor_grad_brightness);
mEffectName = item.getTitle().toString();
}
}
@Override
public void setUtilityPanelUI(View actionButton, View editControl) {
if (ParametricEditor.useCompact(mContext)) {
super.setUtilityPanelUI(actionButton, editControl);
return;
}
mSeekBar = (SeekBar) editControl.findViewById(R.id.primarySeekBar);
if (mSeekBar != null) {
mSeekBar.setVisibility(View.GONE);
}
LayoutInflater inflater =
(LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout lp = (LinearLayout) inflater.inflate(
R.layout.filtershow_grad_ui, (ViewGroup) editControl, true);
mAdapters[0] = new ParamAdapter(R.id.gradContrastSeekBar, R.id.gradContrastValue,
lp, MODE_CONTRAST);
mAdapters[1] = new ParamAdapter(R.id.gradBrightnessSeekBar, R.id.gradBrightnessValue,
lp, MODE_BRIGHTNESS);
mAdapters[2] = new ParamAdapter(R.id.gradSaturationSeekBar, R.id.gradSaturationValue,
lp, MODE_SATURATION);
lp.findViewById(R.id.gradAddButton).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
fireLeftAction();
}
});
lp.findViewById(R.id.gradDelButton).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
fireRightAction();
}
});
setMenuIcon(false);
}
public void updateParameters() {
FilterGradRepresentation rep = getGradRepresentation();
for (int i = 0; i < mAdapters.length; i++) {
mAdapters[i].updateValues(rep);
}
}
private class ParamAdapter implements OnSeekBarChangeListener {
SeekBar mSlider;
TextView mTextView;
int mMin = -100;
int mMax = 100;
int mMode;
public ParamAdapter(int seekId, int textId, LinearLayout layout, int mode) {
mSlider = (SeekBar) layout.findViewById(seekId);
mTextView = (TextView) layout.findViewById(textId);
mSlider.setMax(mMax - mMin);
mMode = mode;
FilterGradRepresentation rep = getGradRepresentation();
if (rep != null){
updateValues(rep);
}
mSlider.setOnSeekBarChangeListener(this);
}
public void updateValues(FilterGradRepresentation rep) {
int value = rep.getParameter(mMode);
mTextView.setText(Integer.toString(value));
mSlider.setProgress(value - mMin);
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
FilterGradRepresentation rep = getGradRepresentation();
int value = progress + mMin;
rep.setParameter(mMode, value);
if (mSliderMode != mMode) {
mSliderMode = mMode;
mEffectName = mContext.getResources().getString(getModeNameid(mMode));
mEffectName = mEffectName.toUpperCase();
}
mTextView.setText(Integer.toString(value));
mView.invalidate();
commitLocalRepresentation();
}
private int getModeNameid(int mode) {
switch (mode) {
case MODE_CONTRAST:
return R.string.editor_grad_contrast;
case MODE_BRIGHTNESS:
return R.string.editor_grad_brightness;
case MODE_SATURATION:
return R.string.editor_grad_saturation;
}
return 0;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
}
private void showPopupMenu(LinearLayout accessoryViewList) {
Button button = (Button) accessoryViewList.findViewById(R.id.applyEffect);
if (button == null) {
return;
}
if (mPopupMenu == null) {
setUpPopupMenu(button);
}
mPopupMenu.show();
((FilterShowActivity)mContext).onShowMenu(mPopupMenu);
}
private void setUpPopupMenu(Button button) {
mPopupMenu = new PopupMenu(mImageShow.getActivity(), button);
mPopupMenu.getMenuInflater()
.inflate(R.menu.filtershow_menu_grad, mPopupMenu.getMenu());
FilterGradRepresentation rep = (FilterGradRepresentation) getLocalRepresentation();
if (rep == null) {
return;
}
updateMenuItems(rep);
hackFixStrings(mPopupMenu.getMenu());
setEffectName();
updateText();
mPopupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
FilterRepresentation tmpRep = getLocalRepresentation();
if (tmpRep instanceof FilterGradRepresentation) {
FilterGradRepresentation rep = (FilterGradRepresentation) tmpRep;
int cmdID = item.getItemId();
switch (cmdID) {
case R.id.editor_grad_brightness:
mSliderMode = MODE_BRIGHTNESS;
mEffectName = item.getTitle().toString();
break;
case R.id.editor_grad_contrast:
mSliderMode = MODE_CONTRAST;
mEffectName = item.getTitle().toString();
break;
case R.id.editor_grad_saturation:
mSliderMode = MODE_SATURATION;
mEffectName = item.getTitle().toString();
break;
}
updateMenuItems(rep);
updateSeekBar(rep);
commitLocalRepresentation();
mView.invalidate();
}
return true;
}
});
}
@Override
public String calculateUserMessage(Context context, String effectName, Object parameterValue) {
FilterGradRepresentation rep = getGradRepresentation();
if (rep == null) {
return mEffectName;
}
int val = rep.getParameter(mSliderMode);
return mEffectName.toUpperCase() + ((val > 0) ? " +" : " ") + val;
}
private FilterGradRepresentation getGradRepresentation() {
FilterRepresentation tmpRep = getLocalRepresentation();
if (tmpRep instanceof FilterGradRepresentation) {
return (FilterGradRepresentation) tmpRep;
}
return null;
}
@Override
public int getMaximum() {
FilterGradRepresentation rep = getGradRepresentation();
if (rep == null) {
return 0;
}
return rep.getParameterMax(mSliderMode);
}
@Override
public int getMinimum() {
FilterGradRepresentation rep = getGradRepresentation();
if (rep == null) {
return 0;
}
return rep.getParameterMin(mSliderMode);
}
@Override
public int getDefaultValue() {
return 0;
}
@Override
public int getValue() {
FilterGradRepresentation rep = getGradRepresentation();
if (rep == null) {
return 0;
}
return rep.getParameter(mSliderMode);
}
@Override
public String getValueString() {
return null;
}
@Override
public void setValue(int value) {
FilterGradRepresentation rep = getGradRepresentation();
if (rep == null) {
return;
}
rep.setParameter(mSliderMode, value);
}
@Override
public String getParameterName() {
return mEffectName;
}
@Override
public String getParameterType() {
return sParameterType;
}
@Override
public void setController(Control c) {
}
@Override
public void fireLeftAction() {
FilterGradRepresentation rep = getGradRepresentation();
if (rep == null) {
return;
}
rep.addBand(MasterImage.getImage().getOriginalBounds());
updateMenuItems(rep);
updateSeekBar(rep);
commitLocalRepresentation();
mView.invalidate();
}
@Override
public int getLeftIcon() {
return ADD_ICON;
}
@Override
public void fireRightAction() {
FilterGradRepresentation rep = getGradRepresentation();
if (rep == null) {
return;
}
rep.deleteCurrentBand();
updateMenuItems(rep);
updateSeekBar(rep);
commitLocalRepresentation();
mView.invalidate();
}
@Override
public int getRightIcon() {
return DEL_ICON;
}
@Override
public void setFilterView(FilterView editor) {
}
@Override
public void copyFrom(Parameter src) {
}
}