|
@@ -256,13 +256,13 @@ static inline void DrawImageButtons(cons
|
|
|
static inline void DrawLabel(const Rect &r, WidgetType type, bool clicked, StringID str)
|
|
|
{
|
|
|
if (str == STR_NULL) return;
|
|
|
if ((type & WWT_MASK) == WWT_TEXTBTN_2 && clicked) str++;
|
|
|
Dimension d = GetStringBoundingBox(str);
|
|
|
int offset = max(0, ((int)(r.bottom - r.top + 1) - (int)d.height) / 2); // Offset for rendering the text vertically centered
|
|
|
DrawString(r.left + clicked, r.right + clicked, r.top + offset + clicked, str, TC_FROMSTRING, SA_CENTER);
|
|
|
DrawString(r.left + clicked, r.right + clicked, r.top + offset + clicked, str, TC_FROMSTRING, SA_HOR_CENTER);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Draw text.
|
|
|
* @param r Rectangle of the background.
|
|
|
* @param colour Colour of the text.
|
|
@@ -343,16 +343,16 @@ static inline void DrawMatrix(const Rect
|
|
|
* @param scrollbar Scrollbar size, offset, and capacity information.
|
|
|
*/
|
|
|
static inline void DrawVerticalScrollbar(const Rect &r, Colours colour, bool up_clicked, bool bar_dragged, bool down_clicked, const Scrollbar *scrollbar)
|
|
|
{
|
|
|
/* draw up/down buttons */
|
|
|
DrawFrameRect(r.left, r.top, r.right, r.top + 9, colour, (up_clicked) ? FR_LOWERED : FR_NONE);
|
|
|
DrawString(r.left + up_clicked, r.right + up_clicked, r.top + up_clicked, UPARROW, TC_BLACK, SA_CENTER);
|
|
|
DrawString(r.left + up_clicked, r.right + up_clicked, r.top + up_clicked, UPARROW, TC_BLACK, SA_HOR_CENTER);
|
|
|
|
|
|
DrawFrameRect(r.left, r.bottom - 9, r.right, r.bottom, colour, (down_clicked) ? FR_LOWERED : FR_NONE);
|
|
|
DrawString(r.left + down_clicked, r.right + down_clicked, r.bottom - 9 + down_clicked, DOWNARROW, TC_BLACK, SA_CENTER);
|
|
|
DrawString(r.left + down_clicked, r.right + down_clicked, r.bottom - 9 + down_clicked, DOWNARROW, TC_BLACK, SA_HOR_CENTER);
|
|
|
|
|
|
int c1 = _colour_gradient[colour & 0xF][3];
|
|
|
int c2 = _colour_gradient[colour & 0xF][7];
|
|
|
|
|
|
/* draw "shaded" background */
|
|
|
GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c2);
|
|
@@ -513,13 +513,13 @@ static inline void DrawResizeBox(const R
|
|
|
* @param str Cross to draw (#STR_BLACK_CROSS or #STR_SILVER_CROSS).
|
|
|
*/
|
|
|
static inline void DrawCloseBox(const Rect &r, Colours colour, StringID str)
|
|
|
{
|
|
|
assert(str == STR_BLACK_CROSS || str == STR_SILVER_CROSS); // black or silver cross
|
|
|
DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, FR_NONE);
|
|
|
DrawString(r.left + WD_CLOSEBOX_LEFT, r.right - WD_CLOSEBOX_RIGHT, r.top + WD_CLOSEBOX_TOP, str, TC_FROMSTRING, SA_CENTER);
|
|
|
DrawString(r.left + WD_CLOSEBOX_LEFT, r.right - WD_CLOSEBOX_RIGHT, r.top + WD_CLOSEBOX_TOP, str, TC_FROMSTRING, SA_HOR_CENTER);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Draw a caption bar.
|
|
|
* @param r Rectangle of the bar.
|
|
|
* @param colour Colour of the window.
|
|
@@ -532,13 +532,13 @@ void DrawCaption(const Rect &r, Colours
|
|
|
DrawFrameRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, colour, (owner == INVALID_OWNER) ? FR_LOWERED | FR_DARKENED : FR_LOWERED | FR_DARKENED | FR_BORDERONLY);
|
|
|
|
|
|
if (owner != INVALID_OWNER) {
|
|
|
GfxFillRect(r.left + 2, r.top + 2, r.right - 2, r.bottom - 2, _colour_gradient[_company_colours[owner]][4]);
|
|
|
}
|
|
|
|
|
|
if (str != STR_NULL) DrawString(r.left + WD_CAPTIONTEXT_LEFT, r.right - WD_CAPTIONTEXT_RIGHT, r.top + WD_CAPTIONTEXT_TOP, str, TC_FROMSTRING, SA_CENTER);
|
|
|
if (str != STR_NULL) DrawString(r.left + WD_CAPTIONTEXT_LEFT, r.right - WD_CAPTIONTEXT_RIGHT, r.top + WD_CAPTIONTEXT_TOP, str, TC_FROMSTRING, SA_HOR_CENTER);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Draw a button with a dropdown (#WWT_DROPDOWN and #NWID_BUTTON_DROPDOWN).
|
|
|
* @param r Rectangle containing the widget.
|
|
|
* @param colour Background colour of the widget.
|
|
@@ -550,18 +550,18 @@ void DrawCaption(const Rect &r, Colours
|
|
|
*/
|
|
|
static inline void DrawButtonDropdown(const Rect &r, Colours colour, bool clicked_button, bool clicked_dropdown, StringID str)
|
|
|
{
|
|
|
if (_dynlang.text_dir == TD_LTR) {
|
|
|
DrawFrameRect(r.left, r.top, r.right - 12, r.bottom, colour, clicked_button ? FR_LOWERED : FR_NONE);
|
|
|
DrawFrameRect(r.right - 11, r.top, r.right, r.bottom, colour, clicked_dropdown ? FR_LOWERED : FR_NONE);
|
|
|
DrawString(r.right - (clicked_dropdown ? 10 : 11), r.right, r.top + (clicked_dropdown ? 2 : 1), DOWNARROW, TC_BLACK, SA_CENTER);
|
|
|
DrawString(r.right - (clicked_dropdown ? 10 : 11), r.right, r.top + (clicked_dropdown ? 2 : 1), DOWNARROW, TC_BLACK, SA_HOR_CENTER);
|
|
|
if (str != STR_NULL) DrawString(r.left + WD_DROPDOWNTEXT_LEFT + clicked_button, r.right - WD_DROPDOWNTEXT_RIGHT + clicked_button, r.top + WD_DROPDOWNTEXT_TOP + clicked_button, str, TC_BLACK);
|
|
|
} else {
|
|
|
DrawFrameRect(r.left + 12, r.top, r.right, r.bottom, colour, clicked_button ? FR_LOWERED : FR_NONE);
|
|
|
DrawFrameRect(r.left, r.top, r.left + 11, r.bottom, colour, clicked_dropdown ? FR_LOWERED : FR_NONE);
|
|
|
DrawString(r.left + clicked_dropdown, r.left + 11, r.top + (clicked_dropdown ? 2 : 1), DOWNARROW, TC_BLACK, SA_CENTER);
|
|
|
DrawString(r.left + clicked_dropdown, r.left + 11, r.top + (clicked_dropdown ? 2 : 1), DOWNARROW, TC_BLACK, SA_HOR_CENTER);
|
|
|
if (str != STR_NULL) DrawString(r.left + WD_DROPDOWNTEXT_RIGHT + clicked_button, r.right - WD_DROPDOWNTEXT_LEFT + clicked_button, r.top + WD_DROPDOWNTEXT_TOP + clicked_button, str, TC_BLACK);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Draw a dropdown #WWT_DROPDOWN widget.
|
|
@@ -600,13 +600,13 @@ void Window::DrawSortButtonState(int wid
|
|
|
const NWidgetBase *nwid = this->GetWidget<NWidgetBase>(widget);
|
|
|
|
|
|
int offset = this->IsWidgetLowered(widget) ? 1 : 0;
|
|
|
int base = offset + nwid->pos_x + (_dynlang.text_dir == TD_LTR ? nwid->current_x - WD_SORTBUTTON_ARROW_WIDTH : 0);
|
|
|
int top = nwid->pos_y;
|
|
|
|
|
|
DrawString(base, base + WD_SORTBUTTON_ARROW_WIDTH, top + 1 + offset, state == SBS_DOWN ? DOWNARROW : UPARROW, TC_BLACK, SA_CENTER);
|
|
|
DrawString(base, base + WD_SORTBUTTON_ARROW_WIDTH, top + 1 + offset, state == SBS_DOWN ? DOWNARROW : UPARROW, TC_BLACK, SA_HOR_CENTER);
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* @defgroup NestedWidgets Hierarchical widgets
|
|
|
* Hierarchical widgets, also known as nested widgets, are widgets stored in a tree. At the leafs of the tree are (mostly) the 'real' widgets
|