From 3dcfd93ee85d41a7f9b9edc7c832e745bc676950 Mon Sep 17 00:00:00 2001 From: Seraphima Zykova Date: Tue, 15 Aug 2023 13:25:54 +0300 Subject: [PATCH] [FancyZones Editor] Highlight the user-defined default layout when no layout applied (#27879) --- .../FancyZonesData/DefaultLayouts.cpp | 15 ++++ .../UnitTests/DefaultLayoutsTests.Spec.cpp | 28 ++++-- .../editor/FancyZonesEditor/App.xaml.cs | 44 ++++----- .../editor/FancyZonesEditor/EditorWindow.cs | 2 +- .../FancyZonesEditor/MainWindow.xaml.cs | 10 +-- .../Models/DefaultLayoutsModel.cs | 31 ++++--- .../FancyZonesEditor/Models/LayoutModel.cs | 8 +- .../Models/MainWindowSettingsModel.cs | 7 +- .../editor/FancyZonesEditor/Models/Monitor.cs | 89 ++++++++++++++++--- .../editor/FancyZonesEditor/Overlay.cs | 24 ----- .../Utils/FancyZonesEditorIO.cs | 30 ++++++- 11 files changed, 196 insertions(+), 92 deletions(-) diff --git a/src/modules/fancyzones/FancyZonesLib/FancyZonesData/DefaultLayouts.cpp b/src/modules/fancyzones/FancyZonesLib/FancyZonesData/DefaultLayouts.cpp index 56871183bc..bb8ea21f4c 100644 --- a/src/modules/fancyzones/FancyZonesLib/FancyZonesData/DefaultLayouts.cpp +++ b/src/modules/fancyzones/FancyZonesLib/FancyZonesData/DefaultLayouts.cpp @@ -171,5 +171,20 @@ LayoutData DefaultLayouts::GetDefaultLayout(MonitorConfigurationType type) const return iter->second; } + switch (type) + { + case MonitorConfigurationType::Horizontal: + return LayoutData{}; + case MonitorConfigurationType::Vertical: + return LayoutData{ + .uuid = GUID_NULL, + .type = FancyZonesDataTypes::ZoneSetLayoutType::Rows, + .showSpacing = DefaultValues::ShowSpacing, + .spacing = DefaultValues::Spacing, + .zoneCount = DefaultValues::ZoneCount, + .sensitivityRadius = DefaultValues::SensitivityRadius + }; + } + return LayoutData{}; } diff --git a/src/modules/fancyzones/FancyZonesTests/UnitTests/DefaultLayoutsTests.Spec.cpp b/src/modules/fancyzones/FancyZonesTests/UnitTests/DefaultLayoutsTests.Spec.cpp index 601145897e..c42679ee68 100644 --- a/src/modules/fancyzones/FancyZonesTests/UnitTests/DefaultLayoutsTests.Spec.cpp +++ b/src/modules/fancyzones/FancyZonesTests/UnitTests/DefaultLayoutsTests.Spec.cpp @@ -96,15 +96,21 @@ namespace FancyZonesUnitTests .sensitivityRadius = DefaultValues::SensitivityRadius }; + LayoutData rows{ + .uuid = GUID_NULL, + .type = FancyZonesDataTypes::ZoneSetLayoutType::Rows, + .showSpacing = DefaultValues::ShowSpacing, + .spacing = DefaultValues::Spacing, + .zoneCount = DefaultValues::ZoneCount, + .sensitivityRadius = DefaultValues::SensitivityRadius + }; + Assert::IsTrue(priorityGrid == DefaultLayouts::instance().GetDefaultLayout(MonitorConfigurationType::Horizontal)); - Assert::IsTrue(priorityGrid == DefaultLayouts::instance().GetDefaultLayout(MonitorConfigurationType::Vertical)); + Assert::IsTrue(rows == DefaultLayouts::instance().GetDefaultLayout(MonitorConfigurationType::Vertical)); } TEST_METHOD (DefaultLayoutsNoFile) { - // test - DefaultLayouts::instance().LoadData(); - LayoutData priorityGrid{ .uuid = GUID_NULL, .type = FancyZonesDataTypes::ZoneSetLayoutType::PriorityGrid, @@ -114,8 +120,20 @@ namespace FancyZonesUnitTests .sensitivityRadius = DefaultValues::SensitivityRadius }; + LayoutData rows{ + .uuid = GUID_NULL, + .type = FancyZonesDataTypes::ZoneSetLayoutType::Rows, + .showSpacing = DefaultValues::ShowSpacing, + .spacing = DefaultValues::Spacing, + .zoneCount = DefaultValues::ZoneCount, + .sensitivityRadius = DefaultValues::SensitivityRadius + }; + + // test + DefaultLayouts::instance().LoadData(); + Assert::IsTrue(priorityGrid == DefaultLayouts::instance().GetDefaultLayout(MonitorConfigurationType::Horizontal)); - Assert::IsTrue(priorityGrid == DefaultLayouts::instance().GetDefaultLayout(MonitorConfigurationType::Vertical)); + Assert::IsTrue(rows == DefaultLayouts::instance().GetDefaultLayout(MonitorConfigurationType::Vertical)); } }; } \ No newline at end of file diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/App.xaml.cs b/src/modules/fancyzones/editor/FancyZonesEditor/App.xaml.cs index faec50e2aa..d0fa03ea09 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/App.xaml.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/App.xaml.cs @@ -78,8 +78,6 @@ namespace FancyZonesEditor _themeManager = new ThemeManager(this); - var parseResult = FancyZonesEditorIO.ParseParams(); - RunnerHelper.WaitForPowerToysRunner(PowerToysPID, () => { Logger.LogInfo("Runner exited"); @@ -87,27 +85,8 @@ namespace FancyZonesEditor Application.Current.Dispatcher.Invoke(Application.Current.Shutdown); }); - if (!parseResult.Result) - { - Logger.LogError(ParsingErrorReportTag + ": " + parseResult.Message + "; " + ParsingErrorDataTag + ": " + parseResult.MalformedData); - MessageBox.Show(parseResult.Message, FancyZonesEditor.Properties.Resources.Error_Parsing_Data_Title, MessageBoxButton.OK); - } + var parseResult = FancyZonesEditorIO.ParseParams(); - parseResult = FancyZonesEditorIO.ParseAppliedLayouts(); - if (!parseResult.Result) - { - Logger.LogError(ParsingErrorReportTag + ": " + parseResult.Message + "; " + ParsingErrorDataTag + ": " + parseResult.MalformedData); - MessageBox.Show(parseResult.Message, FancyZonesEditor.Properties.Resources.Error_Parsing_Data_Title, MessageBoxButton.OK); - } - - parseResult = FancyZonesEditorIO.ParseCustomLayouts(); - if (!parseResult.Result) - { - Logger.LogError(ParsingErrorReportTag + ": " + parseResult.Message + "; " + ParsingErrorDataTag + ": " + parseResult.MalformedData); - MessageBox.Show(parseResult.Message, FancyZonesEditor.Properties.Resources.Error_Parsing_Data_Title, MessageBoxButton.OK); - } - - parseResult = FancyZonesEditorIO.ParseLayoutHotkeys(); if (!parseResult.Result) { Logger.LogError(ParsingErrorReportTag + ": " + parseResult.Message + "; " + ParsingErrorDataTag + ": " + parseResult.MalformedData); @@ -121,6 +100,13 @@ namespace FancyZonesEditor MessageBox.Show(parseResult.Message, FancyZonesEditor.Properties.Resources.Error_Parsing_Data_Title, MessageBoxButton.OK); } + parseResult = FancyZonesEditorIO.ParseCustomLayouts(); + if (!parseResult.Result) + { + Logger.LogError(ParsingErrorReportTag + ": " + parseResult.Message + "; " + ParsingErrorDataTag + ": " + parseResult.MalformedData); + MessageBox.Show(parseResult.Message, FancyZonesEditor.Properties.Resources.Error_Parsing_Data_Title, MessageBoxButton.OK); + } + parseResult = FancyZonesEditorIO.ParseDefaultLayouts(); if (!parseResult.Result) { @@ -128,6 +114,20 @@ namespace FancyZonesEditor MessageBox.Show(parseResult.Message, FancyZonesEditor.Properties.Resources.Error_Parsing_Data_Title, MessageBoxButton.OK); } + parseResult = FancyZonesEditorIO.ParseLayoutHotkeys(); + if (!parseResult.Result) + { + Logger.LogError(ParsingErrorReportTag + ": " + parseResult.Message + "; " + ParsingErrorDataTag + ": " + parseResult.MalformedData); + MessageBox.Show(parseResult.Message, FancyZonesEditor.Properties.Resources.Error_Parsing_Data_Title, MessageBoxButton.OK); + } + + parseResult = FancyZonesEditorIO.ParseAppliedLayouts(); + if (!parseResult.Result) + { + Logger.LogError(ParsingErrorReportTag + ": " + parseResult.Message + "; " + ParsingErrorDataTag + ": " + parseResult.MalformedData); + MessageBox.Show(parseResult.Message, FancyZonesEditor.Properties.Resources.Error_Parsing_Data_Title, MessageBoxButton.OK); + } + MainWindowSettingsModel settings = ((App)Current).MainWindowSettings; settings.UpdateSelectedLayoutModel(); diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/EditorWindow.cs b/src/modules/fancyzones/editor/FancyZonesEditor/EditorWindow.cs index 4a29c81194..908d5fe32f 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/EditorWindow.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/EditorWindow.cs @@ -28,7 +28,7 @@ namespace FancyZonesEditor MainWindowSettingsModel settings = ((App)Application.Current).MainWindowSettings; settings.SetAppliedModel(model); - App.Overlay.SetLayoutSettings(App.Overlay.Monitors[App.Overlay.CurrentDesktop], model); + App.Overlay.Monitors[App.Overlay.CurrentDesktop].SetLayoutSettings(model); } App.FancyZonesEditorIO.SerializeLayoutTemplates(); diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml.cs b/src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml.cs index 89616f6b43..5c2eaeee36 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml.cs @@ -296,7 +296,7 @@ namespace FancyZonesEditor model.Persist(); - App.Overlay.SetLayoutSettings(App.Overlay.Monitors[App.Overlay.CurrentDesktop], model); + App.Overlay.Monitors[App.Overlay.CurrentDesktop].SetLayoutSettings(model); App.FancyZonesEditorIO.SerializeAppliedLayouts(); App.FancyZonesEditorIO.SerializeCustomLayouts(); } @@ -318,7 +318,7 @@ namespace FancyZonesEditor if (mainEditor.CurrentDataContext is LayoutModel model) { _settings.SetAppliedModel(model); - App.Overlay.SetLayoutSettings(App.Overlay.Monitors[App.Overlay.CurrentDesktop], model); + App.Overlay.Monitors[App.Overlay.CurrentDesktop].SetLayoutSettings(model); App.FancyZonesEditorIO.SerializeAppliedLayouts(); App.FancyZonesEditorIO.SerializeCustomLayouts(); } @@ -366,7 +366,7 @@ namespace FancyZonesEditor _backup = new CanvasLayoutModel(canvas); } - _defaultLayoutsBackup = new List(MainWindowSettingsModel.DefaultLayouts.DefaultLayouts); + _defaultLayoutsBackup = new List(MainWindowSettingsModel.DefaultLayouts.Layouts); Keyboard.ClearFocus(); EditLayoutDialogTitle.Text = string.Format(CultureInfo.CurrentCulture, Properties.Resources.Edit_Template, ((LayoutModel)dataContext).Name); @@ -480,7 +480,7 @@ namespace FancyZonesEditor // update current settings if (model == _settings.AppliedModel) { - App.Overlay.SetLayoutSettings(App.Overlay.Monitors[App.Overlay.CurrentDesktop], model); + App.Overlay.Monitors[App.Overlay.CurrentDesktop].SetLayoutSettings(model); } App.FancyZonesEditorIO.SerializeAppliedLayouts(); @@ -528,7 +528,7 @@ namespace FancyZonesEditor { if (monitor.Settings.ZonesetUuid == model.Uuid) { - App.Overlay.SetLayoutSettings(monitor, _settings.BlankModel); + monitor.SetLayoutSettings(_settings.BlankModel); } } diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Models/DefaultLayoutsModel.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Models/DefaultLayoutsModel.cs index 5b3167acc1..770c5ec626 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Models/DefaultLayoutsModel.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Models/DefaultLayoutsModel.cs @@ -13,7 +13,7 @@ namespace FancyZonesEditor.Models { private static int Count { get; } = Enum.GetValues(typeof(MonitorConfigurationType)).Length; - public List DefaultLayouts { get; } = new List(Count); + public List Layouts { get; } = new List(Count); public DefaultLayoutsModel() { @@ -23,30 +23,39 @@ namespace FancyZonesEditor.Models public void Reset(MonitorConfigurationType type) { - Set(MainWindowSettingsModel.TemplateModels[(int)LayoutType.PriorityGrid], type); + switch (type) + { + case MonitorConfigurationType.Horizontal: + Set(MainWindowSettingsModel.TemplateModels[(int)LayoutType.PriorityGrid], type); + break; + case MonitorConfigurationType.Vertical: + Set(MainWindowSettingsModel.TemplateModels[(int)LayoutType.Rows], type); + break; + } } public void Reset(string uuid) { - for (int i = 0; i < Count; i++) + if (Layouts[(int)MonitorConfigurationType.Horizontal].Uuid == uuid) { - if (DefaultLayouts[i].Uuid == uuid) - { - Set(MainWindowSettingsModel.TemplateModels[(int)LayoutType.PriorityGrid], (MonitorConfigurationType)i); - break; - } + Set(MainWindowSettingsModel.TemplateModels[(int)LayoutType.PriorityGrid], MonitorConfigurationType.Horizontal); + } + + if (Layouts[(int)MonitorConfigurationType.Vertical].Uuid == uuid) + { + Set(MainWindowSettingsModel.TemplateModels[(int)LayoutType.Rows], MonitorConfigurationType.Vertical); } } public void Set(LayoutModel layout, MonitorConfigurationType type) { - if (DefaultLayouts.Count <= (int)type) + if (Layouts.Count <= (int)type) { - DefaultLayouts.Insert((int)type, layout); + Layouts.Insert((int)type, layout); } else { - DefaultLayouts[(int)type] = layout; + Layouts[(int)type] = layout; } FirePropertyChanged(); diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Models/LayoutModel.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Models/LayoutModel.cs index a587414213..b7b244cdf2 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Models/LayoutModel.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Models/LayoutModel.cs @@ -150,7 +150,7 @@ namespace FancyZonesEditor.Models { get { - return MainWindowSettingsModel.DefaultLayouts.DefaultLayouts[(int)MonitorConfigurationType.Horizontal].Uuid == this.Uuid; + return MainWindowSettingsModel.DefaultLayouts.Layouts[(int)MonitorConfigurationType.Horizontal].Uuid == this.Uuid; } } @@ -158,7 +158,7 @@ namespace FancyZonesEditor.Models { get { - return MainWindowSettingsModel.DefaultLayouts.DefaultLayouts[(int)MonitorConfigurationType.Horizontal].Uuid != this.Uuid; + return MainWindowSettingsModel.DefaultLayouts.Layouts[(int)MonitorConfigurationType.Horizontal].Uuid != this.Uuid; } } @@ -166,7 +166,7 @@ namespace FancyZonesEditor.Models { get { - return MainWindowSettingsModel.DefaultLayouts.DefaultLayouts[(int)MonitorConfigurationType.Vertical].Uuid == this.Uuid; + return MainWindowSettingsModel.DefaultLayouts.Layouts[(int)MonitorConfigurationType.Vertical].Uuid == this.Uuid; } } @@ -174,7 +174,7 @@ namespace FancyZonesEditor.Models { get { - return MainWindowSettingsModel.DefaultLayouts.DefaultLayouts[(int)MonitorConfigurationType.Vertical].Uuid != this.Uuid; + return MainWindowSettingsModel.DefaultLayouts.Layouts[(int)MonitorConfigurationType.Vertical].Uuid != this.Uuid; } } diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Models/MainWindowSettingsModel.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Models/MainWindowSettingsModel.cs index 2d5cdd3456..4cea41f04d 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Models/MainWindowSettingsModel.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Models/MainWindowSettingsModel.cs @@ -81,7 +81,7 @@ namespace FancyZonesEditor // set default layouts DefaultLayouts.Set(priorityGridModel, MonitorConfigurationType.Horizontal); - DefaultLayouts.Set(priorityGridModel, MonitorConfigurationType.Vertical); + DefaultLayouts.Set(rowsModel, MonitorConfigurationType.Vertical); } // IsShiftKeyPressed - is the shift key currently being held down @@ -261,11 +261,6 @@ namespace FancyZonesEditor } } - if (foundModel == null) - { - foundModel = TemplateModels[(int)LayoutType.PriorityGrid]; - } - SetSelectedModel(foundModel); SetAppliedModel(foundModel); FirePropertyChanged(nameof(IsCustomLayoutActive)); diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Models/Monitor.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Models/Monitor.cs index 489a2b27e0..ab0096862d 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Models/Monitor.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Models/Monitor.cs @@ -14,21 +14,45 @@ namespace FancyZonesEditor.Models { public LayoutOverlayWindow Window { get; private set; } - public LayoutSettings Settings { get; set; } - public Device Device { get; set; } + public LayoutSettings Settings + { + get + { + if (_settings != null) + { + return _settings; + } + + return DefaultLayoutSettings; + } + + set + { + _settings = value; + } + } + + public bool IsInitialized + { + get + { + return _settings != null; + } + } + + public MonitorConfigurationType MonitorConfigurationType + { + get + { + return Device.MonitorSize.Width > Device.MonitorSize.Height ? MonitorConfigurationType.Horizontal : MonitorConfigurationType.Vertical; + } + } + public Monitor(Rect workArea, Size monitorSize) { Window = new LayoutOverlayWindow(); - Settings = new LayoutSettings(); - - // provide a good default for vertical monitors - if (monitorSize.Height > monitorSize.Width) - { - Settings.Type = LayoutType.Rows; - } - Device = new Device(workArea, monitorSize); if (App.DebugMode) @@ -54,6 +78,8 @@ namespace FancyZonesEditor.Models Device = new Device(monitorName, monitorInstanceId, monitorSerialNumber, virtualDesktop, dpi, workArea, monitorSize); } + private LayoutSettings _settings; + public void Scale(double scaleFactor) { Device.Scale(scaleFactor); @@ -64,5 +90,48 @@ namespace FancyZonesEditor.Models Window.Width = workArea.Width; Window.Height = workArea.Height; } + + public void SetLayoutSettings(LayoutModel model) + { + if (model == null) + { + return; + } + + if (_settings == null) + { + _settings = new LayoutSettings(); + } + + _settings.ZonesetUuid = model.Uuid; + _settings.Type = model.Type; + _settings.SensitivityRadius = model.SensitivityRadius; + _settings.ZoneCount = model.TemplateZoneCount; + + if (model is GridLayoutModel grid) + { + _settings.ShowSpacing = grid.ShowSpacing; + _settings.Spacing = grid.Spacing; + } + else + { + _settings.ShowSpacing = false; + _settings.Spacing = 0; + } + } + + private LayoutSettings DefaultLayoutSettings + { + get + { + LayoutSettings settings = new LayoutSettings(); + if (MonitorConfigurationType == MonitorConfigurationType.Vertical) + { + settings.Type = LayoutType.Rows; + } + + return settings; + } + } } } diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Overlay.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Overlay.cs index 5677fb565f..1e55c3f61f 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Overlay.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Overlay.cs @@ -180,30 +180,6 @@ namespace FancyZonesEditor } } - public void SetLayoutSettings(Monitor monitor, LayoutModel model) - { - if (model == null) - { - return; - } - - monitor.Settings.ZonesetUuid = model.Uuid; - monitor.Settings.Type = model.Type; - monitor.Settings.SensitivityRadius = model.SensitivityRadius; - monitor.Settings.ZoneCount = model.TemplateZoneCount; - - if (model is GridLayoutModel grid) - { - monitor.Settings.ShowSpacing = grid.ShowSpacing; - monitor.Settings.Spacing = grid.Spacing; - } - else - { - monitor.Settings.ShowSpacing = false; - monitor.Settings.Spacing = 0; - } - } - public void OpenEditor(LayoutModel model) { Logger.LogTrace(); diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs b/src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs index 2ddf1cafaf..604c8bf33e 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs @@ -1159,15 +1159,17 @@ namespace FancyZonesEditor.Utils foreach (var layout in layouts) { + LayoutModel defaultLayoutModel = null; + MonitorConfigurationType type = JsonTagToMonitorConfigurationType(layout.MonitorConfiguration); + if (layout.Layout.Uuid != null && layout.Layout.Uuid != string.Empty) { - MonitorConfigurationType type = JsonTagToMonitorConfigurationType(layout.MonitorConfiguration); - foreach (var customLayout in MainWindowSettingsModel.CustomModels) { if (customLayout.Uuid == layout.Layout.Uuid) { MainWindowSettingsModel.DefaultLayouts.Set(customLayout, type); + defaultLayoutModel = customLayout; break; } } @@ -1175,8 +1177,28 @@ namespace FancyZonesEditor.Utils else { LayoutType layoutType = JsonTagToLayoutType(layout.Layout.Type); - MonitorConfigurationType type = JsonTagToMonitorConfigurationType(layout.MonitorConfiguration); - MainWindowSettingsModel.DefaultLayouts.Set(MainWindowSettingsModel.TemplateModels[(int)layoutType], type); + defaultLayoutModel = MainWindowSettingsModel.TemplateModels[(int)layoutType]; + defaultLayoutModel.TemplateZoneCount = layout.Layout.ZoneCount; + defaultLayoutModel.SensitivityRadius = layout.Layout.SensitivityRadius; + + if (defaultLayoutModel is GridLayoutModel gridDefaultLayoutModel) + { + gridDefaultLayoutModel.ShowSpacing = layout.Layout.ShowSpacing; + gridDefaultLayoutModel.Spacing = layout.Layout.Spacing; + } + + MainWindowSettingsModel.DefaultLayouts.Set(defaultLayoutModel, type); + } + + if (defaultLayoutModel != null) + { + foreach (Monitor monitor in App.Overlay.Monitors) + { + if (!monitor.IsInitialized && monitor.MonitorConfigurationType == type) + { + monitor.SetLayoutSettings(defaultLayoutModel); + } + } } }