/*
- * Copyright(c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright(c) 2022 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
private MenuItemGroup menuItemGroup = null;
private RelativePosition horizontalPosition = RelativePosition.Center;
private RelativePosition verticalPosition = RelativePosition.Center;
+ private MenuStyle menuStyle = null;
+ private bool styleApplied = false;
/// <summary>
/// Creates a new instance of Menu.
Initialize();
}
+ /// <summary>
+ /// Creates a new instance of Menu.
+ /// </summary>
+ /// <param name="style">Creates Menu by special style defined in UX.</param>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public Menu(string style) : base(style)
+ {
+ Initialize();
+ }
+
+ /// <summary>
+ /// Creates a new instance of a Menu with style.
+ /// </summary>
+ /// <param name="style">A style applied to the newly created Menu.</param>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public Menu(MenuStyle style) : base(style)
+ {
+ Initialize();
+ }
+
/// <inheritdoc/>
[EditorBrowsable(EditorBrowsableState.Never)]
protected override void Dispose(DisposeTypes type)
base.Dispose(type);
}
+ /// <summary>
+ /// Applies style to MenuItem.
+ /// </summary>
+ /// <param name="viewStyle">The style to apply.</param>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void ApplyStyle(ViewStyle viewStyle)
+ {
+ styleApplied = false;
+
+ base.ApplyStyle(viewStyle);
+
+ menuStyle = viewStyle as MenuStyle;
+ if (menuStyle != null)
+ {
+ Content?.ApplyStyle(menuStyle.Content);
+ }
+
+ styleApplied = true;
+ }
+
/// <summary>The Menu's relative position to Anchor.</summary>
/// <since_tizen> 9 </since_tizen>
public enum RelativePosition
set
{
+ if (Content == null)
+ {
+ Content = CreateDefaultContent();
+ if (styleApplied && (menuStyle != null))
+ {
+ Content.ApplyStyle(menuStyle.Content);
+ }
+ }
+
if (menuItems != null)
{
foreach (var oldItem in menuItems)
{
- if (content.Children?.Contains(oldItem) == true)
+ if (Content.Children?.Contains(oldItem) == true)
{
- content.Remove(oldItem);
+ Content.Remove(oldItem);
}
}
}
if (menuItems == null)
{
+ Content.SetVisible(false);
return;
}
+ if (Content.Visibility == false)
+ {
+ Content.SetVisible(true);
+ }
+
foreach (var item in menuItems)
{
- content.Add(item);
+ Content.Add(item);
menuItemGroup.Add(item);
}
}
}
}
+ /// <summary>
+ /// Gets Menu style.
+ /// </summary>
+ /// <returns>The default Menu style.</returns>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ protected override ViewStyle CreateViewStyle()
+ {
+ return new MenuStyle();
+ }
/// <summary>
/// Content of Menu.
CalculateSizeAndPosition();
RegisterDefaultLabel();
- NotifyAccessibilityStatesChange(AccessibilityStates.Visible | AccessibilityStates.Showing, AccessibilityStatesNotifyMode.Recursive);
+ NotifyAccessibilityStatesChange(new AccessibilityStates(AccessibilityState.Visible, AccessibilityState.Showing), AccessibilityStatesNotifyMode.Recursive);
}
/// <summary>
{
Hide();
UnregisterDefaultLabel();
- NotifyAccessibilityStatesChange(AccessibilityStates.Visible | AccessibilityStates.Showing, AccessibilityStatesNotifyMode.Recursive);
+ NotifyAccessibilityStatesChange(new AccessibilityStates(AccessibilityState.Visible, AccessibilityState.Showing), AccessibilityStatesNotifyMode.Recursive);
Dispose();
}
WidthSpecification = LayoutParamPolicies.WrapContent;
HeightSpecification = LayoutParamPolicies.WrapContent;
- BackgroundColor = Color.Transparent;
-
// Menu is added to Anchor so Menu should exclude layouting because
// if Anchor has Layout, then Menu is displayed at an incorrect position.
ExcludeLayouting = true;
- Content = CreateDefaultContent();
-
Scrim = CreateDefaultScrim();
menuItemGroup = new MenuItemGroup();
ScrollingDirection = ScrollableBase.Direction.Vertical,
ScrollEnabled = true,
HideScrollbar = false,
-
- // FIXME: This color should be in DefaultThemeCommon.cs.
- BackgroundColor = new Color("#EEEFF1"),
+ ClippingMode = ClippingModeType.ClipChildren,
};
}
ExcludeLayouting = true,
BackgroundColor = Color.Transparent,
Size = new Size(NUIApplication.GetDefaultWindow().Size),
+ DispatchParentGestureEvents = false,
};
scrim.TouchEvent += (object source, TouchEventArgs e) =>
private void CalculateSizeAndPosition()
{
- CalculateMenuSize();
-
CalculateMenuPosition();
CalculateScrimPosition();
}
- // Calculate menu's size based on content's size
- private void CalculateMenuSize()
- {
- if (Content == null)
- {
- return;
- }
-
- if (Size2D.Equals(Content.Size2D) == false)
- {
- Size2D = new Size2D(Content.Size2D.Width, Content.Size2D.Height);
- }
- }
-
private View GetRootView()
{
View root = this;
// If there is not enought space, then menu's size can be also resized.
private void CalculateMenuPosition()
{
- if ((Anchor == null) || (Content == null))
+ if (Anchor == null)
{
return;
}
- if (Items == null)
+ if (SizeWidth.Equals(0) && SizeHeight.Equals(0))
{
return;
}
- if ((Size2D.Width == 0) && (Size2D.Height == 0))
- {
- return;
- }
-
- int menuScreenPosX = 0;
- int menuScreenPosY = 0;
+ float menuScreenPosX = 0;
+ float menuScreenPosY = 0;
if (HorizontalPositionToAnchor == RelativePosition.Start)
{
if (GetRootView().LayoutDirection == ViewLayoutDirectionType.LTR)
{
- menuScreenPosX = (int)Anchor.ScreenPosition.X - Size2D.Width;
+ menuScreenPosX = Anchor.ScreenPosition.X - SizeWidth;
}
else
{
- menuScreenPosX = (int)Anchor.ScreenPosition.X + Anchor.Margin.Start + Anchor.Size2D.Width + Anchor.Margin.End;
+ menuScreenPosX = Anchor.ScreenPosition.X + Anchor.Margin.Start + Anchor.SizeWidth + Anchor.Margin.End;
}
}
else if (HorizontalPositionToAnchor == RelativePosition.Center)
{
- menuScreenPosX = (int)Anchor.ScreenPosition.X + Anchor.Margin.Start + (Anchor.Size2D.Width / 2) - (Size2D.Width / 2);
+ menuScreenPosX = Anchor.ScreenPosition.X + Anchor.Margin.Start + (Anchor.SizeWidth / 2) - (SizeWidth / 2);
}
else
{
if (GetRootView().LayoutDirection == ViewLayoutDirectionType.LTR)
{
- menuScreenPosX = (int)Anchor.ScreenPosition.X + Anchor.Margin.Start + Anchor.Size2D.Width + Anchor.Margin.End;
+ menuScreenPosX = Anchor.ScreenPosition.X + Anchor.Margin.Start + Anchor.SizeWidth + Anchor.Margin.End;
}
else
{
- menuScreenPosX = (int)Anchor.ScreenPosition.X - Size2D.Width;
+ menuScreenPosX = Anchor.ScreenPosition.X - SizeWidth;
}
}
if (VerticalPositionToAnchor == RelativePosition.Start)
{
- menuScreenPosY = (int)Anchor.ScreenPosition.Y - Size2D.Height;
+ menuScreenPosY = Anchor.ScreenPosition.Y - SizeHeight;
}
else if (VerticalPositionToAnchor == RelativePosition.Center)
{
- menuScreenPosY = (int)Anchor.ScreenPosition.Y + Anchor.Margin.Top + (Anchor.Size2D.Height / 2) - (Size2D.Height / 2);
+ menuScreenPosY = Anchor.ScreenPosition.Y + Anchor.Margin.Top + (Anchor.SizeHeight / 2) - (SizeHeight / 2);
}
else
{
- menuScreenPosY = (int)Anchor.ScreenPosition.Y + Anchor.Margin.Top + Anchor.Size2D.Height + Anchor.Margin.Bottom;
+ menuScreenPosY = Anchor.ScreenPosition.Y + Anchor.Margin.Top + Anchor.SizeHeight + Anchor.Margin.Bottom;
}
- int menuSizeW = Size2D.Width;
- int menuSizeH = Size2D.Height;
+ float menuSizeW = SizeWidth;
+ float menuSizeH = SizeHeight;
// Check if menu is not inside parent's boundary in x coordinate system.
- if (menuScreenPosX + Size2D.Width > Window.Size.Width)
+ if (menuScreenPosX + SizeWidth > Window.Size.Width)
{
- menuScreenPosX = Window.Size.Width - Size2D.Width;
-
- if (menuScreenPosX < 0)
+ if (HorizontalPositionToAnchor == RelativePosition.Center)
{
- menuScreenPosX = 0;
- menuSizeW = Window.Size.Width;
+ menuScreenPosX = Window.Size.Width - SizeWidth;
+ }
+ else
+ {
+ menuSizeW = Window.Size.Width - menuScreenPosX;
}
}
- else if (menuScreenPosX < 0)
+ if (menuScreenPosX < 0)
{
menuScreenPosX = 0;
- menuSizeW = Window.Size.Width;
+
+ if (menuSizeW > Window.Size.Width)
+ {
+ menuSizeW = Window.Size.Width;
+ }
}
// Check if menu is not inside parent's boundary in y coordinate system.
- if (menuScreenPosY + Size2D.Height > Window.Size.Height)
+ if (menuScreenPosY + SizeHeight > Window.Size.Height)
{
- menuScreenPosY = Window.Size.Height - Size2D.Height;
-
- if (menuScreenPosY < 0)
+ if (VerticalPositionToAnchor == RelativePosition.Center)
{
- menuScreenPosY = 0;
- menuSizeH = Window.Size.Height;
+ menuScreenPosY = Window.Size.Height - SizeHeight;
+ }
+ else
+ {
+ menuSizeH = Window.Size.Height - menuScreenPosY;
}
}
- else if (menuScreenPosY < 0)
+ if (menuScreenPosY < 0)
{
menuScreenPosY = 0;
- menuSizeH = Window.Size.Height;
+
+ if (menuSizeH > Window.Size.Height)
+ {
+ menuSizeH = Window.Size.Height;
+ }
}
// Position is relative to parent's coordinate system.
var menuPosX = menuScreenPosX;
var menuPosY = menuScreenPosY;
- if ((Position2D.X != menuPosX) || (Position2D.Y != menuPosY) || (Size2D.Width != menuSizeW) || (Size2D.Height != menuSizeH))
+ if (!PositionX.Equals(menuPosX) || !PositionY.Equals(menuPosY) || !SizeWidth.Equals(menuSizeW) || !SizeHeight.Equals(menuSizeH))
{
- Position2D = new Position2D(menuPosX, menuPosY);
- Size2D = new Size2D(menuSizeW, menuSizeH);
+ Position = new Position(menuPosX, menuPosY);
+ Size = new Size(menuSizeW, menuSizeH);
}
}
}
// Menu's Position should be updated before doing this calculation.
- if ((Scrim.Position2D.X != -Position2D.X) || (Scrim.Position2D.Y != -Position2D.Y))
+ if (!Scrim.PositionX.Equals(-PositionX) || !Scrim.PositionY.Equals(-PositionY))
{
- Scrim.Position2D = new Position2D(-Position2D.X, -Position2D.Y);
+ Scrim.Position = new Position(-PositionX, -PositionY);
}
}
public override void OnInitialize()
{
base.OnInitialize();
- SetAccessibilityConstructor(Role.PopupMenu);
- AppendAccessibilityAttribute("sub-role", "Alert");
+ AccessibilityRole = Role.PopupMenu;
}
/// <summary>
/// Informs AT-SPI bridge about the set of AT-SPI states associated with this object.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
- protected override AccessibilityStates AccessibilityCalculateStates(ulong states)
+ protected override AccessibilityStates AccessibilityCalculateStates()
{
- var accessibilityStates = base.AccessibilityCalculateStates(states);
- FlagSetter(ref accessibilityStates, AccessibilityStates.Modal, true);
- return accessibilityStates;
+ var states = base.AccessibilityCalculateStates();
+
+ states[AccessibilityState.Modal] = true;
+
+ return states;
}
}
}