Allow changing the colour of plans

This commit is contained in:
Jonathan G Rennison
2020-11-06 18:23:05 +00:00
parent e7f552844b
commit 0902243ab3
12 changed files with 109 additions and 7 deletions

View File

@@ -269,6 +269,7 @@ CommandProcEx CmdAddPlanLine;
CommandProc CmdRemovePlan; CommandProc CmdRemovePlan;
CommandProc CmdRemovePlanLine; CommandProc CmdRemovePlanLine;
CommandProc CmdChangePlanVisibility; CommandProc CmdChangePlanVisibility;
CommandProc CmdChangePlanColour;
CommandProc CmdRenamePlan; CommandProc CmdRenamePlan;
CommandProc CmdDesyncCheck; 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(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(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(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(CmdRenamePlan, CMD_NO_TEST, CMDT_OTHER_MANAGEMENT ), // CMD_RENAME_PLAN
DEF_CMD(CmdDesyncCheck, CMD_SERVER, CMDT_SERVER_SETTING ), // CMD_DESYNC_CHECK DEF_CMD(CmdDesyncCheck, CMD_SERVER, CMDT_SERVER_SETTING ), // CMD_DESYNC_CHECK

View File

@@ -451,6 +451,7 @@ enum Commands {
CMD_REMOVE_PLAN, CMD_REMOVE_PLAN,
CMD_REMOVE_PLAN_LINE, CMD_REMOVE_PLAN_LINE,
CMD_CHANGE_PLAN_VISIBILITY, CMD_CHANGE_PLAN_VISIBILITY,
CMD_CHANGE_PLAN_COLOUR,
CMD_RENAME_PLAN, CMD_RENAME_PLAN,
CMD_DESYNC_CHECK, ///< Force desync checks to be run CMD_DESYNC_CHECK, ///< Force desync checks to be run

View File

@@ -57,6 +57,25 @@ static byte _stringwidth_table[FS_END][224]; ///< Cache containing width of ofte
DrawPixelInfo *_cur_dpi; DrawPixelInfo *_cur_dpi;
byte _colour_gradient[COLOUR_END][8]; 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 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); 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);

View File

@@ -211,6 +211,7 @@ TextColour GetContrastColour(uint8 background, uint8 threshold = 128);
* 8 colours per gradient from darkest (0) to lightest (7) * 8 colours per gradient from darkest (0) to lightest (7)
*/ */
extern byte _colour_gradient[COLOUR_END][8]; extern byte _colour_gradient[COLOUR_END][8];
extern byte _colour_value[COLOUR_END];
extern bool _palette_remap_grf[]; extern bool _palette_remap_grf[];

View File

@@ -5224,6 +5224,8 @@ STR_PLANS_SHOW_ALL_TOOLTIP :{BLACK}Set the
STR_PLANS_VISIBILITY_PRIVATE :{BLACK}Make private STR_PLANS_VISIBILITY_PRIVATE :{BLACK}Make private
STR_PLANS_VISIBILITY_PUBLIC :{BLACK}Make public 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_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 :{BLACK}Delete
STR_PLANS_DELETE_TOOLTIP :{BLACK}Delete the selected item in the list 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}) STR_PLANS_LIST_ITEM_PLAN :Plan #{NUM}: {NUM} line{P "" s} ({DATE_SHORT})

View File

