Files
BallanceTasEditor/UI/TASViewer.cs

146 lines
4.7 KiB
C#
Raw Normal View History

2021-05-13 15:49:26 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BallanceTASEditor.Core;
using BallanceTASEditor.Core.TASStruct;
using System.Collections.ObjectModel;
using System.Windows.Controls;
using System.Windows;
2021-05-13 22:18:51 +08:00
namespace BallanceTASEditor.UI {
2021-05-13 15:49:26 +08:00
public class TASViewer : IDisposable {
2021-05-15 16:23:16 +08:00
public TASViewer(TASFile file, Slider slider, TASFlow datagrid, TextBlock statusbar) {
2021-05-13 15:49:26 +08:00
mFile = file;
mSlider = slider;
mDataGrid = datagrid;
2021-05-15 16:23:16 +08:00
mStatusbar = statusbar;
2021-05-13 15:49:26 +08:00
// restore slider
mSlider.Minimum = 0;
updateSliderRange();
2021-05-15 16:23:16 +08:00
// init selection
mSelectionHelp = new SelectionHelp();
mSelectionHelp.SelectionChanged += funcSelectionHelp_SelectionChanged;
2021-05-13 15:49:26 +08:00
// init data
mPosition = 0;
INVALID_FRAME_DATA = new FrameData(-1f, 0);
2021-05-15 16:23:16 +08:00
mDataSource = new List<FrameDataDisplay>();
mListLength = 0;
2021-05-13 15:49:26 +08:00
// bind event and source
2021-05-13 22:18:51 +08:00
mDataGrid.DataSources = mDataSource;
2021-05-15 16:23:16 +08:00
mDataGrid.SelectionHelp = mSelectionHelp;
2021-05-13 15:49:26 +08:00
mSlider.ValueChanged += sliderValueChanged;
2021-05-15 16:23:16 +08:00
// display data
ChangeListLength(DATA_LIST_LENGTH);
2021-05-13 15:49:26 +08:00
}
2021-05-15 16:23:16 +08:00
2021-05-13 15:49:26 +08:00
public void Dispose() {
2021-05-13 22:18:51 +08:00
mDataGrid.DataSources = null;
2021-05-13 15:49:26 +08:00
mSlider.ValueChanged -= sliderValueChanged;
}
2021-05-13 22:18:51 +08:00
const int DATA_LIST_LENGTH = 15;
2021-05-13 15:49:26 +08:00
FrameData INVALID_FRAME_DATA;
TASFile mFile;
Slider mSlider;
2021-05-15 16:23:16 +08:00
TextBlock mStatusbar;
2021-05-13 22:18:51 +08:00
TASFlow mDataGrid;
2021-05-15 16:23:16 +08:00
SelectionHelp mSelectionHelp;
2021-05-13 15:49:26 +08:00
long mPosition;
2021-05-15 16:23:16 +08:00
int mListLength;
2021-05-13 22:18:51 +08:00
List<FrameDataDisplay> mDataSource;
2021-05-13 15:49:26 +08:00
private void sliderValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) {
long pos = Convert.ToInt64(Math.Floor(e.NewValue));
long offset = pos - mPosition;
mFile.Shift(offset);
2021-05-15 16:23:16 +08:00
RefreshDisplay(pos);
2021-05-13 15:49:26 +08:00
mPosition = pos;
}
private void updateSliderRange() {
long newSize = mFile.mFrameCount - 1;
if (mSlider.Value > newSize)
mSlider.Value = newSize;
mSlider.Maximum = newSize;
}
2021-05-15 16:23:16 +08:00
private void funcSelectionHelp_SelectionChanged() {
mDataGrid.RefreshDataMenu();
mDataGrid.RefreshSelectionHighlight();
OnStatusbarSelectionChanged();
}
private void OnStatusbarSelectionChanged() {
var mode = mSelectionHelp.GetToolMode();
switch (mode) {
case ToolMode.Cursor:
if (mSelectionHelp.IsDataReady()) {
var data = mSelectionHelp.GetRange();
mStatusbar.Text = $"{data.start} - {data.end}";
} else if (mSelectionHelp.IsDataPartialReady()) {
var data2 = mSelectionHelp.GetPoint();
mStatusbar.Text = data2.ToString();
} else mStatusbar.Text = "-";
break;
case ToolMode.Fill:
if (mSelectionHelp.IsDataReady()) {
var data3 = mSelectionHelp.GetRange();
mStatusbar.Text = $"{data3.start} - {data3.end}";
} else mStatusbar.Text = "-";
break;
case ToolMode.Overwrite:
if (mSelectionHelp.IsDataReady()) {
var data4 = mSelectionHelp.GetPoint();
mStatusbar.Text = data4.ToString();
} else mStatusbar.Text = "-";
break;
}
}
public void ChangeListLength(int newLen) {
if (newLen < 5 || newLen > 30) return;
int offset = newLen - mListLength;
int abs = Math.Abs(offset);
if (offset == 0) return;
// change mDataSource first
if (offset > 0) {
for (int i = 0; i < abs; i++) {
mDataSource.Add(new FrameDataDisplay(0, INVALID_FRAME_DATA));
}
} else {
mDataSource.RemoveRange(newLen, abs);
}
// then change viewer control
mDataGrid.SetItemCount(newLen);
// apply new value
mListLength = newLen;
// then refresh
RefreshDisplay(mPosition);
}
public void RefreshDisplay(long pos) {
mFile.Get(mDataSource, pos, mListLength);
mDataGrid.RefreshDataSources();
mDataGrid.RefreshSelectionHighlight();
}
public void ChangeToolMode(ToolMode mode) {
mSelectionHelp.SetMode(mode);
}
2021-05-13 15:49:26 +08:00
}
}