parent
cc2583f96b
commit
435510baf9
@ -1,69 +0,0 @@
|
|||||||
Application "DiscordChatExporter.Gui.App" {
|
|
||||||
StartupUri: "Views/MainWindow.g.xaml"
|
|
||||||
Startup: App_Startup
|
|
||||||
Exit: App_Exit
|
|
||||||
|
|
||||||
Resources: ResourceDictionary {
|
|
||||||
// Material Design
|
|
||||||
#MergeDictionary("pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml")
|
|
||||||
#MergeDictionary("pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml")
|
|
||||||
|
|
||||||
// Colors
|
|
||||||
Color Key="PrimaryColor" { "#343838" }
|
|
||||||
Color Key="PrimaryLightColor" { "#5E6262" }
|
|
||||||
Color Key="PrimaryDarkColor" { "#0D1212" }
|
|
||||||
Color Key="AccentColor" { "#F9A825" }
|
|
||||||
Color Key="TextColor" { "#000000" }
|
|
||||||
Color Key="InverseTextColor" { "#FFFFFF" }
|
|
||||||
|
|
||||||
// Brushes
|
|
||||||
SolidColorBrush Key="PrimaryHueLightBrush" { Color: resource dyn "PrimaryLightColor" }
|
|
||||||
SolidColorBrush Key="PrimaryHueLightForegroundBrush" { Color: resource dyn "InverseTextColor" }
|
|
||||||
SolidColorBrush Key="PrimaryHueMidBrush" { Color: resource dyn "PrimaryColor" }
|
|
||||||
SolidColorBrush Key="PrimaryHueMidForegroundBrush" { Color: resource dyn "InverseTextColor" }
|
|
||||||
SolidColorBrush Key="PrimaryHueDarkBrush" { Color: resource dyn "PrimaryDarkColor" }
|
|
||||||
SolidColorBrush Key="PrimaryHueDarkForegroundBrush" { Color: resource dyn "InverseTextColor" }
|
|
||||||
SolidColorBrush Key="SecondaryAccentBrush" { Color: resource dyn "AccentColor" }
|
|
||||||
SolidColorBrush Key="SecondaryAccentForegroundBrush" { Color: resource dyn "TextColor" }
|
|
||||||
SolidColorBrush Key="PrimaryTextBrush" { Color: resource dyn "TextColor", Opacity: 0.87 }
|
|
||||||
SolidColorBrush Key="SecondaryTextBrush" { Color: resource dyn "TextColor", Opacity: 0.64 }
|
|
||||||
SolidColorBrush Key="DimTextBrush" { Color: resource dyn "TextColor", Opacity: 0.45 }
|
|
||||||
SolidColorBrush Key="PrimaryInverseTextBrush" { Color: resource dyn "InverseTextColor", Opacity: 1 }
|
|
||||||
SolidColorBrush Key="SecondaryInverseTextBrush" { Color: resource dyn "InverseTextColor", Opacity: 0.7 }
|
|
||||||
SolidColorBrush Key="DimInverseTextBrush" { Color: resource dyn "InverseTextColor", Opacity: 0.52 }
|
|
||||||
SolidColorBrush Key="AccentTextBrush" { Color: resource dyn "AccentColor", Opacity: 1 }
|
|
||||||
SolidColorBrush Key="DividerBrush" { Color: resource dyn "TextColor", Opacity: 0.12 }
|
|
||||||
SolidColorBrush Key="InverseDividerBrush" { Color: resource dyn "InverseTextColor", Opacity: 0.12 }
|
|
||||||
|
|
||||||
// Styles
|
|
||||||
Style {
|
|
||||||
TargetType: "Image"
|
|
||||||
#Setter("RenderOptions.BitmapScalingMode", "HighQuality")
|
|
||||||
}
|
|
||||||
|
|
||||||
Style {
|
|
||||||
TargetType: "ProgressBar"
|
|
||||||
BasedOn: resource "MaterialDesignLinearProgressBar"
|
|
||||||
#Setter("Foreground", resource dyn "SecondaryAccentBrush")
|
|
||||||
#Setter("Height", 2)
|
|
||||||
#Setter("Minimum", 0)
|
|
||||||
#Setter("Maximum", 1)
|
|
||||||
#Setter("BorderThickness", 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
Style {
|
|
||||||
TargetType: "TextBox"
|
|
||||||
BasedOn: resource "MaterialDesignTextBox"
|
|
||||||
#Setter("Foreground", resource dyn "PrimaryTextBrush")
|
|
||||||
}
|
|
||||||
|
|
||||||
Style {
|
|
||||||
TargetType: "ComboBox"
|
|
||||||
BasedOn: resource "MaterialDesignComboBox"
|
|
||||||
#Setter("Foreground", resource dyn "PrimaryTextBrush")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Container
|
|
||||||
Container Key="Container" { }
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,106 @@
|
|||||||
|
<Application
|
||||||
|
x:Class="DiscordChatExporter.Gui.App"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:converters="clr-namespace:DiscordChatExporter.Gui.Converters"
|
||||||
|
xmlns:local="clr-namespace:DiscordChatExporter.Gui"
|
||||||
|
Exit="App_Exit"
|
||||||
|
Startup="App_Startup"
|
||||||
|
StartupUri="Views/MainWindow.xaml">
|
||||||
|
<Application.Resources>
|
||||||
|
<ResourceDictionary>
|
||||||
|
<ResourceDictionary.MergedDictionaries>
|
||||||
|
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
|
||||||
|
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
|
||||||
|
<ResourceDictionary Source="pack://application:,,,/Tyrrrz.WpfExtensions;component/ConvertersDictionary.xaml" />
|
||||||
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
|
||||||
|
<!-- Colors -->
|
||||||
|
<Color x:Key="PrimaryColor">#343838</Color>
|
||||||
|
<Color x:Key="PrimaryLightColor">#5E6262</Color>
|
||||||
|
<Color x:Key="PrimaryDarkColor">#0D1212</Color>
|
||||||
|
<Color x:Key="AccentColor">#F9A825</Color>
|
||||||
|
<Color x:Key="AccentDarkColor">#C17900</Color>
|
||||||
|
<Color x:Key="TextColor">#000000</Color>
|
||||||
|
<Color x:Key="InverseTextColor">#FFFFFF</Color>
|
||||||
|
|
||||||
|
<SolidColorBrush x:Key="PrimaryHueLightBrush" Color="{DynamicResource PrimaryLightColor}" />
|
||||||
|
<SolidColorBrush x:Key="PrimaryHueLightForegroundBrush" Color="{DynamicResource InverseTextColor}" />
|
||||||
|
<SolidColorBrush x:Key="PrimaryHueMidBrush" Color="{DynamicResource PrimaryColor}" />
|
||||||
|
<SolidColorBrush x:Key="PrimaryHueMidForegroundBrush" Color="{DynamicResource InverseTextColor}" />
|
||||||
|
<SolidColorBrush x:Key="PrimaryHueDarkBrush" Color="{DynamicResource PrimaryDarkColor}" />
|
||||||
|
<SolidColorBrush x:Key="PrimaryHueDarkForegroundBrush" Color="{DynamicResource InverseTextColor}" />
|
||||||
|
<SolidColorBrush x:Key="SecondaryAccentBrush" Color="{DynamicResource AccentColor}" />
|
||||||
|
<SolidColorBrush x:Key="SecondaryAccentForegroundBrush" Color="{DynamicResource TextColor}" />
|
||||||
|
|
||||||
|
<SolidColorBrush
|
||||||
|
x:Key="PrimaryTextBrush"
|
||||||
|
Opacity="0.87"
|
||||||
|
Color="{DynamicResource TextColor}" />
|
||||||
|
<SolidColorBrush
|
||||||
|
x:Key="SecondaryTextBrush"
|
||||||
|
Opacity="0.64"
|
||||||
|
Color="{DynamicResource TextColor}" />
|
||||||
|
<SolidColorBrush
|
||||||
|
x:Key="DimTextBrush"
|
||||||
|
Opacity="0.45"
|
||||||
|
Color="{DynamicResource TextColor}" />
|
||||||
|
<SolidColorBrush
|
||||||
|
x:Key="PrimaryInverseTextBrush"
|
||||||
|
Opacity="1"
|
||||||
|
Color="{DynamicResource InverseTextColor}" />
|
||||||
|
<SolidColorBrush
|
||||||
|
x:Key="SecondaryInverseTextBrush"
|
||||||
|
Opacity="0.7"
|
||||||
|
Color="{DynamicResource InverseTextColor}" />
|
||||||
|
<SolidColorBrush
|
||||||
|
x:Key="DimInverseTextBrush"
|
||||||
|
Opacity="0.52"
|
||||||
|
Color="{DynamicResource InverseTextColor}" />
|
||||||
|
<SolidColorBrush
|
||||||
|
x:Key="AccentTextBrush"
|
||||||
|
Opacity="1"
|
||||||
|
Color="{DynamicResource AccentColor}" />
|
||||||
|
<SolidColorBrush
|
||||||
|
x:Key="AccentDarkTextBrush"
|
||||||
|
Opacity="1"
|
||||||
|
Color="{DynamicResource AccentDarkColor}" />
|
||||||
|
<SolidColorBrush
|
||||||
|
x:Key="DividerBrush"
|
||||||
|
Opacity="0.12"
|
||||||
|
Color="{DynamicResource TextColor}" />
|
||||||
|
<SolidColorBrush
|
||||||
|
x:Key="InverseDividerBrush"
|
||||||
|
Opacity="0.12"
|
||||||
|
Color="{DynamicResource InverseTextColor}" />
|
||||||
|
|
||||||
|
<!-- Styles -->
|
||||||
|
<Style TargetType="{x:Type Image}">
|
||||||
|
<Setter Property="RenderOptions.BitmapScalingMode" Value="HighQuality" />
|
||||||
|
<Setter Property="RenderOptions.EdgeMode" Value="Aliased" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style BasedOn="{StaticResource MaterialDesignLinearProgressBar}" TargetType="{x:Type ProgressBar}">
|
||||||
|
<Setter Property="BorderThickness" Value="0" />
|
||||||
|
<Setter Property="Foreground" Value="{DynamicResource SecondaryAccentBrush}" />
|
||||||
|
<Setter Property="Height" Value="2" />
|
||||||
|
<Setter Property="Maximum" Value="1" />
|
||||||
|
<Setter Property="Minimum" Value="0" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style BasedOn="{StaticResource MaterialDesignTextBox}" TargetType="{x:Type TextBox}">
|
||||||
|
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style BasedOn="{StaticResource MaterialDesignComboBox}" TargetType="{x:Type ComboBox}">
|
||||||
|
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<!-- Converters -->
|
||||||
|
<converters:ExportFormatToStringConverter x:Key="ExportFormatToStringConverter" />
|
||||||
|
|
||||||
|
<!-- Container -->
|
||||||
|
<local:Container x:Key="Container" />
|
||||||
|
</ResourceDictionary>
|
||||||
|
</Application.Resources>
|
||||||
|
</Application>
|
@ -1,27 +0,0 @@
|
|||||||
using MaterialDesignThemes.Wpf
|
|
||||||
|
|
||||||
UserControl "DiscordChatExporter.Gui.Views.ErrorDialog" {
|
|
||||||
DataContext: bind ErrorViewModel from $resource Container
|
|
||||||
Width: 250
|
|
||||||
|
|
||||||
StackPanel {
|
|
||||||
// Message
|
|
||||||
TextBlock {
|
|
||||||
Margin: 16
|
|
||||||
FontSize: 16
|
|
||||||
TextWrapping: WrapWithOverflow
|
|
||||||
Text: bind Message
|
|
||||||
}
|
|
||||||
|
|
||||||
// OK
|
|
||||||
Button {
|
|
||||||
Margin: 8
|
|
||||||
Command: DialogHost.CloseDialogCommand
|
|
||||||
Content: "OK"
|
|
||||||
HorizontalAlignment: Right
|
|
||||||
IsDefault: true
|
|
||||||
IsCancel: true
|
|
||||||
Style: resource dyn "MaterialDesignFlatButton"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,89 +0,0 @@
|
|||||||
using DiscordChatExporter.Core.Models
|
|
||||||
using MaterialDesignThemes.Wpf
|
|
||||||
|
|
||||||
UserControl "DiscordChatExporter.Gui.Views.ExportSetupDialog" {
|
|
||||||
DataContext: bind ExportSetupViewModel from $resource Container
|
|
||||||
Width: 325
|
|
||||||
|
|
||||||
StackPanel {
|
|
||||||
// File path
|
|
||||||
TextBox {
|
|
||||||
Margin: [16, 16, 16, 8]
|
|
||||||
HintAssist.Hint: "Output file"
|
|
||||||
HintAssist.IsFloating: true
|
|
||||||
IsReadOnly: true
|
|
||||||
Text: bind FilePath
|
|
||||||
set [ UpdateSourceTrigger: PropertyChanged ]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format
|
|
||||||
ComboBox {
|
|
||||||
Margin: [16, 8, 16, 8]
|
|
||||||
HintAssist.Hint: "Export format"
|
|
||||||
HintAssist.IsFloating: true
|
|
||||||
IsReadOnly: true
|
|
||||||
ItemsSource: bind AvailableFormats
|
|
||||||
SelectedItem: bind SelectedFormat
|
|
||||||
|
|
||||||
ItemTemplate: DataTemplate {
|
|
||||||
TextBlock {
|
|
||||||
Text: bind
|
|
||||||
convert (ExportFormat f) => Extensions.GetDisplayName(f)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Date range
|
|
||||||
Grid {
|
|
||||||
#TwoColumns("*", "*")
|
|
||||||
|
|
||||||
DatePicker {
|
|
||||||
#Cell(0, 0)
|
|
||||||
Margin: [16, 20, 8, 8]
|
|
||||||
HintAssist.Hint: "From (optional)"
|
|
||||||
HintAssist.IsFloating: true
|
|
||||||
SelectedDate: bind From
|
|
||||||
}
|
|
||||||
|
|
||||||
DatePicker {
|
|
||||||
#Cell(0, 1)
|
|
||||||
Margin: [8, 20, 16, 8]
|
|
||||||
HintAssist.Hint: "To (optional)"
|
|
||||||
HintAssist.IsFloating: true
|
|
||||||
SelectedDate: bind To
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Buttons
|
|
||||||
@StackPanelHorizontal {
|
|
||||||
HorizontalAlignment: Right
|
|
||||||
|
|
||||||
// Browse
|
|
||||||
Button "BrowseButton" {
|
|
||||||
Margin: 8
|
|
||||||
Click: BrowseButton_Click
|
|
||||||
Content: "BROWSE"
|
|
||||||
Style: resource dyn "MaterialDesignFlatButton"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Export
|
|
||||||
Button "ExportButton" {
|
|
||||||
Margin: 8
|
|
||||||
Click: ExportButton_Click
|
|
||||||
Command: bind ExportCommand
|
|
||||||
Content: "EXPORT"
|
|
||||||
IsDefault: true
|
|
||||||
Style: resource dyn "MaterialDesignFlatButton"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cancel
|
|
||||||
Button {
|
|
||||||
Margin: 8
|
|
||||||
Command: DialogHost.CloseDialogCommand
|
|
||||||
Content: "CANCEL"
|
|
||||||
IsCancel: true
|
|
||||||
Style: resource dyn "MaterialDesignFlatButton"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,78 @@
|
|||||||
|
<UserControl
|
||||||
|
x:Class="DiscordChatExporter.Gui.Views.ExportSetupDialog"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
|
Width="325"
|
||||||
|
DataContext="{Binding ExportSetupViewModel, Source={StaticResource Container}}">
|
||||||
|
<StackPanel>
|
||||||
|
<!-- File path -->
|
||||||
|
<TextBox
|
||||||
|
Margin="16,16,16,8"
|
||||||
|
materialDesign:HintAssist.Hint="Output file"
|
||||||
|
materialDesign:HintAssist.IsFloating="True"
|
||||||
|
IsReadOnly="True"
|
||||||
|
Text="{Binding FilePath, UpdateSourceTrigger=PropertyChanged}" />
|
||||||
|
|
||||||
|
<!-- Format -->
|
||||||
|
<ComboBox
|
||||||
|
Margin="16,8,16,8"
|
||||||
|
materialDesign:HintAssist.Hint="Export format"
|
||||||
|
materialDesign:HintAssist.IsFloating="True"
|
||||||
|
IsReadOnly="True"
|
||||||
|
ItemsSource="{Binding AvailableFormats}"
|
||||||
|
SelectedItem="{Binding SelectedFormat}">
|
||||||
|
<ComboBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<TextBlock Text="{Binding Converter={StaticResource ExportFormatToStringConverter}}" />
|
||||||
|
</DataTemplate>
|
||||||
|
</ComboBox.ItemTemplate>
|
||||||
|
</ComboBox>
|
||||||
|
|
||||||
|
<!-- Date limits -->
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<DatePicker
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="16,20,8,8"
|
||||||
|
materialDesign:HintAssist.Hint="From (optional)"
|
||||||
|
materialDesign:HintAssist.IsFloating="True"
|
||||||
|
SelectedDate="{Binding From}" />
|
||||||
|
<DatePicker
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="8,20,16,8"
|
||||||
|
materialDesign:HintAssist.Hint="To (optional)"
|
||||||
|
materialDesign:HintAssist.IsFloating="True"
|
||||||
|
SelectedDate="{Binding To}" />
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<!-- Buttons -->
|
||||||
|
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal">
|
||||||
|
<Button
|
||||||
|
x:Name="BrowseButton"
|
||||||
|
Margin="8"
|
||||||
|
Click="BrowseButton_Click"
|
||||||
|
Content="BROWSE"
|
||||||
|
Style="{DynamicResource MaterialDesignFlatButton}" />
|
||||||
|
<Button
|
||||||
|
x:Name="ExportButton"
|
||||||
|
Margin="8"
|
||||||
|
Click="ExportButton_Click"
|
||||||
|
Command="{Binding ExportCommand}"
|
||||||
|
Content="EXPORT"
|
||||||
|
IsDefault="True"
|
||||||
|
Style="{DynamicResource MaterialDesignFlatButton}" />
|
||||||
|
<Button
|
||||||
|
Margin="8"
|
||||||
|
Command="{x:Static materialDesign:DialogHost.CloseDialogCommand}"
|
||||||
|
Content="CANCEL"
|
||||||
|
IsCancel="True"
|
||||||
|
Style="{DynamicResource MaterialDesignFlatButton}" />
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</UserControl>
|
@ -1,290 +0,0 @@
|
|||||||
using System.Windows.Interactivity;
|
|
||||||
using MaterialDesignThemes.Wpf
|
|
||||||
using MaterialDesignThemes.Wpf.Transitions
|
|
||||||
|
|
||||||
Window "DiscordChatExporter.Gui.Views.MainWindow" {
|
|
||||||
Title: "DiscordChatExporter"
|
|
||||||
Width: 600
|
|
||||||
Height: 550
|
|
||||||
Background: resource dyn "MaterialDesignPaper"
|
|
||||||
DataContext: bind MainViewModel from $resource Container
|
|
||||||
FocusManager.FocusedElement: bind from "TokenTextBox"
|
|
||||||
FontFamily: resource dyn "MaterialDesignFont"
|
|
||||||
Icon: "/DiscordChatExporter;component/favicon.ico"
|
|
||||||
SnapsToDevicePixels: true
|
|
||||||
TextElement.FontSize: 13
|
|
||||||
TextElement.FontWeight: Regular
|
|
||||||
TextElement.Foreground: resource dyn "SecondaryTextBrush"
|
|
||||||
TextOptions.TextFormattingMode: Ideal
|
|
||||||
TextOptions.TextRenderingMode: Auto
|
|
||||||
UseLayoutRounding: true
|
|
||||||
WindowStartupLocation: CenterScreen
|
|
||||||
|
|
||||||
Interaction.Triggers: [
|
|
||||||
Interactivity.EventTrigger {
|
|
||||||
EventName: "Loaded"
|
|
||||||
InvokeCommandAction { Command: bind ViewLoadedCommand }
|
|
||||||
},
|
|
||||||
Interactivity.EventTrigger {
|
|
||||||
EventName: "Closed"
|
|
||||||
InvokeCommandAction { Command: bind ViewClosedCommand }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
DialogHost {
|
|
||||||
SnackbarMessageQueue: bind MessageQueue from "Snackbar"
|
|
||||||
|
|
||||||
DockPanel {
|
|
||||||
// Toolbar
|
|
||||||
Border {
|
|
||||||
DockPanel.Dock: Top
|
|
||||||
Background: resource dyn "PrimaryHueMidBrush"
|
|
||||||
IsEnabled: bind IsBusy
|
|
||||||
convert (bool b) => b ? false : true
|
|
||||||
TextElement.Foreground: resource dyn "SecondaryInverseTextBrush"
|
|
||||||
StackPanel {
|
|
||||||
Grid {
|
|
||||||
#TwoColumns("*", "Auto")
|
|
||||||
|
|
||||||
Card {
|
|
||||||
#Cell(0, 0)
|
|
||||||
Margin: [6, 6, 0, 6]
|
|
||||||
|
|
||||||
Grid {
|
|
||||||
#TwoColumns("*", "Auto")
|
|
||||||
|
|
||||||
// Token
|
|
||||||
TextBox "TokenTextBox" {
|
|
||||||
#Cell(0, 0)
|
|
||||||
Margin: 6
|
|
||||||
BorderThickness: 0
|
|
||||||
HintAssist.Hint: "Token"
|
|
||||||
FontSize: 16
|
|
||||||
Text: bind Token
|
|
||||||
set [ UpdateSourceTrigger: PropertyChanged ]
|
|
||||||
TextFieldAssist.DecorationVisibility: Hidden
|
|
||||||
TextFieldAssist.TextBoxViewMargin: [0, 0, 2, 0]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Submit
|
|
||||||
Button {
|
|
||||||
#Cell(0, 1)
|
|
||||||
Margin: [0, 6, 6, 6]
|
|
||||||
Padding: 4
|
|
||||||
Command: bind PullDataCommand
|
|
||||||
IsDefault: true
|
|
||||||
Style: resource dyn "MaterialDesignFlatButton"
|
|
||||||
|
|
||||||
PackIcon {
|
|
||||||
Width: 24
|
|
||||||
Height: 24
|
|
||||||
Kind: PackIconKind.ArrowRight
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Popup menu
|
|
||||||
PopupBox {
|
|
||||||
#Cell(0, 1)
|
|
||||||
Foreground: resource dyn "PrimaryHueMidForegroundBrush"
|
|
||||||
PlacementMode: LeftAndAlignTopEdges
|
|
||||||
|
|
||||||
StackPanel {
|
|
||||||
Button {
|
|
||||||
Command: bind ShowSettingsCommand
|
|
||||||
Content: "Settings"
|
|
||||||
}
|
|
||||||
Button {
|
|
||||||
Command: bind ShowAboutCommand
|
|
||||||
Content: "About"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Progress
|
|
||||||
ProgressBar {
|
|
||||||
Background: Transparent
|
|
||||||
IsIndeterminate: true
|
|
||||||
Visibility: bind IsBusy
|
|
||||||
convert (bool b) => b ? Visibility.Visible : Visibility.Hidden
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Content
|
|
||||||
Grid {
|
|
||||||
DockPanel {
|
|
||||||
Background: resource dyn "MaterialDesignCardBackground"
|
|
||||||
IsEnabled: bind IsBusy
|
|
||||||
convert (bool b) => b ? false : true
|
|
||||||
Visibility: bind IsDataAvailable
|
|
||||||
convert (bool b) => b ? Visibility.Visible : Visibility.Hidden
|
|
||||||
|
|
||||||
// Guilds
|
|
||||||
Border {
|
|
||||||
DockPanel.Dock: Left
|
|
||||||
BorderBrush: resource dyn "DividerBrush"
|
|
||||||
BorderThickness: "0 0 1 0"
|
|
||||||
|
|
||||||
ListBox {
|
|
||||||
ItemsSource: bind AvailableGuilds
|
|
||||||
ScrollViewer.VerticalScrollBarVisibility: Hidden
|
|
||||||
SelectedItem: bind SelectedGuild
|
|
||||||
VirtualizingStackPanel.IsVirtualizing: false
|
|
||||||
|
|
||||||
ItemTemplate: DataTemplate {
|
|
||||||
TransitioningContent {
|
|
||||||
OpeningEffect: TransitionEffect {
|
|
||||||
Duration: "0:0:0.3"
|
|
||||||
Kind: SlideInFromLeft
|
|
||||||
}
|
|
||||||
|
|
||||||
Border {
|
|
||||||
Margin: -8
|
|
||||||
Background: Transparent
|
|
||||||
Cursor: CursorType.Hand
|
|
||||||
|
|
||||||
Image {
|
|
||||||
Margin: [12, 4, 12, 4]
|
|
||||||
Width: 48
|
|
||||||
Height: 48
|
|
||||||
Source: bind IconUrl
|
|
||||||
ToolTip: bind Name
|
|
||||||
OpacityMask: RadialGradientBrush {
|
|
||||||
GradientStops: [
|
|
||||||
GradientStop { Color: "#FF000000", Offset: 0 }
|
|
||||||
GradientStop { Color: "#FF000000", Offset: 0.96 }
|
|
||||||
GradientStop { Color: "#00000000", Offset: 1 }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Channels
|
|
||||||
Border {
|
|
||||||
ListBox {
|
|
||||||
ItemsSource: bind AvailableChannels
|
|
||||||
HorizontalContentAlignment: Stretch
|
|
||||||
VirtualizingStackPanel.IsVirtualizing: false
|
|
||||||
|
|
||||||
ItemTemplate: DataTemplate {
|
|
||||||
TransitioningContent {
|
|
||||||
OpeningEffect: TransitionEffect {
|
|
||||||
Duration: "0:0:0.3"
|
|
||||||
Kind: SlideInFromLeft
|
|
||||||
}
|
|
||||||
|
|
||||||
@StackPanelHorizontal {
|
|
||||||
Margin: -8
|
|
||||||
Background: Transparent
|
|
||||||
Cursor: CursorType.Hand
|
|
||||||
InputBindings: [
|
|
||||||
MouseBinding {
|
|
||||||
Command: bind DataContext.ShowExportSetupCommand from $ancestor<ItemsControl>
|
|
||||||
CommandParameter: bind
|
|
||||||
MouseAction: LeftClick
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
PackIcon {
|
|
||||||
Margin: [16, 7, 0, 6]
|
|
||||||
Kind: PackIconKind.Pound
|
|
||||||
VerticalAlignment: Center
|
|
||||||
}
|
|
||||||
TextBlock {
|
|
||||||
Margin: [3, 8, 8, 8]
|
|
||||||
FontSize: 14
|
|
||||||
Text: bind Name
|
|
||||||
VerticalAlignment: Center
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Content placeholder
|
|
||||||
StackPanel {
|
|
||||||
Margin: [32, 32, 8, 8]
|
|
||||||
Visibility: bind IsDataAvailable
|
|
||||||
convert (bool b) => b ? Visibility.Hidden : Visibility.Visible
|
|
||||||
|
|
||||||
TextBlock {
|
|
||||||
FontSize: 18
|
|
||||||
Text: "DiscordChatExporter needs your authorization token to work."
|
|
||||||
}
|
|
||||||
|
|
||||||
TextBlock {
|
|
||||||
Margin: [0, 8, 0, 0]
|
|
||||||
FontSize: 16
|
|
||||||
Text: "To obtain it, follow these steps:"
|
|
||||||
}
|
|
||||||
|
|
||||||
TextBlock {
|
|
||||||
Margin: [8, 0, 0, 0]
|
|
||||||
FontSize: 14
|
|
||||||
|
|
||||||
Run {
|
|
||||||
Text: "1. Open the Discord app"
|
|
||||||
}
|
|
||||||
LineBreak { }
|
|
||||||
Run {
|
|
||||||
Text: "2. Log in if you haven't"
|
|
||||||
}
|
|
||||||
LineBreak { }
|
|
||||||
Run {
|
|
||||||
Text: "3. Press"
|
|
||||||
}
|
|
||||||
Run {
|
|
||||||
Text: "Ctrl+Shift+I"
|
|
||||||
Foreground: resource dyn "PrimaryTextBrush"
|
|
||||||
}
|
|
||||||
LineBreak { }
|
|
||||||
Run {
|
|
||||||
Text: "4. Navigate to"
|
|
||||||
}
|
|
||||||
Run {
|
|
||||||
Text: "Application"
|
|
||||||
Foreground: resource dyn "PrimaryTextBrush"
|
|
||||||
}
|
|
||||||
Run { Text: "tab" }
|
|
||||||
LineBreak { }
|
|
||||||
Run {
|
|
||||||
Text: "5. Expand"
|
|
||||||
}
|
|
||||||
Run {
|
|
||||||
Text: "Storage > Local Storage > https://discordapp.com"
|
|
||||||
Foreground: resource dyn "PrimaryTextBrush"
|
|
||||||
}
|
|
||||||
LineBreak { }
|
|
||||||
Run {
|
|
||||||
Text: "6. Find"
|
|
||||||
}
|
|
||||||
Run {
|
|
||||||
Text: ""token""
|
|
||||||
Foreground: resource dyn "PrimaryTextBrush"
|
|
||||||
}
|
|
||||||
Run {
|
|
||||||
Text: "under key and copy the value"
|
|
||||||
}
|
|
||||||
LineBreak { }
|
|
||||||
Run {
|
|
||||||
Text: "7. Paste the value in the textbox above"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Snackbar
|
|
||||||
Snackbar "Snackbar" {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,229 @@
|
|||||||
|
<Window
|
||||||
|
x:Class="DiscordChatExporter.Gui.Views.MainWindow"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
|
||||||
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
|
Title="DiscordChatExporter"
|
||||||
|
Width="600"
|
||||||
|
Height="550"
|
||||||
|
Background="{DynamicResource MaterialDesignPaper}"
|
||||||
|
DataContext="{Binding MainViewModel, Source={StaticResource Container}}"
|
||||||
|
FocusManager.FocusedElement="{Binding ElementName=TokenTextBox}"
|
||||||
|
FontFamily="{DynamicResource MaterialDesignFont}"
|
||||||
|
Icon="/DiscordChatExporter;component/favicon.ico"
|
||||||
|
SnapsToDevicePixels="True"
|
||||||
|
TextElement.FontSize="13"
|
||||||
|
TextElement.FontWeight="Regular"
|
||||||
|
TextElement.Foreground="{DynamicResource SecondaryTextBrush}"
|
||||||
|
TextOptions.TextFormattingMode="Ideal"
|
||||||
|
TextOptions.TextRenderingMode="Auto"
|
||||||
|
UseLayoutRounding="True"
|
||||||
|
WindowStartupLocation="CenterScreen">
|
||||||
|
<i:Interaction.Triggers>
|
||||||
|
<i:EventTrigger EventName="Loaded">
|
||||||
|
<i:InvokeCommandAction Command="{Binding ViewLoadedCommand}" />
|
||||||
|
</i:EventTrigger>
|
||||||
|
<i:EventTrigger EventName="Closed">
|
||||||
|
<i:InvokeCommandAction Command="{Binding ViewClosedCommand}" />
|
||||||
|
</i:EventTrigger>
|
||||||
|
</i:Interaction.Triggers>
|
||||||
|
<materialDesign:DialogHost SnackbarMessageQueue="{Binding ElementName=Snackbar}">
|
||||||
|
<DockPanel>
|
||||||
|
<!-- Toolbar -->
|
||||||
|
<Border
|
||||||
|
Background="{DynamicResource PrimaryHueMidBrush}"
|
||||||
|
DockPanel.Dock="Top"
|
||||||
|
IsEnabled="{Binding IsBusy, Converter={StaticResource InvertBoolConverter}}"
|
||||||
|
TextElement.Foreground="{DynamicResource SecondaryInverseTextBrush}">
|
||||||
|
<StackPanel>
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<materialDesign:Card
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="6,6,0,6">
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
|
<!-- Token -->
|
||||||
|
<TextBox
|
||||||
|
x:Name="TokenTextBox"
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="6"
|
||||||
|
materialDesign:HintAssist.Hint="Token"
|
||||||
|
materialDesign:TextFieldAssist.DecorationVisibility="Hidden"
|
||||||
|
materialDesign:TextFieldAssist.TextBoxViewMargin="0,0,2,0"
|
||||||
|
BorderThickness="0"
|
||||||
|
FontSize="16"
|
||||||
|
Text="{Binding Token, UpdateSourceTrigger=PropertyChanged}" />
|
||||||
|
|
||||||
|
<!-- Pull data button -->
|
||||||
|
<Button
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="0,6,6,6"
|
||||||
|
Padding="4"
|
||||||
|
Command="{Binding PullDataCommand}"
|
||||||
|
IsDefault="True"
|
||||||
|
Style="{DynamicResource MaterialDesignFlatButton}">
|
||||||
|
<materialDesign:PackIcon
|
||||||
|
Width="24"
|
||||||
|
Height="24"
|
||||||
|
Kind="ArrowRight" />
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
</materialDesign:Card>
|
||||||
|
|
||||||
|
<!-- Menu -->
|
||||||
|
<materialDesign:PopupBox
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="1"
|
||||||
|
Foreground="{DynamicResource PrimaryHueMidForegroundBrush}"
|
||||||
|
PlacementMode="LeftAndAlignTopEdges">
|
||||||
|
<StackPanel>
|
||||||
|
<Button Command="{Binding ShowSettingsCommand}" Content="Settings" />
|
||||||
|
<Button Command="{Binding ShowAboutCommand}" Content="About" />
|
||||||
|
</StackPanel>
|
||||||
|
</materialDesign:PopupBox>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<!-- Progress bar -->
|
||||||
|
<ProgressBar
|
||||||
|
Background="Transparent"
|
||||||
|
IsIndeterminate="True"
|
||||||
|
Visibility="{Binding IsBusy, Converter={StaticResource BoolToVisibilityConverter}}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<Grid>
|
||||||
|
<DockPanel
|
||||||
|
Background="{DynamicResource MaterialDesignCardBackground}"
|
||||||
|
IsEnabled="{Binding IsBusy, Converter={StaticResource InvertBoolConverter}}"
|
||||||
|
Visibility="{Binding IsDataAvailable, Converter={StaticResource BoolToVisibilityConverter}}">
|
||||||
|
|
||||||
|
<!-- Guilds -->
|
||||||
|
<Border
|
||||||
|
BorderBrush="{DynamicResource DividerBrush}"
|
||||||
|
BorderThickness="0,0,1,0"
|
||||||
|
DockPanel.Dock="Left">
|
||||||
|
<ListBox
|
||||||
|
ItemsSource="{Binding AvailableGuilds}"
|
||||||
|
ScrollViewer.VerticalScrollBarVisibility="Hidden"
|
||||||
|
SelectedItem="{Binding SelectedGuild}"
|
||||||
|
VirtualizingStackPanel.IsVirtualizing="False">
|
||||||
|
<ListBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<materialDesign:TransitioningContent>
|
||||||
|
<materialDesign:TransitioningContent.OpeningEffect>
|
||||||
|
<materialDesign:TransitionEffect Kind="SlideInFromLeft" Duration="0:0:0.3" />
|
||||||
|
</materialDesign:TransitioningContent.OpeningEffect>
|
||||||
|
<Border
|
||||||
|
Margin="-8"
|
||||||
|
Background="Transparent"
|
||||||
|
Cursor="Hand">
|
||||||
|
<Image
|
||||||
|
Width="48"
|
||||||
|
Height="48"
|
||||||
|
Margin="12,4,12,4"
|
||||||
|
Source="{Binding IconUrl}"
|
||||||
|
ToolTip="{Binding Name}">
|
||||||
|
<Image.OpacityMask>
|
||||||
|
<RadialGradientBrush>
|
||||||
|
<RadialGradientBrush.GradientStops>
|
||||||
|
<GradientStop Offset="0" Color="#FF000000" />
|
||||||
|
<GradientStop Offset="0.96" Color="#FF000000" />
|
||||||
|
<GradientStop Offset="1" Color="#00000000" />
|
||||||
|
</RadialGradientBrush.GradientStops>
|
||||||
|
</RadialGradientBrush>
|
||||||
|
</Image.OpacityMask>
|
||||||
|
</Image>
|
||||||
|
</Border>
|
||||||
|
</materialDesign:TransitioningContent>
|
||||||
|
</DataTemplate>
|
||||||
|
</ListBox.ItemTemplate>
|
||||||
|
</ListBox>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<!-- Channels -->
|
||||||
|
<Border>
|
||||||
|
<ListBox
|
||||||
|
HorizontalContentAlignment="Stretch"
|
||||||
|
ItemsSource="{Binding AvailableChannels}"
|
||||||
|
VirtualizingStackPanel.IsVirtualizing="False">
|
||||||
|
<ListBox.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<materialDesign:TransitioningContent>
|
||||||
|
<materialDesign:TransitioningContent.OpeningEffect>
|
||||||
|
<materialDesign:TransitionEffect Kind="SlideInFromLeft" Duration="0:0:0.3" />
|
||||||
|
</materialDesign:TransitioningContent.OpeningEffect>
|
||||||
|
<StackPanel
|
||||||
|
Margin="-8"
|
||||||
|
Background="Transparent"
|
||||||
|
Cursor="Hand"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<StackPanel.InputBindings>
|
||||||
|
<MouseBinding
|
||||||
|
Command="{Binding DataContext.ShowExportSetupCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"
|
||||||
|
CommandParameter="{Binding}"
|
||||||
|
MouseAction="LeftClick" />
|
||||||
|
</StackPanel.InputBindings>
|
||||||
|
<materialDesign:PackIcon
|
||||||
|
Margin="16,7,0,6"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Kind="Pound" />
|
||||||
|
<TextBlock
|
||||||
|
Margin="3,8,8,8"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
FontSize="14"
|
||||||
|
Text="{Binding Name}" />
|
||||||
|
</StackPanel>
|
||||||
|
</materialDesign:TransitioningContent>
|
||||||
|
</DataTemplate>
|
||||||
|
</ListBox.ItemTemplate>
|
||||||
|
</ListBox>
|
||||||
|
</Border>
|
||||||
|
</DockPanel>
|
||||||
|
|
||||||
|
<!-- Usage instructions -->
|
||||||
|
<StackPanel Margin="32,32,8,8" Visibility="{Binding IsDataAvailable, Converter={StaticResource InvertBoolToVisibilityConverter}}">
|
||||||
|
<TextBlock FontSize="18" Text="DiscordChatExporter needs your authorization token to work." />
|
||||||
|
<TextBlock
|
||||||
|
Margin="0,8,0,0"
|
||||||
|
FontSize="16"
|
||||||
|
Text="To obtain it, follow these steps:" />
|
||||||
|
<TextBlock Margin="8,0,0,0" FontSize="14">
|
||||||
|
<Run Text="1. Open the Discord app" />
|
||||||
|
<LineBreak />
|
||||||
|
<Run Text="2. Log in if you haven't" />
|
||||||
|
<LineBreak />
|
||||||
|
<Run Text="3. Press" />
|
||||||
|
<Run Foreground="{DynamicResource PrimaryTextBrush}" Text="Ctrl+Shift+I" />
|
||||||
|
<LineBreak />
|
||||||
|
<Run Text="4. Navigate to" />
|
||||||
|
<Run Foreground="{DynamicResource PrimaryTextBrush}" Text="Application" />
|
||||||
|
<Run Text="tab" />
|
||||||
|
<LineBreak />
|
||||||
|
<Run Text="5. Expand" />
|
||||||
|
<Run Foreground="{DynamicResource PrimaryTextBrush}" Text="Storage > Local Storage > https://discordapp.com" />
|
||||||
|
<LineBreak />
|
||||||
|
<Run Text="6. Find" />
|
||||||
|
<Run Foreground="{DynamicResource PrimaryTextBrush}" Text=""token"" />
|
||||||
|
<Run Text="under key and copy the value" />
|
||||||
|
<LineBreak />
|
||||||
|
<Run Text="7. Paste the value in the textbox above" />
|
||||||
|
</TextBlock>
|
||||||
|
</StackPanel>
|
||||||
|
<materialDesign:Snackbar x:Name="Snackbar" />
|
||||||
|
</Grid>
|
||||||
|
</DockPanel>
|
||||||
|
</materialDesign:DialogHost>
|
||||||
|
</Window>
|
@ -1,52 +0,0 @@
|
|||||||
using MaterialDesignThemes.Wpf
|
|
||||||
|
|
||||||
UserControl "DiscordChatExporter.Gui.Views.SettingsDialog" {
|
|
||||||
DataContext: bind SettingsViewModel from $resource Container
|
|
||||||
Width: 250
|
|
||||||
|
|
||||||
StackPanel {
|
|
||||||
// Date format
|
|
||||||
TextBox {
|
|
||||||
Margin: [16, 16, 16, 8]
|
|
||||||
HintAssist.Hint: "Date format"
|
|
||||||
HintAssist.IsFloating: true
|
|
||||||
Text: bind DateFormat
|
|
||||||
}
|
|
||||||
|
|
||||||
// Group limit
|
|
||||||
TextBox {
|
|
||||||
Margin: [16, 8, 16, 8]
|
|
||||||
HintAssist.Hint: "Message group limit"
|
|
||||||
HintAssist.IsFloating: true
|
|
||||||
Text: bind MessageGroupLimit
|
|
||||||
}
|
|
||||||
|
|
||||||
// Auto-update
|
|
||||||
DockPanel {
|
|
||||||
LastChildFill: false
|
|
||||||
|
|
||||||
TextBlock {
|
|
||||||
Margin: [16, 8, 16, 8]
|
|
||||||
DockPanel.Dock: Left
|
|
||||||
Text: "Auto-updates"
|
|
||||||
}
|
|
||||||
|
|
||||||
ToggleButton {
|
|
||||||
Margin: [16, 8, 16, 8]
|
|
||||||
DockPanel.Dock: Right
|
|
||||||
IsChecked: bind IsAutoUpdateEnabled
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save
|
|
||||||
Button {
|
|
||||||
Margin: 8
|
|
||||||
Command: DialogHost.CloseDialogCommand
|
|
||||||
Content: "SAVE"
|
|
||||||
HorizontalAlignment: Right
|
|
||||||
IsDefault: true
|
|
||||||
IsCancel: true
|
|
||||||
Style: resource dyn "MaterialDesignFlatButton"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,45 @@
|
|||||||
|
<UserControl
|
||||||
|
x:Class="DiscordChatExporter.Gui.Views.SettingsDialog"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
|
Width="250"
|
||||||
|
DataContext="{Binding SettingsViewModel, Source={StaticResource Container}}">
|
||||||
|
<StackPanel>
|
||||||
|
<!-- Date format -->
|
||||||
|
<TextBox
|
||||||
|
Margin="16,16,16,8"
|
||||||
|
materialDesign:HintAssist.Hint="Date format"
|
||||||
|
materialDesign:HintAssist.IsFloating="True"
|
||||||
|
Text="{Binding DateFormat}" />
|
||||||
|
|
||||||
|
<!-- Message group limit -->
|
||||||
|
<TextBox
|
||||||
|
Margin="16,8,16,8"
|
||||||
|
materialDesign:HintAssist.Hint="Message group limit"
|
||||||
|
materialDesign:HintAssist.IsFloating="True"
|
||||||
|
Text="{Binding MessageGroupLimit}" />
|
||||||
|
|
||||||
|
<!-- Auto-updates -->
|
||||||
|
<DockPanel LastChildFill="False">
|
||||||
|
<TextBlock
|
||||||
|
Margin="16,8,16,8"
|
||||||
|
DockPanel.Dock="Left"
|
||||||
|
Text="Auto-updates" />
|
||||||
|
<ToggleButton
|
||||||
|
Margin="16,8,16,8"
|
||||||
|
DockPanel.Dock="Right"
|
||||||
|
IsChecked="{Binding IsAutoUpdateEnabled}" />
|
||||||
|
</DockPanel>
|
||||||
|
|
||||||
|
<!-- Save button -->
|
||||||
|
<Button
|
||||||
|
Margin="8"
|
||||||
|
HorizontalAlignment="Right"
|
||||||
|
Command="{x:Static materialDesign:DialogHost.CloseDialogCommand}"
|
||||||
|
Content="SAVE"
|
||||||
|
IsCancel="True"
|
||||||
|
IsDefault="True"
|
||||||
|
Style="{DynamicResource MaterialDesignFlatButton}" />
|
||||||
|
</StackPanel>
|
||||||
|
</UserControl>
|
@ -1,238 +0,0 @@
|
|||||||
mixin TwoColumns (one = "*", two = "*") for Grid {
|
|
||||||
combine ColumnDefinitions: [
|
|
||||||
ColumnDefinition { Width: $one }
|
|
||||||
ColumnDefinition { Width: $two }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin ThreeColumns (one = none, two = none, three = none) for Grid {
|
|
||||||
#TwoColumns($one, $two)
|
|
||||||
combine ColumnDefinitions: ColumnDefinition { Width: $three }
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin FourColumns (one = none, two = none, three = none, four = none) for Grid {
|
|
||||||
#ThreeColumns($one, $two, $three)
|
|
||||||
combine ColumnDefinitions: ColumnDefinition { Width: $four }
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin FiveColumns (one = none, two = none, three = none, four = none, five = none) for Grid {
|
|
||||||
#FourColumns($one, $two, $three, $four)
|
|
||||||
combine ColumnDefinitions: ColumnDefinition { Width: $five }
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin TwoRows (one = none, two = none) for Grid
|
|
||||||
{
|
|
||||||
combine RowDefinitions: [
|
|
||||||
RowDefinition { Height: $one }
|
|
||||||
RowDefinition { Height: $two }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin ThreeRows (one = none, two = none, three = none) for Grid
|
|
||||||
{
|
|
||||||
#TwoRows($one, $two)
|
|
||||||
combine RowDefinitions: RowDefinition { Height: $three }
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin FourRows (one = none, two = none, three = none, four = none) for Grid
|
|
||||||
{
|
|
||||||
#ThreeRows($one, $two, $three)
|
|
||||||
combine RowDefinitions: RowDefinition { Height: $four }
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin FiveRows (one = none, two = none, three = none, four = none, five = none) for Grid
|
|
||||||
{
|
|
||||||
#FourRows($one, $two, $three, $four)
|
|
||||||
combine RowDefinitions: RowDefinition { Height: $five }
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin Cell (row = none, column = none, rowSpan = none, columnSpan = none) for FrameworkElement {
|
|
||||||
Grid.Row: $row
|
|
||||||
Grid.Column: $column
|
|
||||||
Grid.RowSpan: $rowSpan
|
|
||||||
Grid.ColumnSpan: $columnSpan
|
|
||||||
}
|
|
||||||
|
|
||||||
alias ImageCached(source) {
|
|
||||||
Image {
|
|
||||||
Source: BitmapImage {
|
|
||||||
UriCachePolicy: "Revalidate"
|
|
||||||
UriSource: $source
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin Setter(property, value, targetName=none) for Style {
|
|
||||||
Setter { Property: $property, Value: $value, TargetName: $targetName }
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
mixin AddSetter(property, value, targetName=none) for Style {
|
|
||||||
combine Setters: #Setter($property, $value, $targetName) {}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
alias DataTrigger(binding, bindingValue) {
|
|
||||||
DataTrigger { Binding: $binding, Value: $bindingValue }
|
|
||||||
}
|
|
||||||
|
|
||||||
alias Trigger(property, value) {
|
|
||||||
Trigger { Property: $property, Value: $value }
|
|
||||||
}
|
|
||||||
|
|
||||||
alias EventTrigger(event, sourceName=none) {
|
|
||||||
EventTrigger { RoutedEvent: $event, SourceName: $sourceName }
|
|
||||||
}
|
|
||||||
|
|
||||||
alias DataTrigger_SetProperty(binding, bindingValue, property, propertyValue) {
|
|
||||||
@DataTrigger ($binding, $bindingValue) {
|
|
||||||
#Setter($property, $propertyValue)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
alias Trigger_SetProperty(triggerProperty, triggerValue, property, propertyValue) {
|
|
||||||
@Trigger ($triggerProperty, $triggerValue) {
|
|
||||||
#Setter($property, $propertyValue)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
alias EventTrigger_SetProperty(event, property, propertyValue) {
|
|
||||||
@EventTrigger ($event) {
|
|
||||||
#Setter($property, $propertyValue)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
alias VisibleIf_DataTrigger(binding, valueForVisible) {
|
|
||||||
@DataTrigger_SetProperty($binding, $valueForVisible, "Visibility", "Visible") {}
|
|
||||||
}
|
|
||||||
|
|
||||||
alias CollapsedIf_DataTrigger(binding, valueForCollapsed) {
|
|
||||||
@DataTrigger_SetProperty($binding, $valueForCollapsed, "Visibility", "Collapsed") {}
|
|
||||||
}
|
|
||||||
|
|
||||||
alias StackPanelHorizontal() {
|
|
||||||
StackPanel {
|
|
||||||
Orientation: Horizontal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
alias GridItemsControl() {
|
|
||||||
ItemsControl {
|
|
||||||
ScrollViewer.HorizontalScrollBarVisibility: Disabled,
|
|
||||||
|
|
||||||
ItemsPanel: ItemsPanelTemplate {
|
|
||||||
WrapPanel {
|
|
||||||
IsItemsHost: true
|
|
||||||
Orientation: Horizontal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////
|
|
||||||
// Animations //
|
|
||||||
////////////////
|
|
||||||
|
|
||||||
alias DoubleAnimation(property, frm = "0", to = "1", duration = "0:0:1", targetName=none, beginTime=none) {
|
|
||||||
DoubleAnimation {
|
|
||||||
Storyboard.TargetProperty: $property
|
|
||||||
Storyboard.TargetName: $targetName
|
|
||||||
From: $frm
|
|
||||||
To: $to
|
|
||||||
Duration: $duration
|
|
||||||
BeginTime: $beginTime
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
alias DoubleAnimationStoryboard (property, frm = "0", to = "1", duration = "0:0:1", targetName=none) {
|
|
||||||
BeginStoryboard {
|
|
||||||
Storyboard {
|
|
||||||
@DoubleAnimation($property, $frm, $to, $duration, $targetName) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin DoubleAnimation_PropertyTrigger(triggerProperty, triggerValue, animationProperty, frm, to, duration) for Style {
|
|
||||||
combine Triggers: @Trigger ($triggerProperty, $triggerValue) {
|
|
||||||
EnterActions: @DoubleAnimationStoryboard($animationProperty, $frm, $to, $duration) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin DoubleAnimation_PropertyTrigger_Toggle(triggerProperty, triggerValue, animationProperty, frm, to, duration) for Style {
|
|
||||||
combine Triggers: @Trigger ($triggerProperty, $triggerValue) {
|
|
||||||
EnterActions: @DoubleAnimationStoryboard($animationProperty, $frm, $to, $duration) {}
|
|
||||||
ExitActions: @DoubleAnimationStoryboard($animationProperty, $to, $frm, $duration) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin DoubleAnimation_EventTrigger(triggerEvent, animationProperty, frm, to, duration) for Style {
|
|
||||||
combine Triggers: EventTrigger {
|
|
||||||
RoutedEvent: $triggerEvent
|
|
||||||
@DoubleAnimationStoryboard($animationProperty, $frm, $to, $duration) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin DoubleAnimation_DataTrigger(binding, value, animationProperty, frm, to, duration) for Style {
|
|
||||||
combine Triggers: DataTrigger {
|
|
||||||
Binding: $binding
|
|
||||||
Value: $value
|
|
||||||
EnterActions: @DoubleAnimationStoryboard($animationProperty, $frm, $to, $duration) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin FadeIn_OnProperty(property, value, frm = "0", to = "1", duration = "0:0:1") for Style {
|
|
||||||
#DoubleAnimation_PropertyTrigger($property, $value, "Opacity", $frm, $to, $duration)
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin FadeOut_OnProperty(property, value, frm = "1", to = "0", duration = "0:0:1") for Style {
|
|
||||||
#DoubleAnimation_PropertyTrigger($property, $value, "Opacity", $frm, $to, $duration)
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin FadeIn_OnEvent(event, frm = "0", to = "1", duration = "0:0:1") for Style {
|
|
||||||
#DoubleAnimation_EventTrigger($event, "Opacity", $frm, $to, $duration)
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin FadeOut_OnEvent(event, frm = "1", to = "0", duration = "0:0:1") for Style {
|
|
||||||
#DoubleAnimation_EventTrigger($event, "Opacity", $frm, $to, $duration)
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin FadeIn_OnData(binding, value, from_ = "0", to = "1", duration = "0:0:1") for Style {
|
|
||||||
#DoubleAnimation_DataTrigger($binding, $value, "Opacity", $from_, $to, $duration)
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin FadeOut_OnData(binding, value, from_ = "1", to = "0", duration = "0:0:1") for Style {
|
|
||||||
#DoubleAnimation_DataTrigger($binding, $value, "Opacity", $from_, $to, $duration)
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin Property_OnBinding(binding, bindingValue, property, propertyValue, initialValue) for Style {
|
|
||||||
#Setter("Visibility", $initialValue)
|
|
||||||
combine Triggers: [
|
|
||||||
@DataTrigger_SetProperty($binding, $bindingValue, $property, $propertyValue) {}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin Visibility_OnBinding(binding, bindingValue, visibilityValue="Visible", initialValue="Collapsed") for Style {
|
|
||||||
#Property_OnBinding($binding, $bindingValue, "Visibility", $visibilityValue, $initialValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin Fade_OnBinding(binding, bindingValue) for Style {
|
|
||||||
#Setter("Visibility", "Visible")
|
|
||||||
#Setter("Opacity", "0")
|
|
||||||
|
|
||||||
combine Triggers: [
|
|
||||||
@DataTrigger($binding, $bindingValue) {
|
|
||||||
EnterActions: [
|
|
||||||
@DoubleAnimationStoryboard("Opacity", 0, 1, "0:0:0.5") {}
|
|
||||||
]
|
|
||||||
ExitActions: [
|
|
||||||
@DoubleAnimationStoryboard("Opacity", 1, 0, "0:0:0.5") {}
|
|
||||||
]
|
|
||||||
#Setter("Opacity", 1)
|
|
||||||
}
|
|
||||||
@Trigger("Opacity", 0) {
|
|
||||||
#Setter("Visibility", "Hidden")
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
mixin MergeDictionary (source) for ResourceDictionary {
|
|
||||||
combine MergedDictionaries: ResourceDictionary { Source: $source }
|
|
||||||
}
|
|
@ -1,10 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="Ammy" version="1.2.94" targetFramework="net461" />
|
|
||||||
<package id="Ammy.WPF" version="1.2.94" targetFramework="net461" />
|
|
||||||
<package id="CommonServiceLocator" version="2.0.3" targetFramework="net461" />
|
<package id="CommonServiceLocator" version="2.0.3" targetFramework="net461" />
|
||||||
<package id="MaterialDesignColors" version="1.1.3" targetFramework="net461" />
|
<package id="MaterialDesignColors" version="1.1.3" targetFramework="net461" />
|
||||||
<package id="MaterialDesignThemes" version="2.4.0.1044" targetFramework="net461" />
|
<package id="MaterialDesignThemes" version="2.4.0.1044" targetFramework="net461" />
|
||||||
<package id="MvvmLightLibs" version="5.4.1" targetFramework="net461" />
|
<package id="MvvmLightLibs" version="5.4.1" targetFramework="net461" />
|
||||||
<package id="Tyrrrz.Extensions" version="1.5.0" targetFramework="net461" />
|
<package id="Tyrrrz.Extensions" version="1.5.0" targetFramework="net461" />
|
||||||
|
<package id="Tyrrrz.WpfExtensions" version="1.0.5" targetFramework="net461" />
|
||||||
</packages>
|
</packages>
|
Loading…
Reference in new issue