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 
     17 package com.android.gallery3d.filtershow.editors;
     18 
     19 import android.app.ActionBar;
     20 import android.content.Context;
     21 import android.content.res.Resources;
     22 import android.graphics.Bitmap;
     23 import android.graphics.BitmapFactory;
     24 import android.graphics.Color;
     25 import android.graphics.drawable.GradientDrawable;
     26 import android.view.View;
     27 import android.widget.Button;
     28 import android.widget.ImageButton;
     29 import android.widget.ImageView;
     30 import android.widget.LinearLayout;
     31 import android.widget.SeekBar;
     32 import android.widget.TextView;
     33 
     34 import com.android.gallery3d.R;
     35 import com.android.gallery3d.filtershow.colorpicker.ColorCompareView;
     36 import com.android.gallery3d.filtershow.colorpicker.ColorHueView;
     37 import com.android.gallery3d.filtershow.colorpicker.ColorListener;
     38 import com.android.gallery3d.filtershow.colorpicker.ColorOpacityView;
     39 import com.android.gallery3d.filtershow.colorpicker.ColorSVRectView;
     40 import com.android.gallery3d.filtershow.controller.BasicParameterInt;
     41 import com.android.gallery3d.filtershow.controller.BasicParameterStyle;
     42 import com.android.gallery3d.filtershow.controller.ParameterColor;
     43 import com.android.gallery3d.filtershow.filters.FilterDrawRepresentation;
     44 
     45 import java.util.Arrays;
     46 
     47 public class EditorDrawTabletUI {
     48     private EditorDraw mEditorDraw;
     49     private int[] mBrushIcons;
     50     private static int sIconDim = 120;
     51     private int mSelectedColorButton;
     52     private int mSelectedStyleButton;
     53     private FilterDrawRepresentation mRep;
     54     private Button[] mColorButton;
     55     private ImageButton[] mStyleButton;
     56     private ColorHueView mHueView;
     57     private ColorSVRectView mSatValView;
     58     private ColorOpacityView mOpacityView;
     59     private ColorCompareView mColorCompareView;
     60     private TextView mDrawSizeValue;
     61 
     62     private int[] mBasColors;
     63     private int mSelected;
     64     private int mTransparent;
     65     private SeekBar mdrawSizeSeekBar;
     66     private int[] ids = {
     67             R.id.draw_color_button01,
     68             R.id.draw_color_button02,
     69             R.id.draw_color_button03,
     70             R.id.draw_color_button04,
     71             R.id.draw_color_button05,
     72     };
     73 
     74     public void setDrawRepresentation(FilterDrawRepresentation rep) {
     75         mRep = rep;
     76         BasicParameterInt size;
     77         size = (BasicParameterInt) mRep.getParam(FilterDrawRepresentation.PARAM_SIZE);
     78         mdrawSizeSeekBar.setMax(size.getMaximum() - size.getMinimum());
     79         mdrawSizeSeekBar.setProgress(size.getValue());
     80 
     81         ParameterColor color;
     82         color = (ParameterColor) mRep.getParam(FilterDrawRepresentation.PARAM_COLOR);
     83         color.setValue(mBasColors[mSelectedColorButton]);
     84         BasicParameterStyle style;
     85         style = (BasicParameterStyle) mRep.getParam(FilterDrawRepresentation.PARAM_STYLE);
     86         style.setSelected(mSelectedStyleButton);
     87     }
     88 
     89     public EditorDrawTabletUI(EditorDraw editorDraw, Context context, LinearLayout lp) {
     90         mEditorDraw = editorDraw;
     91         mBasColors = editorDraw.mBasColors;
     92         mBrushIcons = editorDraw.brushIcons;
     93         Resources res = context.getResources();
     94         sIconDim = res.getDimensionPixelSize(R.dimen.draw_style_icon_dim);
     95         LinearLayout buttonContainer = (LinearLayout) lp.findViewById(R.id.listStyles);
     96 
     97         mdrawSizeSeekBar = (SeekBar) lp.findViewById(R.id.drawSizeSeekBar);
     98         mDrawSizeValue = (TextView) lp.findViewById(R.id.drawSizeValue);
     99 
    100         Button clearButton = (Button) lp.findViewById(R.id.clearButton);
    101         clearButton.setOnClickListener(new View.OnClickListener() {
    102             @Override
    103             public void onClick(View view) {
    104                 mEditorDraw.clearDrawing();
    105             }
    106         });
    107 
    108         mdrawSizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    109 
    110             @Override
    111             public void onStopTrackingTouch(SeekBar seekBar) {
    112             }
    113 
    114             @Override
    115             public void onStartTrackingTouch(SeekBar seekBar) {
    116             }
    117 
    118             @Override
    119             public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    120                 BasicParameterInt size;
    121                 size = (BasicParameterInt) mRep.getParam(FilterDrawRepresentation.PARAM_SIZE);
    122                 size.setValue(progress + size.getMinimum());
    123                 mEditorDraw.commitLocalRepresentation();
    124                 int val  = progress + size.getMinimum();
    125                 mDrawSizeValue.setText(((val>0)?"+":"")+val);
    126             }
    127         });
    128 
    129         ActionBar.LayoutParams params = new ActionBar.LayoutParams(sIconDim, sIconDim);
    130         mStyleButton = new ImageButton[mBrushIcons.length];
    131         for (int i = 0; i < mBrushIcons.length; i++) {
    132             final ImageButton button = new ImageButton(context);
    133             mStyleButton[i] = button;
    134             button.setScaleType(ImageView.ScaleType.CENTER_CROP);
    135             button.setLayoutParams(params);
    136             Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), mBrushIcons[i]);
    137             button.setImageBitmap(bitmap);
    138             button.setBackgroundResource(android.R.color.transparent);
    139             buttonContainer.addView(button);
    140             final int current = i;
    141             button.setOnClickListener(new View.OnClickListener() {
    142                 @Override
    143                 public void onClick(View view) {
    144                     mSelectedStyleButton = current;
    145                     if (mRep == null) {
    146                         return;
    147                     }
    148                     BasicParameterStyle style = (BasicParameterStyle)
    149                             mRep.getParam(FilterDrawRepresentation.PARAM_STYLE);
    150                     style.setSelected(current);
    151                     resetStyle();
    152                     mEditorDraw.commitLocalRepresentation();
    153                 }
    154             });
    155         }
    156 
    157         final LinearLayout ctls = (LinearLayout) lp.findViewById(R.id.controls);
    158         final LinearLayout pick = (LinearLayout) lp.findViewById(R.id.colorPicker);
    159         Button b = (Button) lp.findViewById(R.id.draw_color_popupbutton);
    160         b.setOnClickListener(new View.OnClickListener() {
    161             @Override
    162             public void onClick(View view) {
    163                 boolean b = ctls.getVisibility() == View.VISIBLE;
    164                 ctls.setVisibility((b) ? View.GONE : View.VISIBLE);
    165                 pick.setVisibility((!b) ? View.GONE : View.VISIBLE);
    166             }
    167         }
    168         );
    169 
    170         mTransparent = res.getColor(R.color.color_chooser_unslected_border);
    171         mSelected = res.getColor(R.color.color_chooser_slected_border);
    172 
    173         mColorButton = new Button[ids.length];
    174         for (int i = 0; i < ids.length; i++) {
    175             mColorButton[i] = (Button) lp.findViewById(ids[i]);
    176 
    177             float[] hsvo = new float[4];
    178             Color.colorToHSV(mBasColors[i], hsvo);
    179             hsvo[3] = (0xFF & (mBasColors[i] >> 24)) / (float) 255;
    180             mColorButton[i].setTag(hsvo);
    181             GradientDrawable sd = ((GradientDrawable) mColorButton[i].getBackground());
    182 
    183             sd.setColor(mBasColors[i]);
    184             sd.setStroke(3, (0 == i) ? mSelected : mTransparent);
    185 
    186             final int buttonNo = i;
    187             mColorButton[i].setOnClickListener(new View.OnClickListener() {
    188                 @Override
    189                 public void onClick(View arg0) {
    190 
    191                     mSelectedColorButton = buttonNo;
    192                     float[] hsvo = Arrays.copyOf((float[]) mColorButton[buttonNo].getTag(), 4);
    193                     resetBorders();
    194                     if (mRep == null) {
    195                         return;
    196                     }
    197                     ParameterColor pram;
    198                     pram = (ParameterColor) mRep.getParam(FilterDrawRepresentation.PARAM_COLOR);
    199                     pram.setValue(mBasColors[mSelectedColorButton]);
    200                     mEditorDraw.commitLocalRepresentation();
    201                     mHueView.setColor(hsvo);
    202                     mSatValView.setColor(hsvo);
    203                     mOpacityView.setColor(hsvo);
    204                     mColorCompareView.setColor(hsvo);
    205                     mColorCompareView.setOrigColor(hsvo);
    206                 }
    207             });
    208         }
    209 
    210         mHueView = (ColorHueView) lp.findViewById(R.id.ColorHueView);
    211         mSatValView = (ColorSVRectView) lp.findViewById(R.id.colorRectView);
    212         mOpacityView = (ColorOpacityView) lp.findViewById(R.id.colorOpacityView);
    213         mColorCompareView = (ColorCompareView) lp.findViewById(R.id.btnSelect);
    214 
    215         float[] hsvo = new float[4];
    216         Color.colorToHSV(mBasColors[0], hsvo);
    217         hsvo[3] = (0xFF & (mBasColors[0] >> 24)) / (float) 255;
    218 
    219         mColorCompareView.setOrigColor(hsvo);
    220         ColorListener[] colorViews = {mHueView, mSatValView, mOpacityView, mColorCompareView};
    221         for (int i = 0; i < colorViews.length; i++) {
    222             colorViews[i].setColor(hsvo);
    223 
    224             for (int j = 0; j < colorViews.length; j++) {
    225                 if (i == j) {
    226                     continue;
    227                 }
    228                 colorViews[i].addColorListener(colorViews[j]);
    229             }
    230         }
    231         ColorListener colorListener = new ColorListener() {
    232 
    233             @Override
    234             public void setColor(float[] hsvo) {
    235                 int color = Color.HSVToColor((int) (hsvo[3] * 255), hsvo);
    236                 Button b = mColorButton[mSelectedColorButton];
    237                 float[] f = (float[]) b.getTag();
    238                 System.arraycopy(hsvo, 0, f, 0, 4);
    239                 mBasColors[mSelectedColorButton] = color;
    240                 GradientDrawable sd = ((GradientDrawable) b.getBackground());
    241                 sd.setColor(color);
    242                 resetBorders();
    243                 ParameterColor pram;
    244                 pram = (ParameterColor) mRep.getParam(FilterDrawRepresentation.PARAM_COLOR);
    245                 pram.setValue(color);
    246                 mEditorDraw.commitLocalRepresentation();
    247             }
    248 
    249             @Override
    250             public void addColorListener(ColorListener l) {
    251             }
    252         };
    253 
    254         for (int i = 0; i < colorViews.length; i++) {
    255             colorViews[i].addColorListener(colorListener);
    256         }
    257 
    258     }
    259 
    260     public void resetStyle() {
    261         for (int i = 0; i < mStyleButton.length; i++) {
    262             int rid = (i == mSelectedStyleButton) ? android.R.color.holo_blue_light :
    263                     android.R.color.transparent;
    264             mStyleButton[i].setBackgroundResource(rid);
    265 
    266         }
    267     }
    268 
    269     private void resetBorders() {
    270         for (int i = 0; i < ids.length; i++) {
    271             final Button button = mColorButton[i];
    272 
    273             GradientDrawable sd = ((GradientDrawable) button.getBackground());
    274             sd.setColor(mBasColors[i]);
    275             sd.setStroke(3, (mSelectedColorButton == i) ? mSelected : mTransparent);
    276         }
    277     }
    278 }
    279