diff --git a/src/app/ui/color_bar.cpp b/src/app/ui/color_bar.cpp index 1e9b3ad17..8fd8b0293 100644 --- a/src/app/ui/color_bar.cpp +++ b/src/app/ui/color_bar.cpp @@ -98,7 +98,7 @@ ColorBar* ColorBar::m_instance = NULL; ColorBar::ColorBar(int align) : Box(align) , m_buttons(int(PalButton::MAX)) - , m_paletteView(true, this, + , m_paletteView(true, PaletteView::FgBgColors, this, App::instance()->preferences().colorBar.boxSize() * guiscale()) , m_remapButton("Remap") , m_fgColor(app::Color::fromRgb(255, 255, 255), IMAGE_RGB) @@ -220,12 +220,14 @@ app::Color ColorBar::getBgColor() void ColorBar::setFgColor(const app::Color& color) { m_fgColor.setColor(color); + m_paletteView.invalidate(); FgColorChange(color); } void ColorBar::setBgColor(const app::Color& color) { m_bgColor.setColor(color); + m_paletteView.invalidate(); BgColorChange(color); } @@ -463,8 +465,10 @@ void ColorBar::onPaletteViewPasteColors( void ColorBar::onFgColorButtonChange(const app::Color& color) { - if (!m_lock) + if (!m_lock) { m_paletteView.deselect(); + m_paletteView.invalidate(); + } FgColorChange(color); onColorButtonChange(color); @@ -472,8 +476,10 @@ void ColorBar::onFgColorButtonChange(const app::Color& color) void ColorBar::onBgColorButtonChange(const app::Color& color) { - if (!m_lock) + if (!m_lock) { m_paletteView.deselect(); + m_paletteView.invalidate(); + } BgColorChange(color); onColorButtonChange(color); diff --git a/src/app/ui/color_selector.cpp b/src/app/ui/color_selector.cpp index 628151f55..bf8d5ff7f 100644 --- a/src/app/ui/color_selector.cpp +++ b/src/app/ui/color_selector.cpp @@ -55,7 +55,7 @@ ColorSelector::ColorSelector() , m_vbox(JI_VERTICAL) , m_topBox(JI_HORIZONTAL) , m_color(app::Color::fromMask()) - , m_colorPalette(false, this, 7*guiscale()) + , m_colorPalette(false, PaletteView::SelectOneColor, this, 7*guiscale()) , m_indexButton("Index", 1, kButtonWidget) , m_rgbButton("RGB", 1, kButtonWidget) , m_hsvButton("HSB", 1, kButtonWidget) diff --git a/src/app/ui/palette_view.cpp b/src/app/ui/palette_view.cpp index 76f099519..300c0a5ca 100644 --- a/src/app/ui/palette_view.cpp +++ b/src/app/ui/palette_view.cpp @@ -16,6 +16,7 @@ #include "app/modules/editors.h" #include "app/modules/gui.h" #include "app/modules/palettes.h" +#include "app/ui/color_bar.h" // TODO avoid depending on ColorBar #include "app/ui/editor/editor.h" #include "app/ui/palette_view.h" #include "app/ui/skin/skin_theme.h" @@ -55,10 +56,11 @@ WidgetType palette_view_type() return type; } -PaletteView::PaletteView(bool editable, PaletteViewDelegate* delegate, int boxsize) +PaletteView::PaletteView(bool editable, PaletteViewStyle style, PaletteViewDelegate* delegate, int boxsize) : Widget(palette_view_type()) , m_state(State::WAITING) , m_editable(editable) + , m_style(style) , m_delegate(delegate) , m_columns(16) , m_boxsize(boxsize) @@ -395,6 +397,13 @@ void PaletteView::onPaint(ui::PaintEvent& ev) ui::Graphics* g = ev.getGraphics(); gfx::Rect bounds = getClientBounds(); Palette* palette = get_current_palette(); + int fgIndex = -1; + int bgIndex = -1; + + if (m_style == FgBgColors) { + fgIndex = findExactIndex(ColorBar::instance()->getFgColor()); + bgIndex = findExactIndex(ColorBar::instance()->getBgColor()); + } g->fillRect(gfx::rgba(0, 0, 0), bounds); @@ -408,9 +417,28 @@ void PaletteView::onPaint(ui::PaintEvent& ev) g->fillRect(color, box); - if (m_currentEntry == i) - g->fillRect(color_utils::blackandwhite_neg(color), - gfx::Rect(box.getCenter(), gfx::Size(1, 1))); + switch (m_style) { + + case SelectOneColor: + if (m_currentEntry == i) + g->fillRect(color_utils::blackandwhite_neg(color), + gfx::Rect(box.getCenter(), gfx::Size(1, 1))); + break; + + case FgBgColors: + if (fgIndex == i) { + gfx::Color neg = color_utils::blackandwhite_neg(color); + for (int i=0; i<m_boxsize/2; ++i) + g->drawHLine(neg, box.x, box.y+i, m_boxsize/2-i); + } + + if (bgIndex == i) { + gfx::Color neg = color_utils::blackandwhite_neg(color); + for (int i=0; i<m_boxsize/4; ++i) + g->drawHLine(neg, box.x+box.w-(i+1), box.y+box.h-m_boxsize/4+i, i+1); + } + break; + } } // Draw selected entries @@ -735,4 +763,24 @@ void PaletteView::setCursor() ui::set_mouse_cursor(kArrowCursor); } +int PaletteView::findExactIndex(const app::Color& color) const +{ + switch (color.getType()) { + + case Color::MaskType: + return (current_editor ? current_editor->sprite()->transparentColor(): -1); + + case Color::RgbType: + case Color::HsvType: + case Color::GrayType: + return get_current_palette()->findExactMatch(color.getRed(), color.getGreen(), color.getBlue()); + + case Color::IndexType: + return color.getIndex(); + } + + ASSERT(false); + return -1; +} + } // namespace app diff --git a/src/app/ui/palette_view.h b/src/app/ui/palette_view.h index af48c97e4..305b5b169 100644 --- a/src/app/ui/palette_view.h +++ b/src/app/ui/palette_view.h @@ -39,7 +39,12 @@ namespace app { class PaletteView : public ui::Widget , public MarchingAnts { public: - PaletteView(bool editable, PaletteViewDelegate* delegate, int boxsize); + enum PaletteViewStyle { + SelectOneColor, + FgBgColors + }; + + PaletteView(bool editable, PaletteViewStyle style, PaletteViewDelegate* delegate, int boxsize); bool isEditable() const { return m_editable; } @@ -118,9 +123,11 @@ namespace app { bool pickedXY(const doc::PalettePicks& entries, int i, int dx, int dy) const; void updateCopyFlag(ui::Message* msg); void setCursor(); + int findExactIndex(const app::Color& color) const; State m_state; bool m_editable; + PaletteViewStyle m_style; PaletteViewDelegate* m_delegate; int m_columns; int m_boxsize;