Added a page to configure the database.

This commit is contained in:
feyris-tan 2026-02-01 20:10:36 +01:00
parent 20ee473fda
commit eed28664a6
9 changed files with 849 additions and 701 deletions

1
.gitignore vendored
View File

@ -38,3 +38,4 @@
/Voile.Storage.SqlServer/bin/Debug/net8.0 /Voile.Storage.SqlServer/bin/Debug/net8.0
/Voile.Storage.Sqlite/obj /Voile.Storage.Sqlite/obj
/Voile.Storage.Sqlite/bin/Debug/net8.0 /Voile.Storage.Sqlite/bin/Debug/net8.0
/.vs/Voile/CopilotIndices/17.14.1577.30250

View File

@ -8,6 +8,6 @@ namespace Voile.Patchouli.Data
{ {
public interface IVoileDataStorage public interface IVoileDataStorage
{ {
bool Ping(); Exception Ping();
} }
} }

View File

@ -8,5 +8,6 @@ namespace Voile.Patchouli.Data
{ {
public interface IVoileObjectStorage public interface IVoileObjectStorage
{ {
Exception Ping();
} }
} }

View File

@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Voile.Patchouli.Reflection
{
[System.AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public sealed class VoilePluginCanSaveFileAttribute : Attribute
{
public VoilePluginCanSaveFileAttribute(bool enable, string filter, CanSaveFileMode mode = CanSaveFileMode.SaveFile, bool fileMustExist = false)
{
Enable = enable;
Filter = filter;
Mode = mode;
FileMustExist = fileMustExist;
}
public bool Enable { get; }
public string Filter { get; }
public CanSaveFileMode Mode { get; }
public bool FileMustExist { get; }
}
public enum CanSaveFileMode
{
OpenFile = 0,
SaveFile = 1,
Directory = 2
}
}

View File

@ -131,5 +131,26 @@ namespace Voile.Patchouli.Reflection
return Description; return Description;
} }
} }
private VoilePluginCanSaveFileAttribute _canSaveFile;
public VoilePluginCanSaveFileAttribute CanSaveFile
{
get
{
if (_canSaveFile == null)
{
VoilePluginCanSaveFileAttribute child = Type.GetCustomAttribute<VoilePluginCanSaveFileAttribute>();
if (child != null)
{
_canSaveFile = child;
}
else
{
_canSaveFile = new VoilePluginCanSaveFileAttribute(false, null);
}
}
return _canSaveFile;
}
}
} }
} }

View File

