Skip to content

Commit 9b85ee0

Browse files
committed
UI refactor, bug fixes & csv export
- Moved search bar into dedicated window (CTRL+F) - Replaced hidden Shift options with top-bar context menu - Added option to export the current tab as CSV data
1 parent 3dc3259 commit 9b85ee0

21 files changed

+527
-364
lines changed

WzVisualizer/GUI/MainForm.Designer.cs

Lines changed: 181 additions & 168 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

WzVisualizer/GUI/MainForm.cs

Lines changed: 128 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,32 @@
1-

2-
using System;
1+
using System;
32
using System.Collections.Generic;
43
using System.Drawing;
54
using System.IO;
65
using System.Linq;
76
using System.Windows.Forms;
8-
97
using WzVisualizer.GUI.Controls;
108
using WzVisualizer.IO;
119
using WzVisualizer.Properties;
1210
using WzVisualizer.Util;
1311

1412
namespace WzVisualizer.GUI {
15-
internal delegate void AddGridRowCallBack(DataGridView grid, BinData binData);
13+
delegate void AddGridRowCallBack(DataGridView grid, BinData binData);
1614

1715
public partial class MainForm : Form {
18-
internal readonly SearchForm SearchForm = new();
1916

20-
private readonly FolderBrowserDialog folderBrowser = new();
21-
private readonly PropertiesViewer viewer = new();
22-
public bool LoadAll { get; set; }
17+
private readonly PropertiesViewer _viewer = new();
18+
internal readonly SearchForm SearchForm = new();
2319

2420
public MainForm() {
2521
InitializeComponent();
2622

27-
// set the default path to the current directory
28-
wzPathTextbox.Text = Directory.GetCurrentDirectory();
29-
3023
AddOwnedForm(SearchForm);
3124
SearchForm.Location = new Point(Right - SearchForm.Width - 5, Top + SearchForm.Height / 2);
3225
LocationChanged += (o, args) => SearchForm.Location = new Point(Right - SearchForm.Width - 5, Top + SearchForm.Height / 2);
33-
SearchForm.searchButton.Click += (o, args) => OnTabControlChanged();
26+
SearchForm.searchButton.Click += (o, args) => LoadCurrentTabPage();
3427
}
35-
36-
public string SearchQuery => searchTextbox.Text;
28+
public bool LoadAll { get; set; }
29+
public string SearchQuery => SearchForm.SearchBox.Text;
3730

3831
/// <summary>
3932
/// recursively add event handlers to all DataViewport components
@@ -55,10 +48,15 @@ private void AddEventHandlers(TabControl tab) {
5548
}
5649
}
5750

58-
public DataViewport GetCurrentDataViewport() {
51+
public TabPage GetCurrentTabPage() {
5952
var main = TabControlMain.SelectedTab;
6053
var sub = (main.Controls[0] is TabControl tc ? tc.SelectedTab : main);
61-
return (DataViewport)sub.Controls[0];
54+
return sub;
55+
}
56+
57+
public DataViewport GetCurrentDataViewport() {
58+
var tab = GetCurrentTabPage();
59+
return (DataViewport)tab.Controls[0];
6260
}
6361

6462
/// <summary>
@@ -77,29 +75,83 @@ private void LoadWzData() {
7775
TabControlMain.SelectedIndex = i;
7876
VisualizerUtil.ProcessTab(i, this);
7977
}
80-
BtnSave_Click(null, new MouseEventArgs(MouseButtons.Left, 0, 0, 0, 0));
81-
return;
78+
SaveBinary(true);
79+
} else {
80+
VisualizerUtil.ProcessTab(TabControlMain.SelectedIndex, this);
81+
}
82+
}
83+
84+
internal void LoadCurrentTabPage() {
85+
ClearAllPages(TabControlMain);
86+
87+
var main = TabControlMain.SelectedTab;
88+
var tab = GetCurrentTabPage();
89+
var dv = GetCurrentDataViewport();
90+
BinaryDataUtil.ImportGrid($"{main.Text}/{tab.Text}.bin", dv, (grid, data) => VisualizerUtil.AddNewRow(this, grid, data));
91+
}
92+
93+
private void ExportPictures() {
94+
for (var i = 0; i < TabControlMain.TabCount; i++) {
95+
// changing the selected tab will trigger the TabControl_Selected event
96+
// which will prepare the data for us to export
97+
TabControlMain.SelectedIndex = i;
98+
BinaryDataUtil.ExportPictures(TabControlMain.TabPages[i], TabControlMain.TabPages[i].Text);
99+
}
100+
MessageBox.Show(Resources.CompleteSaveImages, Resources.SaveComplete);
101+
}
102+
103+
/// <summary>
104+
/// Clear all DataViewport grids to allow re-populating data, especially when search queries are present
105+
/// </summary>
106+
private void ClearAllPages(TabControl tabControl, bool clearData = false) {
107+
foreach (TabPage page in tabControl.TabPages) {
108+
switch (page.Controls[0]) {
109+
case DataViewport dv: {
110+
if (clearData) dv.Data.Clear();
111+
dv.GridView.Rows.Clear();
112+
break;
113+
}
114+
case TabControl tc:
115+
if (tc == TabControlMain && tc.SelectedTab == TabControlMain.SelectedTab)
116+
break;
117+
ClearAllPages(tc);
118+
break;
119+
}
120+
}
121+
GC.Collect();
122+
}
123+
124+
/// <summary>
125+
/// upon clicking the save button, store data of the current opened grid.
126+
/// Some tabs may have another TabControl in which that Control contains a Grid control.
127+
/// </summary>
128+
private void SaveBinary(bool everything) {
129+
if (everything) {
130+
for (var i = 0; i < TabControlMain.TabCount; i++) {
131+
TabControlMain.SelectedIndex = i;
132+
BinaryDataUtil.ExportBinary(TabControlMain.TabPages[i], TabControlMain.SelectedTab.Text);
133+
}
134+
} else {
135+
var selectedTab = GetCurrentTabPage();
136+
BinaryDataUtil.ExportBinary(selectedTab, TabControlMain.SelectedTab.Text);
82137
}
83138

84-
VisualizerUtil.ProcessTab(TabControlMain.SelectedIndex, this);
139+
MessageBox.Show(Resources.CompleteSaveBIN, Resources.SaveComplete);
140+
LoadAll = false;
85141
}
86142

