mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-04 06:00:15 +00:00
(svn r13131) -Codechange: make a class of the ErrmsgWindow.
This commit is contained in:
parent
758f4a358d
commit
0e9eb5bacb
167
src/misc_gui.cpp
167
src/misc_gui.cpp
@ -328,11 +328,6 @@ void ShowAboutWindow()
|
||||
new AboutWindow();
|
||||
}
|
||||
|
||||
static uint64 _errmsg_decode_params[20];
|
||||
static StringID _errmsg_message_1, _errmsg_message_2;
|
||||
static uint _errmsg_duration;
|
||||
|
||||
|
||||
static const Widget _errmsg_widgets[] = {
|
||||
{ WWT_CLOSEBOX, RESIZE_NONE, 4, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
|
||||
{ WWT_CAPTION, RESIZE_NONE, 4, 11, 239, 0, 13, STR_00B2_MESSAGE, STR_NULL},
|
||||
@ -347,96 +342,95 @@ static const Widget _errmsg_face_widgets[] = {
|
||||
{ WIDGETS_END},
|
||||
};
|
||||
|
||||
static void ErrmsgWndProc(Window *w, WindowEvent *e)
|
||||
{
|
||||
switch (e->event) {
|
||||
case WE_PAINT:
|
||||
CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params));
|
||||
DrawWindowWidgets(w);
|
||||
CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params));
|
||||
struct ErrmsgWindow : public Window {
|
||||
private:
|
||||
uint duration;
|
||||
uint64 decode_params[20];
|
||||
StringID message_1;
|
||||
StringID message_2;
|
||||
|
||||
/* If the error message comes from a NewGRF, we must use the text ref. stack reserved for error messages.
|
||||
* If the message doesn't come from a NewGRF, it won't use the TTDP-style text ref. stack, so we won't hurt anything
|
||||
*/
|
||||
SwitchToErrorRefStack();
|
||||
RewindTextRefStack();
|
||||
|
||||
if (!IsWindowOfPrototype(w, _errmsg_face_widgets)) {
|
||||
DrawStringMultiCenter(
|
||||
120,
|
||||
(_errmsg_message_1 == INVALID_STRING_ID ? 25 : 15),
|
||||
_errmsg_message_2,
|
||||
w->width - 2);
|
||||
if (_errmsg_message_1 != INVALID_STRING_ID) {
|
||||
DrawStringMultiCenter(
|
||||
120,
|
||||
30,
|
||||
_errmsg_message_1,
|
||||
w->width - 2);
|
||||
}
|
||||
} else {
|
||||
const Player *p = GetPlayer((PlayerID)GetDParamX(_errmsg_decode_params,2));
|
||||
DrawPlayerFace(p->face, p->player_color, 2, 16);
|
||||
|
||||
DrawStringMultiCenter(
|
||||
214,
|
||||
(_errmsg_message_1 == INVALID_STRING_ID ? 65 : 45),
|
||||
_errmsg_message_2,
|
||||
w->width - 2);
|
||||
if (_errmsg_message_1 != INVALID_STRING_ID) {
|
||||
DrawStringMultiCenter(
|
||||
214,
|
||||
90,
|
||||
_errmsg_message_1,
|
||||
w->width - 2);
|
||||
}
|
||||
}
|
||||
|
||||
/* Switch back to the normal text ref. stack for NewGRF texts */
|
||||
SwitchToNormalRefStack();
|
||||
break;
|
||||
|
||||
case WE_MOUSELOOP:
|
||||
if (_right_button_down) delete w;
|
||||
break;
|
||||
|
||||
case WE_100_TICKS:
|
||||
if (--_errmsg_duration == 0) delete w;
|
||||
break;
|
||||
|
||||
case WE_DESTROY:
|
||||
SetRedErrorSquare(0);
|
||||
extern StringID _switch_mode_errorstr;
|
||||
_switch_mode_errorstr = INVALID_STRING_ID;
|
||||
break;
|
||||
|
||||
case WE_KEYPRESS:
|
||||
if (e->we.keypress.keycode == WKC_SPACE) {
|
||||
/* Don't continue. */
|
||||
e->we.keypress.cont = false;
|
||||
delete w;
|
||||
}
|
||||
break;
|
||||
public:
|
||||
ErrmsgWindow(Point pt, int width, int height, StringID msg1, StringID msg2, const Widget *widget) : Window(pt.x, pt.y, width, height, NULL, WC_ERRMSG, widget)
|
||||
{
|
||||
this->duration = _patches.errmsg_duration;
|
||||
CopyOutDParam(this->decode_params, 0, lengthof(this->decode_params));
|
||||
this->message_1 = msg1;
|
||||
this->message_2 = msg2;
|
||||
this->desc_flags = WDF_STD_BTN | WDF_DEF_WIDGET;
|
||||
this->FindWindowPlacementAndResize(width, height);
|
||||
}
|
||||
}
|
||||
|
||||
virtual void OnPaint()
|
||||
{
|
||||
static int y[][3] = {
|
||||
{15, 25, 30}, // _errmsg_widgets
|
||||
{45, 65, 90}, // _errmsg_face_widgets
|
||||
};
|
||||
|
||||
CopyInDParam(0, this->decode_params, lengthof(this->decode_params));
|
||||
DrawWindowWidgets(this);
|
||||
CopyInDParam(0, this->decode_params, lengthof(this->decode_params));
|
||||
|
||||
/* If the error message comes from a NewGRF, we must use the text ref. stack reserved for error messages.
|
||||
* If the message doesn't come from a NewGRF, it won't use the TTDP-style text ref. stack, so we won't hurt anything
|
||||
*/
|
||||
SwitchToErrorRefStack();
|
||||
RewindTextRefStack();
|
||||
|
||||
byte i = 0;
|
||||
if (IsWindowOfPrototype(this, _errmsg_face_widgets)) {
|
||||
const Player *p = GetPlayer((PlayerID)GetDParamX(this->decode_params, 2));
|
||||
DrawPlayerFace(p->face, p->player_color, 2, 16);
|
||||
i = 1;
|
||||
}
|
||||
|
||||
byte j = (this->message_1 == INVALID_STRING_ID) ? 1 : 0;
|
||||
DrawStringMultiCenter(this->width - 120, y[i][j], this->message_2, this->width - 2);
|
||||
if (j == 0) {
|
||||
DrawStringMultiCenter(this->width - 120, y[i][2], this->message_1, this->width - 2);
|
||||
}
|
||||
|
||||
/* Switch back to the normal text ref. stack for NewGRF texts */
|
||||
SwitchToNormalRefStack();
|
||||
}
|
||||
|
||||
virtual void OnMouseLoop()
|
||||
{
|
||||
if (_right_button_down) delete this;
|
||||
}
|
||||
|
||||
virtual void OnHundredthTick()
|
||||
{
|
||||
if (--this->duration == 0) delete this;
|
||||
}
|
||||
|
||||
~ErrmsgWindow()
|
||||
{
|
||||
SetRedErrorSquare(0);
|
||||
extern StringID _switch_mode_errorstr;
|
||||
_switch_mode_errorstr = INVALID_STRING_ID;
|
||||
}
|
||||
|
||||
virtual bool OnKeyPress(uint16 key, uint16 keycode)
|
||||
{
|
||||
if (keycode != WKC_SPACE) return true;
|
||||
delete this;
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
void ShowErrorMessage(StringID msg_1, StringID msg_2, int x, int y)
|
||||
{
|
||||
DeleteWindowById(WC_ERRMSG, 0);
|
||||
|
||||
if (msg_2 == STR_NULL) msg_2 = STR_EMPTY;
|
||||
if (!_patches.errmsg_duration) return;
|
||||
|
||||
_errmsg_message_1 = msg_1;
|
||||
_errmsg_message_2 = msg_2;
|
||||
CopyOutDParam(_errmsg_decode_params, 0, lengthof(_errmsg_decode_params));
|
||||
_errmsg_duration = _patches.errmsg_duration;
|
||||
if (!_errmsg_duration) return;
|
||||
if (msg_2 == STR_NULL) msg_2 = STR_EMPTY;
|
||||
|
||||
Point pt;
|
||||
const ViewPort *vp;
|
||||
Window *w;
|
||||
|
||||
if (_errmsg_message_1 != STR_013B_OWNED_BY || GetDParamX(_errmsg_decode_params,2) >= 8) {
|
||||
if (msg_1 != STR_013B_OWNED_BY || GetDParam(2) >= 8) {
|
||||
if ((x | y) != 0) {
|
||||
pt = RemapCoords2(x, y);
|
||||
vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport;
|
||||
@ -453,7 +447,7 @@ void ShowErrorMessage(StringID msg_1, StringID msg_2, int x, int y)
|
||||
pt.x = (_screen.width - 240) >> 1;
|
||||
pt.y = (_screen.height - 46) >> 1;
|
||||
}
|
||||
w = new Window(pt.x, pt.y, 240, 46, ErrmsgWndProc, WC_ERRMSG, _errmsg_widgets);
|
||||
new ErrmsgWindow(pt, 240, 46, msg_1, msg_2, _errmsg_widgets);
|
||||
} else {
|
||||
if ((x | y) != 0) {
|
||||
pt = RemapCoords2(x, y);
|
||||
@ -464,13 +458,10 @@ void ShowErrorMessage(StringID msg_1, StringID msg_2, int x, int y)
|
||||
pt.x = (_screen.width - 334) >> 1;
|
||||
pt.y = (_screen.height - 137) >> 1;
|
||||
}
|
||||
w = new Window(pt.x, pt.y, 334, 137, ErrmsgWndProc, WC_ERRMSG, _errmsg_face_widgets);
|
||||
new ErrmsgWindow(pt, 334, 137, msg_1, msg_2, _errmsg_face_widgets);
|
||||
}
|
||||
|
||||
w->desc_flags = WDF_STD_BTN | WDF_DEF_WIDGET;
|
||||
}
|
||||
|
||||
|
||||
void ShowEstimatedCostOrIncome(Money cost, int x, int y)
|
||||
{
|
||||
StringID msg = STR_0805_ESTIMATED_COST;
|
||||
|
Loading…
Reference in New Issue
Block a user