Merge branch 'master' into 1.11
This commit is contained in:
117
src/rail_gui.cpp
117
src/rail_gui.cpp
@@ -43,6 +43,7 @@
|
||||
#include "widgets/rail_widget.h"
|
||||
|
||||
#include "citymania/cm_hotkeys.hpp"
|
||||
#include "citymania/cm_highlight.hpp"
|
||||
#include "citymania/cm_station_gui.hpp"
|
||||
|
||||
#include "safeguards.h"
|
||||
@@ -508,30 +509,6 @@ RoadBits FindRailsToConnect(TileIndex tile) {
|
||||
return passing;
|
||||
}
|
||||
|
||||
/*
|
||||
* Selects orientation for rail object (depot)
|
||||
*/
|
||||
DiagDirection AutodetectRailObjectDirection(TileIndex tile) {
|
||||
RoadBits bits = FindRailsToConnect(tile);
|
||||
// FIXME after this point repeats road autodetection
|
||||
if (HasExactlyOneBit(bits)) return RoadBitsToDiagDir(bits);
|
||||
if (bits == ROAD_NONE) bits = ROAD_ALL;
|
||||
RoadBits frac_bits = DiagDirToRoadBits(TileFractCoordsToDiagDir());
|
||||
if (HasExactlyOneBit(frac_bits & bits)) {
|
||||
return RoadBitsToDiagDir(frac_bits & bits);
|
||||
}
|
||||
frac_bits |= MirrorRoadBits(frac_bits);
|
||||
if (HasExactlyOneBit(frac_bits & bits)) {
|
||||
return RoadBitsToDiagDir(frac_bits & bits);
|
||||
}
|
||||
for (DiagDirection ddir = DIAGDIR_BEGIN; ddir < DIAGDIR_END; ddir++) {
|
||||
if (DiagDirToRoadBits(ddir) & bits) {
|
||||
return ddir;
|
||||
}
|
||||
}
|
||||
NOT_REACHED();
|
||||
}
|
||||
|
||||
/** Rail toolbar management class. */
|
||||
struct BuildRailToolbarWindow : Window {
|
||||
RailType railtype; ///< Rail type to build.
|
||||
@@ -719,6 +696,7 @@ struct BuildRailToolbarWindow : Window {
|
||||
|
||||
case WID_RAT_BUILD_DEPOT:
|
||||
if (HandlePlacePushButton(this, WID_RAT_BUILD_DEPOT, GetRailTypeInfo(_cur_railtype)->cursor.depot, HT_RECT | (HighLightStyle)_build_depot_direction)) {
|
||||
citymania::ResetRotateAutodetection();
|
||||
ShowBuildTrainDepotPicker(this);
|
||||
this->last_user_action = widget;
|
||||
}
|
||||
@@ -850,7 +828,8 @@ struct BuildRailToolbarWindow : Window {
|
||||
case WID_RAT_BUILD_DEPOT:
|
||||
ddir = _build_depot_direction;
|
||||
if (ddir == DIAGDIR_NW + 1) {
|
||||
ddir = AutodetectRailObjectDirection(tile);
|
||||
assert(_thd.cm.type == citymania::ObjectHighlight::Type::RAIL_DEPOT);
|
||||
ddir = _thd.cm.ddir;
|
||||
}
|
||||
DoCommandP(tile, _cur_railtype, ddir,
|
||||
CMD_BUILD_TRAIN_DEPOT | CMD_MSG(STR_ERROR_CAN_T_BUILD_TRAIN_DEPOT),
|
||||
@@ -1120,7 +1099,14 @@ static void HandleStationPlacement(TileIndex start, TileIndex end)
|
||||
ShowSelectStationIfNeeded(cmdcont, ta);
|
||||
}
|
||||
|
||||
|
||||
struct BuildRailStationWindow : public PickerWindowBase {
|
||||
/* CityMania code start */
|
||||
public:
|
||||
enum class Hotkey : int {
|
||||
ROTATE,
|
||||
};
|
||||
/* CityMania code end */
|
||||
private:
|
||||
uint line_height; ///< Height of a single line in the newstation selection matrix (#WID_BRAS_NEWST_LIST widget).
|
||||
uint coverage_height; ///< Height of the coverage texts.
|
||||
@@ -1727,6 +1713,30 @@ public:
|
||||
{
|
||||
CheckRedrawStationCoverage(this);
|
||||
}
|
||||
|
||||
/* CityMania code start */
|
||||
EventState OnHotkey(int hotkey) override
|
||||
{
|
||||
switch ((BuildRailStationWindow::Hotkey)hotkey) {
|
||||
/* Indicate to the OnClick that the action comes from a hotkey rather
|
||||
* then from a click and that the CTRL state should be ignored. */
|
||||
case BuildRailStationWindow::Hotkey::ROTATE:
|
||||
this->RaiseWidget(_railstation.orientation + WID_BRAS_PLATFORM_DIR_X);
|
||||
_railstation.orientation = OtherAxis(_railstation.orientation);
|
||||
this->LowerWidget(_railstation.orientation + WID_BRAS_PLATFORM_DIR_X);
|
||||
this->SetDirty();
|
||||
DeleteWindowById(WC_SELECT_STATION, 0);
|
||||
return ES_HANDLED;
|
||||
|
||||
default:
|
||||
NOT_REACHED();
|
||||
}
|
||||
|
||||
return ES_NOT_HANDLED;
|
||||
}
|
||||
|
||||
static HotkeyList hotkeys;
|
||||
/* CityMania code end */
|
||||
};
|
||||
|
||||
Listing BuildRailStationWindow::last_sorting = { false, 0 };
|
||||
@@ -1841,12 +1851,21 @@ static const NWidgetPart _nested_station_builder_widgets[] = {
|
||||
EndContainer(),
|
||||
};
|
||||
|
||||
/* CityMania code start */
|
||||
static Hotkey build_station_hotkeys[] = {
|
||||
Hotkey(CM_WKC_MOUSE_MIDDLE, "rotate", (int)BuildRailStationWindow::Hotkey::ROTATE),
|
||||
HOTKEY_LIST_END
|
||||
};
|
||||
HotkeyList BuildRailStationWindow::hotkeys("cm_build_rail_station", build_station_hotkeys);
|
||||
/* CityMania code end */
|
||||
|
||||
/** High level window description of the station-build window (default & newGRF) */
|
||||
static WindowDesc _station_builder_desc(
|
||||
WDP_AUTO, "build_station_rail", 350, 0,
|
||||
WC_BUILD_STATION, WC_BUILD_TOOLBAR,
|
||||
WDF_CONSTRUCTION,
|
||||
_nested_station_builder_widgets, lengthof(_nested_station_builder_widgets)
|
||||
_nested_station_builder_widgets, lengthof(_nested_station_builder_widgets),
|
||||
&BuildRailStationWindow::hotkeys // CityMania addition
|
||||
);
|
||||
|
||||
/** Open station build window */
|
||||
@@ -2069,7 +2088,15 @@ static void ShowSignalBuilder(Window *parent)
|
||||
new BuildSignalWindow(&_signal_builder_desc, parent);
|
||||
}
|
||||
|
||||
|
||||
struct BuildRailDepotWindow : public PickerWindowBase {
|
||||
/* CityMania code start */
|
||||
public:
|
||||
enum class Hotkey : int {
|
||||
ROTATE,
|
||||
};
|
||||
/* CityMania code end */
|
||||
|
||||
BuildRailDepotWindow(WindowDesc *desc, Window *parent) : PickerWindowBase(desc, parent)
|
||||
{
|
||||
this->InitNested(TRANSPORT_RAIL);
|
||||
@@ -2116,8 +2143,43 @@ struct BuildRailDepotWindow : public PickerWindowBase {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* CityMania code start */
|
||||
EventState OnHotkey(int hotkey) override
|
||||
{
|
||||
switch ((BuildRailDepotWindow::Hotkey)hotkey) {
|
||||
/* Indicate to the OnClick that the action comes from a hotkey rather
|
||||
* then from a click and that the CTRL state should be ignored. */
|
||||
case BuildRailDepotWindow::Hotkey::ROTATE:
|
||||
if (_build_depot_direction < DIAGDIR_END) {
|
||||
this->RaiseWidget(_build_depot_direction + WID_BRAD_DEPOT_NE);
|
||||
_build_depot_direction = ChangeDiagDir(_build_depot_direction, DIAGDIRDIFF_90RIGHT);
|
||||
this->LowerWidget(_build_depot_direction + WID_BRAD_DEPOT_NE);
|
||||
} else {
|
||||
citymania::RotateAutodetection();
|
||||
}
|
||||
this->SetDirty();
|
||||
return ES_HANDLED;
|
||||
|
||||
default:
|
||||
NOT_REACHED();
|
||||
}
|
||||
|
||||
return ES_NOT_HANDLED;
|
||||
}
|
||||
|
||||
static HotkeyList hotkeys;
|
||||
/* CityMania code end */
|
||||
};
|
||||
|
||||
/* CityMania code start */
|
||||
static Hotkey build_depot_hotkeys[] = {
|
||||
Hotkey(CM_WKC_MOUSE_MIDDLE, "rotate", (int)BuildRailDepotWindow::Hotkey::ROTATE),
|
||||
HOTKEY_LIST_END
|
||||
};
|
||||
HotkeyList BuildRailDepotWindow::hotkeys("cm_build_rail_depot", build_depot_hotkeys);
|
||||
/* CityMania code end */
|
||||
|
||||
/** Nested widget definition of the build rail depot window */
|
||||
static const NWidgetPart _nested_build_depot_widgets[] = {
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
@@ -2159,7 +2221,8 @@ static WindowDesc _build_depot_desc(
|
||||
WDP_AUTO, nullptr, 0, 0,
|
||||
WC_BUILD_DEPOT, WC_BUILD_TOOLBAR,
|
||||
WDF_CONSTRUCTION,
|
||||
_nested_build_depot_widgets, lengthof(_nested_build_depot_widgets)
|
||||
_nested_build_depot_widgets, lengthof(_nested_build_depot_widgets),
|
||||
&BuildRailDepotWindow::hotkeys // CityMania addition
|
||||
);
|
||||
|
||||
static void ShowBuildTrainDepotPicker(Window *parent)
|
||||
|
||||
Reference in New Issue
Block a user