/// <summary> /// Initializes the mod grid. /// Sets the nodestore up to store Mod View Models, /// Then adds the appropriate columns to the ModGrid. /// </summary> private void InitializeModGrid() { ModGrid.NodeSelection.Changed += onModSelection; NodeStore modStore = new NodeStore(typeof(ModViewModel)); ModGrid.NodeStore = modStore; //this line currently works around a bug in mono 5. Should be able to remove it once mono 6 is publicly used. typeof(NodeView).GetField("store", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(ModGrid, modStore); CellRendererToggle modcheckbox = new CellRendererToggle(); modcheckbox.Activatable = true; modcheckbox.Toggled += delegate(object o, Gtk.ToggledArgs args) { var node = modStore.GetNode(new Gtk.TreePath(args.Path)) as ModViewModel; node.Enabled = !node.Enabled; }; //modcheckbox. TreeViewColumn modEnabled = new TreeViewColumn("Enabled", modcheckbox, "active", 0); //modEnabled.AddAttribute(modcheckbox, "active", 0); ModGrid.AppendColumn(modEnabled); //modEnabled.SetCellDataFunc(modcheckbox, "activatable", true,); ModGrid.AppendColumn("title", new Gtk.CellRendererText(), "text", 1); ModGrid.AppendColumn("description", new Gtk.CellRendererText(), "text", 2); ModGrid.AppendColumn("version", new Gtk.CellRendererText(), "text", 3); ModGrid.AppendColumn("author", new Gtk.CellRendererText(), "text", 4); ModGrid.AppendColumn("date", new Gtk.CellRendererText(), "text", 5); ModGrid.AppendColumn("url", new Gtk.CellRendererText(), "text", 6); ModGrid.AppendColumn("updateurl", new Gtk.CellRendererText(), "text", 7); // ModGrid.AppendColumn("test", new Gtk.CellRendererToggle(); ModGrid.ShowAll(); }
private void ModGrid_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Down) { ModGrid.CommitEdit(); ++ModGrid.SelectedIndex; } else if (e.Key == Key.Up) { ModGrid.CommitEdit(); --ModGrid.SelectedIndex; } }
// Refresh both PackageList and DisplayedPackages private void Refresh() { Metadata metadata; // First remove all deleted packages and update package id's to match metadata foreach (var package in PackageList.ToList()) { if (!Directory.Exists($@"Packages\{package.path}")) { PackageList.Remove(package); List <DisplayedMetadata> temp = DisplayedPackages.ToList(); temp.RemoveAll(x => x.path == package.path); DisplayedPackages = new ObservableCollection <DisplayedMetadata>(temp); } if (File.Exists($@"Packages\{package.path}\Package.xml")) { try { using (FileStream streamWriter = File.Open($@"Packages\{package.path}\Package.xml", FileMode.Open)) { metadata = (Metadata)xsp.Deserialize(streamWriter); package.id = metadata.id; } } catch (Exception ex) { Console.WriteLine($"[ERROR] Invalid Package.xml for {package.path} ({ex.Message})"); } } } UpdateMetadata(); // Get all packages from Packages folder (Adding packages) foreach (var package in Directory.EnumerateDirectories("Packages")) { if (File.Exists($@"{package}\Package.xml")) { using (FileStream streamWriter = File.Open($@"{package}\Package.xml", FileMode.Open)) { metadata = (Metadata)xsp.Deserialize(streamWriter); // Add package to list if it doesn't exist if (!PackageList.ToList().Any(x => x.path == Path.GetFileName(package)) && !DisplayedPackages.ToList().Any(x => x.path == Path.GetFileName(package))) { // Add new package to both collections DisplayedMetadata dm = InitDisplayedMetadata(metadata); Package p = new Package(); p.enabled = false; p.id = metadata.id; p.path = Path.GetFileName(package); PackageList.Add(p); dm.enabled = false; dm.path = Path.GetFileName(package); DisplayedPackages.Add(dm); } } } // Create Package.xml else { Console.WriteLine($"[WARNING] No Package.xml found for {Path.GetFileName(package)}, creating a simple one..."); // Create metadata Metadata newMetadata = new Metadata(); newMetadata.name = Path.GetFileName(package); newMetadata.id = newMetadata.name.Replace(" ", "").ToLower(); newMetadata.author = ""; newMetadata.version = ""; newMetadata.link = ""; newMetadata.description = ""; using (FileStream streamWriter = File.Create($@"{package}\Package.xml")) { xsp.Serialize(streamWriter, newMetadata); } if (!PackageList.ToList().Any(x => x.path == Path.GetFileName(package)) && !DisplayedPackages.ToList().Any(x => x.path == Path.GetFileName(package))) { // Create package Package newPackage = new Package(); newPackage.enabled = false; newPackage.path = Path.GetFileName(package); newPackage.id = newMetadata.id; PackageList.Add(newPackage); // Create displayedmetadata DisplayedMetadata newDisplayedMetadata = InitDisplayedMetadata(newMetadata); newDisplayedMetadata.enabled = false; newDisplayedMetadata.path = newPackage.path; DisplayedPackages.Add(newDisplayedMetadata); } else { UpdateMetadata(); } } } // Update DisplayedPackages App.Current.Dispatcher.Invoke((Action) delegate { ModGrid.ItemsSource = DisplayedPackages; // Trigger select event to refresh description and Preview.png ModGrid.SetSelectedItem(ModGrid.GetSelectedItem()); }); Console.WriteLine($"[INFO] Refreshed!"); }
// Refresh both PackageList and DisplayedPackages private void Refresh() { Metadata metadata; // First remove all deleted packages and update package id's to match metadata foreach (var package in PackageList.ToList()) { if (!Directory.Exists($@"Packages\{package.path}")) { PackageList.Remove(package); List <DisplayedMetadata> temp = DisplayedPackages.ToList(); temp.RemoveAll(x => x.path == package.path); DisplayedPackages = new ObservableCollection <DisplayedMetadata>(temp); } if (File.Exists($@"Packages\{package.path}\Package.xml")) { try { using (FileStream streamWriter = File.Open($@"Packages\{package.path}\Package.xml", FileMode.Open)) { metadata = (Metadata)xsp.Deserialize(streamWriter); package.id = metadata.id; } } catch (Exception ex) { Console.WriteLine($"[ERROR] Invalid Package.xml for {package.path} ({ex.Message})"); } } } UpdateMetadata(); // Get all packages from Packages folder (Adding packages) foreach (var package in Directory.EnumerateDirectories("Packages")) { if (File.Exists($@"{package}\Package.xml")) { using (FileStream streamWriter = File.Open($@"{package}\Package.xml", FileMode.Open)) { metadata = (Metadata)xsp.Deserialize(streamWriter); // Add package to list if it doesn't exist if (!PackageList.ToList().Any(x => x.path == Path.GetFileName(package)) && !DisplayedPackages.ToList().Any(x => x.path == Path.GetFileName(package))) { // Add new package to both collections DisplayedMetadata dm = InitDisplayedMetadata(metadata); Package p = new Package(); p.enabled = false; p.id = metadata.id; p.path = Path.GetFileName(package); PackageList.Add(p); dm.enabled = false; dm.path = Path.GetFileName(package); DisplayedPackages.Add(dm); } } } // Create Package.xml else { Console.WriteLine($"[WARNING] No Package.xml found for {Path.GetFileName(package)}, creating a simple one..."); // Create metadata Metadata newMetadata = new Metadata(); newMetadata.name = Path.GetFileName(package); newMetadata.id = newMetadata.name.Replace(" ", "").ToLower(); List <string> dirFiles = Directory.GetFiles(package).ToList(); List <string> dirFolders = Directory.GetDirectories(package, "*", SearchOption.TopDirectoryOnly).ToList(); dirFiles = dirFiles.Concat(dirFolders).ToList(); if (dirFiles.Any(x => Path.GetFileName(x).Equals("Mod.xml")) && dirFiles.Any(x => Path.GetFileName(x).Equals("Data"))) { //If mod folder contains Data folder and mod.xml, import mod compendium mod.xml... string modXml = dirFiles.First(x => Path.GetFileName(x).Equals("Mod.xml")); using (FileStream streamWriter = File.Open(modXml, FileMode.Open)) { //Deserialize Mod.xml & Use metadata ModXmlMetadata m = (ModXmlMetadata)xsm.Deserialize(streamWriter); newMetadata.id = m.Author.ToLower().Replace(" ", "") + "." + m.Title.ToLower().Replace(" ", ""); newMetadata.author = m.Author; newMetadata.version = m.Version; newMetadata.link = m.Url; newMetadata.description = m.Description; } //Move files out of Data folder string dataDir = dirFiles.First(x => Path.GetFileName(x).Equals("Data")); if (Directory.Exists(dataDir)) { MoveDir(dataDir, Path.GetDirectoryName(dataDir)); } //Delete prebuild.bat if exists if (dirFiles.Any(x => Path.GetFileName(x).Equals("prebuild.bat"))) { File.Delete(dirFiles.First(x => Path.GetFileName(x).Equals("prebuild.bat"))); } //Make sure Data folder is gone if (Directory.Exists(dataDir)) { Directory.Delete(dataDir, true); } //Goodbye old friend File.Delete(modXml); } else { newMetadata.author = ""; newMetadata.version = ""; newMetadata.link = ""; newMetadata.description = ""; } using (FileStream streamWriter = File.Create($@"{package}\Package.xml")) { xsp.Serialize(streamWriter, newMetadata); } if (!PackageList.ToList().Any(x => x.path == Path.GetFileName(package)) && !DisplayedPackages.ToList().Any(x => x.path == Path.GetFileName(package))) { // Create package Package newPackage = new Package(); newPackage.enabled = false; newPackage.path = Path.GetFileName(package); newPackage.id = newMetadata.id; PackageList.Add(newPackage); // Create displayedmetadata DisplayedMetadata newDisplayedMetadata = InitDisplayedMetadata(newMetadata); newDisplayedMetadata.enabled = false; newDisplayedMetadata.path = newPackage.path; DisplayedPackages.Add(newDisplayedMetadata); } else { UpdateMetadata(); } } } // Update DisplayedPackages App.Current.Dispatcher.Invoke((Action) delegate { ModGrid.ItemsSource = DisplayedPackages; // Trigger select event to refresh description and Preview.png ModGrid.SetSelectedItem(ModGrid.GetSelectedItem()); }); Console.WriteLine($"[INFO] Refreshed!"); }