From 0902243ab33f5730cd536b857793e926842b37d6 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 6 Nov 2020 18:23:05 +0000 Subject: [PATCH] Allow changing the colour of plans --- src/command.cpp | 2 ++ src/command_type.h | 1 + src/gfx.cpp | 19 +++++++++++++ src/gfx_func.h | 1 + src/lang/english.txt | 2 ++ src/plans_base.h | 9 ++++++- src/plans_cmd.cpp | 28 +++++++++++++++++++ src/plans_gui.cpp | 46 +++++++++++++++++++++++++++++--- src/saveload/extended_ver_sl.cpp | 2 +- src/saveload/plans_sl.cpp | 1 + src/viewport.cpp | 4 +-- src/widgets/plans_widget.h | 1 + 12 files changed, 109 insertions(+), 7 deletions(-) diff --git a/src/command.cpp b/src/command.cpp index cf0a48a4ff..52c2883ef1 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -269,6 +269,7 @@ CommandProcEx CmdAddPlanLine; CommandProc CmdRemovePlan; CommandProc CmdRemovePlanLine; CommandProc CmdChangePlanVisibility; +CommandProc CmdChangePlanColour; CommandProc CmdRenamePlan; CommandProc CmdDesyncCheck; @@ -498,6 +499,7 @@ static const Command _command_proc_table[] = { DEF_CMD(CmdRemovePlan, CMD_NO_TEST, CMDT_OTHER_MANAGEMENT ), // CMD_REMOVE_PLAN DEF_CMD(CmdRemovePlanLine, CMD_NO_TEST, CMDT_OTHER_MANAGEMENT ), // CMD_REMOVE_PLAN_LINE DEF_CMD(CmdChangePlanVisibility, CMD_NO_TEST, CMDT_OTHER_MANAGEMENT ), // CMD_CHANGE_PLAN_VISIBILITY + DEF_CMD(CmdChangePlanColour, CMD_NO_TEST, CMDT_OTHER_MANAGEMENT ), // CMD_CHANGE_PLAN_COLOUR DEF_CMD(CmdRenamePlan, CMD_NO_TEST, CMDT_OTHER_MANAGEMENT ), // CMD_RENAME_PLAN DEF_CMD(CmdDesyncCheck, CMD_SERVER, CMDT_SERVER_SETTING ), // CMD_DESYNC_CHECK diff --git a/src/command_type.h b/src/command_type.h index afb7618030..24ab4fe2a2 100644 --- a/src/command_type.h +++ b/src/command_type.h @@ -451,6 +451,7 @@ enum Commands { CMD_REMOVE_PLAN, CMD_REMOVE_PLAN_LINE, CMD_CHANGE_PLAN_VISIBILITY, + CMD_CHANGE_PLAN_COLOUR, CMD_RENAME_PLAN, CMD_DESYNC_CHECK, ///< Force desync checks to be run diff --git a/src/gfx.cpp b/src/gfx.cpp index f156c77d29..94327af16a 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -57,6 +57,25 @@ static byte _stringwidth_table[FS_END][224]; ///< Cache containing width of ofte DrawPixelInfo *_cur_dpi; byte _colour_gradient[COLOUR_END][8]; +byte _colour_value[COLOUR_END] = { + 133, // COLOUR_DARK_BLUE + 99, // COLOUR_PALE_GREEN, + 48, // COLOUR_PINK, + 68, // COLOUR_YELLOW, + 184, // COLOUR_RED, + 152, // COLOUR_LIGHT_BLUE, + 209, // COLOUR_GREEN, + 95, // COLOUR_DARK_GREEN, + 150, // COLOUR_BLUE, + 79, // COLOUR_CREAM, + 134, // COLOUR_MAUVE, + 174, // COLOUR_PURPLE, + 195, // COLOUR_ORANGE, + 116, // COLOUR_BROWN, + 6, // COLOUR_GREY, + 15, // COLOUR_WHITE, +}; + static void GfxMainBlitterViewport(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub = nullptr, SpriteID sprite_id = SPR_CURSOR_MOUSE); static void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub = nullptr, SpriteID sprite_id = SPR_CURSOR_MOUSE, ZoomLevel zoom = ZOOM_LVL_NORMAL); diff --git a/src/gfx_func.h b/src/gfx_func.h index 7ad56faffd..489592a0cc 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -211,6 +211,7 @@ TextColour GetContrastColour(uint8 background, uint8 threshold = 128); * 8 colours per gradient from darkest (0) to lightest (7) */ extern byte _colour_gradient[COLOUR_END][8]; +extern byte _colour_value[COLOUR_END]; extern bool _palette_remap_grf[]; diff --git a/src/lang/english.txt b/src/lang/english.txt index f8e579d5e6..b48d9b9715 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -5224,6 +5224,8 @@ STR_PLANS_SHOW_ALL_TOOLTIP :{BLACK}Set the STR_PLANS_VISIBILITY_PRIVATE :{BLACK}Make private STR_PLANS_VISIBILITY_PUBLIC :{BLACK}Make public STR_PLANS_VISIBILITY_TOOLTIP :{BLACK}Toggle the visibility of a plan (private is yellow, public is blue). A public plan will be displayed in the plan window of the other companies but only its owner can add lines to it. +STR_PLANS_COLOUR :{BLACK}Colour +STR_PLANS_COLOUR_TOOLTIP :{BLACK}Set the colour of a plan. STR_PLANS_DELETE :{BLACK}Delete STR_PLANS_DELETE_TOOLTIP :{BLACK}Delete the selected item in the list STR_PLANS_LIST_ITEM_PLAN :Plan #{NUM}: {NUM} line{P "" s} ({DATE_SHORT}) diff --git a/src/plans_base.h b/src/plans_base.h index e091e2cc7a..7a5f8482d7 100644 --- a/src/plans_base.h +++ b/src/plans_base.h @@ -103,7 +103,7 @@ struct PlanLine { this->visible = visible; } - void MarkDirty() + void MarkDirty() const { const uint sz = (uint) this->tiles.size(); for (uint i = 1; i < sz; i++) { @@ -167,6 +167,7 @@ struct Plan : PlanPool::PoolItem<&_plan_pool> { bool show_lines; Date creation_date; std::string name; + Colours colour; Plan(Owner owner = INVALID_OWNER) { @@ -175,6 +176,7 @@ struct Plan : PlanPool::PoolItem<&_plan_pool> { this->visible = false; this->visible_by_all = false; this->show_lines = false; + this->colour = COLOUR_WHITE; this->temp_line = new PlanLine(); } @@ -261,6 +263,11 @@ struct Plan : PlanPool::PoolItem<&_plan_pool> { return this->visible_by_all; } + void SetPlanColour(Colours colour) + { + if (_current_plan->owner == _local_company) DoCommandP(0, _current_plan->index, colour, CMD_CHANGE_PLAN_COLOUR); + } + const std::string &GetName() const { return this->name; diff --git a/src/plans_cmd.cpp b/src/plans_cmd.cpp index dd02b07928..7ce8efb179 100644 --- a/src/plans_cmd.cpp +++ b/src/plans_cmd.cpp @@ -103,6 +103,34 @@ CommandCost CmdChangePlanVisibility(TileIndex tile, DoCommandFlag flags, uint32 return CommandCost(); } +/** + * Edit the colour of a plan. + * @param tile unused + * @param flags type of operation + * @param p1 plan id + * @param p2 colour + * @param text unused + * @return the cost of this operation or an error + */ +CommandCost CmdChangePlanColour(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +{ + Plan *p = Plan::GetIfValid(p1); + if (p == nullptr) return CMD_ERROR; + if (p2 >= COLOUR_END) return CMD_ERROR; + CommandCost ret = CheckOwnership(p->owner); + if (ret.Failed()) return ret; + if (flags & DC_EXEC) { + p->colour = (Colours)p2; + Window *w = FindWindowById(WC_PLANS, 0); + if (w) w->InvalidateData(INVALID_PLAN, false); + for (const PlanLine *line : p->lines) { + if (line->visible) line->MarkDirty(); + } + if (p->temp_line) p->temp_line->MarkDirty(); + } + return CommandCost(); +} + /** * Delete a plan. * @param tile unused diff --git a/src/plans_gui.cpp b/src/plans_gui.cpp index 5e58df2866..3131ac8004 100644 --- a/src/plans_gui.cpp +++ b/src/plans_gui.cpp @@ -50,6 +50,7 @@ static const NWidgetPart _nested_plans_widgets[] = { NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_PLN_NEW), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_PLANS_NEW_PLAN, STR_NULL), NWidget(WWT_TEXTBTN_2, COLOUR_GREY, WID_PLN_ADD_LINES), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_PLANS_ADD_LINES, STR_PLANS_ADDING_LINES), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_PLN_VISIBILITY), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_PLANS_VISIBILITY_PUBLIC, STR_PLANS_VISIBILITY_TOOLTIP), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_PLN_COLOUR), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_PLANS_COLOUR_TOOLTIP), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_PLN_HIDE_ALL_SEL), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_PLN_HIDE_ALL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_PLANS_HIDE_ALL, STR_PLANS_HIDE_ALL_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_PLN_SHOW_ALL), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_PLANS_SHOW_ALL, STR_PLANS_SHOW_ALL_TOOLTIP), @@ -62,7 +63,7 @@ static const NWidgetPart _nested_plans_widgets[] = { }; static WindowDesc _plans_desc( - WDP_AUTO, "plans", 300, 100, + WDP_AUTO, "plans", 350, 100, WC_PLANS, WC_NONE, WDF_CONSTRUCTION, _nested_plans_widgets, lengthof(_nested_plans_widgets) @@ -148,6 +149,25 @@ struct PlansWindow : Window { case WID_PLN_VISIBILITY: if (_current_plan) _current_plan->ToggleVisibilityByAll(); break; + case WID_PLN_COLOUR: { + if (_current_plan) { + DropDownList list; + auto add_colour = [&](Colours colour) { + list.emplace_back(new DropDownListStringItem(STR_COLOUR_DARK_BLUE + colour, colour, false)); + }; + add_colour(COLOUR_WHITE); + add_colour(COLOUR_YELLOW); + add_colour(COLOUR_LIGHT_BLUE); + add_colour(COLOUR_BLUE); + add_colour(COLOUR_GREEN); + add_colour(COLOUR_PURPLE); + add_colour(COLOUR_ORANGE); + add_colour(COLOUR_BROWN); + add_colour(COLOUR_PINK); + ShowDropDownList(this, std::move(list), _current_plan->colour, widget); + } + break; + } case WID_PLN_LIST: { int new_selected = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_PLN_LIST, WD_FRAMERECT_TOP); if (_ctrl_pressed) { @@ -198,6 +218,17 @@ struct PlansWindow : Window { } } + virtual void OnDropdownSelect(int widget, int index) override + { + switch (widget) { + case WID_PLN_COLOUR: + if (_current_plan && index < COLOUR_END) { + _current_plan->SetPlanColour((Colours)index); + } + break; + } + } + virtual void OnQueryTextFinished(char *str) { if (_current_plan == nullptr || str == nullptr) return; @@ -219,10 +250,10 @@ struct PlansWindow : Window { this->SetWidgetDisabledState(WID_PLN_SHOW_ALL, this->vscroll->GetCount() == 0); this->hide_all_sel->SetDisplayedPlane(this->vscroll->GetCount() != 0 && this->AllPlansHidden() ? 1 : 0); if (_current_plan) { - this->SetWidgetsDisabledState(_current_plan->owner != _local_company, WID_PLN_ADD_LINES, WID_PLN_VISIBILITY, WID_PLN_DELETE, WID_PLN_RENAME, WIDGET_LIST_END); + this->SetWidgetsDisabledState(_current_plan->owner != _local_company, WID_PLN_ADD_LINES, WID_PLN_VISIBILITY, WID_PLN_DELETE, WID_PLN_RENAME, WID_PLN_COLOUR, WIDGET_LIST_END); this->GetWidget(WID_PLN_VISIBILITY)->widget_data = _current_plan->visible_by_all ? STR_PLANS_VISIBILITY_PRIVATE : STR_PLANS_VISIBILITY_PUBLIC; } else { - this->SetWidgetsDisabledState(true, WID_PLN_ADD_LINES, WID_PLN_VISIBILITY, WID_PLN_DELETE, WID_PLN_RENAME, WIDGET_LIST_END); + this->SetWidgetsDisabledState(true, WID_PLN_ADD_LINES, WID_PLN_VISIBILITY, WID_PLN_DELETE, WID_PLN_RENAME, WID_PLN_COLOUR, WIDGET_LIST_END); } this->DrawWidgets(); } @@ -274,6 +305,15 @@ struct PlansWindow : Window { } } + void SetStringParameters(int widget) const override + { + switch (widget) { + case WID_PLN_COLOUR: + SetDParam(0, _current_plan ? STR_COLOUR_DARK_BLUE + _current_plan->colour : STR_PLANS_COLOUR); + break; + } + } + virtual void OnResize() { this->vscroll->SetCapacityFromWidget(this, WID_PLN_LIST, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM); diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index db84bb2126..1fc1632b89 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -87,7 +87,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { { XSLFI_TT_WAIT_IN_DEPOT, XSCF_NULL, 1, 1, "tt_wait_in_depot", nullptr, nullptr, nullptr }, { XSLFI_AUTO_TIMETABLE, XSCF_NULL, 5, 5, "auto_timetables", nullptr, nullptr, nullptr }, { XSLFI_VEHICLE_REPAIR_COST, XSCF_NULL, 2, 2, "vehicle_repair_cost", nullptr, nullptr, nullptr }, - { XSLFI_ENH_VIEWPORT_PLANS, XSCF_IGNORABLE_ALL, 3, 3, "enh_viewport_plans", nullptr, nullptr, "PLAN" }, + { XSLFI_ENH_VIEWPORT_PLANS, XSCF_IGNORABLE_ALL, 4, 4, "enh_viewport_plans", nullptr, nullptr, "PLAN" }, { XSLFI_INFRA_SHARING, XSCF_NULL, 2, 2, "infra_sharing", nullptr, nullptr, "CPDP" }, { XSLFI_VARIABLE_DAY_LENGTH, XSCF_NULL, 2, 2, "variable_day_length", nullptr, nullptr, nullptr }, { XSLFI_ORDER_OCCUPANCY, XSCF_NULL, 2, 2, "order_occupancy", nullptr, nullptr, nullptr }, diff --git a/src/saveload/plans_sl.cpp b/src/saveload/plans_sl.cpp index 9e1e51c0ba..a1123b9b9c 100644 --- a/src/saveload/plans_sl.cpp +++ b/src/saveload/plans_sl.cpp @@ -21,6 +21,7 @@ static const SaveLoad _plan_desc[] = { SLE_VAR(Plan, creation_date, SLE_INT32), SLE_CONDSSSTR_X(Plan, name, 0, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_ENH_VIEWPORT_PLANS, 3)), SLE_CONDSSSTR_X(Plan, name, 0, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP, SL_JOKER_1_20)), + SLE_CONDVAR_X(Plan, colour, SLE_UINT8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_ENH_VIEWPORT_PLANS, 4)), SLE_END() }; diff --git a/src/viewport.cpp b/src/viewport.cpp index eb1ed70b69..02304b8d48 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -2484,7 +2484,7 @@ void ViewportDrawPlans(const Viewport *vp) if (pl->focused) { GfxDrawLine(from_x, from_y, to_x, to_y, PC_RED, 1); } else { - GfxDrawLine(from_x, from_y, to_x, to_y, PC_WHITE, 1); + GfxDrawLine(from_x, from_y, to_x, to_y, _colour_value[p->colour], 1); } } } @@ -2511,7 +2511,7 @@ void ViewportDrawPlans(const Viewport *vp) const int to_x = UnScaleByZoom(to_pt.x, vp->zoom); const int to_y = UnScaleByZoom(to_pt.y, vp->zoom); - GfxDrawLine(from_x, from_y, to_x, to_y, PC_WHITE, 3, 1); + GfxDrawLine(from_x, from_y, to_x, to_y, _colour_value[_current_plan->colour], 3, 1); } } diff --git a/src/widgets/plans_widget.h b/src/widgets/plans_widget.h index 296ba342c9..1fb8a02edc 100644 --- a/src/widgets/plans_widget.h +++ b/src/widgets/plans_widget.h @@ -18,6 +18,7 @@ enum PlansWidgets { WID_PLN_NEW, WID_PLN_ADD_LINES, WID_PLN_VISIBILITY, + WID_PLN_COLOUR, WID_PLN_HIDE_ALL, WID_PLN_SHOW_ALL, WID_PLN_DELETE,