diff options
Diffstat (limited to 'src/com/android/gallery3d/filtershow/PanelController.java')
-rw-r--r-- | src/com/android/gallery3d/filtershow/PanelController.java | 474 |
1 files changed, 474 insertions, 0 deletions
diff --git a/src/com/android/gallery3d/filtershow/PanelController.java b/src/com/android/gallery3d/filtershow/PanelController.java new file mode 100644 index 000000000..f9a1f1d16 --- /dev/null +++ b/src/com/android/gallery3d/filtershow/PanelController.java @@ -0,0 +1,474 @@ + +package com.android.gallery3d.filtershow; + +import android.text.Html; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewPropertyAnimator; +import android.widget.TextView; + +import com.android.gallery3d.R; +import com.android.gallery3d.filtershow.filters.ImageFilter; +import com.android.gallery3d.filtershow.filters.ImageFilterContrast; +import com.android.gallery3d.filtershow.filters.ImageFilterExposure; +import com.android.gallery3d.filtershow.filters.ImageFilterHue; +import com.android.gallery3d.filtershow.filters.ImageFilterSaturated; +import com.android.gallery3d.filtershow.filters.ImageFilterShadows; +import com.android.gallery3d.filtershow.filters.ImageFilterSharpen; +import com.android.gallery3d.filtershow.filters.ImageFilterVibrance; +import com.android.gallery3d.filtershow.filters.ImageFilterVignette; +import com.android.gallery3d.filtershow.imageshow.ImageShow; +import com.android.gallery3d.filtershow.presets.ImagePreset; +import com.android.gallery3d.filtershow.ui.ImageCurves; + +import java.util.HashMap; +import java.util.Vector; + +public class PanelController implements OnClickListener { + private static int PANEL = 0; + private static int COMPONENT = 1; + private static int VERTICAL_MOVE = 0; + private static int HORIZONTAL_MOVE = 1; + private static final int ANIM_DURATION = 200; + + class Panel { + private final View mView; + private final View mContainer; + private int mPosition = 0; + private final Vector<View> mSubviews = new Vector<View>(); + + public Panel(View view, View container, int position) { + mView = view; + mContainer = container; + mPosition = position; + } + + public void addView(View view) { + mSubviews.add(view); + } + + public int getPosition() { + return mPosition; + } + + public ViewPropertyAnimator unselect(int newPos, int move) { + ViewPropertyAnimator anim = mContainer.animate(); + mView.setSelected(false); + mContainer.setX(0); + mContainer.setY(0); + int delta = 0; + int w = mRowPanel.getWidth(); + int h = mRowPanel.getHeight(); + if (move == HORIZONTAL_MOVE) { + if (newPos > mPosition) { + delta = -w; + } else { + delta = w; + } + anim.x(delta); + } else if (move == VERTICAL_MOVE) { + anim.y(h); + } + anim.setDuration(ANIM_DURATION).withLayer().withEndAction(new Runnable() { + @Override + public void run() { + mContainer.setVisibility(View.GONE); + } + }); + return anim; + } + + public ViewPropertyAnimator select(int oldPos, int move) { + mView.setSelected(true); + mContainer.setVisibility(View.VISIBLE); + mContainer.setX(0); + mContainer.setY(0); + ViewPropertyAnimator anim = mContainer.animate(); + int w = mRowPanel.getWidth(); + int h = mRowPanel.getHeight(); + if (move == HORIZONTAL_MOVE) { + if (oldPos < mPosition) { + mContainer.setX(w); + } else { + mContainer.setX(-w); + } + anim.x(0); + } else if (move == VERTICAL_MOVE) { + mContainer.setY(h); + anim.y(0); + } + anim.setDuration(ANIM_DURATION).withLayer(); + return anim; + } + } + + class UtilityPanel { + private final View mView; + private final View mCompareView; + private final TextView mTextView; + private boolean mSelected = false; + private String mEffectName = null; + private int mParameterValue = 0; + + public UtilityPanel(View view, View compareView, View textView) { + mView = view; + mCompareView = compareView; + mTextView = (TextView) textView; + } + + public boolean selected() { + return mSelected; + } + + public void onNewValue(int value) { + mParameterValue = value; + updateText(); + } + + public void setGeometryEffect(boolean isGeometryEffect) { + if (isGeometryEffect) { + mCompareView.setVisibility(View.INVISIBLE); + } else { + mCompareView.setVisibility(View.VISIBLE); + } + } + + public void setEffectName(String effectName) { + mEffectName = effectName; + updateText(); + } + + public void updateText() { + mTextView.setText(Html.fromHtml("Apply" + "<br/><small>" + mEffectName + "<br/>" + + mParameterValue + "</small>")); + } + + public ViewPropertyAnimator unselect() { + ViewPropertyAnimator anim = mView.animate(); + mView.setX(0); + mView.setY(0); + int h = mRowPanel.getHeight(); + anim.y(-h); + anim.setDuration(ANIM_DURATION).withLayer().withEndAction(new Runnable() { + @Override + public void run() { + mView.setVisibility(View.GONE); + } + }); + mSelected = false; + return anim; + } + + public ViewPropertyAnimator select() { + mView.setVisibility(View.VISIBLE); + int h = mRowPanel.getHeight(); + mView.setX(0); + mView.setY(-h); + updateText(); + ViewPropertyAnimator anim = mView.animate(); + anim.y(0); + anim.setDuration(ANIM_DURATION).withLayer(); + mSelected = true; + return anim; + } + } + + class ViewType { + private final int mType; + private final View mView; + + public ViewType(View view, int type) { + mView = view; + mType = type; + } + + public int type() { + return mType; + } + } + + private final HashMap<View, Panel> mPanels = new HashMap<View, Panel>(); + private final HashMap<View, ViewType> mViews = new HashMap<View, ViewType>(); + private final Vector<View> mImageViews = new Vector<View>(); + private View mCurrentPanel = null; + private View mRowPanel = null; + private UtilityPanel mUtilityPanel = null; + private ImageShow mMasterImage = null; + private ImageShow mCurrentImage = null; + + public void addView(View view) { + view.setOnClickListener(this); + mViews.put(view, new ViewType(view, COMPONENT)); + } + + public void addPanel(View view, View container, int position) { + mPanels.put(view, new Panel(view, container, position)); + view.setOnClickListener(this); + mViews.put(view, new ViewType(view, PANEL)); + } + + public void addComponent(View aPanel, View component) { + Panel panel = mPanels.get(aPanel); + if (panel == null) { + return; + } + panel.addView(component); + component.setOnClickListener(this); + mViews.put(component, new ViewType(component, COMPONENT)); + } + + public void addImageView(View view) { + mImageViews.add(view); + ImageShow imageShow = (ImageShow) view; + imageShow.setPanelController(this); + } + + public void onNewValue(int value) { + mUtilityPanel.onNewValue(value); + } + + public void setCurrentPanel(View panel) { + showPanel(panel); + } + + public void setRowPanel(View rowPanel) { + mRowPanel = rowPanel; + } + + public void setUtilityPanel(View utilityPanel, View compareView, View textView) { + mUtilityPanel = new UtilityPanel(utilityPanel, compareView, textView); + } + + public void setMasterImage(ImageShow imageShow) { + mMasterImage = imageShow; + } + + @Override + public void onClick(View view) { + ViewType type = mViews.get(view); + if (type.type() == PANEL) { + showPanel(view); + } else if (type.type() == COMPONENT) { + showComponent(view); + } + } + + public ImageShow showImageView(int id) { + ImageShow image = null; + for (View view : mImageViews) { + if (view.getId() == id) { + view.setVisibility(View.VISIBLE); + image = (ImageShow) view; + } else { + view.setVisibility(View.GONE); + } + } + return image; + } + + public void showDefaultImageView() { + showImageView(R.id.imageShow).setShowControls(false); + mMasterImage.setCurrentFilter(null); + } + + public void showPanel(View view) { + view.setVisibility(View.VISIBLE); + boolean removedUtilityPanel = false; + Panel current = mPanels.get(mCurrentPanel); + if (mUtilityPanel != null && mUtilityPanel.selected()) { + ViewPropertyAnimator anim1 = mUtilityPanel.unselect(); + removedUtilityPanel = true; + anim1.start(); + if (mCurrentPanel == view) { + ViewPropertyAnimator anim2 = current.select(-1, VERTICAL_MOVE); + anim2.start(); + showDefaultImageView(); + } + } + + if (mCurrentPanel == view) { + return; + } + + Panel panel = mPanels.get(view); + if (!removedUtilityPanel) { + int currentPos = -1; + if (current != null) { + currentPos = current.getPosition(); + } + ViewPropertyAnimator anim1 = panel.select(currentPos, HORIZONTAL_MOVE); + anim1.start(); + if (current != null) { + ViewPropertyAnimator anim2 = current.unselect(panel.getPosition(), HORIZONTAL_MOVE); + anim2.start(); + } + } else { + ViewPropertyAnimator anim = panel.select(-1, VERTICAL_MOVE); + anim.start(); + } + showDefaultImageView(); + mCurrentPanel = view; + } + + public ImagePreset getImagePreset() { + return mMasterImage.getImagePreset(); + } + + public ImageFilter setImagePreset(ImageFilter filter, String name) { + ImagePreset copy = new ImagePreset(getImagePreset()); + copy.add(filter); + copy.setHistoryName(filter.getName()); + copy.setIsFx(false); + mMasterImage.setImagePreset(copy); + return filter; + } + + public void ensureFilter(String name) { + ImagePreset preset = getImagePreset(); + ImageFilter filter = preset.getFilter(name); + if (filter == null && name.equalsIgnoreCase("Vignette")) { + filter = setImagePreset(new ImageFilterVignette(), name); + } + if (filter == null && name.equalsIgnoreCase("Sharpen")) { + filter = setImagePreset(new ImageFilterSharpen(), name); + } + if (filter == null && name.equalsIgnoreCase("Contrast")) { + filter = setImagePreset(new ImageFilterContrast(), name); + } + if (filter == null && name.equalsIgnoreCase("Saturated")) { + filter = setImagePreset(new ImageFilterSaturated(), name); + } + if (filter == null && name.equalsIgnoreCase("Hue")) { + filter = setImagePreset(new ImageFilterHue(), name); + } + if (filter == null && name.equalsIgnoreCase("Exposure")) { + filter = setImagePreset(new ImageFilterExposure(), name); + } + if (filter == null && name.equalsIgnoreCase("Vibrance")) { + filter = setImagePreset(new ImageFilterVibrance(), name); + } + if (filter == null && name.equalsIgnoreCase("Shadows")) { + filter = setImagePreset(new ImageFilterShadows(), name); + } + mMasterImage.setCurrentFilter(filter); + } + + public void showComponent(View view) { + if (mUtilityPanel != null && !mUtilityPanel.selected()) { + Panel current = mPanels.get(mCurrentPanel); + ViewPropertyAnimator anim1 = current.unselect(-1, VERTICAL_MOVE); + anim1.start(); + if (mUtilityPanel != null) { + ViewPropertyAnimator anim2 = mUtilityPanel.select(); + anim2.start(); + } + } + + if (mCurrentImage != null) { + mCurrentImage.unselect(); + } + + switch (view.getId()) { + case R.id.straightenButton: { + mCurrentImage = showImageView(R.id.imageStraighten); + mUtilityPanel.setEffectName("Straighten"); + mUtilityPanel.setGeometryEffect(true); + break; + } + case R.id.cropButton: { + mCurrentImage = showImageView(R.id.imageShow); + mUtilityPanel.setEffectName("Crop"); + mUtilityPanel.setGeometryEffect(true); + break; + } + case R.id.rotateButton: { + mCurrentImage = showImageView(R.id.imageShow); + mUtilityPanel.setEffectName("Rotate"); + mUtilityPanel.setGeometryEffect(true); + break; + } + case R.id.flipButton: { + mCurrentImage = showImageView(R.id.imageShow); + mUtilityPanel.setEffectName("Flip"); + mUtilityPanel.setGeometryEffect(true); + break; + } + case R.id.vignetteButton: { + mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); + mUtilityPanel.setEffectName("Vignette"); + mUtilityPanel.setGeometryEffect(false); + ensureFilter("Vignette"); + break; + } + case R.id.curvesButtonRGB: { + ImageCurves curves = (ImageCurves) showImageView(R.id.imageCurves); + mUtilityPanel.setEffectName("Curves"); + mUtilityPanel.setGeometryEffect(true); + curves.setUseRed(true); + curves.setUseGreen(true); + curves.setUseBlue(true); + curves.reloadCurve(); + mCurrentImage = curves; + break; + } + case R.id.sharpenButton: { + mCurrentImage = showImageView(R.id.imageZoom).setShowControls(true); + mUtilityPanel.setEffectName("Sharpen"); + mUtilityPanel.setGeometryEffect(false); + ensureFilter("Sharpen"); + break; + } + case R.id.contrastButton: { + mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); + mUtilityPanel.setEffectName("Contrast"); + mUtilityPanel.setGeometryEffect(false); + ensureFilter("Contrast"); + break; + } + case R.id.saturationButton: { + mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); + mUtilityPanel.setEffectName("Saturated"); + mUtilityPanel.setGeometryEffect(false); + ensureFilter("Saturated"); + break; + } + case R.id.tintButton: { + mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); + mUtilityPanel.setEffectName("Hue"); + mUtilityPanel.setGeometryEffect(false); + ensureFilter("Hue"); + break; + } + case R.id.exposureButton: { + mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); + mUtilityPanel.setEffectName("Exposure"); + mUtilityPanel.setGeometryEffect(false); + ensureFilter("Exposure"); + break; + } + case R.id.vibranceButton: { + mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); + mUtilityPanel.setEffectName("Vibrance"); + mUtilityPanel.setGeometryEffect(false); + ensureFilter("Vibrance"); + break; + } + case R.id.shadowRecoveryButton: { + mCurrentImage = showImageView(R.id.imageShow).setShowControls(true); + mUtilityPanel.setEffectName("Shadows"); + mUtilityPanel.setGeometryEffect(false); + ensureFilter("Shadows"); + break; + } + case R.id.resetEffect: { + mCurrentImage.resetParameter(); + break; + } + case R.id.applyEffect: { + showPanel(mCurrentPanel); + break; + } + } + mCurrentImage.select(); + } +} |