581 lines
20 KiB
C#
581 lines
20 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Input;
|
|
using System.Windows.Interop;
|
|
|
|
using FasdDesktopUi.Basics;
|
|
using FasdDesktopUi.Basics.Models;
|
|
using FasdDesktopUi.Basics.UiActions;
|
|
using FasdDesktopUi.Basics.UserControls;
|
|
using FasdDesktopUi.Pages.SlimPage.Models;
|
|
|
|
using C4IT.FASD.Base;
|
|
using C4IT.MultiLanguage;
|
|
using static C4IT.Logging.cLogManager;
|
|
using System.Diagnostics;
|
|
using System.Threading.Tasks;
|
|
using F4SD_AdaptableIcon.Enums;
|
|
|
|
namespace FasdDesktopUi.Pages.SlimPage
|
|
{
|
|
public partial class SlimPageView : SupportCasePageBase, IBlurrable
|
|
{
|
|
#region Properties
|
|
|
|
private bool shouldReRunDataChangedEvent = false;
|
|
|
|
private const int MaxItemCountMenuBar = 5;
|
|
|
|
#endregion
|
|
|
|
#region Blurring
|
|
|
|
internal override void DoBlurredChanged(bool isBlured)
|
|
{
|
|
DataHistoryCollectionUc.IsBlurred = isBlured;
|
|
WidgetCollectionUc.IsBlurred = isBlured;
|
|
}
|
|
|
|
internal override bool CheckBlurInvoker(IBlurInvoker invoker)
|
|
{
|
|
try
|
|
{
|
|
switch (invoker)
|
|
{
|
|
case SearchBar searchBar:
|
|
if (!searchBar.IsVisible || searchBar.SearchStatus != SearchBar.eSearchStatus.message)
|
|
return true;
|
|
break;
|
|
case QuickActionSelector _:
|
|
case QuickActionStatusMonitor _:
|
|
return true;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
#endregion
|
|
|
|
public SlimPageView()
|
|
{
|
|
try
|
|
{
|
|
InitializeComponent();
|
|
|
|
AddCustomHandlers();
|
|
|
|
SourceInitialized += (s, e) =>
|
|
{
|
|
IntPtr handle = new WindowInteropHelper(this).Handle;
|
|
HwndSource.FromHwnd(handle).AddHook(new HwndSourceHook(cUtility.WindowProc));
|
|
};
|
|
|
|
UiSettingsChanged(null, null);
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
private void SlimPage_Loaded(object sender, RoutedEventArgs e)
|
|
{
|
|
MenuBarUc.SetSlimPage();
|
|
}
|
|
|
|
private void AddCustomHandlers()
|
|
{
|
|
try
|
|
{
|
|
AddHandler(cUiActionBase.UiActionClickedEvent, new cUiActionBase.UiActionEventHandlerDelegate(UiActionWasTriggered));
|
|
AddHandler(DataCanvas.DataCanvasWasClosedEvent, new RoutedEventHandler(DataCanvasWasClosed));
|
|
|
|
BlurInvoker.BlurInvokerVisibilityChanged += (obj, e) => UpdateBlurStatus(obj);
|
|
|
|
MenuBarUc.SearchButtonClickedAction = SearchButtonClickedAction;
|
|
MenuBarUc.MoreButtonClickedAction = MoreButtonClickedAction;
|
|
|
|
SearchBarUserControl.ChangedSearchValue = EnteredSearchValueAsync;
|
|
SearchBarUserControl.CancledSearchAction = BlurBorder_Click;
|
|
|
|
cFasdCockpitConfig.Instance.UiSettingsChanged += UiSettingsChanged;
|
|
cConnectionStatusHelper.ApiConnectionStatusChanged += ApiConnectionStatusChanged;
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
private void UiSettingsChanged(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
var positionAlignement = cFasdCockpitConfig.Instance.Global.SmallViewAlignment;
|
|
|
|
switch (positionAlignement)
|
|
{
|
|
case enumF4sdHorizontalAlignment.Center:
|
|
MainBorder.HorizontalAlignment = HorizontalAlignment.Center;
|
|
break;
|
|
case enumF4sdHorizontalAlignment.Right:
|
|
MainBorder.HorizontalAlignment = HorizontalAlignment.Right;
|
|
break;
|
|
default:
|
|
MainBorder.HorizontalAlignment = HorizontalAlignment.Left;
|
|
break;
|
|
}
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
private void ApiConnectionStatusChanged(cConnectionStatusHelper.enumOnlineStatus? Status)
|
|
{
|
|
|
|
try
|
|
{
|
|
if (Status == cConnectionStatusHelper.enumOnlineStatus.online)
|
|
{
|
|
Dispatcher.Invoke(() =>
|
|
{
|
|
Footer.ClearValue(IsHitTestVisibleProperty);
|
|
Footer.ClearValue(OpacityProperty);
|
|
DynamicBodyParts.ClearValue(IsHitTestVisibleProperty);
|
|
DynamicBodyParts.ClearValue(OpacityProperty);
|
|
if (MenuBarUc.Visibility != Visibility.Visible)
|
|
{
|
|
SearchBarUserControl.Visibility = Visibility.Collapsed;
|
|
MenuBarUc.Visibility = Visibility.Visible;
|
|
}
|
|
});
|
|
}
|
|
else
|
|
{
|
|
Dispatcher.Invoke(() =>
|
|
{
|
|
Footer.IsHitTestVisible = false;
|
|
DynamicBodyParts.IsHitTestVisible = false;
|
|
DynamicBodyParts.Opacity = 0.6;
|
|
if (SearchBarUserControl.Visibility != Visibility.Visible)
|
|
{
|
|
MenuBarUc.Visibility = Visibility.Collapsed;
|
|
SearchBarUserControl.Visibility = Visibility.Visible;
|
|
}
|
|
SearchBarUserControl.SetApiStatus();
|
|
|
|
IsBlurred = true;
|
|
});
|
|
}
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
finally
|
|
{
|
|
}
|
|
|
|
}
|
|
|
|
#region Delegate Actions
|
|
|
|
private void SearchButtonClickedAction()
|
|
{
|
|
|
|
try
|
|
{
|
|
MenuBarUc.MenuBarUc.Visibility = Visibility.Collapsed;
|
|
SearchBarUserControl.Visibility = Visibility.Visible;
|
|
SearchBarUserControl.ActivateManualSearch();
|
|
|
|
DynamicBodyParts.Child = null;
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
private async Task EnteredSearchValueAsync(cFilteredResults filteredResults)
|
|
{
|
|
await Task.CompletedTask;
|
|
//try
|
|
//{
|
|
// if (filteredResults?.Results == null)
|
|
// {
|
|
// DynamicBodyParts.Child = null;
|
|
// return;
|
|
// }
|
|
|
|
// if (DynamicBodyParts.Child is CustomSearchResultCollection customSearchResultCollection)
|
|
// {
|
|
// customSearchResultCollection.ShowSearchResults(filteredResults,null);
|
|
// customSearchResultCollection.IndexOfSelectedResultItem = filteredResults?.Results?.Count - 1 ?? -1;
|
|
// }
|
|
// else
|
|
// {
|
|
// var _searchResultCollection = new CustomSearchResultCollection(true) { IndexOfSelectedResultItem = filteredResults?.Results?.Count - 1 ?? -1 };
|
|
// _searchResultCollection.ShowSearchResults(filteredResults,null);
|
|
// DynamicBodyParts.Child = _searchResultCollection;
|
|
// }
|
|
//}
|
|
//catch (Exception E)
|
|
//{
|
|
// LogException(E);
|
|
//}
|
|
}
|
|
|
|
private void MoreButtonClickedAction()
|
|
{
|
|
try
|
|
{
|
|
if (!(DataContext is SlimPageViewModel viewModel))
|
|
return;
|
|
|
|
var tempMoreQuickActionList = viewModel.MenuDrawerData;
|
|
|
|
if (cF4SDCockpitXmlConfig.Instance?.CopyTemplateConfig?.CopyTemplates != null)
|
|
{
|
|
var tempSubMenuList = new List<cMenuDataBase>();
|
|
|
|
foreach (var copyTemplate in cF4SDCockpitXmlConfig.Instance?.CopyTemplateConfig?.CopyTemplates.CopyTemplates)
|
|
{
|
|
tempSubMenuList.Add(new cMenuDataBase(copyTemplate.Value));
|
|
}
|
|
|
|
tempMoreQuickActionList.Insert(0, new cMenuDataContainer() { MenuText = cMultiLanguageSupport.GetItem("QuickAction.CopyContent"), MenuIcon = new F4SD_AdaptableIcon.IconData(enumInternIcons.menuBar_copy), UiAction = new cSubMenuAction(true) { Name = cMultiLanguageSupport.GetItem("QuickAction.CopyContent"), SubMenuData = tempSubMenuList }, SubMenuData = tempSubMenuList });
|
|
}
|
|
|
|
var quickActionSelector = new QuickActionSelector()
|
|
{
|
|
Visibility = Visibility.Visible,
|
|
QuickActionList = tempMoreQuickActionList,
|
|
QuickActionSelectorHeading = "Quick Actions",
|
|
TempQuickActionList = null,
|
|
CloseButtonClickedAction = BlurBorder_Click
|
|
};
|
|
|
|
quickActionSelector.LockButton.Visibility = Visibility.Collapsed;
|
|
DynamicBodyParts.Child = quickActionSelector;
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
public void SetPropertyValues(cSlimPageData slimPageData)
|
|
{
|
|
try
|
|
{
|
|
BlurBorder_Click();
|
|
|
|
if (DataContext is SlimPageViewModel viewModel)
|
|
viewModel.InitializeProperties(slimPageData);
|
|
|
|
//todo: replace binding with following schema due to performance issues:
|
|
WidgetCollectionUc.HeadingData = slimPageData.HeadingData;
|
|
WidgetCollectionUc.WidgetData = slimPageData.WidgetData;
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
#region Update Data
|
|
|
|
internal override async void DataProvider_DataChanged(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (isDataChangedEventRunning)
|
|
{
|
|
shouldReRunDataChangedEvent = true;
|
|
return;
|
|
}
|
|
|
|
var data = await _supportCase?.SupportCaseDataProviderArtifact.HealthCardDataHelper.GetSlimPageDataAsync();
|
|
//todo: check if there is a more performant way solving this
|
|
Dispatcher.Invoke(() => WidgetCollectionUc.HeadingData = data.HeadingData);
|
|
Dispatcher.Invoke(() => WidgetCollectionUc.WidgetData = data.WidgetData);
|
|
Dispatcher.Invoke(() => MenuBarUc.MenuBarItemData = GetSlimpageMenuBarData(data.MenuBarData));
|
|
Dispatcher.Invoke(() => DataHistoryCollectionUc.UpdateHistory(data.DataHistoryList));
|
|
|
|
Dispatcher.Invoke(() =>
|
|
{
|
|
if (DataContext is SlimPageViewModel viewModel)
|
|
viewModel.InitializeProperties(data);
|
|
});
|
|
|
|
if (shouldReRunDataChangedEvent)
|
|
{
|
|
shouldReRunDataChangedEvent = false;
|
|
DataProvider_DataChanged(sender, e);
|
|
}
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
internal override async void DataProvider_DataFullyLoaded(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
var data = await _supportCase?.SupportCaseDataProviderArtifact.HealthCardDataHelper.GetSlimPageDataAsync();
|
|
//todo: check if there is a more performant way solving this
|
|
Dispatcher.Invoke(() => WidgetCollectionUc.HeadingData = data.HeadingData);
|
|
Dispatcher.Invoke(() => WidgetCollectionUc.WidgetData = data.WidgetData);
|
|
Dispatcher.Invoke(() => MenuBarUc.MenuBarItemData = GetSlimpageMenuBarData(data.MenuBarData));
|
|
Dispatcher.Invoke(() => DataHistoryCollectionUc.UpdateHistory(data.DataHistoryList));
|
|
|
|
if (_supportCase != null)
|
|
{
|
|
_supportCase.SupportCaseDataProviderArtifact.HealthCardDataHelper.DataChanged -= DataProvider_DataChanged;
|
|
_supportCase.SupportCaseDataProviderArtifact.HealthCardDataHelper.DataFullyLoaded -= DataProvider_DataFullyLoaded;
|
|
}
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
internal override void DirectConnectionHelper_DirectConnectionChanged(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
Dispatcher.Invoke(() =>
|
|
{
|
|
bool hasDirectConnection = _supportCase?.SupportCaseDataProviderArtifact?.DirectConnectionHelper?.IsDirectConnectionActive ?? false;
|
|
WidgetCollectionUc.HasDirectConnection = hasDirectConnection;
|
|
});
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
private List<cMenuDataBase> GetSlimpageMenuBarData(List<cMenuDataBase> list)
|
|
{
|
|
try
|
|
{
|
|
list.Where(data => data.IconPositionIndex > -1)
|
|
.OrderBy(data => data.IconPositionIndex)
|
|
.Skip(MaxItemCountMenuBar)
|
|
.ToList()
|
|
.ForEach(data => data.IconPositionIndex = -1);
|
|
return list;
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
return new List<cMenuDataBase>();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region BlurBorder_Click
|
|
|
|
private void BlurBorder_Click()
|
|
{
|
|
try
|
|
{
|
|
if (!(DataContext is SlimPageViewModel viewModel))
|
|
return;
|
|
|
|
if (SearchBarUserControl.SearchStatus != SearchBar.eSearchStatus.message)
|
|
{
|
|
SearchBarUserControl.Visibility = Visibility.Collapsed;
|
|
MenuBarUc.Visibility = Visibility.Visible;
|
|
}
|
|
else
|
|
IsBlurred = false;
|
|
|
|
DynamicBodyParts.Child = null;
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
private void BlurBorder_MouseUp(object sender, MouseButtonEventArgs e)
|
|
{
|
|
BlurBorder_Click();
|
|
}
|
|
|
|
private void BlurBorder_TouchDown(object sender, TouchEventArgs e)
|
|
{
|
|
BlurBorder_Click();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Search Events
|
|
|
|
private void SearchBar_DidSearch(object sender, RoutedEventArgs e)
|
|
{
|
|
BlurBorder_Click();
|
|
}
|
|
|
|
private void SearchBar_CancledSearch(object sender, RoutedEventArgs e)
|
|
{
|
|
BlurBorder_Click();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region WindowStateBar Events
|
|
|
|
private void WindowStateBarUc_ClickedClose(object sender, RoutedEventArgs e)
|
|
{
|
|
BlurBorder_Click();
|
|
Close();
|
|
}
|
|
|
|
private void WindowStateBarUc_ClickedMaximize(object sender, RoutedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
var detailsPage = cSupportCaseDataProvider.detailsPage;
|
|
|
|
if (detailsPage != null)
|
|
{
|
|
Hide();
|
|
App.HideAllSettingViews();
|
|
detailsPage.Show();
|
|
}
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
private async void UiActionWasTriggered(object sender, UiActionEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
// define drawing area
|
|
UIElement drawingArea = null;
|
|
|
|
switch (e.UiAction)
|
|
{
|
|
case cUiQuickAction _:
|
|
drawingArea = DynamicBodyParts.Child is Decorator decorator ? decorator : new Decorator();
|
|
if (!(DynamicBodyParts.Child is Decorator))
|
|
DynamicBodyParts.Child = drawingArea;
|
|
break;
|
|
case cSubMenuAction _:
|
|
drawingArea = DynamicBodyParts.Child is QuickActionSelector quickActionSelector ? quickActionSelector : new QuickActionSelector();
|
|
if (!(DynamicBodyParts.Child is QuickActionSelector))
|
|
DynamicBodyParts.Child = drawingArea;
|
|
break;
|
|
}
|
|
|
|
await e.UiAction?.RunUiActionAsync(e.OriginalSource, drawingArea, false, _supportCase?.SupportCaseDataProviderArtifact);
|
|
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
private void DataCanvasWasClosed(object sender, RoutedEventArgs e)
|
|
{
|
|
BlurBorder_Click();
|
|
}
|
|
|
|
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (SearchBarUserControl.Visibility == Visibility.Visible && DynamicBodyParts.Child is CustomSearchResultCollection resultMenu)
|
|
{
|
|
switch (e.Key)
|
|
{
|
|
case Key.Up:
|
|
if (resultMenu.IndexOfSelectedResultItem > 0)
|
|
resultMenu.IndexOfSelectedResultItem--;
|
|
break;
|
|
case Key.Down:
|
|
resultMenu.IndexOfSelectedResultItem++;
|
|
break;
|
|
case Key.Enter:
|
|
resultMenu.SelectCurrentResultItem();
|
|
e.Handled = true;
|
|
break;
|
|
case Key.Escape:
|
|
BlurBorder_Click();
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
switch (e.Key)
|
|
{
|
|
case Key.Enter:
|
|
if (SearchBarUserControl.Visibility == Visibility.Visible)
|
|
break;
|
|
|
|
var detailsPage = cSupportCaseDataProvider.detailsPage;
|
|
if (detailsPage != null)
|
|
{
|
|
Hide();
|
|
App.HideAllSettingViews();
|
|
detailsPage.Show();
|
|
}
|
|
break;
|
|
case Key.F3:
|
|
if (Keyboard.Modifiers == ModifierKeys.Control)
|
|
SearchButtonClickedAction();
|
|
break;
|
|
}
|
|
} //todo: add QuickAction Navigation
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
|
|
public void SetZoomValue(int zoomInPercent)
|
|
{
|
|
try
|
|
{
|
|
if (DataContext is SlimPageViewModel viewModel)
|
|
viewModel.ZoomInPercent = zoomInPercent;
|
|
}
|
|
catch (Exception E)
|
|
{
|
|
LogException(E);
|
|
}
|
|
}
|
|
}
|
|
}
|