87143
/// <summary>
88144
/// Begin loading WZ data corresponding to the selected tab
89145
/// </summary>
90-
private void BtnWzLoad_Click(object sender, EventArgs e) {
146+
private void VerifyWzFolder(string path) {
91147
ClearAllPages(TabControlMain, true);
92148
DisposeWzFiles();
93149

94-
LoadAll = ModifierKeys == Keys.Shift;
95-
96150
if (LoadAll) {
97-
var result = MessageBox.Show(Resources.MassReadWarning, "Warning", MessageBoxButtons.YesNo);
151+
var result = MessageBox.Show(Resources.MassReadWarning, @"Warning", MessageBoxButtons.YesNo);
98152
if (result != DialogResult.Yes) return;
99153
}
100154

101-
var path = wzPathTextbox.Text;
102-
103155
if (!path.Equals(Settings.Default.PathCache)) {
104156
Settings.Default.PathCache = path;
105157
Settings.Default.Save();
@@ -157,49 +209,6 @@ private void BtnWzLoad_Click(object sender, EventArgs e) {
157209
MessageBox.Show(Resources.GameFilesNotFound, Resources.FileNotFound, MessageBoxButtons.OK, MessageBoxIcon.Error);
158210
}
159211

160-
void ExportBinary(TabControl tab, bool saveAll = false) {
161-
var selectedTab = tab.SelectedTab;
162-
if (saveAll) {
163-
for (var i = 0; i < TabControlMain.TabCount; i++) {
164-
TabControlMain.SelectedIndex = i;
165-
BinaryDataUtil.ExportBinary(TabControlMain.TabPages[i], TabControlMain.TabPages[i].Text);
166-
}
167-
} else BinaryDataUtil.ExportBinary(selectedTab, selectedTab.Text);
168-
}
169-
170-
void ExportPictures(TabControl tab, bool saveAll = false) {
171-
var selectedTab = tab.SelectedTab;
172-
if (saveAll) {
173-
for (var i = 0; i < TabControlMain.TabCount; i++) {
174-
TabControlMain.SelectedIndex = i;
175-
BinaryDataUtil.ExportPictures(TabControlMain.TabPages[i], TabControlMain.TabPages[i].Text);
176-
}
177-
} else BinaryDataUtil.ExportPictures(selectedTab, selectedTab.Text);
178-
}
179-
180-
/// <summary>
181-
/// upon clicking the save button, store data of the current opened grid.
182-
/// Some tabs may have another TabControl in which that Control contains a Grid control.
183-
/// </summary>
184-
private void BtnSave_Click(object sender, EventArgs ev) {
185-
var button = ((MouseEventArgs)ev).Button;
186-
var saveAll = LoadAll || ModifierKeys == Keys.Shift;
187-
188-
if (!LoadAll && saveAll) {
189-
var result = MessageBox.Show(Resources.MassWriteWarning, "Warning", MessageBoxButtons.YesNo);
190-
if (result != DialogResult.Yes) return;
191-
}
192-
193-
ExportBinary(TabControlMain, saveAll);
194-
MessageBox.Show(Resources.CompleteSaveBIN, "Save Complete");
195-
LoadAll = false;
196-
}
197-
198-
private void BtnExport_Click(object sender, EventArgs e) {
199-
ExportPictures(TabControlMain, true);
200-
MessageBox.Show(Resources.CompleteSaveImages, "Save Complete");
201-
}
202-
203212
/// <summary>
204213
/// Update the Window's clipboard when a cell is selected
205214
/// </summary>
@@ -245,100 +254,77 @@ private void Grid_CellDoubleClick(object sender, DataGridViewCellEventArgs e) {
245254
cell.OwningRow.Height = bmp.Height + 15;
246255
break;
247256
case 3:
248-
viewer.SetProperties((string)((DataGridView)sender).SelectedCells[0].Value);
249-
if (!viewer.Visible) {
250-
viewer.Height = Height;
251-
viewer.StartPosition = FormStartPosition.Manual;
257+
_viewer.SetProperties((string)((DataGridView)sender).SelectedCells[0].Value);
258+
if (!_viewer.Visible) {
259+
_viewer.Height = Height;
260+
_viewer.StartPosition = FormStartPosition.Manual;
252261

253-
viewer.Left = Right;
254-
viewer.Top = Top;
262+
_viewer.Left = Right;
263+
_viewer.Top = Top;
255264
}
256-
viewer.Show();
257-
viewer.BringToFront();
265+
_viewer.Show();
266+
_viewer.BringToFront();
258267
break;
259268
}
260269
}
261270

262-
/// <summary>
263-
/// Open the FolderBrowser dialog window when the text box is clicked and set the selected
264-
/// directory as the root folder containing WZ files
265-
/// </summary>
266-
private void TextWzPath_Click(object sender, EventArgs e) {
267-
if (folderBrowser.ShowDialog() != DialogResult.OK) return;
268-
wzPathTextbox.Text = folderBrowser.SelectedPath;
269-
}
270-
271-
272-
private void SearchTextBox_KeyPress(object sender, KeyPressEventArgs e) {
273-
if (e.KeyChar == 13) {
274-
OnTabControlChanged();
275-
}
276-
}
277-
278-
internal void MainForm_KeyDown(object sender, KeyEventArgs e) {
279-
LoadAll = ModifierKeys == Keys.Shift;
280-
saveButton.Text = LoadAll ? "Save All" : "Save";
281-
loadButton.Text = LoadAll ? "Load All" : "Load";
282-
searchButton.Text = LoadAll ? "Options" : "Search";
283-
}
284-
285-
internal void MainForm_KeyUp(object sender, KeyEventArgs e) {
286-
LoadAll = ModifierKeys == Keys.Shift;
287-
saveButton.Text = LoadAll ? "Save All" : "Save";
288-
loadButton.Text = LoadAll ? "Load All" : "Load";
289-
searchButton.Text = LoadAll ? "Options" : "Search";
290-
}
291-
292271
private void MainForm_Load(object sender, EventArgs e) {
293-
// Obtain the last used WZ root directory
294-
wzPathTextbox.Text = Settings.Default.PathCache;
295-
296272
TabControlMain.Selected += TabControl_Selected;
297273
AddEventHandlers(TabControlMain);
298274

299-
OnTabControlChanged();
275+
LoadCurrentTabPage();
300276
}
301277

302278
private void TabControl_Selected(object sender, TabControlEventArgs e) {
303-
OnTabControlChanged();
279+
LoadCurrentTabPage();
304280
}
305281

306-
private void BtnSearch_Click(object sender, EventArgs e) {
307-
if (ModifierKeys == Keys.Shift) {
308-
SearchForm.Show();
309-
} else {
310-
// re-load the tab, but this time we should have a search query
311-
OnTabControlChanged();
282+
private void OnLoadCurrentTabPage(object sender, EventArgs e) {
283+
LoadAll = false;
284+
285+
var folderDlg = new FolderBrowserDialog {
286+
Description = "Select a folder",
287+
ShowNewFolderButton = false,
288+
SelectedPath = Settings.Default.PathCache
289+
};
290+
if (folderDlg.ShowDialog() == DialogResult.OK) {
291+
VerifyWzFolder(folderDlg.SelectedPath);
312292
}
313293
}
294+
private void OnLoadEverything(object sender, EventArgs e) {
295+
LoadAll = true;
296+
297+
var folderDlg = new FolderBrowserDialog {
298+
Description = "Select a folder",
299+
ShowNewFolderButton = false,
300+
SelectedPath = Settings.Default.PathCache
301+
};
302+
if (folderDlg.ShowDialog() == DialogResult.OK) {
303+
VerifyWzFolder(folderDlg.SelectedPath);
304+
}
305+
}
306+
private void OnSaveCurrentTabPage(object sender, EventArgs e) {
307+
SaveBinary(false);
308+
}
309+
private void OnSaveEverything(object sender, EventArgs e) {
310+
var result = MessageBox.Show(Resources.MassWriteWarning, "Warning", MessageBoxButtons.YesNo);
311+
if (result != DialogResult.Yes) return;
314312

315-
private void OnTabControlChanged() {
316-
ClearAllPages(TabControlMain);
313+
SaveBinary(true);
314+
}
315+
private void OnExportPictures(object sender, EventArgs e) {
316+
ExportPictures();
317+
}
318+
private void OnShowSearchForm(object sender, EventArgs e) {
319+
SearchForm.Show();
320+
}
317321

318-
var main = TabControlMain.SelectedTab;
319-
var dv = GetCurrentDataViewport();
320-
BinaryDataUtil.ImportGrid($"{main.Text}/{dv.Parent.Text}.bin", dv, (grid, data) => VisualizerUtil.AddNewRow(this, grid, data));
322+
private void OnOpenningMainToolstrip(object sender, EventArgs e) {
323+
OpenCurrentMenuItem.Text = $"Load {GetCurrentTabPage().Text}";
321324
}
322325

323-
/// <summary>
324-
/// Clear all DataViewport grids to allow re-populating data, especially when search queries are present
325-
/// </summary>
326-
private void ClearAllPages(TabControl tabControl, bool clearData = false) {
327-
foreach (TabPage page in tabControl.TabPages) {
328-
switch (page.Controls[0]) {
329-
case DataViewport dv: {
330-
if (clearData) dv.Data.Clear();
331-
dv.GridView.Rows.Clear();
332-
break;
333-
}
334-
case TabControl tc:
335-
if (tc == TabControlMain && tc.SelectedTab == TabControlMain.SelectedTab)
336-
break;
337-
ClearAllPages(tc);
338-
break;
339-
}
340-
}
341-
GC.Collect();
326+
private void exportTocsvToolStripMenuItem_Click(object sender, EventArgs e) {
327+
BinaryDataUtil.ExportCSV(GetCurrentTabPage(), GetCurrentTabPage().Text);
342328
}
343329
}
344-
}
330+
}

0 commit comments

Comments
 (0)