[aseprite] 04/250: Improve FilterTargetButtons UI style using a ButtonSet

Tobias Hansen thansen at moszumanska.debian.org
Sun Dec 20 15:26:57 UTC 2015


This is an automated email from the git hooks/post-receive script.

thansen pushed a commit to branch master
in repository aseprite.

commit 5c371285ab42482429f31bdd6913a283b0310f48
Author: David Capello <davidcapello at gmail.com>
Date:   Fri Aug 28 14:37:00 2015 -0300

    Improve FilterTargetButtons UI style using a ButtonSet
    
    Related to #786
---
 data/skins/default/sheet.png                       | Bin 13684 -> 13592 bytes
 data/skins/default/skin.xml                        |   4 -
 src/app/commands/filters/filter_target_buttons.cpp | 194 +++++++--------------
 src/app/commands/filters/filter_target_buttons.h   |  17 +-
 src/app/ui/button_set.cpp                          |  43 +++--
 src/app/ui/button_set.h                            |   8 +-
 6 files changed, 107 insertions(+), 159 deletions(-)

diff --git a/data/skins/default/sheet.png b/data/skins/default/sheet.png
index 1739278..207b22b 100644
Binary files a/data/skins/default/sheet.png and b/data/skins/default/sheet.png differ
diff --git a/data/skins/default/skin.xml b/data/skins/default/skin.xml
index 977de53..887efad 100644
--- a/data/skins/default/skin.xml
+++ b/data/skins/default/skin.xml
@@ -274,13 +274,9 @@
     <part id="pal_options"                      x="168" y="200" w="5" h="5" />
     <part id="pal_resize"                       x="176" y="200" w="5" h="5" />
     <part id="target_one"                       x="144" y="224" w="32" h="16" />
-    <part id="target_one_selected"              x="144" y="240" w="32" h="16" />
     <part id="target_frames"                    x="176" y="224" w="32" h="16" />
-    <part id="target_frames_selected"           x="176" y="240" w="32" h="16" />
     <part id="target_layers"                    x="208" y="224" w="32" h="16" />
-    <part id="target_layers_selected"           x="208" y="240" w="32" h="16" />
     <part id="target_frames_layers"             x="240" y="224" w="32" h="16" />
-    <part id="target_frames_layers_selected"    x="240" y="240" w="32" h="16" />
     <part id="brush_circle"                     x="144" y="144" w="7" h="8" />
     <part id="brush_circle_selected"            x="144" y="152" w="7" h="8" />
     <part id="brush_square"                     x="160" y="144" w="7" h="8" />
diff --git a/src/app/commands/filters/filter_target_buttons.cpp b/src/app/commands/filters/filter_target_buttons.cpp
index e533341..e649870 100644
--- a/src/app/commands/filters/filter_target_buttons.cpp
+++ b/src/app/commands/filters/filter_target_buttons.cpp
@@ -31,158 +31,104 @@ using namespace filters;
 using namespace ui;
 
 FilterTargetButtons::FilterTargetButtons(int imgtype, bool withChannels)
-  : Box(VERTICAL)
+  : ButtonSet(4)
   , m_target(0)
