Skip to content

Commit 13667d8

Browse files
authored
Merge pull request #361 from lampenlampen/feat/Terminal
Choose Terminal Applications
2 parents 3ac95b9 + 40a85d5 commit 13667d8

File tree

8 files changed

+170
-12
lines changed

8 files changed

+170
-12
lines changed

Files/App.xaml.cs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@
3030
using Windows.Storage.Streams;
3131
using Windows.System;
3232
using Microsoft.UI.Xaml.Controls;
33+
using System.Threading.Tasks;
34+
using Windows.ApplicationModel.AppService;
35+
using Windows.ApplicationModel.AppExtensions;
36+
using Files.DataModels;
37+
using Newtonsoft.Json;
3338

3439
namespace Files
3540
{
@@ -52,9 +57,9 @@ public static ProHome OccupiedInstance
5257
}
5358
set
5459
{
55-
if(value != occupiedInstance)
60+
if (value != occupiedInstance)
5661
{
57-
occupiedInstance = value;
62+
occupiedInstance = value;
5863
}
5964
}
6065
}
@@ -68,6 +73,7 @@ public static ProHome OccupiedInstance
6873
public static ObservableCollection<WSLDistroItem> linuxDistroItems = new ObservableCollection<WSLDistroItem>();
6974
public static FormFactorMode FormFactor { get; set; } = FormFactorMode.Regular;
7075
ApplicationDataContainer localSettings;
76+
public static IList<TerminalModel> Terminals {get; set;}
7177

7278
public App()
7379
{
@@ -87,6 +93,31 @@ public App()
8793
PopulatePinnedSidebarItems();
8894
DetectWSLDistros();
8995
QuickLookIntegration();
96+
LoadTerminalApps();
97+
}
98+
99+
private async void LoadTerminalApps()
100+
{
101+
var localFolder = ApplicationData.Current.LocalFolder;
102+
var localSettingsFolder = await localFolder.CreateFolderAsync("settings", CreationCollisionOption.OpenIfExists);
103+
StorageFile file;
104+
try
105+
{
106+
file = await localSettingsFolder.GetFileAsync("terminal.json");
107+
}
108+
catch (FileNotFoundException ex)
109+
{
110+
var defaultFile = StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/terminal/terminal.json"));
111+
112+
file = await localSettingsFolder.CreateFileAsync("terminal.json");
113+
await FileIO.WriteBufferAsync(file, await FileIO.ReadBufferAsync(await defaultFile));
114+
}
115+
116+
var content = await FileIO.ReadTextAsync(file);
117+
118+
var terminals = JsonConvert.DeserializeObject<TerminalFileModel>(content).Terminals;
119+
120+
Terminals = terminals;
90121
}
91122

92123
public void CloseOpenPopups()

Files/Assets/terminal/terminal.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"version": 1,
3+
"terminals": [
4+
{
5+
"id": 1,
6+
"name": "CMD",
7+
"path": "cmd.exe",
8+
"arguments": "/k \"cd /d {0} && title Command Prompt\"",
9+
"icon": "C:\\Users\\felix\\Pictures\\BingImageOfTheDay_20190730.jpg"
10+
}
11+
/*
12+
{
13+
"id": 2,
14+
"name": "PowerShell Core 6",
15+
"path": "pwsh.exe",
16+
"arguments": "-WorkingDirectory {0}",
17+
"icon": "C:\\Users\\felix\\Pictures\\BingImageOfTheDay_20190730.jpg"
18+
}
19+
*/
20+
]
21+
}

Files/DataModels/TerminalFileModel.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace Files.DataModels
8+
{
9+
class TerminalFileModel
10+
{
11+
public int Version { get; set; }
12+
13+
public List<TerminalModel> Terminals { get; set; }
14+
}
15+
}

Files/DataModels/TerminalModel.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace Files.DataModels
8+
{
9+
public class TerminalModel
10+
{
11+
public int Id { get; set; }
12+
13+
public string Name { get; set; }
14+
15+
public string Path { get; set; }
16+
17+
public string icon { get; set; }
18+
19+
public string arguments { get; set; }
20+
}
21+
}

Files/Files.csproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@
145145
<Compile Include="Controls\RibbonPage.xaml.cs">
146146
<DependentUpon>RibbonPage.xaml</DependentUpon>
147147
</Compile>
148+
<Compile Include="DataModels\TerminalFileModel.cs" />
149+
<Compile Include="DataModels\TerminalModel.cs" />
148150
<Compile Include="Dialogs\AddItemDialog.xaml.cs">
149151
<DependentUpon>AddItemDialog.xaml</DependentUpon>
150152
</Compile>
@@ -233,6 +235,9 @@
233235
<Content Include="Assets\FilesDrive.png" />
234236
<Content Include="Assets\FolderIcon.svg" />
235237
<Content Include="Assets\logo.bmp" />
238+
<None Include="Assets\terminal\terminal.json">
239+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
240+
</None>
236241
<None Include="Package.StoreAssociation.xml" />
237242
<Content Include="Assets\QuickLook\quicklook_icon_black.png" />
238243
<Content Include="Assets\StoreLogo.png" />
@@ -385,6 +390,9 @@
385390
<PackageReference Include="MvvmLight">
386391
<Version>5.4.1.1</Version>
387392
</PackageReference>
393+
<PackageReference Include="Newtonsoft.Json">
394+
<Version>12.0.3</Version>
395+
</PackageReference>
388396
</ItemGroup>
389397
<ItemGroup>
390398
<SDKReference Include="WindowsDesktop, Version=10.0.18362.0">

