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.LayoutInflater; 27 import android.view.Menu; 28 import android.view.MenuItem; 29 import android.view.View; 30 import android.view.View.OnClickListener; 31 import android.view.ViewGroup; 32 import android.widget.Button; 33 import android.widget.FrameLayout; 34 import android.widget.ImageButton; 35 import android.widget.ImageView; 36 import android.widget.LinearLayout; 37 import android.widget.PopupMenu; 38 import android.widget.SeekBar; 39 40 import com.android.gallery3d.R; 41 import com.android.gallery3d.filtershow.FilterShowActivity; 42 import com.android.gallery3d.filtershow.colorpicker.ColorHueView; 43 import com.android.gallery3d.filtershow.colorpicker.ColorListener; 44 import com.android.gallery3d.filtershow.colorpicker.ColorOpacityView; 45 import com.android.gallery3d.filtershow.colorpicker.ColorSVRectView; 46 import com.android.gallery3d.filtershow.controller.BitmapCaller; 47 import com.android.gallery3d.filtershow.controller.ColorChooser; 48 import com.android.gallery3d.filtershow.controller.FilterView; 49 import com.android.gallery3d.filtershow.controller.ParameterColor; 50 import com.android.gallery3d.filtershow.filters.FilterDrawRepresentation; 51 import com.android.gallery3d.filtershow.filters.FilterRepresentation; 52 import com.android.gallery3d.filtershow.filters.ImageFilterDraw; 53 import com.android.gallery3d.filtershow.imageshow.ImageDraw; 54 55 public class EditorDraw extends ParametricEditor implements FilterView { 56 private static final String LOGTAG = "EditorDraw"; 57 public static final int ID = R.id.editorDraw; 58 public ImageDraw mImageDraw; 59 private static final int MODE_SIZE = FilterDrawRepresentation.PARAM_SIZE; 60 private static final int MODE_SIZEE = FilterDrawRepresentation.PARAM_SIZE; 61 private static final int MODE_STYLE = FilterDrawRepresentation.PARAM_STYLE; 62 private static final int MODE_COLOR = FilterDrawRepresentation.PARAM_COLOR; 63 int[] brushIcons = { 64 R.drawable.brush_flat, 65 R.drawable.brush_round, 66 R.drawable.brush_gauss, 67 R.drawable.brush_marker, 68 R.drawable.brush_spatter 69 }; 70 71 int[] mBasColors = { 72 FilterDrawRepresentation.DEFAULT_MENU_COLOR1, 73 FilterDrawRepresentation.DEFAULT_MENU_COLOR2, 74 FilterDrawRepresentation.DEFAULT_MENU_COLOR3, 75 FilterDrawRepresentation.DEFAULT_MENU_COLOR4, 76 FilterDrawRepresentation.DEFAULT_MENU_COLOR5, 77 }; 78 private EditorDrawTabletUI mTabletUI; 79 private String mParameterString; 80 private int mSelectedColorButton; 81 private String mDrawString = null; 82 83 public EditorDraw() { 84 super(ID); 85 } 86 87 @Override 88 public String calculateUserMessage(Context context, String effectName, Object parameterValue) { 89 FilterDrawRepresentation rep = getDrawRep(); 90 if (mDrawString != null) { 91 mImageDraw.displayDrawLook(); 92 return mDrawString; 93 } 94 if (rep == null) { 95 return ""; 96 } 97 if (!ParametricEditor.useCompact(mContext)) { 98 99 } 100 if (mParameterString == null) { 101 mParameterString = ""; 102 } 103 String paramString; 104 String val = rep.getValueString(); 105 106 mImageDraw.displayDrawLook(); 107 return mParameterString + val; 108 } 109 110 @Override 111 public void createEditor(Context context, FrameLayout frameLayout) { 112 mView = mImageShow = mImageDraw = new ImageDraw(context); 113 super.createEditor(context, frameLayout); 114 mImageDraw.setEditor(this); 115 116 } 117 118 @Override 119 public void reflectCurrentFilter() { 120 super.reflectCurrentFilter(); 121 FilterRepresentation rep = getLocalRepresentation(); 122 if (rep != null && getLocalRepresentation() instanceof FilterDrawRepresentation) { 123 FilterDrawRepresentation drawRep = (FilterDrawRepresentation) getLocalRepresentation(); 124 mImageDraw.setFilterDrawRepresentation(drawRep); 125 if (!ParametricEditor.useCompact(mContext)) { 126 if (mTabletUI != null) { 127 128 mTabletUI.setDrawRepresentation(drawRep); 129 } 130 return; 131 } 132 133 drawRep.getParam(FilterDrawRepresentation.PARAM_STYLE).setFilterView(this); 134 drawRep.setPramMode(FilterDrawRepresentation.PARAM_COLOR); 135 mParameterString = mContext.getString(R.string.draw_color); 136 control(drawRep.getCurrentParam(), mEditControl); 137 } 138 } 139 140 @Override 141 public void openUtilityPanel(final LinearLayout accessoryViewList) { 142 Button view = (Button) accessoryViewList.findViewById(R.id.applyEffect); 143 144 view.setText(mContext.getString(R.string.draw_color)); 145 view.setOnClickListener(new OnClickListener() { 146 147 @Override 148 public void onClick(View arg0) { 149 showPopupMenu(accessoryViewList); 150 } 151 }); 152 153 } 154 155 @Override 156 public boolean showsSeekBar() { 157 return false; 158 } 159 160 private void showPopupMenu(LinearLayout accessoryViewList) { 161 final Button button = (Button) accessoryViewList.findViewById( 162 R.id.applyEffect); 163 if (button == null) { 164 return; 165 } 166 final PopupMenu popupMenu = new PopupMenu(mImageShow.getActivity(), button); 167 popupMenu.getMenuInflater().inflate(R.menu.filtershow_menu_draw, popupMenu.getMenu()); 168 if (!ParametricEditor.useCompact(mContext)) { 169 Menu menu = popupMenu.getMenu(); 170 int count = menu.size(); 171 for (int i = 0; i < count; i++) { 172 MenuItem item = menu.getItem(i); 173 if (item.getItemId() != R.id.draw_menu_clear) { 174 item.setVisible(false); 175 } 176 } 177 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 178 179 @Override 180 public boolean onMenuItemClick(MenuItem item) { 181 clearDrawing(); 182 return true; 183 } 184 }); 185 } else { 186 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 187 188 @Override 189 public boolean onMenuItemClick(MenuItem item) { 190 selectMenuItem(item); 191 return true; 192 } 193 }); 194 } 195 popupMenu.show(); 196 ((FilterShowActivity)mContext).onShowMenu(popupMenu); 197 } 198 199 protected void selectMenuItem(MenuItem item) { 200 ImageFilterDraw filter = (ImageFilterDraw) mImageShow.getCurrentFilter(); 201 FilterDrawRepresentation rep = getDrawRep(); 202 if (rep == null) { 203 return; 204 } 205 206 switch (item.getItemId()) { 207 case R.id.draw_menu_clear: 208 clearDrawing(); 209 break; 210 case R.id.draw_menu_size: 211 rep.setPramMode(FilterDrawRepresentation.PARAM_SIZE); 212 break; 213 case R.id.draw_menu_style: 214 rep.setPramMode(FilterDrawRepresentation.PARAM_STYLE); 215 break; 216 case R.id.draw_menu_color: 217 rep.setPramMode(FilterDrawRepresentation.PARAM_COLOR); 218 break; 219 } 220 if (item.getItemId() != R.id.draw_menu_clear) { 221 mParameterString = item.getTitle().toString(); 222 updateText(); 223 } 224 if (mControl instanceof ColorChooser) { 225 ColorChooser c = (ColorChooser) mControl; 226 mBasColors = c.getColorSet(); 227 } 228 control(rep.getCurrentParam(), mEditControl); 229 if (mControl instanceof ColorChooser) { 230 ColorChooser c = (ColorChooser) mControl; 231 c.setColorSet(mBasColors); 232 } 233 mControl.updateUI(); 234 mView.invalidate(); 235 } 236 237 public void clearDrawing(){ 238 ImageDraw idraw = (ImageDraw) mImageShow; 239 idraw.resetParameter(); 240 commitLocalRepresentation(); 241 } 242 243 @Override 244 public void setUtilityPanelUI(View actionButton, View editControl) { 245 if (ParametricEditor.useCompact(mContext)) { 246 super.setUtilityPanelUI(actionButton, editControl); 247 return; 248 } 249 250 mSeekBar = (SeekBar) editControl.findViewById(R.id.primarySeekBar); 251 if (mSeekBar != null) { 252 mSeekBar.setVisibility(View.GONE); 253 } 254 LayoutInflater inflater = 255 (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 256 LinearLayout lp = (LinearLayout) inflater.inflate( 257 R.layout.filtershow_draw_ui, (ViewGroup) editControl, true); 258 259 mTabletUI = new EditorDrawTabletUI(this, mContext, lp); 260 mDrawString = mContext.getResources().getString(R.string.imageDraw).toUpperCase(); 261 setMenuIcon(true); 262 263 } 264 265 FilterDrawRepresentation getDrawRep() { 266 FilterRepresentation rep = getLocalRepresentation(); 267 if (rep instanceof FilterDrawRepresentation) { 268 return (FilterDrawRepresentation) rep; 269 } 270 return null; 271 } 272 273 @Override 274 public void computeIcon(int index, BitmapCaller caller) { 275 Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), brushIcons[index]); 276 caller.available(bitmap); 277 } 278 279 public int getBrushIcon(int type) { 280 return brushIcons[type]; 281 } 282 283 } 284