wip
This commit is contained in:
parent
c3b3d3e673
commit
e0ebb25f17
@ -4,6 +4,7 @@ using System.Data;
|
|||||||
using System.Windows;
|
using System.Windows;
|
||||||
|
|
||||||
using CamBooth.App.Core.AppSettings;
|
using CamBooth.App.Core.AppSettings;
|
||||||
|
using CamBooth.App.Core.Camera;
|
||||||
using CamBooth.App.Core.Logging;
|
using CamBooth.App.Core.Logging;
|
||||||
using CamBooth.App.DebugConsole;
|
using CamBooth.App.DebugConsole;
|
||||||
using CamBooth.App.LiveView;
|
using CamBooth.App.LiveView;
|
||||||
@ -41,5 +42,6 @@ public partial class App : Application
|
|||||||
services.AddSingleton<Logger>();
|
services.AddSingleton<Logger>();
|
||||||
services.AddSingleton<AppSettingsService>();
|
services.AddSingleton<AppSettingsService>();
|
||||||
services.AddSingleton<PictureGalleryService>();
|
services.AddSingleton<PictureGalleryService>();
|
||||||
|
services.AddSingleton<CameraService>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
316
src/CamBooth/CamBooth.App/Core/Camera/CameraService.cs
Normal file
316
src/CamBooth/CamBooth.App/Core/Camera/CameraService.cs
Normal file
@ -0,0 +1,316 @@
|
|||||||
|
using System.IO;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using System.Windows.Threading;
|
||||||
|
|
||||||
|
using CamBooth.App.Core.AppSettings;
|
||||||
|
using CamBooth.App.Core.Logging;
|
||||||
|
using CamBooth.App.LiveView;
|
||||||
|
using CamBooth.App.PictureGallery;
|
||||||
|
|
||||||
|
using EOSDigital.API;
|
||||||
|
using EOSDigital.SDK;
|
||||||
|
|
||||||
|
namespace CamBooth.App.Core.Camera;
|
||||||
|
|
||||||
|
public class CameraService : IDisposable
|
||||||
|
{
|
||||||
|
private readonly Logger _logger;
|
||||||
|
|
||||||
|
private readonly AppSettingsService _appSettings;
|
||||||
|
|
||||||
|
private readonly PictureGalleryService _pictureGalleryService;
|
||||||
|
|
||||||
|
CanonAPI APIHandler;
|
||||||
|
|
||||||
|
public EOSDigital.API.Camera MainCamera;
|
||||||
|
|
||||||
|
bool IsInit = false;
|
||||||
|
|
||||||
|
List<EOSDigital.API.Camera> CamList;
|
||||||
|
|
||||||
|
CameraValue[] AvList;
|
||||||
|
|
||||||
|
CameraValue[] TvList;
|
||||||
|
|
||||||
|
CameraValue[] ISOList;
|
||||||
|
|
||||||
|
int BulbTime = 30;
|
||||||
|
|
||||||
|
int ErrCount;
|
||||||
|
|
||||||
|
object ErrLock = new object();
|
||||||
|
|
||||||
|
|
||||||
|
public CameraService(Logger logger, AppSettingsService appSettings, PictureGalleryService pictureGalleryService)
|
||||||
|
{
|
||||||
|
this._logger = logger;
|
||||||
|
this._appSettings = appSettings;
|
||||||
|
this._pictureGalleryService = pictureGalleryService;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
APIHandler = new CanonAPI();
|
||||||
|
IsInit = true;
|
||||||
|
}
|
||||||
|
catch (DllNotFoundException)
|
||||||
|
{
|
||||||
|
ReportError("Canon DLLs not found!", true);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ReportError(ex.Message, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void ConnectCamera()
|
||||||
|
{
|
||||||
|
ErrorHandler.SevereErrorHappened += ErrorHandler_SevereErrorHappened;
|
||||||
|
ErrorHandler.NonSevereErrorHappened += ErrorHandler_NonSevereErrorHappened;
|
||||||
|
|
||||||
|
RefreshCamera();
|
||||||
|
List<EOSDigital.API.Camera> cameraList = this.APIHandler.GetCameraList();
|
||||||
|
if (cameraList.Any())
|
||||||
|
{
|
||||||
|
this.OpenSession();
|
||||||
|
this.SetSettingSaveToComputer();
|
||||||
|
this.StarLiveView();
|
||||||
|
}
|
||||||
|
|
||||||
|
string cameraDeviceNames = string.Join(", ", cameraList.Select(cam => cam.DeviceName));
|
||||||
|
_logger.Info(cameraDeviceNames == string.Empty ? "No cameras / devices found" : cameraDeviceNames);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void SetSettingSaveToComputer()
|
||||||
|
{
|
||||||
|
MainCamera.SetSetting(PropertyID.SaveTo, (int)SaveTo.Host);
|
||||||
|
MainCamera.SetCapacity(4096, int.MaxValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void CloseSession()
|
||||||
|
{
|
||||||
|
MainCamera.CloseSession();
|
||||||
|
|
||||||
|
// AvCoBox.Items.Clear();
|
||||||
|
// TvCoBox.Items.Clear();
|
||||||
|
// ISOCoBox.Items.Clear();
|
||||||
|
// SettingsGroupBox.IsEnabled = false;
|
||||||
|
// LiveViewGroupBox.IsEnabled = false;
|
||||||
|
// SessionButton.Content = "Open Session";
|
||||||
|
// SessionLabel.Content = "No open session";
|
||||||
|
// StarLVButton.Content = "Start LV";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void RefreshCamera()
|
||||||
|
{
|
||||||
|
// CameraListBox.Items.Clear();
|
||||||
|
CamList = APIHandler.GetCameraList();
|
||||||
|
|
||||||
|
// foreach (Camera cam in CamList) CameraListBox.Items.Add(cam.DeviceName);
|
||||||
|
// if (MainCamera?.SessionOpen == true) CameraListBox.SelectedIndex = CamList.FindIndex(t => t.ID == MainCamera.ID);
|
||||||
|
// else if (CamList.Count > 0) CameraListBox.SelectedIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void OpenSession()
|
||||||
|
{
|
||||||
|
MainCamera = CamList[0];
|
||||||
|
MainCamera.OpenSession();
|
||||||
|
|
||||||
|
//MainCamera.ProgressChanged += MainCamera_ProgressChanged;
|
||||||
|
MainCamera.StateChanged += MainCamera_StateChanged;
|
||||||
|
MainCamera.DownloadReady += MainCamera_DownloadReady;
|
||||||
|
|
||||||
|
//SessionLabel.Content = MainCamera.DeviceName;
|
||||||
|
AvList = MainCamera.GetSettingsList(PropertyID.Av);
|
||||||
|
TvList = MainCamera.GetSettingsList(PropertyID.Tv);
|
||||||
|
ISOList = MainCamera.GetSettingsList(PropertyID.ISO);
|
||||||
|
|
||||||
|
// foreach (var Av in AvList) AvCoBox.Items.Add(Av.StringValue);
|
||||||
|
// foreach (var Tv in TvList) TvCoBox.Items.Add(Tv.StringValue);
|
||||||
|
// foreach (var ISO in ISOList) ISOCoBox.Items.Add(ISO.StringValue);
|
||||||
|
// AvCoBox.SelectedIndex = AvCoBox.Items.IndexOf(AvValues.GetValue(MainCamera.GetInt32Setting(PropertyID.Av)).StringValue);
|
||||||
|
// TvCoBox.SelectedIndex = TvCoBox.Items.IndexOf(TvValues.GetValue(MainCamera.GetInt32Setting(PropertyID.Tv)).StringValue);
|
||||||
|
// ISOCoBox.SelectedIndex = ISOCoBox.Items.IndexOf(ISOValues.GetValue(MainCamera.GetInt32Setting(PropertyID.ISO)).StringValue);
|
||||||
|
// SettingsGroupBox.IsEnabled = true;
|
||||||
|
// LiveViewGroupBox.IsEnabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void ReportError(string message, bool lockdown)
|
||||||
|
{
|
||||||
|
int errc;
|
||||||
|
lock (ErrLock)
|
||||||
|
{
|
||||||
|
errc = ++ErrCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lockdown)
|
||||||
|
{
|
||||||
|
//this.EnableUI(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (errc)
|
||||||
|
{
|
||||||
|
case < 4:
|
||||||
|
this._logger.Info(message);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
this._logger.Info("Many errors happened!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (ErrLock)
|
||||||
|
{
|
||||||
|
ErrCount--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void StarLiveView()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!MainCamera.IsLiveViewOn)
|
||||||
|
{
|
||||||
|
MainCamera.StartLiveView();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MainCamera.StopLiveView();
|
||||||
|
|
||||||
|
//LVCanvas.Background = Brushes.LightGray;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ReportError(ex.Message, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#region API Events
|
||||||
|
|
||||||
|
// private void APIHandler_CameraAdded(CanonAPI sender)
|
||||||
|
// {
|
||||||
|
// try
|
||||||
|
// {
|
||||||
|
// }
|
||||||
|
// catch (Exception ex)
|
||||||
|
// {
|
||||||
|
// ReportError(ex.Message, false);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
private void MainCamera_StateChanged(EOSDigital.API.Camera sender, StateEventID eventID, int parameter)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (eventID == StateEventID.Shutdown && IsInit)
|
||||||
|
{
|
||||||
|
Application.Current.Dispatcher.Invoke(() => this.CloseSession());
|
||||||
|
|
||||||
|
//Dispatcher.Invoke((Action)delegate { CloseSession(); });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ReportError(ex.Message, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// private void MainCamera_ProgressChanged(object sender, int progress)
|
||||||
|
// {
|
||||||
|
// try
|
||||||
|
// {
|
||||||
|
// //MainProgressBar.Dispatcher.Invoke((Action)delegate { MainProgressBar.Value = progress; });
|
||||||
|
// }
|
||||||
|
// catch (Exception ex)
|
||||||
|
// {
|
||||||
|
// ReportError(ex.Message, false);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// private void MainCamera_LiveViewUpdated(EOSDigital.API.Camera sender, Stream img)
|
||||||
|
// {
|
||||||
|
// try
|
||||||
|
// {
|
||||||
|
// using (WrapStream s = new WrapStream(img))
|
||||||
|
// {
|
||||||
|
// img.Position = 0;
|
||||||
|
// BitmapImage EvfImage = new BitmapImage();
|
||||||
|
// EvfImage.BeginInit();
|
||||||
|
// EvfImage.StreamSource = s;
|
||||||
|
// EvfImage.CacheOption = BitmapCacheOption.OnLoad;
|
||||||
|
// EvfImage.EndInit();
|
||||||
|
// EvfImage.Freeze();
|
||||||
|
// Application.Current.Dispatcher.BeginInvoke(SetImageAction, EvfImage);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// catch (Exception ex)
|
||||||
|
// {
|
||||||
|
// ReportError(ex.Message, false);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
private void MainCamera_DownloadReady(EOSDigital.API.Camera sender, DownloadInfo Info)
|
||||||
|
{
|
||||||
|
this._logger.Info("MainCamera_DownloadReady called");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string dir = this._appSettings.PictureLocation;
|
||||||
|
Info.FileName = $"img_{Guid.NewGuid().ToString()}.jpg";
|
||||||
|
sender.DownloadFile(Info, dir);
|
||||||
|
this._logger.Info("Download complete: " + Path.Combine(dir, Info.FileName));
|
||||||
|
Application.Current.Dispatcher.Invoke(() => { this._pictureGalleryService.LoadThumbnailsToCache(); });
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ReportError(ex.Message, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void ErrorHandler_NonSevereErrorHappened(object sender, ErrorCode ex)
|
||||||
|
{
|
||||||
|
ReportError($"SDK Error code: {ex} ({((int)ex).ToString("X")})", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void ErrorHandler_SevereErrorHappened(object sender, Exception ex)
|
||||||
|
{
|
||||||
|
ReportError(ex.Message, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
public void TakePhoto()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
MainCamera.TakePhotoAsync();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ReportError(ex.Message, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</summary>
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
this.CloseSession();
|
||||||
|
IsInit = false;
|
||||||
|
this.APIHandler.Dispose();
|
||||||
|
this.MainCamera.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -7,6 +7,7 @@ using System.Windows.Media;
|
|||||||
using System.Windows.Media.Imaging;
|
using System.Windows.Media.Imaging;
|
||||||
|
|
||||||
using CamBooth.App.Core.AppSettings;
|
using CamBooth.App.Core.AppSettings;
|
||||||
|
using CamBooth.App.Core.Camera;
|
||||||
using CamBooth.App.Core.Logging;
|
using CamBooth.App.Core.Logging;
|
||||||
|
|
||||||
using EOSDigital.API;
|
using EOSDigital.API;
|
||||||
@ -20,218 +21,26 @@ public partial class LiveViewPage : Page
|
|||||||
|
|
||||||
private readonly AppSettingsService _appSettings;
|
private readonly AppSettingsService _appSettings;
|
||||||
|
|
||||||
CanonAPI APIHandler;
|
private readonly CameraService _cameraService;
|
||||||
|
|
||||||
Camera MainCamera;
|
|
||||||
|
|
||||||
CameraValue[] AvList;
|
|
||||||
|
|
||||||
CameraValue[] TvList;
|
|
||||||
|
|
||||||
CameraValue[] ISOList;
|
|
||||||
|
|
||||||
List<Camera> CamList;
|
|
||||||
|
|
||||||
bool IsInit = false;
|
|
||||||
|
|
||||||
int BulbTime = 30;
|
|
||||||
|
|
||||||
ImageBrush bgbrush = new ImageBrush();
|
|
||||||
|
|
||||||
Action<BitmapImage> SetImageAction;
|
Action<BitmapImage> SetImageAction;
|
||||||
|
|
||||||
int ErrCount;
|
private ImageBrush bgbrush = new ImageBrush();
|
||||||
|
|
||||||
object ErrLock = new object();
|
public LiveViewPage(Logger logger, AppSettingsService appSettings, CameraService cameraService)
|
||||||
|
|
||||||
|
|
||||||
public LiveViewPage(Logger logger, AppSettingsService appSettings)
|
|
||||||
{
|
{
|
||||||
this._logger = logger;
|
this._logger = logger;
|
||||||
this._appSettings = appSettings;
|
this._appSettings = appSettings;
|
||||||
try
|
this._cameraService = cameraService;
|
||||||
{
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
APIHandler = new CanonAPI();
|
|
||||||
ErrorHandler.SevereErrorHappened += ErrorHandler_SevereErrorHappened;
|
|
||||||
ErrorHandler.NonSevereErrorHappened += ErrorHandler_NonSevereErrorHappened;
|
|
||||||
|
|
||||||
//SavePathTextBox.Text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "RemotePhoto");
|
|
||||||
SetImageAction = (BitmapImage img) => { bgbrush.ImageSource = img; };
|
SetImageAction = (BitmapImage img) => { bgbrush.ImageSource = img; };
|
||||||
RefreshCamera();
|
|
||||||
IsInit = true;
|
|
||||||
List<Camera> cameraList = this.APIHandler.GetCameraList();
|
|
||||||
if (cameraList.Any())
|
|
||||||
{
|
|
||||||
this.OpenSession();
|
|
||||||
this.StarLiveView();
|
|
||||||
this.SetSettingSaveToComputer();
|
|
||||||
}
|
|
||||||
|
|
||||||
string cameraDeviceNames = string.Join(", ", cameraList.Select(cam => cam.DeviceName));
|
|
||||||
logger.Info(cameraDeviceNames == string.Empty ? "No cameras / devices found" : cameraDeviceNames);
|
|
||||||
}
|
|
||||||
catch (DllNotFoundException)
|
|
||||||
{
|
|
||||||
ReportError("Canon DLLs not found!", true);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
ReportError(ex.Message, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetSettingSaveToComputer()
|
|
||||||
{
|
|
||||||
MainCamera.SetSetting(PropertyID.SaveTo, (int)SaveTo.Host);
|
|
||||||
MainCamera.SetCapacity(4096, int.MaxValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CloseSession()
|
|
||||||
{
|
|
||||||
MainCamera.CloseSession();
|
|
||||||
|
|
||||||
// AvCoBox.Items.Clear();
|
|
||||||
// TvCoBox.Items.Clear();
|
|
||||||
// ISOCoBox.Items.Clear();
|
|
||||||
// SettingsGroupBox.IsEnabled = false;
|
|
||||||
// LiveViewGroupBox.IsEnabled = false;
|
|
||||||
// SessionButton.Content = "Open Session";
|
|
||||||
// SessionLabel.Content = "No open session";
|
|
||||||
// StarLVButton.Content = "Start LV";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void RefreshCamera()
|
|
||||||
{
|
|
||||||
// CameraListBox.Items.Clear();
|
|
||||||
CamList = APIHandler.GetCameraList();
|
|
||||||
|
|
||||||
// foreach (Camera cam in CamList) CameraListBox.Items.Add(cam.DeviceName);
|
|
||||||
// if (MainCamera?.SessionOpen == true) CameraListBox.SelectedIndex = CamList.FindIndex(t => t.ID == MainCamera.ID);
|
|
||||||
// else if (CamList.Count > 0) CameraListBox.SelectedIndex = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void OpenSession()
|
|
||||||
{
|
|
||||||
MainCamera = CamList[0];
|
|
||||||
MainCamera.OpenSession();
|
|
||||||
MainCamera.LiveViewUpdated += MainCamera_LiveViewUpdated;
|
|
||||||
//MainCamera.ProgressChanged += MainCamera_ProgressChanged;
|
|
||||||
MainCamera.StateChanged += MainCamera_StateChanged;
|
|
||||||
MainCamera.DownloadReady += MainCamera_DownloadReady;
|
|
||||||
|
|
||||||
//SessionLabel.Content = MainCamera.DeviceName;
|
|
||||||
AvList = MainCamera.GetSettingsList(PropertyID.Av);
|
|
||||||
TvList = MainCamera.GetSettingsList(PropertyID.Tv);
|
|
||||||
ISOList = MainCamera.GetSettingsList(PropertyID.ISO);
|
|
||||||
|
|
||||||
// foreach (var Av in AvList) AvCoBox.Items.Add(Av.StringValue);
|
|
||||||
// foreach (var Tv in TvList) TvCoBox.Items.Add(Tv.StringValue);
|
|
||||||
// foreach (var ISO in ISOList) ISOCoBox.Items.Add(ISO.StringValue);
|
|
||||||
// AvCoBox.SelectedIndex = AvCoBox.Items.IndexOf(AvValues.GetValue(MainCamera.GetInt32Setting(PropertyID.Av)).StringValue);
|
|
||||||
// TvCoBox.SelectedIndex = TvCoBox.Items.IndexOf(TvValues.GetValue(MainCamera.GetInt32Setting(PropertyID.Tv)).StringValue);
|
|
||||||
// ISOCoBox.SelectedIndex = ISOCoBox.Items.IndexOf(ISOValues.GetValue(MainCamera.GetInt32Setting(PropertyID.ISO)).StringValue);
|
|
||||||
// SettingsGroupBox.IsEnabled = true;
|
|
||||||
// LiveViewGroupBox.IsEnabled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void ReportError(string message, bool lockdown)
|
|
||||||
{
|
|
||||||
int errc;
|
|
||||||
lock (ErrLock)
|
|
||||||
{
|
|
||||||
errc = ++ErrCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lockdown)
|
|
||||||
{
|
|
||||||
//this.EnableUI(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (errc)
|
|
||||||
{
|
|
||||||
case < 4:
|
|
||||||
this._logger.Info(message);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
this._logger.Info("Many errors happened!");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
lock (ErrLock)
|
|
||||||
{
|
|
||||||
ErrCount--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void StarLiveView()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (!MainCamera.IsLiveViewOn)
|
|
||||||
{
|
|
||||||
LVCanvas.Background = bgbrush;
|
LVCanvas.Background = bgbrush;
|
||||||
MainCamera.StartLiveView();
|
cameraService.ConnectCamera();
|
||||||
}
|
cameraService.MainCamera.LiveViewUpdated += MainCamera_OnLiveViewUpdated;
|
||||||
else
|
|
||||||
{
|
|
||||||
MainCamera.StopLiveView();
|
|
||||||
LVCanvas.Background = Brushes.LightGray;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
ReportError(ex.Message, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#region API Events
|
|
||||||
|
|
||||||
// private void APIHandler_CameraAdded(CanonAPI sender)
|
|
||||||
// {
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// }
|
|
||||||
// catch (Exception ex)
|
|
||||||
// {
|
|
||||||
// ReportError(ex.Message, false);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
private void MainCamera_StateChanged(Camera sender, StateEventID eventID, int parameter)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (eventID == StateEventID.Shutdown && IsInit)
|
|
||||||
{
|
|
||||||
Dispatcher.Invoke((Action)delegate { CloseSession(); });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
ReportError(ex.Message, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// private void MainCamera_ProgressChanged(object sender, int progress)
|
private void MainCamera_OnLiveViewUpdated(Camera sender, Stream img)
|
||||||
// {
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// //MainProgressBar.Dispatcher.Invoke((Action)delegate { MainProgressBar.Value = progress; });
|
|
||||||
// }
|
|
||||||
// catch (Exception ex)
|
|
||||||
// {
|
|
||||||
// ReportError(ex.Message, false);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
private void MainCamera_LiveViewUpdated(Camera sender, Stream img)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -249,58 +58,19 @@ public partial class LiveViewPage : Page
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
ReportError(ex.Message, false);
|
_logger.Error(ex.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void MainCamera_DownloadReady(Camera sender, DownloadInfo Info)
|
|
||||||
{
|
|
||||||
this._logger.Info("MainCamera_DownloadReady called");
|
|
||||||
try
|
|
||||||
{
|
|
||||||
string dir = this._appSettings.PictureLocation;
|
|
||||||
sender.DownloadFile(Info, dir);
|
|
||||||
this._logger.Info("Download complete: " + Path.Combine(dir, Info.FileName));
|
|
||||||
//MainProgressBar.Dispatcher.Invoke((Action)delegate { MainProgressBar.Value = 0; });
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
ReportError(ex.Message, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ErrorHandler_NonSevereErrorHappened(object sender, ErrorCode ex)
|
|
||||||
{
|
|
||||||
ReportError($"SDK Error code: {ex} ({((int)ex).ToString("X")})", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void ErrorHandler_SevereErrorHappened(object sender, Exception ex)
|
|
||||||
{
|
|
||||||
ReportError(ex.Message, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
public void TakePhoto()
|
public void TakePhoto()
|
||||||
{
|
{
|
||||||
try
|
this._cameraService.TakePhoto();
|
||||||
{
|
|
||||||
MainCamera.TakePhotoAsync();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
ReportError(ex.Message, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
this.CloseSession();
|
this._cameraService.Dispose();
|
||||||
IsInit = false;
|
|
||||||
MainCamera?.Dispose();
|
|
||||||
APIHandler?.Dispose();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3,6 +3,7 @@ using System.Windows;
|
|||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
|
|
||||||
using CamBooth.App.Core.AppSettings;
|
using CamBooth.App.Core.AppSettings;
|
||||||
|
using CamBooth.App.Core.Camera;
|
||||||
using CamBooth.App.Core.Logging;
|
using CamBooth.App.Core.Logging;
|
||||||
using CamBooth.App.DebugConsole;
|
using CamBooth.App.DebugConsole;
|
||||||
using CamBooth.App.LiveView;
|
using CamBooth.App.LiveView;
|
||||||
@ -21,6 +22,8 @@ public partial class MainWindow : Window
|
|||||||
|
|
||||||
private readonly PictureGalleryService _pictureGalleryService;
|
private readonly PictureGalleryService _pictureGalleryService;
|
||||||
|
|
||||||
|
private readonly CameraService _cameraService;
|
||||||
|
|
||||||
private bool _isDebugConsoleVisible = true;
|
private bool _isDebugConsoleVisible = true;
|
||||||
|
|
||||||
private bool _isPicturePanelVisible = false;
|
private bool _isPicturePanelVisible = false;
|
||||||
@ -28,11 +31,15 @@ public partial class MainWindow : Window
|
|||||||
private LiveViewPage? _liveViewPage;
|
private LiveViewPage? _liveViewPage;
|
||||||
|
|
||||||
|
|
||||||
public MainWindow(Logger logger, AppSettingsService appSettings, PictureGalleryService pictureGalleryService)
|
public MainWindow(Logger logger,
|
||||||
|
AppSettingsService appSettings,
|
||||||
|
PictureGalleryService pictureGalleryService,
|
||||||
|
CameraService cameraService)
|
||||||
{
|
{
|
||||||
this._logger = logger;
|
this._logger = logger;
|
||||||
this._appSettings = appSettings;
|
this._appSettings = appSettings;
|
||||||
this._pictureGalleryService = pictureGalleryService;
|
this._pictureGalleryService = pictureGalleryService;
|
||||||
|
this._cameraService = cameraService;
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
this.SetVisibilityDebugConsole(this._isDebugConsoleVisible);
|
this.SetVisibilityDebugConsole(this._isDebugConsoleVisible);
|
||||||
this.LoadPicturePanelAsync();
|
this.LoadPicturePanelAsync();
|
||||||
@ -44,9 +51,9 @@ public partial class MainWindow : Window
|
|||||||
|
|
||||||
private void LoadPicturePanelAsync()
|
private void LoadPicturePanelAsync()
|
||||||
{
|
{
|
||||||
//this.PicturePanel.Visibility = Visibility.Hidden;
|
//this.PicturePanelPage.Visibility = Visibility.Hidden;
|
||||||
//this.PicturePanel.Navigate(new PicturePanel(this._appSettings, this._logger));
|
//this.PicturePanelPage.Navigate(new PicturePanelPage(this._appSettings, this._logger));
|
||||||
this._pictureGalleryService.LoadThumbnailsToCache(12);
|
this._pictureGalleryService.LoadThumbnailsToCache();
|
||||||
//this.DebugFrame.Navigate(new DebugConsolePage(this._logger));
|
//this.DebugFrame.Navigate(new DebugConsolePage(this._logger));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,7 +62,7 @@ public partial class MainWindow : Window
|
|||||||
{
|
{
|
||||||
if (visibility)
|
if (visibility)
|
||||||
{
|
{
|
||||||
this.PicturePanel.Navigate(new PicturePanel(this._appSettings, this._logger, this._pictureGalleryService));
|
this.PicturePanel.Navigate(new PicturePanelPage(this._appSettings, this._logger, this._pictureGalleryService));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -74,7 +81,7 @@ public partial class MainWindow : Window
|
|||||||
|
|
||||||
private void NavToLiveView(object sender, RoutedEventArgs e)
|
private void NavToLiveView(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
_liveViewPage = new LiveViewPage(this._logger, this._appSettings);
|
_liveViewPage = new LiveViewPage(this._logger, this._appSettings, this._cameraService);
|
||||||
MainFrame.Navigate(this._liveViewPage);
|
MainFrame.Navigate(this._liveViewPage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -15,22 +15,12 @@ public class PictureGalleryService
|
|||||||
|
|
||||||
private readonly Logger _logger;
|
private readonly Logger _logger;
|
||||||
|
|
||||||
public List<Image> ImageControls
|
public List<BitmapImage> ThumbnailsOrderedByNewestDescending => this.thumbnails.
|
||||||
{
|
OrderByDescending(map => map.Key)
|
||||||
get
|
.Select(ordered => ordered.Value)
|
||||||
{
|
.ToList();
|
||||||
// List<Image> tmp = new List<Image>();
|
|
||||||
// foreach (var image in imageControls)
|
|
||||||
// {
|
|
||||||
// tmp.Add(image);
|
|
||||||
// }
|
|
||||||
// return tmp;
|
|
||||||
|
|
||||||
return this.imageControls;
|
private Dictionary<DateTime, BitmapImage> thumbnails = new();
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<Image> imageControls = new List<Image>();
|
|
||||||
|
|
||||||
|
|
||||||
public PictureGalleryService(AppSettingsService appSettings, Logger logger)
|
public PictureGalleryService(AppSettingsService appSettings, Logger logger)
|
||||||
@ -40,30 +30,32 @@ public class PictureGalleryService
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void LoadThumbnailsToCache(int howManyPictures)
|
public void LoadThumbnailsToCache(int cacheSize = 0)
|
||||||
{
|
{
|
||||||
|
this._logger.Info("Start load thumbnails into cache");
|
||||||
string? pictureLocation = this._appSettings.PictureLocation;
|
string? pictureLocation = this._appSettings.PictureLocation;
|
||||||
int loop = 0;
|
int loop = 0;
|
||||||
var picturePaths = Directory.EnumerateFiles(pictureLocation).ToList();
|
|
||||||
|
List<string> picturePaths = Directory.EnumerateFiles(pictureLocation).ToList();
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
string picturePath = picturePaths[loop];
|
string picturePath = picturePaths[loop];
|
||||||
this._logger.Info("load image: " + picturePath);
|
|
||||||
|
|
||||||
var imageControl = new Wpf.Ui.Controls.Image()
|
DateTime creationTime = File.GetCreationTime(picturePath);
|
||||||
|
|
||||||
|
// add if not exists
|
||||||
|
if (!this.thumbnails.ContainsKey(creationTime))
|
||||||
{
|
{
|
||||||
Source = CreateThumbnail(picturePath, 244, 200),
|
this.thumbnails.Add(creationTime, CreateThumbnail(picturePath, 244, 200));
|
||||||
Width = 386, // Optional: Setze Breite
|
this._logger.Info($"Thumbnail '{picturePath}' successfully created");
|
||||||
Margin = new Thickness(3) // Optional: Abstand zwischen Bildern
|
}
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Füge das Image-Control in ein StackPanel ein
|
|
||||||
this.imageControls.Add(imageControl);
|
|
||||||
|
|
||||||
loop++;
|
loop++;
|
||||||
}
|
}
|
||||||
while (loop < howManyPictures && loop < picturePaths.Count);
|
while ((loop < cacheSize || cacheSize == 0) && loop < picturePaths.Count);
|
||||||
|
|
||||||
|
this._logger.Info("Loading thumbnails into cache completed");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BitmapImage CreateThumbnail(string filePath, int maxWidth, int maxHeight)
|
public static BitmapImage CreateThumbnail(string filePath, int maxWidth, int maxHeight)
|
||||||
@ -71,7 +63,7 @@ public class PictureGalleryService
|
|||||||
var bitmap = new BitmapImage();
|
var bitmap = new BitmapImage();
|
||||||
bitmap.BeginInit();
|
bitmap.BeginInit();
|
||||||
bitmap.UriSource = new Uri(filePath);
|
bitmap.UriSource = new Uri(filePath);
|
||||||
bitmap.DecodePixelWidth = maxWidth; // Größe des Thumbnails direkt beim Dekodieren festlegen
|
bitmap.DecodePixelWidth = maxWidth; // Größe des ThumbnailsOrderedByNewestDescending direkt beim Dekodieren festlegen
|
||||||
bitmap.CacheOption = BitmapCacheOption.OnLoad;
|
bitmap.CacheOption = BitmapCacheOption.OnLoad;
|
||||||
bitmap.EndInit();
|
bitmap.EndInit();
|
||||||
return bitmap;
|
return bitmap;
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
<Page x:Class="CamBooth.App.PictureGallery.PicturePanel"
|
<Page x:Class="CamBooth.App.PictureGallery.PicturePanelPage"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:local="clr-namespace:CamBooth.App.PictureGallery"
|
xmlns:local="clr-namespace:CamBooth.App.PictureGallery"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="PicturePanel" Width="1600" Height="795"
|
Title="PicturePanelPage" Width="1600" Height="795"
|
||||||
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
|
||||||
Background="Magenta">
|
Background="Magenta">
|
||||||
<Grid>
|
<Grid>
|
||||||
@ -10,7 +10,7 @@ using Image = Wpf.Ui.Controls.Image;
|
|||||||
|
|
||||||
namespace CamBooth.App.PictureGallery;
|
namespace CamBooth.App.PictureGallery;
|
||||||
|
|
||||||
public partial class PicturePanel : Page, IDisposable
|
public partial class PicturePanelPage : Page, IDisposable
|
||||||
{
|
{
|
||||||
private readonly AppSettingsService _appSettingsService;
|
private readonly AppSettingsService _appSettingsService;
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ public partial class PicturePanel : Page, IDisposable
|
|||||||
private readonly PictureGalleryService _pictureGalleryService;
|
private readonly PictureGalleryService _pictureGalleryService;
|
||||||
|
|
||||||
|
|
||||||
public PicturePanel(AppSettingsService appSettingsService, Logger logger, PictureGalleryService pictureGalleryService)
|
public PicturePanelPage(AppSettingsService appSettingsService, Logger logger, PictureGalleryService pictureGalleryService)
|
||||||
{
|
{
|
||||||
this._appSettingsService = appSettingsService;
|
this._appSettingsService = appSettingsService;
|
||||||
this._logger = logger;
|
this._logger = logger;
|
||||||
@ -42,15 +42,25 @@ public partial class PicturePanel : Page, IDisposable
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void LoadPictures(int howManyPictures)
|
private void LoadPictures(int howManyPictures = 0)
|
||||||
{
|
{
|
||||||
foreach (Image ctl in this._pictureGalleryService.ImageControls)
|
int loop = 0;
|
||||||
|
|
||||||
|
do
|
||||||
{
|
{
|
||||||
if(!this.PicturesPanel.Children.Contains(ctl))
|
BitmapImage thumbnail = this._pictureGalleryService.ThumbnailsOrderedByNewestDescending[loop];
|
||||||
|
|
||||||
|
var imageControl = new Wpf.Ui.Controls.Image()
|
||||||
{
|
{
|
||||||
this.PicturesPanel.Children.Add(ctl);
|
Source = thumbnail,
|
||||||
}
|
Width = 388,
|
||||||
|
Margin = new Thickness(3)
|
||||||
|
};
|
||||||
|
|
||||||
|
this.PicturesPanel.Children.Add(imageControl);
|
||||||
|
loop++;
|
||||||
}
|
}
|
||||||
|
while ((loop < howManyPictures || howManyPictures == 0) && loop < this._pictureGalleryService.ThumbnailsOrderedByNewestDescending.Count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -7,6 +7,7 @@
|
|||||||
<s:Boolean x:Key="/Default/AddReferences/RecentPaths/=C_003A_005CDev_005CRepos_005CPrivat_005CCamBooth_005Cmisc_005CCanonBinaries_005CMlib_002Edll/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/AddReferences/RecentPaths/=C_003A_005CDev_005CRepos_005CPrivat_005CCamBooth_005Cmisc_005CCanonBinaries_005CMlib_002Edll/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/AddReferences/RecentPaths/=C_003A_005CDev_005CRepos_005CPrivat_005CCamBooth_005Cmisc_005CCanonBinaries_005CUcs32P_002Edll/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/AddReferences/RecentPaths/=C_003A_005CDev_005CRepos_005CPrivat_005CCamBooth_005Cmisc_005CCanonBinaries_005CUcs32P_002Edll/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AApplication_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F6665f2e3e843578225e3796b83c5342a58c3f72bfef19eeee7aa90d157d4949_003FApplication_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AApplication_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F6665f2e3e843578225e3796b83c5342a58c3f72bfef19eeee7aa90d157d4949_003FApplication_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F793c644a163b4a9992123fa9cc1562efbf3908_003F4a_003Fd28af422_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fbd1d5c50194fea68ff3559c160230b0ab50f5acf4ce3061bffd6d62958e2182_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fbd1d5c50194fea68ff3559c160230b0ab50f5acf4ce3061bffd6d62958e2182_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWindow_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F0713c794b56e4feca091d5981a6f5967f60930_003Fc8_003F61b7e802_003FWindow_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWindow_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F0713c794b56e4feca091d5981a6f5967f60930_003Fc8_003F61b7e802_003FWindow_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWindow_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fd0db11e55b76dc7f234163f6cee32b297b8ddb591fb0b5cbad1b46ed17343e18_003FWindow_002Ecs_002Fz_003A2_002D1/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWindow_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fd0db11e55b76dc7f234163f6cee32b297b8ddb591fb0b5cbad1b46ed17343e18_003FWindow_002Ecs_002Fz_003A2_002D1/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>
|
||||||
Loading…
Reference in New Issue
Block a user