aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.RML/Views/ProcessParametersView.xaml
blob: 03bf655224f47a5cbf89082676cf86926e38f0f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<UserControl x:Class="Tango.MachineStudio.RML.Views.ProcessParametersView"
             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:global="clr-namespace:Tango.MachineStudio.RML"
             xmlns:observables="clr-namespace:Tango.BL.Entities;assembly=Tango.BL"
             xmlns:shapes="clr-namespace:Tango.SharedUI.Shapes;assembly=Tango.SharedUI"
             xmlns:controls="clr-namespace:Tango.SharedUI.Controls;assembly=Tango.SharedUI"
             xmlns:editors="clr-namespace:Tango.SharedUI.Editors;assembly=Tango.SharedUI"
             xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
             xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
             xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
             xmlns:dragAndDrop="clr-namespace:Tango.DragAndDrop;assembly=Tango.DragAndDrop"
             xmlns:vm="clr-namespace:Tango.MachineStudio.RML.ViewModels"
             xmlns:local="clr-namespace:Tango.MachineStudio.RML.Views"
             mc:Ignorable="d" 
             d:DesignHeight="1080" d:DesignWidth="1920" Background="Transparent" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MainViewVM}">

    <UserControl.Resources>
        <converters:ColorToIntegerConverter x:Key="ColorToIntegerConverter"></converters:ColorToIntegerConverter>
    </UserControl.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="416*"/>
            <RowDefinition Height="120"/>
        </Grid.RowDefinitions>
        <Grid  Grid.Row="0">
            <DockPanel>
                <Border DockPanel.Dock="Top" Background="{StaticResource TransparentBackgroundBrush200}" Margin="20 0" Padding="5" CornerRadius="5">
                    <Border.Effect>
                        <DropShadowEffect Opacity="0.4" />
                    </Border.Effect>
                    <Grid>
                        <TextBlock  VerticalAlignment="Center" HorizontalAlignment="Left" Margin="20 0 0 0" FontSize="16">ACTIVE PROCESS GROUP</TextBlock>
                        <Button ToolTip="Add new table" Style="{StaticResource MaterialDesignFlatButton}" Height="Auto" Width="30" HorizontalAlignment="Right" Padding="0" Command="{Binding AddProcessParametersTableCommand}">
                            <materialDesign:PackIcon Kind="Plus" Foreground="#0AC30A" Width="24" Height="24" />
                        </Button>
                    </Grid>
                </Border>
                <Grid>
                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0 20">
                        <ItemsControl ItemsSource="{Binding ActiveProcessParametersTableView}">
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <StackPanel HorizontalAlignment="Left" Orientation="Horizontal" />
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <DockPanel>
                                        <Button DockPanel.Dock="Right" Style="{StaticResource MaterialDesignFlatButton}" Padding="0" VerticalAlignment="Bottom" ToolTip="Remove table" Width="30" Margin="10 0 0 10" Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.RemoveProcessParametersTableCommand}" CommandParameter="{Binding}">
                                            <materialDesign:PackIcon Kind="Delete" Width="24" Height="24" Foreground="#FF7D7D" />
                                        </Button>

                                        <Grid Style="{StaticResource draggableDroppableGrid}" dragAndDrop:DragAndDropService.Drop="OnProcessTableDropped">
                                            <Border Padding="5" BorderThickness="1" Margin="20 5 0 5" BorderBrush="{StaticResource DarkGrayBrush}" Background="{StaticResource TransparentBackgroundBrush100}">
                                                <Grid>
                                                    <DockPanel Width="300">
                                                        <TextBox materialDesign:HintAssist.Hint="Table Name" DockPanel.Dock="Top" Text="{Binding Name}"></TextBox>

                                                        <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto" Padding="5">
                                                            <editors:ParameterizedEditor ParameterizedObject="{Binding}">
                                                                <editors:ParameterizedEditor.ItemsPanel>
                                                                    <ItemsPanelTemplate>
                                                                        <StackPanel IsItemsHost="True" />
                                                                    </ItemsPanelTemplate>
                                                                </editors:ParameterizedEditor.ItemsPanel>
                                                                <editors:ParameterizedEditor.DoubleTemplate>
                                                                    <DataTemplate>
                                                                        <DockPanel>
                                                                            <TextBlock IsHitTestVisible="False" Margin="0 5 0 5" Text="{Binding Name}" FontSize="11"></TextBlock>
                                                                            <mahapps:NumericUpDown HorizontalAlignment="Right" Minimum="0" Margin="0 0 5 0" HideUpDownButtons="True" HorizontalContentAlignment="Right" Maximum="10000" StringFormat="{Binding StringFormat}" InterceptArrowKeys="True" Background="Transparent" BorderThickness="0" InterceptMouseWheel="True" HasDecimals="True" Value="{Binding Value,Mode=TwoWay}"></mahapps:NumericUpDown>
                                                                        </DockPanel>
                                                                    </DataTemplate>
                                                                </editors:ParameterizedEditor.DoubleTemplate>
                                                            </editors:ParameterizedEditor>
                                                        </ScrollViewer>
                                                    </DockPanel>
                                                </Grid>
                                            </Border>

                                            <dragAndDrop:DragThumb Background="Transparent" Cursor="SizeAll" ToolTip="Drag and drop" Margin="0 3 -1 0" HorizontalAlignment="Right" VerticalAlignment="Top">
                                                <materialDesign:PackIcon HorizontalAlignment="Right" VerticalAlignment="Top" IsHitTestVisible="False" Kind="Drag" Width="32" Height="32" Background="Transparent" />
                                            </dragAndDrop:DragThumb>
                                        </Grid>
                                    </DockPanel>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </StackPanel>

                    <dragAndDrop:DraggingSurface x:Name="draggingSurface" ClipToBounds="True" />
                </Grid>
            </DockPanel>
        </Grid>
        <Grid Grid.Row="1">
            <DockPanel>
                <Grid>
                    <Grid  Margin="0 0 0 0">
                        <DockPanel>
                            <Border DockPanel.Dock="Top" Background="{StaticResource TransparentBackgroundBrush200}" Margin="20 0" Padding="5" CornerRadius="5">
                                <Border.Effect>
                                    <DropShadowEffect Opacity="0.4" />
                                </Border.Effect>
                                <Grid>
                                    <TextBlock HorizontalAlignment="Left" Margin="20 0 0 0" FontSize="16">LIQUID FACTORS</TextBlock>

                                    <Button ToolTip="Add new liquid factor" HorizontalAlignment="Right" Style="{StaticResource MaterialDesignFlatButton}" Height="Auto" VerticalAlignment="Bottom" Width="30" Padding="0" Command="{Binding AddLiquidFactorCommand}">
                                        <materialDesign:PackIcon Kind="Plus" Foreground="#0AC30A" Width="24" Height="24" />
                                    </Button>
                                </Grid>
                            </Border>
                            <ScrollViewer x:Name="liquidsFactorsScrollViewer" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Hidden" Margin="15 0 20 0">
                                <ItemsControl Width="{Binding WidthLilquidFactors, RelativeSource={RelativeSource AncestorType=UserControl}}" ItemsSource="{Binding LiquidTypesRmls}" Margin="0 10 0 0">
                                    <ItemsControl.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <UniformGrid IsItemsHost="True" Rows="1"></UniformGrid>
                                        </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                    <ItemsControl.ItemTemplate>
                                        <DataTemplate DataType="{x:Type observables:LiquidTypesRml}">
                                            <Grid Margin="20 0 20 0" MaxWidth="230">

                                                <Button HorizontalAlignment="Right" Style="{StaticResource MaterialDesignFlatButton}" Padding="0" ToolTip="Remove liquid factor" Width="30" Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.RemoveLiquidFactorCommand}" CommandParameter="{Binding}">
                                                    <materialDesign:PackIcon Kind="Delete" Foreground="#FF7D7D" />
                                                </Button>

                                                <StackPanel Margin="0 0 10 0">
                                                    <TextBlock HorizontalAlignment="Center" FontSize="10" Foreground="{StaticResource MainWindow.Foreground}" Text="{Binding LiquidType.Name}"></TextBlock>
                                                    <Grid Width="58" Height="48" Margin="0 5 0 0">
                                                        <shapes:Hexagon StrokeThickness="1" Stroke="Gray">
                                                            <shapes:Hexagon.Fill>
                                                                <LinearGradientBrush Opacity="0.7" >
                                                                    <GradientStop Color="{Binding LiquidType.Color,Converter={StaticResource ColorToIntegerConverter}}"/>
                                                                    <GradientStop Color="White" Offset="1"/>
                                                                </LinearGradientBrush>
                                                            </shapes:Hexagon.Fill>
                                                        </shapes:Hexagon>

                                                        <TextBox Style="{x:Null}" Background="Transparent" Foreground="{StaticResource Hexagon.ForegroundBrush}" BorderThickness="0" Text="{Binding MaxNlPerCm}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"  FontStyle="Italic"></TextBox>
                                                    </Grid>
                                                </StackPanel>
                                            </Grid>
                                        </DataTemplate>
                                    </ItemsControl.ItemTemplate>
                                </ItemsControl>
                            </ScrollViewer>
                        </DockPanel>
                    </Grid>
                </Grid>
            </DockPanel>
        </Grid>
    </Grid>
