private void ReadPackage(string pakFileName, TreeNode rootNode, Language localization, bool checkConflicts) { using (var pakFile = ZipFile.OpenRead(pakFileName)) { foreach (var entry in pakFile.Entries.OrderBy(n => n.Name)) { var parent = rootNode; if (!Path.HasExtension(entry.FullName)) { continue; } var fileTag = string.Join(":", Path.GetFileNameWithoutExtension(pakFileName), entry.FullName); var names = entry.FullName.Split('/'); for (var i = 0; i < names.Length; i++) { var key = names[i].ToLower(); var imageIndex = GetNodeImageIndex(names[i], out var isFile); if (!parent.Nodes.ContainsKey(key)) { var node = parent.Nodes.Add(key, names[i], imageIndex, imageIndex); if (isFile) { node.Tag = NodeTag.CreateFile(fileTag, localization, false); if (checkConflicts) { node.ForeColor = Color.Green; ExpandFullNode(parent); } } else { node.Tag = NodeTag.Folder; } parent = node; } else { parent = parent.Nodes[key]; if (isFile) { var tag = (NodeTag)parent.Tag; tag.Sources.Add(fileTag); if (tag.Sources.Count > 1) { parent.ForeColor = Color.Red; ExpandFullNode(parent); } } } } } } }
private async void ModTree_DoubleClick(object sender, EventArgs e) { var selectedNode = modTree.SelectedNode; if (selectedNode?.Tag is NodeTag tag) { switch (tag.Type) { case NodeType.Root: break; case NodeType.Package: break; case NodeType.Folder: break; case NodeType.File: if (tag.Language != null) { var fileLink = tag.Sources[0].Split(':'); if (fileLink.Length != 2) { return; } var packageFile = Path.Combine(tbModFolder.Text, LocalizationFolder, fileLink[0] + ".pak"); var fileEntry = fileLink[1]; if (MessageBox.Show($"Do you want edit '{fileEntry}' file?", $"{tag.Language} Localization", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { if (FileHelpers.TryExtractTemp(packageFile, fileEntry, out var tempFile)) { using (var form = new LocalizationForm(tag.Language, fileEntry)) { await form.LoadAsync(tempFile, tag.IsNew); if (form.ShowDialog(this) == DialogResult.OK) { if (PackLocalization(form.SourceFileName, fileEntry, tag.Language.FileName, out var pakFilePath)) { selectedNode.ForeColor = modTree.ForeColor; selectedNode.Tag = NodeTag.CreateFile(string.Join(":", Path.GetFileNameWithoutExtension(tag.Language.FileName), fileEntry), tag.Language, false); selectedNode.Parent.ForeColor = modTree.ForeColor; } else { MessageBox.Show(this, $"Can't place '{fileEntry}' into '{tag.Language.FileName}'!", Resources.Caption_Error, MessageBoxButtons.OK, MessageBoxIcon.Error); } } File.Delete(form.SourceFileName); } } } } break; default: return; } } }