/**
* Grasscutter Tools
* Copyright (C) 2022 jie65535
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*
**/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using GrasscutterTools.Game;
using GrasscutterTools.Properties;
namespace GrasscutterTools.Forms
{
public partial class FormTextMapBrowser : Form
{
public FormTextMapBrowser()
{
InitializeComponent();
Icon = Resources.IconGrasscutter;
}
private void FormTextMapBrowser_Load(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(Settings.Default.ResourcesDirPath))
{
LoadResources(Settings.Default.ResourcesDirPath);
}
}
private TextMapData data;
private void LoadResources(string resourcesDirPath)
{
try
{
Cursor = Cursors.WaitCursor;
Application.DoEvents();
data = new TextMapData(resourcesDirPath);
LblResourcesPath.Text = resourcesDirPath;
if (Settings.Default.ResourcesDirPath != resourcesDirPath)
{
Settings.Default.ResourcesDirPath = resourcesDirPath;
}
CmbLanguage.Items.Clear();
CmbLanguage.Items.AddRange(data.TextMapFiles);
if (!string.IsNullOrEmpty(Settings.Default.TextMapFileName))
{
var i = CmbLanguage.Items.IndexOf(Settings.Default.TextMapFileName);
if (i != -1)
CmbLanguage.SelectedIndex = i;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
Cursor = Cursors.Default;
}
}
private void BtnSelectRecoursePath_Click(object sender, EventArgs e)
{
var dir = new FolderBrowserDialog()
{
ShowNewFolderButton = false,
Description = "./Gasscutter/resources",
};
if (dir.ShowDialog() == DialogResult.OK)
{
LoadResources(dir.SelectedPath);
}
}
private void CmbLanguage_SelectedIndexChanged(object sender, EventArgs e)
{
if (CmbLanguage.SelectedIndex == -1 || data == null)
return;
try
{
Cursor = Cursors.WaitCursor;
Application.DoEvents();
data.LoadTextMap(data.TextMapFilePaths[CmbLanguage.SelectedIndex]);
GenLines();
Settings.Default.TextMapFileName = CmbLanguage.Text;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
Cursor = Cursors.Default;
}
}
private List Items;
private void GenLines()
{
var items = new List(data.TextMap.Count);
foreach (var kv in data.TextMap)
{
items.Add(data.ManualTextMap?.TryGetValue(kv.Key, out var id) == true
? new ListViewItem(new[] { kv.Key, id, kv.Value })
: new ListViewItem(new[] { kv.Key, "", kv.Value }));
}
Items = items;
}
private void ChkTopMost_CheckedChanged(object sender, EventArgs e)
{
TopMost = ChkTopMost.Checked;
}
private void BtnSearch_Click(object sender, EventArgs e)
{
if (Items == null)
{
MessageBox.Show("请先选择资源目录,并选择对应语言文件。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
var filter = TxtTextMapFilter.Text.Trim();
if (string.IsNullOrEmpty(filter))
return;
Regex r;
try
{
r = new Regex(filter, RegexOptions.IgnoreCase);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try
{
Cursor = Cursors.WaitCursor;
Application.DoEvents();
var manualResult = data.ManualTextMap?.Where(kv => r.Match(kv.Value).Success)
.Select(kv => new { Hash = kv.Key, Text = data.TextMap[kv.Key], Id = kv.Value, });
var textMapResult = data.TextMap.Where(kv => r.Match(kv.Key).Success || r.Match(kv.Value).Success)
.Select(kv => new
{
Hash = kv.Key,
Text = kv.Value,
Id = data.ManualTextMap?.TryGetValue(kv.Key, out var id) == true ? id : "",
});
var result = manualResult == null ? textMapResult.ToList() : textMapResult.Concat(manualResult).ToList();
DGVTextMap.SuspendLayout();
DGVTextMap.Rows.Clear();
for (var i = 0; i < result.Count; i++)
{
DGVTextMap.Rows.Add();
DGVTextMap.Rows[i].Cells[0].Value = result[i].Hash;
DGVTextMap.Rows[i].Cells[1].Value = result[i].Text;
DGVTextMap.Rows[i].Cells[2].Value = result[i].Id;
}
DGVTextMap.ResumeLayout();
}
finally
{
Cursor = Cursors.Default;
}
}
private void TxtTextMapFilter_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
BtnSearch_Click(sender, e);
}
private void TxtTextMapFilter_TextChanged(object sender, EventArgs e)
{
LblClearFilter.Visible = TxtTextMapFilter.Text.Length > 0;
}
private void LblClearFilter_Click(object sender, EventArgs e)
{
TxtTextMapFilter.Clear();
}
}
}