Implement app::IColorSource in color selectors

This commit is contained in:
David Capello 2016-03-18 23:35:23 -03:00
parent 07b67a66f7
commit 497cfa61a4
7 changed files with 43 additions and 22 deletions

View File

@ -10,13 +10,15 @@
#pragma once
#include "app/color.h"
#include "app/ui/color_source.h"
#include "base/signal.h"
#include "ui/mouse_buttons.h"
#include "ui/widget.h"
namespace app {
class ColorSelector : public ui::Widget {
class ColorSelector : public ui::Widget
, public IColorSource {
public:
ColorSelector();

View File

@ -34,7 +34,7 @@ ColorSpectrum::ColorSpectrum()
setBorder(gfx::Border(3*ui::guiscale()));
}
app::Color ColorSpectrum::pickColor(const gfx::Point& pos) const
app::Color ColorSpectrum::getColorByPosition(const gfx::Point& pos)
{
gfx::Rect rc = childrenBounds();
if (rc.isEmpty())
@ -137,7 +137,7 @@ bool ColorSpectrum::onProcessMessage(ui::Message* msg)
case kMouseMoveMessage: {
MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg);
app::Color color = pickColor(mouseMsg->position());
app::Color color = getColorByPosition(mouseMsg->position());
if (color != app::Color::fromMask()) {
StatusBar::instance()->showColor(0, "", color);
if (hasCapture())

View File

@ -18,7 +18,8 @@ namespace app {
public:
ColorSpectrum();
app::Color pickColor(const gfx::Point& pos) const;
// IColorSource
app::Color getColorByPosition(const gfx::Point& pos) override;
protected:
void onPaint(ui::PaintEvent& ev) override;

View File

@ -34,7 +34,7 @@ ColorTintShadeTone::ColorTintShadeTone()
setBorder(gfx::Border(3*ui::guiscale()));
}
app::Color ColorTintShadeTone::pickColor(const gfx::Point& pos) const
app::Color ColorTintShadeTone::getColorByPosition(const gfx::Point& pos)
{
gfx::Rect rc = childrenBounds();
if (rc.isEmpty())
@ -49,7 +49,11 @@ app::Color ColorTintShadeTone::pickColor(const gfx::Point& pos) const
double hue, sat, val;
if (m_capturedInHue) {
bool inHue =
(( hasCapture() && m_capturedInHue) ||
(!hasCapture() && inHueBarArea(pos)));
if (inHue) {
hue = (360.0 * u / umax);
sat = m_color.getSaturation();
val = m_color.getValue();
@ -142,23 +146,28 @@ bool ColorTintShadeTone::onProcessMessage(ui::Message* msg)
switch (msg->type()) {
case kMouseDownMessage:
if (manager()->getCapture())
break;
captureMouse();
// Continue...
case kMouseMoveMessage: {
MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg);
case kMouseMoveMessage:
if (hasCapture()) {
MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg);
if (msg->type() == kMouseDownMessage)
m_capturedInHue = inHueBarArea(mouseMsg->position());
if (msg->type() == kMouseDownMessage)
m_capturedInHue = inHueBarArea(mouseMsg->position());
app::Color color = pickColor(mouseMsg->position());
if (color != app::Color::fromMask()) {
StatusBar::instance()->showColor(0, "", color);
if (hasCapture())
ColorChange(color, mouseMsg->buttons());
app::Color color = getColorByPosition(mouseMsg->position());
if (color != app::Color::fromMask()) {
StatusBar::instance()->showColor(0, "", color);
if (hasCapture())
ColorChange(color, mouseMsg->buttons());
}
}
break;
}
case kMouseUpMessage:
if (hasCapture()) {

View File

@ -17,12 +17,14 @@ namespace app {
public:
ColorTintShadeTone();
// IColorSource
app::Color getColorByPosition(const gfx::Point& pos) override;
protected:
void onPaint(ui::PaintEvent& ev) override;
bool onProcessMessage(ui::Message* msg) override;
private:
app::Color pickColor(const gfx::Point& pos) const;
bool inHueBarArea(const gfx::Point& pos) const;
int getHueBarSize() const;

View File

@ -72,7 +72,12 @@ ColorWheel::ColorWheel()
addChild(&m_options);
}
app::Color ColorWheel::pickColor(const gfx::Point& pos) const
app::Color ColorWheel::getColorByPosition(const gfx::Point& mousePos)
{
return getColorInClientPos(mousePos - bounds().origin());
}
app::Color ColorWheel::getColorInClientPos(const gfx::Point& pos)
{
m_harmonyPicked = false;
@ -213,7 +218,7 @@ void ColorWheel::onPaint(ui::PaintEvent& ev)
for (int y=rc.y; y<rc.y+rc.h; ++y) {
for (int x=rc.x; x<rc.x+rc.w; ++x) {
app::Color appColor =
ColorWheel::pickColor(gfx::Point(x, y));
ColorWheel::getColorInClientPos(gfx::Point(x, y));
gfx::Color color;
if (appColor.getType() != app::Color::MaskType) {
@ -271,7 +276,7 @@ bool ColorWheel::onProcessMessage(ui::Message* msg)
case kMouseMoveMessage: {
MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg);
app::Color color = pickColor(
app::Color color = getColorInClientPos(
mouseMsg->position()
- bounds().origin());
@ -293,7 +298,7 @@ bool ColorWheel::onProcessMessage(ui::Message* msg)
case kSetCursorMessage: {
MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg);
app::Color color = pickColor(
app::Color color = getColorInClientPos(
mouseMsg->position()
- bounds().origin());

View File

@ -35,7 +35,8 @@ namespace app {
ColorWheel();
app::Color pickColor(const gfx::Point& pos) const;
// IColorSource
app::Color getColorByPosition(const gfx::Point& pos) override;
bool isDiscrete() const { return m_discrete; }
void setDiscrete(bool state);
@ -44,6 +45,7 @@ namespace app {
void setHarmony(Harmony harmony);
private:
app::Color getColorInClientPos(const gfx::Point& pos);
void onResize(ui::ResizeEvent& ev) override;
void onPaint(ui::PaintEvent& ev) override;
bool onProcessMessage(ui::Message* msg) override;