+  , m_red(nullptr)
+  , m_green(nullptr)
+  , m_blue(nullptr)
+  , m_alpha(nullptr)
+  , m_gray(nullptr)
+  , m_index(nullptr)
+  , m_cels(nullptr)
 {
-#define ADD(box, widget, hook)                                          \
-  if (widget) {                                                         \
-    widget->setBorder(gfx::Border(2 * guiscale()));                    \
-    box->addChild(widget);                                              \
-    widget->Click.connect(Bind<void>(&FilterTargetButtons::hook, this, widget)); \
-  }
-
-  Box* hbox;
-  CheckBox* r = NULL;
-  CheckBox* g = NULL;
-  CheckBox* b = NULL;
-  CheckBox* k = NULL;
-  CheckBox* a = NULL;
-  CheckBox* index = NULL;
-  Button* images = NULL;
-
-  hbox = new Box(HORIZONTAL | HOMOGENEOUS);
-
-  this->noBorderNoChildSpacing();
-  hbox->noBorderNoChildSpacing();
+  setMultipleSelection(true);
 
   if (withChannels) {
     switch (imgtype) {
 
       case IMAGE_RGB:
       case IMAGE_INDEXED:
-        r = check_button_new("R", 2, 0, 0, 0);
-        g = check_button_new("G", 0, 0, 0, 0);
-        b = check_button_new("B", 0, 0, 0, 0);
-        a = check_button_new("A", 0, 2, 0, 0);
-
-        r->setId("r");
-        g->setId("g");
-        b->setId("b");
-        a->setId("a");
+        m_red   = addItem("R");
+        m_green = addItem("G");
+        m_blue  = addItem("B");
+        m_alpha = addItem("A");
 
         if (imgtype == IMAGE_INDEXED) {
-          index = check_button_new("Index", 0, 0, 0, 0);
-          index->setId("i");
+          m_index = addItem("Index", 4, 1);
         }
         break;
 
       case IMAGE_GRAYSCALE:
-        k = check_button_new("K", 2, 0, 0, 0);
-        a = check_button_new("A", 0, 2, 0, 0);
-
-        k->setId("k");
-        a->setId("a");
+        m_gray = addItem("K", 2, 1);
+        m_alpha = addItem("A", 2, 1);
         break;
     }
   }
 
-  // Create the button to select "image" target
-  images = new Button("");
-  setup_bevels(images,
-               withChannels ? 0: 2,
-               withChannels ? 0: 2, 2, 2);
-  setup_mini_look(images);
-
-  images->setIconInterface(
-    new ButtonIconImpl(getTargetNormalIcon(),
-                       getTargetSelectedIcon(),
-                       SkinPartPtr(nullptr),
-                       CENTER | MIDDLE));
-
-  // Make hierarchy
-  ADD(hbox, r, onChannelChange);
-  ADD(hbox, g, onChannelChange);
-  ADD(hbox, b, onChannelChange);
-  ADD(hbox, k, onChannelChange);
-  ADD(hbox, a, onChannelChange);
-
-  if (withChannels)
-    addChild(hbox);
-  else
-    delete hbox;
-
-  ADD(this, index, onChannelChange);
-  ADD(this, images, onImagesChange);
+  // Create the button to select which cels will be modified by the
+  // filter.
+  m_cels = addItem(getCelsIcon(), 4, 1);
 }
 
 void FilterTargetButtons::setTarget(int target)
 {
   m_target = target;
 
-  selectTargetButton("r", TARGET_RED_CHANNEL);
-  selectTargetButton("g", TARGET_GREEN_CHANNEL);
-  selectTargetButton("b", TARGET_BLUE_CHANNEL);
-  selectTargetButton("a", TARGET_ALPHA_CHANNEL);
-  selectTargetButton("k", TARGET_GRAY_CHANNEL);
-  selectTargetButton("i", TARGET_INDEX_CHANNEL);
-}
+  selectTargetButton(m_red,   TARGET_RED_CHANNEL);
+  selectTargetButton(m_green, TARGET_GREEN_CHANNEL);
+  selectTargetButton(m_blue,  TARGET_BLUE_CHANNEL);
+  selectTargetButton(m_alpha, TARGET_ALPHA_CHANNEL);
+  selectTargetButton(m_gray,  TARGET_GRAY_CHANNEL);
+  selectTargetButton(m_index, TARGET_INDEX_CHANNEL);
 
-void FilterTargetButtons::selectTargetButton(const char* name, int specificTarget)
-{
-  Widget* wgt = findChild(name);
-  if (wgt != NULL) {
-    wgt->setSelected((m_target & specificTarget) == specificTarget);
-  }
+  m_cels->setIcon(getCelsIcon());
 }
 
