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; } } /// /// Tab Caption panel /// 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 tabPanels = new List(); //------------------------------------------------------------------- // 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); } //------------------------------------------------------------------- } //======================================================================= }