Files/Interacts/Interaction.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,16 +93,16 @@ public void OpenDirectoryInNewTab_Click(object sender, RoutedEventArgs e)
9393

9494
public async void OpenDirectoryInTerminal(object sender, RoutedEventArgs e)
9595
{
96+
var localSettings = ApplicationData.Current.LocalSettings;
9697

97-
ApplicationData.Current.LocalSettings.Values["Application"] = "cmd.exe";
98-
if(App.OccupiedInstance.ItemDisplayFrame.SourcePageType == typeof(GenericFileBrowser))
99-
{
100-
ApplicationData.Current.LocalSettings.Values["Arguments"] = "/k \"cd /d "+ currentInstance.instanceViewModel.Universal.path + "&& title Command Prompt" + "\"";
101-
}
102-
else if(App.OccupiedInstance.ItemDisplayFrame.SourcePageType == typeof(PhotoAlbum))
103-
{
104-
ApplicationData.Current.LocalSettings.Values["Arguments"] = "/k \"cd /d " + currentInstance.instanceViewModel.Universal.path + "&& title Command Prompt" + "\"";
105-
}
98+
var terminalId = 1;
99+
100+
if (localSettings.Values["terminal_id"] != null) terminalId = (int)localSettings.Values["terminal_id"];
101+
102+
var terminal = App.Terminals.Single(p => p.Id == terminalId);
103+
104+
localSettings.Values["Application"] = terminal.Path;
105+
localSettings.Values["Arguments"] = String.Format(terminal.arguments, currentInstance.instanceViewModel.Universal.path);
106106

107107
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
108108
}

Files/SettingsPages/Preferences.xaml

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
55
xmlns:local="using:Files.SettingsPages"
66
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
7-
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
7+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:datamodels="using:Files.DataModels"
88
mc:Ignorable="d"
99
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
1010

@@ -53,6 +53,27 @@
5353
</StackPanel>
5454
</StackPanel>
5555
</Grid>
56+
57+
<Grid Margin="0,18,0,0">
58+
<StackPanel Orientation="Vertical">
59+
<TextBlock FontSize="20" Text="Terminal Applications"/>
60+
61+
<ComboBox
62+
x:Name="TerminalApplicationsComboBox"
63+
Header="Choose Terminal Application"
64+
ItemsSource="{x:Bind Terminals}"
65+
SelectionChanged="TerminalApp_SelectionChanged">
66+
<ComboBox.ItemTemplate>
67+
<DataTemplate x:DataType="datamodels:TerminalModel">
68+
<StackPanel Orientation="Horizontal">
69+
<TextBlock Text="{x:Bind Name}"/>
70+
</StackPanel>
71+
</DataTemplate>
72+
</ComboBox.ItemTemplate>
73+
</ComboBox>
74+
<HyperlinkButton Content="Edit Terminal Applications" Click="EditTerminalApplications_Click"/>
75+
</StackPanel>
76+
</Grid>
5677
</StackPanel>
5778
</ScrollViewer>
5879
</Grid>

Files/SettingsPages/Preferences.xaml.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,20 @@
55
using Windows.UI;
66
using System.IO;
77
using Files.Filesystem;
8+
using Newtonsoft.Json;
9+
using Files.DataModels;
10+
using System.Collections.ObjectModel;
11+
using Windows.System;
12+
using Windows.UI.Xaml.Navigation;
13+
using System.Linq;
814

915
namespace Files.SettingsPages
1016
{
1117

1218
public sealed partial class Preferences : Page
1319
{
20+
ObservableCollection<TerminalModel> Terminals { get; } = new ObservableCollection<TerminalModel>();
21+
1422
ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
1523
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
1624
public Preferences()
@@ -74,6 +82,20 @@ public Preferences()
7482
SuccessMark.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
7583
}
7684

85+
protected override void OnNavigatedTo(NavigationEventArgs e)
86+
{
87+
base.OnNavigatedTo(e);
88+
89+
var terminals = App.Terminals;
90+
91+
foreach (var terminal in terminals) Terminals.Add(terminal);
92+
93+
var terminalId = 1;
94+
if (localSettings.Values["terminal_id"] != null) terminalId = (int) localSettings.Values["terminal_id"];
95+
96+
TerminalApplicationsComboBox.SelectedItem = Terminals.Single(p => p.Id == terminalId);
97+
}
98+
7799
private void ToggleSwitch_Toggled(object sender, Windows.UI.Xaml.RoutedEventArgs e)
78100
{
79101
if ((sender as ToggleSwitch).IsOn)
@@ -276,5 +298,24 @@ private async void SaveCustomL_Click(object sender, Windows.UI.Xaml.RoutedEventA
276298
SuccessMark.Visibility = Windows.UI.Xaml.Visibility.Visible;
277299
}
278300
}
301+
302+
private async void EditTerminalApplications_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
303+
{
304+
LaunchTerminalsConfigFile();
305+
}
306+
307+
private async void LaunchTerminalsConfigFile()
308+
{
309+
Launcher.LaunchFileAsync(await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/settings/terminal.json")));
310+
}
311+
312+
private void TerminalApp_SelectionChanged(object sender, SelectionChangedEventArgs e)
313+
{
314+
var comboBox = (ComboBox)sender;
315+
316+
var selectedTerminal = (TerminalModel)comboBox.SelectedItem;
317+
318+
localSettings.Values["terminal_id"] = selectedTerminal.Id;
319+
}
279320
}
280321
}

0 commit comments

Comments
 (0)