</UserControl>
) { Changed(this, new AXmlObjectEventArgs() { Object = this } ); } AXmlDocument doc = this.Document; if (doc != null) { doc.OnObjectChanged(this); } // As a convenience, also rasie an event for the parent element AXmlTag me = this as AXmlTag; if (me != null && (me.IsStartOrEmptyTag || me.IsEndTag) && me.Parent is AXmlElement) { me.Parent.OnChanged(); } } List<SyntaxError> syntaxErrors; /// <summary> /// The error that occured in the context of this node (excluding nested nodes) /// </summary> public IEnumerable<SyntaxError> MySyntaxErrors { get { if (syntaxErrors == null) { return new SyntaxError[] {}; } else { return syntaxErrors; } } } /// <summary> /// The error that occured in the context of this node and all nested nodes. /// It has O(n) cost. /// </summary> public IEnumerable<SyntaxError> SyntaxErrors { get { return GetSelfAndAllChildren().SelectMany(obj => obj.MySyntaxErrors); } } internal void AddSyntaxError(SyntaxError error) { DebugAssert(error.Object == this, "Must own the error"); if (this.syntaxErrors == null) this.syntaxErrors = new List<SyntaxError>(); syntaxErrors.Add(error); } /// <summary> Throws exception if condition is false </summary> /// <remarks> Present in release mode - use only for very cheap aserts </remarks> protected static void Assert(bool condition, string message) { if (!condition) { throw new InternalException("Assertion failed: " + message); } } /// <summary> Throws exception if condition is false </summary> [Conditional("DEBUG")] protected static void DebugAssert(bool condition, string message) { if (!condition) { throw new InternalException("Assertion failed: " + message); } } /// <summary> Recursively gets self and all nested nodes. </summary> [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification = "Using a method makes the API look more LINQ-like and indicates that the returned collection is computed every time.")] public virtual IEnumerable<AXmlObject> GetSelfAndAllChildren() { return new AXmlObject[] { this }; } /// <summary> Get all ancestors of this node </summary> [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification = "Using a method makes the API look more LINQ-like and indicates that the returned collection is computed every time.")] public IEnumerable<AXmlObject> GetAncestors() { AXmlObject curr = this.Parent; while(curr != null) { yield return curr; curr = curr.Parent; } } /// <summary> Call appropriate visit method on the given visitor </summary> public abstract void AcceptVisitor(IAXmlVisitor visitor); /// <summary> The parser tree object this object was updated from </summary> /// <remarks> Initialized to 'this' </remarks> internal AXmlObject LastUpdatedFrom { get; private set; } internal bool IsCached { get; set; } /// <summary> Is call to UpdateDataFrom is allowed? </summary> internal bool CanUpdateDataFrom(AXmlObject source) { return this.GetType() == source.GetType() && this.StartOffset == source.StartOffset && (this.LastUpdatedFrom == source || !this.IsCached); } /// <summary> Copy all data from the 'source' to this object </summary> /// <remarks> Returns true if any updates were done </remarks> internal virtual bool UpdateDataFrom(AXmlObject source) { Assert(this.GetType() == source.GetType(), "Source has different type"); DebugAssert(this.StartOffset == source.StartOffset, "Source has different StartOffset"); if (this.LastUpdatedFrom == source) { DebugAssert(this.EndOffset == source.EndOffset, "Source has different EndOffset"); return false; } Assert(!this.IsCached, "Can not update cached item"); Assert(source.IsCached, "Must update from cache"); this.LastUpdatedFrom = source; this.StartOffset = source.StartOffset; // In some cases we are just updating objects of that same // type and position and hoping to be luckily right this.EndOffset = source.EndOffset; // Do not bother comparing - assume changed if non-null if (this.syntaxErrors != null || source.syntaxErrors != null) { // May be called again in derived class - oh, well, does not matter OnChanging(); this.Document.Parser.TrackedSegments.RemoveSyntaxErrorsOf(this); if (source.syntaxErrors == null) { this.syntaxErrors = null; } else { this.syntaxErrors = new List<SyntaxError>(); foreach(var error in source.MySyntaxErrors) { // The object differs, so create our own copy // The source still might need it in the future and we do not want to break it this.AddSyntaxError(error.Clone(this)); } } this.Document.Parser.TrackedSegments.AddSyntaxErrorsOf(this); OnChanged(); } return true; } /// <summary> Verify that the item is consistent. Only in debug build. </summary> [Conditional("DEBUG")] internal virtual void DebugCheckConsistency(bool allowNullParent) { } /// <inheritdoc/> public override string ToString() { return string.Format(CultureInfo.InvariantCulture, "{0}({1}-{2})", this.GetType().Name.Remove(0, 4), this.StartOffset, this.EndOffset); } #region Helpper methods /// <summary> The part of name before ":" </summary> /// <returns> Empty string if not found </returns> protected static string GetNamespacePrefix(string name) { if (string.IsNullOrEmpty(name)) return string.Empty; int colonIndex = name.IndexOf(':'); if (colonIndex != -1) { return name.Substring(0, colonIndex); } else { return string.Empty; } } /// <summary> The part of name after ":" </summary> /// <returns> Whole name if ":" not found </returns> protected static string GetLocalName(string name) { if (string.IsNullOrEmpty(name)) return string.Empty; int colonIndex = name.IndexOf(':'); if (colonIndex != -1) { return name.Remove(0, colonIndex + 1); } else { return name ?? string.Empty; } } #endregion } }