aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DataCapture/Views/PlayingBarView.xaml
blob: ee423e67697ed9d6cee4cbc6c3e20ff3c8e6a5a6 (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
<UserControl x:Class="Tango.MachineStudio.DataCapture.Views.PlayingBarView"
             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:i="http://schemas.microsoft.com/expression/2010/interactivity"
             xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
             xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
             xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
             xmlns:vm="clr-namespace:Tango.MachineStudio.DataCapture.ViewModels"
             xmlns:video="clr-namespace:Tango.Video.DirectCapture;assembly=Tango.Video"
             xmlns:global="clr-namespace:Tango.MachineStudio.DataCapture"
             xmlns:local="clr-namespace:Tango.MachineStudio.DataCapture.Views"
             mc:Ignorable="d" 
             Width="350" Height="30" Background="{StaticResource AccentColorBrush}" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}">
    <Grid>
        <DockPanel>

            <StackPanel Orientation="Horizontal" DockPanel.Dock="Right">
                <TextBlock VerticalAlignment="Center" FontFamily="{StaticResource digital-7}" Foreground="#F6F6F6" FontSize="20">
                     <Run Text="{Binding Player.CurrentTime,Mode=OneWay,StringFormat=hh\\:mm\\:ss,FallbackValue='00:00:00'}"/>
                     <Run>/</Run>
                     <Run Text="{Binding Player.TotalTime,Mode=OneWay,StringFormat=hh\\:mm\\:ss,FallbackValue='00:00:00'}"/>
                </TextBlock>
            </StackPanel>

            <StackPanel Orientation="Horizontal" DockPanel.Dock="Left">
                <Button Command="{Binding MediaPlayPauseCommand}" Style="{StaticResource MaterialDesignFlatButton}" Padding="0" Width="30" Height="30" Foreground="White">
                    <materialDesign:PackIcon Width="30" Height="30">
                        <materialDesign:PackIcon.Style>
                            <Style TargetType="materialDesign:PackIcon">
                                <Setter Property="Kind" Value="Play"></Setter>
                                <Style.Triggers>
                                    <MultiDataTrigger>
                                        <MultiDataTrigger.Conditions>
                                            <Condition Binding="{Binding Player.IsPlaying}" Value="True" />
                                            <Condition Binding="{Binding Player.IsPaused}" Value="False" />
                                        </MultiDataTrigger.Conditions>
                                        <Setter Property="Kind" Value="Pause"></Setter>
                                    </MultiDataTrigger>
                                </Style.Triggers>
                            </Style>
                        </materialDesign:PackIcon.Style>
                    </materialDesign:PackIcon>
                </Button>
                <Button Command="{Binding MediaStopCommand}" Style="{StaticResource MaterialDesignFlatButton}" Padding="0" Width="30" Height="30" Foreground="White">
                    <materialDesign:PackIcon Kind="Stop" Width="30" Height="30" />
                </Button>
            </StackPanel>

            <Slider x:Name="slider" VerticalAlignment="Center" Margin="10 0 10 0" Foreground="White" Maximum="{Binding Player.TotalFrames}" Value="{Binding Player.CurrentFrame,Mode=OneWay}">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="PreviewMouseDown">
                        <i:InvokeCommandAction Command="{Binding MediaSeekHoldCommand}"></i:InvokeCommandAction>
                    </i:EventTrigger>
                    <i:EventTrigger EventName="PreviewMouseUp">
                        <i:InvokeCommandAction Command="{Binding MediaSeekCommand}" CommandParameter="{Binding ElementName=slider,Path=Value}"></i:InvokeCommandAction>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Slider>
        </DockPanel>
    </Grid>
