OSDN Git Service

am 1a266f16: Highlight selected option in FX and Borders
authorMichael Kolb <kolby@google.com>
Fri, 17 May 2013 22:37:24 +0000 (15:37 -0700)
committerAndroid Git Automerger <android-git-automerger@android.com>
Fri, 17 May 2013 22:37:24 +0000 (15:37 -0700)
* commit '1a266f16edbef7cb0a770d37fcad958fc55a5862':
  Highlight selected option in FX and Borders

res/values/filtershow_color.xml
src/com/android/gallery3d/filtershow/category/CategoryAdapter.java
src/com/android/gallery3d/filtershow/category/CategoryPanel.java
src/com/android/gallery3d/filtershow/category/CategoryView.java
src/com/android/gallery3d/filtershow/category/MainPanel.java
src/com/android/gallery3d/filtershow/ui/FilterIconButton.java
src/com/android/gallery3d/filtershow/ui/SelectionRenderer.java [new file with mode: 0644]

index f6bf7fb..927bfa2 100644 (file)
@@ -37,4 +37,5 @@
     <color name="filtershow_stateview_selected_text">#000000</color>
     <color name="filtershow_categoryview_background">#1a1a1a</color>
     <color name="filtershow_categoryview_text">#a7a7a7</color>
+    <color name="filtershow_category_selection">#ffffffff</color>
 </resources>
\ No newline at end of file
index e310b2f..0a65cd9 100644 (file)
@@ -21,24 +21,25 @@ import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.AbsListView;
 import android.widget.ArrayAdapter;
-import android.widget.LinearLayout;
 import android.widget.ListView;
+
 import com.android.gallery3d.R;
 import com.android.gallery3d.filtershow.filters.FilterRepresentation;
-import com.android.gallery3d.filtershow.filters.FilterTinyPlanetRepresentation;
-import com.android.gallery3d.filtershow.filters.ImageFilter;
 import com.android.gallery3d.filtershow.filters.ImageFilterTinyPlanet;
