timelapsenow/TimelapseApi/TimelapseSettings.cs

264 lines
9.3 KiB
C#

namespace TimelapseApi;
using System.Diagnostics;
using Eto.Forms;
internal class FrameHandlerSettingsForm : Dialog
{
internal class FrameHandlerSettingsCollection
{
public FrameHandlerSettingsCollection(List<FrameHandlerSettings> img)
{
Items=img;
}
public CheckBox? OverlayEnabled {get;set;}
public CheckBox? BlockEnabled {get;set;}
public List<FrameHandlerSettings> Items {get;set;}
}
internal class FrameHandlerSettings
{
public Guid Guid;
public FrameHandlerSettings(TimelapseExtension ext,string handlerName,bool overlay,bool block)
{
ExtensionName=ext.Name;
Guid=ext.Id;
HandlerName = handlerName;
OverlayChecked=overlay;
BlockChecked=block;
}
public string HandlerName {get;set;}
public string ExtensionName {get;set;}
public bool OverlayChecked {get;set;}
public bool BlockChecked {get;set;}
}
public FrameHandlerSettingsForm(FrameHandlerSettingsCollection col)
{
if(col.OverlayEnabled == null || col.BlockEnabled == null) return;
Width = 640;
Height=240;
Resizable=true;
Title="Frame Handler Settings";
Button okBtn = new Button{Text="OK"};
okBtn.Click +=(sender,e)=>{
this.Close();
};
DynamicLayout lyt=new DynamicLayout();
GridView<FrameHandlerSettings> itemsList=new GridView<FrameHandlerSettings>();
itemsList.Columns.Add(new GridColumn{
HeaderText="HandlerName",
DataCell=new TextBoxCell("HandlerName"),
Editable=false
});
itemsList.Columns.Add(new GridColumn{
HeaderText="Extension Name",
DataCell=new TextBoxCell("ExtensionName"),
Editable=false
});
itemsList.Columns.Add(new GridColumn{
HeaderText="Allow Overlay",
DataCell=new CheckBoxCell("OverlayChecked"),
Editable=true
});
itemsList.Columns.Add(new GridColumn{
HeaderText="Allow Block from Recording frame",
DataCell=new CheckBoxCell("BlockChecked"),
Editable=true
});
itemsList.DataStore=col.Items;
col.OverlayEnabled.Text="Allow Overlay";
col.BlockEnabled.Text="Allow Block from Recording frame";
lyt.BeginVertical();
lyt.BeginHorizontal();
lyt.Add(col.OverlayEnabled,true);
lyt.EndBeginHorizontal();
lyt.Add(col.BlockEnabled,true);
lyt.EndBeginHorizontal();
lyt.Add(itemsList,true,true);
lyt.EndBeginHorizontal();
lyt.Add(okBtn,true);
lyt.EndHorizontal();
lyt.EndVertical();
Content=lyt;
}
}
internal class TimelapseSettings : Dialog
{
public TimelapseSettings(Api api)
{
bool overLayBoxState=api.Model.canOverlayVideo;
bool blockBoxState=api.Model.canBlockFrames;
List<FrameHandlerSettingsForm.FrameHandlerSettings> imgs=new List<FrameHandlerSettingsForm.FrameHandlerSettings>();
List<TimelapseExtension> ext=new List<TimelapseExtension>();
var coll=new FrameHandlerSettingsForm.FrameHandlerSettingsCollection(imgs);
foreach(var item in api._frameHandlers)
{
if(!ext.Contains(item.Extension))
{
imgs.Add(new FrameHandlerSettingsForm.FrameHandlerSettings(item.Extension,item.HandlerName,!api.Model.deniedOverlayExtensions.Contains(item.Extension.Id),!api.Model.deniedBlockExtensions.Contains(item.Extension.Id)));
ext.Add(item.Extension);
}
}
ext.Clear();
Width = 320;
Height=240;
Title="Settings";
Button ExtensionsFrameHandler=new Button{
Text="Frame Handler Settings"
};
Button configFolder = new Button{
Text="Configuration folder"
};
Button installExtension = new Button{
Text="Install Extension"
};
CheckBox enableExt=new CheckBox{Text="Add extensions on install"};
enableExt.Checked = api.Model.addExtensionOnInstall;
CheckBox useCustomFilePickerForNativeFS = new CheckBox{Text="Use Custom File Picker For Native FileSystem"};
useCustomFilePickerForNativeFS.Checked=api.Model.useCustomFilePickerForNativeFS;
installExtension.Click += async(sender,e)=>{
using(var ofd=new OpenFileDialog())
{
ofd.MultiSelect=true;
ofd.Filters.Add(new FileFilter("Timelapse Extension",".tle",".zip"));
if(ofd.ShowDialog(this)==DialogResult.Ok)
{
foreach(var ext in ofd.Filenames)
{
await ExtensionLoader.InstallExtension(ext,enableExt.Checked.GetValueOrDefault());
}
}
}
};
CheckBox enableServer = new CheckBox();
enableServer.Text="Enable webserver";
enableServer.Checked=api.Model.enableWebServer;
configFolder.Click +=(sender,e)=>{
using(Process p=new Process()){
p.StartInfo = new ProcessStartInfo(Api.GetInternalFile());
p.StartInfo.UseShellExecute=true;
p.Start();
}
};
ExtensionsFrameHandler.Click +=(sender,e)=>{
coll.OverlayEnabled=new CheckBox();
coll.BlockEnabled=new CheckBox();
coll.OverlayEnabled.Checked=overLayBoxState;
coll.BlockEnabled.Checked=blockBoxState;
using(var img=new FrameHandlerSettingsForm(coll))
img.ShowModal(this);
overLayBoxState = coll.OverlayEnabled.Checked.GetValueOrDefault();
blockBoxState = coll.BlockEnabled.Checked.GetValueOrDefault();
/* Console.WriteLine($"Global overlay state: {overLayBoxState}");
Console.WriteLine($"Global block state: {blockBoxState}");
foreach(var item in coll.Items)
{
Console.WriteLine();
Console.WriteLine($"Extension name: {item.ExtensionName}");
Console.WriteLine($"Handler name: {item.HandlerName}");
Console.WriteLine($"Overlay state: {item.OverlayChecked}");
Console.WriteLine($"Block state: {item.BlockChecked}");
}*/
};
DynamicLayout lyt1=new DynamicLayout();
Scrollable scrollable=new Scrollable();
GroupBox szRow=new GroupBox {Text="Blank camera size"};
NumericStepper blankWidth=new NumericStepper{Value=api.Model.blankCameraWidth,MinValue=120,MaxValue=65535};
NumericStepper blankHeight =new NumericStepper{Value=api.Model.blankCameraHeight,MinValue=90,MaxValue=65535};
DynamicLayout lyt3=new DynamicLayout();
lyt3.BeginVertical();
lyt3.BeginHorizontal();
lyt3.Add(blankWidth,true);
lyt3.Add(blankHeight,true);
lyt3.EndHorizontal();
lyt3.EndVertical();
szRow.Content=lyt3;
DynamicLayout lyt2=new DynamicLayout();
scrollable.Content=lyt2;
lyt2.BeginVertical();
lyt2.AddRow(ExtensionsFrameHandler);
lyt2.AddRow(configFolder);
StackLayout lyt=new StackLayout();
lyt.Orientation= Orientation.Horizontal;
lyt.Items.Add(enableServer);
NumericStepper stepper=new NumericStepper();
stepper.MinValue=0;
stepper.MaxValue=65535;
stepper.Value = api.Model.timelapsePort;
lyt.Items.Add(stepper);
lyt2.AddRow(lyt);
lyt2.AddRow(installExtension);
lyt2.AddRow(enableExt);
lyt2.AddRow(useCustomFilePickerForNativeFS);
lyt2.AddRow(szRow);
lyt2.AddRow(null);
lyt2.EndVertical();
lyt1.BeginVertical();
lyt1.BeginHorizontal();
lyt1.Add(scrollable,true,true);
Button saveBtn = new Button {Text="Save"};
saveBtn.Click += (sender,e)=>{
api.Model.canBlockFrames=blockBoxState;
api.Model.canOverlayVideo=overLayBoxState;
api.Model.blankCameraWidth=(int)blankWidth.Value;
api.Model.blankCameraHeight=(int)blankHeight.Value;
api.Model.deniedBlockExtensions.Clear();
api.Model.deniedOverlayExtensions.Clear();
api.Model.enableWebServer=enableServer.Checked.GetValueOrDefault();
api.Model.timelapsePort=(ushort)stepper.Value;
api.Model.addExtensionOnInstall = enableExt.Checked.GetValueOrDefault();
api.Model.useCustomFilePickerForNativeFS = useCustomFilePickerForNativeFS.Checked.GetValueOrDefault();
foreach(var item in coll.Items)
{
if(!item.OverlayChecked)
{
api.Model.deniedOverlayExtensions.Add(item.Guid);
}
if(!item.BlockChecked)
{
api.Model.deniedBlockExtensions.Add(item.Guid);
}
}
api.SaveModel();
this.Close();
};
lyt1.EndBeginHorizontal();
lyt1.Add(saveBtn,true);
lyt1.EndHorizontal();
lyt1.EndVertical();
this.Content=lyt1;
}
}