diff options
-rw-r--r-- | src/town_gui.cpp | 158 |
1 files changed, 82 insertions, 76 deletions
diff --git a/src/town_gui.cpp b/src/town_gui.cpp index ee2a80601..1b7f186ab 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -405,11 +405,6 @@ void ShowTownViewWindow(TownID town) AllocateWindowDescFront<TownViewWindow>(&_town_view_desc, town); } -enum TownDirectoryWidget { - TDW_SORTNAME = 3, - TDW_SORTPOPULATION, - TDW_CENTERTOWN, -}; static const Widget _town_directory_widgets[] = { { WWT_CLOSEBOX, RESIZE_NONE, 13, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, { WWT_CAPTION, RESIZE_NONE, 13, 11, 195, 0, 13, STR_2000_TOWNS, STR_018C_WINDOW_TITLE_DRAG_THIS}, @@ -482,107 +477,118 @@ static void MakeSortedTownList() } -static void TownDirectoryWndProc(Window *w, WindowEvent *e) -{ - switch (e->event) { - case WE_PAINT: { - if (_town_sort_dirty) { - _town_sort_dirty = false; - MakeSortedTownList(); - } +struct TownDirectoryWindow : public Window { + enum TownDirectoryWidget { + TDW_SORTNAME = 3, + TDW_SORTPOPULATION, + TDW_CENTERTOWN, + }; - SetVScrollCount(w, _num_town_sort); + TownDirectoryWindow(const WindowDesc *desc) : Window(desc, 0) + { + this->vscroll.cap = 16; + this->resize.step_height = 10; + this->resize.height = this->height - 10 * 6; // minimum of 10 items in the list, each item 10 high - w->DrawWidgets(); - w->DrawSortButtonState((_town_sort_order <= 1) ? TDW_SORTNAME : TDW_SORTPOPULATION, _town_sort_order & 1 ? SBS_DOWN : SBS_UP); + this->FindWindowPlacementAndResize(desc); + } - { - int n = 0; - uint16 i = w->vscroll.pos; - int y = 28; + virtual void OnPaint() + { + if (_town_sort_dirty) { + _town_sort_dirty = false; + MakeSortedTownList(); + } - while (i < _num_town_sort) { - const Town* t = _town_sort[i]; + SetVScrollCount(this, _num_town_sort); - assert(t->xy); + this->DrawWidgets(); + this->DrawSortButtonState((_town_sort_order <= 1) ? TDW_SORTNAME : TDW_SORTPOPULATION, _town_sort_order & 1 ? SBS_DOWN : SBS_UP); - SetDParam(0, t->index); - SetDParam(1, t->population); - DrawString(2, y, STR_2057, TC_FROMSTRING); + { + int n = 0; + uint16 i = this->vscroll.pos; + int y = 28; - y += 10; - i++; - if (++n == w->vscroll.cap) break; // max number of towns in 1 window - } - SetDParam(0, GetWorldPopulation()); - DrawString(3, w->height - 12 + 2, STR_TOWN_POPULATION, TC_FROMSTRING); + while (i < _num_town_sort) { + const Town* t = _town_sort[i]; + + assert(t->xy); + + SetDParam(0, t->index); + SetDParam(1, t->population); + DrawString(2, y, STR_2057, TC_FROMSTRING); + + y += 10; + i++; + if (++n == this->vscroll.cap) break; // max number of towns in 1 window } - } break; - case WE_CLICK: - switch (e->we.click.widget) { - case TDW_SORTNAME: /* Sort by Name ascending/descending */ - _town_sort_order = (_town_sort_order == 0) ? 1 : 0; - _town_sort_dirty = true; - w->SetDirty(); - break; + SetDParam(0, GetWorldPopulation()); + DrawString(3, this->height - 12 + 2, STR_TOWN_POPULATION, TC_FROMSTRING); + } + } + + virtual void OnClick(Point pt, int widget) + { + switch (widget) { + case TDW_SORTNAME: /* Sort by Name ascending/descending */ + _town_sort_order = (_town_sort_order == 0) ? 1 : 0; + _town_sort_dirty = true; + this->SetDirty(); + break; - case TDW_SORTPOPULATION: /* Sort by Population ascending/descending */ - _town_sort_order = (_town_sort_order == 2) ? 3 : 2; - _town_sort_dirty = true; - w->SetDirty(); - break; + case TDW_SORTPOPULATION: /* Sort by Population ascending/descending */ + _town_sort_order = (_town_sort_order == 2) ? 3 : 2; + _town_sort_dirty = true; + this->SetDirty(); + break; - case TDW_CENTERTOWN: { /* Click on Town Matrix */ - const Town* t; + case TDW_CENTERTOWN: { /* Click on Town Matrix */ + const Town* t; - uint16 id_v = (e->we.click.pt.y - 28) / 10; + uint16 id_v = (pt.y - 28) / 10; - if (id_v >= w->vscroll.cap) return; // click out of bounds + if (id_v >= this->vscroll.cap) return; // click out of bounds - id_v += w->vscroll.pos; + id_v += this->vscroll.pos; - if (id_v >= _num_town_sort) return; // click out of town bounds + if (id_v >= _num_town_sort) return; // click out of town bounds - t = _town_sort[id_v]; - assert(t->xy); - if (_ctrl_pressed) { - ShowExtraViewPortWindow(t->xy); - } else { - ScrollMainWindowToTile(t->xy); - } - } break; + t = _town_sort[id_v]; + assert(t->xy); + if (_ctrl_pressed) { + ShowExtraViewPortWindow(t->xy); + } else { + ScrollMainWindowToTile(t->xy); + } + break; } - break; + } + } - case WE_100_TICKS: - w->SetDirty(); - break; + virtual void OnHundredthTick() + { + this->SetDirty(); + } - case WE_RESIZE: - w->vscroll.cap += e->we.sizing.diff.y / 10; - break; + virtual void OnResize(Point new_size, Point delta) + { + this->vscroll.cap += delta.y / 10; } -} +}; static const WindowDesc _town_directory_desc = { WDP_AUTO, WDP_AUTO, 208, 202, 208, 202, WC_TOWN_DIRECTORY, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE, _town_directory_widgets, - TownDirectoryWndProc + NULL }; - void ShowTownDirectory() { - Window *w = AllocateWindowDescFront<Window>(&_town_directory_desc, 0); - - if (w != NULL) { - w->vscroll.cap = 16; - w->resize.step_height = 10; - w->resize.height = w->height - 10 * 6; // minimum of 10 items in the list, each item 10 high - } + new TownDirectoryWindow(&_town_directory_desc); } void CcBuildTown(bool success, TileIndex tile, uint32 p1, uint32 p2) |