[aseprite] 21/308: Add drag-and-drop of colors in shade widget (#85)
Tobias Hansen
thansen at moszumanska.debian.org
Tue Mar 8 02:44:48 UTC 2016
This is an automated email from the git hooks/post-receive script.
thansen pushed a commit to branch master
in repository aseprite.
commit 0f8997b3df1572a2e6bd6ea17ad35e949c3d9567
Author: David Capello <davidcapello at gmail.com>
Date: Wed Nov 25 12:29:19 2015 -0300
Add drag-and-drop of colors in shade widget (#85)
---
src/app/ui/context_bar.cpp | 104 ++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 93 insertions(+), 11 deletions(-)
diff --git a/src/app/ui/context_bar.cpp b/src/app/ui/context_bar.cpp
index 039c962..acaff7b 100644
--- a/src/app/ui/context_bar.cpp
+++ b/src/app/ui/context_bar.cpp
@@ -12,6 +12,7 @@
#include "app/ui/context_bar.h"
#include "app/app.h"
+#include "app/color_utils.h"
#include "app/commands/commands.h"
#include "app/document.h"
#include "app/modules/gfx.h"
@@ -54,6 +55,7 @@
#include "ui/paint_event.h"
#include "ui/popup_window.h"
#include "ui/preferred_size_event.h"
+#include "ui/system.h"
#include "ui/theme.h"
#include "ui/tooltips.h"
@@ -445,6 +447,7 @@ class ContextBar::InkShadesField : public HBox {
, m_click(click)
, m_shade(colors)
, m_hotIndex(-1)
+ , m_dragIndex(-1)
, m_boxSize(12) {
setText("Select colors in the palette");
}
@@ -480,9 +483,11 @@ class ContextBar::InkShadesField : public HBox {
int size() const {
int colors = 0;
for (const auto& color : m_shade) {
- if (color.getIndex() >= 0 &&
- color.getIndex() < get_current_palette()->size())
+ if ((color.getIndex() >= 0 &&
+ color.getIndex() < get_current_palette()->size()) ||
+ (m_click == Select)) {
++colors;
+ }
}
return colors;
}
@@ -490,9 +495,11 @@ class ContextBar::InkShadesField : public HBox {
Shade getShade() const {
Shade colors;
for (const auto& color : m_shade) {
- if (color.getIndex() >= 0 &&
- color.getIndex() < get_current_palette()->size())
+ if ((color.getIndex() >= 0 &&
+ color.getIndex() < get_current_palette()->size()) ||
+ (m_click == Select)) {
colors.push_back(color);
+ }
}
return colors;
}
@@ -532,18 +539,52 @@ class ContextBar::InkShadesField : public HBox {
Bind<void>(&ShadeWidget::onChangeColorBarSelection, this));
break;
+ case kSetCursorMessage:
+ if (hasCapture()) {
+ ui::set_mouse_cursor(kMoveCursor);
+ return true;
+ }
+ break;
+
case kMouseEnterMessage:
case kMouseLeaveMessage:
invalidate();
break;
+ case kMouseDownMessage: {
+ if (m_click == DragAndDrop) {
+ if (m_hotIndex >= 0) {
+ m_dragIndex = m_hotIndex;
+ m_dropBefore = false;
+ captureMouse();
+ }
+ }
+ break;
+ }
+
case kMouseUpMessage: {
if (m_click == Select) {
setSelected(true);
Click();
closeWindow();
- break;
}
+
+ if (m_dragIndex >= 0) {
+ auto color = m_shade[m_dragIndex];
+ m_shade.erase(m_shade.begin()+m_dragIndex);
+ if (m_hotIndex >= 0)
+ m_shade.insert(m_shade.begin()+m_hotIndex, color);
+
+ m_dragIndex = -1;
+ invalidate();
+
+ // Relayout the context bar if we have removed an entry.
+ if (m_hotIndex < 0)
+ getParent()->getParent()->layout();
+ }
+
+ if (hasCapture())
+ releaseMouse();
break;
}
@@ -554,9 +595,10 @@ class ContextBar::InkShadesField : public HBox {
int hot = -1;
bounds.shrink(3*guiscale());
+
if (bounds.contains(mousePos)) {
int count = size();
- hot = (mousePos.x - bounds.x) / m_boxSize;
+ hot = (mousePos.x - bounds.x) / (m_boxSize*guiscale());
hot = MID(0, hot, count-1);
}
@@ -564,10 +606,13 @@ class ContextBar::InkShadesField : public HBox {
m_hotIndex = hot;
invalidate();
}
- break;
- }
- case kMouseDownMessage: {
+ bool dropBefore =
+ (hot >= 0 && mousePos.x < (bounds.x+m_boxSize*guiscale()*hot)+m_boxSize*guiscale()/2);
+ if (m_dropBefore != dropBefore) {
+ m_dropBefore = dropBefore;
+ invalidate();
+ }
break;
}
}
@@ -578,8 +623,11 @@ class ContextBar::InkShadesField : public HBox {
int size = this->size();
if (size < 2)
ev.setPreferredSize(Size((16+m_boxSize)*guiscale()+getTextWidth(), 18*guiscale()));
- else
+ else {
+ if (m_click == Select && size > 16)
+ size = 16;
ev.setPreferredSize(Size(6+m_boxSize*size, 18)*guiscale());
+ }
}
void onPaint(PaintEvent& ev) override {
@@ -608,13 +656,45 @@ class ContextBar::InkShadesField : public HBox {
gfx::Rect box(bounds.x, bounds.y, m_boxSize*guiscale(), bounds.h);
if (colors.size() >= 2) {
+ gfx::Rect hotBounds;
+
+ int j = 0;
for (int i=0; i<int(colors.size()); ++i) {
if (i == int(colors.size())-1)
box.w = bounds.x+bounds.w-box.x;
- draw_color(g, box, colors[i]);
+ app::Color color;
+
+ if (m_dragIndex >= 0 &&
+ m_hotIndex == i) {
+ color = colors[m_dragIndex];
+ }
+ else {
+ if (j == m_dragIndex) {
+ ++j;
+ }
+ if (j < int(colors.size()))
+ color = colors[j++];
+ else
+ color = app::Color::fromMask();
+ }
+
+ draw_color(g, box, color);
+
+ if (m_hotIndex == i)
+ hotBounds = box;
+
box.x += box.w;
}
+
+ if (!hotBounds.isEmpty() && m_click == DragAndDrop) {
+ hotBounds.enlarge(3*guiscale());
+
+ Style::State state = Style::active();
+ state += Style::hover();
+ theme->styles.timelineRangeOutline()->paint(
+ g, hotBounds, NULL, state);
+ }
}
else {
g->fillRect(theme->colors.editorFace(), bounds);
@@ -626,6 +706,8 @@ class ContextBar::InkShadesField : public HBox {
ClickType m_click;
Shade m_shade;
int m_hotIndex;
+ int m_dragIndex;
+ bool m_dropBefore;
int m_boxSize;
};
--
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