-
Notifications
You must be signed in to change notification settings - Fork 0
/
Main.cs
171 lines (157 loc) · 5.69 KB
/
Main.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
using Flow.Launcher.Plugin;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
namespace Flow.Launcher.Plugin.Godot
{
public class Godot : IPlugin, ISettingProvider, IContextMenu
{
private const string GodotIconPath = "Assets\\Godot.png";
private string ProjectsConfigPath => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Godot", "projects.cfg");
private PluginInitContext _context;
private List<GodotProject> projects;
private Settings _settings;
public Control CreateSettingPanel()
{
return new GodotLauncherSettings(_context, _settings);
}
public void Init(PluginInitContext context)
{
_context = context;
_settings = context.API.LoadSettingJsonStorage<Settings>();
}
private void GetProjects()
{
projects = new List<GodotProject>();
string currentSection = null;
using StreamReader reader = new StreamReader(ProjectsConfigPath);
string line;
while ((line = reader.ReadLine()) != null)
{
line = line.Trim();
if (line.StartsWith("["))
{
currentSection = line.Substring(1, line.Length - 2);
}
else if (!string.IsNullOrEmpty(currentSection) && line.Contains("="))
{
string[] parts = line.Split('=');
string key = parts[0].Trim();
string value = parts[1].Trim();
projects.Add(new GodotProject
{
ProjectPath = currentSection,
Name = Path.GetFileName(currentSection),
Favorite = bool.Parse(value)
});
}
}
}
public List<Result> LoadContextMenus(Result selectedResult)
{
List<Result> contextResults = new List<Result>
{
new ()
{
Title = "Open containing folder",
IcoPath = GodotIconPath,
Action = x =>
{
Process explorerProc = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = selectedResult.SubTitle,
Verb = "open",
CreateNoWindow = true,
UseShellExecute = true
}
};
explorerProc.Start();
return true;
},
},
new ()
{
Title = "Copy Path",
IcoPath = GodotIconPath,
Action = x =>
{
Clipboard.SetText(selectedResult.SubTitle);
return true;
},
},
new ()
{
Title = "Open with shell",
IcoPath = GodotIconPath,
Action = x =>
{
Process shellProc = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "CMD.exe",
WorkingDirectory = selectedResult.SubTitle,
CreateNoWindow = false,
UseShellExecute = true
}
};
shellProc.Start();
return true;
},
},
};
return contextResults;
}
public List<Result> Query(Query query)
{
GetProjects();
List<Result> results = new List<Result>();
try
{
foreach (var project in projects)
{
var result = new Result();
result.Title = project.Favorite ? $"{project.Name} \u2665" : project.Name;
result.SubTitle = project.ProjectPath;
result.IcoPath = GodotIconPath;
result.Action = x =>
{
Process godotProc = new Process()
{
StartInfo = new ProcessStartInfo
{
FileName = _settings.GodotExecutablePath,
Arguments = Path.Combine(Path.GetFullPath(project.ProjectPath), "project.godot"),
UseShellExecute = true,
CreateNoWindow = true
}
};
godotProc.Start();
return true;
};
results.Add(result);
}
}
catch (Exception ex)
{
_context.API.ShowMsgError("Error reading config file: " + ex.Message);
throw;
}
return results;
}
}
}
public class GodotProject
{
public string Name { get; set; }
public string ProjectPath { get; set; }
public bool Favorite { get; set; }
}