From 598e50be1de20b4a18a36fe24703718b9418a28f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Capello?= Date: Wed, 30 Nov 2022 16:29:44 -0300 Subject: [PATCH 01/31] Fix brush icon scale for brush size button when guiscale is greater than 1 --- src/app/ui/brush_popup.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/ui/brush_popup.cpp b/src/app/ui/brush_popup.cpp index 62e0c543d..f24318f3c 100644 --- a/src/app/ui/brush_popup.cpp +++ b/src/app/ui/brush_popup.cpp @@ -493,6 +493,8 @@ os::SurfaceRef BrushPopup::createSurfaceForBrush(const BrushRef& origBrush, if (image->pixelFormat() == IMAGE_BITMAP) delete palette; + + surface->applyScale(guiscale()); } else { surface->clear(); From 11dc816878461979bdbe6a98e4fd6bb08d07bfd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Capello?= Date: Wed, 30 Nov 2022 16:46:40 -0300 Subject: [PATCH 02/31] Add "capture" state to style layer states --- src/app/ui/skin/skin_theme.cpp | 1 + src/ui/style.h | 1 + src/ui/theme.cpp | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/app/ui/skin/skin_theme.cpp b/src/app/ui/skin/skin_theme.cpp index d0e1f9c9f..accd31370 100644 --- a/src/app/ui/skin/skin_theme.cpp +++ b/src/app/ui/skin/skin_theme.cpp @@ -666,6 +666,7 @@ void SkinTheme::loadXml(BackwardCompatibility* backward) if (state.find("selected") != std::string::npos) flags |= ui::Style::Layer::kSelected; if (state.find("focus") != std::string::npos) flags |= ui::Style::Layer::kFocus; if (state.find("mouse") != std::string::npos) flags |= ui::Style::Layer::kMouse; + if (state.find("capture") != std::string::npos) flags |= ui::Style::Layer::kCapture; layer.setFlags(flags); } diff --git a/src/ui/style.h b/src/ui/style.h index 441488089..d93c6bae5 100644 --- a/src/ui/style.h +++ b/src/ui/style.h @@ -48,6 +48,7 @@ namespace ui { kFocus = 2, kSelected = 4, kDisabled = 8, + kCapture = 16 }; Layer() diff --git a/src/ui/theme.cpp b/src/ui/theme.cpp index 1e057388a..861686cdd 100644 --- a/src/ui/theme.cpp +++ b/src/ui/theme.cpp @@ -123,7 +123,8 @@ int PaintWidgetPartInfo::getStyleFlagsForWidget(const Widget* widget) (widget->isEnabled() ? 0: Style::Layer::kDisabled) | (widget->isSelected() ? Style::Layer::kSelected: 0) | (widget->hasMouse() ? Style::Layer::kMouse: 0) | - (widget->hasFocus() ? Style::Layer::kFocus: 0); + (widget->hasFocus() ? Style::Layer::kFocus: 0) | + (widget->hasCapture() ? Style::Layer::kCapture: 0); } Theme::Theme() From 195a8d0e92cdd0f852e0da18c077c6b31c0cf2f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Capello?= Date: Fri, 2 Dec 2022 11:15:56 -0300 Subject: [PATCH 03/31] Fix border, margin, and padding attributes inheritance --- src/app/ui/skin/skin_theme.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/ui/skin/skin_theme.cpp b/src/app/ui/skin/skin_theme.cpp index accd31370..911edcedc 100644 --- a/src/app/ui/skin/skin_theme.cpp +++ b/src/app/ui/skin/skin_theme.cpp @@ -582,7 +582,7 @@ void SkinTheme::loadXml(BackwardCompatibility* backward) const char* t = xmlStyle->Attribute("margin-top"); const char* r = xmlStyle->Attribute("margin-right"); const char* b = xmlStyle->Attribute("margin-bottom"); - gfx::Border margin = ui::Style::UndefinedBorder(); + gfx::Border margin = style->margin(); if (m || l) margin.left(scale*std::strtol(l ? l: m, nullptr, 10)); if (m || t) margin.top(scale*std::strtol(t ? t: m, nullptr, 10)); if (m || r) margin.right(scale*std::strtol(r ? r: m, nullptr, 10)); @@ -597,7 +597,7 @@ void SkinTheme::loadXml(BackwardCompatibility* backward) const char* t = xmlStyle->Attribute("border-top"); const char* r = xmlStyle->Attribute("border-right"); const char* b = xmlStyle->Attribute("border-bottom"); - gfx::Border border = ui::Style::UndefinedBorder(); + gfx::Border border = style->border(); if (m || l) border.left(scale*std::strtol(l ? l: m, nullptr, 10)); if (m || t) border.top(scale*std::strtol(t ? t: m, nullptr, 10)); if (m || r) border.right(scale*std::strtol(r ? r: m, nullptr, 10)); @@ -612,7 +612,7 @@ void SkinTheme::loadXml(BackwardCompatibility* backward) const char* t = xmlStyle->Attribute("padding-top"); const char* r = xmlStyle->Attribute("padding-right"); const char* b = xmlStyle->Attribute("padding-bottom"); - gfx::Border padding = ui::Style::UndefinedBorder(); + gfx::Border padding = style->padding(); if (m || l) padding.left(scale*std::strtol(l ? l: m, nullptr, 10)); if (m || t) padding.top(scale*std::strtol(t ? t: m, nullptr, 10)); if (m || r) padding.right(scale*std::strtol(r ? r: m, nullptr, 10)); From dded1f6eae97cd14efff47efa9745b34bf246708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Capello?= Date: Fri, 2 Dec 2022 15:13:45 -0300 Subject: [PATCH 04/31] Add mnemonics attribute for font and styles to enable/disable accelerators underlining --- data/extensions/aseprite-theme/theme.xml | 2 +- src/app/ui/skin/skin_theme.cpp | 17 ++++++++++++++--- src/app/ui/skin/skin_theme.h | 13 ++++++++++++- src/ui/style.cpp | 1 + src/ui/style.h | 3 +++ src/ui/theme.cpp | 2 +- 6 files changed, 32 insertions(+), 6 deletions(-) diff --git a/data/extensions/aseprite-theme/theme.xml b/data/extensions/aseprite-theme/theme.xml index de277a9ee..d9f664434 100644 --- a/data/extensions/aseprite-theme/theme.xml +++ b/data/extensions/aseprite-theme/theme.xml @@ -6,7 +6,7 @@ - + diff --git a/src/app/ui/skin/skin_theme.cpp b/src/app/ui/skin/skin_theme.cpp index 911edcedc..0b5658b25 100644 --- a/src/app/ui/skin/skin_theme.cpp +++ b/src/app/ui/skin/skin_theme.cpp @@ -409,8 +409,11 @@ void SkinTheme::loadXml(BackwardCompatibility* backward) if (sizeStr) size = std::strtol(sizeStr, nullptr, 10); + const char* mnemonicsStr = xmlFont->Attribute("mnemonics"); + bool mnemonics = mnemonicsStr ? (std::string(mnemonicsStr) != "off") : true; + os::FontRef font = fontData->getFont(size); - m_themeFonts[idStr] = font; + m_themeFonts[idStr] = ThemeFont(font, mnemonics); if (id == "default") m_defaultFont = font; @@ -624,8 +627,16 @@ void SkinTheme::loadXml(BackwardCompatibility* backward) { const char* fontId = xmlStyle->Attribute("font"); if (fontId) { - os::FontRef font = m_themeFonts[fontId]; - style->setFont(font); + auto themeFont = m_themeFonts[fontId]; + style->setFont(themeFont.font()); + style->setMnemonics(themeFont.mnemonics()); + } + + // Override mnemonics value if it is defined for this style. + const char* mnemonicsStr = xmlStyle->Attribute("mnemonics"); + if (mnemonicsStr) { + bool mnemonics = mnemonicsStr ? (std::string(mnemonicsStr) != "off") : true; + style->setMnemonics(mnemonics); } } diff --git a/src/app/ui/skin/skin_theme.h b/src/app/ui/skin/skin_theme.h index 5a21f2a65..48e7edb77 100644 --- a/src/app/ui/skin/skin_theme.h +++ b/src/app/ui/skin/skin_theme.h @@ -34,6 +34,17 @@ namespace app { class FontData; + class ThemeFont { + public: + ThemeFont() {} + ThemeFont(os::FontRef font, bool mnemonics) : m_font(font), m_mnemonics(mnemonics) {} + os::FontRef font() { return m_font; } + bool mnemonics() { return m_mnemonics; } + private: + os::FontRef m_font; + bool m_mnemonics; + }; + // This is the GUI theme used by Aseprite (which use images from // data/skins directory). class SkinTheme : public ui::Theme @@ -161,7 +172,7 @@ namespace app { std::array m_standardCursors; std::map m_styles; std::map m_fonts; - std::map m_themeFonts; + std::map m_themeFonts; os::FontRef m_defaultFont; os::FontRef m_miniFont; int m_preferredScreenScaling; diff --git a/src/ui/style.cpp b/src/ui/style.cpp index 583922579..e2b73b516 100644 --- a/src/ui/style.cpp +++ b/src/ui/style.cpp @@ -27,6 +27,7 @@ Style::Style(const Style* base) , m_border(base ? base->border(): Style::UndefinedBorder()) , m_padding(base ? base->padding(): Style::UndefinedBorder()) , m_font(nullptr) + , m_mnemonics(base ? base->mnemonics() : true) { if (base) m_layers = base->layers(); diff --git a/src/ui/style.h b/src/ui/style.h index d93c6bae5..64deada9e 100644 --- a/src/ui/style.h +++ b/src/ui/style.h @@ -105,6 +105,7 @@ namespace ui { const gfx::Border& border() const { return m_border; } const gfx::Border& padding() const { return m_padding; } os::Font* font() const { return m_font.get(); } + const bool mnemonics() const { return m_mnemonics; } const Layers& layers() const { return m_layers; } Layers& layers() { return m_layers; } @@ -113,6 +114,7 @@ namespace ui { void setBorder(const gfx::Border& value) { m_border = value; } void setPadding(const gfx::Border& value) { m_padding = value; } void setFont(const os::FontRef& font); + void setMnemonics(const bool enabled) { m_mnemonics = enabled; } void addLayer(const Layer& layer); private: @@ -123,6 +125,7 @@ namespace ui { gfx::Border m_border; gfx::Border m_padding; os::FontRef m_font; + bool m_mnemonics; }; } // namespace ui diff --git a/src/ui/theme.cpp b/src/ui/theme.cpp index 861686cdd..6978a296a 100644 --- a/src/ui/theme.cpp +++ b/src/ui/theme.cpp @@ -464,7 +464,7 @@ void Theme::paintLayer(Graphics* g, g->drawUIText(text, layer.color(), bgColor, - pt, mnemonic); + pt, style->mnemonics() ? mnemonic : 0); } if (style->font()) From e002316466b0886da3c21147692d216436501c8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Capello?= Date: Mon, 5 Dec 2022 17:51:07 -0300 Subject: [PATCH 05/31] Take into account padding when painting text and icon layers --- data/extensions/aseprite-theme/theme.xml | 2 +- src/ui/theme.cpp | 36 ++++++++++++++++-------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/data/extensions/aseprite-theme/theme.xml b/data/extensions/aseprite-theme/theme.xml index d9f664434..b84421616 100644 --- a/data/extensions/aseprite-theme/theme.xml +++ b/data/extensions/aseprite-theme/theme.xml @@ -1008,7 +1008,7 @@ - + + + diff --git a/src/app/ui/button_set.cpp b/src/app/ui/button_set.cpp index d72dd2c41..4ca294f40 100644 --- a/src/app/ui/button_set.cpp +++ b/src/app/ui/button_set.cpp @@ -48,22 +48,15 @@ WidgetType buttonset_item_type() ButtonSet::Item::Item() : Widget(buttonset_item_type()) , m_icon(NULL) - , m_hotColor(gfx::ColorNone) { setup_mini_font(this); setAlign(CENTER | MIDDLE); setFocusStop(true); } -void ButtonSet::Item::setHotColor(gfx::Color color) -{ - m_hotColor = color; -} - -void ButtonSet::Item::setIcon(const SkinPartPtr& icon, bool mono) +void ButtonSet::Item::setIcon(const SkinPartPtr& icon) { m_icon = icon; - m_mono = mono; invalidate(); } @@ -74,97 +67,17 @@ ButtonSet* ButtonSet::Item::buttonSet() void ButtonSet::Item::onPaint(ui::PaintEvent& ev) { - auto theme = SkinTheme::get(this); - Graphics* g = ev.graphics(); - gfx::Rect rc = clientBounds(); - gfx::Color fg; - SkinPartPtr nw; - gfx::Rect boxRc, textRc, iconRc; - gfx::Size iconSize; - if (m_icon) - iconSize = m_icon->size(); + if (style()) { + gfx::Rect rc = clientBounds(); + Grid::Info info = buttonSet()->getChildInfo(this); + bool isLastCol = (info.col + info.hspan >= info.grid_cols); + bool isLastRow = (info.row + info.vspan >= info.grid_rows); + // When gaps are negative we need to compensate client bounds size so the painting is based on a + // complete button, and not just the part not overlapped. + if (buttonSet()->m_colgap < 0 && !isLastCol) rc.w -= buttonSet()->m_colgap; + if (buttonSet()->m_rowgap < 0 && !isLastRow) rc.h -= buttonSet()->m_rowgap; - getTextIconInfo( - &boxRc, &textRc, &iconRc, - CENTER | (hasText() ? BOTTOM: MIDDLE), - iconSize.w, iconSize.h); - - Grid::Info info = buttonSet()->getChildInfo(this); - bool isLastCol = (info.col+info.hspan >= info.grid_cols); - bool isLastRow = (info.row+info.vspan >= info.grid_rows); - - if (m_icon || isLastRow) { - textRc.y -= 2*guiscale(); - iconRc.y -= 1*guiscale(); - if (isLastRow && info.row > 0) iconRc.y -= 2*guiscale(); - } - - if (!gfx::is_transparent(bgColor())) - g->fillRect(bgColor(), g->getClipBounds()); - - if (isSelected() || hasMouseOver()) { - if (hasCapture()) { - nw = theme->parts.buttonsetItemPushed(); - fg = theme->colors.buttonSelectedText(); - } - else { - nw = (hasFocus() ? theme->parts.buttonsetItemHotFocused(): - theme->parts.buttonsetItemHot()); - fg = theme->colors.buttonHotText(); - } - } - else { - nw = (hasFocus() ? theme->parts.buttonsetItemFocused(): - theme->parts.buttonsetItemNormal()); - fg = theme->colors.buttonNormalText(); - } - - if (!isLastCol) - rc.w += 1*guiscale(); - - if (!isLastRow) { - if (nw == theme->parts.buttonsetItemHotFocused()) - rc.h += 2*guiscale(); - else - rc.h += 3*guiscale(); - } - - theme->drawRect(g, rc, nw.get(), - gfx::is_transparent(m_hotColor)); - - if (!gfx::is_transparent(m_hotColor)) { - gfx::Rect rc2(rc); - gfx::Rect sprite(nw->spriteBounds()); - gfx::Rect slices(nw->slicesBounds()); - rc2.shrink( - gfx::Border( - slices.x-1, // TODO this "-1" is an ugly hack for the pal edit - // button, replace all this with styles - slices.y-1, - sprite.w-slices.w-slices.x-1, - sprite.h-slices.h-slices.y)); - g->fillRect(m_hotColor, rc2); - } - - if (m_icon) { - os::Surface* bmp = m_icon->bitmap(0); - - if (!isEnabled()) - g->drawColoredRgbaSurface(bmp, theme->colors.disabled(), - iconRc.x, iconRc.y); - else if (isSelected() && hasCapture()) - g->drawColoredRgbaSurface(bmp, theme->colors.buttonSelectedText(), - iconRc.x, iconRc.y); - else if (m_mono) - g->drawColoredRgbaSurface(bmp, theme->colors.buttonNormalText(), - iconRc.x, iconRc.y); - else - g->drawRgbaSurface(bmp, iconRc.x, iconRc.y); - } - - if (hasText()) { - g->setFont(AddRef(font())); - g->drawUIText(text(), fg, gfx::ColorNone, textRc.origin(), 0); + theme()->paintWidget(ev.graphics(), this, style(), rc); } } @@ -195,6 +108,7 @@ bool ButtonSet::Item::onProcessMessage(ui::Message* msg) break; case ui::kMouseDownMessage: + if (!isEnabled()) return true; // Only for single-item and trigerred on mouse up ButtonSets: We // save the current selected item to restore it just in case the // user leaves the ButtonSet without releasing the mouse button @@ -259,38 +173,13 @@ bool ButtonSet::Item::onProcessMessage(ui::Message* msg) case ui::kMouseLeaveMessage: case ui::kMouseEnterMessage: + if (!isEnabled()) return true; invalidate(); break; } return Widget::onProcessMessage(msg); } -void ButtonSet::Item::onSizeHint(ui::SizeHintEvent& ev) -{ - gfx::Size iconSize; - if (m_icon) { - iconSize = m_icon->size(); - iconSize.w = std::max(iconSize.w, 16*guiscale()); - iconSize.h = std::max(iconSize.h, 16*guiscale()); - } - - gfx::Rect boxRc; - getTextIconInfo( - &boxRc, NULL, NULL, - CENTER | (hasText() ? BOTTOM: MIDDLE), - iconSize.w, iconSize.h); - - gfx::Size sz = boxRc.size(); - if (hasText()) - sz += 8*guiscale(); - - Grid::Info info = buttonSet()->getChildInfo(this); - if (info.row == info.grid_rows-1) - sz.h += 3*guiscale(); - - ev.setSizeHint(sz); -} - void ButtonSet::Item::onClick() { buttonSet()->onItemChange(this); @@ -310,28 +199,66 @@ ButtonSet::ButtonSet(int columns) InitTheme.connect( [this]{ noBorderNoChildSpacing(); + // Set default buttonset style if it wasn't already set. + if (style() == SkinTheme::instance()->styles.grid()) { + setStyle(SkinTheme::instance()->styles.buttonset()); + } }); initTheme(); } -ButtonSet::Item* ButtonSet::addItem(const std::string& text, int hspan, int vspan) +ButtonSet::Item* ButtonSet::addItem(const std::string& text, const char* styleId) +{ + return addItem(text, 1, 1, styleId); +} + +ButtonSet::Item* ButtonSet::addItem(const std::string& text, int hspan, int vspan, const char* styleId) { Item* item = new Item(); item->setText(text); - addItem(item, hspan, vspan); + addItem(item, hspan, vspan, styleId); return item; } -ButtonSet::Item* ButtonSet::addItem(const skin::SkinPartPtr& icon, int hspan, int vspan) +ButtonSet::Item* ButtonSet::addItem(const skin::SkinPartPtr& icon, const char* styleId) +{ + return addItem(icon, 1, 1, styleId); +} + +ButtonSet::Item* ButtonSet::addItem(const skin::SkinPartPtr& icon, int hspan, int vspan, const char* styleId) { Item* item = new Item(); item->setIcon(icon); - addItem(item, hspan, vspan); + addItem(item, hspan, vspan, styleId); return item; } - -ButtonSet::Item* ButtonSet::addItem(Item* item, int hspan, int vspan) +ButtonSet::Item* ButtonSet::addItem(Item* item, const char* styleId) { + return addItem(item, 1, 1, styleId); +} + +ButtonSet::Item* ButtonSet::addItem(Item* item, int hspan, int vspan, const char* styleId) +{ + item->InitTheme.connect( + [item, styleId] { + ui::Style* style; + if (styleId) { + auto theme = SkinTheme::get(item); + style = theme->getStyleById(styleId); + if (!style) + throw base::Exception("Style %s not found", styleId); + } + else { + style = SkinTheme::instance()->styles.buttonsetItemIcon(); + if (!item->text().empty()) { + style = item->icon() ? SkinTheme::instance()->styles.buttonsetItemTextTopIconBottom() : + SkinTheme::instance()->styles.buttonsetItemText(); + } + } + + item->setStyle(style); + } + ); addChildInCell(item, hspan, vspan, HORIZONTAL | VERTICAL); return item; } diff --git a/src/app/ui/button_set.h b/src/app/ui/button_set.h index baf929654..98f3786ed 100644 --- a/src/app/ui/button_set.h +++ b/src/app/ui/button_set.h @@ -23,22 +23,17 @@ namespace app { class Item : public ui::Widget, public ui::Style::Layer::IconSurfaceProvider { public: Item(); - void setHotColor(gfx::Color color); - void setIcon(const skin::SkinPartPtr& icon, bool mono = false); - void setMono(const bool mono) { m_mono = mono; } + void setIcon(const skin::SkinPartPtr& icon); os::Surface* iconSurface() const override { return m_icon ? m_icon->bitmap(0) : nullptr; } skin::SkinPartPtr icon() const { return m_icon; } ButtonSet* buttonSet(); protected: void onPaint(ui::PaintEvent& ev) override; bool onProcessMessage(ui::Message* msg) override; - void onSizeHint(ui::SizeHintEvent& ev) override; virtual void onClick(); virtual void onRightClick(); private: skin::SkinPartPtr m_icon; - bool m_mono; - gfx::Color m_hotColor; }; enum class MultiMode { @@ -49,9 +44,12 @@ namespace app { ButtonSet(int columns); - 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* addItem(const std::string& text, const char* styleId); + Item* addItem(const std::string& text, int hspan = 1, int vspan = 1, const char* styleId = nullptr); + Item* addItem(const skin::SkinPartPtr& icon, const char* styleId); + Item* addItem(const skin::SkinPartPtr& icon, int hspan = 1, int vspan = 1, const char* styleId = nullptr); + Item* addItem(Item* item, const char* styleId); + Item* addItem(Item* item, int hspan = 1, int vspan = 1, const char* styleId = nullptr); Item* getItem(int index); int getItemIndex(const Item* item) const; From cc3c421391a56ed78f129cc58c796f934e445a4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Capello?= Date: Thu, 15 Dec 2022 16:06:19 -0300 Subject: [PATCH 11/31] Initialize theme for HueSaturationWindow --- src/app/commands/filters/cmd_hue_saturation.cpp | 1 + src/app/ui/color_sliders.cpp | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/app/commands/filters/cmd_hue_saturation.cpp b/src/app/commands/filters/cmd_hue_saturation.cpp index d2c740dd9..c90059ba4 100644 --- a/src/app/commands/filters/cmd_hue_saturation.cpp +++ b/src/app/commands/filters/cmd_hue_saturation.cpp @@ -80,6 +80,7 @@ public: m_sliders.setMode(ColorSliders::Mode::Relative); m_sliders.ColorChange.connect([this]{ onChangeControls(); }); + initTheme(); onChangeMode(); } diff --git a/src/app/ui/color_sliders.cpp b/src/app/ui/color_sliders.cpp index 7bec9ac41..48c779bc9 100644 --- a/src/app/ui/color_sliders.cpp +++ b/src/app/ui/color_sliders.cpp @@ -241,7 +241,6 @@ ColorSliders::ColorSliders() , m_color(app::Color::fromMask()) { addChild(&m_grid); - m_grid.setChildSpacing(0); // Same order as in Channel enum static_assert(Channel::Red == (Channel)0, ""); @@ -258,6 +257,12 @@ ColorSliders::ColorSliders() addSlider(Channel::Gray, "V", 0, 255, -100, 100); addSlider(Channel::Alpha, "A", 0, 255, -100, 100); + InitTheme.connect( + [this] { + m_grid.setChildSpacing(0); + } + ); + m_appConn = App::instance() ->ColorSpaceChange.connect([this]{ invalidate(); }); } From ea43c5f6c81001efdf19390561f3affa72780fe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Capello?= Date: Fri, 16 Dec 2022 17:59:08 -0300 Subject: [PATCH 12/31] Adjust styles to make them work with the new buttonset --- data/extensions/aseprite-theme/sheet.png | Bin 15973 -> 15980 bytes data/extensions/aseprite-theme/theme.xml | 97 ++++++++++++++---- data/widgets/canvas_size.xml | 18 ++-- data/widgets/debugger.xml | 8 +- data/widgets/dynamics.xml | 12 +-- data/widgets/keyboard_shortcuts.xml | 8 ++ data/widgets/new_sprite.xml | 12 +-- data/widgets/outline.xml | 18 ++-- src/app/commands/cmd_canvas_size.cpp | 1 - src/app/commands/cmd_new_file.cpp | 1 - .../filters/filter_target_buttons.cpp | 1 + src/app/ui/brush_popup.cpp | 12 +-- src/app/ui/color_bar.cpp | 45 +++++--- src/app/ui/context_bar.cpp | 53 +++++----- src/app/ui/selection_mode_field.cpp | 8 +- 15 files changed, 187 insertions(+), 107 deletions(-) diff --git a/data/extensions/aseprite-theme/sheet.png b/data/extensions/aseprite-theme/sheet.png index 0f85aeb4c83f76e781b65001715b6dced69deba9..b16b901ff92e0adf5a5b0c90df7fa20c9c82f54a 100644 GIT binary patch delta 15108 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 CrP0a& delta 15101 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 diff --git a/data/extensions/aseprite-theme/theme.xml b/data/extensions/aseprite-theme/theme.xml index 08ce5d1bc..9dad65d66 100644 --- a/data/extensions/aseprite-theme/theme.xml +++ b/data/extensions/aseprite-theme/theme.xml @@ -27,7 +27,7 @@ - + @@ -203,11 +203,11 @@ - - - - - + + + + + @@ -421,10 +421,10 @@ - - - - + + + + @@ -608,7 +608,7 @@ - - - - - @@ -752,7 +752,7 @@ + + + + + + + + + + - - - + - diff --git a/src/app/ui/color_bar.cpp b/src/app/ui/color_bar.cpp index 29d157560..67dd48cb3 100644 --- a/src/app/ui/color_bar.cpp +++ b/src/app/ui/color_bar.cpp @@ -190,8 +190,8 @@ ColorBar::ColorBar(int align, TooltipManager* tooltipManager) item->InitTheme.connect( [this, item](){ auto style = - (m_editMode ? SkinTheme::instance()->styles.palEditButtonUnlock() : - SkinTheme::instance()->styles.palEditButtonLock()); + (m_editMode ? SkinTheme::instance()->styles.palEditUnlock() : + SkinTheme::instance()->styles.palEditLock()); item->setStyle(style); }); m_buttons.addItem(theme->parts.palSort(), "pal_button"); From 05dcf9633356c235009c537e6d76d105e5b8ed50 Mon Sep 17 00:00:00 2001 From: David Capello Date: Mon, 27 Feb 2023 19:05:26 -0300 Subject: [PATCH 26/31] Fix style for RGBA/Grayscale/etc. buttons + Edit Pal/Tiles mode buttonsets We cannot use the fix from 6e2b44c72d811adf87fdfb4731f748266e6a2102 as they contain different slice borders depending on the state (and that generated moving labels/icons in RGBA/Grayscale/Indexed buttons when we hover the mouse on them), so we had to revert it and use a new "buttonset_item_active" theme part to set the background of Edit Pal/Tiles. --- data/extensions/aseprite-theme/sheet.png | Bin 15980 -> 16126 bytes data/extensions/aseprite-theme/theme.xml | 20 ++++++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/data/extensions/aseprite-theme/sheet.png b/data/extensions/aseprite-theme/sheet.png index b16b901ff92e0adf5a5b0c90df7fa20c9c82f54a..d32ef086ac66ba6707992b74751eeb92a10019c6 100644 GIT binary patch delta 15964 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 diff --git a/data/extensions/aseprite-theme/theme.xml b/data/extensions/aseprite-theme/theme.xml index db3f3875c..805784f87 100644 --- a/data/extensions/aseprite-theme/theme.xml +++ b/data/extensions/aseprite-theme/theme.xml @@ -109,7 +109,6 @@ - @@ -203,11 +202,12 @@ - + + @@ -1082,7 +1082,13 @@ @@ -1092,7 +1098,13 @@ From 21a63b9fdf48316930c2ee1532d4b713727cedf0 Mon Sep 17 00:00:00 2001 From: David Capello Date: Mon, 27 Feb 2023 19:18:25 -0300 Subject: [PATCH 27/31] Minor change in formatting of conditional ternary operator --- src/ui/grid.cpp | 8 ++++---- src/ui/grid.h | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ui/grid.cpp b/src/ui/grid.cpp index 180f2a3b3..a51b79bdb 100644 --- a/src/ui/grid.cpp +++ b/src/ui/grid.cpp @@ -1,5 +1,5 @@ // Aseprite UI Library -// Copyright (C) 2018-2020 Igara Studio S.A. +// Copyright (C) 2018-2023 Igara Studio S.A. // Copyright (C) 2001-2017 David Capello // // This file is released under the terms of the MIT license. @@ -230,7 +230,7 @@ void Grid::onSizeHint(SizeHintEvent& ev) void Grid::sumStripSize(const std::vector& strip, int& size) { int i, j; - int gap = &strip == &m_colstrip ? m_colgap : m_rowgap; + int gap = (&strip == &m_colstrip ? m_colgap: m_rowgap); size = 0; for (i=j=0; i<(int)strip.size(); ++i) { @@ -245,7 +245,7 @@ void Grid::sumStripSize(const std::vector& strip, int& size) void Grid::calculateCellSize(int start, int span, const std::vector& strip, int& size) { int i, j; - int gap = &strip == &m_colstrip ? m_colgap : m_rowgap; + int gap = (&strip == &m_colstrip ? m_colgap: m_rowgap); size = 0; @@ -418,7 +418,7 @@ void Grid::distributeStripSize(std::vector& colstrip, int rect_size, int border_size, bool same_width) { int i, j; - int gap = &colstrip == &m_colstrip ? m_colgap : m_rowgap; + int gap = (&colstrip == &m_colstrip ? m_colgap: m_rowgap); int max_expand_count = 0; for (i=0; i<(int)colstrip.size(); ++i) diff --git a/src/ui/grid.h b/src/ui/grid.h index 4ef3967e1..d28f86505 100644 --- a/src/ui/grid.h +++ b/src/ui/grid.h @@ -1,4 +1,5 @@ // Aseprite UI Library +// Copyright (C) 2023 Igara Studio S.A. // Copyright (C) 2001-2017 David Capello // // This file is released under the terms of the MIT license. From c9470472afbb28a474bbbca8a6b1c5cd6a5f483b Mon Sep 17 00:00:00 2001 From: David Capello Date: Mon, 27 Feb 2023 19:21:02 -0300 Subject: [PATCH 28/31] Don't use string literal in lambda inside ButtonSet::addItem() --- src/app/ui/button_set.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/app/ui/button_set.cpp b/src/app/ui/button_set.cpp index 0818f5aca..361fef8a8 100644 --- a/src/app/ui/button_set.cpp +++ b/src/app/ui/button_set.cpp @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2018-2022 Igara Studio S.A. +// Copyright (C) 2018-2023 Igara Studio S.A. // Copyright (C) 2001-2017 David Capello // // This program is distributed under the terms of @@ -13,6 +13,7 @@ #include "app/modules/gui.h" #include "app/ui/skin/skin_theme.h" +#include "fmt/format.h" #include "gfx/color.h" #include "os/surface.h" #include "ui/box.h" @@ -237,25 +238,26 @@ ButtonSet::Item* ButtonSet::addItem(Item* item, const char* styleId) return addItem(item, 1, 1, styleId); } -ButtonSet::Item* ButtonSet::addItem(Item* item, int hspan, int vspan, const char* styleId) +ButtonSet::Item* ButtonSet::addItem(Item* item, int hspan, int vspan, const char* styleIdStr) { - // TODO warning, here we're saving a copy of the styleId pointer, - // which if it's not a literal that lives enough for this - // lambda, it will crash the program + std::string styleId; + if (styleIdStr) + styleId = styleIdStr; + item->InitTheme.connect( [item, styleId] { + auto theme = SkinTheme::get(item); ui::Style* style; - if (styleId) { - auto theme = SkinTheme::get(item); + if (!styleId.empty()) { style = theme->getStyleById(styleId); if (!style) - throw base::Exception("Style %s not found", styleId); + throw base::Exception(fmt::format("Style {} not found", styleId)); } else { - style = SkinTheme::instance()->styles.buttonsetItemIcon(); + style = theme->styles.buttonsetItemIcon(); if (!item->text().empty()) { - style = item->icon() ? SkinTheme::instance()->styles.buttonsetItemTextTopIconBottom() : - SkinTheme::instance()->styles.buttonsetItemText(); + style = (item->icon() ? theme->styles.buttonsetItemTextTopIconBottom() : + theme->styles.buttonsetItemText()); } } From 606fea4214efaaf20a5184d1db820a2019995014 Mon Sep 17 00:00:00 2001 From: David Capello Date: Mon, 27 Feb 2023 19:21:57 -0300 Subject: [PATCH 29/31] Make buttons to select one window/multiple windows bigger --- data/extensions/aseprite-theme/theme.xml | 1 + data/widgets/options.xml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/data/extensions/aseprite-theme/theme.xml b/data/extensions/aseprite-theme/theme.xml index 805784f87..3fbffdf72 100644 --- a/data/extensions/aseprite-theme/theme.xml +++ b/data/extensions/aseprite-theme/theme.xml @@ -1111,5 +1111,6 @@ - - - - - @@ -1018,10 +1018,109 @@ - + + + + + + + + + + + +