# HG changeset patch # User Peter Nelson # Date 2021-04-19 15:37:10 # Node ID 99aabd810ae21208df8460bbc03937f2dc5c872a # Parent ac90bf6da6545d7f1e73744c8a2a96450dd1fd30 Codechange: Add widget text colour override property. diff --git a/src/news_gui.cpp b/src/news_gui.cpp --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -422,7 +422,7 @@ struct NewsWindow : Window { { switch (widget) { case WID_N_CAPTION: - DrawCaption(r, COLOUR_LIGHT_BLUE, this->owner, STR_NEWS_MESSAGE_CAPTION, SA_HOR_CENTER); + DrawCaption(r, COLOUR_LIGHT_BLUE, this->owner, TC_FROMSTRING, STR_NEWS_MESSAGE_CAPTION, SA_HOR_CENTER); break; case WID_N_PANEL: diff --git a/src/widget.cpp b/src/widget.cpp --- a/src/widget.cpp +++ b/src/widget.cpp @@ -257,16 +257,17 @@ static inline void DrawImageButtons(cons * @param r Rectangle of the label background. * @param type Widget type (#WWT_TEXTBTN, #WWT_TEXTBTN_2, or #WWT_LABEL). * @param clicked Label is rendered lowered. + * @param colour Colour of the text. * @param str Text to draw. * @param align Alignment of the text. */ -static inline void DrawLabel(const Rect &r, WidgetType type, bool clicked, StringID str, StringAlignment align) +static inline void DrawLabel(const Rect &r, WidgetType type, bool clicked, TextColour colour, StringID str, StringAlignment align) { if (str == STR_NULL) return; if ((type & WWT_MASK) == WWT_TEXTBTN_2 && clicked) str++; Dimension d = GetStringBoundingBox(str); Point p = GetAlignedPosition(r, d, align); - DrawString(r.left + clicked, r.right + clicked, p.y + clicked, str, TC_FROMSTRING, align); + DrawString(r.left + clicked, r.right + clicked, p.y + clicked, str, colour, align); } /** @@ -285,15 +286,16 @@ static inline void DrawText(const Rect & /** * Draw an inset widget. - * @param r Rectangle of the background. - * @param colour Colour of the inset. - * @param str Text to draw. - * @param align Alignment of the text. + * @param r Rectangle of the background. + * @param colour Colour of the inset. + * @param text_colour Colour of the text. + * @param str Text to draw. + * @param align Alignment of the text. */ -static inline void DrawInset(const Rect &r, Colours colour, StringID str, StringAlignment align) +static inline void DrawInset(const Rect &r, Colours colour, TextColour text_colour, StringID str, StringAlignment align) { DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, FR_LOWERED | FR_DARKENED); - if (str != STR_NULL) DrawString(r.left + WD_INSET_LEFT, r.right - WD_INSET_RIGHT, r.top + WD_INSET_TOP, str, TC_FROMSTRING, align); + if (str != STR_NULL) DrawString(r.left + WD_INSET_LEFT, r.right - WD_INSET_RIGHT, r.top + WD_INSET_TOP, str, text_colour, align); } /** @@ -434,16 +436,17 @@ static inline void DrawHorizontalScrollb /** * Draw a frame widget. - * @param r Rectangle of the frame. - * @param colour Colour of the frame. - * @param str Text of the frame. - * @param align Alignment of the text in the frame. + * @param r Rectangle of the frame. + * @param colour Colour of the frame. + * @param text_colour Colour of the text. + * @param str Text of the frame. + * @param align Alignment of the text in the frame. */ -static inline void DrawFrame(const Rect &r, Colours colour, StringID str, StringAlignment align) +static inline void DrawFrame(const Rect &r, Colours colour, TextColour text_colour, StringID str, StringAlignment align) { int x2 = r.left; // by default the left side is the left side of the widget - if (str != STR_NULL) x2 = DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top, str, TC_FROMSTRING, align); + if (str != STR_NULL) x2 = DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top, str, text_colour, align); int c1 = _colour_gradient[colour][3]; int c2 = _colour_gradient[colour][7]; @@ -563,13 +566,14 @@ static inline void DrawCloseBox(const Re /** * Draw a caption bar. - * @param r Rectangle of the bar. - * @param colour Colour of the window. - * @param owner 'Owner' of the window. - * @param str Text to draw in the bar. - * @param align Alignment of the text. + * @param r Rectangle of the bar. + * @param colour Colour of the window. + * @param owner 'Owner' of the window. + * @param text_colour Colour of the text. + * @param str Text to draw in the bar. + * @param align Alignment of the text. */ -void DrawCaption(const Rect &r, Colours colour, Owner owner, StringID str, StringAlignment align) +void DrawCaption(const Rect &r, Colours colour, Owner owner, TextColour text_colour, StringID str, StringAlignment align) { bool company_owned = owner < MAX_COMPANIES; @@ -583,7 +587,7 @@ void DrawCaption(const Rect &r, Colours if (str != STR_NULL) { Dimension d = GetStringBoundingBox(str); Point p = GetAlignedPosition(r, d, align); - DrawString(r.left + WD_CAPTIONTEXT_LEFT, r.right - WD_CAPTIONTEXT_RIGHT, p.y, str, TC_FROMSTRING, align); + DrawString(r.left + WD_CAPTIONTEXT_LEFT, r.right - WD_CAPTIONTEXT_RIGHT, p.y, str, text_colour, align); } } @@ -908,6 +912,7 @@ NWidgetCore::NWidgetCore(WidgetType tp, this->widget_data = widget_data; this->tool_tip = tool_tip; this->scrollbar_index = -1; + this->text_colour = TC_FROMSTRING; this->align = SA_CENTER; } @@ -933,6 +938,15 @@ void NWidgetCore::SetDataTip(uint32 widg } /** + * Set the text colour of the nested widget. + * @param colour TextColour to use. + */ +void NWidgetCore::SetTextColour(TextColour colour) +{ + this->text_colour = colour; +} + +/** * Set the tool tip of the nested widget. * @param tool_tip Tool tip string to use. */ @@ -1905,12 +1919,12 @@ void NWidgetBackground::Draw(const Windo case WWT_FRAME: if (this->index >= 0) w->SetStringParameters(this->index); - DrawFrame(r, this->colour, this->widget_data, this->align); + DrawFrame(r, this->colour, this->text_colour, this->widget_data, this->align); break; case WWT_INSET: if (this->index >= 0) w->SetStringParameters(this->index); - DrawInset(r, this->colour, this->widget_data, this->align); + DrawInset(r, this->colour, this->text_colour, this->widget_data, this->align); break; default: @@ -2553,7 +2567,7 @@ void NWidgetLeaf::Draw(const Window *w) case WWT_TEXTBTN_2: if (this->index >= 0) w->SetStringParameters(this->index); DrawFrameRect(r.left, r.top, r.right, r.bottom, this->colour, (clicked) ? FR_LOWERED : FR_NONE); - DrawLabel(r, this->type, clicked, this->widget_data, this->align); + DrawLabel(r, this->type, clicked, this->text_colour, this->widget_data, this->align); break; case WWT_ARROWBTN: @@ -2572,12 +2586,12 @@ void NWidgetLeaf::Draw(const Window *w) case WWT_LABEL: if (this->index >= 0) w->SetStringParameters(this->index); - DrawLabel(r, this->type, clicked, this->widget_data, this->align); + DrawLabel(r, this->type, clicked, this->text_colour, this->widget_data, this->align); break; case WWT_TEXT: if (this->index >= 0) w->SetStringParameters(this->index); - DrawText(r, (TextColour)this->colour, this->widget_data, this->align); + DrawText(r, this->text_colour, this->widget_data, this->align); break; case WWT_MATRIX: @@ -2592,7 +2606,7 @@ void NWidgetLeaf::Draw(const Window *w) case WWT_CAPTION: if (this->index >= 0) w->SetStringParameters(this->index); - DrawCaption(r, this->colour, w->owner, this->widget_data, this->align); + DrawCaption(r, this->colour, w->owner, this->text_colour, this->widget_data, this->align); break; case WWT_SHADEBOX: @@ -2770,6 +2784,14 @@ static int MakeNWidget(const NWidgetPart break; } + case WPT_TEXTCOLOUR: { + NWidgetCore *nwc = dynamic_cast(*dest); + if (nwc != nullptr) { + nwc->SetTextColour(parts->u.colour.colour); + } + break; + } + case WPT_ALIGNMENT: { NWidgetCore *nwc = dynamic_cast(*dest); if (nwc != nullptr) { diff --git a/src/widget_type.h b/src/widget_type.h --- a/src/widget_type.h +++ b/src/widget_type.h @@ -89,6 +89,7 @@ enum WidgetType { WPT_DATATIP, ///< Widget part for specifying data and tooltip. WPT_PADDING, ///< Widget part for specifying a padding. WPT_PIPSPACE, ///< Widget part for specifying pre/inter/post space for containers. + WPT_TEXTCOLOUR, ///< Widget part for specifying text colour. WPT_ALIGNMENT, ///< Widget part for specifying text/image alignment. WPT_ENDCONTAINER, ///< Widget part to denote end of a container. WPT_FUNCTION, ///< Widget part for calling a user function. @@ -297,6 +298,7 @@ public: void SetIndex(int index); void SetDataTip(uint32 widget_data, StringID tool_tip); void SetToolTip(StringID tool_tip); + void SetTextColour(TextColour colour); void SetAlignment(StringAlignment align); inline void SetLowered(bool lowered); @@ -317,6 +319,7 @@ public: StringID tool_tip; ///< Tooltip of the widget. @see Widget::tootips int scrollbar_index; ///< Index of an attached scrollbar. TextColour highlight_colour; ///< Colour of highlight. + TextColour text_colour; ///< Colour of text within widget. StringAlignment align; ///< Alignment of text/image within widget. }; @@ -909,6 +912,14 @@ struct NWidgetPartTextLines { }; /** + * Widget part for storing text colour. + * @ingroup NestedWidgetParts + */ +struct NWidgetPartTextColour { + TextColour colour; ///< TextColour for DrawString. +}; + +/** * Widget part for setting text/image alignment within a widget. * @ingroup NestedWidgetParts */ @@ -937,6 +948,7 @@ struct NWidgetPart { NWidgetPartPaddings padding; ///< Part with paddings. NWidgetPartPIP pip; ///< Part with pre/inter/post spaces. NWidgetPartTextLines text_lines; ///< Part with text line data. + NWidgetPartTextColour colour; ///< Part with text colour data. NWidgetPartAlignment align; ///< Part with internal alignment. NWidgetFunctionType *func_ptr; ///< Part with a function call. NWidContainerFlags cont_flags; ///< Part with container flags. @@ -997,6 +1009,21 @@ static inline NWidgetPart SetMinimalText } /** + * Widget part function for setting the text colour. + * @param colour Colour to draw string within widget. + * @ingroup NestedWidgetParts + */ +static inline NWidgetPart SetTextColour(TextColour colour) +{ + NWidgetPart part; + + part.type = WPT_TEXTCOLOUR; + part.u.colour.colour = colour; + + return part; +} + +/** * Widget part function for setting the alignment of text/images. * @param align Alignment of text/image within widget. * @ingroup NestedWidgetParts diff --git a/src/window_gui.h b/src/window_gui.h --- a/src/window_gui.h +++ b/src/window_gui.h @@ -140,7 +140,7 @@ enum WidgetDrawDistances { /* widget.cpp */ void DrawFrameRect(int left, int top, int right, int bottom, Colours colour, FrameFlags flags); -void DrawCaption(const Rect &r, Colours colour, Owner owner, StringID str, StringAlignment align); +void DrawCaption(const Rect &r, Colours colour, Owner owner, TextColour text_colour, StringID str, StringAlignment align); /* window.cpp */ extern Window *_z_front_window;