@ -14,6 +14,7 @@ namespace Voile.Storage.Sqlite
[VoilePlugin] [VoilePlugin]
[VoilePluginId(3)] [VoilePluginId(3)]
[Voile.Patchouli.Reflection.DisplayName("SQLite")] [Voile.Patchouli.Reflection.DisplayName("SQLite")]
[VoilePluginCanSaveFile(true,"SQLite3 Database (*.db)|*.db",CanSaveFileMode.SaveFile,false)]
public class SqliteDataStorageFactory : IVoileDataStorageFactory public class SqliteDataStorageFactory : IVoileDataStorageFactory
{ {
public IVoileDataStorage CreateDataStorage() public IVoileDataStorage CreateDataStorage()

View File

@ -57,6 +57,7 @@
buttonNext = new Button(); buttonNext = new Button();
buttonBack = new Button(); buttonBack = new Button();
openFileDialogCertificate = new OpenFileDialog(); openFileDialogCertificate = new OpenFileDialog();
loadFileButton = new Button();
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit(); ((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
tabControl1.SuspendLayout(); tabControl1.SuspendLayout();
tabPageWelcome.SuspendLayout(); tabPageWelcome.SuspendLayout();
@ -108,7 +109,7 @@
label2.AutoSize = true; label2.AutoSize = true;
label2.Location = new Point(6, 3); label2.Location = new Point(6, 3);
label2.Name = "label2"; label2.Name = "label2";
label2.Size = new Size(329, 240); label2.Size = new Size(328, 240);
label2.TabIndex = 3; label2.TabIndex = 3;
label2.Text = resources.GetString("label2.Text"); label2.Text = resources.GetString("label2.Text");
// //
@ -126,7 +127,7 @@
radioButtonAmExpert.AutoSize = true; radioButtonAmExpert.AutoSize = true;
radioButtonAmExpert.Location = new Point(6, 271); radioButtonAmExpert.Location = new Point(6, 271);
radioButtonAmExpert.Name = "radioButtonAmExpert"; radioButtonAmExpert.Name = "radioButtonAmExpert";
radioButtonAmExpert.Size = new Size(298, 34); radioButtonAmExpert.Size = new Size(299, 34);
radioButtonAmExpert.TabIndex = 1; radioButtonAmExpert.TabIndex = 1;
radioButtonAmExpert.Text = "Im an expert. Let me choose my own database and \r\nstorage options."; radioButtonAmExpert.Text = "Im an expert. Let me choose my own database and \r\nstorage options.";
radioButtonAmExpert.UseVisualStyleBackColor = true; radioButtonAmExpert.UseVisualStyleBackColor = true;
@ -257,7 +258,7 @@
labelDataStorageHint.AutoSize = true; labelDataStorageHint.AutoSize = true;
labelDataStorageHint.Location = new Point(3, 165); labelDataStorageHint.Location = new Point(3, 165);
labelDataStorageHint.Name = "labelDataStorageHint"; labelDataStorageHint.Name = "labelDataStorageHint";
labelDataStorageHint.Size = new Size(124, 15); labelDataStorageHint.Size = new Size(121, 15);
labelDataStorageHint.TabIndex = 1; labelDataStorageHint.TabIndex = 1;
labelDataStorageHint.Text = "DATA_STORAGE_HINT"; labelDataStorageHint.Text = "DATA_STORAGE_HINT";
// //
@ -287,20 +288,21 @@
// dbSettingsErrorLabel // dbSettingsErrorLabel
// //
dbSettingsErrorLabel.AutoSize = true; dbSettingsErrorLabel.AutoSize = true;
dbSettingsErrorLabel.Location = new Point(3, 70); dbSettingsErrorLabel.Location = new Point(3, 87);
dbSettingsErrorLabel.Name = "dbSettingsErrorLabel"; dbSettingsErrorLabel.Name = "dbSettingsErrorLabel";
dbSettingsErrorLabel.Size = new Size(77, 15); dbSettingsErrorLabel.Size = new Size(74, 15);
dbSettingsErrorLabel.TabIndex = 9; dbSettingsErrorLabel.TabIndex = 9;
dbSettingsErrorLabel.Text = "TEST_RESULT"; dbSettingsErrorLabel.Text = "TEST_RESULT";
// //
// dbTestTrafficLight // dbTestTrafficLight
// //
dbTestTrafficLight.Image = Properties.Resources.SETUPAPI_18_1_32x32x4; dbTestTrafficLight.Image = Properties.Resources.SETUPAPI_18_1_32x32x4;
dbTestTrafficLight.Location = new Point(214, 70); dbTestTrafficLight.Location = new Point(313, 34);
dbTestTrafficLight.Name = "dbTestTrafficLight"; dbTestTrafficLight.Name = "dbTestTrafficLight";
dbTestTrafficLight.Size = new Size(32, 32); dbTestTrafficLight.Size = new Size(32, 32);
dbTestTrafficLight.TabIndex = 8; dbTestTrafficLight.TabIndex = 8;
dbTestTrafficLight.TabStop = false; dbTestTrafficLight.TabStop = false;
dbTestTrafficLight.Click += dbTestTrafficLight_Click;
// //
// dbTestButton // dbTestButton
// //
@ -324,9 +326,9 @@
label6.AutoSize = true; label6.AutoSize = true;
label6.Location = new Point(3, 0); label6.Location = new Point(3, 0);
label6.Name = "label6"; label6.Name = "label6";
label6.Size = new Size(38, 15); label6.Size = new Size(394, 75);
label6.TabIndex = 0; label6.TabIndex = 0;
label6.Text = "label6"; label6.Text = "Here are the configuration options for the database engine you selected. \r\n\r\nAdjust the settings as needed, and when you're ready, \r\nclick \"Test Settings\" to verify the connection before \r\nmoving on.";
// //
// buttonNext // buttonNext
// //
@ -348,6 +350,7 @@
buttonBack.TabIndex = 3; buttonBack.TabIndex = 3;
buttonBack.Text = "< Back"; buttonBack.Text = "< Back";
buttonBack.UseVisualStyleBackColor = true; buttonBack.UseVisualStyleBackColor = true;
buttonBack.Click += buttonBack_Click;
// //
// openFileDialogCertificate // openFileDialogCertificate
// //
@ -356,11 +359,22 @@
openFileDialogCertificate.Filter = "X.509 Certificate (*.cer)|*.cer"; openFileDialogCertificate.Filter = "X.509 Certificate (*.cer)|*.cer";
openFileDialogCertificate.Title = "Open Voile License File"; openFileDialogCertificate.Title = "Open Voile License File";
// //
// loadFileButton
//
loadFileButton.Location = new Point(257, 430);
loadFileButton.Name = "loadFileButton";
loadFileButton.Size = new Size(75, 23);
loadFileButton.TabIndex = 4;
loadFileButton.Text = "Load File";
loadFileButton.UseVisualStyleBackColor = true;
loadFileButton.Click += loadFileButton_Click;
//
// FirstRunWizard // FirstRunWizard
// //
AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(502, 465); ClientSize = new Size(502, 465);
Controls.Add(loadFileButton);
Controls.Add(buttonBack); Controls.Add(buttonBack);
Controls.Add(buttonNext); Controls.Add(buttonNext);
Controls.Add(tabControl1); Controls.Add(tabControl1);
@ -416,5 +430,6 @@
private Button dbTestButton; private Button dbTestButton;
private PictureBox dbTestTrafficLight; private PictureBox dbTestTrafficLight;
private Label dbSettingsErrorLabel; private Label dbSettingsErrorLabel;
private Button loadFileButton;
} }
} }