-void FilterTargetButtons::onChannelChange(ButtonBase* button)
+void FilterTargetButtons::selectTargetButton(Item* item, Target specificTarget)
 {
-  int flag = 0;
-
-  switch (button->getId()[0]) {
-    case 'r': flag = TARGET_RED_CHANNEL; break;
-    case 'g': flag = TARGET_GREEN_CHANNEL; break;
-    case 'b': flag = TARGET_BLUE_CHANNEL; break;
-    case 'k': flag = TARGET_GRAY_CHANNEL; break;
-    case 'a': flag = TARGET_ALPHA_CHANNEL; break;
-    case 'i': flag = TARGET_INDEX_CHANNEL; break;
-    default:
-      return;
-  }
-
-  if (button->isSelected())
-    m_target |= flag;
-  else
-    m_target &= ~flag;
-
-  TargetChange();
+  if (item)
+    item->setSelected((m_target & specificTarget) == specificTarget);
 }
 
-void FilterTargetButtons::onImagesChange(ButtonBase* button)
+void FilterTargetButtons::onItemChange()
 {
-  // Rotate target
-  if (m_target & TARGET_ALL_FRAMES) {
-    m_target &= ~TARGET_ALL_FRAMES;
-
-    if (m_target & TARGET_ALL_LAYERS)
-      m_target &= ~TARGET_ALL_LAYERS;
-    else
-      m_target |= TARGET_ALL_LAYERS;
-  }
-  else {
-    m_target |= TARGET_ALL_FRAMES;
+  ButtonSet::onItemChange();
+  Target flags = 0;
+
+  if (m_red && m_red->isSelected()) flags |= TARGET_RED_CHANNEL;
+  if (m_green && m_green->isSelected()) flags |= TARGET_GREEN_CHANNEL;
+  if (m_blue && m_blue->isSelected()) flags |= TARGET_BLUE_CHANNEL;
+  if (m_gray && m_gray->isSelected()) flags |= TARGET_GRAY_CHANNEL;
+  if (m_index && m_index->isSelected()) flags |= TARGET_INDEX_CHANNEL;
+  if (m_alpha && m_alpha->isSelected()) flags |= TARGET_ALPHA_CHANNEL;
+
+  if (m_cels->isSelected()) {
+    m_cels->setSelected(false);
+
+    // Rotate cels target
+    flags |= (m_target & (TARGET_ALL_FRAMES | TARGET_ALL_LAYERS));
+    if (flags & TARGET_ALL_FRAMES) {
+      flags &= ~TARGET_ALL_FRAMES;
+
+      if (flags & TARGET_ALL_LAYERS)
+        flags &= ~TARGET_ALL_LAYERS;
+      else
+        flags |= TARGET_ALL_LAYERS;
+    }
+    else {
+      flags |= TARGET_ALL_FRAMES;
+    }
   }
 
-  button->setIconInterface(
-    new ButtonIconImpl(getTargetNormalIcon(),
-                       getTargetSelectedIcon(),
-                       SkinPartPtr(nullptr),
-                       CENTER | MIDDLE));
+  if (m_target != flags) {
+    m_target = flags;
+    m_cels->setIcon(getCelsIcon());
 
-  TargetChange();
+    TargetChange();
+  }
 }
 
-SkinPartPtr FilterTargetButtons::getTargetNormalIcon() const
+SkinPartPtr FilterTargetButtons::getCelsIcon() const
 {
   SkinTheme* theme = SkinTheme::instance();
 
@@ -198,20 +144,4 @@ SkinPartPtr FilterTargetButtons::getTargetNormalIcon() const
   }
 }
 
-SkinPartPtr FilterTargetButtons::getTargetSelectedIcon() const
-{
-  SkinTheme* theme = SkinTheme::instance();
-
-  if (m_target & TARGET_ALL_FRAMES) {
-    return (m_target & TARGET_ALL_LAYERS) ?
-      theme->parts.targetFramesLayersSelected():
-      theme->parts.targetFramesSelected();
-  }
-  else {
-    return (m_target & TARGET_ALL_LAYERS) ?
-      theme->parts.targetLayersSelected():
-      theme->parts.targetOneSelected();
-  }
-}
-
 } // namespace app
