summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoralberth <alberth@openttd.org>2009-09-20 14:46:15 +0000
committeralberth <alberth@openttd.org>2009-09-20 14:46:15 +0000
commitbae15616f7ba2bc1ca23dd435dd158696c43188a (patch)
treeacb12bb77bfb01fb7508cf5d1976fb6c3b88c046 /src
parent46cd3ee9449a4024ec09a517f26a677bd8aeff84 (diff)
downloadopenttd-bae15616f7ba2bc1ca23dd435dd158696c43188a.tar.xz
(svn r17587) -Codechange: Town authority window uses pure nested widgets.
Diffstat (limited to 'src')
-rw-r--r--src/town_gui.cpp130
1 files changed, 85 insertions, 45 deletions
diff --git a/src/town_gui.cpp b/src/town_gui.cpp
index 952ebb49a..f516f9bcf 100644
--- a/src/town_gui.cpp
+++ b/src/town_gui.cpp
@@ -51,23 +51,12 @@ enum TownAuthorityWidgets {
TWA_EXECUTE, ///< Do-it button.
};
-static const Widget _town_authority_widgets[] = {
-{ WWT_CLOSEBOX, RESIZE_NONE, COLOUR_BROWN, 0, 10, 0, 13, STR_BLACK_CROSS, STR_TOOLTIP_CLOSE_WINDOW}, // TWA_CLOSEBOX
-{ WWT_CAPTION, RESIZE_NONE, COLOUR_BROWN, 11, 316, 0, 13, STR_LOCAL_AUTHORITY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS}, // TWA_CAPTION
-{ WWT_PANEL, RESIZE_NONE, COLOUR_BROWN, 0, 316, 14, 105, 0x0, STR_NULL}, // TWA_RATING_INFO
-{ WWT_PANEL, RESIZE_NONE, COLOUR_BROWN, 0, 304, 106, 157, 0x0, STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP}, // TWA_COMMAND_LIST
-{ WWT_SCROLLBAR, RESIZE_NONE, COLOUR_BROWN, 305, 316, 106, 157, 0x0, STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST}, // TWA_SCROLLBAR
-{ WWT_PANEL, RESIZE_NONE, COLOUR_BROWN, 0, 316, 158, 209, 0x0, STR_NULL}, // TWA_ACTION_INFO
-{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_BROWN, 0, 316, 210, 221, STR_LOCAL_AUTHORITY_DO_IT_BUTTON, STR_LOCAL_AUTHORITY_DO_IT_TOOLTIP}, // TWA_EXECUTE
-{ WIDGETS_END},
-};
-
static const NWidgetPart _nested_town_authority_widgets[] = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_BROWN, TWA_CLOSEBOX),
NWidget(WWT_CAPTION, COLOUR_BROWN, TWA_CAPTION), SetDataTip(STR_LOCAL_AUTHORITY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
EndContainer(),
- NWidget(WWT_PANEL, COLOUR_BROWN, TWA_RATING_INFO), SetMinimalSize(317, 92), EndContainer(),
+ NWidget(WWT_PANEL, COLOUR_BROWN, TWA_RATING_INFO), SetMinimalSize(317, 92), SetResize(0, 1), EndContainer(),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_PANEL, COLOUR_BROWN, TWA_COMMAND_LIST), SetMinimalSize(305, 52), SetDataTip(0x0, STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP), EndContainer(),
NWidget(WWT_SCROLLBAR, COLOUR_BROWN, TWA_SCROLLBAR),
@@ -104,13 +93,11 @@ private:
}
public:
- TownAuthorityWindow(const WindowDesc *desc, WindowNumber window_number) :
- Window(desc, window_number), sel_index(-1)
+ TownAuthorityWindow(const WindowDesc *desc, WindowNumber window_number) : Window(), sel_index(-1)
{
- this->town = Town::Get(this->window_number);
- this->vscroll.SetCapacity(5);
-
- this->FindWindowPlacementAndResize(desc);
+ this->town = Town::Get(window_number);
+ this->InitNested(desc, window_number);
+ this->vscroll.SetCapacity((this->GetWidget<NWidgetBase>(TWA_COMMAND_LIST)->current_y - WD_FRAMERECT_TOP - WD_FRAMERECT_BOTTOM) / FONT_HEIGHT_NORMAL);
}
virtual void OnPaint()
@@ -126,19 +113,27 @@ public:
this->SetWidgetDisabledState(TWA_EXECUTE, this->sel_index == -1);
- SetDParam(0, this->window_number);
this->DrawWidgets();
+ this->DrawRatings();
+ }
+
+ /** Draw the contents of the ratings panel. May request a resize of the window if the contents does not fit. */
+ void DrawRatings()
+ {
+ NWidgetBase *nwid = this->GetWidget<NWidgetBase>(TWA_RATING_INFO);
+ int left = nwid->pos_x;
+ int right = nwid->pos_x + nwid->current_x - 1;
- int y = this->widget[TWA_RATING_INFO].top + 1;
+ uint y = nwid->pos_y + WD_FRAMERECT_TOP;
- DrawString(this->widget[TWA_RATING_INFO].left + 2, this->widget[TWA_RATING_INFO].right - 2, y, STR_LOCAL_AUTHORITY_COMPANY_RATINGS);
+ DrawString(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_TOP, y, STR_LOCAL_AUTHORITY_COMPANY_RATINGS);
y += FONT_HEIGHT_NORMAL;
/* Draw list of companies */
const Company *c;
FOR_ALL_COMPANIES(c) {
if ((HasBit(this->town->have_ratings, c->index) || this->town->exclusivity == c->index)) {
- DrawCompanyIcon(c->index, 2, y);
+ DrawCompanyIcon(c->index, left + WD_FRAMERECT_LEFT, y);
SetDParam(0, c->index);
SetDParam(1, c->index);
@@ -156,42 +151,87 @@ public:
SetDParam(2, str);
if (this->town->exclusivity == c->index) { // red icon for company with exclusive rights
- DrawSprite(SPR_BLOT, PALETTE_TO_RED, 18, y);
+ DrawSprite(SPR_BLOT, PALETTE_TO_RED, left + WD_FRAMERECT_LEFT + 16, y);
}
- DrawString(this->widget[TWA_RATING_INFO].left + 28, this->widget[TWA_RATING_INFO].right - 2, y, STR_LOCAL_AUTHORITY_COMPANY_RATING);
+ DrawString(left + WD_FRAMERECT_LEFT + 26, right - WD_FRAMERECT_RIGHT, y, STR_LOCAL_AUTHORITY_COMPANY_RATING);
y += FONT_HEIGHT_NORMAL;
}
}
- if (y > this->widget[TWA_RATING_INFO].bottom) {
+ y = y + WD_FRAMERECT_BOTTOM - nwid->pos_y; // Compute needed size of the widget.
+ if (y > nwid->current_y) {
/* If the company list is too big to fit, mark ourself dirty and draw again. */
- ResizeWindowForWidget(this, TWA_RATING_INFO, 0, y - this->widget[TWA_RATING_INFO].bottom);
- this->SetDirty();
- return;
+ ResizeWindow(this, 0, y - nwid->current_y);
}
+ }
- y = this->widget[TWA_COMMAND_LIST].top + 1;
- int pos = this->vscroll.GetPosition();
+ virtual void SetStringParameters(int widget) const
+ {
+ if (widget == TWA_CAPTION) SetDParam(0, this->window_number);
+ }
- if (--pos < 0) {
- DrawString(this->widget[TWA_COMMAND_LIST].left + 2, this->widget[TWA_COMMAND_LIST].right - 2, y, STR_LOCAL_AUTHORITY_ACTIONS_TITLE);
- y += FONT_HEIGHT_NORMAL;
- }
+ virtual void DrawWidget(const Rect &r, int widget) const
+ {
+ switch (widget) {
+ case TWA_ACTION_INFO:
+ if (this->sel_index != -1) {
+ SetDParam(1, (_price.build_industry >> 8) * _town_action_costs[this->sel_index]);
+ SetDParam(0, STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN + this->sel_index);
+ DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, r.bottom - WD_FRAMERECT_BOTTOM,
+ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING + this->sel_index);
+ }
+ break;
+ case TWA_COMMAND_LIST: {
+ int numact;
+ uint buttons = GetMaskOfTownActions(&numact, _local_company, this->town);
+ int y = r.top + WD_FRAMERECT_TOP;
+ int pos = this->vscroll.GetPosition();
- for (int i = 0; buttons; i++, buttons >>= 1) {
- if (pos <= -5) break; ///< Draw only the 5 fitting lines
+ if (--pos < 0) {
+ DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_LOCAL_AUTHORITY_ACTIONS_TITLE);
+ y += FONT_HEIGHT_NORMAL;
+ }
- if ((buttons & 1) && --pos < 0) {
- DrawString(this->widget[TWA_COMMAND_LIST].left + 3, this->widget[TWA_COMMAND_LIST].right - 2, y, STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN + i, TC_ORANGE);
- y += FONT_HEIGHT_NORMAL;
+ for (int i = 0; buttons; i++, buttons >>= 1) {
+ if (pos <= -5) break; ///< Draw only the 5 fitting lines
+
+ if ((buttons & 1) && --pos < 0) {
+ DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN + i, TC_ORANGE);
+ y += FONT_HEIGHT_NORMAL;
+ }
+ }
+ break;
}
}
+ }
- if (this->sel_index != -1) {
- SetDParam(1, (_price.build_industry >> 8) * _town_action_costs[this->sel_index]);
- SetDParam(0, STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN + this->sel_index);
- DrawStringMultiLine(this->widget[TWA_ACTION_INFO].left + 2, this->widget[TWA_ACTION_INFO].right - 2, this->widget[TWA_ACTION_INFO].top + 1, this->widget[TWA_ACTION_INFO].bottom - 1, STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING + this->sel_index);
+ virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *resize)
+ {
+ switch (widget) {
+ case TWA_ACTION_INFO: {
+ assert(size->width > padding.width && size->height > padding.height);
+ size->width -= WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT;
+ size->height -= WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM;
+ Dimension d = {0, 0};
+ for (int i = 0; i < TACT_COUNT; i++) {
+ SetDParam(1, (_price.build_industry >> 8) * _town_action_costs[i]);
+ SetDParam(0, STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN + i);
+ d = maxdim(d, GetStringMultiLineBoundingBox(STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING + i, *size));
+ }
+ *size = maxdim(*size, d);
+ size->width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT;
+ size->height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM;
+ break;
+ }
+
+ case TWA_COMMAND_LIST:
+ size->height = WD_FRAMERECT_TOP + 5 * FONT_HEIGHT_NORMAL + WD_FRAMERECT_BOTTOM;
+ break;
+
+ case TWA_RATING_INFO:
+ size->height = WD_FRAMERECT_TOP + 9 * FONT_HEIGHT_NORMAL + WD_FRAMERECT_BOTTOM;
+ break;
}
}
@@ -202,7 +242,7 @@ public:
{
switch (widget) {
case TWA_COMMAND_LIST: {
- int y = (pt.y - this->widget[TWA_COMMAND_LIST].top - 1) / FONT_HEIGHT_NORMAL;
+ int y = (pt.y - this->GetWidget<NWidgetBase>(TWA_COMMAND_LIST)->pos_y - 1) / FONT_HEIGHT_NORMAL;
if (!IsInsideMM(y, 0, 5)) return;
@@ -231,7 +271,7 @@ static const WindowDesc _town_authority_desc(
WDP_AUTO, WDP_AUTO, 317, 222, 317, 222,
WC_TOWN_AUTHORITY, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
- _town_authority_widgets, _nested_town_authority_widgets, lengthof(_nested_town_authority_widgets)
+ NULL, _nested_town_authority_widgets, lengthof(_nested_town_authority_widgets)
);
static void ShowTownAuthorityWindow(uint town)