261 lines
7.4 KiB
C++
261 lines
7.4 KiB
C++
#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;
|
|
} |