using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections.ObjectModel; using System.ComponentModel; using BuzzGUI.Interfaces; using BuzzGUI.Common; using BuzzGUI.Common.InterfaceExtensions; using System.Windows.Input; using System.Windows.Media; namespace Jeskola.Live { public class LiveVM : INotifyPropertyChanged { public ObservableCollection Tracks { get; private set; } public MultiTrackVM MultiTrackVM { get; private set; } public double Scale { get; private set; } public TextFormattingMode TextFormattingMode { get; private set; } public int Bar { get { return barParameter.GetValue(0); } set { barParameter.SetValue(0, value); PropertyChanged.Raise(this, "Bar"); } } int zoomLevel = -1; public int ZoomLevel { get { return zoomLevel; } set { if (zoomLevel != value) { zoomLevel = value; Scale = Math.Pow(2, ((zoomLevel - 5) / 5.0)); TextFormattingMode = Scale == 1.0 ? TextFormattingMode.Display : TextFormattingMode.Ideal; PropertyChanged.Raise(this, "ZoomLevel"); PropertyChanged.Raise(this, "Scale"); PropertyChanged.Raise(this, "TextFormattingMode"); } } } IMachine machine; ISong song; IParameter barParameter; public LiveVM(IMachine machine) { this.machine = machine; this.song = machine.Graph.Buzz.Song; barParameter = machine.GetParameter("Bar"); barParameter.SubscribeEvents(0, BarChanged, null); song.SequenceAdded += song_SequenceAdded; song.SequenceChanged += song_SequenceChanged; song.SequenceRemoved += song_SequenceRemoved; Tracks = new ObservableCollection(); Tracks.Add(MultiTrackVM = new MultiTrackVM(this)); for (int i = 0; i < song.Sequences.Count; i++) song_SequenceAdded(i); ZoomLevel = 5; } public void Release() { for (int i = song.Sequences.Count - 1; i >= 0; i--) song_SequenceRemoved(i); barParameter.UnsubscribeEvents(0, BarChanged, null); song.SequenceAdded -= song_SequenceAdded; song.SequenceChanged -= song_SequenceChanged; song.SequenceRemoved -= song_SequenceRemoved; } void BarChanged(IParameter p, int track) { PropertyChanged.Raise(this, "Bar"); } void song_SequenceAdded(int index) { Tracks.Add(new TrackVM(this, song.Sequences[index])); } void song_SequenceChanged(int index) { Tracks[index + 1].Release(); Tracks[index + 1] = new TrackVM(this, song.Sequences[index]); } void song_SequenceRemoved(int index) { Tracks[index + 1].Release(); Tracks.RemoveAt(index + 1); } public void Update() { foreach (var t in Tracks) t.Update(); } internal void PlayAllPatterns(string pattern, bool play) { Tracks.Run((TrackVM t) => t.SelectPattern(pattern, play)); } public event PropertyChangedEventHandler PropertyChanged; } }