using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Text; using System.Xml.Serialization; using RainmeterStudio.Core.Storage; using RainmeterStudio.Core.Utils; using Version = RainmeterStudio.Core.Utils.Version; namespace RainmeterStudio.Core.Model { /// /// Defines a Rainmeter Studio project /// public class Project : INotifyPropertyChanged { private string _author; private Reference _autoLoadFile; private Version _version, _minimumWindows, _minimumRainmeter; private Reference _root; #region Properties /// /// Gets or sets the name of the project /// [XmlElement(ElementName = "name", Order = 1)] public string Name { get { return Root.Name; } set { Root.Name = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Name")); } } /// /// Gets or sets the file path of this project /// [XmlIgnore] public string Path { get { return Root.StoragePath; } set { Root.StoragePath = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Name")); } } /// /// Gets or sets the author of the project /// [XmlElement(ElementName = "author", Order = 2)] public string Author { get { return _author; } set { _author = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Author")); } } /// /// Gets or sets the version of the project /// [XmlElement(ElementName = "version", Order = 3)] public Version Version { get { return _version; } set { _version = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Version")); } } /// /// Gets or sets the reference to the file that automatically loads at package installation /// [XmlIgnore] public Reference AutoLoadFile { get { return _autoLoadFile; } set { _autoLoadFile = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("AutoLoadFile")); } } /// /// Gets or sets the qualified name of the auto load file /// [XmlElement(ElementName = "autoLoadFile", Order = 7)] public string AutoLoadFileQualifiedName { get { return ((AutoLoadFile == null) ? null : AutoLoadFile.QualifiedName); } set { AutoLoadFile = Root.GetReference(value); } } /// /// Gets or sets the list of variable files /// [XmlIgnore] public ObservableCollection VariableFiles { get; private set; } /// /// Gets or sets the list of variable files qualified names /// [XmlArray(ElementName = "variableFiles", Order = 8)] public string[] VariableFilesQualifiedNames { get { return VariableFiles.Select(x => x.QualifiedName).ToArray(); } set { VariableFiles.Clear(); value.Select(x => Root.GetReference(x)).ForEach(VariableFiles.Add); } } /// /// Gets or sets the minimum rainmeter version /// [XmlElement(ElementName = "minimumRainmeter", Order = 4)] public Version MinimumRainmeter { get { return _minimumRainmeter; } set { _minimumRainmeter = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("MinimumRainmeter")); } } /// /// Gets or sets the minimum Windows version /// [XmlElement(ElementName = "minimumWindows", Order = 5)] public Version MinimumWindows { get { return _minimumWindows; } set { _minimumWindows = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("MinimumWindows")); } } /// /// Gets or sets the root node /// [XmlElement(ElementName = "root", Order = 6)] public Reference Root { get { return _root; } set { _root = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Root")); } } #endregion #region Constructor /// /// Initializes a project /// public Project() { Root = new Reference(String.Empty, Reference.ReferenceTargetKind.Project); VariableFiles = new ObservableCollection(); Version = new Version(); MinimumRainmeter = new Version("3.1"); MinimumWindows = new Version("5.1"); } #endregion #region Operations /// /// Looks for reference in project /// /// Reference /// True if reference was found public bool Contains(Reference reference) { return Root.TreeContains(reference); } #endregion /// /// Triggered when a property changes /// public event PropertyChangedEventHandler PropertyChanged; } }