Home | History | Annotate | Download | only in editors
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.gallery3d.filtershow.editors;
     17 
     18 import android.content.Context;
     19 import android.view.LayoutInflater;
     20 import android.view.MenuItem;
     21 import android.view.View;
     22 import android.view.View.OnClickListener;
     23 import android.view.ViewGroup;
     24 import android.widget.Button;
     25 import android.widget.FrameLayout;
     26 import android.widget.LinearLayout;
     27 import android.widget.PopupMenu;
     28 import android.widget.SeekBar;
     29 import android.widget.SeekBar.OnSeekBarChangeListener;
     30 import android.widget.TextView;
     31 import android.widget.ToggleButton;
     32 
     33 import com.android.gallery3d.R;
     34 import com.android.gallery3d.filtershow.FilterShowActivity;
     35 import com.android.gallery3d.filtershow.controller.Control;
     36 import com.android.gallery3d.filtershow.controller.FilterView;
     37 import com.android.gallery3d.filtershow.controller.Parameter;
     38 import com.android.gallery3d.filtershow.controller.ParameterActionAndInt;
     39 import com.android.gallery3d.filtershow.filters.FilterGradRepresentation;
     40 import com.android.gallery3d.filtershow.filters.FilterRepresentation;
     41 import com.android.gallery3d.filtershow.imageshow.ImageGrad;
     42 import com.android.gallery3d.filtershow.imageshow.MasterImage;
     43 
     44 public class EditorGrad extends ParametricEditor
     45         implements OnSeekBarChangeListener, ParameterActionAndInt {
     46     private static final String LOGTAG = "EditorGrad";
     47     public static final int ID = R.id.editorGrad;
     48     PopupMenu mPopupMenu;
     49     ToggleButton mAddModeButton;
     50     String mEffectName = "";
     51     private static final int MODE_BRIGHTNESS = FilterGradRepresentation.PARAM_BRIGHTNESS;
     52     private static final int MODE_SATURATION = FilterGradRepresentation.PARAM_SATURATION;
     53     private static final int MODE_CONTRAST = FilterGradRepresentation.PARAM_CONTRAST;
     54     private static final int ADD_ICON = R.drawable.ic_grad_add;
     55     private static final int DEL_ICON = R.drawable.ic_grad_del;
     56     private int mSliderMode = MODE_BRIGHTNESS;
     57     ImageGrad mImageGrad;
     58     ParamAdapter []mAdapters = new ParamAdapter[3];
     59     public EditorGrad() {
     60         super(ID, R.layout.filtershow_grad_editor, R.id.gradEditor);
     61     }
     62 
     63     @Override
     64     public void createEditor(Context context, FrameLayout frameLayout) {
     65         super.createEditor(context, frameLayout);
     66         mImageGrad = (ImageGrad) mImageShow;
     67         mImageGrad.setEditor(this);
     68 
     69     }
     70 
     71     public void clearAddMode() {
     72         mAddModeButton.setChecked(false);
     73         FilterRepresentation tmpRep = getLocalRepresentation();
     74         if (tmpRep instanceof FilterGradRepresentation) {
     75             updateMenuItems((FilterGradRepresentation) tmpRep);
     76         }
     77     }
     78 
     79     @Override
     80     public void reflectCurrentFilter() {
     81         super.reflectCurrentFilter();
     82         FilterRepresentation tmpRep = getLocalRepresentation();
     83         if (tmpRep instanceof FilterGradRepresentation) {
     84             FilterGradRepresentation rep = (FilterGradRepresentation) tmpRep;
     85             boolean f = rep.showParameterValue();
     86 
     87             mImageGrad.setRepresentation(rep);
     88         }
     89     }
     90 
     91     public void updateSeekBar(FilterGradRepresentation rep) {
     92         if (ParametricEditor.useCompact(mContext)) {
     93             mControl.updateUI();
     94         } else {
     95             updateParameters();
     96         }
     97     }
     98 
     99     @Override
    100     public void onProgressChanged(SeekBar sbar, int progress, boolean arg2) {
    101         FilterRepresentation tmpRep = getLocalRepresentation();
    102         if (tmpRep instanceof FilterGradRepresentation) {
    103             FilterGradRepresentation rep = (FilterGradRepresentation) tmpRep;
    104             int min = rep.getParameterMin(mSliderMode);
    105             int value = progress + min;
    106             rep.setParameter(mSliderMode, value);
    107             mView.invalidate();
    108             commitLocalRepresentation();
    109         }
    110     }
    111 
    112     @Override
    113     public void openUtilityPanel(final LinearLayout accessoryViewList) {
    114         Button view = (Button) accessoryViewList.findViewById(R.id.applyEffect);
    115         if (useCompact(mContext)) {
    116             view.setText(mContext.getString(R.string.editor_grad_brightness));
    117             view.setOnClickListener(new OnClickListener() {
    118                 @Override
    119                 public void onClick(View arg0) {
    120                     showPopupMenu(accessoryViewList);
    121                 }
    122             });
    123 
    124             setUpPopupMenu(view);
    125             setEffectName();
    126         } else {
    127             view.setText(mContext.getString(R.string.grad));
    128         }
    129     }
    130 
    131     private void updateMenuItems(FilterGradRepresentation rep) {
    132         int n = rep.getNumberOfBands();
    133     }
    134 
    135     public void setEffectName() {
    136         if (mPopupMenu != null) {
    137             MenuItem item = mPopupMenu.getMenu().findItem(R.id.editor_grad_brightness);
    138             mEffectName = item.getTitle().toString();
    139         }
    140     }
    141 
    142     @Override
    143     public void setUtilityPanelUI(View actionButton, View editControl) {
    144         if (ParametricEditor.useCompact(mContext)) {
    145             super.setUtilityPanelUI(actionButton, editControl);
    146             return;
    147         }
    148         mSeekBar = (SeekBar) editControl.findViewById(R.id.primarySeekBar);
    149         if (mSeekBar != null) {
    150             mSeekBar.setVisibility(View.GONE);
    151         }
    152         LayoutInflater inflater =
    153                 (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    154         LinearLayout lp = (LinearLayout) inflater.inflate(
    155                 R.layout.filtershow_grad_ui, (ViewGroup) editControl, true);
    156 
    157         mAdapters[0] = new ParamAdapter(R.id.gradContrastSeekBar, R.id.gradContrastValue,
    158                 lp, MODE_CONTRAST);
    159         mAdapters[1] = new ParamAdapter(R.id.gradBrightnessSeekBar, R.id.gradBrightnessValue,
    160                 lp, MODE_BRIGHTNESS);
    161         mAdapters[2] = new ParamAdapter(R.id.gradSaturationSeekBar, R.id.gradSaturationValue,
    162                 lp, MODE_SATURATION);
    163         lp.findViewById(R.id.gradAddButton).setOnClickListener(new OnClickListener() {
    164             @Override
    165             public void onClick(View view) {
    166                 fireLeftAction();
    167             }
    168         });
    169         lp.findViewById(R.id.gradDelButton).setOnClickListener(new OnClickListener() {
    170             @Override
    171             public void onClick(View view) {
    172                 fireRightAction();
    173             }
    174         });
    175         setMenuIcon(false);
    176     }
    177 
    178     public void updateParameters() {
    179         FilterGradRepresentation rep = getGradRepresentation();
    180         for (int i = 0; i < mAdapters.length; i++) {
    181             mAdapters[i].updateValues(rep);
    182         }
    183     }
    184 
    185     private class ParamAdapter implements OnSeekBarChangeListener {
    186         SeekBar mSlider;
    187         TextView mTextView;
    188         int mMin = -100;
    189         int mMax = 100;
    190         int mMode;
    191 
    192         public ParamAdapter(int seekId, int textId, LinearLayout layout, int mode) {
    193             mSlider = (SeekBar) layout.findViewById(seekId);
    194             mTextView = (TextView) layout.findViewById(textId);
    195             mSlider.setMax(mMax - mMin);
    196             mMode = mode;
    197             FilterGradRepresentation rep = getGradRepresentation();
    198             if (rep != null){
    199                 updateValues(rep);
    200             }
    201             mSlider.setOnSeekBarChangeListener(this);
    202         }
    203 
    204         public void updateValues(FilterGradRepresentation rep) {
    205             int value = rep.getParameter(mMode);
    206             mTextView.setText(Integer.toString(value));
    207             mSlider.setProgress(value - mMin);
    208         }
    209 
    210         @Override
    211         public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    212             FilterGradRepresentation rep = getGradRepresentation();
    213             int value = progress + mMin;
    214             rep.setParameter(mMode, value);
    215             if (mSliderMode != mMode) {
    216                 mSliderMode = mMode;
    217                 mEffectName = mContext.getResources().getString(getModeNameid(mMode));
    218                 mEffectName = mEffectName.toUpperCase();
    219             }
    220             mTextView.setText(Integer.toString(value));
    221             mView.invalidate();
    222             commitLocalRepresentation();
    223         }
    224 
    225         private int getModeNameid(int mode) {
    226             switch (mode) {
    227                 case MODE_CONTRAST:
    228                     return R.string.editor_grad_contrast;
    229                 case MODE_BRIGHTNESS:
    230                     return R.string.editor_grad_brightness;
    231                 case MODE_SATURATION:
    232                     return R.string.editor_grad_saturation;
    233             }
    234             return 0;
    235         }
    236 
    237         @Override
    238         public void onStartTrackingTouch(SeekBar seekBar) {
    239 
    240         }
    241 
    242         @Override
    243         public void onStopTrackingTouch(SeekBar seekBar) {
    244 
    245         }
    246     }
    247 
    248     private void showPopupMenu(LinearLayout accessoryViewList) {
    249         Button button = (Button) accessoryViewList.findViewById(R.id.applyEffect);
    250         if (button == null) {
    251             return;
    252         }
    253 
    254         if (mPopupMenu == null) {
    255             setUpPopupMenu(button);
    256         }
    257         mPopupMenu.show();
    258         ((FilterShowActivity)mContext).onShowMenu(mPopupMenu);
    259     }
    260 
    261     private void setUpPopupMenu(Button button) {
    262         mPopupMenu = new PopupMenu(mImageShow.getActivity(), button);
    263         mPopupMenu.getMenuInflater()
    264                 .inflate(R.menu.filtershow_menu_grad, mPopupMenu.getMenu());
    265         FilterGradRepresentation rep = (FilterGradRepresentation) getLocalRepresentation();
    266         if (rep == null) {
    267             return;
    268         }
    269         updateMenuItems(rep);
    270         hackFixStrings(mPopupMenu.getMenu());
    271         setEffectName();
    272         updateText();
    273 
    274         mPopupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
    275             @Override
    276             public boolean onMenuItemClick(MenuItem item) {
    277                 FilterRepresentation tmpRep = getLocalRepresentation();
    278 
    279                 if (tmpRep instanceof FilterGradRepresentation) {
    280                     FilterGradRepresentation rep = (FilterGradRepresentation) tmpRep;
    281                     int cmdID = item.getItemId();
    282                     switch (cmdID) {
    283                         case R.id.editor_grad_brightness:
    284                             mSliderMode = MODE_BRIGHTNESS;
    285                             mEffectName = item.getTitle().toString();
    286                             break;
    287                         case R.id.editor_grad_contrast:
    288                             mSliderMode = MODE_CONTRAST;
    289                             mEffectName = item.getTitle().toString();
    290                             break;
    291                         case R.id.editor_grad_saturation:
    292                             mSliderMode = MODE_SATURATION;
    293                             mEffectName = item.getTitle().toString();
    294                             break;
    295                     }
    296                     updateMenuItems(rep);
    297                     updateSeekBar(rep);
    298 
    299                     commitLocalRepresentation();
    300                     mView.invalidate();
    301                 }
    302                 return true;
    303             }
    304         });
    305     }
    306 
    307     @Override
    308     public String calculateUserMessage(Context context, String effectName, Object parameterValue) {
    309         FilterGradRepresentation rep = getGradRepresentation();
    310         if (rep == null) {
    311             return mEffectName;
    312         }
    313         int val = rep.getParameter(mSliderMode);
    314         return mEffectName.toUpperCase() + ((val > 0) ? " +" : " ") + val;
    315     }
    316 
    317     private FilterGradRepresentation getGradRepresentation() {
    318         FilterRepresentation tmpRep = getLocalRepresentation();
    319         if (tmpRep instanceof FilterGradRepresentation) {
    320             return (FilterGradRepresentation) tmpRep;
    321         }
    322         return null;
    323     }
    324 
    325     @Override
    326     public int getMaximum() {
    327         FilterGradRepresentation rep = getGradRepresentation();
    328         if (rep == null) {
    329             return 0;
    330         }
    331         return rep.getParameterMax(mSliderMode);
    332     }
    333 
    334     @Override
    335     public int getMinimum() {
    336         FilterGradRepresentation rep = getGradRepresentation();
    337         if (rep == null) {
    338             return 0;
    339         }
    340         return rep.getParameterMin(mSliderMode);
    341     }
    342 
    343     @Override
    344     public int getDefaultValue() {
    345         return 0;
    346     }
    347 
    348     @Override
    349     public int getValue() {
    350         FilterGradRepresentation rep = getGradRepresentation();
    351         if (rep == null) {
    352             return 0;
    353         }
    354         return rep.getParameter(mSliderMode);
    355     }
    356 
    357     @Override
    358     public String getValueString() {
    359         return null;
    360     }
    361 
    362     @Override
    363     public void setValue(int value) {
    364         FilterGradRepresentation rep = getGradRepresentation();
    365         if (rep == null) {
    366             return;
    367         }
    368         rep.setParameter(mSliderMode, value);
    369     }
    370 
    371     @Override
    372     public String getParameterName() {
    373         return mEffectName;
    374     }
    375 
    376     @Override
    377     public String getParameterType() {
    378         return sParameterType;
    379     }
    380 
    381     @Override
    382     public void setController(Control c) {
    383 
    384     }
    385 
    386     @Override
    387     public void fireLeftAction() {
    388         FilterGradRepresentation rep = getGradRepresentation();
    389         if (rep == null) {
    390             return;
    391         }
    392         rep.addBand(MasterImage.getImage().getOriginalBounds());
    393         updateMenuItems(rep);
    394         updateSeekBar(rep);
    395 
    396         commitLocalRepresentation();
    397         mView.invalidate();
    398     }
    399 
    400     @Override
    401     public int getLeftIcon() {
    402         return ADD_ICON;
    403     }
    404 
    405     @Override
    406     public void fireRightAction() {
    407         FilterGradRepresentation rep = getGradRepresentation();
    408         if (rep == null) {
    409             return;
    410         }
    411         rep.deleteCurrentBand();
    412 
    413         updateMenuItems(rep);
    414         updateSeekBar(rep);
    415         commitLocalRepresentation();
    416         mView.invalidate();
    417     }
    418 
    419     @Override
    420     public int getRightIcon() {
    421         return DEL_ICON;
    422     }
    423 
    424     @Override
    425     public void setFilterView(FilterView editor) {
    426 
    427     }
    428 
    429     @Override
    430     public void copyFrom(Parameter src) {
    431 
    432     }
    433 }
    434