commit 60eb406cbed5fffa615576ecd8441e874135887c Author: NickAppLab Date: Mon Jun 13 21:24:13 2022 +0500 Init commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c85668a --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*\obj +*\bin +*\packages diff --git a/App.config b/App.config new file mode 100644 index 0000000..56efbc7 --- /dev/null +++ b/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/App.xaml b/App.xaml new file mode 100644 index 0000000..52c6648 --- /dev/null +++ b/App.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/App.xaml.cs b/App.xaml.cs new file mode 100644 index 0000000..a696ce9 --- /dev/null +++ b/App.xaml.cs @@ -0,0 +1,11 @@ +using System.Windows; + +namespace StructureHelper +{ + /// + /// Логика взаимодействия для App.xaml + /// + public partial class App : Application + { + } +} diff --git a/Infrastructure/EventArgs.cs b/Infrastructure/EventArgs.cs new file mode 100644 index 0000000..d22d52a --- /dev/null +++ b/Infrastructure/EventArgs.cs @@ -0,0 +1,13 @@ +using System; + +namespace StructureHelper +{ + public class EventArgs : EventArgs + { + public EventArgs(T value) + { + Value = value; + } + public T Value { get; private set; } + } +} diff --git a/Infrastructure/EventTriggerBase.cs b/Infrastructure/EventTriggerBase.cs new file mode 100644 index 0000000..55172f4 --- /dev/null +++ b/Infrastructure/EventTriggerBase.cs @@ -0,0 +1,25 @@ +using System; +using System.Windows; +using EventTrigger = System.Windows.Interactivity.EventTrigger; + +namespace StructureHelper +{ + public class EventTriggerBase : EventTrigger where T : RoutedEventArgs + { + readonly Predicate eventTriggerPredicate; + + public EventTriggerBase(Predicate eventTriggerPredicate) + { + this.eventTriggerPredicate = eventTriggerPredicate; + } + + protected override void OnEvent(EventArgs eventArgs) + { + if (eventArgs is T e && eventTriggerPredicate(e)) + { + base.OnEvent(eventArgs); + e.Handled = true; + } + } + } +} \ No newline at end of file diff --git a/Infrastructure/Extensions/ObservableCollectionExtensions.cs b/Infrastructure/Extensions/ObservableCollectionExtensions.cs new file mode 100644 index 0000000..4133fbd --- /dev/null +++ b/Infrastructure/Extensions/ObservableCollectionExtensions.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace StructureHelper +{ + public static class ObservableCollectionExtensions + { + public static void MoveElementToEnd(this ObservableCollection collection, T element) + { + var elementCopy = element; + collection.Remove(element); + collection.Add(elementCopy); + } + + public static void MoveElementToBegin(this ObservableCollection collection, T element) + { + var collectionCopy = new List(collection); + collectionCopy.Remove(element); + collection.Clear(); + collection.Add(element); + foreach (var collectionElem in collectionCopy) + collection.Add(collectionElem); + } + + public static void MoveElementToSelectedIndex(this ObservableCollection collection, T element, int index) + { + collection.Remove(element); + collection.Insert(index - 1, element); + } + } +} diff --git a/Infrastructure/MouseBehaviour.cs b/Infrastructure/MouseBehaviour.cs new file mode 100644 index 0000000..c6eae71 --- /dev/null +++ b/Infrastructure/MouseBehaviour.cs @@ -0,0 +1,45 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Interactivity; + +namespace StructureHelper +{ + public class MouseBehaviour : Behavior + { + public static readonly DependencyProperty MouseYProperty = DependencyProperty.Register( + "MouseY", typeof(double), typeof(MouseBehaviour), new PropertyMetadata(default(double))); + + public static readonly DependencyProperty MouseXProperty = DependencyProperty.Register( + "MouseX", typeof(double), typeof(MouseBehaviour), new PropertyMetadata(default(double))); + + public double MouseY + { + get => (double)GetValue(MouseYProperty); + set => SetValue(MouseYProperty, value); + } + + public double MouseX + { + get => (double)GetValue(MouseXProperty); + set => SetValue(MouseXProperty, value); + } + + protected override void OnAttached() + { + AssociatedObject.MouseMove += AssociatedObjectOnMouseMove; + } + + protected override void OnDetaching() + { + AssociatedObject.MouseMove -= AssociatedObjectOnMouseMove; + } + + private void AssociatedObjectOnMouseMove(object sender, MouseEventArgs mouseEventArgs) + { + var pos = mouseEventArgs.GetPosition(AssociatedObject); + MouseX = pos.X; + MouseY = pos.Y; + } + } +} diff --git a/Infrastructure/MouseEventTriggers/DoubleClickEventTrigger.cs b/Infrastructure/MouseEventTriggers/DoubleClickEventTrigger.cs new file mode 100644 index 0000000..0219791 --- /dev/null +++ b/Infrastructure/MouseEventTriggers/DoubleClickEventTrigger.cs @@ -0,0 +1,9 @@ +using System.Windows.Input; + +namespace StructureHelper.Infrastructure +{ + public class DoubleClickEventTrigger : EventTriggerBase + { + public DoubleClickEventTrigger() : base(args => args.ClickCount == 2) { } + } +} diff --git a/Infrastructure/MouseEventTriggers/MouseWheelDownEventTrigger.cs b/Infrastructure/MouseEventTriggers/MouseWheelDownEventTrigger.cs new file mode 100644 index 0000000..bea8b3b --- /dev/null +++ b/Infrastructure/MouseEventTriggers/MouseWheelDownEventTrigger.cs @@ -0,0 +1,9 @@ +using System.Windows.Input; + +namespace StructureHelper.Infrastructure +{ + public class MouseWheelDownEventTrigger : EventTriggerBase + { + public MouseWheelDownEventTrigger() : base(args => args.Delta > 0) { } + } +} diff --git a/Infrastructure/MouseEventTriggers/MouseWheelUpEventTrigger.cs b/Infrastructure/MouseEventTriggers/MouseWheelUpEventTrigger.cs new file mode 100644 index 0000000..18195c8 --- /dev/null +++ b/Infrastructure/MouseEventTriggers/MouseWheelUpEventTrigger.cs @@ -0,0 +1,9 @@ +using System.Windows.Input; + +namespace StructureHelper.Infrastructure +{ + public class MouseWheelUpEventTrigger : EventTriggerBase + { + public MouseWheelUpEventTrigger() : base(args => args.Delta < 0) { } + } +} \ No newline at end of file diff --git a/Infrastructure/NamedList.cs b/Infrastructure/NamedList.cs new file mode 100644 index 0000000..2587a29 --- /dev/null +++ b/Infrastructure/NamedList.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace StructureHelper.Infrastructure +{ + public class NamedList : List + { + public string Name { get; set; } + } +} diff --git a/Infrastructure/RelayCommand.cs b/Infrastructure/RelayCommand.cs new file mode 100644 index 0000000..61ccaf4 --- /dev/null +++ b/Infrastructure/RelayCommand.cs @@ -0,0 +1,27 @@ +using System; +using System.Windows.Input; + +namespace StructureHelper +{ + public class RelayCommand : ICommand + { + private Action execute; + private Func canExecute; + + public event EventHandler CanExecuteChanged + { + add => CommandManager.RequerySuggested += value; + remove => CommandManager.RequerySuggested -= value; + } + + public RelayCommand(Action execute, Func canExecute = null) + { + this.execute = execute; + this.canExecute = canExecute; + } + + public bool CanExecute(object parameter) => canExecute == null || canExecute(parameter); + + public void Execute(object parameter) => execute(parameter); + } +} diff --git a/Infrastructure/ViewModelBase.cs b/Infrastructure/ViewModelBase.cs new file mode 100644 index 0000000..337216b --- /dev/null +++ b/Infrastructure/ViewModelBase.cs @@ -0,0 +1,27 @@ +using System.ComponentModel; +using System.Runtime.CompilerServices; +using StructureHelper.Annotations; + +namespace StructureHelper.Infrastructure +{ + public class ViewModelBase : INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + [NotifyPropertyChangedInvocator] + protected virtual void OnPropertyChanged(T value, T prop, [CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + [NotifyPropertyChangedInvocator] + protected virtual void OnPropertyChanged(T value, ref T prop, [CallerMemberName] string propertyName = null) + { + prop = value; + OnPropertyChanged(propertyName); + } + + [NotifyPropertyChangedInvocator] + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } +} diff --git a/MaterialCatalogWindow/MaterialCatalogModel.cs b/MaterialCatalogWindow/MaterialCatalogModel.cs new file mode 100644 index 0000000..2fb270b --- /dev/null +++ b/MaterialCatalogWindow/MaterialCatalogModel.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; +using StructureHelper.Infrastructure; + +namespace StructureHelper +{ + public class MaterialCatalogModel + { + public NamedList ConcreteDefinitions; + public NamedList RebarDefinitions; + + public List> Materials; + + public MaterialCatalogModel() + { + InitializeMaterialCollections(); + Materials = new List>(); + Materials.Add(ConcreteDefinitions); + Materials.Add(RebarDefinitions); + } + + public void InitializeMaterialCollections() + { + InitializeConcreteDefinitions(); + InitializeRebarDefinitions(); + } + + private void InitializeRebarDefinitions() + { + RebarDefinitions = new NamedList() + { + new RebarDefinition("S240", 2, 240, 240, 1.15, 1.15), + new RebarDefinition("S400", 2, 400, 400, 1.15, 1.15), + new RebarDefinition("S500", 2, 500, 500, 1.15, 1.15) + }; + RebarDefinitions.Name = "Арматура"; + } + + private void InitializeConcreteDefinitions() + { + ConcreteDefinitions = new NamedList() + { + new ConcreteDefinition("C10", 0, 10, 0, 1.3, 1.5), + new ConcreteDefinition("C15", 0, 15, 0, 1.3, 1.5), + new ConcreteDefinition("C20", 0, 20, 0, 1.3, 1.5), + new ConcreteDefinition("C25", 0, 25, 0, 1.3, 1.5), + new ConcreteDefinition("C30", 0, 30, 0, 1.3, 1.5), + new ConcreteDefinition("C35", 0, 35, 0, 1.3, 1.5), + new ConcreteDefinition("C40", 0, 40, 0, 1.3, 1.5), + new ConcreteDefinition("C45", 0, 45, 0, 1.3, 1.5), + new ConcreteDefinition("C50", 0, 50, 0, 1.3, 1.5), + new ConcreteDefinition("C60", 0, 60, 0, 1.3, 1.5), + new ConcreteDefinition("C70", 0, 70, 0, 1.3, 1.5), + new ConcreteDefinition("C80", 0, 80, 0, 1.3, 1.5) + }; + ConcreteDefinitions.Name = "Бетон"; + } + } +} diff --git a/MaterialCatalogWindow/MaterialCatalogView.xaml b/MaterialCatalogWindow/MaterialCatalogView.xaml new file mode 100644 index 0000000..48e0a1c --- /dev/null +++ b/MaterialCatalogWindow/MaterialCatalogView.xaml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +