From ed4ba2dda22049d2c0e7dce01179f602bd67f64c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zden=C4=9Bk=20Novotn=C3=BD?= Date: Sun, 17 Oct 2021 01:17:53 +0200 Subject: [PATCH 1/2] Add Lane Edditing First test will be to lane inversion --- .../NodeControllerRenewal.csproj | 7 +- .../Properties/Localize.Designer.cs | 211 ++++++++++-------- .../Properties/Localize.resx | 12 + NodeControllerRenewal/Tool.cs | 4 +- NodeControllerRenewal/ToolModes/EditNode.cs | 4 + NodeControllerRenewal/ToolModes/LaneChange.cs | 119 ++++++++++ 6 files changed, 262 insertions(+), 95 deletions(-) create mode 100644 NodeControllerRenewal/ToolModes/LaneChange.cs diff --git a/NodeControllerRenewal/NodeControllerRenewal.csproj b/NodeControllerRenewal/NodeControllerRenewal.csproj index 2d3ac6f3..f69ee251 100644 --- a/NodeControllerRenewal/NodeControllerRenewal.csproj +++ b/NodeControllerRenewal/NodeControllerRenewal.csproj @@ -129,6 +129,7 @@ + @@ -176,7 +177,9 @@ - + + Designer + @@ -254,7 +257,7 @@ - + diff --git a/NodeControllerRenewal/Properties/Localize.Designer.cs b/NodeControllerRenewal/Properties/Localize.Designer.cs index 7e0f3e32..de1edb49 100644 --- a/NodeControllerRenewal/Properties/Localize.Designer.cs +++ b/NodeControllerRenewal/Properties/Localize.Designer.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// Этот код создан программой. -// Исполняемая версия:4.0.30319.42000 +// Tento kód byl generován nástrojem. +// Verze modulu runtime:4.0.30319.42000 // -// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае -// повторной генерации кода. +// Změny tohoto souboru mohou způsobit nesprávné chování a budou ztraceny, +// dojde-li k novému generování kódu. // //------------------------------------------------------------------------------ @@ -13,12 +13,12 @@ namespace NodeController { /// - /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д. + /// Třída prostředků se silnými typy pro vyhledávání lokalizovaných řetězců atp. /// - // Этот класс создан автоматически классом StronglyTypedResourceBuilder - // с помощью такого средства, как ResGen или Visual Studio. - // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen - // с параметром /str или перестройте свой проект VS. + // Tato třída byla automaticky generována třídou StronglyTypedResourceBuilder + // pomocí nástroje podobného aplikaci ResGen nebo Visual Studio. + // Chcete-li přidat nebo odebrat člena, upravte souboru .ResX a pak znovu spusťte aplikaci ResGen + // s parametrem /str nebo znovu sestavte projekt aplikace Visual Studio. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] @@ -33,7 +33,7 @@ internal Localize() { } /// - /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом. + /// Vrací instanci ResourceManager uloženou v mezipaměti použitou touto třídou. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { @@ -47,8 +47,8 @@ internal Localize() { } /// - /// Перезаписывает свойство CurrentUICulture текущего потока для всех - /// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией. + /// Potlačí vlastnost CurrentUICulture aktuálního vlákna pro všechna + /// vyhledání prostředků pomocí třídy prostředků se silnými typy. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { @@ -61,7 +61,7 @@ internal Localize() { } /// - /// Ищет локализованную строку, похожую на Original Node Controller data was imported. + /// Vyhledá lokalizovaný řetězec podobný Original Node Controller data was imported. ///Backward compatibility does not provide the transfer of all data, may be required manual adjustments.. /// internal static string Mod_BackwardСompatibilityMessage { @@ -71,7 +71,7 @@ internal static string Mod_BackwardСompatibilityMessage { } /// - /// Ищет локализованную строку, похожую на WARNING: If you make a new save, you will no longer be able to use original Node Controller on this map.. + /// Vyhledá lokalizovaný řetězec podobný WARNING: If you make a new save, you will no longer be able to use original Node Controller on this map.. /// internal static string Mod_BackwardСompatibilityWarning { get { @@ -80,7 +80,7 @@ internal static string Mod_BackwardСompatibilityWarning { } /// - /// Ищет локализованную строку, похожую на Control node type and shape. + /// Vyhledá lokalizovaný řetězec podobný Control node type and shape. /// internal static string Mod_Description { get { @@ -89,7 +89,7 @@ internal static string Mod_Description { } /// - /// Ищет локализованную строку, похожую на - Added auto mode for main slope direction. + /// Vyhledá lokalizovaný řetězec podobný - Added auto mode for main slope direction. ///- Added red overlay for short segments (short segments lead wrong vehicle speed). ///- Added the ability reset only offset to default. ///- Added Polish translation. @@ -99,7 +99,7 @@ internal static string Mod_Description { ///- Fix vehicle trailers disappear. ///- Fix road disappear after disasters. ///- Fix wrong train twist direction. - ///- Fix node height in asset e [остаток строки не уместился]";. + ///- Fix node height in asset e [zbytek řetězce byl zkrácen];. /// internal static string Mod_WhatsNewMessage3_0_1 { get { @@ -108,7 +108,7 @@ internal static string Mod_WhatsNewMessage3_0_1 { } /// - /// Ищет локализованную строку, похожую на - Fix node height outside available tiles (5x5). + /// Vyhledá lokalizovaný řetězec podobný - Fix node height outside available tiles (5x5). ///- Fix node center position. ///- Fix crosswalk texture. ///- Fix creating button duplicates @@ -121,7 +121,7 @@ internal static string Mod_WhatsNewMessage3_0_2 { } /// - /// Ищет локализованную строку, похожую на - Added Portuguese translation.. + /// Vyhledá lokalizovaný řetězec podobný - Added Portuguese translation.. /// internal static string Mod_WhatsNewMessage3_0_3 { get { @@ -130,7 +130,7 @@ internal static string Mod_WhatsNewMessage3_0_3 { } /// - /// Ищет локализованную строку, похожую на - Added missing dependencies and mod conflict checker. + /// Vyhledá lokalizovaný řetězec podobný - Added missing dependencies and mod conflict checker. ///- Removed segments collision between train/metro tracks. ///- Fix loading offset if value more then 100m. ///- Fix segment direction correction on shifted segment. @@ -145,7 +145,7 @@ internal static string Mod_WhatsNewMessage3_0_4 { } /// - /// Ищет локализованную строку, похожую на - Fix segments collision calculation. + /// Vyhledá lokalizovaný řetězec podobný - Fix segments collision calculation. ///- Added Chinese Traditional translation.. /// internal static string Mod_WhatsNewMessage3_0_5 { @@ -155,13 +155,13 @@ internal static string Mod_WhatsNewMessage3_0_5 { } /// - /// Ищет локализованную строку, похожую на - Added underground mode (hold Shift to select underground node). + /// Vyhledá lokalizovaný řetězec podobný - Added underground mode (hold Shift to select underground node). ///- Added nearby nodes overlay. ///- Added calculate shift by nearby nodes - set average shift value to node. ///- Added calculate shift by intersections - set shift value for all nodes between intersection for smooth transition (like -2,-1,0,+1,+2). ///- Added set shift between intersections - set this shift value for all nodes between intersection. ///- Added shortcuts, you can bind keys in mod's options. - ///- Added the ability to hide marking and cha [остаток строки не уместился]";. + ///- Added the ability to hide marking and cha [zbytek řetězce byl zkrácen];. /// internal static string Mod_WhatsNewMessage3_1 { get { @@ -170,7 +170,7 @@ internal static string Mod_WhatsNewMessage3_1 { } /// - /// Ищет локализованную строку, похожую на - Fixed not updating nodes after loading map. + /// Vyhledá lokalizovaný řetězec podobný - Fixed not updating nodes after loading map. ///- Added selection step over like in MoveIt. Press Ctrl+Space to step over (you can rebind in mod options). ///- Added setting "Node is sloped by default". By default this option disabled. ///- Added the ability to change node type by scroll wheel. @@ -184,7 +184,7 @@ internal static string Mod_WhatsNewMessage3_1_1 { } /// - /// Ищет локализованную строку, похожую на - Added Indonesian, Korean and Malay translations.. + /// Vyhledá lokalizovaný řetězec podobný - Added Indonesian, Korean and Malay translations.. /// internal static string Mod_WhatsNewMessage3_1_2 { get { @@ -193,7 +193,7 @@ internal static string Mod_WhatsNewMessage3_1_2 { } /// - /// Ищет локализованную строку, похожую на - Added colored text to tooltips. + /// Vyhledá lokalizovaný řetězec podobný - Added colored text to tooltips. ///- Added the ability to hide original mod button in toolbar If you use UUI mod. ///- Added Turkish translation.. /// @@ -204,7 +204,7 @@ internal static string Mod_WhatsNewMessage3_1_3 { } /// - /// Ищет локализованную строку, похожую на Bend. + /// Vyhledá lokalizovaný řetězec podobný Bend. /// internal static string NodeStyle_Bend { get { @@ -213,7 +213,7 @@ internal static string NodeStyle_Bend { } /// - /// Ищет локализованную строку, похожую на Crossing. + /// Vyhledá lokalizovaný řetězec podobný Crossing. /// internal static string NodeStyle_Crossing { get { @@ -222,7 +222,7 @@ internal static string NodeStyle_Crossing { } /// - /// Ищет локализованную строку, похожую на Custom. + /// Vyhledá lokalizovaný řetězec podobný Custom. /// internal static string NodeStyle_Custom { get { @@ -231,7 +231,7 @@ internal static string NodeStyle_Custom { } /// - /// Ищет локализованную строку, похожую на End. + /// Vyhledá lokalizovaný řetězec podobný End. /// internal static string NodeStyle_End { get { @@ -240,7 +240,7 @@ internal static string NodeStyle_End { } /// - /// Ищет локализованную строку, похожую на Middle. + /// Vyhledá lokalizovaný řetězec podobný Middle. /// internal static string NodeStyle_Middle { get { @@ -249,7 +249,7 @@ internal static string NodeStyle_Middle { } /// - /// Ищет локализованную строку, похожую на Stretched. + /// Vyhledá lokalizovaný řetězec podobný Stretched. /// internal static string NodeStyle_Stretch { get { @@ -258,7 +258,7 @@ internal static string NodeStyle_Stretch { } /// - /// Ищет локализованную строку, похожую на UTurn. + /// Vyhledá lokalizovaný řetězec podobný UTurn. /// internal static string NodeStyle_UTurn { get { @@ -267,7 +267,7 @@ internal static string NodeStyle_UTurn { } /// - /// Ищет локализованную строку, похожую на Calculate shift by intersections. + /// Vyhledá lokalizovaný řetězec podobný Calculate shift by intersections. /// internal static string Option_CalculateShiftByIntersections { get { @@ -276,7 +276,7 @@ internal static string Option_CalculateShiftByIntersections { } /// - /// Ищет локализованную строку, похожую на Calculate shift by nearby nodes. + /// Vyhledá lokalizovaný řetězec podobný Calculate shift by nearby nodes. /// internal static string Option_CalculateShiftByNearby { get { @@ -285,7 +285,7 @@ internal static string Option_CalculateShiftByNearby { } /// - /// Ищет локализованную строку, похожую на Reset offset. + /// Vyhledá lokalizovaný řetězec podobný Reset offset. /// internal static string Option_KeepDefault { get { @@ -294,7 +294,7 @@ internal static string Option_KeepDefault { } /// - /// Ищет локализованную строку, похожую на Main slope direction. + /// Vyhledá lokalizovaný řetězec podobný Main slope direction. /// internal static string Option_MainSlopeDirection { get { @@ -303,7 +303,7 @@ internal static string Option_MainSlopeDirection { } /// - /// Ищет локализованную строку, похожую на Auto. + /// Vyhledá lokalizovaný řetězec podobný Auto. /// internal static string Option_MainSlopeDirectionAuto { get { @@ -312,7 +312,7 @@ internal static string Option_MainSlopeDirectionAuto { } /// - /// Ищет локализованную строку, похожую на Manually. + /// Vyhledá lokalizovaný řetězec podobný Manually. /// internal static string Option_MainSlopeDirectionManually { get { @@ -321,7 +321,7 @@ internal static string Option_MainSlopeDirectionManually { } /// - /// Ищет локализованную строку, похожую на Make ends straight. + /// Vyhledá lokalizovaný řetězec podobný Make ends straight. /// internal static string Option_MakeStraightEnds { get { @@ -330,7 +330,7 @@ internal static string Option_MakeStraightEnds { } /// - /// Ищет локализованную строку, похожую на Marking. + /// Vyhledá lokalizovaný řetězec podobný Marking. /// internal static string Option_Marking { get { @@ -339,7 +339,7 @@ internal static string Option_Marking { } /// - /// Ищет локализованную строку, похожую на Offset. + /// Vyhledá lokalizovaný řetězec podobný Offset. /// internal static string Option_Offset { get { @@ -348,7 +348,7 @@ internal static string Option_Offset { } /// - /// Ищет локализованную строку, похожую на {0}m. + /// Vyhledá lokalizovaný řetězec podobný {0}m. /// internal static string Option_OffsetFormat { get { @@ -357,7 +357,7 @@ internal static string Option_OffsetFormat { } /// - /// Ищет локализованную строку, похожую на Reset to default. + /// Vyhledá lokalizovaný řetězec podobný Reset to default. /// internal static string Option_ResetToDefault { get { @@ -366,7 +366,7 @@ internal static string Option_ResetToDefault { } /// - /// Ищет локализованную строку, похожую на Rotate. + /// Vyhledá lokalizovaný řetězec podobný Rotate. /// internal static string Option_Rotate { get { @@ -375,7 +375,7 @@ internal static string Option_Rotate { } /// - /// Ищет локализованную строку, похожую на {0}°. + /// Vyhledá lokalizovaný řetězec podobný {0}°. /// internal static string Option_RotateFormat { get { @@ -384,7 +384,7 @@ internal static string Option_RotateFormat { } /// - /// Ищет локализованную строку, похожую на Set shift between intersections. + /// Vyhledá lokalizovaný řetězec podobný Set shift between intersections. /// internal static string Option_SetShiftBetweenIntersections { get { @@ -393,7 +393,7 @@ internal static string Option_SetShiftBetweenIntersections { } /// - /// Ищет локализованную строку, похожую на Shift. + /// Vyhledá lokalizovaný řetězec podobný Shift. /// internal static string Option_Shift { get { @@ -402,7 +402,7 @@ internal static string Option_Shift { } /// - /// Ищет локализованную строку, похожую на {0}m. + /// Vyhledá lokalizovaný řetězec podobný {0}m. /// internal static string Option_ShiftFormat { get { @@ -411,7 +411,7 @@ internal static string Option_ShiftFormat { } /// - /// Ищет локализованную строку, похожую на Slope. + /// Vyhledá lokalizovaný řetězec podobný Slope. /// internal static string Option_Slope { get { @@ -420,7 +420,7 @@ internal static string Option_Slope { } /// - /// Ищет локализованную строку, похожую на {0}°. + /// Vyhledá lokalizovaný řetězec podobný {0}°. /// internal static string Option_SlopeFormat { get { @@ -429,7 +429,7 @@ internal static string Option_SlopeFormat { } /// - /// Ищет локализованную строку, похожую на Stretch. + /// Vyhledá lokalizovaný řetězec podobný Stretch. /// internal static string Option_Stretch { get { @@ -438,7 +438,7 @@ internal static string Option_Stretch { } /// - /// Ищет локализованную строку, похожую на {0}%. + /// Vyhledá lokalizovaný řetězec podobný {0}%. /// internal static string Option_StretchFormat { get { @@ -447,7 +447,7 @@ internal static string Option_StretchFormat { } /// - /// Ищет локализованную строку, похожую на Style. + /// Vyhledá lokalizovaný řetězec podobný Style. /// internal static string Option_Style { get { @@ -456,7 +456,7 @@ internal static string Option_Style { } /// - /// Ищет локализованную строку, похожую на Flat. + /// Vyhledá lokalizovaný řetězec podobný Flat. /// internal static string Option_StyleFlat { get { @@ -465,7 +465,7 @@ internal static string Option_StyleFlat { } /// - /// Ищет локализованную строку, похожую на Slope. + /// Vyhledá lokalizovaný řetězec podobný Slope. /// internal static string Option_StyleSlope { get { @@ -474,7 +474,7 @@ internal static string Option_StyleSlope { } /// - /// Ищет локализованную строку, похожую на Twist. + /// Vyhledá lokalizovaný řetězec podobný Twist. /// internal static string Option_Twist { get { @@ -483,7 +483,7 @@ internal static string Option_Twist { } /// - /// Ищет локализованную строку, похожую на {0}°. + /// Vyhledá lokalizovaný řetězec podobný {0}°. /// internal static string Option_TwistFormat { get { @@ -492,7 +492,7 @@ internal static string Option_TwistFormat { } /// - /// Ищет локализованную строку, похожую на Node type. + /// Vyhledá lokalizovaný řetězec podobný Node type. /// internal static string Option_Type { get { @@ -501,7 +501,7 @@ internal static string Option_Type { } /// - /// Ищет локализованную строку, похожую на All. + /// Vyhledá lokalizovaný řetězec podobný All. /// internal static string Options_All { get { @@ -510,7 +510,7 @@ internal static string Options_All { } /// - /// Ищет локализованную строку, похожую на Node #{0}. + /// Vyhledá lokalizovaný řetězec podobný Node #{0}. /// internal static string Panel_NodeId { get { @@ -519,7 +519,7 @@ internal static string Panel_NodeId { } /// - /// Ищет локализованную строку, похожую на Calculate shift by intersections. + /// Vyhledá lokalizovaný řetězec podobný Calculate shift by intersections. /// internal static string Setting_ShortcutCalculateShiftByIntersections { get { @@ -528,7 +528,7 @@ internal static string Setting_ShortcutCalculateShiftByIntersections { } /// - /// Ищет локализованную строку, похожую на Calculate shift by nearby nodes. + /// Vyhledá lokalizovaný řetězec podobný Calculate shift by nearby nodes. /// internal static string Setting_ShortcutCalculateShiftByNearby { get { @@ -537,7 +537,7 @@ internal static string Setting_ShortcutCalculateShiftByNearby { } /// - /// Ищет локализованную строку, похожую на Change main slope direction mode. + /// Vyhledá lokalizovaný řetězec podobný Change main slope direction mode. /// internal static string Setting_ShortcutChangeMainRoadMode { get { @@ -546,7 +546,7 @@ internal static string Setting_ShortcutChangeMainRoadMode { } /// - /// Ищет локализованную строку, похожую на Change node style. + /// Vyhledá lokalizovaný řetězec podobný Change node style. /// internal static string Setting_ShortcutChangeNodeStyle { get { @@ -555,7 +555,7 @@ internal static string Setting_ShortcutChangeNodeStyle { } /// - /// Ищет локализованную строку, похожую на Reset offset. + /// Vyhledá lokalizovaný řetězec podobný Reset offset. /// internal static string Setting_ShortcutKeepDefault { get { @@ -564,7 +564,7 @@ internal static string Setting_ShortcutKeepDefault { } /// - /// Ищет локализованную строку, похожую на Make ends straight. + /// Vyhledá lokalizovaný řetězec podobný Make ends straight. /// internal static string Setting_ShortcutMakeStraightEnds { get { @@ -573,7 +573,7 @@ internal static string Setting_ShortcutMakeStraightEnds { } /// - /// Ищет локализованную строку, похожую на Reset to default. + /// Vyhledá lokalizovaný řetězec podobný Reset to default. /// internal static string Setting_ShortcutResetToDefault { get { @@ -582,7 +582,7 @@ internal static string Setting_ShortcutResetToDefault { } /// - /// Ищет локализованную строку, похожую на Set shift between intersections. + /// Vyhledá lokalizovaný řetězec podobný Set shift between intersections. /// internal static string Setting_ShortcutSetShiftBetweenIntersections { get { @@ -591,7 +591,7 @@ internal static string Setting_ShortcutSetShiftBetweenIntersections { } /// - /// Ищет локализованную строку, похожую на Node is sloped by default. + /// Vyhledá lokalizovaný řetězec podobný Node is sloped by default. /// internal static string Settings_NodeIsSlopedByDefault { get { @@ -600,7 +600,7 @@ internal static string Settings_NodeIsSlopedByDefault { } /// - /// Ищет локализованную строку, похожую на Show nearby nodes overlay. + /// Vyhledá lokalizovaný řetězec podobný Show nearby nodes overlay. /// internal static string Settings_RenderNearNode { get { @@ -609,7 +609,7 @@ internal static string Settings_RenderNearNode { } /// - /// Ищет локализованную строку, похожую на Select middle nodes. + /// Vyhledá lokalizovaný řetězec podobný Select middle nodes. /// internal static string Settings_SelectMiddleNodes { get { @@ -618,7 +618,7 @@ internal static string Settings_SelectMiddleNodes { } /// - /// Ищет локализованную строку, похожую на If this option is disabled, the middle nodes will move to clicked position. + /// Vyhledá lokalizovaný řetězec podobný If this option is disabled, the middle nodes will move to clicked position. /// internal static string Settings_SelectMiddleNodesDiscription { get { @@ -627,7 +627,16 @@ internal static string Settings_SelectMiddleNodesDiscription { } /// - /// Ищет локализованную строку, похожую на Hold {0} to alignment roads. + /// Vyhledá lokalizovaný řetězec podobný Set to lane edit mode. + /// + internal static string Settings_ShortcutLaneEdit { + get { + return ResourceManager.GetString("Settings_ShortcutLaneEdit", resourceCulture); + } + } + + /// + /// Vyhledá lokalizovaný řetězec podobný Hold {0} to alignment roads. /// internal static string Tool_InfoAlignMode { get { @@ -636,7 +645,7 @@ internal static string Tool_InfoAlignMode { } /// - /// Ищет локализованную строку, похожую на Click to align with this corner. + /// Vyhledá lokalizovaný řetězec podobný Click to align with this corner. /// internal static string Tool_InfoApplyAlign { get { @@ -645,7 +654,7 @@ internal static string Tool_InfoApplyAlign { } /// - /// Ищет локализованную строку, похожую на Hold {0} to change main slope direction. + /// Vyhledá lokalizovaný řetězec podobný Hold {0} see lane editing. /// internal static string Tool_InfoChangeMainMode { get { @@ -654,7 +663,16 @@ internal static string Tool_InfoChangeMainMode { } /// - /// Ищет локализованную строку, похожую на Node #{0} + /// Vyhledá lokalizovaný řetězec podobný Click to inverse lane direction (full circle outgoing). + /// + internal static string Tool_InfoClickLaneInversion { + get { + return ResourceManager.GetString("Tool_InfoClickLaneInversion", resourceCulture); + } + } + + /// + /// Vyhledá lokalizovaný řetězec podobný Node #{0} ///Click to edit. /// internal static string Tool_InfoClickNode { @@ -664,7 +682,7 @@ internal static string Tool_InfoClickNode { } /// - /// Ищет локализованную строку, похожую на Click to select corner you want to align. + /// Vyhledá lokalizovaný řetězec podobný Click to select corner you want to align. /// internal static string Tool_InfoClickToSelectFirstAlign { get { @@ -673,7 +691,7 @@ internal static string Tool_InfoClickToSelectFirstAlign { } /// - /// Ищет локализованную строку, похожую на Drag to change offset. + /// Vyhledá lokalizovaný řetězec podobný Drag to change offset. /// internal static string Tool_InfoDragCenter { get { @@ -682,7 +700,7 @@ internal static string Tool_InfoDragCenter { } /// - /// Ищет локализованную строку, похожую на Drag to change rotate. + /// Vyhledá lokalizovaný řetězec podobný Drag to change rotate. /// internal static string Tool_InfoDragCircle { get { @@ -691,7 +709,7 @@ internal static string Tool_InfoDragCircle { } /// - /// Ищет локализованную строку, похожую на Drag to change corner offset. + /// Vyhledá lokalizovaný řetězec podobný Drag to change corner offset. /// internal static string Tool_InfoDragCorner { get { @@ -700,7 +718,7 @@ internal static string Tool_InfoDragCorner { } /// - /// Ищет локализованную строку, похожую на Drag this end to change main slope direction. + /// Vyhledá lokalizovaný řetězec podobný Drag this end to change main slope direction. /// internal static string Tool_InfoDragMainSlopeDirectionEnd { get { @@ -709,7 +727,7 @@ internal static string Tool_InfoDragMainSlopeDirectionEnd { } /// - /// Ищет локализованную строку, похожую на Drop this end to change main slope direction. + /// Vyhledá lokalizovaný řetězec podobný Drop this end to change main slope direction. /// internal static string Tool_InfoDropMainSlopeDirectionEnd { get { @@ -718,7 +736,7 @@ internal static string Tool_InfoDropMainSlopeDirectionEnd { } /// - /// Ищет локализованную строку, похожую на Click to insert crossing node. + /// Vyhledá lokalizovaný řetězec podobný Click to insert crossing node. /// internal static string Tool_InfoInsertCrossingNode { get { @@ -727,7 +745,7 @@ internal static string Tool_InfoInsertCrossingNode { } /// - /// Ищет локализованную строку, похожую на Click to insert node. + /// Vyhledá lokalizovaný řetězec podobný Click to insert node. /// internal static string Tool_InfoInsertNode { get { @@ -736,7 +754,16 @@ internal static string Tool_InfoInsertNode { } /// - /// Ищет локализованную строку, похожую на Select corner you want to align with. + /// Vyhledá lokalizovaný řetězec podobný Hold {0} to switch to lane editing mode. + /// + internal static string Tool_InfoLaneEdit { + get { + return ResourceManager.GetString("Tool_InfoLaneEdit", resourceCulture); + } + } + + /// + /// Vyhledá lokalizovaný řetězec podobný Select corner you want to align with. /// internal static string Tool_InfoSelectAlignRelative { get { @@ -745,7 +772,7 @@ internal static string Tool_InfoSelectAlignRelative { } /// - /// Ищет локализованную строку, похожую на Change to desired main slope direction. + /// Vyhledá lokalizovaný řetězec podobný Change to desired main slope direction. /// internal static string Tool_InfoSelectMainSlopeDirection { get { @@ -754,7 +781,7 @@ internal static string Tool_InfoSelectMainSlopeDirection { } /// - /// Ищет локализованную строку, похожую на Select end position of main slope direction. + /// Vyhledá lokalizovaný řetězec podobný Select end position of main slope direction. /// internal static string Tool_InfoSelectNewMainSlopeDirectionEnd { get { @@ -763,7 +790,7 @@ internal static string Tool_InfoSelectNewMainSlopeDirectionEnd { } /// - /// Ищет локализованную строку, похожую на Select node. + /// Vyhledá lokalizovaný řetězec podobný Select node. /// internal static string Tool_InfoSelectNode { get { @@ -772,7 +799,7 @@ internal static string Tool_InfoSelectNode { } /// - /// Ищет локализованную строку, похожую на Select corners you want to align. + /// Vyhledá lokalizovaný řetězec podobný Select corners you want to align. /// internal static string Tool_InfoSelectToAlign { get { @@ -781,7 +808,7 @@ internal static string Tool_InfoSelectToAlign { } /// - /// Ищет локализованную строку, похожую на Can't insert node + /// Vyhledá lokalizovaný řetězec podobný Can't insert node ///Too close to nearby node. /// internal static string Tool_InfoTooCloseNode { @@ -791,7 +818,7 @@ internal static string Tool_InfoTooCloseNode { } /// - /// Ищет локализованную строку, похожую на Hold {0} to + /// Vyhledá lokalizovaný řetězec podobný Hold {0} to ///underground mode. /// internal static string Tool_InfoUnderground { diff --git a/NodeControllerRenewal/Properties/Localize.resx b/NodeControllerRenewal/Properties/Localize.resx index 87cfdfc1..6cbcdbdf 100644 --- a/NodeControllerRenewal/Properties/Localize.resx +++ b/NodeControllerRenewal/Properties/Localize.resx @@ -336,6 +336,9 @@ Backward compatibility does not provide the transfer of all data, may be require Set shift between intersections + + Set to lane edit mode + Hold {0} to alignment roads @@ -345,6 +348,9 @@ Backward compatibility does not provide the transfer of all data, may be require Hold {0} to change main slope direction + + Hold {0} see lane editing + Node #{0} Click to edit @@ -396,4 +402,10 @@ Too close to nearby node Hold {0} to underground mode + + Hold {0} to switch to lane editing mode + + + Click to inverse lane direction (full circle outgoing) + \ No newline at end of file diff --git a/NodeControllerRenewal/Tool.cs b/NodeControllerRenewal/Tool.cs index 6787c2f1..2c7638e5 100644 --- a/NodeControllerRenewal/Tool.cs +++ b/NodeControllerRenewal/Tool.cs @@ -24,7 +24,7 @@ public class NodeControllerTool : BaseTool SingletonTool.Instance.ChangeNodeStyle()); public static NodeControllerShortcut ChangeMainRoadModeShortcut { get; } = new NodeControllerShortcut(nameof(ChangeMainRoadModeShortcut), nameof(Localize.Setting_ShortcutChangeMainRoadMode), SavedInputKey.Empty, () => SingletonTool.Instance.ChangeMainRoadMode()); public static NodeControllerShortcut SelectionStepOverShortcut { get; } = new NodeControllerShortcut(nameof(SelectionStepOverShortcut), nameof(CommonLocalize.Settings_ShortcutSelectionStepOver), SavedInputKey.Encode(KeyCode.Space, true, false, false), () => SingletonTool.Instance.SelectionStepOver(), ToolModeType.Select); - + public static IEnumerable ToolShortcuts { get @@ -65,6 +65,7 @@ protected override IEnumerable> GetModes() yield return CreateToolMode(); yield return CreateToolMode(); yield return CreateToolMode(); + yield return CreateToolMode(); } protected override void InitProcess() @@ -244,6 +245,7 @@ public enum ToolModeType Rotate = 16, ChangeMain = 32, Aling = 64, + LaneEdit = 128 } public class NodeControllerShortcut : ToolShortcut { diff --git a/NodeControllerRenewal/ToolModes/EditNode.cs b/NodeControllerRenewal/ToolModes/EditNode.cs index e3ac6572..f8d12274 100644 --- a/NodeControllerRenewal/ToolModes/EditNode.cs +++ b/NodeControllerRenewal/ToolModes/EditNode.cs @@ -25,6 +25,8 @@ public override void OnToolUpdate() Tool.SetMode(ToolModeType.ChangeMain); else if (!Tool.Panel.IsHover && Utility.OnlyShiftIsPressed) Tool.SetMode(ToolModeType.Aling); + else if (!Tool.Panel.IsHover && Utility.OnlyCtrlIsPressed) + Tool.SetMode(ToolModeType.LaneEdit); else if (Tool.MouseRayValid && Tool.Data.IsMoveableEnds) { foreach (var segmentData in Tool.Data.SegmentEndDatas) @@ -100,6 +102,8 @@ public override string GetToolInfo() info.Add(string.Format(Localize.Tool_InfoAlignMode, LocalizeExtension.Shift.AddInfoColor())); if (Tool.Data.IsJunction && Tool.Data.IsSlopeJunctions) info.Add(string.Format(Localize.Tool_InfoChangeMainMode, LocalizeExtension.Alt.AddInfoColor())); + if (Tool.Data.IsJunction) + info.Add(string.Format(Localize.Tool_InfoLaneEdit, LocalizeExtension.Ctrl.AddInfoColor())); return string.Join("\n", info.ToArray()); } diff --git a/NodeControllerRenewal/ToolModes/LaneChange.cs b/NodeControllerRenewal/ToolModes/LaneChange.cs new file mode 100644 index 00000000..99e844d5 --- /dev/null +++ b/NodeControllerRenewal/ToolModes/LaneChange.cs @@ -0,0 +1,119 @@ +using ModsCommon; +using ModsCommon.Utilities; +using UnityEngine; + +namespace NodeController +{ + public class LaneEditMode : NodeControllerToolMode + { + public override ToolModeType Type => ToolModeType.LaneEdit; + public override bool ShowPanel => false; + + private SelectionInfo HoverLaneEnd { get; set; } + private bool IsHoverSegmentEnd => HoverLaneEnd != null; + private float Radius => SegmentEndData.CenterDotRadius + 0.5f; + + private class SelectionInfo + { + public ushort SegmentId; + public uint LaneId; + } + + protected override void Reset(IToolMode prevMode) + { + HoverLaneEnd = null; + } + public override void OnToolUpdate() + { + if (!Utility.OnlyCtrlIsPressed) + Tool.SetDefaultMode(); + + else if (Tool.MouseRayValid) + { + foreach (var segmentData in Tool.Data.MainSegmentEndDatas) + { + var segment = segmentData.Id.GetSegment(); + var isStart = segmentData.IsStartNode; + var lanes = segment.GetLanes(); + + foreach (var laneId in segment.GetLaneIds()) + { + var lane = laneId.GetLane(); + lane.GetClosestPosition(segmentData.Position, out var position, out _); + + var hitPos = Tool.Ray.GetRayPosition(segmentData.Position.y, out _); + + if ((position - hitPos).sqrMagnitude < Radius * Radius) + { + HoverLaneEnd = new() + { + SegmentId = segmentData.Id, + LaneId = laneId + }; + return; + } + } + } + } + + HoverLaneEnd = null; + } + public override void OnMouseDown(Event e) + { + // TODO MOVE OF LANE + } + public override void OnMouseUp(Event e) + { + // TODO MOVE OF LANE + } + public override void OnPrimaryMouseClicked(Event e) + { + if (IsHoverSegmentEnd) + { + var lane = HoverLaneEnd.LaneId.GetLane(); + var oldflags = lane.m_flags; + var inversion = (ushort)NetLane.Flags.Inverted; + + if ((oldflags & inversion) == inversion) + lane.m_flags = (ushort)~(~oldflags & inversion); + else + lane.m_flags = (ushort)(oldflags | inversion); + + NetManager.instance.UpdateSegment(HoverLaneEnd.SegmentId); + } + } + + public override void OnSecondaryMouseClicked() + { + Tool.SetDefaultMode(); + } + + public override string GetToolInfo() + { + return Localize.Tool_InfoClickLaneInversion; + } + public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) + { + var underground = IsUnderground; + + foreach (var segmentData in Tool.Data.SegmentEndDatas) + { + var segment = segmentData.Id.GetSegment(); + foreach (var laneId in segment.GetLaneIds()) + { + var lane = laneId.GetLane(); + lane.GetClosestPosition(segmentData.Position, out var position, out _); + + position.RenderCircle( + new OverlayData(cameraInfo) { Color = segmentData.OverlayColor, RenderLimit = underground }, + 2.5f, segmentData.IsStartNode ? 0.0f : 2.0f); + + if (HoverLaneEnd.LaneId == laneId) + position.RenderCircle( + new OverlayData(cameraInfo) { Color = Color.white, RenderLimit = underground }, + 3.5f, 3.0f); + } + } + } + } +} From f85821c597c98774964150de6480d9a6a5168713 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zden=C4=9Bk=20Novotn=C3=BD?= Date: Sun, 17 Oct 2021 22:44:17 +0200 Subject: [PATCH 2/2] Alternative but not working :-( --- .../Extensions/SerializableDataExtension.cs | 4 +- .../Manager/SegmentEndData.cs | 6 +- .../ToolModes/AlignSegmentEnds.cs | 2 +- NodeControllerRenewal/ToolModes/DragCorner.cs | 2 +- NodeControllerRenewal/ToolModes/LaneChange.cs | 82 ++++++++++++------- "V\303\275stup-Sestaven\303\255.txt" | 10 +++ 6 files changed, 71 insertions(+), 35 deletions(-) create mode 100644 "V\303\275stup-Sestaven\303\255.txt" diff --git a/NodeControllerRenewal/Manager/Extensions/SerializableDataExtension.cs b/NodeControllerRenewal/Manager/Extensions/SerializableDataExtension.cs index 09157295..4d267a46 100644 --- a/NodeControllerRenewal/Manager/Extensions/SerializableDataExtension.cs +++ b/NodeControllerRenewal/Manager/Extensions/SerializableDataExtension.cs @@ -1,4 +1,4 @@ -using ModsCommon; +using ModsCommon; using ModsCommon.Utilities; using System; using System.Collections.Generic; @@ -31,7 +31,7 @@ public override void OnLoadData() SingletonMod.Logger.Debug($"Import NC2 data"); WasImported = true; - var state = Backwardompatibility.Loader.Load(data); + var state = BackwardСompatibility.Loader.Load(data); var config = state.ToXml(); SetLoadData(config); } diff --git a/NodeControllerRenewal/Manager/SegmentEndData.cs b/NodeControllerRenewal/Manager/SegmentEndData.cs index 9cf328d7..fe3eed34 100644 --- a/NodeControllerRenewal/Manager/SegmentEndData.cs +++ b/NodeControllerRenewal/Manager/SegmentEndData.cs @@ -765,7 +765,7 @@ public void Render(OverlayData contourData, OverlayData outterData, OverlayData { var data = SingletonManager.Instance[NodeId]; - Renderontour(contourData); + RenderContour(contourData); if (data.IsMoveableEnds && IsChangeable) { RenderEnd(contourData, LengthXZ(LeftSide.Position - Position) + CircleRadius, 0f); @@ -788,7 +788,7 @@ public void Render(OverlayData contourData, OverlayData outterData, OverlayData } public void RenderAlign(OverlayData contourData, OverlayData? leftData = null, OverlayData? rightData = null) { - Renderontour(contourData); + RenderContour(contourData); RenderEnd(contourData); if (leftData != null) @@ -813,7 +813,7 @@ public void RenderEnd(OverlayData data, float? leftCut = null, float? rightCut = line = line.Cut(startT, 1 - endT); line.Render(data); } - public void Renderontour(OverlayData data) + public void RenderContour(OverlayData data) { RenderSide(LeftSide, data); RenderSide(RightSide, data); diff --git a/NodeControllerRenewal/ToolModes/AlignSegmentEnds.cs b/NodeControllerRenewal/ToolModes/AlignSegmentEnds.cs index 035757ed..81d7ef0e 100644 --- a/NodeControllerRenewal/ToolModes/AlignSegmentEnds.cs +++ b/NodeControllerRenewal/ToolModes/AlignSegmentEnds.cs @@ -167,7 +167,7 @@ public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) foreach (var segmentData in Tool.Data.SegmentEndDatas) { var defaultColor = new OverlayData(cameraInfo) { Color = segmentData.OverlayColor, RenderLimit = underground }; - segmentData.RenderСontour(defaultColor); + segmentData.RenderContour(defaultColor); segmentData.RenderEnd(defaultColor); } diff --git a/NodeControllerRenewal/ToolModes/DragCorner.cs b/NodeControllerRenewal/ToolModes/DragCorner.cs index 334a6a42..472bf48e 100644 --- a/NodeControllerRenewal/ToolModes/DragCorner.cs +++ b/NodeControllerRenewal/ToolModes/DragCorner.cs @@ -50,7 +50,7 @@ public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) var forbidden = new OverlayData(cameraInfo) { Color = Colors.Red, RenderLimit = underground }; SegmentEnd[Corner].Render(allow, forbidden, allow); - SegmentEnd.RenderСontour(new OverlayData(cameraInfo) { Color = SegmentEnd.OverlayColor, RenderLimit = underground }); + SegmentEnd.RenderContour(new OverlayData(cameraInfo) { Color = SegmentEnd.OverlayColor, RenderLimit = underground }); SegmentEnd.RenderEnd(new OverlayData(cameraInfo) { Color = SegmentEnd.OverlayColor, RenderLimit = underground }); SegmentEnd[Corner].RenderCircle(new OverlayData(cameraInfo) { Color = Colors.Yellow, RenderLimit = underground }); } diff --git a/NodeControllerRenewal/ToolModes/LaneChange.cs b/NodeControllerRenewal/ToolModes/LaneChange.cs index 99e844d5..370ff197 100644 --- a/NodeControllerRenewal/ToolModes/LaneChange.cs +++ b/NodeControllerRenewal/ToolModes/LaneChange.cs @@ -1,5 +1,7 @@ -using ModsCommon; +using ColossalFramework.Plugins; +using ModsCommon; using ModsCommon.Utilities; +using System.Collections.Generic; using UnityEngine; namespace NodeController @@ -13,10 +15,13 @@ public class LaneEditMode : NodeControllerToolMode private bool IsHoverSegmentEnd => HoverLaneEnd != null; private float Radius => SegmentEndData.CenterDotRadius + 0.5f; + public bool IsValid { get; private set; } + private class SelectionInfo { public ushort SegmentId; public uint LaneId; + public int LaneIndex; } protected override void Reset(IToolMode prevMode) @@ -30,28 +35,37 @@ public override void OnToolUpdate() else if (Tool.MouseRayValid) { - foreach (var segmentData in Tool.Data.MainSegmentEndDatas) + var nodePosition = Tool.Data.GetPosition(); + + foreach (var segmentId in Tool.Data.SegmentIds) { - var segment = segmentData.Id.GetSegment(); - var isStart = segmentData.IsStartNode; + var segment = segmentId.GetSegment(); var lanes = segment.GetLanes(); + var i = 0; foreach (var laneId in segment.GetLaneIds()) { var lane = laneId.GetLane(); - lane.GetClosestPosition(segmentData.Position, out var position, out _); + var direction = segment.Info.m_lanes[i].m_direction; - var hitPos = Tool.Ray.GetRayPosition(segmentData.Position.y, out _); - - if ((position - hitPos).sqrMagnitude < Radius * Radius) + if (direction == NetInfo.Direction.Forward || direction == NetInfo.Direction.Backward) { - HoverLaneEnd = new() + lane.GetClosestPosition(nodePosition, out var position, out _); + + var hitPos = Tool.Ray.GetRayPosition(nodePosition.y, out _); + + if ((position - hitPos).sqrMagnitude < Radius * Radius) { - SegmentId = segmentData.Id, - LaneId = laneId - }; - return; + HoverLaneEnd = new() + { + SegmentId = segmentId, + LaneId = laneId, + LaneIndex = i + }; + return; + } } + i++; } } } @@ -70,16 +84,17 @@ public override void OnPrimaryMouseClicked(Event e) { if (IsHoverSegmentEnd) { - var lane = HoverLaneEnd.LaneId.GetLane(); - var oldflags = lane.m_flags; - var inversion = (ushort)NetLane.Flags.Inverted; + ref var segment = ref HoverLaneEnd.SegmentId.GetSegment(); + ref var lane = ref HoverLaneEnd.LaneId.GetLane(); + ref var flags = ref lane.m_flags; - if ((oldflags & inversion) == inversion) - lane.m_flags = (ushort)~(~oldflags & inversion); + flags = (ushort)(flags & ~(ushort)NetLane.Flags.Forward); + if ((flags & (int)NetLane.Flags.Forward) != 0) + flags = (ushort)(flags & ~(ushort)NetLane.Flags.Forward); else - lane.m_flags = (ushort)(oldflags | inversion); + flags = (ushort)(flags | (ushort)NetLane.Flags.Forward); - NetManager.instance.UpdateSegment(HoverLaneEnd.SegmentId); + segment.UpdateLanes(HoverLaneEnd.SegmentId, true); } } @@ -95,23 +110,34 @@ public override string GetToolInfo() public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { var underground = IsUnderground; + var nodePosition = Tool.Data.GetPosition(); + var i = 0; // cycling index of lane colors + var iMax = SegmentEndData.OverlayColors.Length; - foreach (var segmentData in Tool.Data.SegmentEndDatas) + foreach (var segmentId in Tool.Data.SegmentIds) { - var segment = segmentData.Id.GetSegment(); + var segment = segmentId.GetSegment(); + var laneIdx = 0; foreach (var laneId in segment.GetLaneIds()) { var lane = laneId.GetLane(); - lane.GetClosestPosition(segmentData.Position, out var position, out _); + var direction = segment.Info.m_lanes[laneIdx].m_direction; + var outgoing = direction == NetInfo.Direction.Forward || (direction == NetInfo.Direction.Backward && segment.IsInvert()); + var both = direction == NetInfo.Direction.Both || direction == NetInfo.Direction.None; + lane.GetClosestPosition(nodePosition, out var position, out _); - position.RenderCircle( - new OverlayData(cameraInfo) { Color = segmentData.OverlayColor, RenderLimit = underground }, - 2.5f, segmentData.IsStartNode ? 0.0f : 2.0f); + if (!both) + position.RenderCircle( + new OverlayData(cameraInfo) { Color = SegmentEndData.OverlayColors[i++], RenderLimit = underground }, + 1.5f, outgoing ? 0.0f : 1.0f); - if (HoverLaneEnd.LaneId == laneId) + if (!both && HoverLaneEnd?.LaneId == laneId) position.RenderCircle( new OverlayData(cameraInfo) { Color = Color.white, RenderLimit = underground }, - 3.5f, 3.0f); + 2.5f, 2.0f); + + if (iMax == i) i = 0; + laneIdx++; } } } diff --git "a/V\303\275stup-Sestaven\303\255.txt" "b/V\303\275stup-Sestaven\303\255.txt" new file mode 100644 index 00000000..e7a84aff --- /dev/null +++ "b/V\303\275stup-Sestaven\303\255.txt" @@ -0,0 +1,10 @@ +Zahájilo se sestavování... +1>------ Sestavování zahájeno: Projekt: NodeControllerRenewal, Konfigurace: Beta Debug Any CPU ------ +1>S:\git\NodeController30\ModsCommon\TrajectoryShared\Trajectory.cs(174,18,174,36): warning CS0659: StraightTrajectory přepisuje Object.Equals(object o), ale nepřepisuje Object.GetHashCode(). +1>S:\git\NodeController30\ModsCommon\TrajectoryShared\Trajectory.cs(174,18,174,36): warning CS0661: StraightTrajectory definuje operátor == nebo !=, ale nepřepisuje funkci Object.GetHashCode(). +1>S:\git\NodeController30\ModsCommon\TrajectoryShared\Trajectory.cs(36,18,36,34): warning CS0659: BezierTrajectory přepisuje Object.Equals(object o), ale nepřepisuje Object.GetHashCode(). +1>S:\git\NodeController30\ModsCommon\TrajectoryShared\Trajectory.cs(36,18,36,34): warning CS0661: BezierTrajectory definuje operátor == nebo !=, ale nepřepisuje funkci Object.GetHashCode(). +1>S:\git\NodeController30\ModsCommon\DependencyShared\DependenciesWatcher.cs(162,34,162,40): warning CS8509: Výraz switch nezachycuje všechny možné hodnoty vstupního typu (není úplný). Nezachycuje například vzor ModsCommon.Utilities.DependenciesWatcher.WatcherState.Valid. +1> NodeControllerRenewal -> S:\git\NodeController30\NodeControllerRenewal\bin\Beta Debug\NodeController.dll +1> AfterBuild event C:\Users\Phanteks\AppData\Local\Colossal Order\Cities_Skylines\Addons\Mods\NodeControllerRenewalBeta C:\Program Files (x86)\Steam\steamapps\workshop\content\255710\2462845270 +========== Sestavení: 1 úspěšně, 0 se nezdařilo, 0 aktuální, 0 přeskočeno ==========