diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/Configuration/ConsoleApplicationConfiguration.cs b/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/Configuration/ConsoleApplicationConfiguration.cs
index efbec09..1029c2d 100644
--- a/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/Configuration/ConsoleApplicationConfiguration.cs
+++ b/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/Configuration/ConsoleApplicationConfiguration.cs
@@ -4,6 +4,7 @@ public class ConsoleApplicationConfiguration
{
public string? ConsoleDriver { get; set; }
public bool DisableUtf8 { get; set; }
+ public string? AdminModeIcon { get; set; }
public string? ClipboardSingleIcon { get; set; }
public string? ClipboardMultipleIcon { get; set; }
}
\ No newline at end of file
diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/FileTime.ConsoleUI.App.Abstractions.csproj b/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/FileTime.ConsoleUI.App.Abstractions.csproj
index 1ed42e5..8a23bd8 100644
--- a/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/FileTime.ConsoleUI.App.Abstractions.csproj
+++ b/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/FileTime.ConsoleUI.App.Abstractions.csproj
@@ -12,6 +12,7 @@
+
diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/IRootViewModel.cs b/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/IRootViewModel.cs
index 57c8b27..cc387f3 100644
--- a/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/IRootViewModel.cs
+++ b/src/ConsoleApp/FileTime.ConsoleUI.App.Abstractions/IRootViewModel.cs
@@ -7,6 +7,7 @@ using FileTime.App.FrequencyNavigation.ViewModels;
using FileTime.ConsoleUI.App.Services;
using FileTime.Core.Interactions;
using FileTime.Core.Models;
+using FileTime.Providers.LocalAdmin;
namespace FileTime.ConsoleUI.App;
@@ -23,5 +24,6 @@ public interface IRootViewModel
IFrequencyNavigationViewModel FrequencyNavigation { get; }
IItemPreviewService ItemPreviewService { get; }
IClipboardService ClipboardService { get; }
+ IAdminElevationManager AdminElevationManager { get; }
event Action? FocusReadInputElement;
}
\ No newline at end of file
diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App/App.cs b/src/ConsoleApp/FileTime.ConsoleUI.App/App.cs
index 9109557..27642b2 100644
--- a/src/ConsoleApp/FileTime.ConsoleUI.App/App.cs
+++ b/src/ConsoleApp/FileTime.ConsoleUI.App/App.cs
@@ -10,6 +10,7 @@ using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using TerminalUI;
using TerminalUI.ConsoleDrivers;
+using TerminalUI.Models;
namespace FileTime.ConsoleUI.App;
@@ -138,6 +139,14 @@ public class App : IApplication
Thread.Sleep(10);
}
+
+ _consoleDriver.ExitRestrictedMode();
+ _consoleDriver.Clear();
+ var size = _consoleDriver.GetWindowSize();
+ var shutdownText = "Shutting down...";
+
+ _consoleDriver.SetCursorPosition(new Position(size.Width / 2 - shutdownText.Length / 2, size.Height / 2));
+ _consoleDriver.Write(shutdownText);
Task.Run(async () => await _lifecycleService.ExitAsync()).Wait();
}
diff --git a/src/ConsoleApp/FileTime.ConsoleUI.App/Controls/Dialogs.cs b/src/ConsoleApp/FileTime.ConsoleUI.App/Controls/Dialogs.cs
index aae63c1..ac3bbd2 100644
--- a/src/ConsoleApp/FileTime.ConsoleUI.App/Controls/Dialogs.cs
+++ b/src/ConsoleApp/FileTime.ConsoleUI.App/Controls/Dialogs.cs
@@ -51,35 +51,96 @@ public class Dialogs
};
}
- private void UpdateReadInputsFocus()
+ public IView View()
{
- foreach (var readInputsChild in _readInputs.Children)
+ var root = new Grid()
{
- if (readInputsChild.DataContext == _inputElementToFocus)
+ Margin = 5,
+ ChildInitializer =
{
- if (FindFocusable(readInputsChild) is { } focusable)
- {
- focusable.Focus();
- _inputElementToFocus = null;
- break;
- }
+ ReadInputs(),
+ MessageBox()
}
- }
+ };
- IFocusable? FindFocusable(IView view)
- {
- if (view is IFocusable focusable) return focusable;
- foreach (var viewVisualChild in view.VisualChildren)
- {
- if (FindFocusable(viewVisualChild) is { } focusableChild)
- return focusableChild;
- }
-
- return null;
- }
+ return root;
}
- public IView View()
+ private IView MessageBox()
+ {
+ var okButton = new Button
+ {
+ Margin = "0 0 5 0",
+ Content = new TextBlock()
+ .Setup(t => t.Bind(
+ t,
+ dc => dc.DialogService.LastMessageBox.Value.OkText,
+ t => t.Text)),
+ }.WithClickHandler(b => b.DataContext?.DialogService.LastMessageBox.Value?.Ok());
+
+ var cancelButton =
+ new Button
+ {
+ Margin = "0 0 5 0",
+ Content = new TextBlock()
+ .Setup(t => t.Bind(
+ t,
+ dc => dc.DialogService.LastMessageBox.Value.CancelText,
+ t => t.Text)),
+ }
+ .Setup(b => b.Bind(
+ b,
+ dc => dc.DialogService.LastMessageBox.Value.ShowCancel,
+ b => b.IsVisible))
+ .WithClickHandler(b => b.DataContext?.DialogService.LastMessageBox.Value?.Cancel());
+
+ var root = new Border
+ {
+ Margin = 5,
+ BorderThickness = 1,
+ Background = SpecialColor.None,
+ Content = new Grid
+ {
+ RowDefinitionsObject = "Auto Auto",
+ ChildInitializer =
+ {
+ new TextBlock()
+ .Setup(t => t.Bind(
+ t,
+ dc => dc.DialogService.LastMessageBox.Value.Text,
+ t => t.Text)),
+ new StackPanel
+ {
+ Orientation = Orientation.Horizontal,
+ Extensions = {new GridPositionExtension(0, 1)},
+ ChildInitializer =
+ {
+ okButton,
+ cancelButton
+ }
+ }
+ }
+ }
+ };
+
+ root.Bind(
+ root,
+ d => d.DialogService.LastMessageBox.Value != null,
+ v => v.IsVisible,
+ fallbackValue: false);
+
+ ((INotifyPropertyChanged) root).PropertyChanged += (_, e) =>
+ {
+ if (e.PropertyName == nameof(IView.IsVisible))
+ {
+ okButton.Focus();
+ }
+ };
+
+ return root;
+ }
+
+ private IView ReadInputs()
{
var root = new Border
{
@@ -88,9 +149,20 @@ public class Dialogs
Background = SpecialColor.None,
Content = new Grid
{
+ RowDefinitionsObject = "Auto Auto",
ChildInitializer =
{
- ReadInputs()
+ ReadInputsList(),
+ new ItemsControl
+ {
+ ItemTemplate = ReadInputPreviewItemTemplate
+ }
+ .Setup(i => i.Bind(
+ i,
+ dc => dc.DialogService.ReadInput.Value.Previews,
+ c => c.ItemsSource
+ ))
+ .WithExtension(new GridPositionExtension(0, 1))
}
}
};
@@ -100,58 +172,9 @@ public class Dialogs
d => d.DialogService.ReadInput.Value != null,
v => v.IsVisible);
- ((INotifyPropertyChanged) _readInputs).PropertyChanged += (_, e) =>
- {
- if (e.PropertyName == nameof(ItemsControl