diff options
Diffstat (limited to 'src/com/android/gallery3d/photoeditor/EffectsBar.java')
-rw-r--r-- | src/com/android/gallery3d/photoeditor/EffectsBar.java | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/src/com/android/gallery3d/photoeditor/EffectsBar.java b/src/com/android/gallery3d/photoeditor/EffectsBar.java new file mode 100644 index 000000000..6e3178e1a --- /dev/null +++ b/src/com/android/gallery3d/photoeditor/EffectsBar.java @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2010 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.photoeditor; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.android.gallery3d.R; +import com.android.gallery3d.photoeditor.actions.EffectAction; +import com.android.gallery3d.photoeditor.actions.EffectToolFactory; + +/** + * Effects bar that contains all effects and shows them in categorized views. + */ +public class EffectsBar extends LinearLayout { + + private FilterStack filterStack; + private LayoutInflater inflater; + private View effectsGallery; + private ViewGroup effectToolPanel; + private EffectAction activeEffect; + + public EffectsBar(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public void initialize(FilterStack filterStack) { + this.filterStack = filterStack; + inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + setupMenuToggle(R.id.exposure_button, R.layout.photoeditor_effects_exposure); + setupMenuToggle(R.id.artistic_button, R.layout.photoeditor_effects_artistic); + setupMenuToggle(R.id.color_button, R.layout.photoeditor_effects_color); + setupMenuToggle(R.id.fix_button, R.layout.photoeditor_effects_fix); + + setEnabled(false); + } + + private void setupMenuToggle(int toggleId, final int effectsId) { + final View toggle = findViewById(toggleId); + toggle.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + // Toggle off to exit effects gallery that is showing. Or toggle on to show effects + // gallery after exiting an active effect if applicable. + exit((toggle.isSelected() && (effectsGallery != null)) ? null : new Runnable() { + + @Override + public void run() { + toggle.setSelected(true); + showEffectsGallery(effectsId); + } + }); + } + }); + } + + private void setupEffectListener(final EffectAction effect) { + effect.setListener(new EffectAction.Listener() { + + @Override + public void onClick() { + if (isEnabled()) { + // Set the clicked effect active before exiting effects-gallery. + activeEffect = effect; + exitEffectsGallery(); + // Create effect tool panel first before the factory could create tools within. + createEffectToolPanel(); + activeEffect.begin( + filterStack, new EffectToolFactory(effectToolPanel, inflater)); + } + } + + @Override + public void onDone() { + exit(null); + } + }); + } + + private void createEffectToolPanel() { + effectToolPanel = (ViewGroup) inflater.inflate( + R.layout.photoeditor_effect_tool_panel, this, false); + ((TextView) effectToolPanel.findViewById(R.id.effect_label)).setText(activeEffect.name()); + addView(effectToolPanel, 0); + } + + private void showEffectsGallery(int effectsId) { + // Inflate scrollable effects-gallery and desired effects into effects-bar. + effectsGallery = inflater.inflate(R.layout.photoeditor_effects_gallery, this, false); + ViewGroup scrollView = (ViewGroup) effectsGallery.findViewById(R.id.scroll_view); + ViewGroup effects = (ViewGroup) inflater.inflate(effectsId, scrollView, false); + for (int i = 0; i < effects.getChildCount(); i++) { + setupEffectListener((EffectAction) effects.getChildAt(i)); + } + scrollView.addView(effects); + scrollView.scrollTo(0, 0); + addView(effectsGallery, 0); + } + + private boolean exitEffectsGallery() { + if (effectsGallery != null) { + if (activeEffect != null) { + // Detach the active effect from effects-gallery that could be recycled by gc. + ViewGroup scrollView = (ViewGroup) effectsGallery.findViewById(R.id.scroll_view); + ((ViewGroup) scrollView.getChildAt(0)).removeView(activeEffect); + } + removeView(effectsGallery); + effectsGallery = null; + return true; + } + return false; + } + + private boolean exitActiveEffect(final Runnable runnableOnDone) { + if (activeEffect != null) { + final SpinnerProgressDialog progressDialog = SpinnerProgressDialog.show( + (ViewGroup) getRootView().findViewById(R.id.toolbar)); + activeEffect.end(new Runnable() { + + @Override + public void run() { + progressDialog.dismiss(); + View fullscreenTool = getRootView().findViewById(R.id.fullscreen_effect_tool); + if (fullscreenTool != null) { + ((ViewGroup) fullscreenTool.getParent()).removeView(fullscreenTool); + } + removeView(effectToolPanel); + effectToolPanel = null; + activeEffect = null; + if (runnableOnDone != null) { + runnableOnDone.run(); + } + } + }); + return true; + } + return false; + } + + /** + * Exits from effects gallery or the active effect; then executes the runnable if applicable. + * + * @return true if exiting from effects gallery or the active effect; otherwise, false. + */ + public boolean exit(final Runnable runnableOnDone) { + // Exit effects-menu selected states. + ViewGroup menu = (ViewGroup) findViewById(R.id.effects_menu); + for (int i = 0; i < menu.getChildCount(); i++) { + View toggle = menu.getChildAt(i); + if (toggle.isSelected()) { + toggle.setSelected(false); + } + } + + if (exitActiveEffect(runnableOnDone)) { + return true; + } + + boolean exited = exitEffectsGallery(); + if (runnableOnDone != null) { + runnableOnDone.run(); + } + return exited; + } +} |