View File

@ -41,12 +41,12 @@ namespace Voile
public void DisplayTabPage(int target, bool isGoingBack = false) public void DisplayTabPage(int target)
{ {
if (pastPages == null) if (pastPages == null)
pastPages = new Stack<int>(); pastPages = new Stack<int>();
else else
pastPages.Push(target); pastPages.Push(currentTabPage);
if (allPages == null) if (allPages == null)
{ {
@ -65,6 +65,7 @@ namespace Voile
void RefreshView() void RefreshView()
{ {
loadFileButton.Visible = false;
buttonBack.Enabled = false; buttonBack.Enabled = false;
buttonNext.Enabled = false; buttonNext.Enabled = false;
@ -126,6 +127,7 @@ namespace Voile
buttonNext.Enabled = selectedDataStorage != null; buttonNext.Enabled = selectedDataStorage != null;
break; break;
case 3: case 3:
loadFileButton.Visible = selectedDataStorage.CanSaveFile.Enable;
dbSettingsErrorLabel.Text = ""; dbSettingsErrorLabel.Text = "";
if (voileDataStorageFactory == null) if (voileDataStorageFactory == null)
{ {
@ -377,5 +379,74 @@ namespace Voile
pictureBox2.Image = Resources.TRFFC10A_1_32x32x4; //grüne Ampel pictureBox2.Image = Resources.TRFFC10A_1_32x32x4; //grüne Ampel
dataStorageConnectionSucessful = true; dataStorageConnectionSucessful = true;
} }
private void buttonBack_Click(object sender, EventArgs e)
{
int previousTabPageId = pastPages.Pop();
tabControl1.TabPages.Clear();
tabControl1.TabPages.Add(allPages[previousTabPageId]);
currentTabPage = previousTabPageId;
RefreshView();
}
private void loadFileButton_Click(object sender, EventArgs e)
{
switch (currentTabPage)
{
case 3:
VoilePluginCanSaveFileAttribute canSaveFile = selectedDataStorage.CanSaveFile;
switch (canSaveFile.Mode)
{
case CanSaveFileMode.SaveFile:
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = canSaveFile.Filter;
sfd.OverwritePrompt = canSaveFile.FileMustExist;
DialogResult dialogResult = sfd.ShowDialog(this);
if (dialogResult == DialogResult.OK)
{
if (voileDataStorageFactory == null)
{
voileDataStorageFactory = selectedDataStorage.GetPluginInstance() as IVoileDataStorageFactory;
}
SetFileNameProperty(voileDataStorageFactory, sfd.FileName);
dbSettingsPropertyGrid.Refresh();
}
break;
default:
MessageBox.Show(this, String.Format("Don't know what to do with a {1} dialog on page {0}.", currentTabPage, canSaveFile.Mode), allPages[currentTabPage].Text, MessageBoxButtons.OK, MessageBoxIcon.Hand);
break;
}
break;
default:
MessageBox.Show(this, String.Format("Don't know what to do on page {0}", currentTabPage), allPages[currentTabPage].Text, MessageBoxButtons.OK, MessageBoxIcon.Hand);
return;
}
}
private void SetFileNameProperty(object voilePlugin, string targetFileName)
{
Type type = voilePlugin.GetType();
System.Reflection.PropertyInfo[] propertyInfos = type.GetProperties();
foreach (System.Reflection.PropertyInfo propertyInfo in propertyInfos)
{
if (!propertyInfo.CanWrite)
continue;
string name = propertyInfo.Name.ToLower();
switch (name)
{
case "filepath":
propertyInfo.SetValue(voilePlugin, targetFileName, null);
return;
}
}
}
private void dbTestTrafficLight_Click(object sender, EventArgs e)
{
MessageBox.Show("Adjust the settings as needed, and when you're ready, click \"Test Settings\" to verify the connection before moving on.", string.Format("Configuring {0}", selectedDataStorage.DisplayName),MessageBoxButtons.OK,MessageBoxIcon.Information);
}
} }
} }

View File

@ -15,5 +15,10 @@ namespace Voile.Persistence
} }
public DirectoryInfo Directory { get; } public DirectoryInfo Directory { get; }
public Exception Ping()
{
throw new NotImplementedException();
}
} }
} }