213 lines
6.3 KiB
C#
213 lines
6.3 KiB
C#
using Sarand.Net.Mobile.Maui.Views;
|
|
using Sarand.Net.Standard.Base.Utils;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Sarand.Net.Mobile.Maui.Panels
|
|
{
|
|
//=======================================================================
|
|
public class SamPanel_Tabbed : SamPanel
|
|
{
|
|
//-------------------------------------------------------------------
|
|
// Definitions.
|
|
private class TabPanelData
|
|
{
|
|
public TabPanelData(int tabPos, SamPanel_TabCaption tabCaptionPanel, SamPanel_Tab tabPanel)
|
|
{
|
|
TabPos = tabPos;
|
|
TabCaptionPanel = tabCaptionPanel;
|
|
TabPanel = tabPanel;
|
|
}
|
|
public int TabPos { get; }
|
|
public SamPanel_TabCaption TabCaptionPanel { get; }
|
|
public SamPanel_Tab TabPanel { get; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tab Caption panel
|
|
/// </summary>
|
|
public class SamPanel_TabCaption : SamPanel
|
|
{
|
|
// Properties.
|
|
private SamPanel_Tabbed TabbedPanel { get; }
|
|
public int TabPos { get; }
|
|
public String Caption { get; }
|
|
// Data members.
|
|
private static readonly Color ActiveBackgroundColor = Colors.WhiteSmoke;
|
|
private static readonly Color ActiveBorderColor = Colors.DarkSlateBlue;
|
|
private static readonly Color InactiveBackgroundColor = Colors.LightGray;
|
|
private static readonly Color InactiveBorderColor = Colors.SlateBlue;
|
|
private Border border = new Border() { Stroke = InactiveBorderColor, StrokeThickness = 2.0 };
|
|
private TapGestureRecognizer tabCaptionTapGesture = new TapGestureRecognizer();
|
|
public SamPanel_TabCaption(SamPanel_Tabbed tabbedPanel, int tabPos, String caption)
|
|
{
|
|
TabbedPanel = tabbedPanel;
|
|
TabPos = tabPos;
|
|
Caption = caption;
|
|
Content = border;
|
|
tabCaptionTapGesture.Tapped += TabCaptionTapGesture_Tapped;
|
|
GestureRecognizers.Add(tabCaptionTapGesture);
|
|
Deactivate();
|
|
}
|
|
private void TabCaptionTapGesture_Tapped(object? sender, TappedEventArgs e)
|
|
{
|
|
TabbedPanel.TabCaptionTapped(sender, e, TabPos);
|
|
}
|
|
public void Activate()
|
|
{
|
|
BackgroundColor = ActiveBackgroundColor;
|
|
border.Stroke = ActiveBorderColor;
|
|
}
|
|
public void Deactivate()
|
|
{
|
|
BackgroundColor = InactiveBackgroundColor;
|
|
border.Stroke = InactiveBorderColor;
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Data members.
|
|
|
|
// Content.
|
|
private VerticalStackLayout contentStack = new VerticalStackLayout() { };
|
|
private HorizontalStackLayout panelTabCaptions = new HorizontalStackLayout() { Spacing = 8.0 };
|
|
private ScrollView scrollTabPanels = new ScrollView() { };
|
|
private VerticalStackLayout panelTabPanels = new VerticalStackLayout() { };
|
|
|
|
// Tab panels.
|
|
private int tabCount = 0;
|
|
private readonly List<TabPanelData> tabPanels = new List<TabPanelData>();
|
|
|
|
//-------------------------------------------------------------------
|
|
// Construction.
|
|
public SamPanel_Tabbed()
|
|
{
|
|
// Content.
|
|
Content = contentStack;
|
|
|
|
// Tab captions.
|
|
contentStack.Children.Add(panelTabCaptions);
|
|
|
|
// Tab panels.
|
|
contentStack.Children.Add(scrollTabPanels);
|
|
scrollTabPanels.Content = panelTabPanels;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Properties.
|
|
|
|
//-------------------------------------------------------------------
|
|
// Manage tabs.
|
|
|
|
public void AddTabPanel(String caption, SamPanel_Tab tabPanel)
|
|
{
|
|
tabCount++;
|
|
|
|
// Tab caption.
|
|
if (StringUtil.IsBlank(caption))
|
|
caption = $"Tab #{tabCount}";
|
|
SamPanel_TabCaption panelTabCaption = new SamPanel_TabCaption(this, tabCount, caption);
|
|
panelTabCaptions.Children.Add(panelTabCaption);
|
|
|
|
// Tab panel.
|
|
panelTabPanels.Children.Add(tabPanel);
|
|
|
|
// Tab panel data.
|
|
TabPanelData tabPanelData = new TabPanelData(tabCount, panelTabCaption, tabPanel);
|
|
tabPanels.Add(tabPanelData);
|
|
|
|
if (tabCount == 1)
|
|
{
|
|
panelTabCaption.Activate();
|
|
}
|
|
}
|
|
|
|
public void ClearTabPanels()
|
|
{
|
|
tabCount = 0;
|
|
tabPanels.Clear();
|
|
panelTabCaptions.Children.Clear();
|
|
panelTabPanels.Children.Clear();
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Actions.
|
|
|
|
private void TabCaptionTapped(object? sender, TappedEventArgs e, int tabPos)
|
|
{
|
|
foreach (TabPanelData tabPanel in tabPanels)
|
|
{
|
|
if (tabPanel.TabPos == tabPos)
|
|
{
|
|
tabPanel.TabCaptionPanel.Activate();
|
|
tabPanel.TabPanel.IsVisible = true;
|
|
}
|
|
else
|
|
{
|
|
tabPanel.TabCaptionPanel.Deactivate();
|
|
tabPanel.TabPanel.IsVisible = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// C o n f i g u r e C o m p o n e n t s
|
|
//-------------------------------------------------------------------
|
|
public override void ConfigureComponents()
|
|
{
|
|
base.ConfigureComponents();
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// C o n t r o l A c t i v i t y
|
|
//-------------------------------------------------------------------
|
|
public override void SetControlActivity()
|
|
{
|
|
}
|
|
public override void SetControlsReadOnly()
|
|
{
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// P a n e l E v e n t s
|
|
//-------------------------------------------------------------------
|
|
protected override void OnParentSet()
|
|
{
|
|
base.OnParentSet();
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
protected override void OnPropertyChanging([CallerMemberName] string propertyName = "")
|
|
{
|
|
base.OnPropertyChanging(propertyName);
|
|
}
|
|
protected override void OnPropertyChanged([CallerMemberName] string propertyName = "")
|
|
{
|
|
base.OnPropertyChanged(propertyName);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
protected override void OnChildAdded(Element child)
|
|
{
|
|
base.OnChildAdded(child);
|
|
}
|
|
protected override void OnChildRemoved(Element child, int oldLogicalIndex)
|
|
{
|
|
base.OnChildRemoved(child, oldLogicalIndex);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
protected override void OnSizeAllocated(double width, double height)
|
|
{
|
|
base.OnSizeAllocated(width, height);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|