diff options
60 files changed, 1861 insertions, 54 deletions
diff --git a/Software/Graphics/Mobile/logging_module.png b/Software/Graphics/Mobile/logging_module.png Binary files differnew file mode 100644 index 000000000..3f8318f70 --- /dev/null +++ b/Software/Graphics/Mobile/logging_module.png diff --git a/Software/Graphics/Mobile/no-permissions.png b/Software/Graphics/Mobile/no-permissions.png Binary files differnew file mode 100644 index 000000000..405b94a26 --- /dev/null +++ b/Software/Graphics/Mobile/no-permissions.png diff --git a/Software/Visual_Studio/Build/Shortcuts/Machine Emulator.lnk b/Software/Visual_Studio/Build/Shortcuts/Machine Emulator.lnk Binary files differindex 83636b215..391bb5fd2 100644 --- a/Software/Visual_Studio/Build/Shortcuts/Machine Emulator.lnk +++ b/Software/Visual_Studio/Build/Shortcuts/Machine Emulator.lnk diff --git a/Software/Visual_Studio/Build/Shortcuts/Machine Studio.lnk b/Software/Visual_Studio/Build/Shortcuts/Machine Studio.lnk Binary files differindex fdcc9c9f3..96a6550d7 100644 --- a/Software/Visual_Studio/Build/Shortcuts/Machine Studio.lnk +++ b/Software/Visual_Studio/Build/Shortcuts/Machine Studio.lnk diff --git a/Software/Visual_Studio/Build/Shortcuts/Proto Compiler GUI.lnk b/Software/Visual_Studio/Build/Shortcuts/Proto Compiler GUI.lnk Binary files differindex bbe8a4be2..98e7572e8 100644 --- a/Software/Visual_Studio/Build/Shortcuts/Proto Compiler GUI.lnk +++ b/Software/Visual_Studio/Build/Shortcuts/Proto Compiler GUI.lnk diff --git a/Software/Visual_Studio/Build/Shortcuts/Stubs Execution GUI.lnk b/Software/Visual_Studio/Build/Shortcuts/Stubs Execution GUI.lnk Binary files differindex 8da1d6aa3..26bdb7c64 100644 --- a/Software/Visual_Studio/Build/Shortcuts/Stubs Execution GUI.lnk +++ b/Software/Visual_Studio/Build/Shortcuts/Stubs Execution GUI.lnk diff --git a/Software/Visual_Studio/Build/Shortcuts/Transport Router.lnk b/Software/Visual_Studio/Build/Shortcuts/Transport Router.lnk Binary files differindex 51ce1a265..355f4b364 100644 --- a/Software/Visual_Studio/Build/Shortcuts/Transport Router.lnk +++ b/Software/Visual_Studio/Build/Shortcuts/Transport Router.lnk diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/Tango.MachineStudio.Logging.csproj b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/Tango.MachineStudio.Logging.csproj index b81ba731d..b5108b75a 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/Tango.MachineStudio.Logging.csproj +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/Tango.MachineStudio.Logging.csproj @@ -83,10 +83,6 @@ <Compile Include="LoggingModule.cs" /> <Compile Include="Navigation\LoggingNavigationManager.cs" /> <Compile Include="Navigation\LoggingNavigationView.cs" /> - <Compile Include="Parsing\ApplicationLogFileParser.cs" /> - <Compile Include="Parsing\EmbeddedLogFileParser.cs" /> - <Compile Include="Parsing\ILogFileParser.cs" /> - <Compile Include="Parsing\LogFile.cs" /> <Compile Include="ViewModelLocator.cs" /> <Compile Include="ViewModels\EmbeddedLogsViewVM.cs" /> <Compile Include="ViewModels\ApplicationLogsViewVM.cs" /> @@ -254,7 +250,7 @@ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> + <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/ViewModels/ApplicationLogsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/ViewModels/ApplicationLogsViewVM.cs index 3e0e3ab84..91cc677e0 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/ViewModels/ApplicationLogsViewVM.cs +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/ViewModels/ApplicationLogsViewVM.cs @@ -10,7 +10,6 @@ using Tango.Core.Commands; using Tango.Logging; using Tango.MachineStudio.Common.Notifications; using Tango.MachineStudio.Logging.Navigation; -using Tango.MachineStudio.Logging.Parsing; using Tango.MachineStudio.Logging.Views; using Tango.SharedUI; using Tango.SharedUI.Components; @@ -105,7 +104,6 @@ namespace Tango.MachineStudio.Logging.ViewModels set { _maxDate = value; RaisePropertyChangedAuto(); } } - private bool _isRealTime; public bool IsRealTime { diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/ViewModels/EmbeddedLogsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/ViewModels/EmbeddedLogsViewVM.cs index 3f6775b75..d8ecca4bb 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/ViewModels/EmbeddedLogsViewVM.cs +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/ViewModels/EmbeddedLogsViewVM.cs @@ -5,12 +5,12 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Core.Commands; +using Tango.Integration.Logging; using Tango.Integration.Operation; using Tango.Logging; using Tango.MachineStudio.Common.Notifications; using Tango.MachineStudio.Common.StudioApplication; using Tango.MachineStudio.Logging.Navigation; -using Tango.MachineStudio.Logging.Parsing; using Tango.MachineStudio.Logging.Views; using Tango.SharedUI; diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/App.xaml b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/App.xaml new file mode 100644 index 000000000..66ea48976 --- /dev/null +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/App.xaml @@ -0,0 +1,11 @@ +<Application x:Class="Tango.PPC.Logging.App" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> + <Application.Resources> + <ResourceDictionary> + <ResourceDictionary.MergedDictionaries> + <ResourceDictionary Source="pack://application:,,,/Tango.PPC.Common;component/Resources/Merged.xaml" /> + </ResourceDictionary.MergedDictionaries> + </ResourceDictionary> + </Application.Resources> +</Application>
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Images/logging_module.png b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Images/logging_module.png Binary files differnew file mode 100644 index 000000000..3f8318f70 --- /dev/null +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Images/logging_module.png diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/LoggingModule.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/LoggingModule.cs new file mode 100644 index 000000000..78c597e81 --- /dev/null +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/LoggingModule.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Media.Imaging; +using Tango.BL.Enumerations; +using Tango.PPC.Common; +using Tango.PPC.Logging.Views; +using Tango.SharedUI.Helpers; + +namespace Tango.PPC.Logging +{ + [PPCModule(5)] + public class LoggingModule : PPCModuleBase + { + public override string Name => "Logging"; + public override string Description => "PPC logging module."; + public override BitmapSource Image => ResourceHelper.GetImageFromResources("Images/logging_module.png"); + public override Type MainViewType => typeof(MainView); + public override Permissions Permission => Permissions.RunPPC; + + public LoggingModule() + { + IsVisibleInMenu = false; + } + + public override void OnTechnicianEntered() + { + base.OnTechnicianEntered(); + + IsVisibleInMenu = true; + } + + public override void OnTechnicianExited() + { + base.OnTechnicianExited(); + + IsVisibleInMenu = false; + } + + public override void Dispose() + { + + } + } +} diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Properties/AssemblyInfo.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..612af80ce --- /dev/null +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Tango PPC Logging Module")] +[assembly: AssemblyVersion("2.0.4.1119")] + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Properties/Resources.Designer.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Properties/Resources.Designer.cs new file mode 100644 index 000000000..6cbf8164a --- /dev/null +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Properties/Resources.Designer.cs @@ -0,0 +1,62 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace Tango.PPC.Logging.Properties { + + + /// <summary> + /// A strongly-typed resource class, for looking up localized strings, etc. + /// </summary> + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// <summary> + /// Returns the cached ResourceManager instance used by this class. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if ((resourceMan == null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Tango.PPC.Logging.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// <summary> + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Properties/Resources.resx b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Properties/Resources.resx new file mode 100644 index 000000000..af7dbebba --- /dev/null +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Properties/Resources.resx @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root>
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Properties/Settings.Designer.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Properties/Settings.Designer.cs new file mode 100644 index 000000000..ab102e0eb --- /dev/null +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace Tango.PPC.Logging.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Properties/Settings.settings b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Properties/Settings.settings new file mode 100644 index 000000000..033d7a5e9 --- /dev/null +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Properties/Settings.settings @@ -0,0 +1,7 @@ +<?xml version='1.0' encoding='utf-8'?> +<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)"> + <Profiles> + <Profile Name="(Default)" /> + </Profiles> + <Settings /> +</SettingsFile>
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Tango.PPC.Logging.csproj b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Tango.PPC.Logging.csproj new file mode 100644 index 000000000..cc6394c9f --- /dev/null +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Tango.PPC.Logging.csproj @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{D2EE865B-B006-487A-9487-60A663636AC3}</ProjectGuid> + <OutputType>library</OutputType> + <RootNamespace>Tango.PPC.Logging</RootNamespace> + <AssemblyName>Tango.PPC.Logging</AssemblyName> + <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>..\..\..\Build\PPC\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>..\..\..\Build\PPC\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="System" /> + <Reference Include="System.Data" /> + <Reference Include="System.Xml" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="System.Core" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + <Reference Include="System.Net.Http" /> + <Reference Include="System.Xaml"> + <RequiredTargetFramework>4.0</RequiredTargetFramework> + </Reference> + <Reference Include="WindowsBase" /> + <Reference Include="PresentationCore" /> + <Reference Include="PresentationFramework" /> + </ItemGroup> + <ItemGroup> + <Compile Include="..\..\..\Versioning\GlobalVersionInfo.cs"> + <Link>GlobalVersionInfo.cs</Link> + </Compile> + <Compile Include="LoggingModule.cs" /> + <Compile Include="Properties\AssemblyInfo.cs"> + <SubType>Code</SubType> + </Compile> + <Compile Include="Properties\Resources.Designer.cs"> + <AutoGen>True</AutoGen> + <DesignTime>True</DesignTime> + <DependentUpon>Resources.resx</DependentUpon> + </Compile> + <Compile Include="Properties\Settings.Designer.cs"> + <AutoGen>True</AutoGen> + <DependentUpon>Settings.settings</DependentUpon> + <DesignTimeSharedInput>True</DesignTimeSharedInput> + </Compile> + <Compile Include="ViewModelLocator.cs" /> + <Compile Include="ViewModels\MainViewVM.cs" /> + <Compile Include="Views\MainView.xaml.cs"> + <DependentUpon>MainView.xaml</DependentUpon> + </Compile> + <EmbeddedResource Include="Properties\Resources.resx"> + <Generator>ResXFileCodeGenerator</Generator> + <LastGenOutput>Resources.Designer.cs</LastGenOutput> + </EmbeddedResource> + <None Include="Properties\Settings.settings"> + <Generator>SettingsSingleFileGenerator</Generator> + <LastGenOutput>Settings.Designer.cs</LastGenOutput> + </None> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\..\Tango.BL\Tango.BL.csproj"> + <Project>{F441FEEE-322A-4943-B566-110E12FD3B72}</Project> + <Name>Tango.BL</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.Core\Tango.Core.csproj"> + <Project>{A34EE0F0-649D-41C8-8489-B6F1CC6924EE}</Project> + <Name>Tango.Core</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.SharedUI\Tango.SharedUI.csproj"> + <Project>{8491D07B-C1F6-4B62-A412-41B9FD2D6538}</Project> + <Name>Tango.SharedUI</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.Touch\Tango.Touch.csproj"> + <Project>{fd86424c-6e84-491b-8df9-3d0f5c236a2a}</Project> + <Name>Tango.Touch</Name> + </ProjectReference> + <ProjectReference Include="..\..\Tango.PPC.Common\Tango.PPC.Common.csproj"> + <Project>{0BE74EEE-22CB-4DBA-B896-793B9E1A3AC0}</Project> + <Name>Tango.PPC.Common</Name> + </ProjectReference> + </ItemGroup> + <ItemGroup> + <Resource Include="Images\logging_module.png" /> + </ItemGroup> + <ItemGroup> + <Page Include="App.xaml"> + <Generator>MSBuild:Compile</Generator> + <SubType>Designer</SubType> + </Page> + <Page Include="Views\MainView.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> +</Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/ViewModelLocator.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/ViewModelLocator.cs new file mode 100644 index 000000000..d86a0d2ab --- /dev/null +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/ViewModelLocator.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Core.DI; +using Tango.PPC.Logging.ViewModels; + +namespace Tango.PPC.Logging +{ + public static class ViewModelLocator + { + /// <summary> + /// Initializes a new instance of the ViewModelLocator class. + /// </summary> + static ViewModelLocator() + { + TangoIOC.Default.Register<MainViewVM>(); + } + + /// <summary> + /// Gets the main view VM. + /// </summary> + public static MainViewVM MainViewVM + { + get + { + return TangoIOC.Default.GetInstance<MainViewVM>(); + } + } + } +} diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/ViewModels/MainViewVM.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/ViewModels/MainViewVM.cs new file mode 100644 index 000000000..736bff5a2 --- /dev/null +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/ViewModels/MainViewVM.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.PPC.Common; + +namespace Tango.PPC.Logging.ViewModels +{ + public class MainViewVM : PPCViewModel + { + public override void OnApplicationStarted() + { + + } + } +} diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Views/MainView.xaml b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Views/MainView.xaml new file mode 100644 index 000000000..fb4dd5d04 --- /dev/null +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Views/MainView.xaml @@ -0,0 +1,45 @@ +<UserControl x:Class="Tango.PPC.Logging.Views.MainView" + 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:sys="clr-namespace:System;assembly=mscorlib" + xmlns:vm="clr-namespace:Tango.PPC.Logging.ViewModels" + xmlns:touch="clr-namespace:Tango.Touch.Controls;assembly=Tango.Touch" + xmlns:global="clr-namespace:Tango.PPC.Logging" + xmlns:local="clr-namespace:Tango.PPC.Logging.Views" + mc:Ignorable="d" + d:DesignHeight="1280" d:DesignWidth="800" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MainViewVM}"> + <Grid Background="{StaticResource TangoMidBackgroundBrush}"> + <Grid.RowDefinitions> + <RowDefinition Height="Auto"/> + <RowDefinition Height="1*"/> + </Grid.RowDefinitions> + + <Border Padding="20" Background="{StaticResource TangoPrimaryBackgroundBrush}" BorderThickness="0 0 0 1" BorderBrush="{StaticResource TangoDividerBrush}"> + <Border.Effect> + <DropShadowEffect Color="Silver" ShadowDepth="0" BlurRadius="20" Opacity="1" /> + </Border.Effect> + <TextBlock VerticalAlignment="Center" FontSize="{StaticResource TangoHeaderFontSize}" FontWeight="SemiBold">Logs</TextBlock> + </Border> + + <Grid Grid.Row="1"> + + <DockPanel> + <DockPanel DockPanel.Dock="Top"> + <touch:TouchNavigationLinks Margin="20" FontSize="{StaticResource TangoNavigationLinksFontSize}"> + <sys:String>Application</sys:String> + <sys:String>Embedded</sys:String> + </touch:TouchNavigationLinks> + + <touch:TouchDatePicker SelectedDate="12/15/2018" Height="40" /> + </DockPanel> + + <Grid> + + </Grid> + </DockPanel> + + </Grid> + </Grid> +</UserControl> diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Views/MainView.xaml.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Views/MainView.xaml.cs new file mode 100644 index 000000000..eb448c67c --- /dev/null +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.Logging/Views/MainView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +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; + +namespace Tango.PPC.Logging.Views +{ + /// <summary> + /// Interaction logic for MainView.xaml + /// </summary> + public partial class MainView : UserControl + { + public MainView() + { + InitializeComponent(); + } + } +} diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/IPPCApplicationManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/IPPCApplicationManager.cs index 003229e65..5f0b35ce2 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/IPPCApplicationManager.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/IPPCApplicationManager.cs @@ -61,6 +61,16 @@ namespace Tango.PPC.Common.Application void Restart(); /// <summary> + /// Enteres the application technician mode. + /// </summary> + void EnterTechnicianMode(); + + /// <summary> + /// Exits the application technician mode. + /// </summary> + void ExitTechnicianMode(); + + /// <summary> /// Gets the application version. /// </summary> Version Version { get; } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/IPPCModule.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/IPPCModule.cs index 7bee755a2..51f361cfb 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/IPPCModule.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/IPPCModule.cs @@ -40,5 +40,20 @@ namespace Tango.PPC.Common /// Gets the permission required to see and load this module. /// </summary> Permissions Permission { get; } + + /// <summary> + /// Gets a value indicating whether this module should be displayed in the application menu. + /// </summary> + bool IsVisibleInMenu { get; } + + /// <summary> + /// Called when the application has entered the technician mode. + /// </summary> + void OnTechnicianEntered(); + + /// <summary> + /// Called when the application has exited the technician mode. + /// </summary> + void OnTechnicianExited(); } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Navigation/NavigationView.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Navigation/NavigationView.cs index 3c3a6e19b..2c6e8d4c1 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Navigation/NavigationView.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Navigation/NavigationView.cs @@ -13,6 +13,7 @@ namespace Tango.PPC.Common.Navigation { LoadingView, LoadingErrorView, + NoPermissionsView, LayoutView, LoginView, MachineSetupView, diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCModuleBase.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCModuleBase.cs index 316236626..5aa003c1e 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCModuleBase.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCModuleBase.cs @@ -17,6 +17,16 @@ namespace Tango.PPC.Common /// <seealso cref="Tango.MachineStudio.Common.IStudioModule" /> public abstract class PPCModuleBase : ExtendedObject, IPPCModule { + private bool _isVisibleInMenu = true; + /// <summary> + /// Gets a value indicating whether this module should be displayed in the application menu. + /// </summary> + public bool IsVisibleInMenu + { + get { return _isVisibleInMenu; } + protected set { _isVisibleInMenu = value; RaisePropertyChangedAuto(); } + } + /// <summary> /// Gets the module name. /// </summary> @@ -46,5 +56,21 @@ namespace Tango.PPC.Common /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// </summary> public abstract void Dispose(); + + /// <summary> + /// Called when the application has entered the technician mode. + /// </summary> + public virtual void OnTechnicianEntered() + { + + } + + /// <summary> + /// Called when the application has exited the technician mode. + /// </summary> + public virtual void OnTechnicianExited() + { + + } } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Images/no-permissions.png b/Software/Visual_Studio/PPC/Tango.PPC.UI/Images/no-permissions.png Binary files differnew file mode 100644 index 000000000..405b94a26 --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Images/no-permissions.png diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/MainWindow.xaml.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/MainWindow.xaml.cs index 219c25f45..302e401fb 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/MainWindow.xaml.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/MainWindow.xaml.cs @@ -15,6 +15,8 @@ using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; +using Tango.Core.DI; +using Tango.PPC.Common.Application; using Tango.Touch.Helpers; namespace Tango.PPC.UI @@ -24,6 +26,8 @@ namespace Tango.PPC.UI /// </summary> public partial class MainWindow : Window { + private String _technician_mode_buffer; + public static MainWindow Instance { get; private set; } public MainWindow() @@ -32,6 +36,8 @@ namespace Tango.PPC.UI InitializeComponent(); + _technician_mode_buffer = String.Empty; + #if !DESKTOP if (TouchHelper.IsTouchEnabled()) { @@ -62,5 +68,34 @@ namespace Tango.PPC.UI { Environment.Exit(0); } + + protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e) + { + base.OnPreviewKeyDown(e); + + try + { + _technician_mode_buffer += Char.Parse(e.Key.ToString()); + } + catch{} + + if (e.Key == Key.Return || e.Key == Key.Tab) + { + if (_technician_mode_buffer.ToLower().Contains("ENTERTECHNICIAN".ToLower())) + { + _technician_mode_buffer = String.Empty; + TangoIOC.Default.GetInstance<IPPCApplicationManager>().EnterTechnicianMode(); + e.Handled = true; + } + else if (_technician_mode_buffer.ToLower().Contains("EXITTECHNICIAN".ToLower())) + { + _technician_mode_buffer = String.Empty; + TangoIOC.Default.GetInstance<IPPCApplicationManager>().ExitTechnicianMode(); + e.Handled = true; + } + + _technician_mode_buffer = String.Empty; + } + } } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Navigation/DefaultNavigationManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/Navigation/DefaultNavigationManager.cs index efe8149f6..fe3cabcc1 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Navigation/DefaultNavigationManager.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Navigation/DefaultNavigationManager.cs @@ -90,15 +90,23 @@ namespace Tango.PPC.UI.Navigation _lastFullPath = null; var firstModule = _moduleLoader.UserModules.FirstOrDefault(); - var moduleAtt = firstModule.GetType().GetCustomAttribute<PPCModuleAttribute>(); - if (moduleAtt != null) + if (firstModule != null) { - return NavigateTo(firstModule.GetType(), pushToHistory, moduleAtt.HomeViewName); + var moduleAtt = firstModule.GetType().GetCustomAttribute<PPCModuleAttribute>(); + + if (moduleAtt != null) + { + return NavigateTo(firstModule.GetType(), pushToHistory, moduleAtt.HomeViewName); + } + else + { + return NavigateTo(firstModule.GetType(), pushToHistory); + } } else { - return NavigateTo(firstModule.GetType(), pushToHistory); + return NavigateTo(NavigationView.NoPermissionsView); } } else diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/PPCApplication/DefaultPPCApplicationManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/PPCApplication/DefaultPPCApplicationManager.cs index f8a0fdc36..f9830940b 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/PPCApplication/DefaultPPCApplicationManager.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/PPCApplication/DefaultPPCApplicationManager.cs @@ -26,6 +26,7 @@ using Tango.PPC.Common.Threading; using System.Diagnostics; using Tango.PPC.Common.EventLogging; using Tango.BL.Enumerations; +using Tango.PPC.Common.Notifications; namespace Tango.PPC.UI.PPCApplication { @@ -41,6 +42,8 @@ namespace Tango.PPC.UI.PPCApplication private Machine _machine; private IDispatcherProvider _dispatcher; private IEventLogger _eventLogger; + private IPPCModuleLoader _moduleLoader; + private INotificationProvider _notificationProvider; /// <summary> /// Occurs when the application has started. @@ -102,12 +105,13 @@ namespace Tango.PPC.UI.PPCApplication /// <summary> /// Initializes a new instance of the <see cref="DefaultPPCApplicationManager"/> class. /// </summary> - public DefaultPPCApplicationManager(IMachineProvider machineProvider, IDispatcherProvider dispatcherProvider, IEventLogger eventLogger) + public DefaultPPCApplicationManager(IMachineProvider machineProvider, IDispatcherProvider dispatcherProvider, IEventLogger eventLogger, IPPCModuleLoader moduleLoader, INotificationProvider notificationProvider) { + _notificationProvider = notificationProvider; _machineProvider = machineProvider; _dispatcher = dispatcherProvider; _eventLogger = eventLogger; - ; + _moduleLoader = moduleLoader; if (!DesignMode) { @@ -320,5 +324,23 @@ namespace Tango.PPC.UI.PPCApplication Process.Start(Application.ResourceAssembly.Location); Environment.Exit(0); } + + /// <summary> + /// Enteres the application technician mode. + /// </summary> + public void EnterTechnicianMode() + { + _moduleLoader.AllModules.ToList().ForEach(x => x.OnTechnicianEntered()); + _notificationProvider.ShowInfo("Technician mode is now enabled."); + } + + /// <summary> + /// Exits the application technician mode. + /// </summary> + public void ExitTechnicianMode() + { + _moduleLoader.AllModules.ToList().ForEach(x => x.OnTechnicianExited()); + _notificationProvider.ShowInfo("Technician mode is now disabled."); + } } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Tango.PPC.UI.csproj b/Software/Visual_Studio/PPC/Tango.PPC.UI/Tango.PPC.UI.csproj index 406568f71..836878152 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Tango.PPC.UI.csproj +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Tango.PPC.UI.csproj @@ -143,6 +143,7 @@ <Compile Include="ViewModels\MachineSetupViewVM.cs" /> <Compile Include="ViewModels\MainViewVM.cs" /> <Compile Include="ViewModels\MachineUpdateViewVM.cs" /> + <Compile Include="ViewModels\NoPermissionsViewVM.cs" /> <Compile Include="ViewsContracts\ILayoutView.cs" /> <Compile Include="ViewsContracts\IMachineSetupView.cs" /> <Compile Include="ViewsContracts\IMachineUpdateView.cs" /> @@ -170,6 +171,9 @@ <Compile Include="Views\MachineUpdateView.xaml.cs"> <DependentUpon>MachineUpdateView.xaml</DependentUpon> </Compile> + <Compile Include="Views\NoPermissionsView.xaml.cs"> + <DependentUpon>NoPermissionsView.xaml</DependentUpon> + </Compile> <Page Include="Connectivity\WiFiAuthenticationView.xaml"> <SubType>Designer</SubType> <Generator>MSBuild:Compile</Generator> @@ -234,6 +238,10 @@ <SubType>Designer</SubType> <Generator>MSBuild:Compile</Generator> </Page> + <Page Include="Views\NoPermissionsView.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> </ItemGroup> <ItemGroup> <Compile Include="Properties\AssemblyInfo.cs"> @@ -339,6 +347,10 @@ <Project>{096f16c8-6d06-4b5f-9496-b9d2df2d94a3}</Project> <Name>Tango.PPC.Jobs</Name> </ProjectReference> + <ProjectReference Include="..\Modules\Tango.PPC.Logging\Tango.PPC.Logging.csproj"> + <Project>{d2ee865b-b006-487a-9487-60a663636ac3}</Project> + <Name>Tango.PPC.Logging</Name> + </ProjectReference> <ProjectReference Include="..\Modules\Tango.PPC.MachineSettings\Tango.PPC.MachineSettings.csproj"> <Project>{91b70e9b-66a7-4873-ae10-400e71cf404f}</Project> <Name>Tango.PPC.MachineSettings</Name> @@ -397,6 +409,7 @@ <Link>Tango.ColorLib.dll</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> + <Resource Include="Images\no-permissions.png" /> <Resource Include="Images\GlobalStatus\machine-off.png" /> <Resource Include="Images\machine-update-firmware.png" /> <Resource Include="Images\chip_128px.png" /> @@ -472,7 +485,7 @@ del "$(TargetDir)firmware_package.tfp"</PostBuildEvent> </PropertyGroup> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> + <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModelLocator.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModelLocator.cs index 645456216..9b4c17831 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModelLocator.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModelLocator.cs @@ -95,6 +95,7 @@ namespace Tango.PPC.UI TangoIOC.Default.Register<MachineSetupViewVM>(); TangoIOC.Default.Register<MachineUpdateViewVM>(); TangoIOC.Default.Register<LoadingErrorViewVM>(); + TangoIOC.Default.Register<NoPermissionsViewVM>(); TangoIOC.Default.GetInstance<IPPCApplicationManager>().ContentRendered += (_, __) => @@ -176,5 +177,13 @@ namespace Tango.PPC.UI return TangoIOC.Default.GetInstance<LoadingErrorViewVM>(); } } + + public static NoPermissionsViewVM NoPermissionsViewVM + { + get + { + return TangoIOC.Default.GetInstance<NoPermissionsViewVM>(); + } + } } }
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoadingViewVM.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoadingViewVM.cs index 281e54958..516349a18 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoadingViewVM.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoadingViewVM.cs @@ -20,6 +20,7 @@ using Tango.PPC.Common.Notifications.NotificationItems; using Tango.PPC.Jobs; using Tango.SharedUI; using System.Data.Entity; +using Tango.BL.Enumerations; namespace Tango.PPC.UI.ViewModels { @@ -79,6 +80,7 @@ namespace Tango.PPC.UI.ViewModels if (db.Users.Count() == 1 || machine.AutoLogin) { var user = await db.Users.FirstAsync(); + LogManager.Log($"Application started. Single user/Auto login detected ({user.Email}). Skipping LoginView..."); await AuthenticationProvider.Login(user.Email, user.Password, false); IsLoading = false; diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoginViewVM.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoginViewVM.cs index 9d17a4a76..aa9689ef3 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoginViewVM.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoginViewVM.cs @@ -11,6 +11,8 @@ using System.ComponentModel.DataAnnotations; using Tango.SharedUI.Helpers; using Tango.PPC.Common.Authentication; using Tango.BL.Entities; +using Tango.BL.Enumerations; +using Tango.Logging; namespace Tango.PPC.UI.ViewModels { @@ -89,9 +91,19 @@ namespace Tango.PPC.UI.ViewModels base.OnApplicationReady(); await Task.Delay(500); - LogManager.Log("Application is ready! Navigating to home module..."); - await NavigationManager.NavigateTo(NavigationView.HomeModule); - IsLoading = false; + + if (AuthenticationProvider.CurrentUser != null && AuthenticationProvider.CurrentUser.HasPermission(Permissions.RunPPC)) + { + LogManager.Log("Application is ready! Navigating to home module..."); + await NavigationManager.NavigateTo(NavigationView.HomeModule); + IsLoading = false; + } + else + { + LogManager.Log("Application is ready! The logged in user does not have permission to run the application!", LogCategory.Warning); + await NavigationManager.NavigateTo(NavigationView.NoPermissionsView); + IsLoading = false; + } } #endregion diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/NoPermissionsViewVM.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/NoPermissionsViewVM.cs new file mode 100644 index 000000000..cea8a7d63 --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/NoPermissionsViewVM.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Core.Commands; +using Tango.PPC.Common; + +namespace Tango.PPC.UI.ViewModels +{ + public class NoPermissionsViewVM : PPCViewModel + { + public RelayCommand RestartCommand { get; set; } + + public NoPermissionsViewVM() + { + RestartCommand = new RelayCommand(Restart); + } + + private void Restart() + { + ApplicationManager.Restart(); + } + + public override void OnApplicationStarted() + { + + } + } +} diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/LayoutView.xaml b/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/LayoutView.xaml index 98451dacb..b89b2c9de 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/LayoutView.xaml +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/LayoutView.xaml @@ -49,13 +49,15 @@ <ItemsControl ItemsSource="{Binding ModuleLoader.UserModules}"> <ItemsControl.ItemTemplate> <DataTemplate> - <Border BorderBrush="{StaticResource TangoDividerBrush}" BorderThickness="0 1 0 0"> - <touch:TouchButton Margin="0 0 0 0" Padding="30" Foreground="{StaticResource TangoDarkForegroundBrush}" Style="{StaticResource TangoFlatButton}" FontSize="{StaticResource TangoHeaderFontSize}" Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.ModuleNavigationCommand}" CommandParameter="{Binding Name}"> - <StackPanel Orientation="Horizontal" HorizontalAlignment="Left"> - <Image VerticalAlignment="Center" Source="{Binding Image}" Width="48" Height="48"></Image> - <TextBlock VerticalAlignment="Center" Margin="20 0 0 0" Text="{Binding Name}"></TextBlock> - </StackPanel> - </touch:TouchButton> + <Border> + <Border BorderBrush="{StaticResource TangoDividerBrush}" BorderThickness="0 1 0 0" Visibility="{Binding IsVisibleInMenu,Converter={StaticResource BooleanToVisibilityConverter}}"> + <touch:TouchButton Margin="0 0 0 0" Padding="30" Foreground="{StaticResource TangoDarkForegroundBrush}" Style="{StaticResource TangoFlatButton}" FontSize="{StaticResource TangoHeaderFontSize}" Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.ModuleNavigationCommand}" CommandParameter="{Binding Name}"> + <StackPanel Orientation="Horizontal" HorizontalAlignment="Left"> + <Image VerticalAlignment="Center" Source="{Binding Image}" Width="48" Height="48"></Image> + <TextBlock VerticalAlignment="Center" Margin="20 0 0 0" Text="{Binding Name}"></TextBlock> + </StackPanel> + </touch:TouchButton> + </Border> </Border> </DataTemplate> </ItemsControl.ItemTemplate> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/MainView.xaml b/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/MainView.xaml index e684f4969..9df92bbcc 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/MainView.xaml +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/MainView.xaml @@ -83,6 +83,7 @@ <controls:NavigationControl TransitionAlwaysFades="True" KeepElementsAttached="True" TransitionType="Zoom" x:Name="NavigationControl" x:FieldModifier="public"> <local:LoadingView></local:LoadingView> <local:LoadingErrorView></local:LoadingErrorView> + <local:NoPermissionsView></local:NoPermissionsView> <local:LoginView></local:LoginView> <local:LayoutView></local:LayoutView> <local:ExternalBridgeView></local:ExternalBridgeView> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/NoPermissionsView.xaml b/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/NoPermissionsView.xaml new file mode 100644 index 000000000..95839453a --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/NoPermissionsView.xaml @@ -0,0 +1,27 @@ +<UserControl x:Class="Tango.PPC.UI.Views.NoPermissionsView" + 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:vm="clr-namespace:Tango.PPC.UI.ViewModels" + xmlns:global="clr-namespace:Tango.PPC.UI" + xmlns:touch="clr-namespace:Tango.Touch.Controls;assembly=Tango.Touch" + xmlns:local="clr-namespace:Tango.PPC.UI.Views" + mc:Ignorable="d" + d:DesignHeight="1280" d:DesignWidth="800" d:DataContext="{d:DesignInstance Type=vm:NoPermissionsViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.NoPermissionsViewVM}"> + <Grid> + <DockPanel Margin="20 60 20 20"> + <StackPanel DockPanel.Dock="Top"> + <Image Source="../Images/no-permissions.png" Width="256" RenderOptions.BitmapScalingMode="Fant" Stretch="Uniform" HorizontalAlignment="Center"></Image> + <TextBlock HorizontalAlignment="Center" Margin="0 40 0 0" FontSize="{StaticResource TangoHeaderFontSize}">No Application Modules Loaded</TextBlock> + <TextBlock TextWrapping="Wrap" TextAlignment="Center" HorizontalAlignment="Center" Margin="0 20 0 0" FontSize="{StaticResource TangoTitleFontSize}">The current user does not seems to have a permission to load any of the application modules. Please contact your administrator.</TextBlock> + </StackPanel> + + <Grid> + <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Width="320"> + <touch:TouchButton Command="{Binding RestartCommand}" Padding="0 30" CornerRadius="40">RESTART</touch:TouchButton> + </StackPanel> + </Grid> + </DockPanel> + </Grid> +</UserControl> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/NoPermissionsView.xaml.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/NoPermissionsView.xaml.cs new file mode 100644 index 000000000..0bbaee554 --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/NoPermissionsView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +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; + +namespace Tango.PPC.UI.Views +{ + /// <summary> + /// Interaction logic for NoPermissionsView.xaml + /// </summary> + public partial class NoPermissionsView : UserControl + { + public NoPermissionsView() + { + InitializeComponent(); + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/Parsing/EmbeddedLogFileParser.cs b/Software/Visual_Studio/Tango.Integration/Logging/EmbeddedLogFileParser.cs index 50c9d7532..98a3ac543 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/Parsing/EmbeddedLogFileParser.cs +++ b/Software/Visual_Studio/Tango.Integration/Logging/EmbeddedLogFileParser.cs @@ -10,7 +10,7 @@ using Tango.Integration.Operation; using Tango.Logging; using Tango.Settings; -namespace Tango.MachineStudio.Logging.Parsing +namespace Tango.Integration.Logging { public class EmbeddedLogFileParser : ILogFileParser<EmbeddedLogItem> { diff --git a/Software/Visual_Studio/Tango.Integration/Operation/EmbeddedLogItem.cs b/Software/Visual_Studio/Tango.Integration/Logging/EmbeddedLogItem.cs index a644b071d..607472e82 100644 --- a/Software/Visual_Studio/Tango.Integration/Operation/EmbeddedLogItem.cs +++ b/Software/Visual_Studio/Tango.Integration/Logging/EmbeddedLogItem.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; using Tango.Logging; using Tango.PMR.Debugging; -namespace Tango.Integration.Operation +namespace Tango.Integration.Logging { public class EmbeddedLogItem : MessageLogItem { diff --git a/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs b/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs index 991442510..45b2943c1 100644 --- a/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs +++ b/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs @@ -31,6 +31,7 @@ using Tango.Core.Threading; using Tango.PMR.IO; using Tango.Integration.Upgrade; using Tango.PMR.FirmwareUpgrade; +using Tango.Integration.Logging; namespace Tango.Integration.Operation { diff --git a/Software/Visual_Studio/Tango.Integration/Tango.Integration.csproj b/Software/Visual_Studio/Tango.Integration/Tango.Integration.csproj index 865738305..8edb04384 100644 --- a/Software/Visual_Studio/Tango.Integration/Tango.Integration.csproj +++ b/Software/Visual_Studio/Tango.Integration/Tango.Integration.csproj @@ -87,8 +87,9 @@ <Compile Include="ExtensionMethods\IExternalBridgeClientExtensions.cs" /> <Compile Include="ExternalBridge\ExternalBridgeClientConnectedEventArgs.cs" /> <Compile Include="IntegrationSettings.cs" /> + <Compile Include="Logging\EmbeddedLogFileParser.cs" /> <Compile Include="Operation\DefaultMachineEventsStateProvider.cs" /> - <Compile Include="Operation\EmbeddedLogItem.cs" /> + <Compile Include="Logging\EmbeddedLogItem.cs" /> <Compile Include="Operation\SpoolChangeRequiredEventArgs.cs" /> <Compile Include="Upgrade\FirmwareUpgradeHandler.cs" /> <Compile Include="Upgrade\FirmwareUpgradeProgressEventArgs.cs" /> @@ -167,7 +168,7 @@ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> + <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/Parsing/ApplicationLogFileParser.cs b/Software/Visual_Studio/Tango.Logging/ApplicationLogFileParser.cs index d3b33c436..2870ce95d 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/Parsing/ApplicationLogFileParser.cs +++ b/Software/Visual_Studio/Tango.Logging/ApplicationLogFileParser.cs @@ -8,7 +8,7 @@ using System.Text.RegularExpressions; using System.Threading.Tasks; using Tango.Logging; -namespace Tango.MachineStudio.Logging.Parsing +namespace Tango.Logging { public class ApplicationLogFileParser : ILogFileParser<LogItemBase> { @@ -20,11 +20,11 @@ namespace Tango.MachineStudio.Logging.Parsing String logFile = logger != null ? logger.LogFile : null; - foreach (var file in Directory.GetFiles(FileLogger.DefaultLogsFolder, "*.log").Where(x => Path.GetFileName(x).StartsWith("Tango.MachineStudio.UI") && x != logger.LogFile)) + foreach (var file in Directory.GetFiles(FileLogger.DefaultLogsFolder, "*.log").Where(x => Path.GetFileName(x).StartsWith(logger.Tag) && x != logger.LogFile)) { try { - String dateString = Path.GetFileNameWithoutExtension(file).Replace("Tango.MachineStudio.UI-", ""); + String dateString = Path.GetFileNameWithoutExtension(file).Replace($"{logger.Tag}-", ""); DateTime date = DateTime.ParseExact(dateString, "dd-MM-yyyy_HH-mm-ss", CultureInfo.InvariantCulture); logFiles.Add(new LogFile() { DateTime = date, File = file }); } diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/Parsing/ILogFileParser.cs b/Software/Visual_Studio/Tango.Logging/ILogFileParser.cs index 05003c1a2..bc43c7cd0 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/Parsing/ILogFileParser.cs +++ b/Software/Visual_Studio/Tango.Logging/ILogFileParser.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Tango.MachineStudio.Logging.Parsing +namespace Tango.Logging { public interface ILogFileParser<T> { diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/Parsing/LogFile.cs b/Software/Visual_Studio/Tango.Logging/LogFile.cs index 4248bdbdc..66988b7ed 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/Parsing/LogFile.cs +++ b/Software/Visual_Studio/Tango.Logging/LogFile.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Tango.MachineStudio.Logging.Parsing +namespace Tango.Logging { public class LogFile { diff --git a/Software/Visual_Studio/Tango.Logging/Tango.Logging.csproj b/Software/Visual_Studio/Tango.Logging/Tango.Logging.csproj index d67cd8f69..311579625 100644 --- a/Software/Visual_Studio/Tango.Logging/Tango.Logging.csproj +++ b/Software/Visual_Studio/Tango.Logging/Tango.Logging.csproj @@ -64,6 +64,9 @@ <Compile Include="LogItemBase.cs" /> <Compile Include="LogManager.cs" /> <Compile Include="MessageLogItem.cs" /> + <Compile Include="ApplicationLogFileParser.cs" /> + <Compile Include="ILogFileParser.cs" /> + <Compile Include="LogFile.cs" /> <Compile Include="ProducerConsumerQueue.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="SimpleStringLogger.cs" /> @@ -78,7 +81,7 @@ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> + <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/Tango.Touch/Controls/TouchCalendar.cs b/Software/Visual_Studio/Tango.Touch/Controls/TouchCalendar.cs new file mode 100644 index 000000000..a26cb6710 --- /dev/null +++ b/Software/Visual_Studio/Tango.Touch/Controls/TouchCalendar.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +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; + +namespace Tango.Touch.Controls +{ + public class TouchCalendar : Calendar + { + static TouchCalendar() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(TouchCalendar), new FrameworkPropertyMetadata(typeof(TouchCalendar))); + } + + public TouchCalendar() + { + + } + } +} diff --git a/Software/Visual_Studio/Tango.Touch/Controls/TouchCalendar.xaml b/Software/Visual_Studio/Tango.Touch/Controls/TouchCalendar.xaml new file mode 100644 index 000000000..0bac1a801 --- /dev/null +++ b/Software/Visual_Studio/Tango.Touch/Controls/TouchCalendar.xaml @@ -0,0 +1,634 @@ +<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:components="clr-namespace:Tango.Touch.Components" + xmlns:converters="clr-namespace:Tango.Touch.Converters" + xmlns:local="clr-namespace:Tango.Touch.Controls"> + + <ResourceDictionary.MergedDictionaries> + <ResourceDictionary Source="../Resources/Colors.xaml" /> + <ResourceDictionary Source="../Resources/Fonts.xaml" /> + <ResourceDictionary Source="../Controls/Shared.xaml" /> + </ResourceDictionary.MergedDictionaries> + + <converters:DateTimeToCalendarHeaderConverter x:Key="DateTimeToCalendarHeaderConverter" /> + + <Style x:Key="TouchCalendarButton" TargetType="{x:Type CalendarButton}"> + <Setter Property="MinWidth" Value="5"/> + <Setter Property="MinHeight" Value="5"/> + <Setter Property="FontSize" Value="{StaticResource TangoDefaultFontSize}"/> + <Setter Property="Cursor" Value="Hand"/> + <Setter Property="Background" Value="Transparent"/> + <Setter Property="Margin" Value="10"/> + <Setter Property="Width" Value="48" /> + <Setter Property="Height" Value="48" /> + <Setter Property="HorizontalContentAlignment" Value="Center"/> + <Setter Property="VerticalContentAlignment" Value="Center"/> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="{x:Type CalendarButton}"> + <Grid> + <VisualStateManager.VisualStateGroups> + <VisualStateGroup x:Name="CommonStates"> + <VisualStateGroup.Transitions> + <VisualTransition GeneratedDuration="0:0:0.1"/> + </VisualStateGroup.Transitions> + <VisualState x:Name="Normal"/> + <VisualState x:Name="MouseOver"> + <Storyboard> + <DoubleAnimation Duration="0" To="0.5" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="HighlightBackground"/> + </Storyboard> + </VisualState> + <VisualState x:Name="Pressed"> + <Storyboard> + <DoubleAnimation Duration="0" To="0.5" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="HighlightBackground"/> + </Storyboard> + </VisualState> + <VisualState x:Name="Disabled"> + <Storyboard> + <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="HighlightBackground"/> + <DoubleAnimation Duration="0" To=".35" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="NormalText"/> + </Storyboard> + </VisualState> + </VisualStateGroup> + <VisualStateGroup x:Name="SelectionStates"> + <VisualStateGroup.Transitions> + <VisualTransition GeneratedDuration="0"/> + </VisualStateGroup.Transitions> + <VisualState x:Name="Unselected"/> + <VisualState x:Name="Selected"> + <Storyboard> + <DoubleAnimation Duration="0" To=".75" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="SelectedBackground"/> + <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(TextElement.Foreground)" Storyboard.TargetName="NormalText"> + <DiscreteObjectKeyFrame Value="{StaticResource TangoPrimaryAccentBrush}" KeyTime="0" /> + </ObjectAnimationUsingKeyFrames> + </Storyboard> + </VisualState> + </VisualStateGroup> + <VisualStateGroup x:Name="CalendarButtonFocusStates"> + <VisualStateGroup.Transitions> + <VisualTransition GeneratedDuration="0"/> + </VisualStateGroup.Transitions> + <VisualState x:Name="CalendarButtonFocused"> + <Storyboard> + <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="DayButtonFocusVisual"> + <DiscreteObjectKeyFrame KeyTime="0"> + <DiscreteObjectKeyFrame.Value> + <Visibility>Visible</Visibility> + </DiscreteObjectKeyFrame.Value> + </DiscreteObjectKeyFrame> + </ObjectAnimationUsingKeyFrames> + </Storyboard> + </VisualState> + <VisualState x:Name="CalendarButtonUnfocused"> + <Storyboard> + <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="DayButtonFocusVisual"> + <DiscreteObjectKeyFrame KeyTime="0"> + <DiscreteObjectKeyFrame.Value> + <Visibility>Collapsed</Visibility> + </DiscreteObjectKeyFrame.Value> + </DiscreteObjectKeyFrame> + </ObjectAnimationUsingKeyFrames> + </Storyboard> + </VisualState> + </VisualStateGroup> + <VisualStateGroup x:Name="ActiveStates"> + <VisualStateGroup.Transitions> + <VisualTransition GeneratedDuration="0"/> + </VisualStateGroup.Transitions> + <VisualState x:Name="Active"/> + <VisualState x:Name="Inactive" /> + </VisualStateGroup> + </VisualStateManager.VisualStateGroups> + <Border> + <components:Ripple RippleBrush="#20202020" CornerRadius="30"> + <Grid> + <Ellipse x:Name="TodayBackground" + Fill="{DynamicResource PrimaryHueLightBrush}" + Opacity="0" /> + <Ellipse x:Name="SelectedBackground" + Fill="{DynamicResource PrimaryHueMidBrush}" + Opacity="0" /> + <Border BorderBrush="{TemplateBinding BorderBrush}" + BorderThickness="{TemplateBinding BorderThickness}" + Background="{TemplateBinding Background}" /> + <Ellipse x:Name="HighlightBackground" + Fill="{DynamicResource PrimaryHueDarkBrush}" + Opacity="0" /> + <ContentPresenter x:Name="NormalText" + TextElement.Foreground="{TemplateBinding Foreground}" + HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" + Margin="5,1,5,1" + VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> + <Ellipse x:Name="DayButtonFocusVisual" + Stroke="{DynamicResource PrimaryHueDarkBrush}" + Opacity="0" + Visibility="Collapsed" + StrokeThickness="1" /> + </Grid> + </components:Ripple> + </Border> + </Grid> + </ControlTemplate> + </Setter.Value> + </Setter> + <Style.Triggers> + <Trigger Property="IsInactive" + Value="True"> + <Setter Property="MinHeight" + Value="0" /> + <Setter Property="MaxHeight" + Value="0" /> + </Trigger> + </Style.Triggers> + </Style> + + <Style x:Key="TouchCalendarDayButton" TargetType="{x:Type CalendarDayButton}"> + <Setter Property="Foreground" Value="{DynamicResource TangoDarkForegroundBrush}"/> + <Setter Property="MinWidth" Value="5"/> + <Setter Property="MinHeight" Value="5"/> + <Setter Property="FontSize" Value="{StaticResource TangoDefaultFontSize}"/> + <Setter Property="Cursor" Value="Hand" /> + <Setter Property="Margin" Value="2 5"/> + <Setter Property="Width" Value="40" /> + <Setter Property="Focusable" Value="False" /> + <Setter Property="Height" Value="40" /> + <Setter Property="HorizontalContentAlignment" Value="Center"/> + <Setter Property="VerticalContentAlignment" Value="Center"/> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="{x:Type CalendarDayButton}"> + <Grid> + <VisualStateManager.VisualStateGroups> + <VisualStateGroup x:Name="CommonStates"> + <VisualStateGroup.Transitions> + <VisualTransition GeneratedDuration="0:0:0.1"/> + </VisualStateGroup.Transitions> + <VisualState x:Name="Normal"/> + <VisualState x:Name="MouseOver"> + <Storyboard> + <DoubleAnimation Duration="0" To="0.5" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="HighlightBackground"/> + </Storyboard> + </VisualState> + <VisualState x:Name="Pressed"> + <Storyboard> + <DoubleAnimation Duration="0" To="0.5" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="HighlightBackground"/> + </Storyboard> + </VisualState> + </VisualStateGroup> + <VisualStateGroup x:Name="SelectionStates"> + <VisualStateGroup.Transitions> + <VisualTransition GeneratedDuration="0"/> + </VisualStateGroup.Transitions> + <VisualState x:Name="Unselected"/> + <VisualState x:Name="Selected"> + <Storyboard> + <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="SelectedBackground"/> + <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(TextElement.Foreground)" Storyboard.TargetName="NormalText"> + <DiscreteObjectKeyFrame Value="{StaticResource TangoPrimaryBackgroundBrush}" KeyTime="0" /> + </ObjectAnimationUsingKeyFrames> + </Storyboard> + </VisualState> + </VisualStateGroup> + <VisualStateGroup x:Name="CalendarButtonFocusStates"> + <VisualStateGroup.Transitions> + <VisualTransition GeneratedDuration="0"/> + </VisualStateGroup.Transitions> + <VisualState x:Name="CalendarButtonFocused"> + <Storyboard> + <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="DayButtonFocusVisual"> + <DiscreteObjectKeyFrame KeyTime="0"> + <DiscreteObjectKeyFrame.Value> + <Visibility>Visible</Visibility> + </DiscreteObjectKeyFrame.Value> + </DiscreteObjectKeyFrame> + </ObjectAnimationUsingKeyFrames> + </Storyboard> + </VisualState> + <VisualState x:Name="CalendarButtonUnfocused"> + <Storyboard> + <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Visibility" Storyboard.TargetName="DayButtonFocusVisual"> + <DiscreteObjectKeyFrame KeyTime="0"> + <DiscreteObjectKeyFrame.Value> + <Visibility>Collapsed</Visibility> + </DiscreteObjectKeyFrame.Value> + </DiscreteObjectKeyFrame> + </ObjectAnimationUsingKeyFrames> + </Storyboard> + </VisualState> + </VisualStateGroup> + <VisualStateGroup x:Name="ActiveStates"> + <VisualStateGroup.Transitions> + <VisualTransition GeneratedDuration="0"/> + </VisualStateGroup.Transitions> + <VisualState x:Name="Active"/> + <VisualState x:Name="Inactive"/> + </VisualStateGroup> + <VisualStateGroup x:Name="DayStates"> + <VisualStateGroup.Transitions> + <VisualTransition GeneratedDuration="0"/> + </VisualStateGroup.Transitions> + <VisualState x:Name="RegularDay"/> + <VisualState x:Name="Today"> + <Storyboard> + <DoubleAnimation Duration="0" To=".75" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="TodayBackground"/> + <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(TextElement.Foreground)" Storyboard.TargetName="NormalText"> + <DiscreteObjectKeyFrame Value="{StaticResource TangoDarkForegroundBrush}" KeyTime="0" /> + </ObjectAnimationUsingKeyFrames> + </Storyboard> + </VisualState> + </VisualStateGroup> + <VisualStateGroup x:Name="BlackoutDayStates"> + <VisualStateGroup.Transitions> + <VisualTransition GeneratedDuration="0"/> + </VisualStateGroup.Transitions> + <VisualState x:Name="NormalDay"/> + <VisualState x:Name="BlackoutDay"> + <Storyboard> + <DoubleAnimation Duration="0" + To="0" + Storyboard.TargetProperty="Opacity" + Storyboard.TargetName="HighlightingBorder"/> + <DoubleAnimation Duration="0" + To="0.38" + Storyboard.TargetProperty="Opacity" + Storyboard.TargetName="NormalText" /> + </Storyboard> + </VisualState> + </VisualStateGroup> + </VisualStateManager.VisualStateGroups> + <Grid> + <Ellipse x:Name="TodayBackground" + Fill="{StaticResource TangoPrimaryAccentBrush}" + Opacity="0" /> + <Ellipse x:Name="SelectedBackground" + Fill="{StaticResource TangoPrimaryAccentBrush}" + Opacity="0" /> + <Border BorderBrush="{TemplateBinding BorderBrush}" + BorderThickness="{TemplateBinding BorderThickness}" + Background="{TemplateBinding Background}"/> + <Border x:Name="HighlightingBorder" + Opacity="1"> + <Ellipse x:Name="HighlightBackground" + Fill="{StaticResource TangoPrimaryAccentBrush}" + Opacity="0"/> + </Border> + <ContentPresenter x:Name="NormalText" + TextElement.Foreground="{TemplateBinding Foreground}" + HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" + Margin="5,1,5,1" + VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> + <Ellipse x:Name="DayButtonFocusVisual" + Stroke="{DynamicResource TangoPrimaryAccentBrush}" + Opacity="0" + Visibility="Collapsed" + StrokeThickness="1"/> + </Grid> + </Grid> + </ControlTemplate> + </Setter.Value> + </Setter> + <Style.Triggers> + <Trigger Property="IsInactive" + Value="True"> + <Setter Property="MinHeight" + Value="0" /> + <Setter Property="MaxHeight" + Value="0" /> + </Trigger> + <Trigger Property="IsBlackedOut" + Value="True"> + <Setter Property="Cursor" + Value="No" /> + </Trigger> + </Style.Triggers> + </Style> + + <Style x:Key="TouchCalendarItem" TargetType="{x:Type CalendarItem}"> + <Setter Property="Margin" Value="0"></Setter> + <Setter Property="BorderThickness" Value="0"/> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="{x:Type CalendarItem}"> + <ControlTemplate.Resources> + <SineEase x:Key="EasingFunction" EasingMode="EaseOut"/> + <CubicEase x:Key="EasingFunctionIn" EasingMode="EaseIn"/> + + <DataTemplate x:Key="{x:Static CalendarItem.DayTitleTemplateResourceKey}"> + <TextBlock Foreground="{StaticResource TangoGrayTextBrush}" + Opacity="0.65" + FontWeight="Bold" + FontSize="{StaticResource TangoDefaultFontSize}" + HorizontalAlignment="Center" VerticalAlignment="Center" + Margin="0,6,0,6" + Text="{Binding [0]}"/> + </DataTemplate> + </ControlTemplate.Resources> + <Grid x:Name="PART_Root"> + <Grid.Resources> + <SolidColorBrush x:Key="DisabledColor" Color="#A5FFFFFF"/> + </Grid.Resources> + <VisualStateManager.VisualStateGroups> + <VisualStateGroup x:Name="CommonStates"> + <VisualState x:Name="Normal"/> + <VisualState x:Name="Disabled"> + <Storyboard> + <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="PART_DisabledVisual"/> + </Storyboard> + </VisualState> + </VisualStateGroup> + </VisualStateManager.VisualStateGroups> + <Border CornerRadius="5"> + <Grid> + <Grid.Resources> + <ControlTemplate x:Key="PreviousButtonTemplate" TargetType="{x:Type Button}"> + <Grid Cursor="Hand" Background="Transparent"> + <VisualStateManager.VisualStateGroups> + <VisualStateGroup x:Name="CommonStates"> + <VisualState x:Name="Normal"/> + <VisualState x:Name="MouseOver" /> + <VisualState x:Name="Disabled"> + <Storyboard> + <DoubleAnimation Duration="0" To=".56" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="path"/> + </Storyboard> + </VisualState> + </VisualStateGroup> + </VisualStateManager.VisualStateGroups> + <Border> + <components:Ripple RippleBrush="#20202020" CornerRadius="50"> + <Viewbox Height="12" Margin="8" HorizontalAlignment="Center" VerticalAlignment="Center"> + <Path x:Name="path" Data="M15.41,16.58L10.83,12L15.41,7.41L14,6L8,12L14,18L15.41,16.58Z" Fill="{TemplateBinding Foreground}" Stretch="Fill" /> + </Viewbox> + </components:Ripple> + </Border> + </Grid> + </ControlTemplate> + <ControlTemplate x:Key="NextButtonTemplate" TargetType="{x:Type Button}"> + <Grid Cursor="Hand" Background="Transparent"> + <VisualStateManager.VisualStateGroups> + <VisualStateGroup x:Name="CommonStates"> + <VisualState x:Name="Normal"/> + <VisualState x:Name="MouseOver"/> + <VisualState x:Name="Disabled"> + <Storyboard> + <DoubleAnimation Duration="0" To=".5" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="path"/> + </Storyboard> + </VisualState> + </VisualStateGroup> + </VisualStateManager.VisualStateGroups> + <Border> + <components:Ripple RippleBrush="#20202020" CornerRadius="50"> + <Viewbox Height="12" Margin="8" HorizontalAlignment="Center" VerticalAlignment="Center"> + <Path x:Name="path" Data="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z" Fill="{TemplateBinding Foreground}" Stretch="Fill" /> + </Viewbox> + </components:Ripple> + </Border> + </Grid> + </ControlTemplate> + <ControlTemplate x:Key="HeaderButtonTemplate" TargetType="{x:Type Button}"> + <Grid Cursor="Hand" Background="Transparent"> + <VisualStateManager.VisualStateGroups> + <VisualStateGroup x:Name="CommonStates"> + <VisualState x:Name="Normal"/> + <VisualState x:Name="MouseOver" /> + <VisualState x:Name="Disabled"/> + </VisualStateGroup> + </VisualStateManager.VisualStateGroups> + <Border Background="{StaticResource TangoPrimaryAccentBrush}" CornerRadius="5 5 0 0" Width="{Binding RelativeSource={RelativeSource AncestorType=local:TouchCalendar},Path=Width}"> + <components:Ripple RippleBrush="#20202020"> + <Border Padding="20 40" CornerRadius="5" TextElement.Foreground="{StaticResource TangoPrimaryBackgroundBrush}"> + <StackPanel> + <TextBlock FontSize="{StaticResource TangoDefaultFontSize}" Text="{Binding RelativeSource={RelativeSource AncestorType=local:TouchCalendar},Path=SelectedDate.Year}"></TextBlock> + <TextBlock Margin="0 10 0 0" FontSize="{StaticResource TangoHeaderFontSize}" Text="{Binding RelativeSource={RelativeSource AncestorType=local:TouchCalendar},Path=SelectedDate,Converter={StaticResource DateTimeToCalendarHeaderConverter}}"></TextBlock> + </StackPanel> + </Border> + </components:Ripple> + </Border> + </Grid> + </ControlTemplate> + </Grid.Resources> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="Auto"/> + <ColumnDefinition Width="Auto"/> + <ColumnDefinition Width="Auto"/> + </Grid.ColumnDefinitions> + <Grid.RowDefinitions> + <RowDefinition Height="Auto"/> + <RowDefinition Height="70"/> + <RowDefinition Height="Auto"/> + <RowDefinition Height="*"/> + </Grid.RowDefinitions> + <Border Grid.ColumnSpan="3" Grid.Row="0" /> + <Button x:Name="PART_HeaderButton" Background="Transparent" + Grid.Row="0" + Grid.ColumnSpan="3" Focusable="False" + Template="{StaticResource HeaderButtonTemplate}" + Height="Auto"/> + <Button x:Name="PART_PreviousButton" Width="{Binding RelativeSource={RelativeSource Self},Path=ActualHeight}" Background="Transparent" Grid.Row="1" Grid.Column="0" Focusable="False" HorizontalAlignment="Left" Template="{StaticResource PreviousButtonTemplate}" Margin="6 0 0 0" Foreground="{TemplateBinding Foreground}" /> + <TextBlock x:Name="CurrentDateTextBlock" + HorizontalAlignment="Center" VerticalAlignment="Center" + Margin="8" + FontSize="{StaticResource TangoDefaultFontSize}" + Grid.Row="1" Grid.Column="1" + FontWeight="SemiBold" + RenderTransformOrigin="0, 0.5" + Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Calendar}}, Path=DisplayDate, StringFormat=MMMM yyyy}"> + <TextBlock.RenderTransform> + <TranslateTransform X="0" Y="0"/> + </TextBlock.RenderTransform> + </TextBlock> + <Button x:Name="PART_NextButton" Width="{Binding RelativeSource={RelativeSource Self},Path=ActualHeight}" Background="Transparent" Grid.Row="1" Grid.Column="2" Focusable="False" HorizontalAlignment="Right" Template="{StaticResource NextButtonTemplate}" + Margin="0 0 6 0" Foreground="{TemplateBinding Foreground}" /> + + <Grid x:Name="MonthViewWrapperGrid" + Grid.ColumnSpan="3" + Grid.Row="2" + HorizontalAlignment="Center" + VerticalAlignment="Top" + Margin="6 -1 6 6" + Visibility="Visible"> + <Border x:Name="PART_MonthViewCopy" RenderTransformOrigin="0, 0.5" + Opacity="0" Margin="4 7 4 3"> + <Border.Background> + <VisualBrush Visual="{Binding ElementName=PART_MonthView}" Stretch="UniformToFill"/> + </Border.Background> + <Border.RenderTransform> + <TranslateTransform X="0"/> + </Border.RenderTransform> + </Border> + <Grid x:Name="PART_MonthView" RenderTransformOrigin="0, 0.5"> + <Grid.RenderTransform> + <TranslateTransform X="0" /> + </Grid.RenderTransform> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="Auto"/> + <ColumnDefinition Width="Auto"/> + <ColumnDefinition Width="Auto"/> + <ColumnDefinition Width="Auto"/> + <ColumnDefinition Width="Auto"/> + <ColumnDefinition Width="Auto"/> + <ColumnDefinition Width="Auto"/> + </Grid.ColumnDefinitions> + <Grid.RowDefinitions> + <RowDefinition Height="Auto"/> + <RowDefinition Height="Auto"/> + <RowDefinition Height="Auto"/> + <RowDefinition Height="Auto"/> + <RowDefinition Height="Auto"/> + <RowDefinition Height="Auto"/> + <RowDefinition Height="Auto"/> + </Grid.RowDefinitions> + </Grid> + </Grid> + + <Grid x:Name="YearViewWrapperGrid" + Grid.ColumnSpan="3" + Grid.Row="2" + HorizontalAlignment="Center" + VerticalAlignment="Top" + Margin="6 -3 7 6" + Visibility="Hidden"> + <Border x:Name="PART_YearViewCopy" RenderTransformOrigin="0, 0.5" + Opacity="0" Margin="2"> + <Border.Background> + <VisualBrush Visual="{Binding ElementName=PART_YearView}" Stretch="UniformToFill"/> + </Border.Background> + <Border.RenderTransform> + <TranslateTransform X="0"/> + </Border.RenderTransform> + </Border> + <Grid x:Name="PART_YearView" + RenderTransformOrigin="0, 0.5"> + <Grid.RenderTransform> + <TranslateTransform X="0" /> + </Grid.RenderTransform> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="Auto"/> + <ColumnDefinition Width="Auto"/> + <ColumnDefinition Width="Auto"/> + <ColumnDefinition Width="Auto"/> + </Grid.ColumnDefinitions> + <Grid.RowDefinitions> + <RowDefinition Height="Auto"/> + <RowDefinition Height="Auto"/> + <RowDefinition Height="Auto"/> + </Grid.RowDefinitions> + </Grid> + </Grid> + </Grid> + </Border> + <Rectangle x:Name="PART_DisabledVisual" Fill="{StaticResource DisabledColor}" Opacity="0" RadiusY="2" RadiusX="2" Stretch="Fill" Stroke="{StaticResource DisabledColor}" StrokeThickness="1" Visibility="Collapsed"/> + </Grid> + <ControlTemplate.Triggers> + <Trigger Property="IsEnabled" Value="False"> + <Setter Property="Visibility" TargetName="PART_DisabledVisual" Value="Visible"/> + </Trigger> + <DataTrigger Binding="{Binding DisplayMode, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Calendar}}}" Value="Year"> + <Setter Property="Visibility" TargetName="MonthViewWrapperGrid" Value="Hidden"/> + <Setter Property="Visibility" TargetName="YearViewWrapperGrid" Value="Visible"/> + </DataTrigger> + <DataTrigger Binding="{Binding DisplayMode, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Calendar}}}" Value="Decade"> + <Setter Property="Visibility" TargetName="MonthViewWrapperGrid" Value="Hidden"/> + <Setter Property="Visibility" TargetName="YearViewWrapperGrid" Value="Visible"/> + </DataTrigger> + <EventTrigger RoutedEvent="Button.Click" SourceName="PART_NextButton"> + <BeginStoryboard> + <Storyboard> + <DoubleAnimation Storyboard.TargetName="CurrentDateTextBlock" + Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" + EasingFunction="{StaticResource EasingFunction}" + AccelerationRatio="0.1" DecelerationRatio="0.89" + From="240" To="0" Duration="0:0:0.450"/> + + <DoubleAnimation Storyboard.TargetName="PART_MonthViewCopy" + Storyboard.TargetProperty="(UIElement.Opacity)" + From="1" To="0" Duration="0:0:0.450"/> + + <DoubleAnimation Storyboard.TargetName="PART_MonthViewCopy" + Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" + From="0" To="-270" Duration="0:0:0.450" + AccelerationRatio="0.3" DecelerationRatio="0.69"/> + + <DoubleAnimation Storyboard.TargetName="PART_MonthView" + Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" + From="270" To="0" Duration="0:0:0.450" + AccelerationRatio="0.3" DecelerationRatio="0.69"/> + + <DoubleAnimation Storyboard.TargetName="PART_YearViewCopy" + Storyboard.TargetProperty="(UIElement.Opacity)" + From="1" To="0" Duration="0:0:0.450"/> + + <DoubleAnimation Storyboard.TargetName="PART_YearViewCopy" + Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" + From="0" To="-240" Duration="0:0:0.450" + AccelerationRatio="0.3" DecelerationRatio="0.69"/> + + <DoubleAnimation Storyboard.TargetName="PART_YearView" + Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" + From="240" To="0" Duration="0:0:0.450" + AccelerationRatio="0.3" DecelerationRatio="0.69"/> + </Storyboard> + </BeginStoryboard> + </EventTrigger> + <EventTrigger RoutedEvent="Button.Click" SourceName="PART_PreviousButton"> + <BeginStoryboard> + <Storyboard> + <DoubleAnimation Storyboard.TargetName="CurrentDateTextBlock" + Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" + EasingFunction="{StaticResource EasingFunction}" + AccelerationRatio="0.1" DecelerationRatio="0.89" + From="-240" To="0" Duration="0:0:0.450"/> + + <DoubleAnimation Storyboard.TargetName="PART_MonthViewCopy" + Storyboard.TargetProperty="(UIElement.Opacity)" + From="1" To="0" Duration="0:0:0.450"/> + + <DoubleAnimation Storyboard.TargetName="PART_MonthViewCopy" + Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" + From="0" To="270" Duration="0:0:0.450" + AccelerationRatio="0.3" DecelerationRatio="0.69"/> + + <DoubleAnimation Storyboard.TargetName="PART_MonthView" + Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" + From="-270" To="0" Duration="0:0:0.450" + AccelerationRatio="0.3" DecelerationRatio="0.69"/> + + <DoubleAnimation Storyboard.TargetName="PART_YearViewCopy" + Storyboard.TargetProperty="(UIElement.Opacity)" + From="1" To="0" Duration="0:0:0.450"/> + + <DoubleAnimation Storyboard.TargetName="PART_YearViewCopy" + Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" + From="0" To="240" Duration="0:0:0.450" + AccelerationRatio="0.3" DecelerationRatio="0.69"/> + + <DoubleAnimation Storyboard.TargetName="PART_YearView" + Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" + From="-240" To="0" Duration="0:0:0.450" + AccelerationRatio="0.3" DecelerationRatio="0.69"/> + </Storyboard> + </BeginStoryboard> + </EventTrigger> + </ControlTemplate.Triggers> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + <Style TargetType="{x:Type local:TouchCalendar}"> + <Setter Property="ClipToBounds" Value="True"></Setter> + <Setter Property="CalendarItemStyle" Value="{StaticResource TouchCalendarItem}"></Setter> + <Setter Property="CalendarDayButtonStyle" Value="{StaticResource TouchCalendarDayButton}"></Setter> + <Setter Property="CalendarButtonStyle" Value="{StaticResource TouchCalendarButton}"></Setter> + <Setter Property="Foreground" Value="{StaticResource TangoDarkForegroundBrush}"/> + <Setter Property="BorderThickness" Value="0"/> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="{x:Type Calendar}"> + <StackPanel x:Name="PART_Root" HorizontalAlignment="Center"> + <CalendarItem x:Name="PART_CalendarItem" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Style="{TemplateBinding CalendarItemStyle}"/> + </StackPanel> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> +</ResourceDictionary>
\ No newline at end of file diff --git a/Software/Visual_Studio/Tango.Touch/Controls/TouchComboBox.xaml b/Software/Visual_Studio/Tango.Touch/Controls/TouchComboBox.xaml index 5ea529c70..8e29231af 100644 --- a/Software/Visual_Studio/Tango.Touch/Controls/TouchComboBox.xaml +++ b/Software/Visual_Studio/Tango.Touch/Controls/TouchComboBox.xaml @@ -23,7 +23,6 @@ <Setter Property="MinPopupHeight" Value="400"></Setter> <Setter Property="MinPopupWidth" Value="500"></Setter> <Setter Property="Title" Value="Select a value"></Setter> - <!--<Setter Property="IsManipulationEnabled" Value="True"></Setter>--> <Setter Property="ItemTemplate"> <Setter.Value> <DataTemplate> diff --git a/Software/Visual_Studio/Tango.Touch/Controls/TouchDatePicker.cs b/Software/Visual_Studio/Tango.Touch/Controls/TouchDatePicker.cs new file mode 100644 index 000000000..49c7e6aa2 --- /dev/null +++ b/Software/Visual_Studio/Tango.Touch/Controls/TouchDatePicker.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +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.Core.EventArguments; + +namespace Tango.Touch.Controls +{ + public class TouchDatePicker : DatePicker + { + static TouchDatePicker() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(TouchDatePicker), new FrameworkPropertyMetadata(typeof(TouchDatePicker))); + } + + public TouchDatePicker() + { + this.RegisterForPreviewMouseOrTouchDown(OnMouseDown); + this.RegisterForPreviewMouseOrTouchUp(OnMouseUp); + } + + private void OnMouseUp(object sender, MouseOrTouchEventArgs e) + { + ShowSelectionOnTouchPanel(); + } + + private void OnMouseDown(object sender, MouseOrTouchEventArgs e) + { + System.Windows.Input.Keyboard.Focus(this); + } + + private void ShowSelectionOnTouchPanel() + { + TouchPanel touchPanel = this.FindAncestor<TouchPanel>(); + + if (touchPanel != null) + { + touchPanel.CurrentDatePicker = this; + } + } + + internal void SetResultFromTouchPanel(DateTime selectedDate) + { + SelectedDate = selectedDate; + } + } +} diff --git a/Software/Visual_Studio/Tango.Touch/Controls/TouchDatePicker.xaml b/Software/Visual_Studio/Tango.Touch/Controls/TouchDatePicker.xaml new file mode 100644 index 000000000..eb22c441a --- /dev/null +++ b/Software/Visual_Studio/Tango.Touch/Controls/TouchDatePicker.xaml @@ -0,0 +1,123 @@ +<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:components="clr-namespace:Tango.Touch.Components" + xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI" + xmlns:local="clr-namespace:Tango.Touch.Controls"> + + <ResourceDictionary.MergedDictionaries> + <ResourceDictionary Source="../Resources/Colors.xaml" /> + <ResourceDictionary Source="../Resources/Fonts.xaml" /> + <ResourceDictionary Source="../Controls/Shared.xaml" /> + </ResourceDictionary.MergedDictionaries> + + <converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> + + <Style TargetType="{x:Type local:TouchDatePicker}"> + <Setter Property="Focusable" Value="True"></Setter> + <Setter Property="Validation.ErrorTemplate" Value="{x:Null}"></Setter> + <Setter Property="FocusVisualStyle" Value="{x:Null}"></Setter> + <Setter Property="Padding" Value="10"></Setter> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="{x:Type local:TouchDatePicker}"> + <Border Background="{TemplateBinding Background}" + BorderBrush="{TemplateBinding BorderBrush}" + BorderThickness="{TemplateBinding BorderThickness}"> + + <DockPanel Background="Transparent"> + <Border DockPanel.Dock="Bottom" Visibility="{Binding RelativeSource={RelativeSource AncestorType=local:TouchDatePicker},Path=(Validation.HasError),Converter={StaticResource BooleanToVisibilityConverter}}"> + <TextBlock FontSize="12" Foreground="{StaticResource TangoValidationErrorBrush}" Margin="0 5 0 0" TextWrapping="Wrap" Text="{Binding RelativeSource={RelativeSource AncestorType=local:TouchDatePicker},Path=(Validation.Errors).CurrentItem.ErrorContent}"></TextBlock> + </Border> + + <DockPanel> + <Grid DockPanel.Dock="Bottom" Height="2"> + <Rectangle Height="1" Fill="{StaticResource TangoTextWatermarkBrush}" /> + <Rectangle Height="2" RenderTransformOrigin="0.5,0.5" > + <Rectangle.Style> + <Style TargetType="Rectangle"> + <Setter Property="Fill" Value="{StaticResource TangoPrimaryAccentBrush}"></Setter> + <Setter Property="RenderTransform"> + <Setter.Value> + <ScaleTransform ScaleY="1" ScaleX="0" /> + </Setter.Value> + </Setter> + <Style.Triggers> + <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=local:TouchDatePicker},Path=IsFocused}" Value="True"> + <DataTrigger.EnterActions> + <BeginStoryboard> + <Storyboard> + <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX" To="1" Duration="00:00:0.4" /> + </Storyboard> + </BeginStoryboard> + </DataTrigger.EnterActions> + <DataTrigger.ExitActions> + <BeginStoryboard> + <Storyboard> + <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX" To="0" Duration="00:00:0.4" /> + </Storyboard> + </BeginStoryboard> + </DataTrigger.ExitActions> + </DataTrigger> + <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=local:TouchDatePicker},Path=IsFocused}" Value="True"> + <DataTrigger.EnterActions> + <BeginStoryboard> + <Storyboard> + <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX" To="1" Duration="00:00:0.4" /> + </Storyboard> + </BeginStoryboard> + </DataTrigger.EnterActions> + <DataTrigger.ExitActions> + <BeginStoryboard> + <Storyboard> + <DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX" To="0" Duration="00:00:0.4" /> + </Storyboard> + </BeginStoryboard> + </DataTrigger.ExitActions> + </DataTrigger> + <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=local:TouchDatePicker},Path=(Validation.HasError)}" Value="True"> + <Setter Property="Fill" Value="{StaticResource TangoValidationErrorBrush}"></Setter> + <Setter Property="RenderTransform"> + <Setter.Value> + <ScaleTransform ScaleY="1" ScaleX="1" /> + </Setter.Value> + </Setter> + </DataTrigger> + </Style.Triggers> + </Style> + </Rectangle.Style> + </Rectangle> + </Grid> + + <Grid> + <components:Ripple RippleBrush="{StaticResource TangoRippleDarkBrush}" RippleFactor="15"> + <DockPanel> + <local:TouchIcon IsHitTestVisible="False" VerticalAlignment="Bottom" Margin="0 0 0 5" DockPanel.Dock="Right" Icon="Calendar" Width="12"> + <local:TouchIcon.Style> + <Style TargetType="local:TouchIcon"> + <Setter Property="Foreground" Value="{StaticResource TangoTextWatermarkBrush}"></Setter> + <Style.Triggers> + <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=local:TouchDatePicker},Path=IsFocused}" Value="True"> + <Setter Property="Foreground" Value="{StaticResource TangoPrimaryAccentBrush}"></Setter> + </DataTrigger> + </Style.Triggers> + </Style> + </local:TouchIcon.Style> + </local:TouchIcon> + + <Grid> + <ContentControl VerticalAlignment="Bottom" Margin="0 0 0 5" Padding="0 0 0 4" FocusVisualStyle="{x:Null}" Content="{Binding RelativeSource={RelativeSource AncestorType=local:TouchDatePicker},Path=SelectedDate}" Background="Transparent"></ContentControl> + </Grid> + </DockPanel> + </components:Ripple> + </Grid> + </DockPanel> + </DockPanel> + + </Border> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + +</ResourceDictionary>
\ No newline at end of file diff --git a/Software/Visual_Studio/Tango.Touch/Controls/TouchPanel.cs b/Software/Visual_Studio/Tango.Touch/Controls/TouchPanel.cs index aa311a986..54906c7a6 100644 --- a/Software/Visual_Studio/Tango.Touch/Controls/TouchPanel.cs +++ b/Software/Visual_Studio/Tango.Touch/Controls/TouchPanel.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; +using System.Windows.Input; using Tango.Core.Commands; using Tango.Core.EventArguments; using Tango.SharedUI; @@ -18,6 +19,8 @@ namespace Tango.Touch.Controls { private TouchListBox _combobox_list; private Grid _combobox_grid; + private TouchCalendar _calendar; + private Grid _calendar_grid; static TouchPanel() { @@ -32,6 +35,17 @@ namespace Tango.Touch.Controls CurrentComboBox = null; }); + DateSelectedCommand = new RelayCommand(() => + { + CurrentDatePicker.SetResultFromTouchPanel(_calendar.SelectedDate.Value); + CurrentDatePicker = null; + }); + + CancelDateCommand = new RelayCommand(() => + { + CurrentDatePicker = null; + }); + this.RegisterForMouseOrTouchDown(OnMouseDown); } @@ -52,8 +66,28 @@ namespace Tango.Touch.Controls _combobox_list = GetTemplateChild("PART_ComboBoxList") as TouchListBox; _combobox_grid = GetTemplateChild("PART_combobox_grid") as Grid; + _calendar_grid = GetTemplateChild("PART_datepicker_grid") as Grid; + _calendar = GetTemplateChild("PART_calendar") as TouchCalendar; _combobox_grid.RegisterForMouseOrTouchDown(OnComboBoxGridDown); + _calendar_grid.RegisterForMouseOrTouchDown(OnCalendarGridDown); + + _calendar.SelectionMode = CalendarSelectionMode.SingleDate; + _calendar.SelectedDatesChanged += _calendar_SelectedDatesChanged; + } + + private void _calendar_SelectedDatesChanged(object sender, SelectionChangedEventArgs e) + { + Mouse.Capture(null); + ReleaseAllTouchCaptures(); + } + + private void OnCalendarGridDown(object sender, MouseOrTouchEventArgs e) + { + if (e.Source == _calendar_grid) + { + CurrentDatePicker = null; + } } private void OnComboBoxGridDown(object sender, MouseOrTouchEventArgs e) @@ -81,6 +115,16 @@ namespace Tango.Touch.Controls } } + private void OnCurrentDatePickerChanged() + { + if (CurrentDatePicker != null) + { + _calendar.SelectedDate = CurrentDatePicker.SelectedDate; + _calendar.DisplayDateStart = CurrentDatePicker.DisplayDateStart; + _calendar.DisplayDateEnd = CurrentDatePicker.DisplayDateEnd; + } + } + internal RelayCommand ComboBoxPickedCommand { get { return (RelayCommand)GetValue(ComboBoxPickedCommandProperty); } @@ -98,6 +142,32 @@ namespace Tango.Touch.Controls internal static readonly DependencyProperty CurrentComboBoxProperty = DependencyProperty.Register("CurrentComboBox", typeof(TouchComboBox), typeof(TouchPanel), new PropertyMetadata(null,(d,e) => (d as TouchPanel).OnCurrentComboBoxChanged())); + internal TouchDatePicker CurrentDatePicker + { + get { return (TouchDatePicker)GetValue(CurrentDatePickerProperty); } + set { SetValue(CurrentDatePickerProperty, value); } + } + internal static readonly DependencyProperty CurrentDatePickerProperty = + DependencyProperty.Register("CurrentDatePicker", typeof(TouchDatePicker), typeof(TouchPanel), new PropertyMetadata(null, (d, e) => (d as TouchPanel).OnCurrentDatePickerChanged())); + + internal RelayCommand DateSelectedCommand + { + get { return (RelayCommand)GetValue(DateSelectedCommandProperty); } + set { SetValue(DateSelectedCommandProperty, value); } + } + internal static readonly DependencyProperty DateSelectedCommandProperty = + DependencyProperty.Register("DateSelectedCommand", typeof(RelayCommand), typeof(TouchPanel), new PropertyMetadata(null)); + + internal RelayCommand CancelDateCommand + { + get { return (RelayCommand)GetValue(CancelDateCommandProperty); } + set { SetValue(CancelDateCommandProperty, value); } + } + internal static readonly DependencyProperty CancelDateCommandProperty = + DependencyProperty.Register("CancelDateCommand", typeof(RelayCommand), typeof(TouchPanel), new PropertyMetadata(null)); + + + public bool HasMessageBox { get { return (bool)GetValue(HasMessageBoxProperty); } diff --git a/Software/Visual_Studio/Tango.Touch/Controls/TouchPanel.xaml b/Software/Visual_Studio/Tango.Touch/Controls/TouchPanel.xaml index 92e838c1e..77eb794a0 100644 --- a/Software/Visual_Studio/Tango.Touch/Controls/TouchPanel.xaml +++ b/Software/Visual_Studio/Tango.Touch/Controls/TouchPanel.xaml @@ -83,6 +83,49 @@ </Grid> </Grid> + <!--Date Picker--> + <Grid Background="#9E000000" x:Name="PART_datepicker_grid"> + <Grid.Style> + <Style TargetType="Grid"> + <Setter Property="Opacity" Value="0"></Setter> + <Setter Property="Visibility" Value="Hidden"></Setter> + <Style.Triggers> + <DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent},Path=CurrentDatePicker,Converter={StaticResource NullObjectToBooleanConverter}}" Value="True"> + <Setter Property="Visibility" Value="Visible"></Setter> + <DataTrigger.EnterActions> + <BeginStoryboard> + <Storyboard> + <DoubleAnimation To="1" Storyboard.TargetProperty="Opacity" Duration="00:00:0.2" /> + </Storyboard> + </BeginStoryboard> + </DataTrigger.EnterActions> + </DataTrigger> + </Style.Triggers> + </Style> + </Grid.Style> + + <Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent},Path=CurrentDatePicker}" VerticalAlignment="Center" HorizontalAlignment="Center"> + <Border Background="{StaticResource TangoPrimaryBackgroundBrush}" CornerRadius="5" Margin="10" HorizontalAlignment="Center" VerticalAlignment="Center"> + <Border.Effect> + <DropShadowEffect BlurRadius="10" /> + </Border.Effect> + + <DockPanel> + <StackPanel Margin="0 40 0 10" DockPanel.Dock="Bottom" HorizontalAlignment="Right" Orientation="Horizontal"> + <local:TouchButton Command="{Binding RelativeSource={RelativeSource TemplatedParent},Path=CancelDateCommand}" Width="80" Margin="2 0" FontSize="{StaticResource TangoDefaultFontSize}" Style="{StaticResource TangoMessageBoxButton}">CANCEL</local:TouchButton> + <local:TouchButton Command="{Binding RelativeSource={RelativeSource TemplatedParent},Path=DateSelectedCommand}" Width="100" Margin="2 0" FontSize="{StaticResource TangoDefaultFontSize}" Style="{StaticResource TangoMessageBoxButton}">OK</local:TouchButton> + </StackPanel> + + <local:TouchCalendar Width="370" x:Name="PART_calendar" Focusable="False" + SelectedDate="{Binding RelativeSource={RelativeSource TemplatedParent},Path=CurrentDatePicker.SelectedDate,Mode=OneWay}" + DisplayDateStart="{Binding RelativeSource={RelativeSource TemplatedParent},Path=CurrentDatePicker.DisplayDateStart,Mode=OneWay}" + DisplayDateEnd="{Binding RelativeSource={RelativeSource TemplatedParent},Path=CurrentDatePicker.DisplayDateEnd,Mode=OneWay}" + /> + </DockPanel> + </Border> + </Grid> + </Grid> + <!--Dialogs--> <Grid> <Grid.Style> diff --git a/Software/Visual_Studio/Tango.Touch/Converters/DateTimeToCalendarHeaderConverter.cs b/Software/Visual_Studio/Tango.Touch/Converters/DateTimeToCalendarHeaderConverter.cs new file mode 100644 index 000000000..0d5909d65 --- /dev/null +++ b/Software/Visual_Studio/Tango.Touch/Converters/DateTimeToCalendarHeaderConverter.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; + +namespace Tango.Touch.Converters +{ + public class DateTimeToCalendarHeaderConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + DateTime? date = value as DateTime?; + + if (date == null) + { + date = DateTime.Now; + } + + return date.Value.ToString("ddd, MMM d"); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Software/Visual_Studio/Tango.Touch/Tango.Touch.csproj b/Software/Visual_Studio/Tango.Touch/Tango.Touch.csproj index 469fbeb3a..9bd7f0b71 100644 --- a/Software/Visual_Studio/Tango.Touch/Tango.Touch.csproj +++ b/Software/Visual_Studio/Tango.Touch/Tango.Touch.csproj @@ -65,8 +65,10 @@ <Compile Include="Controls\IValueControl.cs" /> <Compile Include="Controls\MessageBoxVM.cs" /> <Compile Include="Controls\TouchAutoComplete.cs" /> + <Compile Include="Controls\TouchCalendar.cs" /> <Compile Include="Controls\TouchCheckBox.cs" /> <Compile Include="Controls\TouchComboBox.cs" /> + <Compile Include="Controls\TouchDatePicker.cs" /> <Compile Include="Controls\TouchExpander.cs" /> <Compile Include="Controls\TouchFlatListBox.cs" /> <Compile Include="Controls\TouchGifAnimation.cs" /> @@ -89,6 +91,7 @@ <Compile Include="Controls\TouchPanel.cs" /> <Compile Include="Controls\TouchToggleIconButton.cs" /> <Compile Include="Controls\TouchToggleSlider.cs" /> + <Compile Include="Converters\DateTimeToCalendarHeaderConverter.cs" /> <Compile Include="Converters\NumericTextBoxDoubleConverter.cs" /> <Compile Include="Converters\NumericTextBoxIntegerConverter.cs" /> <Compile Include="Converters\StringToPasswordConverter.cs" /> @@ -110,6 +113,10 @@ <SubType>Designer</SubType> <Generator>MSBuild:Compile</Generator> </Page> + <Page Include="Controls\TouchCalendar.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> <Page Include="Controls\TouchCheckBox.xaml"> <SubType>Designer</SubType> <Generator>MSBuild:Compile</Generator> @@ -118,6 +125,10 @@ <SubType>Designer</SubType> <Generator>MSBuild:Compile</Generator> </Page> + <Page Include="Controls\TouchDatePicker.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> <Page Include="Controls\TouchExpander.xaml"> <SubType>Designer</SubType> <Generator>MSBuild:Compile</Generator> @@ -374,7 +385,7 @@ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> + <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/Tango.Touch/Themes/Generic.xaml b/Software/Visual_Studio/Tango.Touch/Themes/Generic.xaml index ad85463dd..832a3bf95 100644 --- a/Software/Visual_Studio/Tango.Touch/Themes/Generic.xaml +++ b/Software/Visual_Studio/Tango.Touch/Themes/Generic.xaml @@ -42,6 +42,8 @@ <ResourceDictionary Source="pack://application:,,,/Tango.Touch;component/Controls/TouchFlatListBox.xaml" /> <ResourceDictionary Source="pack://application:,,,/Tango.Touch;component/Controls/TouchStepProgressBar.xaml" /> <ResourceDictionary Source="pack://application:,,,/Tango.Touch;component/Controls/TouchProgressBar.xaml" /> + <ResourceDictionary Source="pack://application:,,,/Tango.Touch;component/Controls/TouchCalendar.xaml" /> + <ResourceDictionary Source="pack://application:,,,/Tango.Touch;component/Controls/TouchDatePicker.xaml" /> <ResourceDictionary Source="pack://application:,,,/Tango.Touch;component/Styles/TouchToggleButton.xaml" /> diff --git a/Software/Visual_Studio/Tango.sln b/Software/Visual_Studio/Tango.sln index a190fd04a..387a9e1bf 100644 --- a/Software/Visual_Studio/Tango.sln +++ b/Software/Visual_Studio/Tango.sln @@ -244,6 +244,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.FirmwarePackageGenera EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.PPC.BootScreen", "PPC\Tango.PPC.BootScreen\Tango.PPC.BootScreen.csproj", "{7E5E4BED-538C-4566-A005-DCC070AF8715}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.PPC.Logging", "PPC\Modules\Tango.PPC.Logging\Tango.PPC.Logging.csproj", "{D2EE865B-B006-487A-9487-60A663636AC3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution AppVeyor|Any CPU = AppVeyor|Any CPU @@ -4367,6 +4369,46 @@ Global {7E5E4BED-538C-4566-A005-DCC070AF8715}.Release|x64.Build.0 = Release|Any CPU {7E5E4BED-538C-4566-A005-DCC070AF8715}.Release|x86.ActiveCfg = Release|Any CPU {7E5E4BED-538C-4566-A005-DCC070AF8715}.Release|x86.Build.0 = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.AppVeyor|Any CPU.ActiveCfg = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.AppVeyor|Any CPU.Build.0 = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.AppVeyor|ARM.ActiveCfg = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.AppVeyor|ARM.Build.0 = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.AppVeyor|ARM64.ActiveCfg = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.AppVeyor|ARM64.Build.0 = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.AppVeyor|x64.ActiveCfg = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.AppVeyor|x64.Build.0 = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.AppVeyor|x86.ActiveCfg = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.AppVeyor|x86.Build.0 = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Debug|ARM.ActiveCfg = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Debug|ARM.Build.0 = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Debug|ARM64.Build.0 = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Debug|x64.ActiveCfg = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Debug|x64.Build.0 = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Debug|x86.ActiveCfg = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Debug|x86.Build.0 = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.DefaultBuild|Any CPU.ActiveCfg = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.DefaultBuild|Any CPU.Build.0 = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.DefaultBuild|ARM.ActiveCfg = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.DefaultBuild|ARM.Build.0 = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.DefaultBuild|ARM64.ActiveCfg = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.DefaultBuild|ARM64.Build.0 = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.DefaultBuild|x64.ActiveCfg = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.DefaultBuild|x64.Build.0 = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.DefaultBuild|x86.ActiveCfg = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.DefaultBuild|x86.Build.0 = Debug|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Release|Any CPU.Build.0 = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Release|ARM.ActiveCfg = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Release|ARM.Build.0 = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Release|ARM64.ActiveCfg = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Release|ARM64.Build.0 = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Release|x64.ActiveCfg = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Release|x64.Build.0 = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Release|x86.ActiveCfg = Release|Any CPU + {D2EE865B-B006-487A-9487-60A663636AC3}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -4443,14 +4485,15 @@ Global {5991F6B5-EA4E-41E9-A4F6-7D3A50010FD6} = {B2AF4F3F-2828-47C3-8F3E-A0EA0BD66FF8} {43135FB9-41DB-4F87-9771-CF2C762027C0} = {5F6BBAA8-EAD0-4B18-97E5-55B4F56DD760} {7E5E4BED-538C-4566-A005-DCC070AF8715} = {C81ED1A3-D18C-4D80-A8F5-061994A14A60} + {D2EE865B-B006-487A-9487-60A663636AC3} = {0048447D-1D94-4E60-9DAD-7349C777CB4E} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {7986F7F4-A86A-4994-B1B6-0988D7F057B6} - BuildVersion_BuildVersioningStyle = None.None.Increment.DeltaBaseYearDayOfYear - BuildVersion_UpdateAssemblyVersion = True - BuildVersion_UpdateFileVersion = False - BuildVersion_StartDate = 2000/1/1 - BuildVersion_AssemblyInfoFilename = Properties\AssemblyInfo.cs BuildVersion_UseGlobalSettings = False + BuildVersion_AssemblyInfoFilename = Properties\AssemblyInfo.cs + BuildVersion_StartDate = 2000/1/1 + BuildVersion_UpdateFileVersion = False + BuildVersion_UpdateAssemblyVersion = True + BuildVersion_BuildVersioningStyle = None.None.Increment.DeltaBaseYearDayOfYear + SolutionGuid = {7986F7F4-A86A-4994-B1B6-0988D7F057B6} EndGlobalSection EndGlobal diff --git a/Software/Visual_Studio/Utilities/Tango.UITests/MainWindow.xaml b/Software/Visual_Studio/Utilities/Tango.UITests/MainWindow.xaml index b8301312d..1ab00e18f 100644 --- a/Software/Visual_Studio/Utilities/Tango.UITests/MainWindow.xaml +++ b/Software/Visual_Studio/Utilities/Tango.UITests/MainWindow.xaml @@ -14,19 +14,11 @@ xmlns:commonControls="clr-namespace:Tango.PPC.Common.Controls;assembly=Tango.PPC.Common" xmlns:explorer="clr-namespace:Tango.Explorer;assembly=Tango.Explorer" mc:Ignorable="d" - Title="MainWindow" Height="564.721" Width="504.315" DataContext="{Binding RelativeSource={RelativeSource Self}}"> + Title="MainWindow" Height="1280" Width="800" DataContext="{Binding RelativeSource={RelativeSource Self}}"> <Grid> - <Grid.RowDefinitions> - <RowDefinition Height="232*"/> - <RowDefinition Height="50"/> - </Grid.RowDefinitions> - <explorer:ExplorerControl x:Name="explorer" CurrentPath="{Binding CurrentPath,Mode=TwoWay}" /> - <StackPanel Orientation="Horizontal" Grid.Row="1"> - <Button Click="Button_Click">LOAD</Button> - <Button Command="{Binding ElementName=explorer,Path=BackCommand}">BACK</Button> - <TextBox Width="200" Margin="10 0 0 0" Text="{Binding ElementName=explorer,Path=CurrentPath}"></TextBox> - </StackPanel> + <touch:TouchDatePicker VerticalAlignment="Center" Height="40" HorizontalAlignment="Center" Width="300" SelectedDate="12/15/2018" /> + <!--<touch:TouchCalendar DisplayDateStart="12/10/2018" DisplayDateEnd="1/1/2019" SelectedDate="12/15/2018" HorizontalAlignment="Center" VerticalAlignment="Center" />--> </Grid> </Window> |
