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