mirror of
https://github.com/sourcegit-scm/sourcegit.git
synced 2024-12-23 20:47:25 -08:00
optimize<FolderDialog>: remove dependency of Ookii.Dialogs.Wpf
This commit is contained in:
parent
a7ddc50665
commit
4a56b47265
11 changed files with 132 additions and 15 deletions
|
@ -6,7 +6,7 @@ cd src
|
||||||
rmdir /s /q bin
|
rmdir /s /q bin
|
||||||
rmdir /s /q obj
|
rmdir /s /q obj
|
||||||
dotnet publish SourceGit_48.csproj --nologo -c Release -r win-x86 -o ..\publish\net48
|
dotnet publish SourceGit_48.csproj --nologo -c Release -r win-x86 -o ..\publish\net48
|
||||||
ilrepack /ndebug /out:..\publish\SourceGit.exe ..\publish\net48\SourceGit.exe ..\publish\net48\Newtonsoft.Json.dll ..\publish\net48\Ookii.Dialogs.Wpf.dll
|
ilrepack /ndebug /out:..\publish\SourceGit.exe ..\publish\net48\SourceGit.exe ..\publish\net48\Newtonsoft.Json.dll
|
||||||
cd ..\publish
|
cd ..\publish
|
||||||
ren SourceGit.exe SourceGit_48.exe
|
ren SourceGit.exe SourceGit_48.exe
|
||||||
rmdir /s /q net48
|
rmdir /s /q net48
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
<sys:String x:Key="Text.Filter">FILTER</sys:String>
|
<sys:String x:Key="Text.Filter">FILTER</sys:String>
|
||||||
<sys:String x:Key="Text.Optional">Optional.</sys:String>
|
<sys:String x:Key="Text.Optional">Optional.</sys:String>
|
||||||
<sys:String x:Key="Text.FakeFolderFilter">Directory|*.this.directory</sys:String>
|
<sys:String x:Key="Text.FakeFolderFilter">Directory|*.this.directory</sys:String>
|
||||||
|
<sys:String x:Key="Text.OpenFolder">SELECT FOLDER</sys:String>
|
||||||
|
|
||||||
<sys:String x:Key="Text.URL">URL :</sys:String>
|
<sys:String x:Key="Text.URL">URL :</sys:String>
|
||||||
<sys:String x:Key="Text.RepositoryURL">Git Repository URL</sys:String>
|
<sys:String x:Key="Text.RepositoryURL">Git Repository URL</sys:String>
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
<sys:String x:Key="Text.Filter">过滤</sys:String>
|
<sys:String x:Key="Text.Filter">过滤</sys:String>
|
||||||
<sys:String x:Key="Text.Optional">选填</sys:String>
|
<sys:String x:Key="Text.Optional">选填</sys:String>
|
||||||
<sys:String x:Key="Text.FakeFolderFilter">路径|*.this.directory</sys:String>
|
<sys:String x:Key="Text.FakeFolderFilter">路径|*.this.directory</sys:String>
|
||||||
|
<sys:String x:Key="Text.OpenFolder">选择文件夹</sys:String>
|
||||||
|
|
||||||
<sys:String x:Key="Text.URL">仓库地址 :</sys:String>
|
<sys:String x:Key="Text.URL">仓库地址 :</sys:String>
|
||||||
<sys:String x:Key="Text.RepositoryURL">远程仓库地址</sys:String>
|
<sys:String x:Key="Text.RepositoryURL">远程仓库地址</sys:String>
|
||||||
|
|
|
@ -17,7 +17,4 @@
|
||||||
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
|
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
|
||||||
<SatelliteResourceLanguages>none</SatelliteResourceLanguages>
|
<SatelliteResourceLanguages>none</SatelliteResourceLanguages>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Ookii.Dialogs.Wpf" Version="3.1.0" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
</Project>
|
|
@ -21,6 +21,5 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
||||||
<PackageReference Include="Ookii.Dialogs.Wpf" Version="3.1.0" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
124
src/Views/Controls/FolderDialog.cs
Normal file
124
src/Views/Controls/FolderDialog.cs
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Security;
|
||||||
|
|
||||||
|
namespace SourceGit.Views.Controls {
|
||||||
|
|
||||||
|
[SuppressUnmanagedCodeSecurity]
|
||||||
|
internal delegate Int32 BrowseCallbackProc(IntPtr hwnd, Int32 msg, IntPtr lParam, IntPtr lpData);
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
|
||||||
|
[SuppressUnmanagedCodeSecurity]
|
||||||
|
internal class BrowseInfo {
|
||||||
|
public IntPtr hwndOwner;
|
||||||
|
public IntPtr pidlRoot;
|
||||||
|
public IntPtr pszDisplayName;
|
||||||
|
public String lpszTitle;
|
||||||
|
public Int32 ulFlags;
|
||||||
|
public BrowseCallbackProc lpfn;
|
||||||
|
public IntPtr lParam;
|
||||||
|
public Int32 iImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Win32 API封装(user32.dll)
|
||||||
|
/// </summary>
|
||||||
|
[SuppressUnmanagedCodeSecurity]
|
||||||
|
internal static class User32 {
|
||||||
|
[DllImport("user32.dll", CharSet = CharSet.Auto)]
|
||||||
|
public static extern IntPtr SendMessage(HandleRef hWnd, Int32 msg, Int32 wParam, String lParam);
|
||||||
|
|
||||||
|
[DllImport("user32.dll", CharSet = CharSet.Auto)]
|
||||||
|
public static extern IntPtr SendMessage(HandleRef hWnd, Int32 msg, Int32 wParam, Int32 lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Win32 API封装(ole32.dll)
|
||||||
|
/// </summary>
|
||||||
|
[SuppressUnmanagedCodeSecurity]
|
||||||
|
internal static class Ole32 {
|
||||||
|
[DllImport("ole32.dll", CharSet = CharSet.Auto, ExactSpelling = true, SetLastError = true)]
|
||||||
|
internal static extern void CoTaskMemFree(IntPtr pv);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Win32 API封装(shell32.dll)
|
||||||
|
/// </summary>
|
||||||
|
[SuppressUnmanagedCodeSecurity]
|
||||||
|
internal static class Shell32 {
|
||||||
|
[DllImport("shell32.dll", CharSet = CharSet.Auto)]
|
||||||
|
public static extern Boolean SHGetPathFromIDList(IntPtr pidl, IntPtr pszPath);
|
||||||
|
|
||||||
|
[DllImport("shell32.dll", CharSet = CharSet.Auto)]
|
||||||
|
public static extern IntPtr SHBrowseForFolder([In] BrowseInfo lpbi);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 调用WindowsAPI打开对话目录对话框
|
||||||
|
/// </summary>
|
||||||
|
public class FolderDialog : Microsoft.Win32.CommonDialog {
|
||||||
|
/// <summary>
|
||||||
|
/// 选中的目录
|
||||||
|
/// </summary>
|
||||||
|
public string SelectedPath { get; private set; } = string.Empty;
|
||||||
|
|
||||||
|
public override void Reset() {
|
||||||
|
SelectedPath = string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool RunDialog(IntPtr hwndOwner) {
|
||||||
|
BrowseCallbackProc callback = new BrowseCallbackProc(BrowseCallbackHandler);
|
||||||
|
bool ok = false;
|
||||||
|
try {
|
||||||
|
var info = new BrowseInfo();
|
||||||
|
info.pidlRoot = IntPtr.Zero;
|
||||||
|
info.hwndOwner = hwndOwner;
|
||||||
|
info.pszDisplayName = IntPtr.Zero;
|
||||||
|
info.lpszTitle = null;
|
||||||
|
info.ulFlags = 0x0153;
|
||||||
|
info.lpfn = callback;
|
||||||
|
info.lParam = IntPtr.Zero;
|
||||||
|
info.iImage = 0;
|
||||||
|
|
||||||
|
IntPtr result = Shell32.SHBrowseForFolder(info);
|
||||||
|
if (result != IntPtr.Zero) {
|
||||||
|
IntPtr pathPtr = Marshal.AllocHGlobal(260 * Marshal.SystemDefaultCharSize);
|
||||||
|
Shell32.SHGetPathFromIDList(result, pathPtr);
|
||||||
|
|
||||||
|
if (pathPtr != IntPtr.Zero) {
|
||||||
|
SelectedPath = Marshal.PtrToStringAuto(pathPtr);
|
||||||
|
ok = true;
|
||||||
|
Marshal.FreeHGlobal(pathPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ole32.CoTaskMemFree(result);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
callback = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Int32 BrowseCallbackHandler(IntPtr hwnd, Int32 msg, IntPtr lParam, IntPtr lpData) {
|
||||||
|
switch (msg) {
|
||||||
|
case 1:
|
||||||
|
if (!string.IsNullOrEmpty(SelectedPath)) {
|
||||||
|
Int32 flag = Marshal.SystemDefaultCharSize == 1 ? 1126 : 1127;
|
||||||
|
User32.SendMessage(new HandleRef(null, hwnd), flag, 1, SelectedPath);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (lParam != IntPtr.Zero) {
|
||||||
|
IntPtr pathPtr = Marshal.AllocHGlobal(260 * Marshal.SystemDefaultCharSize);
|
||||||
|
bool flag = Shell32.SHGetPathFromIDList(lParam, pathPtr);
|
||||||
|
Marshal.FreeHGlobal(pathPtr);
|
||||||
|
User32.SendMessage(new HandleRef(null, hwnd), 1125, 0, flag ? 1 : 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,3 @@
|
||||||
using Ookii.Dialogs.Wpf;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
|
|
||||||
|
@ -55,7 +54,7 @@ namespace SourceGit.Views.Popups {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnFolderSelectorClick(object sender, System.Windows.RoutedEventArgs e) {
|
private void OnFolderSelectorClick(object sender, System.Windows.RoutedEventArgs e) {
|
||||||
var dialog = new VistaFolderBrowserDialog();
|
var dialog = new Controls.FolderDialog();
|
||||||
if (dialog.ShowDialog() == true) {
|
if (dialog.ShowDialog() == true) {
|
||||||
Folder = dialog.SelectedPath;
|
Folder = dialog.SelectedPath;
|
||||||
txtFolder.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
|
txtFolder.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using Ookii.Dialogs.Wpf;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
|
@ -62,7 +61,7 @@ namespace SourceGit.Views {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SelectGitCloneDir(object sender, RoutedEventArgs e) {
|
private void SelectGitCloneDir(object sender, RoutedEventArgs e) {
|
||||||
var dialog = new VistaFolderBrowserDialog();
|
var dialog = new Controls.FolderDialog();
|
||||||
if (dialog.ShowDialog() == true) {
|
if (dialog.ShowDialog() == true) {
|
||||||
Models.Preference.Instance.Git.DefaultCloneDir = dialog.SelectedPath;
|
Models.Preference.Instance.Git.DefaultCloneDir = dialog.SelectedPath;
|
||||||
txtGitCloneDir?.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
|
txtGitCloneDir?.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
using Ookii.Dialogs.Wpf;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
@ -349,7 +348,7 @@ namespace SourceGit.Views.Widgets {
|
||||||
var saveToPatch = new MenuItem();
|
var saveToPatch = new MenuItem();
|
||||||
saveToPatch.Header = App.Text("CommitCM.SaveAsPatch");
|
saveToPatch.Header = App.Text("CommitCM.SaveAsPatch");
|
||||||
saveToPatch.Click += (o, e) => {
|
saveToPatch.Click += (o, e) => {
|
||||||
var dialog = new VistaFolderBrowserDialog();
|
var dialog = new Controls.FolderDialog();
|
||||||
if (dialog.ShowDialog() == true) {
|
if (dialog.ShowDialog() == true) {
|
||||||
new Commands.FormatPatch(repo.Path, commit.SHA, dialog.SelectedPath).Exec();
|
new Commands.FormatPatch(repo.Path, commit.SHA, dialog.SelectedPath).Exec();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
using Ookii.Dialogs.Wpf;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
@ -296,7 +295,7 @@ namespace SourceGit.Views.Widgets {
|
||||||
saveAs.Header = App.Text("SaveAs");
|
saveAs.Header = App.Text("SaveAs");
|
||||||
saveAs.IsEnabled = node.Type == Models.ObjectType.Blob;
|
saveAs.IsEnabled = node.Type == Models.ObjectType.Blob;
|
||||||
saveAs.Click += (obj, ev) => {
|
saveAs.Click += (obj, ev) => {
|
||||||
var dialog = new VistaFolderBrowserDialog();
|
var dialog = new Controls.FolderDialog();
|
||||||
if (dialog.ShowDialog() == true) {
|
if (dialog.ShowDialog() == true) {
|
||||||
var full = Path.Combine(dialog.SelectedPath, Path.GetFileName(node.Path));
|
var full = Path.Combine(dialog.SelectedPath, Path.GetFileName(node.Path));
|
||||||
new Commands.SaveRevisionFile(repo, node.Path, sha, full).Exec();
|
new Commands.SaveRevisionFile(repo, node.Path, sha, full).Exec();
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
using Ookii.Dialogs.Wpf;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
@ -48,7 +47,7 @@ namespace SourceGit.Views.Widgets {
|
||||||
|
|
||||||
#region FUNC_EVENTS
|
#region FUNC_EVENTS
|
||||||
private void OnOpenClicked(object sender, RoutedEventArgs e) {
|
private void OnOpenClicked(object sender, RoutedEventArgs e) {
|
||||||
var dialog = new VistaFolderBrowserDialog();
|
var dialog = new Controls.FolderDialog();
|
||||||
if (dialog.ShowDialog() == true) CheckAndOpen(dialog.SelectedPath);
|
if (dialog.ShowDialog() == true) CheckAndOpen(dialog.SelectedPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue