diff --git a/Wabbajack.App.Wpf/App.xaml.cs b/Wabbajack.App.Wpf/App.xaml.cs index ed7f3d9a..cbb9de0d 100644 --- a/Wabbajack.App.Wpf/App.xaml.cs +++ b/Wabbajack.App.Wpf/App.xaml.cs @@ -48,7 +48,7 @@ namespace Wabbajack services.AddOSIntegrated(); services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(); services.AddTransient(); services.AddTransient(); diff --git a/Wabbajack.App.Wpf/Extensions/TabContent.cs b/Wabbajack.App.Wpf/Extensions/TabContent.cs deleted file mode 100644 index e338fcee..00000000 --- a/Wabbajack.App.Wpf/Extensions/TabContent.cs +++ /dev/null @@ -1,282 +0,0 @@ -// TabContent.cs, version 1.2 -// The code in this file is Copyright (c) Ivan Krivyakov -// See http://www.ikriv.com/legal.php for more information -// -using System; -using System.ComponentModel; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Markup; - -namespace IKriv.Windows.Controls.Behaviors -{ - /// - /// Attached properties for persistent tab control - /// - /// By default WPF TabControl bound to an ItemsSource destroys visual state of invisible tabs. - /// Set ikriv:TabContent.IsCached="True" to preserve visual state of each tab. - /// - public static class TabContent - { - public static bool GetIsCached(DependencyObject obj) - { - return (bool)obj.GetValue(IsCachedProperty); - } - - public static void SetIsCached(DependencyObject obj, bool value) - { - obj.SetValue(IsCachedProperty, value); - } - - /// - /// Controls whether tab content is cached or not - /// - /// When TabContent.IsCached is true, visual state of each tab is preserved (cached), even when the tab is hidden - public static readonly DependencyProperty IsCachedProperty = - DependencyProperty.RegisterAttached("IsCached", typeof(bool), typeof(TabContent), new UIPropertyMetadata(false, OnIsCachedChanged)); - - - public static DataTemplate GetTemplate(DependencyObject obj) - { - return (DataTemplate)obj.GetValue(TemplateProperty); - } - - public static void SetTemplate(DependencyObject obj, DataTemplate value) - { - obj.SetValue(TemplateProperty, value); - } - - /// - /// Used instead of TabControl.ContentTemplate for cached tabs - /// - public static readonly DependencyProperty TemplateProperty = - DependencyProperty.RegisterAttached("Template", typeof(DataTemplate), typeof(TabContent), new UIPropertyMetadata(null)); - - - public static DataTemplateSelector GetTemplateSelector(DependencyObject obj) - { - return (DataTemplateSelector)obj.GetValue(TemplateSelectorProperty); - } - - public static void SetTemplateSelector(DependencyObject obj, DataTemplateSelector value) - { - obj.SetValue(TemplateSelectorProperty, value); - } - - /// - /// Used instead of TabControl.ContentTemplateSelector for cached tabs - /// - public static readonly DependencyProperty TemplateSelectorProperty = - DependencyProperty.RegisterAttached("TemplateSelector", typeof(DataTemplateSelector), typeof(TabContent), new UIPropertyMetadata(null)); - - [EditorBrowsable(EditorBrowsableState.Never)] - public static TabControl GetInternalTabControl(DependencyObject obj) - { - return (TabControl)obj.GetValue(InternalTabControlProperty); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - public static void SetInternalTabControl(DependencyObject obj, TabControl value) - { - obj.SetValue(InternalTabControlProperty, value); - } - - // Using a DependencyProperty as the backing store for InternalTabControl. This enables animation, styling, binding, etc... - [EditorBrowsable(EditorBrowsableState.Never)] - public static readonly DependencyProperty InternalTabControlProperty = - DependencyProperty.RegisterAttached("InternalTabControl", typeof(TabControl), typeof(TabContent), new UIPropertyMetadata(null, OnInternalTabControlChanged)); - - - [EditorBrowsable(EditorBrowsableState.Never)] - public static ContentControl GetInternalCachedContent(DependencyObject obj) - { - return (ContentControl)obj.GetValue(InternalCachedContentProperty); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - public static void SetInternalCachedContent(DependencyObject obj, ContentControl value) - { - obj.SetValue(InternalCachedContentProperty, value); - } - - // Using a DependencyProperty as the backing store for InternalCachedContent. This enables animation, styling, binding, etc... - [EditorBrowsable(EditorBrowsableState.Never)] - public static readonly DependencyProperty InternalCachedContentProperty = - DependencyProperty.RegisterAttached("InternalCachedContent", typeof(ContentControl), typeof(TabContent), new UIPropertyMetadata(null)); - - [EditorBrowsable(EditorBrowsableState.Never)] - public static object GetInternalContentManager(DependencyObject obj) - { - return (object)obj.GetValue(InternalContentManagerProperty); - } - - [EditorBrowsable(EditorBrowsableState.Never)] - public static void SetInternalContentManager(DependencyObject obj, object value) - { - obj.SetValue(InternalContentManagerProperty, value); - } - - // Using a DependencyProperty as the backing store for InternalContentManager. This enables animation, styling, binding, etc... - public static readonly DependencyProperty InternalContentManagerProperty = - DependencyProperty.RegisterAttached("InternalContentManager", typeof(object), typeof(TabContent), new UIPropertyMetadata(null)); - - private static void OnIsCachedChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) - { - if (obj == null) return; - - var tabControl = obj as TabControl; - if (tabControl == null) - { - throw new InvalidOperationException("Cannot set TabContent.IsCached on object of type " + args.NewValue.GetType().Name + - ". Only objects of type TabControl can have TabContent.IsCached property."); - } - - bool newValue = (bool)args.NewValue; - - if (!newValue) - { - if (args.OldValue != null && ((bool)args.OldValue)) - { - throw new NotImplementedException("Cannot change TabContent.IsCached from True to False. Turning tab caching off is not implemented"); - } - - return; - } - - EnsureContentTemplateIsNull(tabControl); - tabControl.ContentTemplate = CreateContentTemplate(); - EnsureContentTemplateIsNotModified(tabControl); - } - - private static DataTemplate CreateContentTemplate() - { - const string xaml = - ""; - - var context = new ParserContext(); - - context.XamlTypeMapper = new XamlTypeMapper(new string[0]); - context.XamlTypeMapper.AddMappingProcessingInstruction("b", typeof(TabContent).Namespace, typeof(TabContent).Assembly.FullName); - - context.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation"); - context.XmlnsDictionary.Add("b", "b"); - - var template = (DataTemplate)XamlReader.Parse(xaml, context); - return template; - } - - private static void OnInternalTabControlChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) - { - if (obj == null) return; - var container = obj as Decorator; - - if (container == null) - { - var message = "Cannot set TabContent.InternalTabControl on object of type " + obj.GetType().Name + - ". Only controls that derive from Decorator, such as Border can have a TabContent.InternalTabControl."; - throw new InvalidOperationException(message); - } - - if (args.NewValue == null) return; - if (!(args.NewValue is TabControl)) - { - throw new InvalidOperationException("Value of TabContent.InternalTabControl cannot be of type " + args.NewValue.GetType().Name +", it must be of type TabControl"); - } - - var tabControl = (TabControl)args.NewValue; - var contentManager = GetContentManager(tabControl, container); - contentManager.UpdateSelectedTab(); - } - - private static ContentManager GetContentManager(TabControl tabControl, Decorator container) - { - var contentManager = (ContentManager)GetInternalContentManager(tabControl); - if (contentManager != null) - { - /* - * Content manager already exists for the tab control. This means that tab content template is applied - * again, and new instance of the Border control (container) has been created. The old container - * referenced by the content manager is no longer visible and needs to be replaced - */ - contentManager.ReplaceContainer(container); - } - else - { - // create content manager for the first time - contentManager = new ContentManager(tabControl, container); - SetInternalContentManager(tabControl, contentManager); - } - - return contentManager; - } - - private static void EnsureContentTemplateIsNull(TabControl tabControl) - { - if (tabControl.ContentTemplate != null) - { - throw new InvalidOperationException("TabControl.ContentTemplate value is not null. If TabContent.IsCached is True, use TabContent.Template instead of ContentTemplate"); - } - } - - private static void EnsureContentTemplateIsNotModified(TabControl tabControl) - { - var descriptor = DependencyPropertyDescriptor.FromProperty(TabControl.ContentTemplateProperty, typeof(TabControl)); - descriptor.AddValueChanged(tabControl, (sender, args) => - { - throw new InvalidOperationException("Cannot assign to TabControl.ContentTemplate when TabContent.IsCached is True. Use TabContent.Template instead"); - }); - } - - public class ContentManager - { - TabControl _tabControl; - Decorator _border; - - public ContentManager(TabControl tabControl, Decorator border) - { - _tabControl = tabControl; - _border = border; - _tabControl.SelectionChanged += (sender, args) => { UpdateSelectedTab(); }; - } - - public void ReplaceContainer(Decorator newBorder) - { - if (Object.ReferenceEquals(_border, newBorder)) return; - - _border.Child = null; // detach any tab content that old border may hold - _border = newBorder; - } - - public void UpdateSelectedTab() - { - _border.Child = GetCurrentContent(); - } - - private ContentControl GetCurrentContent() - { - var item = _tabControl.SelectedItem; - if (item == null) return null; - - var tabItem = _tabControl.ItemContainerGenerator.ContainerFromItem(item); - if (tabItem == null) return null; - - var cachedContent = TabContent.GetInternalCachedContent(tabItem); - if (cachedContent == null) - { - cachedContent = new ContentControl - { - DataContext = item, - ContentTemplate = TabContent.GetTemplate(_tabControl), - ContentTemplateSelector = TabContent.GetTemplateSelector(_tabControl) - }; - - cachedContent.SetBinding(ContentControl.ContentProperty, new Binding()); - TabContent.SetInternalCachedContent(tabItem, cachedContent); - } - - return cachedContent; - } - } - } -} diff --git a/Wabbajack.App.Wpf/Interventions/InteventionHandler.cs b/Wabbajack.App.Wpf/Interventions/InteventionHandler.cs index 14a30177..998beba3 100644 --- a/Wabbajack.App.Wpf/Interventions/InteventionHandler.cs +++ b/Wabbajack.App.Wpf/Interventions/InteventionHandler.cs @@ -1,16 +1,21 @@ +using System; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using ReactiveUI; using Wabbajack.DTOs.Interventions; +using Wabbajack.UserIntervention; namespace Wabbajack.Interventions; -public class InteventionHandler : IUserInterventionHandler +public class UserInteventionHandler : IUserInterventionHandler { - private readonly ILogger _logger; + private readonly ILogger _logger; + private readonly IServiceProvider _serviceProvider; - public InteventionHandler(ILogger logger) + public UserInteventionHandler(ILogger logger, IServiceProvider serviceProvider) { _logger = logger; + _serviceProvider = serviceProvider; } public void Raise(IUserIntervention intervention) { @@ -18,7 +23,11 @@ public class InteventionHandler : IUserInterventionHandler { // Recast these or they won't be properly handled by the message bus case ManualDownload md: - MessageBus.Current.SendMessage(md); + var view = new BrowserWindow(); + var provider = _serviceProvider.GetRequiredService(); + view.DataContext = provider; + provider.Intervention = md; + view.Show(); break; case ManualBlobDownload bd: MessageBus.Current.SendMessage(bd); diff --git a/Wabbajack.App.Wpf/LoginManagers/LoversLabLoginManager.cs b/Wabbajack.App.Wpf/LoginManagers/LoversLabLoginManager.cs index 6f3a68f0..f0eb60fe 100644 --- a/Wabbajack.App.Wpf/LoginManagers/LoversLabLoginManager.cs +++ b/Wabbajack.App.Wpf/LoginManagers/LoversLabLoginManager.cs @@ -56,10 +56,18 @@ public class LoversLabLoginManager : ViewModel, INeedsLogin TriggerLogin = ReactiveCommand.CreateFromTask(async () => { _logger.LogInformation("Logging into {SiteName}", SiteName); - - MessageBus.Current.SendMessage(new OpenBrowserTab(_serviceProvider.GetRequiredService())); + StartLogin(); }, this.WhenAnyValue(v => v.HaveLogin).Select(v => !v)); } + + private void StartLogin() + { + var view = new BrowserWindow(); + view.Closed += (sender, args) => { RefreshTokenState(); }; + var provider = _serviceProvider.GetRequiredService(); + view.DataContext = provider; + view.Show(); + } private void RefreshTokenState() { diff --git a/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs b/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs index 82a96445..ac120148 100644 --- a/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs +++ b/Wabbajack.App.Wpf/LoginManagers/NexusLoginManager.cs @@ -52,7 +52,8 @@ public class NexusLoginManager : ViewModel, INeedsLogin TriggerLogin = ReactiveCommand.CreateFromTask(async () => { _logger.LogInformation("Logging into {SiteName}", SiteName); - MessageBus.Current.SendMessage(new OpenBrowserTab(_serviceProvider.GetRequiredService())); + //MessageBus.Current.SendMessage(new OpenBrowserTab(_serviceProvider.GetRequiredService())); + StartLogin(); }, this.WhenAnyValue(v => v.HaveLogin).Select(v => !v)); MessageBus.Current.Listen() @@ -60,6 +61,15 @@ public class NexusLoginManager : ViewModel, INeedsLogin .DisposeWith(CompositeDisposable); } + private void StartLogin() + { + var view = new BrowserWindow(); + view.Closed += (sender, args) => { RefreshTokenState(); }; + var provider = _serviceProvider.GetRequiredService(); + view.DataContext = provider; + view.Show(); + } + private void RefreshTokenState() { HaveLogin = _token.HaveToken(); diff --git a/Wabbajack.App.Wpf/LoginManagers/VectorPlexusLoginManager.cs b/Wabbajack.App.Wpf/LoginManagers/VectorPlexusLoginManager.cs index bbc928d1..a2158b8c 100644 --- a/Wabbajack.App.Wpf/LoginManagers/VectorPlexusLoginManager.cs +++ b/Wabbajack.App.Wpf/LoginManagers/VectorPlexusLoginManager.cs @@ -56,9 +56,20 @@ public class VectorPlexusLoginManager : ViewModel, INeedsLogin TriggerLogin = ReactiveCommand.CreateFromTask(async () => { _logger.LogInformation("Logging into {SiteName}", SiteName); - MessageBus.Current.SendMessage(new OpenBrowserTab(_serviceProvider.GetRequiredService())); + StartLogin(); }, this.WhenAnyValue(v => v.HaveLogin).Select(v => !v)); } + + + private void StartLogin() + { + var view = new BrowserWindow(); + view.Closed += (sender, args) => { RefreshTokenState(); }; + var provider = _serviceProvider.GetRequiredService(); + view.DataContext = provider; + view.Show(); + } + private void RefreshTokenState() { diff --git a/Wabbajack.App.Wpf/Messages/CloseBrowserTab.cs b/Wabbajack.App.Wpf/Messages/CloseBrowserTab.cs index b44f14b0..b3813cf4 100644 --- a/Wabbajack.App.Wpf/Messages/CloseBrowserTab.cs +++ b/Wabbajack.App.Wpf/Messages/CloseBrowserTab.cs @@ -2,9 +2,9 @@ namespace Wabbajack.Messages; public class CloseBrowserTab { - public BrowserTabViewModel ViewModel { get; init; } + public BrowserWindowViewModel ViewModel { get; init; } - public CloseBrowserTab(BrowserTabViewModel viewModel) + public CloseBrowserTab(BrowserWindowViewModel viewModel) { ViewModel = viewModel; } diff --git a/Wabbajack.App.Wpf/Messages/OpenBrowserTab.cs b/Wabbajack.App.Wpf/Messages/OpenBrowserTab.cs index b0160a1e..d61412ac 100644 --- a/Wabbajack.App.Wpf/Messages/OpenBrowserTab.cs +++ b/Wabbajack.App.Wpf/Messages/OpenBrowserTab.cs @@ -2,9 +2,9 @@ namespace Wabbajack.Messages; public class OpenBrowserTab { - public BrowserTabViewModel ViewModel { get; set; } + public BrowserWindowViewModel ViewModel { get; set; } - public OpenBrowserTab(BrowserTabViewModel viewModel) + public OpenBrowserTab(BrowserWindowViewModel viewModel) { ViewModel = viewModel; } diff --git a/Wabbajack.App.Wpf/UserIntervention/ManualBlobDownloadHandler.cs b/Wabbajack.App.Wpf/UserIntervention/ManualBlobDownloadHandler.cs index ca46f238..dc5ff730 100644 --- a/Wabbajack.App.Wpf/UserIntervention/ManualBlobDownloadHandler.cs +++ b/Wabbajack.App.Wpf/UserIntervention/ManualBlobDownloadHandler.cs @@ -5,7 +5,7 @@ using Wabbajack.DTOs.Interventions; namespace Wabbajack.UserIntervention; -public class ManualBlobDownloadHandler : BrowserTabViewModel +public class ManualBlobDownloadHandler : BrowserWindowViewModel { public ManualBlobDownload Intervention { get; set; } diff --git a/Wabbajack.App.Wpf/UserIntervention/ManualDownloadHandler.cs b/Wabbajack.App.Wpf/UserIntervention/ManualDownloadHandler.cs index a0e83693..6fa4f3a3 100644 --- a/Wabbajack.App.Wpf/UserIntervention/ManualDownloadHandler.cs +++ b/Wabbajack.App.Wpf/UserIntervention/ManualDownloadHandler.cs @@ -8,7 +8,7 @@ using Wabbajack.Paths; namespace Wabbajack.UserIntervention; -public class ManualDownloadHandler : BrowserTabViewModel +public class ManualDownloadHandler : BrowserWindowViewModel { public ManualDownload Intervention { get; set; } diff --git a/Wabbajack.App.Wpf/UserIntervention/NexusLoginHandler.cs b/Wabbajack.App.Wpf/UserIntervention/NexusLoginHandler.cs index f610dbb0..617885eb 100644 --- a/Wabbajack.App.Wpf/UserIntervention/NexusLoginHandler.cs +++ b/Wabbajack.App.Wpf/UserIntervention/NexusLoginHandler.cs @@ -12,7 +12,7 @@ using Wabbajack.Services.OSIntegrated; namespace Wabbajack.UserIntervention; -public class NexusLoginHandler : BrowserTabViewModel +public class NexusLoginHandler : BrowserWindowViewModel { private readonly EncryptedJsonTokenProvider _tokenProvider; diff --git a/Wabbajack.App.Wpf/UserIntervention/OAuth2LoginHandler.cs b/Wabbajack.App.Wpf/UserIntervention/OAuth2LoginHandler.cs index c170bfdf..9473f5cf 100644 --- a/Wabbajack.App.Wpf/UserIntervention/OAuth2LoginHandler.cs +++ b/Wabbajack.App.Wpf/UserIntervention/OAuth2LoginHandler.cs @@ -17,7 +17,7 @@ using Wabbajack.Services.OSIntegrated; namespace Wabbajack.UserIntervention; -public abstract class OAuth2LoginHandler : BrowserTabViewModel +public abstract class OAuth2LoginHandler : BrowserWindowViewModel where TIntervention : IUserIntervention where TLoginType : OAuth2LoginState, new() { diff --git a/Wabbajack.App.Wpf/View Models/BrowserTabViewModel.cs b/Wabbajack.App.Wpf/View Models/BrowserWindowViewModel.cs similarity index 95% rename from Wabbajack.App.Wpf/View Models/BrowserTabViewModel.cs rename to Wabbajack.App.Wpf/View Models/BrowserWindowViewModel.cs index 810e6484..0cbe36db 100644 --- a/Wabbajack.App.Wpf/View Models/BrowserTabViewModel.cs +++ b/Wabbajack.App.Wpf/View Models/BrowserWindowViewModel.cs @@ -18,20 +18,20 @@ using Wabbajack.Views; namespace Wabbajack; -public abstract class BrowserTabViewModel : ViewModel +public abstract class BrowserWindowViewModel : ViewModel { [Reactive] public string HeaderText { get; set; } [Reactive] public string Instructions { get; set; } - public BrowserView? Browser { get; set; } + public BrowserWindow? Browser { get; set; } private WebView2 _browser => Browser!.Browser; public async Task RunWrapper(CancellationToken token) { await Run(token); - MessageBus.Current.SendMessage(new CloseBrowserTab(this)); + //MessageBus.Current.SendMessage(new CloseBrowserTab(this)); } protected abstract Task Run(CancellationToken token); diff --git a/Wabbajack.App.Wpf/View Models/MainWindowVM.cs b/Wabbajack.App.Wpf/View Models/MainWindowVM.cs index 9e9d5076..816f0bff 100644 --- a/Wabbajack.App.Wpf/View Models/MainWindowVM.cs +++ b/Wabbajack.App.Wpf/View Models/MainWindowVM.cs @@ -181,13 +181,13 @@ namespace Wabbajack private void HandleLogin(LoversLabLogin loversLabLogin) { var handler = _serviceProvider.GetRequiredService(); - handler.RunWrapper(CancellationToken.None).FireAndForget(); + //handler.RunWrapper(CancellationToken.None).FireAndForget(); } private void HandleLogin(VectorPlexusLogin vectorPlexusLogin) { var handler = _serviceProvider.GetRequiredService(); - handler.RunWrapper(CancellationToken.None).FireAndForget(); + //handler.RunWrapper(CancellationToken.None).FireAndForget(); } private void HandleNavigateBack(NavigateBack navigateBack) @@ -200,14 +200,14 @@ namespace Wabbajack { var handler = _serviceProvider.GetRequiredService(); handler.Intervention = manualDownload; - MessageBus.Current.SendMessage(new OpenBrowserTab(handler)); + //MessageBus.Current.SendMessage(new OpenBrowserTab(handler)); } private void HandleManualBlobDownload(ManualBlobDownload manualDownload) { var handler = _serviceProvider.GetRequiredService(); handler.Intervention = manualDownload; - MessageBus.Current.SendMessage(new OpenBrowserTab(handler)); + //MessageBus.Current.SendMessage(new OpenBrowserTab(handler)); } private void HandleNavigateTo(NavigateToGlobal.ScreenType s) diff --git a/Wabbajack.App.Wpf/Views/BrowserTabView.xaml b/Wabbajack.App.Wpf/Views/BrowserTabView.xaml deleted file mode 100644 index 1b1a0545..00000000 --- a/Wabbajack.App.Wpf/Views/BrowserTabView.xaml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - diff --git a/Wabbajack.App.Wpf/Views/BrowserTabView.xaml.cs b/Wabbajack.App.Wpf/Views/BrowserTabView.xaml.cs deleted file mode 100644 index 87222525..00000000 --- a/Wabbajack.App.Wpf/Views/BrowserTabView.xaml.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Reactive.Disposables; -using System.Threading; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using ReactiveUI; -using Wabbajack.Common; - -namespace Wabbajack.Views; - -public partial class BrowserTabView : IDisposable -{ - private readonly CompositeDisposable _compositeDisposable; - - public BrowserTabView() - { - _compositeDisposable = new CompositeDisposable(); - InitializeComponent(); - Browser.Browser.Source = new Uri("http://www.google.com"); - - /* - vm.Browser = Browser; - - vm.WhenAnyValue(vm => vm.HeaderText) - .BindTo(this, view => view.HeaderText.Text) - .DisposeWith(_compositeDisposable); - */ - - //Start().FireAndForget(); - } - - private async Task Start() - { - await ((BrowserTabViewModel) DataContext).RunWrapper(CancellationToken.None); - ClickClose(this, new RoutedEventArgs()); - } - - public void Dispose() - { - _compositeDisposable.Dispose(); - var vm = (BrowserTabViewModel) DataContext; - vm.Browser = null; - } - - private void ClickClose(object sender, RoutedEventArgs e) - { - var tc = (TabControl) this.Parent; - if (tc != null) - { - if (tc.Items.Contains(this)) - tc.Items.Remove(this); - } - - this.Dispose(); - } -} - diff --git a/Wabbajack.App.Wpf/Views/BrowserView.xaml b/Wabbajack.App.Wpf/Views/BrowserView.xaml index b4de535e..5d57984e 100644 --- a/Wabbajack.App.Wpf/Views/BrowserView.xaml +++ b/Wabbajack.App.Wpf/Views/BrowserView.xaml @@ -1,4 +1,4 @@ - + + + + + + + + + + + + Browser Window + + + + + + + + + diff --git a/Wabbajack.App.Wpf/Views/BrowserWindow.xaml.cs b/Wabbajack.App.Wpf/Views/BrowserWindow.xaml.cs new file mode 100644 index 00000000..2ac1ab61 --- /dev/null +++ b/Wabbajack.App.Wpf/Views/BrowserWindow.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Threading; +using System.Windows; +using System.Windows.Input; +using MahApps.Metro.Controls; +using Wabbajack.Common; + +namespace Wabbajack; + +public partial class BrowserWindow : MetroWindow +{ + public BrowserWindow() + { + InitializeComponent(); + } + + private void UIElement_OnMouseDown(object sender, MouseButtonEventArgs e) + { + base.DragMove(); + } + + private void BrowserWindow_OnActivated(object sender, EventArgs e) + { + var vm = ((BrowserWindowViewModel) DataContext); + vm.Browser = this; + vm.RunWrapper(CancellationToken.None) + .ContinueWith(_ => Dispatcher.Invoke(Close)); + } +} \ No newline at end of file diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml b/Wabbajack.App.Wpf/Views/MainWindow.xaml index 47e1d248..16974921 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml @@ -8,7 +8,6 @@ xmlns:mahapps="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:viewModels="clr-namespace:Wabbajack.View_Models" - xmlns:behaviors="clr-namespace:IKriv.Windows.Controls.Behaviors" xmlns:views="clr-namespace:Wabbajack.Views" ShowTitleBar="False" Title="WABBAJACK" @@ -25,63 +24,46 @@ WindowTitleBrush="{StaticResource MahApps.Brushes.Accent}" mc:Ignorable="d"> - - - - - - - WABBAJACK 3.0.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + WABBAJACK 3.0.0 + + + - - + + - - - + + + + + + + + + + + + + + + + + - - - - + + diff --git a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs index a301c092..b207ab14 100644 --- a/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs +++ b/Wabbajack.App.Wpf/Views/MainWindow.xaml.cs @@ -40,12 +40,7 @@ namespace Wabbajack { InitializeComponent(); _mwvm = vm; - Tabs.ItemsSource = TabVMs; - TabVMs.Add(vm); - - TabVMs.Add(new ManualDownloadHandler() {Intervention = new ManualDownload(new Archive() {State = new Manual(){Url = new Uri("https://www.wabbajack.org")}})}); - Tabs.SelectedItem = TabVMs.Last(); - + DataContext = vm; _logger = logger; _systemParams = systemParams; try @@ -121,10 +116,10 @@ namespace Wabbajack { this.Topmost = false; }; -/* + ((MainWindowVM) DataContext).WhenAnyValue(vm => vm.OpenSettingsCommand) .BindTo(this, view => view.SettingsButton.Command); - */ + } catch (Exception ex) { @@ -227,12 +222,13 @@ namespace Wabbajack private void OnCloseBrowserTab(CloseBrowserTab msg) { + /* foreach (var tab in Tabs.Items.OfType()) { if (tab.DataContext != msg.ViewModel) continue; Tabs.Items.Remove(tab); break; - } + }*/ } } } diff --git a/Wabbajack.App.Wpf/Views/MainWindowContent.xaml b/Wabbajack.App.Wpf/Views/MainWindowContent.xaml index 39437e80..ddb20654 100644 --- a/Wabbajack.App.Wpf/Views/MainWindowContent.xaml +++ b/Wabbajack.App.Wpf/Views/MainWindowContent.xaml @@ -8,38 +8,7 @@ xmlns:viewModels="clr-namespace:Wabbajack.View_Models" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +