diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2017-12-14 14:43:25 +0200 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2017-12-14 14:43:25 +0200 |
| commit | e352c4e5f742585e4feeb2ca3183bd4d0282a567 (patch) | |
| tree | e93b09e5fc5ed12e0e4ae9b6d2e268e3bc0c5d1e /Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls | |
| parent | b6615cec573616c9b6469c010982dda689ee3844 (diff) | |
| download | Tango-e352c4e5f742585e4feeb2ca3183bd4d0282a567.tar.gz Tango-e352c4e5f742585e4feeb2ca3183bd4d0282a567.zip | |
Implemented new MDI Container Control !
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls')
3 files changed, 235 insertions, 0 deletions
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiChild.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiChild.cs new file mode 100644 index 000000000..469e3fda5 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiChild.cs @@ -0,0 +1,58 @@ +using MaterialDesignThemes.Wpf; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using Tango.Core.Commands; + +namespace Tango.MachineStudio.Common.Controls +{ + public class MdiChild : DependencyObject + { + public MdiChild() + { + + } + + public MdiChild(String header, FrameworkElement view) : this() + { + Header = header; + View = view; + } + + public PackIconKind Icon + { + get { return (PackIconKind)GetValue(IconProperty); } + set { SetValue(IconProperty, value); } + } + public static readonly DependencyProperty IconProperty = + DependencyProperty.Register("Icon", typeof(PackIconKind), typeof(MdiChild), new PropertyMetadata(PackIconKind.LaptopWindows)); + + public String Header + { + get { return (String)GetValue(HeaderProperty); } + set { SetValue(HeaderProperty, value); } + } + public static readonly DependencyProperty HeaderProperty = + DependencyProperty.Register("Header", typeof(String), typeof(MdiChild), new PropertyMetadata(null)); + + public FrameworkElement View + { + get { return (FrameworkElement)GetValue(ViewProperty); } + set { SetValue(ViewProperty, value); } + } + public static readonly DependencyProperty ViewProperty = + DependencyProperty.Register("View", typeof(FrameworkElement), typeof(MdiChild), new PropertyMetadata(null)); + + public Point Location + { + get { return (Point)GetValue(LocationProperty); } + set { SetValue(LocationProperty, value); } + } + public static readonly DependencyProperty LocationProperty = + DependencyProperty.Register("Location", typeof(Point), typeof(MdiChild), new PropertyMetadata(new Point())); + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml new file mode 100644 index 000000000..3896347fe --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml @@ -0,0 +1,75 @@ +<UserControl x:Class="Tango.MachineStudio.Common.Controls.MdiContainerControl" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" + xmlns:local="clr-namespace:Tango.MachineStudio.Common.Controls" + xmlns:converters="clr-namespace:Tango.MachineStudio.Common.Converters" + mc:Ignorable="d" + d:DesignHeight="300" d:DesignWidth="300" Background="White"> + + <UserControl.Resources> + <converters:PointToMarginConverter x:Key="PointToMarginConverter"></converters:PointToMarginConverter> + </UserControl.Resources> + + <Grid> + <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> + <ItemsControl ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=UserControl,Mode=FindAncestor},Path=ItemsSource}" x:Name="itemsControl"> + <ItemsControl.ItemsPanel> + <ItemsPanelTemplate> + <Canvas x:Name="canvas" HorizontalAlignment="Left" VerticalAlignment="Top"></Canvas> + </ItemsPanelTemplate> + </ItemsControl.ItemsPanel> + <ItemsControl.ItemContainerStyle> + <Style TargetType="FrameworkElement"> + <Setter Property="Canvas.Left" Value="{Binding Location.X}"></Setter> + <Setter Property="Canvas.Top" Value="{Binding Location.Y}"></Setter> + <EventSetter Event="PreviewMouseDown" Handler="OnControlMouseDown"></EventSetter> + </Style> + </ItemsControl.ItemContainerStyle> + <ItemsControl.ItemTemplate> + <DataTemplate> + <Grid> + <Grid.Effect> + <DropShadowEffect ShadowDepth="0" BlurRadius="10" /> + </Grid.Effect> + <Grid> + <Grid.RowDefinitions> + <RowDefinition Height="25"/> + <RowDefinition Height="277*"/> + </Grid.RowDefinitions> + + <Grid Background="{StaticResource AccentColorBrush}"> + <Thumb Opacity="0" DragDelta="OnControlDragging" Tag="{Binding}"></Thumb> + <DockPanel LastChildFill="False"> + <StackPanel IsHitTestVisible="False" DockPanel.Dock="Left" VerticalAlignment="Center" Orientation="Horizontal" Margin="5 0 0 0"> + <materialDesign:PackIcon Kind="{Binding Icon}" Foreground="White"></materialDesign:PackIcon> + <TextBlock Margin="5 0 0 0" VerticalAlignment="Center" Foreground="White" Text="{Binding Header}"></TextBlock> + </StackPanel> + + <StackPanel DockPanel.Dock="Right" VerticalAlignment="Center" Orientation="Horizontal"> + <Button Foreground="White" Style="{StaticResource MaterialDesignFlatButton}" ToolTip="Close" Width="24" Height="24" Padding="0" Click="OnControlClosed" Tag="{Binding}"> + <materialDesign:PackIcon Kind="WindowClose" /> + </Button> + </StackPanel> + </DockPanel> + </Grid> + + <Grid Grid.Row="1" MinWidth="100" MinHeight="100"> + <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> + <ContentPresenter Content="{Binding View}"></ContentPresenter> + </ScrollViewer> + + <Thumb HorizontalAlignment="Right" VerticalAlignment="Stretch" Opacity="0" Width="5" Cursor="SizeWE" DragDelta="OnControlSizeRight" Tag="{Binding}"></Thumb> + <Thumb HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Opacity="0" Height="5" Cursor="SizeNS" DragDelta="OnControlSizeBottom" Tag="{Binding}"></Thumb> + <Thumb HorizontalAlignment="Right" VerticalAlignment="Bottom" Opacity="0" Height="10" Width="10" Cursor="SizeNWSE" DragDelta="OnControlResize" Tag="{Binding}"></Thumb> + </Grid> + </Grid> + </Grid> + </DataTemplate> + </ItemsControl.ItemTemplate> + </ItemsControl> + </ScrollViewer> + </Grid> +</UserControl> diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml.cs new file mode 100644 index 000000000..dbf4ee74b --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Controls/MdiContainerControl.xaml.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using Tango.SharedUI.Helpers; + +namespace Tango.MachineStudio.Common.Controls +{ + /// <summary> + /// Interaction logic for MdiContainerControl.xaml + /// </summary> + public partial class MdiContainerControl : UserControl + { + private const int MIN_SIZE = 200; + + public MdiContainerControl() + { + InitializeComponent(); + } + + public IEnumerable ItemsSource + { + get { return (IEnumerable)GetValue(ItemsSourceProperty); } + set { SetValue(ItemsSourceProperty, value); } + } + public static readonly DependencyProperty ItemsSourceProperty = + DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(MdiContainerControl), new PropertyMetadata(null)); + + private void OnControlDragging(object sender, DragDeltaEventArgs e) + { + var mdiControl = GetSenderTag<MdiChild>(sender); + mdiControl.Location = new Point(mdiControl.Location.X + e.HorizontalChange, mdiControl.Location.Y + e.VerticalChange); + FitCanvas(); + } + + private T GetSenderTag<T>(object sender) where T : class + { + return (T)((sender as FrameworkElement).Tag); + } + + private void FitCanvas() + { + Canvas canvas = GetCanvas(); + canvas.Width = canvas.Children.OfType<FrameworkElement>().Max(x => Canvas.GetLeft(x) + x.ActualWidth); + canvas.Height = canvas.Children.OfType<FrameworkElement>().Max(x => Canvas.GetTop(x) + x.ActualHeight); + } + + private Canvas GetCanvas() + { + return UIHelper.FindChild<Canvas>(itemsControl, "canvas"); + } + + + private void OnControlMouseDown(object sender, MouseButtonEventArgs e) + { + Canvas.SetZIndex(sender as FrameworkElement, GetCanvas().Children.OfType<FrameworkElement>().Max(x => Canvas.GetZIndex(x) + 1)); + } + + private void OnControlSizeRight(object sender, DragDeltaEventArgs e) + { + var mdiControl = GetSenderTag<MdiChild>(sender); + if (double.IsNaN(mdiControl.View.Width)) mdiControl.View.Width = mdiControl.View.ActualWidth; + if (mdiControl.View.Width + e.HorizontalChange > MIN_SIZE) mdiControl.View.Width += e.HorizontalChange; + } + + private void OnControlSizeBottom(object sender, DragDeltaEventArgs e) + { + var mdiControl = GetSenderTag<MdiChild>(sender); + if (double.IsNaN(mdiControl.View.Height)) mdiControl.View.Height = mdiControl.View.ActualHeight; + if (mdiControl.View.Height + e.VerticalChange > MIN_SIZE) mdiControl.View.Height += e.VerticalChange; + } + + private void OnControlResize(object sender, DragDeltaEventArgs e) + { + var mdiControl = GetSenderTag<MdiChild>(sender); + + if (double.IsNaN(mdiControl.View.Height)) mdiControl.View.Height = mdiControl.View.ActualHeight; + if (double.IsNaN(mdiControl.View.Width)) mdiControl.View.Width = mdiControl.View.ActualWidth; + + if (mdiControl.View.Height + e.VerticalChange > MIN_SIZE) mdiControl.View.Height += e.VerticalChange; + if (mdiControl.View.Width + e.HorizontalChange > MIN_SIZE) mdiControl.View.Width += e.HorizontalChange; + } + + private void OnControlClosed(object sender, RoutedEventArgs e) + { + (ItemsSource as IList).Remove(GetSenderTag<MdiChild>(sender)); + } + } +} |
