diff --git a/src/modules/Projects/ProjectsEditor/Data/TempProjectData.cs b/src/modules/Projects/ProjectsEditor/Data/TempProjectData.cs
index d39c911c0e..1841fc1612 100644
--- a/src/modules/Projects/ProjectsEditor/Data/TempProjectData.cs
+++ b/src/modules/Projects/ProjectsEditor/Data/TempProjectData.cs
@@ -8,7 +8,7 @@ namespace ProjectsEditor.Data
{
public class TempProjectData : ProjectData
{
- public string File
+ public static string File
{
get
{
@@ -16,7 +16,7 @@ namespace ProjectsEditor.Data
}
}
- public void DeleteTempFile()
+ public static void DeleteTempFile()
{
if (System.IO.File.Exists(File))
{
diff --git a/src/modules/Projects/ProjectsEditor/MainPage.xaml.cs b/src/modules/Projects/ProjectsEditor/MainPage.xaml.cs
index eab91b83a8..540b0c5837 100644
--- a/src/modules/Projects/ProjectsEditor/MainPage.xaml.cs
+++ b/src/modules/Projects/ProjectsEditor/MainPage.xaml.cs
@@ -25,7 +25,7 @@ namespace ProjectsEditor
private /*async*/ void NewProjectButton_Click(object sender, RoutedEventArgs e)
{
- _mainViewModel.EnterSnapshotMode();
+ _mainViewModel.EnterSnapshotMode(false);
}
private void EditButtonClicked(object sender, RoutedEventArgs e)
diff --git a/src/modules/Projects/ProjectsEditor/Models/Project.cs b/src/modules/Projects/ProjectsEditor/Models/Project.cs
index 784367c03f..4effabbacd 100644
--- a/src/modules/Projects/ProjectsEditor/Models/Project.cs
+++ b/src/modules/Projects/ProjectsEditor/Models/Project.cs
@@ -124,6 +124,21 @@ namespace ProjectsEditor.Models
get => Name.Length > 0 && Applications.Count > 0;
}
+ private bool _isRevertEnabled;
+
+ public bool IsRevertEnabled
+ {
+ get => _isRevertEnabled;
+ set
+ {
+ if (_isRevertEnabled != value)
+ {
+ _isRevertEnabled = value;
+ OnPropertyChanged(new PropertyChangedEventArgs(nameof(IsRevertEnabled)));
+ }
+ }
+ }
+
private bool _isPopupVisible;
[JsonIgnore]
diff --git a/src/modules/Projects/ProjectsEditor/ProjectEditorPage.xaml b/src/modules/Projects/ProjectsEditor/ProjectEditorPage.xaml
index 4c3fb0da1d..a8eb6ead12 100644
--- a/src/modules/Projects/ProjectsEditor/ProjectEditorPage.xaml
+++ b/src/modules/Projects/ProjectsEditor/ProjectEditorPage.xaml
@@ -21,7 +21,15 @@
-
+
+
@@ -266,6 +274,7 @@
+
@@ -317,17 +326,43 @@
HorizontalAlignment="Stretch"
Background="{DynamicResource MonitorViewBackgroundBrush}"
CornerRadius="5">
-
+
+
+
+
+
+ Grid.Row="4">
@@ -341,7 +376,7 @@
-
+
+ /// Looks up a localized string similar to Launch & Edit.
+ ///
+ public static string LaunchEdit {
+ get {
+ return ResourceManager.GetString("LaunchEdit", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Left.
///
@@ -510,6 +519,15 @@ namespace ProjectsEditor.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to Revert.
+ ///
+ public static string Revert {
+ get {
+ return ResourceManager.GetString("Revert", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Save project.
///
diff --git a/src/modules/Projects/ProjectsEditor/Properties/Resources.resx b/src/modules/Projects/ProjectsEditor/Properties/Resources.resx
index 1275c455ff..a6a331cb94 100644
--- a/src/modules/Projects/ProjectsEditor/Properties/Resources.resx
+++ b/src/modules/Projects/ProjectsEditor/Properties/Resources.resx
@@ -199,6 +199,9 @@
Launch as Admin
+
+ Launch & Edit
+
Launch args
@@ -269,6 +272,9 @@
recently
+
+ Revert
+
Save project
diff --git a/src/modules/Projects/ProjectsEditor/Utils/DrawHelper.cs b/src/modules/Projects/ProjectsEditor/Utils/DrawHelper.cs
index aed7c9d3cf..88e06f368c 100644
--- a/src/modules/Projects/ProjectsEditor/Utils/DrawHelper.cs
+++ b/src/modules/Projects/ProjectsEditor/Utils/DrawHelper.cs
@@ -142,7 +142,7 @@ namespace ProjectsEditor.Utils
// draw the minimized windows
Rectangle rectMinimized = new Rectangle(0, Scaled((bounds.Height * 1.02) + (horizontalGaps.Count * gapHeight)), Scaled(bounds.Width + (verticalGaps.Count * gapWidth)), Scaled(bounds.Height * 0.18));
- DrawWindow(g, brush, brushForHighlight, rectMinimized, project.Applications.Where(x => x.Minimized));
+ DrawWindow(g, brush, brushForHighlight, rectMinimized, appsIncluded.Where(x => x.Minimized));
}
using (var memory = new MemoryStream())
diff --git a/src/modules/Projects/ProjectsEditor/Utils/ProjectsEditorIO.cs b/src/modules/Projects/ProjectsEditor/Utils/ProjectsEditorIO.cs
index d03d929c25..12a72dd46c 100644
--- a/src/modules/Projects/ProjectsEditor/Utils/ProjectsEditorIO.cs
+++ b/src/modules/Projects/ProjectsEditor/Utils/ProjectsEditorIO.cs
@@ -52,15 +52,15 @@ namespace ProjectsEditor.Utils
project = null;
try
{
- TempProjectData parser = new TempProjectData();
- if (!File.Exists(parser.File))
+ ProjectData parser = new ProjectData();
+ if (!File.Exists(TempProjectData.File))
{
- Logger.LogWarning($"ParseProject method. Projects storage file not found: {parser.File}");
+ Logger.LogWarning($"ParseProject method. Projects storage file not found: {TempProjectData.File}");
return new ParsingResult(false);
}
- project = GetProjectFromWrapper(parser.Read(parser.File));
- parser.DeleteTempFile();
+ project = GetProjectFromWrapper(parser.Read(TempProjectData.File));
+ TempProjectData.DeleteTempFile();
return new ParsingResult(true);
}
@@ -121,7 +121,7 @@ namespace ProjectsEditor.Utils
return newProject;
}
- public void SerializeProjects(List projects)
+ public void SerializeProjects(List projects, bool useTempFile = false)
{
ProjectsData serializer = new ProjectsData();
ProjectsData.ProjectsListWrapper projectsWrapper = new ProjectsData.ProjectsListWrapper { };
@@ -194,7 +194,7 @@ namespace ProjectsEditor.Utils
try
{
IOUtils ioUtils = new IOUtils();
- ioUtils.WriteFile(serializer.File, serializer.Serialize(projectsWrapper));
+ ioUtils.WriteFile(useTempFile ? TempProjectData.File : serializer.File, serializer.Serialize(projectsWrapper));
}
catch (Exception e)
{
@@ -219,5 +219,10 @@ namespace ProjectsEditor.Utils
mainViewModel.Projects = new System.Collections.ObjectModel.ObservableCollection { };
return AddProjects(mainViewModel, projects);
}
+
+ internal void SerializeTempProject(Project project)
+ {
+ SerializeProjects(new List() { project }, true);
+ }
}
}
diff --git a/src/modules/Projects/ProjectsEditor/ViewModels/MainViewModel.cs b/src/modules/Projects/ProjectsEditor/ViewModels/MainViewModel.cs
index 64dfce6de5..14b501e9d6 100644
--- a/src/modules/Projects/ProjectsEditor/ViewModels/MainViewModel.cs
+++ b/src/modules/Projects/ProjectsEditor/ViewModels/MainViewModel.cs
@@ -14,6 +14,7 @@ using System.Linq;
using System.Threading.Tasks;
using System.Timers;
using ManagedCommon;
+using ProjectsEditor.Data;
using ProjectsEditor.Models;
using ProjectsEditor.Utils;
using static ProjectsEditor.Data.ProjectsData;
@@ -23,8 +24,15 @@ namespace ProjectsEditor.ViewModels
public class MainViewModel : INotifyPropertyChanged, IDisposable
{
private ProjectsEditorIO _projectsEditorIO;
+ private ProjectEditor editPage;
private SnapshotWindow _snapshotWindow;
private List _overlayWindows = new List();
+ private bool _isExistingProjectLaunched;
+ private Project editedProject;
+ private Project projectBeforeLaunch;
+ private string projectNameBeingEdited;
+ private MainWindow _mainWindow;
+ private Timer lastUpdatedTimer;
public ObservableCollection Projects { get; set; } = new ObservableCollection();
@@ -126,11 +134,6 @@ namespace ProjectsEditor.ViewModels
PropertyChanged?.Invoke(this, e);
}
- private Project editedProject;
- private string projectNameBeingEdited;
- private MainWindow _mainWindow;
- private System.Timers.Timer lastUpdatedTimer;
-
public MainViewModel(ProjectsEditorIO projectsEditorIO)
{
_projectsEditorIO = projectsEditorIO;
@@ -226,13 +229,32 @@ namespace ProjectsEditor.ViewModels
Project project = new Project();
if (_projectsEditorIO.ParseTempProject(out project).Result)
{
- EditProject(project, true);
+ if (_isExistingProjectLaunched)
+ {
+ UpdateProject(project);
+ }
+ else
+ {
+ EditProject(project, true);
+ }
}
}
+ private void UpdateProject(Project project)
+ {
+ project.Name = projectBeforeLaunch.Name;
+ project.IsRevertEnabled = true;
+ editPage.DataContext = project;
+ }
+
+ internal void RevertLaunch()
+ {
+ editPage.DataContext = projectBeforeLaunch;
+ }
+
public void EditProject(Project selectedProject, bool isNewlyCreated = false)
{
- var editPage = new ProjectEditor(this);
+ editPage = new ProjectEditor(this);
SetEditedProject(selectedProject);
if (!isNewlyCreated)
@@ -353,10 +375,10 @@ namespace ProjectsEditor.ViewModels
p.WaitForExit();
}
- private void RunLauncher(string projectId)
+ private void RunLauncher(string projectIdOrFilename)
{
Process p = new Process();
- p.StartInfo = new ProcessStartInfo(@".\PowerToys.ProjectsLauncher.exe", projectId);
+ p.StartInfo = new ProcessStartInfo(@".\PowerToys.ProjectsLauncher.exe", projectIdOrFilename);
p.StartInfo.CreateNoWindow = true;
p.Start();
p.WaitForExit();
@@ -375,8 +397,9 @@ namespace ProjectsEditor.ViewModels
}
}
- internal void EnterSnapshotMode()
+ internal void EnterSnapshotMode(bool isExistingProjectLaunched)
{
+ _isExistingProjectLaunched = isExistingProjectLaunched;
_mainWindow.WindowState = System.Windows.WindowState.Minimized;
_overlayWindows.Clear();
foreach (var screen in MonitorHelper.GetDpiUnawareScreens())
@@ -408,5 +431,18 @@ namespace ProjectsEditor.ViewModels
_mainWindow.WindowState = System.Windows.WindowState.Normal;
}
+
+ internal void LaunchAndEdit(Project project)
+ {
+ LaunchEditedProject(project);
+ projectBeforeLaunch = new Project(project);
+ EnterSnapshotMode(true);
+ }
+
+ private void LaunchEditedProject(Project project)
+ {
+ _projectsEditorIO.SerializeTempProject(project);
+ RunLauncher(TempProjectData.File);
+ }
}
}