+import com.android.gallery3d.filtershow.imageshow.MasterImage;
+import com.android.gallery3d.filtershow.presets.ImagePreset;
 import com.android.gallery3d.filtershow.ui.FilterIconButton;
 
 public class CategoryAdapter extends ArrayAdapter<Action> {
 
     private static final String LOGTAG = "CategoryAdapter";
     private int mItemHeight = 200;
-    private ListView mContainer;
+    private View mContainer;
     private int mItemWidth = ListView.LayoutParams.MATCH_PARENT;
     private boolean mUseFilterIconButton = false;
+    private int mSelectedPosition;
+    int mCategory;
 
     public CategoryAdapter(Context context, int textViewResourceId) {
         super(context, textViewResourceId);
@@ -62,6 +63,22 @@ public class CategoryAdapter extends ArrayAdapter<Action> {
         action.setAdapter(this);
     }
 
+    public void initializeSelection(int category) {
+        mCategory = category;
+        if (category == MainPanel.LOOKS || category == MainPanel.BORDERS) {
+            ImagePreset preset = MasterImage.getImage().getPreset();
+            if (preset != null) {
+                for (int i = 0; i < getCount(); i++) {
+                    if (preset.historyName().equals(getItem(i).getRepresentation().getName())) {
+                        mSelectedPosition = i;
+                    }
+                }
+            }
+        } else {
+            mSelectedPosition = -1;
+        }
+    }
+
     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
         if (mUseFilterIconButton) {
@@ -73,27 +90,55 @@ public class CategoryAdapter extends ArrayAdapter<Action> {
             FilterIconButton view = (FilterIconButton) convertView;
             Action action = getItem(position);
             view.setAction(action);
-            view.setup(action.getName(), null);
+            view.setup(action.getName(), null, this);
             view.setLayoutParams(
                     new ListView.LayoutParams(mItemWidth, mItemHeight));
+            view.setTag(position);
+            if (mCategory == MainPanel.LOOKS || mCategory == MainPanel.BORDERS) {
+                view.setBackground(null);
+            }
             return view;
         }
         if (convertView == null) {
             convertView = new CategoryView(getContext());
         }
         CategoryView view = (CategoryView) convertView;
-        view.setAction(getItem(position));
+        view.setAction(getItem(position), this);
         view.setLayoutParams(
                 new ListView.LayoutParams(mItemWidth, mItemHeight));
+        view.setTag(position);
         return view;
     }
 
-    public void setContainer(ListView container) {
-        mContainer = container;
+    public void setSelected(View v) {
+        int old = mSelectedPosition;
+        mSelectedPosition = (Integer) v.getTag();
+        if (old != -1) {
+            invalidateView(old);
+        }
+        invalidateView(mSelectedPosition);
     }
 
-    public ListView getContainer() {
-        return mContainer;
+    public boolean isSelected(View v) {
+        return (Integer) v.getTag() == mSelectedPosition;
+    }
+
+    private void invalidateView(int position) {
+        View child = null;
+        if (mContainer instanceof ListView) {
+            ListView lv = (ListView) mContainer;
+            child = lv.getChildAt(position - lv.getFirstVisiblePosition());
+        } else {
+            CategoryTrack ct = (CategoryTrack) mContainer;
+            child = ct.getChildAt(position);
+        }
+        if (child != null) {
+            child.invalidate();
+        }
+    }
+
+    public void setContainer(View container) {
+        mContainer = container;
     }
 
     public void imageLoaded() {
index 9ddfcab..abae80f 100644 (file)
@@ -50,18 +50,22 @@ public class CategoryPanel extends Fragment {
         switch (adapter) {
             case MainPanel.LOOKS: {
                 mAdapter = activity.getCategoryLooksAdapter();
+                mAdapter.initializeSelection(MainPanel.LOOKS);
                 break;
             }
             case MainPanel.BORDERS: {
                 mAdapter = activity.getCategoryBordersAdapter();
+                mAdapter.initializeSelection(MainPanel.BORDERS);
                 break;
             }
             case MainPanel.GEOMETRY: {
                 mAdapter = activity.getCategoryGeometryAdapter();
+                mAdapter.initializeSelection(MainPanel.GEOMETRY);
                 break;
             }
             case MainPanel.FILTERS: {
                 mAdapter = activity.getCategoryFiltersAdapter();
+                mAdapter.initializeSelection(MainPanel.FILTERS);
                 break;
             }
         }
@@ -90,6 +94,7 @@ public class CategoryPanel extends Fragment {
             CategoryTrack panel = (CategoryTrack) panelView;
             mAdapter.setUseFilterIconButton(true);
             panel.setAdapter(mAdapter);
+            mAdapter.setContainer(panel);
         } else {
             ListView panel = (ListView) main.findViewById(R.id.listItems);
             panel.setAdapter(mAdapter);
index c101f98..84a973b 100644 (file)
@@ -29,6 +29,7 @@ import android.view.View;
 import com.android.gallery3d.R;
 import com.android.gallery3d.filtershow.FilterShowActivity;
 import com.android.gallery3d.filtershow.filters.FilterRepresentation;
+import com.android.gallery3d.filtershow.ui.SelectionRenderer;
 
 public class CategoryView extends View implements View.OnClickListener {
 
@@ -40,6 +41,9 @@ public class CategoryView extends View implements View.OnClickListener {
     private static int sTextSize = 32;
     private int mTextColor;
     private int mBackgroundColor;
+    private Paint mSelectPaint;
+    CategoryAdapter mAdapter;
+    private int mSelectionStroke;
 
     public static void setTextSize(int size) {
         sTextSize = size;
@@ -55,6 +59,10 @@ public class CategoryView extends View implements View.OnClickListener {
         Resources res = getResources();
         mBackgroundColor = res.getColor(R.color.filtershow_categoryview_background);
         mTextColor = res.getColor(R.color.filtershow_categoryview_text);
+        mSelectionStroke = res.getDimensionPixelSize(R.dimen.thumbnail_margin);
+        mSelectPaint = new Paint();
+        mSelectPaint.setStyle(Paint.Style.FILL);
+        mSelectPaint.setColor(res.getColor(R.color.filtershow_category_selection));
     }
 
     public void drawText(Canvas canvas, String text) {
@@ -71,6 +79,7 @@ public class CategoryView extends View implements View.OnClickListener {
         canvas.drawText(text, x, y, mPaint);
     }
 
+    @Override
     public void onDraw(Canvas canvas) {
         canvas.drawColor(mBackgroundColor);
         if (mAction != null) {
@@ -81,6 +90,10 @@ public class CategoryView extends View implements View.OnClickListener {
             } else {
                 Bitmap bitmap = mAction.getImage();
                 canvas.drawBitmap(bitmap, 0, 0, mPaint);
+                if (mAdapter.isSelected(this)) {
+                    SelectionRenderer.drawSelection(canvas, 0, 0, bitmap.getWidth(),
+                            bitmap.getHeight(), mSelectionStroke, mSelectPaint);
+                }
             }
             mPaint.setColor(mBackgroundColor);
             mPaint.setStyle(Paint.Style.STROKE);
@@ -93,8 +106,9 @@ public class CategoryView extends View implements View.OnClickListener {
         }
     }
 
-    public void setAction(Action action) {
+    public void setAction(Action action, CategoryAdapter adapter) {
         mAction = action;
+        mAdapter = adapter;
         invalidate();
     }
 
@@ -106,5 +120,6 @@ public class CategoryView extends View implements View.OnClickListener {
     public void onClick(View view) {
         FilterShowActivity activity = (FilterShowActivity) getContext();
         activity.showRepresentation(mAction.getRepresentation());
+        mAdapter.setSelected(this);
     }
 }
index 7cadbc3..9a64ffb 100644 (file)
@@ -24,6 +24,7 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ImageButton;
 import android.widget.LinearLayout;
+
 import com.android.gallery3d.R;
 import com.android.gallery3d.filtershow.FilterShowActivity;
 import com.android.gallery3d.filtershow.state.StatePanel;
index c3c8769..96126c5 100644 (file)
 package com.android.gallery3d.filtershow.ui;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Rect;
 import android.graphics.RectF;
+import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.LinearLayout;
 
+import com.android.gallery3d.R;
 import com.android.gallery3d.filtershow.FilterShowActivity;
 import com.android.gallery3d.filtershow.cache.RenderingRequest;
 import com.android.gallery3d.filtershow.cache.RenderingRequestCaller;
 import com.android.gallery3d.filtershow.category.Action;
+import com.android.gallery3d.filtershow.category.CategoryAdapter;
 import com.android.gallery3d.filtershow.filters.FilterRepresentation;
 import com.android.gallery3d.filtershow.imageshow.GeometryListener;
 import com.android.gallery3d.filtershow.imageshow.GeometryMetadata;
@@ -45,6 +52,9 @@ public class FilterIconButton extends IconButton implements View.OnClickListener
     private FilterRepresentation mFilterRepresentation = null;
     private Bitmap mIconBitmap = null;
     private Action mAction;
+    private Paint mSelectPaint;
+    private int mSelectStroke;
+    private CategoryAdapter mAdapter;
     public FilterIconButton(Context context) {
         super(context);
     }
@@ -57,11 +67,17 @@ public class FilterIconButton extends IconButton implements View.OnClickListener
         super(context, attrs, defStyle);
     }
 
-    public void setup(String text, LinearLayout parent) {
+    public void setup(String text, LinearLayout parent, CategoryAdapter adapter) {
+        mAdapter = adapter;
         setText(text);
         setContentDescription(text);
         super.setOnClickListener(this);
+        Resources res = getContext().getResources();
         MasterImage.getImage().addGeometryListener(this);
+        mSelectStroke = res.getDimensionPixelSize(R.dimen.thumbnail_margin);
+        mSelectPaint = new Paint();
+        mSelectPaint.setStyle(Paint.Style.FILL);
+        mSelectPaint.setColor(res.getColor(R.color.filtershow_category_selection));
         invalidate();
     }
 
@@ -69,6 +85,7 @@ public class FilterIconButton extends IconButton implements View.OnClickListener
     public void onClick(View v) {
         FilterShowActivity activity = (FilterShowActivity) getContext();
         activity.showRepresentation(mFilterRepresentation);
+        mAdapter.setSelected(v);
     }
 
     public FilterRepresentation getFilterRepresentation() {
@@ -113,6 +130,20 @@ public class FilterIconButton extends IconButton implements View.OnClickListener
         } else {
             super.onDraw(canvas);
         }
+        if (mAdapter.isSelected(this)) {
+            Drawable iconDrawable = getCompoundDrawables()[1];
+            if (iconDrawable != null) {
+                canvas.save();
+                int padding = getCompoundDrawablePadding();
+                canvas.translate(getScrollX() + padding + getPaddingLeft() - mSelectStroke - 1,
+                        getScrollY() + padding + getPaddingTop() - mSelectStroke - 1);
+                Rect r = iconDrawable.getBounds();
+                SelectionRenderer.drawSelection(canvas, r.left, r.top,
+                        r.right + 2 * mSelectStroke + 2, r.bottom + 2 * mSelectStroke + 2,
+                        mSelectStroke, mSelectPaint);
+                canvas.restore();
+            }
+        }
     }
 
     @Override
diff --git a/src/com/android/gallery3d/filtershow/ui/SelectionRenderer.java b/src/com/android/gallery3d/filtershow/ui/SelectionRenderer.java
new file mode 100644 (file)
index 0000000..1b108bd
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2013 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.filtershow.ui;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+public class SelectionRenderer {
+
+    public static void drawSelection(Canvas canvas, int left, int top, int right, int bottom,
+            int stroke, Paint paint) {
+        canvas.drawRect(left, top, right, top + stroke, paint);
+        canvas.drawRect(left, bottom - stroke, right, bottom, paint);
+        canvas.drawRect(left, top, left + stroke, bottom, paint);
+        canvas.drawRect(right - stroke, top, right, bottom, paint);
+    }
+
+}