From fde390ac73e4017d433ff60327cfe139c7504f62 Mon Sep 17 00:00:00 2001 From: elasota Date: Sun, 17 May 2020 19:50:34 -0400 Subject: [PATCH] Improve button chrome --- GpApp/DialogUtils.cpp | 2 +- PortabilityLayer/PLButtonWidget.cpp | 225 ++++++++++++++++++++++++++++ PortabilityLayer/SimpleGraphic.cpp | 4 +- PortabilityLayer/SimpleGraphic.h | 4 +- 4 files changed, 230 insertions(+), 5 deletions(-) diff --git a/GpApp/DialogUtils.cpp b/GpApp/DialogUtils.cpp index 19ab1c6..3973fb3 100644 --- a/GpApp/DialogUtils.cpp +++ b/GpApp/DialogUtils.cpp @@ -371,7 +371,7 @@ void DrawDefaultButton (Dialog *theDialog) for (int yOffset = -1; yOffset <= 1; yOffset++) { const Rect offsetRect = itemRect + Point::Create(xOffset, yOffset); - surface->FrameRoundRect(offsetRect, 8, 8); + surface->FrameRect(offsetRect); } } } diff --git a/PortabilityLayer/PLButtonWidget.cpp b/PortabilityLayer/PLButtonWidget.cpp index bfce40c..7ce52bb 100644 --- a/PortabilityLayer/PLButtonWidget.cpp +++ b/PortabilityLayer/PLButtonWidget.cpp @@ -3,6 +3,131 @@ #include "PLTimeTaggedVOSEvent.h" #include "PLStandardColors.h" #include "FontFamily.h" +#include "SimpleGraphic.h" + +static const int kLightGray = 238; +static const int kMidGray = 221; +static const int kDarkGray = 102; + +static const PortabilityLayer::RGBAColor gs_buttonTopLeftCornerGraphicPixels[] = +{ + { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, + { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, { kMidGray, kMidGray, kMidGray, 255 }, + { 0, 0, 0, 255 }, { kMidGray, kMidGray, kMidGray, 255 }, { 255, 255, 255, 255 } +}; + +static const PortabilityLayer::RGBAColor gs_buttonTopRightCornerGraphicPixels[] = +{ + { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, + { kMidGray, kMidGray, kMidGray, 255 }, { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, + { 255, 255, 255, 255 }, { kMidGray, kMidGray, kMidGray, 255 }, { 0, 0, 0, 255 } +}; + +static const PortabilityLayer::RGBAColor gs_buttonBottomLeftCornerGraphicPixels[] = +{ + { 0, 0, 0, 255 }, { kMidGray, kMidGray, kMidGray, 255 }, { 255, 255, 255, 255 }, + { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, { kMidGray, kMidGray, kMidGray, 255 }, + { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, { 0, 0, 0, 255 } +}; + +static const PortabilityLayer::RGBAColor gs_buttonBottomRightCornerGraphicPixels[] = +{ + { kMidGray, kMidGray, kMidGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, { 0, 0, 0, 255 }, + { kDarkGray, kDarkGray, kDarkGray, 255 }, { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, + { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, { 0, 0, 0, 255 } +}; + +// Pressed + +static const PortabilityLayer::RGBAColor gs_buttonPressedTopLeftCornerGraphicPixels[] = +{ + { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, + { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, + { 0, 0, 0, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 } +}; + +static const PortabilityLayer::RGBAColor gs_buttonPressedTopRightCornerGraphicPixels[] = +{ + { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, + { kDarkGray, kDarkGray, kDarkGray, 255 }, { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, + { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, { 0, 0, 0, 255 } +}; + +static const PortabilityLayer::RGBAColor gs_buttonPressedBottomLeftCornerGraphicPixels[] = +{ + { 0, 0, 0, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, + { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, + { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, { 0, 0, 0, 255 } +}; + +static const PortabilityLayer::RGBAColor gs_buttonPressedBottomRightCornerGraphicPixels[] = +{ + { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, { 0, 0, 0, 255 }, + { kDarkGray, kDarkGray, kDarkGray, 255 }, { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, + { 0, 0, 0, 255 }, { 0, 0, 0, 255 }, { 0, 0, 0, 255 } +}; + +// Disabled + +static const PortabilityLayer::RGBAColor gs_buttonDisabledTopLeftCornerGraphicPixels[] = +{ + { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, + { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, { kLightGray, kLightGray, kLightGray, 255 }, + { kDarkGray, kDarkGray, kDarkGray, 255 }, { kLightGray, kLightGray, kLightGray, 255 }, { kLightGray, kLightGray, kLightGray, 255 } +}; + +static const PortabilityLayer::RGBAColor gs_buttonDisabledTopRightCornerGraphicPixels[] = +{ + { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, + { kLightGray, kLightGray, kLightGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, + { kLightGray, kLightGray, kLightGray, 255 }, { kLightGray, kLightGray, kLightGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 } +}; + +static const PortabilityLayer::RGBAColor gs_buttonDisabledBottomLeftCornerGraphicPixels[] = +{ + { kDarkGray, kDarkGray, kDarkGray, 255 }, { kLightGray, kLightGray, kLightGray, 255 }, { kLightGray, kLightGray, kLightGray, 255 }, + { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, { kLightGray, kLightGray, kLightGray, 255 }, + { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 } +}; + +static const PortabilityLayer::RGBAColor gs_buttonDisabledBottomRightCornerGraphicPixels[] = +{ + { kLightGray, kLightGray, kLightGray, 255 }, { kLightGray, kLightGray, kLightGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, + { kLightGray, kLightGray, kLightGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, + { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 }, { kDarkGray, kDarkGray, kDarkGray, 255 } +}; + + + +static PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3> gs_buttonCornerGraphics[4] = +{ + PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3>(gs_buttonTopLeftCornerGraphicPixels), + PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3>(gs_buttonTopRightCornerGraphicPixels), + PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3>(gs_buttonBottomLeftCornerGraphicPixels), + PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3>(gs_buttonBottomRightCornerGraphicPixels), +}; + +static PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3> gs_buttonPressedCornerGraphics[4] = +{ + PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3>(gs_buttonPressedTopLeftCornerGraphicPixels), + PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3>(gs_buttonPressedTopRightCornerGraphicPixels), + PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3>(gs_buttonPressedBottomLeftCornerGraphicPixels), + PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3>(gs_buttonPressedBottomRightCornerGraphicPixels), +}; + +static PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3> gs_buttonDisabledCornerGraphics[4] = +{ + PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3>(gs_buttonDisabledTopLeftCornerGraphicPixels), + PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3>(gs_buttonDisabledTopRightCornerGraphicPixels), + PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3>(gs_buttonDisabledBottomLeftCornerGraphicPixels), + PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3>(gs_buttonDisabledBottomRightCornerGraphicPixels), +}; + +static const uint8_t gs_buttonTopLeftGraphicMask[] = { 0x2f, 0xff }; +static const uint8_t gs_buttonTopRightGraphicMask[] = { 0x9b, 0xff }; +static const uint8_t gs_buttonBottomLeftGraphicMask[] = { 0xec, 0xff }; +static const uint8_t gs_buttonBottomRightGraphicMask[] = { 0xfa, 0x7f }; + namespace PortabilityLayer { @@ -90,6 +215,103 @@ namespace PortabilityLayer void ButtonWidget::DrawControlInternal(DrawSurface *surface, bool inverted) { + const Rect rect = m_rect; + + PixMap **pixMap = surface->m_port.GetPixMap(); + + const PortabilityLayer::SimpleGraphicInstanceRGBA<3, 3> *cornerGraphics = nullptr; + + PortabilityLayer::RGBAColor leftStripeColors[2]; + PortabilityLayer::RGBAColor rightStripeColors[2]; + PortabilityLayer::RGBAColor topStripeColors[2]; + PortabilityLayer::RGBAColor bottomStripeColors[2]; + PortabilityLayer::RGBAColor centerColor; + PortabilityLayer::RGBAColor textColor; + PortabilityLayer::RGBAColor borderColor; + + if (!m_enabled) + { + cornerGraphics = gs_buttonDisabledCornerGraphics; + topStripeColors[0] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255); + topStripeColors[1] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255); + leftStripeColors[0] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255); + leftStripeColors[1] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255); + bottomStripeColors[0] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255); + bottomStripeColors[1] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255); + rightStripeColors[0] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255); + rightStripeColors[1] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255); + centerColor = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255); + textColor = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255); + borderColor = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255); + } + else if (inverted) + { + cornerGraphics = gs_buttonPressedCornerGraphics; + topStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255); + topStripeColors[1] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255); + leftStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255); + leftStripeColors[1] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255); + bottomStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255); + bottomStripeColors[1] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255); + rightStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255); + rightStripeColors[1] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255); + centerColor = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255); + textColor = StdColors::White(); + borderColor = StdColors::Black(); + } + else + { + cornerGraphics = gs_buttonCornerGraphics; + topStripeColors[0] = PortabilityLayer::RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255); + topStripeColors[1] = StdColors::White(); + leftStripeColors[0] = PortabilityLayer::RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255); + leftStripeColors[1] = StdColors::White(); + bottomStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255); + bottomStripeColors[1] = PortabilityLayer::RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255); + rightStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255); + rightStripeColors[1] = PortabilityLayer::RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255); + centerColor = PortabilityLayer::RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255); + textColor = StdColors::Black(); + borderColor = StdColors::Black(); + } + + + cornerGraphics[0].DrawToPixMapWithMask(pixMap, gs_buttonTopLeftGraphicMask, rect.left, rect.top); + cornerGraphics[1].DrawToPixMapWithMask(pixMap, gs_buttonTopRightGraphicMask, rect.right - 3, rect.top); + cornerGraphics[2].DrawToPixMapWithMask(pixMap, gs_buttonBottomLeftGraphicMask, rect.left, rect.bottom - 3); + cornerGraphics[3].DrawToPixMapWithMask(pixMap, gs_buttonBottomRightGraphicMask, rect.right - 3, rect.bottom - 3); + + for (int i = 0; i < 3; i++) + { + if (i == 0) + surface->SetForeColor(borderColor); + + if (i != 0) + surface->SetForeColor(leftStripeColors[i - 1]); + + surface->FillRect(Rect::Create(rect.top + 3, rect.left + i, rect.bottom - 3, rect.left + i + 1)); + + if (i != 0) + surface->SetForeColor(rightStripeColors[i - 1]); + + surface->FillRect(Rect::Create(rect.top + 3, rect.right - 1 - i, rect.bottom - 3, rect.right - i)); + + if (i != 0) + surface->SetForeColor(topStripeColors[i - 1]); + + surface->FillRect(Rect::Create(rect.top + i, rect.left + 3, rect.top + i + 1, rect.right - 3)); + + if (i != 0) + surface->SetForeColor(bottomStripeColors[i - 1]); + + surface->FillRect(Rect::Create(rect.bottom - 1 - i, rect.left + 3, rect.bottom - i, rect.right - 3)); + } + + surface->SetForeColor(centerColor); + surface->FillRect(rect.Inset(3, 3)); + + + /* surface->SetForeColor(inverted ? StdColors::Black() : StdColors::White()); surface->FillRect(this->m_rect.Inset(1, 1)); @@ -104,6 +326,9 @@ namespace PortabilityLayer surface->SetForeColor(inverted ? StdColors::White() : StdColors::Black()); else surface->SetForeColor(RGBAColor::Create(136, 136, 136, 255)); + */ + + surface->SetForeColor(textColor); surface->SetSystemFont(12, PortabilityLayer::FontFamilyFlag_Bold); int32_t x = (m_rect.left + m_rect.right - static_cast(surface->MeasureString(m_text.ToShortStr()))) / 2; diff --git a/PortabilityLayer/SimpleGraphic.cpp b/PortabilityLayer/SimpleGraphic.cpp index 153c6b0..86acc4b 100644 --- a/PortabilityLayer/SimpleGraphic.cpp +++ b/PortabilityLayer/SimpleGraphic.cpp @@ -29,12 +29,12 @@ namespace PortabilityLayer pixelData[i] = PortabilityLayer::StandardPalette::GetInstance()->GetColors()[standardPaletteData[i]]; } - void SimpleGraphic::DrawToPixMap(PixMap **pixMapH, int16_t x, int16_t y) + void SimpleGraphic::DrawToPixMap(PixMap **pixMapH, int16_t x, int16_t y) const { DrawToPixMapWithMask(pixMapH, nullptr, x, y); } - void SimpleGraphic::DrawToPixMapWithMask(PixMap **pixMapH, const uint8_t *maskData, int16_t x, int16_t y) + void SimpleGraphic::DrawToPixMapWithMask(PixMap **pixMapH, const uint8_t *maskData, int16_t x, int16_t y) const { if (!pixMapH) return; diff --git a/PortabilityLayer/SimpleGraphic.h b/PortabilityLayer/SimpleGraphic.h index 24683e7..39fb4ba 100644 --- a/PortabilityLayer/SimpleGraphic.h +++ b/PortabilityLayer/SimpleGraphic.h @@ -14,8 +14,8 @@ namespace PortabilityLayer const RGBAColor *m_pixelData; const uint8_t *m_standardPaletteData; - void DrawToPixMap(PixMap **pixMap, int16_t x, int16_t y); - void DrawToPixMapWithMask(PixMap **pixMap, const uint8_t *maskData, int16_t x, int16_t y); + void DrawToPixMap(PixMap **pixMap, int16_t x, int16_t y) const; + void DrawToPixMapWithMask(PixMap **pixMap, const uint8_t *maskData, int16_t x, int16_t y) const; protected: SimpleGraphic(unsigned int width, unsigned int height, const RGBAColor *pixelData, uint8_t *standardPaletteData);