using System; using System.Collections.Generic; using System.Drawing; using Artemis.Core.Exceptions; using Artemis.Core.Models.Profile.Interfaces; using Artemis.Core.Plugins.Models; using Artemis.Core.Services.Interfaces; using Artemis.Storage.Entities; namespace Artemis.Core.Models.Profile { public class Profile : IProfileElement { internal Profile(PluginInfo pluginInfo, ProfileEntity profileEntity, IPluginService pluginService) { PluginInfo = pluginInfo; Name = profileEntity.Name; // Populate the profile starting at the root, the rest is populated recursively Children = new List {Folder.FromFolderEntity(this, profileEntity.RootFolder, pluginService)}; } internal Profile(PluginInfo pluginInfo, string name) { PluginInfo = pluginInfo; Name = name; Children = new List(); } public PluginInfo PluginInfo { get; } public bool IsActivated { get; private set; } public int Order { get; set; } public string Name { get; set; } public List Children { get; set; } public void Update(double deltaTime) { lock (this) { if (!IsActivated) throw new ArtemisCoreException($"Cannot update inactive profile: {this}"); foreach (var profileElement in Children) profileElement.Update(deltaTime); } } public void Render(double deltaTime, Surface.Surface surface, Graphics graphics) { lock (this) { if (!IsActivated) throw new ArtemisCoreException($"Cannot render inactive profile: {this}"); foreach (var profileElement in Children) profileElement.Render(deltaTime, surface, graphics); } } public void Activate() { lock (this) { if (IsActivated) return; OnActivated(); IsActivated = true; } } public void Deactivate() { lock (this) { if (!IsActivated) return; IsActivated = false; OnDeactivated(); } } public override string ToString() { return $"{nameof(Order)}: {Order}, {nameof(Name)}: {Name}, {nameof(PluginInfo)}: {PluginInfo}"; } #region Events /// /// Occurs when the profile is being activated. /// public event EventHandler Activated; /// /// Occurs when the profile is being deactivated. /// public event EventHandler Deactivated; private void OnActivated() { Activated?.Invoke(this, EventArgs.Empty); } private void OnDeactivated() { Deactivated?.Invoke(this, EventArgs.Empty); } #endregion } }