private void LoadTemplatesFromDisk()
        {
            string executionPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string filePath = executionPath + "/WindWaker/Templates/ActorCategoryList.json";

            string fileContents = File.ReadAllText(filePath);

            try
            {
                var categoryData = JsonConvert.DeserializeObject<List<ObjectUIListEntry>>(fileContents);

                // Sort them by category
                var objByCategory = new Dictionary<string, List<ObjectUIListEntry>>();
                for (int i = 0; i < categoryData.Count; i++)
                {
                    if (!objByCategory.ContainsKey(categoryData[i].Category))
                        objByCategory[categoryData[i].Category] = new List<ObjectUIListEntry>();

                    objByCategory[categoryData[i].Category].Add(categoryData[i]);
                }

                var fullEntryList = new List<ObjectUIListEntry>();
                var tabList = new List<TabItem>();

                // Create tabs for each unique category
                foreach (var kvp in objByCategory)
                {
                    TabItem tab = new TabItem();
                    tab.Header = kvp.Key;

                    foreach (var entry in kvp.Value)
                    {
                        // Create a new BitmapImage to represent the icon - caching the icon on load so that it doesn't
                        // have atomic focus on the file and lock others from using the same icon.
                        using (FileStream fs = new FileStream(entry.IconPath, FileMode.Open))
                        {
                            BitmapImage entryIcon = new BitmapImage();
                            entryIcon.BeginInit();
                            entryIcon.CacheOption = BitmapCacheOption.OnLoad;
                            entryIcon.StreamSource = fs;
                            entryIcon.EndInit();

                            entry.DisplayImage = entryIcon;
                            tab.Content.Add(entry);
                            fullEntryList.Add(entry);
                        }
                    }

                    tabList.Add(tab);
                }

                // Use the flat-list of our entries and assign it as the source of the CollectionViewSource so we can filter it.
                FullList.Source = fullEntryList;

                // Sort the Tabs by header, A-Z (but put "Uncategorized" last)
                tabList.Sort(delegate(TabItem a, TabItem b) { return a.Header.CompareTo(b.Header); });
                TabItem uncatTab = tabList.Find(x => x.Header == "Uncategorized");
                if (uncatTab != null)
                {
                    tabList.Remove(uncatTab);
                    tabList.Add(uncatTab);
                }

                for (int i = 0; i < tabList.Count; i++)
                {
                    Tabs.Add(tabList[i]);
                }
            }
            catch (Exception ex)
            {
                WLog.Error(LogCategory.EditorCore, null, "Caught Exception while loading Actor Object List: {0}", ex);
            }
        }
        private void LoadTemplatesFromDisk()
        {
            string executionPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string filePath      = executionPath + "/WindWaker/Templates/ActorCategoryList.json";

            string fileContents = File.ReadAllText(filePath);

            try
            {
                var categoryData = JsonConvert.DeserializeObject <List <ObjectUIListEntry> >(fileContents);


                // Sort them by category
                var objByCategory = new Dictionary <string, List <ObjectUIListEntry> >();
                for (int i = 0; i < categoryData.Count; i++)
                {
                    if (!objByCategory.ContainsKey(categoryData[i].Category))
                    {
                        objByCategory[categoryData[i].Category] = new List <ObjectUIListEntry>();
                    }

                    objByCategory[categoryData[i].Category].Add(categoryData[i]);
                }

                var fullEntryList = new List <ObjectUIListEntry>();
                var tabList       = new List <TabItem>();

                // Create tabs for each unique category
                foreach (var kvp in objByCategory)
                {
                    TabItem tab = new TabItem();
                    tab.Header = kvp.Key;

                    foreach (var entry in kvp.Value)
                    {
                        // Create a new BitmapImage to represent the icon - caching the icon on load so that it doesn't
                        // have atomic focus on the file and lock others from using the same icon.
                        using (FileStream fs = new FileStream(entry.IconPath, FileMode.Open))
                        {
                            BitmapImage entryIcon = new BitmapImage();
                            entryIcon.BeginInit();
                            entryIcon.CacheOption  = BitmapCacheOption.OnLoad;
                            entryIcon.StreamSource = fs;
                            entryIcon.EndInit();

                            entry.DisplayImage = entryIcon;
                            tab.Content.Add(entry);
                            fullEntryList.Add(entry);
                        }
                    }

                    tabList.Add(tab);
                }

                // Use the flat-list of our entries and assign it as the source of the CollectionViewSource so we can filter it.
                FullList.Source = fullEntryList;

                // Sort the Tabs by header, A-Z (but put "Uncategorized" last)
                tabList.Sort(delegate(TabItem a, TabItem b) { return(a.Header.CompareTo(b.Header)); });
                TabItem uncatTab = tabList.Find(x => x.Header == "Uncategorized");
                if (uncatTab != null)
                {
                    tabList.Remove(uncatTab);
                    tabList.Add(uncatTab);
                }

                for (int i = 0; i < tabList.Count; i++)
                {
                    Tabs.Add(tabList[i]);
                }
            }
            catch (Exception ex)
            {
                WLog.Error(LogCategory.EditorCore, null, "Caught Exception while loading Actor Object List: {0}", ex);
            }
        }