mirror of
https://github.com/aseprite/aseprite.git
synced 2025-03-13 01:13:22 +00:00
Add relative mode in Palette Editor
This commit is contained in:
parent
9fc7b993d4
commit
525e473fb5
@ -72,16 +72,21 @@ protected:
|
|||||||
void onColorSlidersChange(ColorSlidersChangeEvent& ev);
|
void onColorSlidersChange(ColorSlidersChangeEvent& ev);
|
||||||
void onColorHexEntryChange(const app::Color& color);
|
void onColorHexEntryChange(const app::Color& color);
|
||||||
void onColorTypeButtonClick(Event& ev);
|
void onColorTypeButtonClick(Event& ev);
|
||||||
|
void onAbsoluteButtonClick(Event& ev);
|
||||||
|
void onRelativeButtonClick(Event& ev);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void selectColorType(app::Color::Type type);
|
void selectColorType(app::Color::Type type);
|
||||||
void setPaletteEntry(const app::Color& color);
|
void setPaletteEntry(const app::Color& color);
|
||||||
void setPaletteEntryChannel(const app::Color& color, ColorSliders::Channel channel);
|
void setAbsolutePaletteEntryChannel(ColorSliders::Channel channel, const app::Color& color);
|
||||||
|
void setRelativePaletteEntryChannel(ColorSliders::Channel channel, int delta);
|
||||||
void setNewPalette(Palette* palette, const char* operationName);
|
void setNewPalette(Palette* palette, const char* operationName);
|
||||||
void updateCurrentSpritePalette(const char* operationName);
|
void updateCurrentSpritePalette(const char* operationName);
|
||||||
void updateColorBar();
|
void updateColorBar();
|
||||||
void onPalChange();
|
void onPalChange();
|
||||||
|
void resetRelativeInfo();
|
||||||
|
|
||||||
|
app::Color::Type m_type;
|
||||||
Box m_vbox;
|
Box m_vbox;
|
||||||
Box m_topBox;
|
Box m_topBox;
|
||||||
Box m_bottomBox;
|
Box m_bottomBox;
|
||||||
@ -89,6 +94,8 @@ private:
|
|||||||
RadioButton m_hsvButton;
|
RadioButton m_hsvButton;
|
||||||
HexColorEntry m_hexColorEntry;
|
HexColorEntry m_hexColorEntry;
|
||||||
Label m_entryLabel;
|
Label m_entryLabel;
|
||||||
|
RadioButton m_absButton;
|
||||||
|
RadioButton m_relButton;
|
||||||
RgbSliders m_rgbSliders;
|
RgbSliders m_rgbSliders;
|
||||||
HsvSliders m_hsvSliders;
|
HsvSliders m_hsvSliders;
|
||||||
|
|
||||||
@ -111,6 +118,10 @@ private:
|
|||||||
bool m_selfPalChange;
|
bool m_selfPalChange;
|
||||||
|
|
||||||
ScopedConnection m_palChangeConn;
|
ScopedConnection m_palChangeConn;
|
||||||
|
|
||||||
|
// Palette used for relative changes.
|
||||||
|
Palette m_fromPalette;
|
||||||
|
std::map<ColorSliders::Channel, int> m_relDeltas;
|
||||||
};
|
};
|
||||||
|
|
||||||
static PaletteEntryEditor* g_window = NULL;
|
static PaletteEntryEditor* g_window = NULL;
|
||||||
@ -227,17 +238,21 @@ bool PaletteEditorCommand::onChecked(Context* context)
|
|||||||
|
|
||||||
PaletteEntryEditor::PaletteEntryEditor()
|
PaletteEntryEditor::PaletteEntryEditor()
|
||||||
: Window(WithTitleBar, "Palette Editor (F4)")
|
: Window(WithTitleBar, "Palette Editor (F4)")
|
||||||
|
, m_type(app::Color::MaskType)
|
||||||
, m_vbox(JI_VERTICAL)
|
, m_vbox(JI_VERTICAL)
|
||||||
, m_topBox(JI_HORIZONTAL)
|
, m_topBox(JI_HORIZONTAL)
|
||||||
, m_bottomBox(JI_HORIZONTAL)
|
, m_bottomBox(JI_HORIZONTAL)
|
||||||
, m_rgbButton("RGB", 1, kButtonWidget)
|
, m_rgbButton("RGB", 1, kButtonWidget)
|
||||||
, m_hsvButton("HSB", 1, kButtonWidget)
|
, m_hsvButton("HSB", 1, kButtonWidget)
|
||||||
, m_entryLabel("")
|
, m_entryLabel("")
|
||||||
|
, m_absButton("Abs", 2, kButtonWidget)
|
||||||
|
, m_relButton("Rel", 2, kButtonWidget)
|
||||||
, m_disableHexUpdate(false)
|
, m_disableHexUpdate(false)
|
||||||
, m_redrawTimer(250, this)
|
, m_redrawTimer(250, this)
|
||||||
, m_redrawAll(false)
|
, m_redrawAll(false)
|
||||||
, m_implantChange(false)
|
, m_implantChange(false)
|
||||||
, m_selfPalChange(false)
|
, m_selfPalChange(false)
|
||||||
|
, m_fromPalette(0, Palette::MaxColors)
|
||||||
{
|
{
|
||||||
m_topBox.setBorder(gfx::Border(0));
|
m_topBox.setBorder(gfx::Border(0));
|
||||||
m_topBox.child_spacing = 0;
|
m_topBox.child_spacing = 0;
|
||||||
@ -245,12 +260,17 @@ PaletteEntryEditor::PaletteEntryEditor()
|
|||||||
|
|
||||||
setup_mini_look(&m_rgbButton);
|
setup_mini_look(&m_rgbButton);
|
||||||
setup_mini_look(&m_hsvButton);
|
setup_mini_look(&m_hsvButton);
|
||||||
|
setup_mini_look(&m_absButton);
|
||||||
|
setup_mini_look(&m_relButton);
|
||||||
|
|
||||||
// Top box
|
// Top box
|
||||||
m_topBox.addChild(&m_rgbButton);
|
m_topBox.addChild(&m_rgbButton);
|
||||||
m_topBox.addChild(&m_hsvButton);
|
m_topBox.addChild(&m_hsvButton);
|
||||||
m_topBox.addChild(&m_hexColorEntry);
|
m_topBox.addChild(&m_hexColorEntry);
|
||||||
m_topBox.addChild(&m_entryLabel);
|
m_topBox.addChild(&m_entryLabel);
|
||||||
|
m_topBox.addChild(new BoxFiller);
|
||||||
|
m_topBox.addChild(&m_absButton);
|
||||||
|
m_topBox.addChild(&m_relButton);
|
||||||
|
|
||||||
// Main vertical box
|
// Main vertical box
|
||||||
m_vbox.addChild(&m_topBox);
|
m_vbox.addChild(&m_topBox);
|
||||||
@ -261,11 +281,14 @@ PaletteEntryEditor::PaletteEntryEditor()
|
|||||||
|
|
||||||
m_rgbButton.Click.connect(&PaletteEntryEditor::onColorTypeButtonClick, this);
|
m_rgbButton.Click.connect(&PaletteEntryEditor::onColorTypeButtonClick, this);
|
||||||
m_hsvButton.Click.connect(&PaletteEntryEditor::onColorTypeButtonClick, this);
|
m_hsvButton.Click.connect(&PaletteEntryEditor::onColorTypeButtonClick, this);
|
||||||
|
m_absButton.Click.connect(&PaletteEntryEditor::onAbsoluteButtonClick, this);
|
||||||
|
m_relButton.Click.connect(&PaletteEntryEditor::onRelativeButtonClick, this);
|
||||||
|
|
||||||
m_rgbSliders.ColorChange.connect(&PaletteEntryEditor::onColorSlidersChange, this);
|
m_rgbSliders.ColorChange.connect(&PaletteEntryEditor::onColorSlidersChange, this);
|
||||||
m_hsvSliders.ColorChange.connect(&PaletteEntryEditor::onColorSlidersChange, this);
|
m_hsvSliders.ColorChange.connect(&PaletteEntryEditor::onColorSlidersChange, this);
|
||||||
m_hexColorEntry.ColorChange.connect(&PaletteEntryEditor::onColorHexEntryChange, this);
|
m_hexColorEntry.ColorChange.connect(&PaletteEntryEditor::onColorHexEntryChange, this);
|
||||||
|
|
||||||
|
m_absButton.setSelected(true);
|
||||||
selectColorType(app::Color::RgbType);
|
selectColorType(app::Color::RgbType);
|
||||||
|
|
||||||
// We hook fg/bg color changes (by eyedropper mainly) to update the selected entry color
|
// We hook fg/bg color changes (by eyedropper mainly) to update the selected entry color
|
||||||
@ -382,13 +405,19 @@ void PaletteEntryEditor::onFgBgColorChange(const app::Color& color)
|
|||||||
{
|
{
|
||||||
if (color.isValid() && color.getType() == app::Color::IndexType) {
|
if (color.isValid() && color.getType() == app::Color::IndexType) {
|
||||||
setColor(color);
|
setColor(color);
|
||||||
|
resetRelativeInfo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PaletteEntryEditor::onColorSlidersChange(ColorSlidersChangeEvent& ev)
|
void PaletteEntryEditor::onColorSlidersChange(ColorSlidersChangeEvent& ev)
|
||||||
{
|
{
|
||||||
setColor(ev.getColor());
|
setColor(ev.color());
|
||||||
setPaletteEntryChannel(ev.getColor(), ev.getModifiedChannel());
|
|
||||||
|
if (ev.mode() == ColorSliders::Absolute)
|
||||||
|
setAbsolutePaletteEntryChannel(ev.channel(), ev.color());
|
||||||
|
else
|
||||||
|
setRelativePaletteEntryChannel(ev.channel(), ev.delta());
|
||||||
|
|
||||||
updateCurrentSpritePalette("Color Change");
|
updateCurrentSpritePalette("Color Change");
|
||||||
updateColorBar();
|
updateColorBar();
|
||||||
}
|
}
|
||||||
@ -415,6 +444,19 @@ void PaletteEntryEditor::onColorTypeButtonClick(Event& ev)
|
|||||||
else if (source == &m_hsvButton) selectColorType(app::Color::HsvType);
|
else if (source == &m_hsvButton) selectColorType(app::Color::HsvType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PaletteEntryEditor::onAbsoluteButtonClick(Event& ev)
|
||||||
|
{
|
||||||
|
m_rgbSliders.setMode(ColorSliders::Absolute);
|
||||||
|
m_hsvSliders.setMode(ColorSliders::Absolute);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PaletteEntryEditor::onRelativeButtonClick(Event& ev)
|
||||||
|
{
|
||||||
|
m_rgbSliders.setMode(ColorSliders::Relative);
|
||||||
|
m_hsvSliders.setMode(ColorSliders::Relative);
|
||||||
|
resetRelativeInfo();
|
||||||
|
}
|
||||||
|
|
||||||
void PaletteEntryEditor::setPaletteEntry(const app::Color& color)
|
void PaletteEntryEditor::setPaletteEntry(const app::Color& color)
|
||||||
{
|
{
|
||||||
PaletteView* palView = ColorBar::instance()->getPaletteView();
|
PaletteView* palView = ColorBar::instance()->getPaletteView();
|
||||||
@ -422,8 +464,8 @@ void PaletteEntryEditor::setPaletteEntry(const app::Color& color)
|
|||||||
palView->getSelectedEntries(entries);
|
palView->getSelectedEntries(entries);
|
||||||
|
|
||||||
color_t new_pal_color = doc::rgba(color.getRed(),
|
color_t new_pal_color = doc::rgba(color.getRed(),
|
||||||
color.getGreen(),
|
color.getGreen(),
|
||||||
color.getBlue(), 255);
|
color.getBlue(), 255);
|
||||||
|
|
||||||
Palette* palette = get_current_palette();
|
Palette* palette = get_current_palette();
|
||||||
for (int c=0; c<palette->size(); c++) {
|
for (int c=0; c<palette->size(); c++) {
|
||||||
@ -432,7 +474,7 @@ void PaletteEntryEditor::setPaletteEntry(const app::Color& color)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PaletteEntryEditor::setPaletteEntryChannel(const app::Color& color, ColorSliders::Channel channel)
|
void PaletteEntryEditor::setAbsolutePaletteEntryChannel(ColorSliders::Channel channel, const app::Color& color)
|
||||||
{
|
{
|
||||||
PaletteView* palView = ColorBar::instance()->getPaletteView();
|
PaletteView* palView = ColorBar::instance()->getPaletteView();
|
||||||
PalettePicks entries;
|
PalettePicks entries;
|
||||||
@ -447,86 +489,150 @@ void PaletteEntryEditor::setPaletteEntryChannel(const app::Color& color, ColorSl
|
|||||||
|
|
||||||
Palette* palette = get_current_palette();
|
Palette* palette = get_current_palette();
|
||||||
for (int c=0; c<palette->size(); c++) {
|
for (int c=0; c<palette->size(); c++) {
|
||||||
if (entries[c]) {
|
if (!entries[c])
|
||||||
// Get the current RGB values of the palette entry
|
continue;
|
||||||
src_color = palette->getEntry(c);
|
|
||||||
r = rgba_getr(src_color);
|
|
||||||
g = rgba_getg(src_color);
|
|
||||||
b = rgba_getb(src_color);
|
|
||||||
|
|
||||||
switch (color.getType()) {
|
// Get the current RGB values of the palette entry
|
||||||
|
src_color = palette->getEntry(c);
|
||||||
|
r = rgba_getr(src_color);
|
||||||
|
g = rgba_getg(src_color);
|
||||||
|
b = rgba_getb(src_color);
|
||||||
|
|
||||||
|
switch (m_type) {
|
||||||
|
|
||||||
|
case app::Color::RgbType:
|
||||||
|
// Modify one entry
|
||||||
|
if (begSel == endSel) {
|
||||||
|
r = color.getRed();
|
||||||
|
g = color.getGreen();
|
||||||
|
b = color.getBlue();
|
||||||
|
}
|
||||||
|
// Modify one channel a set of entries
|
||||||
|
else {
|
||||||
|
// Setup the new RGB values depending of the modified channel.
|
||||||
|
switch (channel) {
|
||||||
|
case ColorSliders::Red:
|
||||||
|
r = color.getRed();
|
||||||
|
case ColorSliders::Green:
|
||||||
|
g = color.getGreen();
|
||||||
|
break;
|
||||||
|
case ColorSliders::Blue:
|
||||||
|
b = color.getBlue();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case app::Color::HsvType:
|
||||||
|
{
|
||||||
|
Hsv hsv;
|
||||||
|
|
||||||
case app::Color::RgbType:
|
|
||||||
// Modify one entry
|
// Modify one entry
|
||||||
if (begSel == endSel) {
|
if (begSel == endSel) {
|
||||||
r = color.getRed();
|
hsv.hue(color.getHue());
|
||||||
g = color.getGreen();
|
hsv.saturation(double(color.getSaturation()) / 100.0);
|
||||||
b = color.getBlue();
|
hsv.value(double(color.getValue()) / 100.0);
|
||||||
}
|
}
|
||||||
// Modify one channel a set of entries
|
// Modify one channel a set of entries
|
||||||
else {
|
else {
|
||||||
// Setup the new RGB values depending of the modified channel.
|
// Convert RGB to HSV
|
||||||
|
hsv = Hsv(Rgb(r, g, b));
|
||||||
|
|
||||||
|
// Only modify the desired HSV channel
|
||||||
switch (channel) {
|
switch (channel) {
|
||||||
case ColorSliders::Red:
|
case ColorSliders::Hue:
|
||||||
r = color.getRed();
|
hsv.hue(color.getHue());
|
||||||
case ColorSliders::Green:
|
|
||||||
g = color.getGreen();
|
|
||||||
break;
|
break;
|
||||||
case ColorSliders::Blue:
|
case ColorSliders::Saturation:
|
||||||
b = color.getBlue();
|
hsv.saturation(double(color.getSaturation()) / 100.0);
|
||||||
|
break;
|
||||||
|
case ColorSliders::Value:
|
||||||
|
hsv.value(double(color.getValue()) / 100.0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case app::Color::HsvType:
|
// Convert HSV back to RGB
|
||||||
{
|
Rgb rgb(hsv);
|
||||||
Hsv hsv;
|
r = rgb.red();
|
||||||
|
g = rgb.green();
|
||||||
|
b = rgb.blue();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Modify one entry
|
palette->setEntry(c, doc::rgba(r, g, b, 255));
|
||||||
if (begSel == endSel) {
|
}
|
||||||
hsv.hue(color.getHue());
|
}
|
||||||
hsv.saturation(double(color.getSaturation()) / 100.0);
|
|
||||||
hsv.value(double(color.getValue()) / 100.0);
|
|
||||||
}
|
|
||||||
// Modify one channel a set of entries
|
|
||||||
else {
|
|
||||||
// Convert RGB to HSV
|
|
||||||
hsv = Hsv(Rgb(r, g, b));
|
|
||||||
|
|
||||||
// Only modify the desired HSV channel
|
void PaletteEntryEditor::setRelativePaletteEntryChannel(ColorSliders::Channel channel, int delta)
|
||||||
switch (channel) {
|
{
|
||||||
case ColorSliders::Hue:
|
PaletteView* palView = ColorBar::instance()->getPaletteView();
|
||||||
hsv.hue(color.getHue());
|
PalettePicks entries;
|
||||||
break;
|
palView->getSelectedEntries(entries);
|
||||||
case ColorSliders::Saturation:
|
|
||||||
hsv.saturation(double(color.getSaturation()) / 100.0);
|
|
||||||
break;
|
|
||||||
case ColorSliders::Value:
|
|
||||||
hsv.value(double(color.getValue()) / 100.0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert HSV back to RGB
|
// Update modified delta
|
||||||
Rgb rgb(hsv);
|
m_relDeltas[channel] = delta;
|
||||||
r = rgb.red();
|
|
||||||
g = rgb.green();
|
uint32_t src_color;
|
||||||
b = rgb.blue();
|
int r, g, b;
|
||||||
}
|
|
||||||
break;
|
Palette* palette = get_current_palette();
|
||||||
|
for (int c=0; c<palette->size(); c++) {
|
||||||
|
if (!entries[c])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Get the current RGB values of the palette entry
|
||||||
|
src_color = m_fromPalette.getEntry(c);
|
||||||
|
r = rgba_getr(src_color);
|
||||||
|
g = rgba_getg(src_color);
|
||||||
|
b = rgba_getb(src_color);
|
||||||
|
|
||||||
|
switch (m_type) {
|
||||||
|
|
||||||
|
case app::Color::RgbType:
|
||||||
|
r = MID(0, r+m_relDeltas[ColorSliders::Red], 255);
|
||||||
|
g = MID(0, g+m_relDeltas[ColorSliders::Green], 255);
|
||||||
|
b = MID(0, b+m_relDeltas[ColorSliders::Blue], 255);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case app::Color::HsvType: {
|
||||||
|
// Convert RGB to HSV
|
||||||
|
Hsv hsv(Rgb(r, g, b));
|
||||||
|
|
||||||
|
double h = hsv.hue()+m_relDeltas[ColorSliders::Hue];
|
||||||
|
double s = 100.0*hsv.saturation()+m_relDeltas[ColorSliders::Saturation];
|
||||||
|
double v = 100.0*hsv.value()+m_relDeltas[ColorSliders::Value];
|
||||||
|
|
||||||
|
if (h < 0.0) h += 360.0;
|
||||||
|
else if (h > 360.0) h -= 360.0;
|
||||||
|
|
||||||
|
hsv.hue (MID(0.0, h, 360.0));
|
||||||
|
hsv.saturation(MID(0.0, s, 100.0) / 100.0);
|
||||||
|
hsv.value (MID(0.0, v, 100.0) / 100.0);
|
||||||
|
|
||||||
|
// Convert HSV back to RGB
|
||||||
|
Rgb rgb(hsv);
|
||||||
|
r = rgb.red();
|
||||||
|
g = rgb.green();
|
||||||
|
b = rgb.blue();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
palette->setEntry(c, doc::rgba(r, g, b, 255));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
palette->setEntry(c, doc::rgba(r, g, b, 255));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PaletteEntryEditor::selectColorType(app::Color::Type type)
|
void PaletteEntryEditor::selectColorType(app::Color::Type type)
|
||||||
{
|
{
|
||||||
|
m_type = type;
|
||||||
m_rgbSliders.setVisible(type == app::Color::RgbType);
|
m_rgbSliders.setVisible(type == app::Color::RgbType);
|
||||||
m_hsvSliders.setVisible(type == app::Color::HsvType);
|
m_hsvSliders.setVisible(type == app::Color::HsvType);
|
||||||
|
|
||||||
|
resetRelativeInfo();
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case app::Color::RgbType: m_rgbButton.setSelected(true); break;
|
case app::Color::RgbType: m_rgbButton.setSelected(true); break;
|
||||||
case app::Color::HsvType: m_hsvButton.setSelected(true); break;
|
case app::Color::HsvType: m_hsvButton.setSelected(true); break;
|
||||||
@ -602,11 +708,21 @@ void PaletteEntryEditor::onPalChange()
|
|||||||
if (index >= 0)
|
if (index >= 0)
|
||||||
setColor(app::Color::fromIndex(index));
|
setColor(app::Color::fromIndex(index));
|
||||||
|
|
||||||
|
resetRelativeInfo();
|
||||||
|
|
||||||
// Redraw the window
|
// Redraw the window
|
||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PaletteEntryEditor::resetRelativeInfo()
|
||||||
|
{
|
||||||
|
m_rgbSliders.resetRelativeSliders();
|
||||||
|
m_hsvSliders.resetRelativeSliders();
|
||||||
|
get_current_palette()->copyColorsTo(&m_fromPalette);
|
||||||
|
m_relDeltas.clear();
|
||||||
|
}
|
||||||
|
|
||||||
Command* CommandFactory::createPaletteEditorCommand()
|
Command* CommandFactory::createPaletteEditorCommand()
|
||||||
{
|
{
|
||||||
return new PaletteEditorCommand;
|
return new PaletteEditorCommand;
|
||||||
|
@ -166,8 +166,8 @@ void ColorSelector::onPaletteViewIndexChange(int index, ui::MouseButtons buttons
|
|||||||
|
|
||||||
void ColorSelector::onColorSlidersChange(ColorSlidersChangeEvent& ev)
|
void ColorSelector::onColorSlidersChange(ColorSlidersChangeEvent& ev)
|
||||||
{
|
{
|
||||||
setColorWithSignal(ev.getColor());
|
setColorWithSignal(ev.color());
|
||||||
findBestfitIndex(ev.getColor());
|
findBestfitIndex(ev.color());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorSelector::onColorHexEntryChange(const app::Color& color)
|
void ColorSelector::onColorHexEntryChange(const app::Color& color)
|
||||||
|
@ -83,6 +83,7 @@ namespace {
|
|||||||
ColorSliders::ColorSliders()
|
ColorSliders::ColorSliders()
|
||||||
: Widget(kGenericWidget)
|
: Widget(kGenericWidget)
|
||||||
, m_grid(3, false)
|
, m_grid(3, false)
|
||||||
|
, m_mode(Absolute)
|
||||||
{
|
{
|
||||||
addChild(&m_grid);
|
addChild(&m_grid);
|
||||||
}
|
}
|
||||||
@ -98,46 +99,77 @@ void ColorSliders::setColor(const app::Color& color)
|
|||||||
updateSlidersBgColor(color);
|
updateSlidersBgColor(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorSliders:: onPreferredSize(PreferredSizeEvent& ev)
|
void ColorSliders::setMode(Mode mode)
|
||||||
|
{
|
||||||
|
m_mode = mode;
|
||||||
|
|
||||||
|
for (Slider* slider : m_absSlider)
|
||||||
|
slider->setVisible(mode == Absolute);
|
||||||
|
|
||||||
|
for (Slider* slider : m_relSlider)
|
||||||
|
slider->setVisible(mode == Relative);
|
||||||
|
|
||||||
|
resetRelativeSliders();
|
||||||
|
layout();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ColorSliders::resetRelativeSliders()
|
||||||
|
{
|
||||||
|
for (Slider* slider : m_relSlider)
|
||||||
|
slider->setValue(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ColorSliders::onPreferredSize(PreferredSizeEvent& ev)
|
||||||
{
|
{
|
||||||
ev.setPreferredSize(m_grid.getPreferredSize());
|
ev.setPreferredSize(m_grid.getPreferredSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorSliders::addSlider(Channel channel, const char* labelText, int min, int max)
|
void ColorSliders::addSlider(Channel channel, const char* labelText, int min, int max)
|
||||||
{
|
{
|
||||||
Label* label = new Label(labelText);
|
Label* label = new Label(labelText);
|
||||||
Slider* slider = new Slider(min, max, 0);
|
Slider* absSlider = new Slider(min, max, 0);
|
||||||
Entry* entry = new Entry(3, "0");
|
Slider* relSlider = new Slider(min-max, max-min, 0);
|
||||||
|
Entry* entry = new Entry(4, "0");
|
||||||
|
|
||||||
m_label.push_back(label);
|
m_label.push_back(label);
|
||||||
m_slider.push_back(slider);
|
m_absSlider.push_back(absSlider);
|
||||||
|
m_relSlider.push_back(relSlider);
|
||||||
m_entry.push_back(entry);
|
m_entry.push_back(entry);
|
||||||
m_channel.push_back(channel);
|
m_channel.push_back(channel);
|
||||||
|
|
||||||
slider->setProperty(SkinSliderPropertyPtr(new SkinSliderProperty(new ColorSliderBgPainter(channel))));
|
absSlider->setProperty(SkinSliderPropertyPtr(new SkinSliderProperty(new ColorSliderBgPainter(channel))));
|
||||||
slider->setDoubleBuffered(true);
|
absSlider->setDoubleBuffered(true);
|
||||||
|
|
||||||
slider->Change.connect(Bind<void>(&ColorSliders::onSliderChange, this, m_slider.size()-1));
|
absSlider->Change.connect(Bind<void>(&ColorSliders::onSliderChange, this, m_absSlider.size()-1));
|
||||||
|
relSlider->Change.connect(Bind<void>(&ColorSliders::onSliderChange, this, m_relSlider.size()-1));
|
||||||
entry->EntryChange.connect(Bind<void>(&ColorSliders::onEntryChange, this, m_entry.size()-1));
|
entry->EntryChange.connect(Bind<void>(&ColorSliders::onEntryChange, this, m_entry.size()-1));
|
||||||
|
|
||||||
|
HBox* box = new HBox();
|
||||||
|
box->addChild(absSlider);
|
||||||
|
box->addChild(relSlider);
|
||||||
|
absSlider->setExpansive(true);
|
||||||
|
relSlider->setExpansive(true);
|
||||||
|
relSlider->setVisible(false);
|
||||||
|
|
||||||
m_grid.addChildInCell(label, 1, 1, JI_LEFT | JI_MIDDLE);
|
m_grid.addChildInCell(label, 1, 1, JI_LEFT | JI_MIDDLE);
|
||||||
m_grid.addChildInCell(slider, 1, 1, JI_HORIZONTAL | JI_VERTICAL | JI_EXPANSIVE);
|
m_grid.addChildInCell(box, 1, 1, JI_HORIZONTAL | JI_VERTICAL | JI_EXPANSIVE);
|
||||||
m_grid.addChildInCell(entry, 1, 1, JI_LEFT | JI_MIDDLE);
|
m_grid.addChildInCell(entry, 1, 1, JI_LEFT | JI_MIDDLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorSliders::setSliderValue(int sliderIndex, int value)
|
void ColorSliders::setAbsSliderValue(int sliderIndex, int value)
|
||||||
{
|
{
|
||||||
Slider* slider = m_slider[sliderIndex];
|
m_absSlider[sliderIndex]->setValue(value);
|
||||||
slider->setValue(value);
|
|
||||||
|
|
||||||
updateEntryText(sliderIndex);
|
updateEntryText(sliderIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ColorSliders::getSliderValue(int sliderIndex) const
|
int ColorSliders::getAbsSliderValue(int sliderIndex) const
|
||||||
{
|
{
|
||||||
Slider* slider = m_slider[sliderIndex];
|
return m_absSlider[sliderIndex]->getValue();
|
||||||
|
}
|
||||||
|
|
||||||
return slider->getValue();
|
int ColorSliders::getRelSliderValue(int sliderIndex) const
|
||||||
|
{
|
||||||
|
return m_relSlider[sliderIndex]->getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorSliders::onSliderChange(int i)
|
void ColorSliders::onSliderChange(int i)
|
||||||
@ -151,11 +183,9 @@ void ColorSliders::onEntryChange(int i)
|
|||||||
// Update the slider related to the changed entry widget.
|
// Update the slider related to the changed entry widget.
|
||||||
int value = m_entry[i]->getTextInt();
|
int value = m_entry[i]->getTextInt();
|
||||||
|
|
||||||
value = MID(m_slider[i]->getMinValue(),
|
Slider* slider = (m_mode == Absolute ? m_absSlider[i]: m_relSlider[i]);
|
||||||
value,
|
value = MID(slider->getMinValue(), value, slider->getMaxValue());
|
||||||
m_slider[i]->getMaxValue());
|
slider->setValue(value);
|
||||||
|
|
||||||
m_slider[i]->setValue(value);
|
|
||||||
|
|
||||||
onControlChange(i);
|
onControlChange(i);
|
||||||
}
|
}
|
||||||
@ -169,20 +199,24 @@ void ColorSliders::onControlChange(int i)
|
|||||||
updateSlidersBgColor(color);
|
updateSlidersBgColor(color);
|
||||||
|
|
||||||
// Fire ColorChange() signal
|
// Fire ColorChange() signal
|
||||||
ColorSlidersChangeEvent ev(color, m_channel[i], this);
|
ColorSlidersChangeEvent ev(m_channel[i], m_mode,
|
||||||
|
color, m_relSlider[i]->getValue(), this);
|
||||||
ColorChange(ev);
|
ColorChange(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Updates the entry related to the changed slider widget.
|
// Updates the entry related to the changed slider widget.
|
||||||
void ColorSliders::updateEntryText(int entryIndex)
|
void ColorSliders::updateEntryText(int entryIndex)
|
||||||
{
|
{
|
||||||
m_entry[entryIndex]->setTextf("%d", m_slider[entryIndex]->getValue());
|
Slider* slider = (m_mode == Absolute ? m_absSlider[entryIndex]:
|
||||||
|
m_relSlider[entryIndex]);
|
||||||
|
|
||||||
|
m_entry[entryIndex]->setTextf("%d", slider->getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorSliders::updateSlidersBgColor(const app::Color& color)
|
void ColorSliders::updateSlidersBgColor(const app::Color& color)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < m_slider.size(); ++i)
|
for (size_t i = 0; i < m_absSlider.size(); ++i)
|
||||||
updateSliderBgColor(m_slider[i], color);
|
updateSliderBgColor(m_absSlider[i], color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorSliders::updateSliderBgColor(Slider* slider, const app::Color& color)
|
void ColorSliders::updateSliderBgColor(Slider* slider, const app::Color& color)
|
||||||
@ -207,16 +241,16 @@ RgbSliders::RgbSliders()
|
|||||||
|
|
||||||
void RgbSliders::onSetColor(const app::Color& color)
|
void RgbSliders::onSetColor(const app::Color& color)
|
||||||
{
|
{
|
||||||
setSliderValue(0, color.getRed());
|
setAbsSliderValue(0, color.getRed());
|
||||||
setSliderValue(1, color.getGreen());
|
setAbsSliderValue(1, color.getGreen());
|
||||||
setSliderValue(2, color.getBlue());
|
setAbsSliderValue(2, color.getBlue());
|
||||||
}
|
}
|
||||||
|
|
||||||
app::Color RgbSliders::getColorFromSliders()
|
app::Color RgbSliders::getColorFromSliders()
|
||||||
{
|
{
|
||||||
return app::Color::fromRgb(getSliderValue(0),
|
return app::Color::fromRgb(getAbsSliderValue(0),
|
||||||
getSliderValue(1),
|
getAbsSliderValue(1),
|
||||||
getSliderValue(2));
|
getAbsSliderValue(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
@ -232,16 +266,16 @@ HsvSliders::HsvSliders()
|
|||||||
|
|
||||||
void HsvSliders::onSetColor(const app::Color& color)
|
void HsvSliders::onSetColor(const app::Color& color)
|
||||||
{
|
{
|
||||||
setSliderValue(0, color.getHue());
|
setAbsSliderValue(0, color.getHue());
|
||||||
setSliderValue(1, color.getSaturation());
|
setAbsSliderValue(1, color.getSaturation());
|
||||||
setSliderValue(2, color.getValue());
|
setAbsSliderValue(2, color.getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
app::Color HsvSliders::getColorFromSliders()
|
app::Color HsvSliders::getColorFromSliders()
|
||||||
{
|
{
|
||||||
return app::Color::fromHsv(getSliderValue(0),
|
return app::Color::fromHsv(getAbsSliderValue(0),
|
||||||
getSliderValue(1),
|
getAbsSliderValue(1),
|
||||||
getSliderValue(2));
|
getAbsSliderValue(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
@ -255,13 +289,13 @@ GraySlider::GraySlider()
|
|||||||
|
|
||||||
void GraySlider::onSetColor(const app::Color& color)
|
void GraySlider::onSetColor(const app::Color& color)
|
||||||
{
|
{
|
||||||
setSliderValue(0, color.getGray());
|
setAbsSliderValue(0, color.getGray());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
app::Color GraySlider::getColorFromSliders()
|
app::Color GraySlider::getColorFromSliders()
|
||||||
{
|
{
|
||||||
return app::Color::fromGray(getSliderValue(0));
|
return app::Color::fromGray(getAbsSliderValue(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace app
|
} // namespace app
|
||||||
|
@ -32,11 +32,14 @@ namespace app {
|
|||||||
enum Channel { Red, Green, Blue,
|
enum Channel { Red, Green, Blue,
|
||||||
Hue, Saturation, Value,
|
Hue, Saturation, Value,
|
||||||
Gray };
|
Gray };
|
||||||
|
enum Mode { Absolute, Relative };
|
||||||
|
|
||||||
ColorSliders();
|
ColorSliders();
|
||||||
~ColorSliders();
|
~ColorSliders();
|
||||||
|
|
||||||
void setColor(const app::Color& color);
|
void setColor(const app::Color& color);
|
||||||
|
void setMode(Mode mode);
|
||||||
|
void resetRelativeSliders();
|
||||||
|
|
||||||
// Signals
|
// Signals
|
||||||
Signal1<void, ColorSlidersChangeEvent&> ColorChange;
|
Signal1<void, ColorSlidersChangeEvent&> ColorChange;
|
||||||
@ -46,8 +49,9 @@ namespace app {
|
|||||||
|
|
||||||
// For derived classes
|
// For derived classes
|
||||||
void addSlider(Channel channel, const char* labelText, int min, int max);
|
void addSlider(Channel channel, const char* labelText, int min, int max);
|
||||||
void setSliderValue(int sliderIndex, int value);
|
void setAbsSliderValue(int sliderIndex, int value);
|
||||||
int getSliderValue(int sliderIndex) const;
|
int getAbsSliderValue(int sliderIndex) const;
|
||||||
|
int getRelSliderValue(int sliderIndex) const;
|
||||||
|
|
||||||
virtual void onSetColor(const app::Color& color) = 0;
|
virtual void onSetColor(const app::Color& color) = 0;
|
||||||
virtual app::Color getColorFromSliders() = 0;
|
virtual app::Color getColorFromSliders() = 0;
|
||||||
@ -62,17 +66,18 @@ namespace app {
|
|||||||
void updateSliderBgColor(ui::Slider* slider, const app::Color& color);
|
void updateSliderBgColor(ui::Slider* slider, const app::Color& color);
|
||||||
|
|
||||||
std::vector<ui::Label*> m_label;
|
std::vector<ui::Label*> m_label;
|
||||||
std::vector<ui::Slider*> m_slider;
|
std::vector<ui::Slider*> m_absSlider;
|
||||||
|
std::vector<ui::Slider*> m_relSlider;
|
||||||
std::vector<ui::Entry*> m_entry;
|
std::vector<ui::Entry*> m_entry;
|
||||||
std::vector<Channel> m_channel;
|
std::vector<Channel> m_channel;
|
||||||
ui::Grid m_grid;
|
ui::Grid m_grid;
|
||||||
|
Mode m_mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
// Derived-classes
|
// Derived-classes
|
||||||
|
|
||||||
class RgbSliders : public ColorSliders
|
class RgbSliders : public ColorSliders {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
RgbSliders();
|
RgbSliders();
|
||||||
|
|
||||||
@ -81,8 +86,7 @@ namespace app {
|
|||||||
virtual app::Color getColorFromSliders() override;
|
virtual app::Color getColorFromSliders() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class HsvSliders : public ColorSliders
|
class HsvSliders : public ColorSliders {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
HsvSliders();
|
HsvSliders();
|
||||||
|
|
||||||
@ -91,8 +95,7 @@ namespace app {
|
|||||||
virtual app::Color getColorFromSliders() override;
|
virtual app::Color getColorFromSliders() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class GraySlider : public ColorSliders
|
class GraySlider : public ColorSliders {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
GraySlider();
|
GraySlider();
|
||||||
|
|
||||||
@ -104,21 +107,30 @@ namespace app {
|
|||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
// Events
|
// Events
|
||||||
|
|
||||||
class ColorSlidersChangeEvent : public ui::Event
|
class ColorSlidersChangeEvent : public ui::Event {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
ColorSlidersChangeEvent(const app::Color& color, ColorSliders::Channel channel, ui::Component* source)
|
ColorSlidersChangeEvent(ColorSliders::Channel channel,
|
||||||
|
ColorSliders::Mode mode,
|
||||||
|
const app::Color& color,
|
||||||
|
int delta,
|
||||||
|
ui::Component* source)
|
||||||
: Event(source)
|
: Event(source)
|
||||||
|
, m_channel(channel)
|
||||||
|
, m_mode(mode)
|
||||||
, m_color(color)
|
, m_color(color)
|
||||||
, m_channel(channel) { }
|
, m_delta(delta) {
|
||||||
|
}
|
||||||
|
|
||||||
app::Color getColor() const { return m_color; }
|
ColorSliders::Channel channel() const { return m_channel; }
|
||||||
|
ColorSliders::Mode mode() const { return m_mode; }
|
||||||
ColorSliders::Channel getModifiedChannel() const { return m_channel; }
|
app::Color color() const { return m_color; }
|
||||||
|
int delta() const { return m_delta; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
app::Color m_color;
|
|
||||||
ColorSliders::Channel m_channel;
|
ColorSliders::Channel m_channel;
|
||||||
|
ColorSliders::Mode m_mode;
|
||||||
|
app::Color m_color;
|
||||||
|
int m_delta;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace app
|
} // namespace app
|
||||||
|
Loading…
x
Reference in New Issue
Block a user