From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/Plugins/Library/ml_devices/widgetStyle.cpp | 261 +++++++++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 Src/Plugins/Library/ml_devices/widgetStyle.cpp (limited to 'Src/Plugins/Library/ml_devices/widgetStyle.cpp') diff --git a/Src/Plugins/Library/ml_devices/widgetStyle.cpp b/Src/Plugins/Library/ml_devices/widgetStyle.cpp new file mode 100644 index 00000000..1e72ec06 --- /dev/null +++ b/Src/Plugins/Library/ml_devices/widgetStyle.cpp @@ -0,0 +1,261 @@ +#include "main.h" +#include "./widgetStyle.h" + +static void +WidgetStyle_DeleteGdiObject(UINT flags, UINT flagsMask, HGDIOBJ object) +{ + if (NULL != object && 0 != (flagsMask & flags)) + DeleteObject(object); +} + + +static BOOL +WidgetStyle_SetBrushInt(HBRUSH *brush, WidgetStyleFlags *flags, WidgetStyleFlags flagsMask, + HBRUSH sourceBrush, WidgetStyleAssignFlags assignFlags) +{ + LOGBRUSH lb; + + WidgetStyle_DeleteGdiObject(*flags, flagsMask, *brush); + + if (0 == (WIDGETSTYLE_COPY_OBJECT & assignFlags)) + { + if (0 == (WIDGETSTYLE_OWN_OBJECT & assignFlags)) + *flags &= ~flagsMask; + else + *flags |= flagsMask; + + *brush = sourceBrush; + return TRUE; + } + + + *brush = (sizeof(lb) == GetObjectW(sourceBrush, sizeof(lb), &lb)) ? + CreateBrushIndirect(&lb) : NULL; + + if (NULL == *brush) + { + *flags &= ~flagsMask; + return FALSE; + } + + *flags |= flagsMask; + return TRUE; +} + +static BOOL +WidgetStyle_SetFontInt(HFONT *font, WidgetStyleFlags *flags, WidgetStyleFlags flagsMask, + HFONT sourceFont, WidgetStyleAssignFlags assignFlags) +{ + LOGFONTW lf = {0}; + WidgetStyle_DeleteGdiObject(*flags, flagsMask, *font); + + if (0 == (WIDGETSTYLE_COPY_OBJECT & assignFlags)) + { + if (0 == (WIDGETSTYLE_OWN_OBJECT & assignFlags)) + *flags &= ~flagsMask; + else + *flags |= flagsMask; + + *font = sourceFont; + return TRUE; + } + + *font = (sizeof(lf) == GetObjectW(sourceFont, sizeof(lf), &lf)) ? CreateFontIndirectW(&lf) : NULL; + + if (NULL == *font) + { + *flags &= ~flagsMask; + return FALSE; + } + + *flags |= flagsMask; + return TRUE; +} + +void +WidgetStyle_Free(WidgetStyle *self) +{ + if (NULL == self) + return; + + WidgetStyle_DeleteGdiObject(self->flags, WIDGETSTYLE_OWN_TEXT_FONT, self->textFont); + WidgetStyle_DeleteGdiObject(self->flags, WIDGETSTYLE_OWN_TITLE_FONT, self->titleFont); + WidgetStyle_DeleteGdiObject(self->flags, WIDGETSTYLE_OWN_CATEGORY_FONT, self->categoryFont); + WidgetStyle_DeleteGdiObject(self->flags, WIDGETSTYLE_OWN_BACK_BRUSH, self->backBrush); + WidgetStyle_DeleteGdiObject(self->flags, WIDGETSTYLE_OWN_CATEGORY_BRUSH, self->categoryBrush); +} + +BOOL +WidgetStyle_SetBackBrush(WidgetStyle *self, HBRUSH brush, WidgetStyleAssignFlags flags) +{ + return WidgetStyle_SetBrushInt(&self->backBrush, &self->flags, + WIDGETSTYLE_OWN_BACK_BRUSH, brush, flags); +} + +BOOL +WidgetStyle_SetCategoryBrush(WidgetStyle *self, HBRUSH brush, WidgetStyleAssignFlags flags) +{ + return WidgetStyle_SetBrushInt(&self->categoryBrush, &self->flags, + WIDGETSTYLE_OWN_CATEGORY_BRUSH, brush, flags); +} + +BOOL +WidgetStyle_SetTextFont(WidgetStyle *self, HFONT font, WidgetStyleAssignFlags flags) +{ + return WidgetStyle_SetFontInt(&self->textFont, &self->flags, + WIDGETSTYLE_OWN_TEXT_FONT, font, flags); + +} + +BOOL +WidgetStyle_SetTitleFont(WidgetStyle *self, HFONT font, WidgetStyleAssignFlags flags) +{ + return WidgetStyle_SetFontInt(&self->titleFont, &self->flags, + WIDGETSTYLE_OWN_TITLE_FONT, font, flags); + +} + +BOOL +WidgetStyle_SetCategoryFont(WidgetStyle *self, HFONT font, WidgetStyleAssignFlags flags) +{ + return WidgetStyle_SetFontInt(&self->categoryFont, &self->flags, + WIDGETSTYLE_OWN_CATEGORY_FONT, font, flags); + +} + +static COLORREF +WidgetStyle_GetCategoryLineColor(COLORREF categoryBackColor) +{ + COLORREF categoryLineColor; + size_t index; + + const int categoryLineColors[] = + { + WADLG_LISTHEADER_FRAME_MIDDLECOLOR, + WADLG_LISTHEADER_FRAME_BOTTOMCOLOR, + WADLG_LISTHEADER_FRAME_TOPCOLOR, + WADLG_HILITE, + }; + + for (index = 0; index < ARRAYSIZE(categoryLineColors); index++) + { + categoryLineColor = Graphics_GetSkinColor(categoryLineColors[index]); + int distance = Graphics_GetColorDistance(categoryLineColor, categoryBackColor); + if (distance < 0) distance = -distance; + if (distance >= 40) break; + } + + return categoryLineColor; +} + +static COLORREF +WidgetStyle_GetBorderColor(COLORREF backColor, COLORREF textColor) +{ + COLORREF borderColor; + + for(int step = 0;; step++) + { + switch(step) + { + case 0: + borderColor = Graphics_GetSkinColor(WADLG_HILITE); + break; + case 1: + borderColor = Graphics_BlendColors(Graphics_GetSkinColor(WADLG_SELBAR_FGCOLOR), Graphics_GetSkinColor(WADLG_SELBAR_BGCOLOR), 17); + borderColor = Graphics_BlendColors(borderColor, backColor, 229); + break; + default: + return textColor; + } + + int distance = Graphics_GetColorDistance(borderColor, backColor); + if (distance < 0) distance = -distance; + if (distance >= 40) + break; + } + + return borderColor; +} + +BOOL +WidgetStyle_UpdateDefaultColors(WidgetStyle *style) +{ + #define WIDGETSTYLE_SET_COLOR(_colorName, _color)\ + {COLORREF _colorCopy = (_color);\ + if (WIDGETSTYLE_##_colorName##_COLOR(style) != _colorCopy)\ + {WIDGETSTYLE_SET_##_colorName##_COLOR(style, _colorCopy);\ + styleChanged = TRUE;}} + + #define WIDGETSTYLE_SET_COLOR_BLEND(_colorName, _colorTop, _colorBottom, _alpha)\ + WIDGETSTYLE_SET_COLOR(_colorName, Graphics_BlendColors((_colorTop), (_colorBottom), (_alpha))) + + + COLORREF widgetBackColor, widgetTextColor, categoryBackColor, categoryTextColor; + BOOL styleChanged; + HBRUSH brush; + + if (NULL == style) + return FALSE; + + styleChanged = FALSE; + + widgetBackColor = Graphics_GetSkinColor(WADLG_ITEMBG); + widgetTextColor = Graphics_GetSkinColor(WADLG_ITEMFG); + categoryBackColor = Graphics_GetSkinColor(WADLG_LISTHEADER_BGCOLOR); + categoryTextColor = Graphics_GetSkinColor(WADLG_LISTHEADER_FONTCOLOR); + + if (WIDGETSTYLE_BACK_COLOR(style) != widgetBackColor || + NULL == WIDGETSTYLE_BACK_BRUSH(style)) + { + brush = CreateSolidBrush(widgetBackColor); + WIDGETSTYLE_SET_BACK_BRUSH(style, brush, WIDGETSTYLE_OWN_OBJECT); + styleChanged = TRUE; + } + + if (WIDGETSTYLE_CATEGORY_BACK_COLOR(style) != categoryBackColor || + NULL == WIDGETSTYLE_CATEGORY_BRUSH(style)) + { + brush = CreateSolidBrush(categoryBackColor); + WIDGETSTYLE_SET_CATEGORY_BRUSH(style, brush, WIDGETSTYLE_OWN_OBJECT); + styleChanged = TRUE; + } + + WIDGETSTYLE_SET_COLOR(BACK, widgetBackColor); + WIDGETSTYLE_SET_COLOR(TEXT, widgetTextColor); + WIDGETSTYLE_SET_COLOR_BLEND(TITLE, widgetTextColor, widgetBackColor, 210); + WIDGETSTYLE_SET_COLOR(BORDER, WidgetStyle_GetBorderColor(widgetBackColor, widgetTextColor)); + WIDGETSTYLE_SET_COLOR(IMAGE_BACK, widgetBackColor); + WIDGETSTYLE_SET_COLOR(IMAGE_FRONT, widgetTextColor); + WIDGETSTYLE_SET_COLOR(SELECT_BACK, Graphics_GetSkinColor(WADLG_SELBAR_BGCOLOR)); + WIDGETSTYLE_SET_COLOR(SELECT_FRONT, Graphics_GetSkinColor(WADLG_SELBAR_FGCOLOR)); + WIDGETSTYLE_SET_COLOR_BLEND(INACTIVE_SELECT_BACK, WIDGETSTYLE_SELECT_BACK_COLOR(style), widgetBackColor, 192); + WIDGETSTYLE_SET_COLOR_BLEND(INACTIVE_SELECT_FRONT, WIDGETSTYLE_SELECT_FRONT_COLOR(style), widgetBackColor, 192); + WIDGETSTYLE_SET_COLOR(CATEGORY_BACK, categoryBackColor); + WIDGETSTYLE_SET_COLOR(CATEGORY_TEXT, categoryTextColor); + WIDGETSTYLE_SET_COLOR(CATEGORY_LINE, WidgetStyle_GetCategoryLineColor(categoryBackColor)); + WIDGETSTYLE_SET_COLOR_BLEND(CATEGORY_EMPTY_TEXT, widgetTextColor, widgetBackColor, 210); + WIDGETSTYLE_SET_COLOR_BLEND(TEXT_EDITOR_BORDER, widgetTextColor, widgetBackColor, 140); + + return styleChanged; +} + +BOOL +WidgetStyle_UpdateDefaultFonts(WidgetStyle *style, HFONT baseFont, long unitWidth, long unitHeight) +{ + HFONT tempFont; + + if (NULL == style) + return FALSE; + + tempFont = Graphics_DuplicateFont(baseFont, 3, FALSE, TRUE); + WIDGETSTYLE_SET_TITLE_FONT(style, tempFont, WIDGETSTYLE_OWN_OBJECT); + + tempFont = Graphics_DuplicateFont(baseFont, 0, FALSE, TRUE); + WIDGETSTYLE_SET_CATEGORY_FONT(style, tempFont, WIDGETSTYLE_OWN_OBJECT); + + WIDGETSTYLE_SET_TEXT_FONT(style, baseFont, WIDGETSTYLE_LINK_OBJECT); + + WIDGETSTYLE_SET_UNIT_SIZE(style, unitWidth, unitHeight); + + return TRUE; +} \ No newline at end of file -- cgit