From: <nic...@us...> - 2014-05-03 17:38:34
|
Revision: 4793 http://sourceforge.net/p/mp-plugins/code/4793 Author: nicsergio Date: 2014-05-03 17:38:29 +0000 (Sat, 03 May 2014) Log Message: ----------- Modified Paths: -------------- trunk/plugins/ShortCuter&SkinEditor/Source/Common/Skin.cs trunk/plugins/ShortCuter&SkinEditor/Source/ShortCuter/ShortCuter.cs trunk/plugins/ShortCuter&SkinEditor/Source/ShortCuter/ShortCuterConfig.cs trunk/plugins/ShortCuter&SkinEditor/Source/ShortCuter/ShortCuts.cs Modified: trunk/plugins/ShortCuter&SkinEditor/Source/Common/Skin.cs =================================================================== --- trunk/plugins/ShortCuter&SkinEditor/Source/Common/Skin.cs 2014-05-01 10:43:45 UTC (rev 4792) +++ trunk/plugins/ShortCuter&SkinEditor/Source/Common/Skin.cs 2014-05-03 17:38:29 UTC (rev 4793) @@ -8,199 +8,199 @@ namespace My.Common { internal class MediaPortalSkin //Classe per gestione elementare skin di MediaPortal + { + #region Dati + protected readonly string Name; //Nome della skin + protected struct Folders //Struttura di memorizzazione cartelle { - #region Dati - protected readonly string Name; //Nome della skin - protected struct Folders //Struttura di memorizzazione cartelle - { - public string Skin; //Percorso della skin - public string Cache; //Percorso cache della skin - public string Media; //Percorso file multimediali della skin - public string Animations; //Percorso per animazioni (multi-image) della skin - public string Icons; //Eventuale percorso icone di menu della skin - public string Sounds; //Percorso effetti sonori - } - public class SkinFile //Classe file della skin (con ID) - { - public string Name = ""; //Nome del file - public int Id = 0; //WindowID del file (link da MediaPortal) - public override string ToString() { return Name; } //Override metodo ToString per riempire classi ListControl - } - public class SkinLink //Classe link per la skin - { - public string Context = ""; //Eventuale testo aggiuntivo ("guarda"-"ascolta"-ecc.) - public string Caption = ""; //Titolo - public string XmlFile = ""; //Nome del file xml della skin - public int WindowID = 0; //Id finestra per visualizzazione in MediaPortal - public string LoadParameter = ""; //Eventuali parametri aggiuntivi per visualizzazione (sotto-categorie, ecc.) - public string BackgroundImage = ""; //File immagine di background - public string BackgroundFolder = ""; //Cartella per multi-image di background - public string FanartHandler = ""; //Tipologia di fanart per background - public string Overlay = ""; //Eventuale riquadro visualizzato in sovrapposizione all'immagine di background - public string IconList = ""; //Eventuale icona per rappresentazione in lista/treeview - public bool IsFather = false; //Il link è un nodo padre (visualizzazione a treeview) - public override string ToString() { return Caption; } //Override metodo ToString per riempire classi ListControl - } - protected Folders _paths = new Folders(); //Percorsi - protected List<SkinFile> _skinFiles = new List<SkinFile>(); //Lista file della skin (con ID) - protected List<SkinLink> _skinLinks = new List<SkinLink>(); //Lista link predefiniti per la skin - protected bool _initialized; //Classe inizializzata - #endregion + public string Skin; //Percorso della skin + public string Cache; //Percorso cache della skin + public string Media; //Percorso file multimediali della skin + public string Animations; //Percorso per animazioni (multi-image) della skin + public string Icons; //Eventuale percorso icone di menu della skin + public string Sounds; //Percorso effetti sonori + } + public class SkinFile //Classe file della skin (con ID) + { + public string Name = ""; //Nome del file + public int Id = 0; //WindowID del file (link da MediaPortal) + public override string ToString() { return Name; } //Override metodo ToString per riempire classi ListControl + } + public class SkinLink //Classe link per la skin + { + public string Context = ""; //Eventuale testo aggiuntivo ("guarda"-"ascolta"-ecc.) + public string Caption = ""; //Titolo + public string XmlFile = ""; //Nome del file xml della skin + public int WindowID = 0; //Id finestra per visualizzazione in MediaPortal + public string LoadParameter = ""; //Eventuali parametri aggiuntivi per visualizzazione (sotto-categorie, ecc.) + public string BackgroundImage = ""; //File immagine di background + public string BackgroundFolder = ""; //Cartella per multi-image di background + public string FanartHandler = ""; //Tipologia di fanart per background + public string Overlay = ""; //Eventuale riquadro visualizzato in sovrapposizione all'immagine di background + public string IconList = ""; //Eventuale icona per rappresentazione in lista/treeview + public bool IsFather = false; //Il link è un nodo padre (visualizzazione a treeview) + public override string ToString() { return Caption; } //Override metodo ToString per riempire classi ListControl + } + protected Folders _paths = new Folders(); //Percorsi + protected List<SkinFile> _skinFiles = new List<SkinFile>(); //Lista file della skin (con ID) + protected List<SkinLink> _skinLinks = new List<SkinLink>(); //Lista link predefiniti per la skin + protected bool _initialized; //Classe inizializzata + #endregion - #region Costruttore - public MediaPortalSkin(string skinName, string skinsPath, string cachesPath, bool onlyMenuItems) - { //Costruttore - Name = skinName; //--> nome della skin - _paths.Skin = skinsPath + Name + @"\"; //--> percorso skin - _paths.Cache = cachesPath + Name + @"\"; //--> percorso cache skin - _paths.Media = _paths.Skin + @"Media\"; //--> percorso file multimediali skin - _paths.Animations = _paths.Media + @"Animations\"; //--> percorso per animazioni (multi-image) skin - _paths.Icons = _paths.Media + @"Icons\"; //--> eventuale percorso icone di menu della skin - _paths.Sounds = _paths.Skin + @"Sounds\"; //--> percorso effetto sonori skin + #region Costruttore + public MediaPortalSkin(string skinName, string skinsPath, string cachesPath, bool onlyMenuItems) + { //Costruttore + Name = skinName; //--> nome della skin + _paths.Skin = skinsPath + Name + @"\"; //--> percorso skin + _paths.Cache = cachesPath + Name + @"\"; //--> percorso cache skin + _paths.Media = _paths.Skin + @"Media\"; //--> percorso file multimediali skin + _paths.Animations = _paths.Media + @"Animations\"; //--> percorso per animazioni (multi-image) skin + _paths.Icons = _paths.Media + @"Icons\"; //--> eventuale percorso icone di menu della skin + _paths.Sounds = _paths.Skin + @"Sounds\"; //--> percorso effetto sonori skin - _initialized = GetSkinFiles(onlyMenuItems) && GetSkinLinks(onlyMenuItems); //--> raccolta file della skin (con ID) e link - } - #endregion + _initialized = GetSkinFiles(onlyMenuItems) && GetSkinLinks(onlyMenuItems); //--> raccolta file della skin (con ID) e link + } + #endregion - #region Metodi Privati - private bool GetSkinFiles(bool onlyMenuItems) //Raccolta dei file della skin + #region Metodi Privati + private bool GetSkinFiles(bool onlyMenuItems) //Raccolta dei file della skin + { + if (!Directory.Exists(_paths.Skin)) { - if (!Directory.Exists(_paths.Skin)) + Tools.ErrorMessage("Skin folder not found!", _paths.Skin); + return false; + } + string[] files = Directory.GetFiles(_paths.Skin); //--> lettura file da disco + foreach (string file in files) //Iterazione per applicazione filtro e memorizzazione dati + { + try { - Tools.ErrorMessage("Skin folder not found!", _paths.Skin); - return false; - } - string[] files = Directory.GetFiles(_paths.Skin); //--> lettura file da disco - foreach (string file in files) //Iterazione per applicazione filtro e memorizzazione dati - { - try + if (!file.ToLower().StartsWith("common") && !file.ToLower().Contains("dialog") && !file.ToLower().Contains("wizard") && !file.ToLower().Contains("overlay") && (!onlyMenuItems || (!file.ToLower().EndsWith("myhome.xml") && !file.ToLower().EndsWith("basichome.xml") && !file.ToLower().Contains("fullscreen"))) && file.ToLower().EndsWith(".xml")) { - if (!file.ToLower().StartsWith("common") && !file.ToLower().Contains("dialog") && !file.ToLower().Contains("wizard") && !file.ToLower().Contains("overlay") && (!onlyMenuItems || (!file.ToLower().EndsWith("myhome.xml") && !file.ToLower().EndsWith("basichome.xml") && !file.ToLower().Contains("fullscreen"))) && file.ToLower().EndsWith(".xml")) + XmlDocument xmlFile = new XmlDocument(); + xmlFile.Load(file); + XmlNode node = xmlFile.DocumentElement.SelectSingleNode("/window/id"); + if (node.InnerText.Length > 0) { - XmlDocument xmlFile = new XmlDocument(); - xmlFile.Load(file); - XmlNode node = xmlFile.DocumentElement.SelectSingleNode("/window/id"); - if (node.InnerText.Length > 0) - { - SkinFile skF = new SkinFile(); - skF.Name = file.Remove(0, file.LastIndexOf(@"\") + 1).Replace(".xml", ""); - skF.Id = Convert.ToInt32(node.InnerText); - if (skF.Id >= 0) - _skinFiles.Add(skF); //--> aggiunta file nella lista - } + SkinFile skF = new SkinFile(); + skF.Name = file.Remove(0, file.LastIndexOf(@"\") + 1).Replace(".xml", ""); + skF.Id = Convert.ToInt32(node.InnerText); + if (skF.Id >= 0) + _skinFiles.Add(skF); //--> aggiunta file nella lista } } - catch { } } - if (_skinFiles.Count > 0) - return true; //--> raccolta files effettuata - else + catch { } + } + if (_skinFiles.Count > 0) + return true; //--> raccolta files effettuata + else + { + Tools.ErrorMessage("No skin files found.", _paths.Skin); + return false; + } + } + private bool GetSkinLinks(bool onlyMenuItems) //Raccolta dei link predefiniti per la skin + { + XmlDocument xmlFile = new XmlDocument(); + try + { + using (Stream streamFile = Assembly.GetExecutingAssembly().GetManifestResourceStream( + Assembly.GetExecutingAssembly().GetManifestResourceNames().Where(name => name.Contains("PopularSkinLinks.xml")).ElementAt(0).ToString())) { - Tools.ErrorMessage("No skin files found.", _paths.Skin); - return false; + xmlFile.Load(streamFile); //Links skin disponibili --> lettura file xml incapsulato } } - private bool GetSkinLinks(bool onlyMenuItems) //Raccolta dei link predefiniti per la skin + catch (Exception e) { - XmlDocument xmlFile = new XmlDocument(); - try - { - using (Stream streamFile = Assembly.GetExecutingAssembly().GetManifestResourceStream( - Assembly.GetExecutingAssembly().GetManifestResourceNames().Where(name => name.Contains("PopularSkinLinks.xml")).ElementAt(0).ToString())) - { - xmlFile.Load(streamFile); //Links skin disponibili --> lettura file xml incapsulato - } - } - catch (Exception e) - { - Tools.ErrorMessage("Error loading PopularSkinLinks.xml.", e.Message); - return false; - } + Tools.ErrorMessage("Error loading PopularSkinLinks.xml.", e.Message); + return false; + } - XmlNodeList nodeList = xmlFile.DocumentElement.SelectNodes("/Items/Item"); - foreach (XmlNode node in nodeList) //Iterazione per memorizzazione links + XmlNodeList nodeList = xmlFile.DocumentElement.SelectNodes("/Items/Item"); + foreach (XmlNode node in nodeList) //Iterazione per memorizzazione links + { + if (AddLink(node, true, onlyMenuItems)) //Se nodo padre aggiunto { - if (AddLink(node, true, onlyMenuItems)) //Se nodo padre aggiunto - { - XmlNodeList subNodeList = node.SelectNodes("SubItems/SubItem"); - foreach (XmlNode subNode in subNodeList) //Iterazione per memorizzazione links figli - AddLink(subNode, false, onlyMenuItems); //--> aggiunta nodi figli - } + XmlNodeList subNodeList = node.SelectNodes("SubItems/SubItem"); + foreach (XmlNode subNode in subNodeList) //Iterazione per memorizzazione links figli + AddLink(subNode, false, onlyMenuItems); //--> aggiunta nodi figli } - if (_skinLinks.Count > 0) - return true; //--> raccolta links effettuata - else - { - Tools.ErrorMessage("No skin links found loading PopularSkinLinks.xml."); - return false; - } } - private bool AddLink(XmlNode node, bool isFather, bool onlyMenuItems) //Aggiunta link + if (_skinLinks.Count > 0) + return true; //--> raccolta links effettuata + else { - XmlNode innerNode = node.SelectSingleNode("Menu"); - if (onlyMenuItems && (innerNode == null || innerNode.InnerText.ToLower() != "true" )) - return false; //Nel caso di raccolta dei soli elementi di menu, si saltano gli elementi non corrispondenti + Tools.ErrorMessage("No skin links found loading PopularSkinLinks.xml."); + return false; + } + } + private bool AddLink(XmlNode node, bool isFather, bool onlyMenuItems) //Aggiunta link + { + XmlNode innerNode = node.SelectSingleNode("Menu"); + if (onlyMenuItems && (innerNode == null || innerNode.InnerText.ToLower() != "true" )) + return false; //Nel caso di raccolta dei soli elementi di menu, si saltano gli elementi non corrispondenti - SkinLink popularLink = new SkinLink(); - innerNode = node.SelectSingleNode("Context"); - if (innerNode != null) - popularLink.Context = innerNode.InnerText; - innerNode = node.SelectSingleNode("Caption"); - if (innerNode != null) - popularLink.Caption = innerNode.InnerText; - innerNode = node.SelectSingleNode("XmlFile"); - if (innerNode != null) - popularLink.XmlFile = innerNode.InnerText; - innerNode = node.SelectSingleNode("WindowID"); - if (innerNode != null) - popularLink.WindowID = Convert.ToInt32(innerNode.InnerText); - innerNode = node.SelectSingleNode("LoadParameter"); - if (innerNode != null) - popularLink.LoadParameter = innerNode.InnerText; - innerNode = node.SelectSingleNode("BackgroundImage"); - if (innerNode != null) - popularLink.BackgroundImage = innerNode.InnerText; - innerNode = node.SelectSingleNode("BackgroundFolder"); - if (innerNode != null) - popularLink.BackgroundFolder = innerNode.InnerText; - innerNode = node.SelectSingleNode("FanartHandler"); - if (innerNode != null) - popularLink.FanartHandler = innerNode.InnerText; - innerNode = node.SelectSingleNode("Overlay"); - if (innerNode != null) - popularLink.Overlay = innerNode.InnerText; - innerNode = node.SelectSingleNode("IconList"); - if (innerNode != null) - popularLink.IconList = innerNode.InnerText; - popularLink.IsFather = isFather; - try + SkinLink popularLink = new SkinLink(); + innerNode = node.SelectSingleNode("Context"); + if (innerNode != null) + popularLink.Context = innerNode.InnerText; + innerNode = node.SelectSingleNode("Caption"); + if (innerNode != null) + popularLink.Caption = innerNode.InnerText; + innerNode = node.SelectSingleNode("XmlFile"); + if (innerNode != null) + popularLink.XmlFile = innerNode.InnerText; + innerNode = node.SelectSingleNode("WindowID"); + if (innerNode != null) + popularLink.WindowID = Convert.ToInt32(innerNode.InnerText); + innerNode = node.SelectSingleNode("LoadParameter"); + if (innerNode != null) + popularLink.LoadParameter = innerNode.InnerText; + innerNode = node.SelectSingleNode("BackgroundImage"); + if (innerNode != null) + popularLink.BackgroundImage = innerNode.InnerText; + innerNode = node.SelectSingleNode("BackgroundFolder"); + if (innerNode != null) + popularLink.BackgroundFolder = innerNode.InnerText; + innerNode = node.SelectSingleNode("FanartHandler"); + if (innerNode != null) + popularLink.FanartHandler = innerNode.InnerText; + innerNode = node.SelectSingleNode("Overlay"); + if (innerNode != null) + popularLink.Overlay = innerNode.InnerText; + innerNode = node.SelectSingleNode("IconList"); + if (innerNode != null) + popularLink.IconList = innerNode.InnerText; + popularLink.IsFather = isFather; + try + { + SkinFile skF = _skinFiles.Find(x => x.Id == popularLink.WindowID); + if (skF != null || popularLink.XmlFile == "-") //Verifica se WindowID disponibile nei files della skin (o se non specificato file xml - link di sistema) { - SkinFile skF = _skinFiles.Find(x => x.Id == popularLink.WindowID); - if (skF != null || popularLink.XmlFile == "-") //Verifica se WindowID disponibile nei files della skin (o se non specificato file xml - link di sistema) - { - _skinLinks.Add(popularLink); //--> aggiunta link nella lista - return true; //--> link aggiunto - } - else - return false; //--> link non aggiunto + _skinLinks.Add(popularLink); //--> aggiunta link nella lista + return true; //--> link aggiunto } - catch - { - return false; //--> link non aggiunto (errore nella verifica esistenza WindowID) - } + else + return false; //--> link non aggiunto } - #endregion + catch + { + return false; //--> link non aggiunto (errore nella verifica esistenza WindowID) + } + } + #endregion - #region Proprietà - public bool Initialized { get { return this._initialized; } } - public string SkinPath { get { return this._paths.Skin; } } - public string CachePath { get { return this._paths.Cache; } } - public string MediaPath { get { return this._paths.Media; } } - public string AnimationsPath { get { return this._paths.Animations; } } - public string IconsPath { get { return this._paths.Icons; } } - public string SoundsPath { get { return this._paths.Sounds; } } - public List<SkinFile> SkinFiles { get { return this._skinFiles; } } - public List<SkinLink> SkinLinks { get { return this._skinLinks; } } - #endregion - } + #region Proprietà + public bool Initialized { get { return this._initialized; } } + public string SkinPath { get { return this._paths.Skin; } } + public string CachePath { get { return this._paths.Cache; } } + public string MediaPath { get { return this._paths.Media; } } + public string AnimationsPath { get { return this._paths.Animations; } } + public string IconsPath { get { return this._paths.Icons; } } + public string SoundsPath { get { return this._paths.Sounds; } } + public List<SkinFile> SkinFiles { get { return this._skinFiles; } } + public List<SkinLink> SkinLinks { get { return this._skinLinks; } } + #endregion + } } Modified: trunk/plugins/ShortCuter&SkinEditor/Source/ShortCuter/ShortCuter.cs =================================================================== --- trunk/plugins/ShortCuter&SkinEditor/Source/ShortCuter/ShortCuter.cs 2014-05-01 10:43:45 UTC (rev 4792) +++ trunk/plugins/ShortCuter&SkinEditor/Source/ShortCuter/ShortCuter.cs 2014-05-03 17:38:29 UTC (rev 4793) @@ -16,10 +16,6 @@ #region Dati private ShortCuts myShortCuts; //Istanza classe ShortCuts (dati relativi ai shortcuts configurati) private static readonly string LogPrefix; //Prefisso per log eventi - private const int TrailersPluginControlID = 11899; //Id controllo per attivazione plugin Trailers - private const int InvalidWindowID = -1; //Id finestra invalido - private int lastWindowID; //Id ultima finestra attivata dal plugin - private string lastLoadParameter; //Eventuali ultimi parametri di caricamento usati dal plugin #endregion #region Costruttore @@ -34,15 +30,15 @@ { MpLog(false, "Plugin started"); - string settingsFile = Config.GetFile(Config.Dir.Config, Tools.MyAssembly.Name + ".xml"); - myShortCuts = new ShortCuts(settingsFile, false); //--> lettura configurazione relativa agli shortcuts - if (LockKeys.ChangeCapsLock(myShortCuts.GeneralForcingCapsLock)) MpLog(false, "CapsLock " + ((myShortCuts.GeneralForcingCapsLock == LockKeys.LockKeyActions.Off) ? "deactivated" : "activated")); if (LockKeys.ChangeNumLock(myShortCuts.GeneralForcingNumLock)) MpLog(false, "NumLock " + ((myShortCuts.GeneralForcingNumLock == LockKeys.LockKeyActions.Off) ? "deactivated" : "activated")); - if (myShortCuts.Initialized) //Se classe di gestione shortcut inizializzata + string settingsFile = Config.GetFile(Config.Dir.Config, Tools.MyAssembly.Name + ".xml"); + myShortCuts = new ShortCuts(settingsFile); //Creazione classe per gestione shorcuts + myShortCuts.Log += new LogEventHandler(myShortCuts_Log); //--> sottoscrizione evento di log shortuts + if (myShortCuts.Initialize()) //Inizializzazione & lettura impostazioni shorcuts { try { @@ -73,107 +69,6 @@ } #endregion - #region Metodi Privati - private void GoToScreen(ShortCut sc) //Esecuzione azione relativa allo shortcut - { - try - { - MpLog(false, "Go to screen accepted, " + sc.ToString()); - - GUIGraphicsContext.ResetLastActivity(); - if (sc.SoundEffect.Length > 0 && !g_Player.Playing) - Utils.PlaySound(sc.SoundEffect, false, true); //--> eventuale effetto sonoro - if (sc.LoadParameter.Length > 0) //Se richiesti parametri di caricamento - { - bool loadParameterChange = false; - string loadParameter = sc.LoadParameter; - while (true) //Ricerca eventuali GUIProperties - { - int i = loadParameter.IndexOf("(#"), ii = 0; - if (i >= 0) - ii = loadParameter.IndexOf(")", i); - if (i >= 0 && (ii > i)) - { - string propName = loadParameter.Remove(ii).Remove(0, i + 1); - if (propName.Length > 0) - { - loadParameter = loadParameter.Remove(i) + GUIPropertyManager.GetProperty(propName).Trim() + loadParameter.Remove(0, ii + 1); - loadParameterChange = true; - } - else - break; - } - else - break; - } - if (loadParameterChange) //Eventuale log parametri di caricamento definitivi - MpLog(false, "GUIProperties replaced, LoadParameter=[" + loadParameter + "]"); - - GUIWindowManager.ActivateWindow(sc.WindowID, loadParameter, true); //--> richiamo schermata con parametri di caricamento - } - else //Richiamo schermata senza parametri di caricamento - { - GUIMessage msg; - if (sc.WindowID == TrailersPluginControlID) //Se richiesta di attivazione plugin Trailers - msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_CLICKED, 0, TrailersPluginControlID, TrailersPluginControlID, 0, 0, null); - else //Caso normale di attivazione finesta MediaPortal - msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_GOTO_WINDOW, 0, 0, 0, sc.WindowID, 0, null); - - GUIWindowManager.SendMessage(msg); - //GUIGraphicsContext.SendMessage(msg); //Metodo usato dal vecchio plugin - } - lastWindowID = sc.WindowID; lastLoadParameter = sc.LoadParameter; //--> memorizzazione ultima destinazione visualizzata dal plugin - } - catch (Exception e) - { - MpLog(true, "Error going to screen", e); - } - } - private void GoToPrevious(bool soundEffect) //Ritorno alla finestra precedente - { - try - { - MpLog(false, "Go to previous window"); - - GUIGraphicsContext.ResetLastActivity(); - if (soundEffect) - Utils.PlaySound("back.wav", false, true); //--> eventuale effetto sonoro (indietro) - - GUIWindowManager.ShowPreviousWindow(); //--> visualizzazione finestra precedente - } - catch (Exception e) - { - MpLog(true, "Error going to previous window", e); - } - } - private bool AlreadyAtDestination(ShortCut sc) //Verifica se finestra attuale corrispondente a destinazione shortcut - { - if ((int)GUIWindowManager.ActiveWindow == sc.WindowID) //Prima verifica: da gestore finestre di mediaPortal - { - if (lastWindowID == sc.WindowID) //Seconda verifica: utilizzo dei parametri memorizzati dal plugin se attendibili - if (lastLoadParameter == sc.LoadParameter) //--> verifica corrispondenza eventuali parametri di caricamento per visualizzazione - { - MpLog(false, "Actual window (ID & LoadParameter) corresponds to destination, " + sc.ToString()); - return true; //--> finestra attuale e parametri di caricamento corrispondenti a destinazione shortcut - } - else - return false; //--> parametri di caricamento per visualizzazione non corrispondenti a destinazione shortcut - else //Altrimenti parametri memorizzati dal plugin non attendibili (non si riescono a verificare i parametri di caricamento) - { - if (sc.LoadParameter.Length == 0) //Se destinazione senza parametri di caricamento - { - MpLog(false, "Actual window (ID) corresponds to destination, " + sc.ToString()); - return true; //--> finestra attuale corrispondente a destinazione shortcut - } - else - return false; //--> finestra attuale non corrispondente a destinazione shortcut - } - } - else - return false; //--> finestra attuale non corrispondente a destinazione shortcut - } - #endregion - #region Metodi Pubblici public static void MpLog(bool errorLog, string description) //Registrazione evento su log di MediaPortal (senza passare l'eccezione) { @@ -196,45 +91,27 @@ #region Consumazione Eventi private void rawInput_KeyDown(object sender, KeyEventArgs e) //Evento di pressione tasto { - if (!KeyCombination.IsModifier(e.KeyCode)) //Verifica se il tasto premuto non corrisponde ad un modificatore - { - List<ShortCut> scList = myShortCuts.Items.ToList().FindAll(x => - x.Key == e.KeyCode.ToString() - && x.Ctrl == e.Control - && x.Alt == e.Alt - && x.Shift == e.Shift); //--> raccolta lista shortcut associati alla combinazione di tasti attuale - if (scList != null && scList.Count > 0) //Se trovato almeno uno shortcut - { - if (scList.Count == 1) //Shortcut a destinazione singola - { - if (scList[0].Return && AlreadyAtDestination(scList[0])) //Se impostato flag di ritorno e finestra attuale corrispondente a destinazione - GoToPrevious(scList[0].SoundEffect.Length > 0); //--> visualizzazione finestra precedente - else - GoToScreen(scList[0]); //--> visualizzazione finestra di destinazione shortcut - } - else //Shortcut a destinazione multipla (ciclico) - { - int scIndex = 0; - for (int i = 0; i < scList.Count; i++) //Iterazione di verifica se la finestra attuale corrisponde ad una delle destinazioni - { - if (AlreadyAtDestination(scList[i])) - { - scIndex = (i + 1) % scList.Count; //--> impostazione indice shortcut successivo - break; - } - } - GoToScreen(scList[scIndex]); //--> visualizzazione finestra di destinazione shortcut - } - } - else //Combinazione di tasti non corrispondente a nessuno shortcut - MpLog(false, "Key not mapped: Key=" + (e.Control ? "<CTRL>" : "") + (e.Alt ? "<ALT>" : "") + (e.Shift ? "<SHIFT>" : "") + "<" + e.KeyCode.ToString() + ">"); - } + myShortCuts.KeysReceiving(e); //--> pubblicazione a gestore shortcuts } private void GUIWindowManager_OnActivateWindow(int windowID) //Evento di attivazione finestra di MediaPortal { - if (windowID != lastWindowID) //Se attivata una finestra non corrispondente all'ultima destinazione del plugin - lastWindowID = InvalidWindowID; //--> invalidazione parametri memorizzati dal plugin + myShortCuts.WindowChanged(windowID); //--> pubblicazione a gestore shortcuts } + private void myShortCuts_Log(object sender, LogEventArgs e) + { + switch (e.LogLevel) + { + case LogEventArgs.LogLevels.Error: + if (e.LogException != null) + Tools.ErrorMessage(e.LogMessage, e.LogException.Message); //--> emissione finestra di errore (con descrizione errore) + else + Tools.ErrorMessage(e.LogMessage); //--> emissione finestra di errore + break; + case LogEventArgs.LogLevels.Info: + Tools.InfoMessage(e.LogMessage); //--> emissione finestra informativa + break; + } + } #endregion } } Modified: trunk/plugins/ShortCuter&SkinEditor/Source/ShortCuter/ShortCuterConfig.cs =================================================================== --- trunk/plugins/ShortCuter&SkinEditor/Source/ShortCuter/ShortCuterConfig.cs 2014-05-01 10:43:45 UTC (rev 4792) +++ trunk/plugins/ShortCuter&SkinEditor/Source/ShortCuter/ShortCuterConfig.cs 2014-05-03 17:38:29 UTC (rev 4793) @@ -248,9 +248,10 @@ if (mySkin.Initialized) { string settingsFile = Config.GetFile(Config.Dir.Config, Tools.MyAssembly.Name + ".xml"); - //Lettura impostazioni e gestione shorcuts - myShortCuts = new ShortCuts(settingsFile, true); - if (myShortCuts.Initialized) + + myShortCuts = new ShortCuts(settingsFile); //Creazione classe per gestione shorcuts + myShortCuts.Log += new LogEventHandler(myShortCuts_Log); //Sottoscrizione evento di log shortuts + if (myShortCuts.Initialize()) //Inizializzazione & lettura impostazioni shorcuts { //Sottoscrizione evento di modifica lista shortcuts myShortCuts.Items.ListChanged += new ListChangedEventHandler(myShortCutsItems_ListChanged); @@ -277,6 +278,23 @@ e.Cancel = true; //--> annullamento chiusura form } #endregion + #region Evento di Log Shortcuts + private void myShortCuts_Log(object sender, LogEventArgs e) + { + switch (e.LogLevel) + { + case LogEventArgs.LogLevels.Error: + if (e.LogException != null) + Tools.ErrorMessage(e.LogMessage, e.LogException.Message); //--> emissione finestra di errore (con descrizione errore) + else + Tools.ErrorMessage(e.LogMessage); //--> emissione finestra di errore + break; + case LogEventArgs.LogLevels.Info: + Tools.InfoMessage(e.LogMessage); //--> emissione finestra informativa + break; + } + } + #endregion #region Eventi Modifica Griglia private void shortCutsDataGridView_Enter(object sender, EventArgs e) { Modified: trunk/plugins/ShortCuter&SkinEditor/Source/ShortCuter/ShortCuts.cs =================================================================== --- trunk/plugins/ShortCuter&SkinEditor/Source/ShortCuter/ShortCuts.cs 2014-05-01 10:43:45 UTC (rev 4792) +++ trunk/plugins/ShortCuter&SkinEditor/Source/ShortCuter/ShortCuts.cs 2014-05-03 17:38:29 UTC (rev 4793) @@ -3,15 +3,53 @@ using System.ComponentModel; using MediaPortal.GUI.Library; using System.IO; +using System.Linq; using System.Reflection; using System.Text; using System.Windows.Forms; using System.Xml; using MediaPortal.Profile; +using MediaPortal.Util; +using MediaPortal.Player; using My.Common; namespace ProcessPlugins.ShortCuter { + #region Delegati/Classi + public delegate void LogEventHandler(object sender, LogEventArgs e); //Delegato per evento di log + public class LogEventArgs : EventArgs //Argomenti per evento di log + { + #region Dati + private LogLevels _logLevel; //Livello di log + private string _logMessage; //Messaggio di log + private Exception _logException; //Eventuale eccezione + + public enum LogLevels //Tipologie di livelli di log + { + Debug = 0, //--> log per debug + Info = 1, //--> log informativo (necessario pubblicare all'utente) + Error = 2 //--> log di errore + } + #endregion + + #region Costruttore + public LogEventArgs(LogLevels logLevel, string logMessage) : this(logLevel, logMessage, null) { } + public LogEventArgs(LogLevels logLevel, string logMessage, Exception logException) + { + _logLevel = logLevel; //--> inizializzazione livello di log + _logMessage = logMessage; //--> inizializzazione messaggio di log + _logException = logException; //--> inizializzazione eccezione relativa al log + } + #endregion + + #region Proprietà + public LogLevels LogLevel { get { return this._logLevel; } } + public string LogMessage { get { return this._logMessage; } } + public Exception LogException { get { return this._logException; } } + #endregion + } + #endregion + internal class WindowLink //Classe collegamento ad una finestra di MediaPortal { #region Dati @@ -20,7 +58,7 @@ private string _loadParameter; //Eventuali parametri di caricamento per visualizzazione (sotto-categorie, ecc.) private const int TrailersPluginControlID = 11899; //Id controllo per attivazione plugin Trailers - internal delegate void NotifyLoadParamChanged(string loadParam); //Delegato per notifica di modifica parametri di caricamento + private const int InvalidID = -1; //Id finestra invalido #endregion #region Costruttore @@ -33,51 +71,87 @@ #endregion #region Metodi Pubblici - public void Go() //Visualizzazione finestra del collegamento (senza delegato per notifica di modifica parametri di caricamento) + public bool Go() { return Go(null); } //Visualizzazione finestra del collegamento (senza log) + public bool Go(LogEventHandler Log) //Visualizzazione finestra del collegamento { - Go(null); - } - public void Go(NotifyLoadParamChanged LoadParamChanged) //Visualizzazione finestra del collegamento - { - if (_loadParameter.Length > 0) //Se richiesti parametri di caricamento + if (_caption.Length > 0 && Log != null) + Log(this, new LogEventArgs(LogEventArgs.LogLevels.Info, "Go to link destination, " + this.ToString())); + + try { - bool loadParameterChange = false; - string loadParameter = _loadParameter; - while (true) //Ricerca eventuali GUIProperties + GUIGraphicsContext.ResetLastActivity(); + + if (_loadParameter.Length > 0) //Se richiesti parametri di caricamento { - int i = loadParameter.IndexOf("(#"), ii = 0; - if (i >= 0) - ii = loadParameter.IndexOf(")", i); - if (i >= 0 && (ii > i)) + bool loadParameterChange = false; + string loadParameter = _loadParameter; + while (true) //Ricerca eventuali GUIProperties { - string propName = loadParameter.Remove(ii).Remove(0, i + 1); - if (propName.Length > 0) + int i = loadParameter.IndexOf("(#"), ii = 0; + if (i >= 0) + ii = loadParameter.IndexOf(")", i); + if (i >= 0 && (ii > i)) { - loadParameter = loadParameter.Remove(i) + GUIPropertyManager.GetProperty(propName).Trim() + loadParameter.Remove(0, ii + 1); - loadParameterChange = true; + string propName = loadParameter.Remove(ii).Remove(0, i + 1); + if (propName.Length > 0) + { + loadParameter = loadParameter.Remove(i) + GUIPropertyManager.GetProperty(propName).Trim() + loadParameter.Remove(0, ii + 1); + loadParameterChange = true; + } + else + break; } else - break; + break; } - else - break; + if (loadParameterChange && Log != null) + Log(this, new LogEventArgs(LogEventArgs.LogLevels.Debug, "GUIProperties replaced, LoadParameter=[" + loadParameter + "]")); + + GUIWindowManager.ActivateWindow(_windowID, loadParameter, true); //--> richiamo schermata con parametri di caricamento } - if (loadParameterChange && LoadParamChanged != null) - LoadParamChanged(loadParameter); //--> notifica di modifica parametri di caricamento + else //Richiamo schermata senza parametri di caricamento + { + GUIMessage msg; + if (_windowID == TrailersPluginControlID) //Se richiesta di attivazione plugin Trailers + msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_CLICKED, 0, TrailersPluginControlID, TrailersPluginControlID, 0, 0, null); + else //Caso normale di attivazione finesta MediaPortal + msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_GOTO_WINDOW, 0, 0, 0, _windowID, 0, null); - GUIWindowManager.ActivateWindow(_windowID, loadParameter, true); //--> richiamo schermata con parametri di caricamento + GUIWindowManager.SendMessage(msg); //--> invio messaggio per attivazione finestra + } + return true; //--> comando eseguito con successo } - else //Richiamo schermata senza parametri di caricamento + catch (Exception e) { - GUIMessage msg; - if (_windowID == TrailersPluginControlID) //Se richiesta di attivazione plugin Trailers - msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_CLICKED, 0, TrailersPluginControlID, TrailersPluginControlID, 0, 0, null); - else //Caso normale di attivazione finesta MediaPortal - msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_GOTO_WINDOW, 0, 0, 0, _windowID, 0, null); + if (Log != null) + Log(this, new LogEventArgs(LogEventArgs.LogLevels.Error, "Error going to window", e)); + return false; //--> comando non completato + } + } + public bool GoPrevious() { return GoPrevious(null); } //Ritorno alla finestra precedente (senza log) + public bool GoPrevious(LogEventHandler Log) //Ritorno alla finestra precedente + { + if (_caption.Length > 0 && Log != null) + Log(this, new LogEventArgs(LogEventArgs.LogLevels.Info, "Go to previous window")); - GUIWindowManager.SendMessage(msg); //--> invio messaggio per attivazione finestra + try + { + GUIGraphicsContext.ResetLastActivity(); + GUIWindowManager.ShowPreviousWindow(); //--> visualizzazione finestra precedente + return true; //--> comando eseguito con successo } + catch (Exception e) + { + if (Log != null) + Log(this, new LogEventArgs(LogEventArgs.LogLevels.Error, "Error going to previous window", e)); + return false; //--> comando non completato + } } + public void Reset() //Reset destinazione (invalidazione) + { + _windowID = InvalidID; //--> invalidazione window ID + _loadParameter = ""; //--> reset parametri di caricamento + } public override string ToString() //Override metodo ToString per stampare le proprietà del link { return ((_caption.Length > 0) ? "Link " + _caption + " " : "") + "--> WindowID=" + _windowID.ToString() + ((_loadParameter.Length > 0) ? " LoadParameter=[" + _loadParameter + "]" : ""); @@ -97,7 +171,6 @@ public string LoadParameter { get { return this._loadParameter; } set { this._loadParameter = value; } } #endregion } - internal class KeyCombination //Classe combinazione di tasti { #region Dati @@ -127,8 +200,15 @@ _key = "A"; //--> inizializzazione tasto _ctrl = true; //--> inizializzazione utilizzo del modificatore "Ctrl" _alt = false; //--> inizializzazione utilizzo del modificatore "Alt" - _shift = true; //--> inizializzazione utilizzo del modificatore "Shift" } + _shift = true; //--> inizializzazione utilizzo del modificatore "Shift" } + public KeyCombination(KeyEventArgs k) //Costruttore classe KeyCombination da evento di pressione tasto + { + _key = k.KeyCode.ToString(); //--> assegnazione tasto + _ctrl = k.Control; //--> utilizzo del modificatore "Ctrl" + _alt = k.Alt; //--> utilizzo del modificatore "Alt" + _shift = k.Shift; //--> utilizzo del modificatore "Shift" + } #endregion #region Metodi Pubblici @@ -160,7 +240,6 @@ public bool Shift { get { return this._shift; } set { this._shift = value; } } #endregion } - internal class ShortCut : INotifyPropertyChanged //Classe shortcut (scorciatoia da tastiera) con notifica variazione proprietà { #region Dati @@ -174,12 +253,12 @@ #region Costruttore public ShortCut() //Costruttore classe ShortCut { - _caption = "ShortCut"; //--> inizializzazione titolo - _keys = new KeyCombination(); //--> istanziazione classe KeyCombination - _destination = new WindowLink(); //--> istanziazione classe WindowLink + _caption = "ShortCut"; //--> inizializzazione titolo + _keys = new KeyCombination(); //--> istanziazione classe KeyCombination + _destination = new WindowLink(); //--> istanziazione classe WindowLink _destination.Caption = ""; //--> reset caption destinazione (gestita caption shortcut) - _return = false; //--> inizializzazione ritorno a finestra ... [truncated message content] |