</UserControl>
GetText result /// </summary> string lastGetTextResult; int lastGetTextRequestOffset; int gapBeginOffset; int gapEndOffset; int gapLength; // gapLength == gapEndOffset - gapBeginOffset /// <summary> /// when gap is too small for inserted text or gap is too large (exceeds maxGapLength), /// a new buffer is reallocated with a new gap of at least this size. /// </summary> const int minGapLength = 128; /// <summary> /// when the gap exceeds this size, reallocate a smaller buffer /// </summary> const int maxGapLength = 4096; public int Length { get { return buffer.Length - gapLength; } } /// <summary> /// Gets the buffer content. /// </summary> public string Text { get { if (textContent == null) textContent = GetText(0, Length); return textContent; } set { Debug.Assert(value != null); textContent = value; lastGetTextResult = null; buffer = new char[value.Length + minGapLength]; value.CopyTo(0, buffer, 0, value.Length); gapBeginOffset = value.Length; gapEndOffset = buffer.Length; gapLength = gapEndOffset - gapBeginOffset; } } public char GetCharAt(int offset) { return offset < gapBeginOffset ? buffer[offset] : buffer[offset + gapLength]; } public string GetText(int offset, int length) { if (length == 0) return string.Empty; if (lastGetTextRequestOffset == offset && lastGetTextResult != null && length == lastGetTextResult.Length) return lastGetTextResult; int end = offset + length; string result; if (end < gapBeginOffset) { result = new string(buffer, offset, length); } else if (offset > gapBeginOffset) { result = new string(buffer, offset + gapLength, length); } else { int block1Size = gapBeginOffset - offset; int block2Size = end - gapBeginOffset; StringBuilder buf = new StringBuilder(block1Size + block2Size); buf.Append(buffer, offset, block1Size); buf.Append(buffer, gapEndOffset, block2Size); result = buf.ToString(); } lastGetTextRequestOffset = offset; lastGetTextResult = result; return result; } /// <summary> /// Inserts text at the specified offset. /// </summary> public void Insert(int offset, string text) { Debug.Assert(offset >= 0 && offset <= Length); if (text.Length == 0) return; textContent = null; lastGetTextResult = null; PlaceGap(offset, text.Length); text.CopyTo(0, buffer, gapBeginOffset, text.Length); gapBeginOffset += text.Length; gapLength = gapEndOffset - gapBeginOffset; } /// <summary> /// Remove <paramref name="length"/> characters at <paramref name="offset"/>. /// Leave a gap of at least <paramref name="reserveGapSize"/>. /// </summary> public void Remove(int offset, int length, int reserveGapSize) { Debug.Assert(offset >= 0 && offset <= Length); Debug.Assert(length >= 0 && offset + length <= Length); Debug.Assert(reserveGapSize >= 0); if (length == 0) return; textContent = null; lastGetTextResult = null; PlaceGap(offset, reserveGapSize - length); gapEndOffset += length; // delete removed text gapLength = gapEndOffset - gapBeginOffset; if (gapLength - reserveGapSize > maxGapLength && gapLength - reserveGapSize > buffer.Length / 4) { // shrink gap MakeNewBuffer(gapBeginOffset, reserveGapSize + minGapLength); } } void PlaceGap(int newGapOffset, int minRequiredGapLength) { if (gapLength < minRequiredGapLength) { // enlarge gap MakeNewBuffer(newGapOffset, minRequiredGapLength + Math.Max(minGapLength, buffer.Length / 8)); } else { while (newGapOffset < gapBeginOffset) { buffer[--gapEndOffset] = buffer[--gapBeginOffset]; } while (newGapOffset > gapBeginOffset) { buffer[gapBeginOffset++] = buffer[gapEndOffset++]; } } } void MakeNewBuffer(int newGapOffset, int newGapLength) { char[] newBuffer = new char[Length + newGapLength]; Debug.WriteLine("GapTextBuffer was reallocated, new size=" + newBuffer.Length); if (newGapOffset < gapBeginOffset) { // gap is moving backwards // first part: Array.Copy(buffer, 0, newBuffer, 0, newGapOffset); // moving middle part: Array.Copy(buffer, newGapOffset, newBuffer, newGapOffset + newGapLength, gapBeginOffset - newGapOffset); // last part: Array.Copy(buffer, gapEndOffset, newBuffer, newBuffer.Length - (buffer.Length - gapEndOffset), buffer.Length - gapEndOffset); } else { // gap is moving forwards // first part: Array.Copy(buffer, 0, newBuffer, 0, gapBeginOffset); // moving middle part: Array.Copy(buffer, gapEndOffset, newBuffer, gapBeginOffset, newGapOffset - gapBeginOffset); // last part: int lastPartLength = newBuffer.Length - (newGapOffset + newGapLength); Array.Copy(buffer, buffer.Length - lastPartLength, newBuffer, newGapOffset + newGapLength, lastPartLength); } gapBeginOffset = newGapOffset; gapEndOffset = newGapOffset + newGapLength; gapLength = newGapLength; buffer = newBuffer; } } */ }