@@ -103,7 +103,7 @@ struct PlanLine {
this->visible = visible; this->visible = visible;
} }
void MarkDirty() void MarkDirty() const
{ {
const uint sz = (uint) this->tiles.size(); const uint sz = (uint) this->tiles.size();
for (uint i = 1; i < sz; i++) { for (uint i = 1; i < sz; i++) {
@@ -167,6 +167,7 @@ struct Plan : PlanPool::PoolItem<&_plan_pool> {
bool show_lines; bool show_lines;
Date creation_date; Date creation_date;
std::string name; std::string name;
Colours colour;
Plan(Owner owner = INVALID_OWNER) Plan(Owner owner = INVALID_OWNER)
{ {
@@ -175,6 +176,7 @@ struct Plan : PlanPool::PoolItem<&_plan_pool> {
this->visible = false; this->visible = false;
this->visible_by_all = false; this->visible_by_all = false;
this->show_lines = false; this->show_lines = false;
this->colour = COLOUR_WHITE;
this->temp_line = new PlanLine(); this->temp_line = new PlanLine();
} }
@@ -261,6 +263,11 @@ struct Plan : PlanPool::PoolItem<&_plan_pool> {
return this->visible_by_all; 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 const std::string &GetName() const
{ {
return this->name; return this->name;

View File

@@ -103,6 +103,34 @@ CommandCost CmdChangePlanVisibility(TileIndex tile, DoCommandFlag flags, uint32
return CommandCost(); 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. * Delete a plan.
* @param tile unused * @param tile unused

View File

@@ -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_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_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_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(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_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), 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( static WindowDesc _plans_desc(
WDP_AUTO, "plans", 300, 100, WDP_AUTO, "plans", 350, 100,
WC_PLANS, WC_NONE, WC_PLANS, WC_NONE,
WDF_CONSTRUCTION, WDF_CONSTRUCTION,
_nested_plans_widgets, lengthof(_nested_plans_widgets) _nested_plans_widgets, lengthof(_nested_plans_widgets)
@@ -148,6 +149,25 @@ struct PlansWindow : Window {
case WID_PLN_VISIBILITY: case WID_PLN_VISIBILITY:
if (_current_plan) _current_plan->ToggleVisibilityByAll(); if (_current_plan) _current_plan->ToggleVisibilityByAll();
break; 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: { case WID_PLN_LIST: {
int new_selected = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_PLN_LIST, WD_FRAMERECT_TOP); int new_selected = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_PLN_LIST, WD_FRAMERECT_TOP);
if (_ctrl_pressed) { 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) virtual void OnQueryTextFinished(char *str)
{ {
if (_current_plan == nullptr || str == nullptr) return; 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->SetWidgetDisabledState(WID_PLN_SHOW_ALL, this->vscroll->GetCount() == 0);
this->hide_all_sel->SetDisplayedPlane(this->vscroll->GetCount() != 0 && this->AllPlansHidden() ? 1 : 0); this->hide_all_sel->SetDisplayedPlane(this->vscroll->GetCount() != 0 && this->AllPlansHidden() ? 1 : 0);
if (_current_plan) { 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<NWidgetCore>(WID_PLN_VISIBILITY)->widget_data = _current_plan->visible_by_all ? STR_PLANS_VISIBILITY_PRIVATE : STR_PLANS_VISIBILITY_PUBLIC; this->GetWidget<NWidgetCore>(WID_PLN_VISIBILITY)->widget_data = _current_plan->visible_by_all ? STR_PLANS_VISIBILITY_PRIVATE : STR_PLANS_VISIBILITY_PUBLIC;
} else { } 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(); 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() virtual void OnResize()
{ {
this->vscroll->SetCapacityFromWidget(this, WID_PLN_LIST, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM); this->vscroll->SetCapacityFromWidget(this, WID_PLN_LIST, WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM);

View File

@@ -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_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_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_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_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_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 }, { XSLFI_ORDER_OCCUPANCY, XSCF_NULL, 2, 2, "order_occupancy", nullptr, nullptr, nullptr },

View File

@@ -21,6 +21,7 @@ static const SaveLoad _plan_desc[] = {
SLE_VAR(Plan, creation_date, SLE_INT32), 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_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_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() SLE_END()
}; };

View File

@@ -2484,7 +2484,7 @@ void ViewportDrawPlans(const Viewport *vp)
if (pl->focused) { if (pl->focused) {
GfxDrawLine(from_x, from_y, to_x, to_y, PC_RED, 1); GfxDrawLine(from_x, from_y, to_x, to_y, PC_RED, 1);
} else { } 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_x = UnScaleByZoom(to_pt.x, vp->zoom);
const int to_y = UnScaleByZoom(to_pt.y, 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);
} }
} }

View File

@@ -18,6 +18,7 @@ enum PlansWidgets {
WID_PLN_NEW, WID_PLN_NEW,
WID_PLN_ADD_LINES, WID_PLN_ADD_LINES,
WID_PLN_VISIBILITY, WID_PLN_VISIBILITY,
WID_PLN_COLOUR,
WID_PLN_HIDE_ALL, WID_PLN_HIDE_ALL,
WID_PLN_SHOW_ALL, WID_PLN_SHOW_ALL,
WID_PLN_DELETE, WID_PLN_DELETE,