(svn r18006) -Codechange: make the world generation progress window nested

pull/155/head
rubidium 15 years ago
parent 040404c5d3
commit 3f06d32080

@ -1222,24 +1222,21 @@ void ShowCreateScenario()
enum GenerationProgressWindowWidgets {
GPWW_CAPTION,
GPWW_BACKGROUND,
GPWW_PROGRESS_BAR,
GPWW_PROGRESS_TEXT,
GPWW_ABORT,
};
static const Widget _generate_progress_widgets[] = {
{ WWT_CAPTION, RESIZE_NONE, COLOUR_GREY, 0, 180, 0, 13, STR_GENERATION_WORLD, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS}, // GPWW_CAPTION
{ WWT_PANEL, RESIZE_NONE, COLOUR_GREY, 0, 180, 14, 96, 0x0, STR_NULL}, // GPWW_BACKGROUND
{ WWT_TEXTBTN, RESIZE_NONE, COLOUR_WHITE, 20, 161, 74, 85, STR_GENERATION_ABORT, STR_NULL}, // GPWW_ABORT
{ WIDGETS_END},
};
static const NWidgetPart _nested_generate_progress_widgets[] = {
NWidget(WWT_CAPTION, COLOUR_GREY, GPWW_CAPTION), SetDataTip(STR_GENERATION_WORLD, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_PANEL, COLOUR_GREY, GPWW_BACKGROUND),
NWidget(NWID_SPACER), SetMinimalSize(0, 60),
NWidget(NWID_HORIZONTAL), SetPIP(20, 0, 19),
NWidget(WWT_TEXTBTN, COLOUR_WHITE, GPWW_ABORT), SetMinimalSize(142, 12), SetDataTip(STR_GENERATION_ABORT, STR_NULL),
NWidget(NWID_HORIZONTAL), SetPIP(20, 0, 20),
NWidget(NWID_VERTICAL), SetPIP(11, 8, 11),
NWidget(WWT_EMPTY, INVALID_COLOUR, GPWW_PROGRESS_BAR), SetFill(true, false),
NWidget(WWT_EMPTY, INVALID_COLOUR, GPWW_PROGRESS_TEXT), SetFill(true, false),
NWidget(WWT_TEXTBTN, COLOUR_WHITE, GPWW_ABORT), SetDataTip(STR_GENERATION_ABORT, STR_NULL), SetFill(true, false),
EndContainer(),
EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 11),
EndContainer(),
};
@ -1248,7 +1245,7 @@ static const WindowDesc _generate_progress_desc(
WDP_CENTER, WDP_CENTER, 181, 97, 181, 97,
WC_GENERATE_PROGRESS_WINDOW, WC_NONE,
WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
_generate_progress_widgets, _nested_generate_progress_widgets, lengthof(_nested_generate_progress_widgets)
NULL, _nested_generate_progress_widgets, lengthof(_nested_generate_progress_widgets)
);
struct tp_info {
@ -1261,6 +1258,20 @@ struct tp_info {
static tp_info _tp;
static const StringID _generation_class_table[GWP_CLASS_COUNT] = {
STR_GENERATION_WORLD_GENERATION,
STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION,
STR_GENERATION_CLEARING_TILES,
STR_SCENEDIT_TOOLBAR_TOWN_GENERATION,
STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION,
STR_GENERATION_UNMOVABLE_GENERATION,
STR_GENERATION_TREE_GENERATION,
STR_GENERATION_SETTINGUP_GAME,
STR_GENERATION_PREPARING_TILELOOP,
STR_GENERATION_PREPARING_GAME
};
static void AbortGeneratingWorldCallback(Window *w, bool confirmed)
{
if (confirmed) {
@ -1272,9 +1283,9 @@ static void AbortGeneratingWorldCallback(Window *w, bool confirmed)
struct GenerateProgressWindow : public Window {
GenerateProgressWindow() : Window(&_generate_progress_desc)
GenerateProgressWindow() : Window()
{
this->FindWindowPlacementAndResize(&_generate_progress_desc);
this->InitNested(&_generate_progress_desc);
}
virtual void OnClick(Point pt, int widget)
@ -1295,22 +1306,48 @@ struct GenerateProgressWindow : public Window {
virtual void OnPaint()
{
this->DrawWidgets();
}
/* Draw the % complete with a bar and a text */
DrawFrameRect(19, 20, (this->width - 18), 37, COLOUR_GREY, FR_BORDERONLY);
DrawFrameRect(20, 21, (int)((this->width - 40) * _tp.percent / 100) + 20, 36, COLOUR_MAUVE, FR_NONE);
SetDParam(0, _tp.percent);
DrawString(this->widget[GPWW_BACKGROUND].left, this->widget[GPWW_BACKGROUND].right, 25, STR_GENERATION_PROGRESS, TC_FROMSTRING, SA_CENTER);
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *resize)
{
switch (widget) {
case GPWW_PROGRESS_BAR: {
SetDParam(0, 100);
*size = GetStringBoundingBox(STR_GENERATION_PROGRESS);
/* We need some spacing for the 'border' */
size->height += 8;
size->width += 8;
} break;
case GPWW_PROGRESS_TEXT:
for (uint i = 0; i < GWP_CLASS_COUNT; i++) {
size->width = max(size->width, GetStringBoundingBox(_generation_class_table[i]).width);
}
size->height = FONT_HEIGHT_NORMAL * 2 + WD_PAR_VSEP_NORMAL;
break;
}
}
/* Tell which class we are generating */
DrawString(this->widget[GPWW_BACKGROUND].left, this->widget[GPWW_BACKGROUND].right, 46, _tp.cls, TC_FROMSTRING, SA_CENTER);
virtual void DrawWidget(const Rect &r, int widget) const
{
switch (widget) {
case GPWW_PROGRESS_BAR:
/* Draw the % complete with a bar and a text */
DrawFrameRect(r.left, r.top, r.right, r.bottom, COLOUR_GREY, FR_BORDERONLY);
DrawFrameRect(r.left + 1, r.top + 1, (int)((r.right - r.left - 2) * _tp.percent / 100) + r.left + 1, r.bottom - 1, COLOUR_MAUVE, FR_NONE);
SetDParam(0, _tp.percent);
DrawString(r.left, r.right, r.top + 5, STR_GENERATION_PROGRESS, TC_FROMSTRING, SA_CENTER);
break;
/* And say where we are in that class */
SetDParam(0, _tp.current);
SetDParam(1, _tp.total);
DrawString(this->widget[GPWW_BACKGROUND].left, this->widget[GPWW_BACKGROUND].right, 58, STR_GENERATION_PROGRESS_NUM, TC_FROMSTRING, SA_CENTER);
case GPWW_PROGRESS_TEXT:
/* Tell which class we are generating */
DrawString(r.left, r.right, r.top, _tp.cls, TC_FROMSTRING, SA_CENTER);
this->SetDirty();
/* And say where we are in that class */
SetDParam(0, _tp.current);
SetDParam(1, _tp.total);
DrawString(r.left, r.right, r.top + FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL, STR_GENERATION_PROGRESS_NUM, TC_FROMSTRING, SA_CENTER);
}
}
};
@ -1338,18 +1375,6 @@ void ShowGenerateWorldProgress()
static void _SetGeneratingWorldProgress(gwp_class cls, uint progress, uint total)
{
static const int percent_table[GWP_CLASS_COUNT + 1] = {0, 5, 15, 20, 40, 60, 65, 80, 85, 99, 100 };
static const StringID class_table[GWP_CLASS_COUNT] = {
STR_GENERATION_WORLD_GENERATION,
STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION,
STR_GENERATION_CLEARING_TILES,
STR_SCENEDIT_TOOLBAR_TOWN_GENERATION,
STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION,
STR_GENERATION_UNMOVABLE_GENERATION,
STR_GENERATION_TREE_GENERATION,
STR_GENERATION_SETTINGUP_GAME,
STR_GENERATION_PREPARING_TILELOOP,
STR_GENERATION_PREPARING_GAME
};
assert(cls < GWP_CLASS_COUNT);
@ -1359,10 +1384,10 @@ static void _SetGeneratingWorldProgress(gwp_class cls, uint progress, uint total
if (IsGeneratingWorldAborted()) HandleGeneratingWorldAbortion();
if (total == 0) {
assert(_tp.cls == class_table[cls]);
assert(_tp.cls == _generation_class_table[cls]);
_tp.current += progress;
} else {
_tp.cls = class_table[cls];
_tp.cls = _generation_class_table[cls];
_tp.current = progress;
_tp.total = total;
_tp.percent = percent_table[cls];

Loading…
Cancel
Save