di7(c&C5YW8_t?tIU
z>Ny7&^Pebhjth`srpO|asbD=?gpU+WKXx%hg}DA%|J1=w1E3bQW2brAk)glQS%iL-
z`SP4IjX^57**EKJK0N;yU_Z*GguxzUVD)Dq(FOHK%^eAtSc;pSVFoq==$r8wjtx+n
z;uq8_iQsA|i!@V3bf!VptWTH>59QQ$XGs&d#Zun48g&^nWN
z^4`U@k2?PS6UX#XYTlj3cBYJ6iA9-|t1JhG+#TUO+}j1X$SI>}h@{JnYgEm?zEEzKo)jY&y1zSlD`B1nde
zmwy#mhVwyd0QaI
z|0IfHZz3l>9_idFYXd<4)DCI{(lIq=m)5YN(P4E>hdI?c`X*M;CSS(ztQxWzHOkv(
zkX|_~*eDwS`Uv}%ONIR^-3VD$u4*wczlMRyRSc1$`0FAvg`>Jx6~iT)%Ub~Y@H!Uk
z%R1&|pJhuJ{h^`Dm7R0Q5XuMBDu(R;EN=sBq_9cR&@NY^ZFmVxfn21Y`E$;x?z8OR
znP+4AUqErww4`%P2`K@jl@B%OXWlG3RW$!LT(geDg?ZTYuYf}Fv;(hIA@3etLLk=>
z0dLO3k9`JSdA5isy@hwJsR(}Wf-5Npw2n!8&9(qI4O6@i&C|Le#R~ls4Ycx>BnbTR
ztkMTjd@saQ_##Ub3%7!cuzEtRQ$;mB*4%~()b;;_VsVWwYjwb#+!J`)!T`7VCD=`g
z$QQ>G$U|g`V&KEQ3d=}JaWIs!rCsP1W}#6chUCjE#%7kWpwi$*<`G;=Jp`we{kV{{
z2Oca3WYkCD9>*ES!i?1Bp_KJDnf~R1-P4`$WIN$hxG_RJc1bteXwaD`EF%gle=AJ8
sKor&zg_Twjl+Gf22ZHXJMsL>n7d!LPMJ&Eto&W#<07*qoM6N<$g0UNkpa1{>
literal 0
HcmV?d00001
diff --git a/Voile/Resources/hourglass_link.png b/Voile/Resources/hourglass_link.png
new file mode 100644
index 0000000000000000000000000000000000000000..ecc59b0abe2c63a263c3c1ff9cf35a88575c129a
GIT binary patch
literal 871
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
SlzqVpGb_`}cP;_maPV){8deDa
literal 0
HcmV?d00001
diff --git a/Voile/Tasks/StartupInitializeDatabase.cs b/Voile/Tasks/StartupInitializeDatabase.cs
new file mode 100644
index 0000000..5fc1eed
--- /dev/null
+++ b/Voile/Tasks/StartupInitializeDatabase.cs
@@ -0,0 +1,43 @@
+using skyscraper5.Skyscraper;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Voile.Tasks
+{
+ internal class StartupInitializeDatabase : VoileRunnable
+ {
+ public Form1 Form1 { get; internal set; }
+ private Ini ini;
+ public void Run()
+ {
+ if (IsFirstRun())
+ {
+ FirstRunWizard frw = new FirstRunWizard();
+ DialogResult dr = frw.ShowDialog(Form1);
+ }
+ }
+
+ private bool IsFirstRun()
+ {
+ VoileContext voileContext = VoileContext.GetContext();
+ FileInfo fileInfo = voileContext.GetVoileIniFile();
+ if (!fileInfo.Exists)
+ {
+ voileContext.Ini = new Ini();
+ ini = voileContext.Ini;
+ return true;
+ }
+
+ voileContext.Ini = new Ini(fileInfo.FullName);
+
+ bool firstRunComplete = ini.ReadValue("voile", "firstRunComplete", false);
+ if (!firstRunComplete)
+ return true;
+
+ return false;
+ }
+ }
+}
diff --git a/Voile/Voile.csproj b/Voile/Voile.csproj
index 34b8f0e..8848544 100644
--- a/Voile/Voile.csproj
+++ b/Voile/Voile.csproj
@@ -19,6 +19,11 @@
+
+
+
+
+
True
diff --git a/Voile/Voile.csproj.user b/Voile/Voile.csproj.user
index e0f7126..fedff3d 100644
--- a/Voile/Voile.csproj.user
+++ b/Voile/Voile.csproj.user
@@ -13,6 +13,9 @@
Form
+
+ Form
+
Form
diff --git a/Voile/VoileContext.cs b/Voile/VoileContext.cs
new file mode 100644
index 0000000..95a3953
--- /dev/null
+++ b/Voile/VoileContext.cs
@@ -0,0 +1,51 @@
+using skyscraper5.Skyscraper;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Voile
+{
+ internal class VoileContext
+ {
+ private static VoileContext _instance;
+
+ public static VoileContext GetContext()
+ {
+ if (_instance == null)
+ {
+ _instance = new VoileContext();
+ }
+ return _instance;
+ }
+
+ private DirectoryInfo voileDirectory;
+ public DirectoryInfo GetVoileDirectory()
+ {
+ if (voileDirectory == null)
+ {
+ Type type = typeof(VoileContext);
+ Assembly assembly = type.Assembly;
+ FileInfo fi = new FileInfo(assembly.Location);
+ voileDirectory = fi.Directory;
+ }
+ return voileDirectory;
+ }
+
+ private FileInfo voileIniFile;
+ public FileInfo GetVoileIniFile()
+ {
+ if (voileIniFile == null)
+ {
+ DirectoryInfo directoryInfo = GetVoileDirectory();
+ string path = Path.Combine(directoryInfo.FullName, "voile.ini");
+ voileIniFile = new FileInfo(path);
+ }
+ return voileIniFile;
+ }
+
+ public Ini Ini { get; set; }
+ }
+}
diff --git a/Voile/VoileRunnable.cs b/Voile/VoileRunnable.cs
new file mode 100644
index 0000000..c5c8109
--- /dev/null
+++ b/Voile/VoileRunnable.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Voile
+{
+ internal interface VoileRunnable
+ {
+ void Run();
+ }
+}
diff --git a/Voile/VoileTask.cs b/Voile/VoileTask.cs
new file mode 100644
index 0000000..bb81114
--- /dev/null
+++ b/Voile/VoileTask.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Voile
+{
+ internal class VoileTask : ListViewItem
+ {
+ public VoileTask(string name, VoileRunnable runnable = null)
+ {
+ this.Name = name;
+ this.Text = name;
+ this.Guid = Guid.NewGuid();
+ this.ImageIndex = 0;
+ this.Runnable = runnable;
+ }
+
+ public string Name { get; private set; }
+
+ public Guid Guid { get; private set; }
+
+
+ public VoileRunnable Runnable { get; private set; }
+ }
+}