diff --git a/src/app/commands/filters/filter_target_buttons.h b/src/app/commands/filters/filter_target_buttons.h
index d810c0a..255badd 100644
--- a/src/app/commands/filters/filter_target_buttons.h
+++ b/src/app/commands/filters/filter_target_buttons.h
@@ -9,10 +9,10 @@
 #define APP_COMMANDS_FILTERS_FILTER_TARGET_BUTTONS_H_INCLUDED
 #pragma once
 
+#include "app/ui/button_set.h"
 #include "app/ui/skin/skin_part.h"
 #include "base/signal.h"
 #include "filters/target.h"
-#include "ui/box.h"
 
 namespace ui {
   class ButtonBase;
@@ -21,7 +21,7 @@ namespace ui {
 namespace app {
   using namespace filters;
 
-  class FilterTargetButtons : public ui::Box {
+  class FilterTargetButtons : public ButtonSet {
   public:
     // Creates a new button to handle "targets" to apply some filter in
     // the a sprite.
@@ -33,15 +33,22 @@ namespace app {
     Signal0<void> TargetChange;
 
   protected:
+    void onItemChange() override;
     void onChannelChange(ui::ButtonBase* button);
     void onImagesChange(ui::ButtonBase* button);
 
   private:
-    void selectTargetButton(const char* name, Target specificTarget);
-    skin::SkinPartPtr getTargetNormalIcon() const;
-    skin::SkinPartPtr getTargetSelectedIcon() const;
+    void selectTargetButton(Item* item, Target specificTarget);
+    skin::SkinPartPtr getCelsIcon() const;
 
     Target m_target;
+    Item* m_red;
+    Item* m_green;
+    Item* m_blue;
+    Item* m_alpha;
+    Item* m_gray;
+    Item* m_index;
+    Item* m_cels;
   };
 
 } // namespace app
diff --git a/src/app/ui/button_set.cpp b/src/app/ui/button_set.cpp
index 5b158f9..a378b03 100644
--- a/src/app/ui/button_set.cpp
+++ b/src/app/ui/button_set.cpp
@@ -78,8 +78,10 @@ void ButtonSet::Item::onPaint(ui::PaintEvent& ev)
     CENTER | (hasText() ? BOTTOM: MIDDLE),
     iconSize.w, iconSize.h);
 
-  textRc.y -= 1*guiscale();
-  iconRc.y -= 1*guiscale();
+  if (m_icon) {
+    textRc.y -= 1*guiscale();
+    iconRc.y -= 1*guiscale();
+  }
 
   if (!gfx::is_transparent(getBgColor()))
     g->fillRect(getBgColor(), g->getClipBounds());
@@ -105,8 +107,8 @@ void ButtonSet::Item::onPaint(ui::PaintEvent& ev)
   }
 
   Grid::Info info = buttonSet()->getChildInfo(this);
-  if (info.col < info.grid_cols-1) rc.w += 1*guiscale();
-  if (info.row < info.grid_rows-1) {
+  if (info.col+info.hspan < info.grid_cols) rc.w += 1*guiscale();
+  if (info.row+info.vspan < info.grid_rows) {
     if (nw == theme->parts.toolbuttonHotFocused())
       rc.h += 2*guiscale();
     else
@@ -204,8 +206,8 @@ void ButtonSet::Item::onPreferredSize(ui::PreferredSizeEvent& ev)
   gfx::Size iconSize;
   if (m_icon) {
     iconSize = m_icon->getSize();
-    iconSize.w = MAX(iconSize.w, 16*guiscale());
-    iconSize.h = MAX(iconSize.h, 16*guiscale());
+    iconSize.w = MAX(iconSize.w+4*guiscale(), 16*guiscale());
+    iconSize.h = MAX(iconSize.h+4*guiscale(), 16*guiscale());
   }
 
   gfx::Rect boxRc;
@@ -229,27 +231,31 @@ ButtonSet::ButtonSet(int columns)
   : Grid(columns, false)
   , m_offerCapture(true)
   , m_triggerOnMouseUp(false)
+  , m_multipleSelection(false)
 {
   noBorderNoChildSpacing();
 }
 
-void ButtonSet::addItem(const std::string& text, int hspan, int vspan)
+ButtonSet::Item* ButtonSet::addItem(const std::string& text, int hspan, int vspan)
 {
   Item* item = new Item();
   item->setText(text);
   addItem(item, hspan, vspan);
+  return item;
 }
 
-void ButtonSet::addItem(const skin::SkinPartPtr& icon, int hspan, int vspan)
+ButtonSet::Item* ButtonSet::addItem(const skin::SkinPartPtr& icon, int hspan, int vspan)
 {
   Item* item = new Item();
   item->setIcon(icon);
   addItem(item, hspan, vspan);
+  return item;
 }
 
-void ButtonSet::addItem(Item* item, int hspan, int vspan)
+ButtonSet::Item* ButtonSet::addItem(Item* item, int hspan, int vspan)
 {
   addChildInCell(item, hspan, vspan, HORIZONTAL | VERTICAL);
+  return item;
 }
 
 ButtonSet::Item* ButtonSet::getItem(int index)
@@ -278,15 +284,17 @@ void ButtonSet::setSelectedItem(int index)
 
 void ButtonSet::setSelectedItem(Item* item)
 {
-  if (item && item->isSelected())
-    return;
+  if (!m_multipleSelection) {
+    if (item && item->isSelected())
+      return;
 
-  Item* sel = findSelectedItem();
-  if (sel)
-    sel->setSelected(false);
+    Item* sel = findSelectedItem();
+    if (sel)
+      sel->setSelected(false);
+  }
 
   if (item) {
-    item->setSelected(true);
+    item->setSelected(!item->isSelected());
     item->requestFocus();
   }
 }
@@ -308,6 +316,11 @@ void ButtonSet::setTriggerOnMouseUp(bool state)
   m_triggerOnMouseUp = state;
 }
 
+void ButtonSet::setMultipleSelection(bool state)
+{
+  m_multipleSelection = state;
+}
+
 void ButtonSet::onItemChange()
 {
   ItemChange();
diff --git a/src/app/ui/button_set.h b/src/app/ui/button_set.h
index 9220eaa..d69f27d 100644
--- a/src/app/ui/button_set.h
+++ b/src/app/ui/button_set.h
@@ -35,9 +35,9 @@ namespace app {
 
     ButtonSet(int columns);
 
-    void addItem(const std::string& text, int hspan = 1, int vspan = 1);
-    void addItem(const skin::SkinPartPtr& icon, int hspan = 1, int vspan = 1);
-    void addItem(Item* item, int hspan = 1, int vspan = 1);
+    Item* addItem(const std::string& text, int hspan = 1, int vspan = 1);
+    Item* addItem(const skin::SkinPartPtr& icon, int hspan = 1, int vspan = 1);
+    Item* addItem(Item* item, int hspan = 1, int vspan = 1);
     Item* getItem(int index);
 
     int selectedItem() const;
@@ -47,6 +47,7 @@ namespace app {
 
     void setOfferCapture(bool state);
     void setTriggerOnMouseUp(bool state);
+    void setMultipleSelection(bool state);
 
     Signal0<void> ItemChange;
     Signal1<void, Item*> RightClick;
@@ -60,6 +61,7 @@ namespace app {
 
     bool m_offerCapture;
     bool m_triggerOnMouseUp;
+    bool m_multipleSelection;
   };
 
 } // namespace app

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git



More information about the Pkg-games-commits mailing list