Tracerestrict: Add button to duplicate instruction/block

This commit is contained in:
Jonathan G Rennison
2023-05-05 23:34:30 +01:00
parent b089b561a5
commit 65cc6623dd
4 changed files with 142 additions and 35 deletions

View File

@@ -93,6 +93,7 @@ enum TraceRestrictWindowWidgets {
TR_WIDGET_RESET,
TR_WIDGET_COPY,
TR_WIDGET_COPY_APPEND,
TR_WIDGET_DUPLICATE,
TR_WIDGET_SHARE,
TR_WIDGET_UNSHARE,
};
@@ -133,6 +134,7 @@ enum PanelWidgets {
// Copy
DPC_COPY = 0,
DPC_APPEND,
DPC_DUPLICATE,
};
/**
@@ -1917,6 +1919,19 @@ public:
break;
}
case TR_WIDGET_DUPLICATE: {
TraceRestrictItem item = this->GetSelected();
if (this->GetOwner() != _local_company || item == 0) {
return;
}
uint32 offset = this->selected_instruction - 1;
this->expecting_inserted_item = item;
TraceRestrictDoCommandP(tile, track, TRDCT_DUPLICATE_ITEM,
offset, 0, STR_TRACE_RESTRICT_ERROR_CAN_T_MOVE_ITEM);
break;
}
case TR_WIDGET_CONDFLAGS: {
TraceRestrictItem item = this->GetSelected();
if (this->GetOwner() != _local_company || item == 0) {
@@ -2809,6 +2824,21 @@ private:
return false;
}
bool IsDuplicateBtnUsable() const {
const TraceRestrictProgram *prog = this->GetProgram();
if (!prog) return false;
TraceRestrictItem item = this->GetSelected();
if (GetTraceRestrictType(item) == TRIT_NULL) return false;
uint32 offset = this->selected_instruction - 1;
if (TraceRestrictProgramDuplicateItemAtDryRun(prog->items, offset)) {
return true;
}
return false;
}
/**
* Update button states, text values, etc.
*/
@@ -2866,6 +2896,7 @@ private:
this->DisableWidget(TR_WIDGET_UP_BTN);
this->DisableWidget(TR_WIDGET_DOWN_BTN);
this->DisableWidget(TR_WIDGET_DUPLICATE);
this->EnableWidget(TR_WIDGET_COPY_APPEND);
@@ -2875,7 +2906,6 @@ private:
middle_sel->SetDisplayedPlane(DPM_BLANK);
right_sel->SetDisplayedPlane(DPR_BLANK);
share_sel->SetDisplayedPlane(DPS_SHARE);
copy_sel->SetDisplayedPlane(_ctrl_pressed ? DPC_APPEND : DPC_COPY);
const TraceRestrictProgram *prog = this->GetProgram();
@@ -2899,6 +2929,8 @@ private:
return;
}
int copy_panel = DPC_DUPLICATE;
if (prog && prog->refcount > 1) {
// program is shared, show and enable unshare button, and reset button
share_sel->SetDisplayedPlane(DPS_UNSHARE);
@@ -2911,8 +2943,12 @@ private:
// program is empty and not shared, show copy and share buttons
this->EnableWidget(TR_WIDGET_COPY);
this->EnableWidget(TR_WIDGET_SHARE);
copy_panel = DPC_COPY;
}
this->GetWidget<NWidgetCore>(TR_WIDGET_COPY_APPEND)->tool_tip = (copy_panel == DPC_DUPLICATE) ? STR_TRACE_RESTRICT_DUPLICATE_TOOLTIP : STR_TRACE_RESTRICT_COPY_TOOLTIP;
copy_sel->SetDisplayedPlane(_ctrl_pressed ? DPC_APPEND : copy_panel);
// haven't selected instruction
if (this->selected_instruction < 1) {
this->SetDirty();
@@ -3266,6 +3302,7 @@ private:
}
if (this->IsUpDownBtnUsable(true)) this->EnableWidget(TR_WIDGET_UP_BTN);
if (this->IsUpDownBtnUsable(false)) this->EnableWidget(TR_WIDGET_DOWN_BTN);
if (this->IsDuplicateBtnUsable()) this->EnableWidget(TR_WIDGET_DUPLICATE);
}
this->SetDirty();
@@ -3460,6 +3497,8 @@ static const NWidgetPart _nested_program_widgets[] = {
SetDataTip(STR_TRACE_RESTRICT_COPY, STR_TRACE_RESTRICT_COPY_TOOLTIP), SetResize(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_GREY, TR_WIDGET_COPY_APPEND), SetMinimalSize(124, 12), SetFill(1, 0),
SetDataTip(STR_TRACE_RESTRICT_APPEND, STR_TRACE_RESTRICT_COPY_TOOLTIP), SetResize(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_GREY, TR_WIDGET_DUPLICATE), SetMinimalSize(124, 12), SetFill(1, 0),
SetDataTip(STR_TRACE_RESTRICT_DUPLICATE, STR_TRACE_RESTRICT_DUPLICATE_TOOLTIP), SetResize(1, 0),
EndContainer(),
NWidget(NWID_SELECTION, INVALID_COLOUR, TR_WIDGET_SEL_SHARE),
NWidget(WWT_TEXTBTN, COLOUR_GREY, TR_WIDGET_SHARE), SetMinimalSize(124, 12), SetFill(1, 0),