diff --git a/gui.h b/gui.h index cb7c20af97..f6e7bce59f 100644 --- a/gui.h +++ b/gui.h @@ -17,7 +17,7 @@ void ShowGameOptions(void); void ShowGameDifficulty(void); void ShowPatchesSelection(void); void ShowNewgrf(void); -void DrawArrowButtons(int x, int y, int ctab, byte state, bool enabled); +void DrawArrowButtons(int x, int y, int ctab, byte state, bool clickable_left, bool clickable_right); /* graph_gui.c */ void ShowOperatingProfitGraph(void); diff --git a/industry_gui.c b/industry_gui.c index 5810009cc9..cec302b553 100644 --- a/industry_gui.c +++ b/industry_gui.c @@ -270,6 +270,14 @@ void ShowBuildIndustryWindow(void) AllocateWindowDescFront(_industry_window_desc[_patches.build_rawmaterial_ind][_opt_ptr->landscape],0); } +static inline bool isProductionMinimum(const Industry *i, int pt) { + return i->production_rate[pt] == 1; +} + +static inline bool isProductionMaximum(const Industry *i, int pt) { + return i->production_rate[pt] == 255; +} + static inline bool IsProductionAlterable(const Industry *i) { return ((_game_mode == GM_EDITOR || _cheats.setup_prod.value) && @@ -314,8 +322,10 @@ static void IndustryViewWndProc(Window *w, WindowEvent *e) SetDParam(2, i->pct_transported[0] * 100 >> 8); DrawString(4 + (IsProductionAlterable(i) ? 30 : 0), 127, STR_482B_TRANSPORTED, 0); // Let's put out those buttons.. - if (IsProductionAlterable(i)) - DrawArrowButtons(5, 127, 3, (WP(w,vp2_d).data_2 == 1) ? WP(w,vp2_d).data_3 : 0, true); + if (IsProductionAlterable(i)) { + DrawArrowButtons(5, 127, 3, (WP(w,vp2_d).data_2 == 1) ? WP(w,vp2_d).data_3 : 0, + !isProductionMinimum(i, 0), !isProductionMaximum(i, 0)); + } if (i->produced_cargo[1] != CT_INVALID) { SetDParam(0, _cargoc.names_long[i->produced_cargo[1]]); @@ -323,8 +333,10 @@ static void IndustryViewWndProc(Window *w, WindowEvent *e) SetDParam(2, i->pct_transported[1] * 100 >> 8); DrawString(4 + (IsProductionAlterable(i) ? 30 : 0), 137, STR_482B_TRANSPORTED, 0); // Let's put out those buttons.. - if (IsProductionAlterable(i)) - DrawArrowButtons(5, 137, 3, (WP(w,vp2_d).data_2 == 2) ? WP(w,vp2_d).data_3 : 0, true); + if (IsProductionAlterable(i)) { + DrawArrowButtons(5, 137, 3, (WP(w,vp2_d).data_2 == 2) ? WP(w,vp2_d).data_3 : 0, + !isProductionMinimum(i, 1), !isProductionMaximum(i, 1)); + } } } @@ -350,8 +362,10 @@ static void IndustryViewWndProc(Window *w, WindowEvent *e) if (IS_INT_INSIDE(x, 5, 25) ) { /* Clicked buttons, decrease or increase production */ if (x < 15) { + if (isProductionMinimum(i, line)) return; i->production_rate[line] = maxu(i->production_rate[line] / 2, 1); } else { + if (isProductionMaximum(i, line)) return; i->production_rate[line] = minu(i->production_rate[line] * 2, 255); } diff --git a/misc_gui.c b/misc_gui.c index d17a8aa90f..de3b048a89 100644 --- a/misc_gui.c +++ b/misc_gui.c @@ -1776,7 +1776,7 @@ static void CheatsWndProc(Window *w, WindowEvent *e) char buf[512]; /* Draw [<][>] boxes for settings of an integer-type */ - DrawArrowButtons(x + 20, y, 3, clk - (i * 2), true); + DrawArrowButtons(x + 20, y, 3, clk - (i * 2), true, true); switch (ce->str) { /* Display date for change date cheat */ diff --git a/settings_gui.c b/settings_gui.c index 3f7bb56301..c93833c16e 100644 --- a/settings_gui.c +++ b/settings_gui.c @@ -734,11 +734,11 @@ static void PatchesSelectionWndProc(Window *w, WindowEvent *e) } else { int32 value; - /* Draw [<][>] boxes for settings of an integer-type */ - DrawArrowButtons(x, y, 3, WP(w,def_d).data_2 - (i * 2), editable); - value = (int32)ReadValue(var, sd->save.conv); + /* Draw [<][>] boxes for settings of an integer-type */ + DrawArrowButtons(x, y, 3, WP(w,def_d).data_2 - (i * 2), (editable && value != sdb->min), (editable && value != sdb->max)); + disabled = (value == 0) && (sdb->flags & SGF_0ISDISABLED); if (disabled) { SetDParam(0, STR_CONFIG_PATCHES_DISABLED); @@ -1049,20 +1049,29 @@ void ShowNewgrf(void) w->disabled_state = (1 << 5) | (1 << 6) | (1 << 7); } -/** Draw [<][>] boxes - * state: 0 = none clicked, 1 = first clicked, 2 = second clicked */ -void DrawArrowButtons(int x, int y, int ctab, byte state, bool enabled) +/** + * Draw [<][>] boxes. + * @param x the x position to draw + * @param y the y position to draw + * @param ctab the color of the buttons + * @param state 0 = none clicked, 1 = first clicked, 2 = second clicked + * @param clickable_left is the left button clickable? + * @param clickable_right is the right button clickable? + */ +void DrawArrowButtons(int x, int y, int ctab, byte state, bool clickable_left, bool clickable_right) { - DrawFrameRect(x, y+1, x + 9, y+9, ctab, (state == 1) ? FR_LOWERED : 0); - DrawFrameRect(x+10, y+1, x +19, y+9, ctab, (state == 2) ? FR_LOWERED : 0); - DrawStringCentered(x+ 5, y+1, STR_6819, 0); // [<] - DrawStringCentered(x+15, y+1, STR_681A, 0); // [>] + int color = PALETTE_MODIFIER_GREYOUT | _color_list[3].unk2; - if (!enabled) { - int color = PALETTE_MODIFIER_GREYOUT | _color_list[3].unk2; - GfxFillRect(x+ 1, y+1, x+ 1+8, y+8, color); - GfxFillRect(x+11, y+1, x+11+8, y+8, color); - } + DrawFrameRect(x, y + 1, x + 9, y + 9, ctab, (state == 1) ? FR_LOWERED : 0); + DrawFrameRect(x + 10, y + 1, x + 19, y + 9, ctab, (state == 2) ? FR_LOWERED : 0); + DrawStringCentered(x + 5, y + 1, STR_6819, 0); // [<] + DrawStringCentered(x + 15, y + 1, STR_681A, 0); // [>] + + /* Grey out the buttons that aren't clickable */ + if (!clickable_left) + GfxFillRect(x + 1, y + 1, x + 1 + 8, y + 8, color); + if (!clickable_right) + GfxFillRect(x + 11, y + 1, x + 11 + 8, y + 8, color); } static char _str_separator[2]; @@ -1076,7 +1085,7 @@ static void CustCurrencyWndProc(Window *w, WindowEvent *e) DrawWindowWidgets(w); // exchange rate - DrawArrowButtons(10, y, 3, (clk >> (i*2)) & 0x03, true); + DrawArrowButtons(10, y, 3, (clk >> (i*2)) & 0x03, true, true); SetDParam(0, 1); SetDParam(1, 1); DrawString(x, y + 1, STR_CURRENCY_EXCHANGE_RATE, 0); @@ -1109,7 +1118,7 @@ static void CustCurrencyWndProc(Window *w, WindowEvent *e) i++; // switch to euro - DrawArrowButtons(10, y, 3, (clk >> (i*2)) & 0x03, true); + DrawArrowButtons(10, y, 3, (clk >> (i*2)) & 0x03, true, true); SetDParam(0, _custom_currency.to_euro); DrawString(x, y + 1, (_custom_currency.to_euro != CF_NOEURO) ? STR_CURRENCY_SWITCH_TO_EURO : STR_CURRENCY_SWITCH_TO_EURO_NEVER, 0); x = 35;