Added grid key handling
Originally committed to SVN as r105.
This commit is contained in:
parent
0c3b724c31
commit
5d490b988f
5 changed files with 117 additions and 6 deletions
|
@ -49,6 +49,7 @@
|
|||
#include "subs_edit_box.h"
|
||||
#include "frame_main.h"
|
||||
#include "video_display.h"
|
||||
#include "video_slider.h"
|
||||
|
||||
|
||||
///////////////
|
||||
|
@ -59,6 +60,7 @@ BaseGrid::BaseGrid(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wx
|
|||
// Misc variables
|
||||
lastRow = -1;
|
||||
yPos = 0;
|
||||
extendRow = -1;
|
||||
bmp = NULL;
|
||||
holding = false;
|
||||
|
||||
|
@ -135,12 +137,12 @@ void BaseGrid::EndBatch() {
|
|||
|
||||
//////////////////////
|
||||
// Makes cell visible
|
||||
void BaseGrid::MakeCellVisible(int row, int col) {
|
||||
void BaseGrid::MakeCellVisible(int row, int col,bool center) {
|
||||
// Get size
|
||||
int w = 0;
|
||||
int h = 0;
|
||||
GetClientSize(&w,&h);
|
||||
bool forceCenter = true;
|
||||
bool forceCenter = !center;
|
||||
|
||||
// Get min and max visible
|
||||
int minVis = yPos+1;
|
||||
|
@ -148,7 +150,14 @@ void BaseGrid::MakeCellVisible(int row, int col) {
|
|||
|
||||
// Make visible
|
||||
if (forceCenter || row < minVis || row > maxVis) {
|
||||
ScrollTo(row - h/lineHeight/2 + 1);
|
||||
if (center) {
|
||||
ScrollTo(row - h/lineHeight/2 + 1);
|
||||
}
|
||||
|
||||
else {
|
||||
if (row < minVis) ScrollTo(row - 1);
|
||||
if (row > maxVis) ScrollTo(row - h/lineHeight + 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -212,6 +221,7 @@ BEGIN_EVENT_TABLE(BaseGrid,wxWindow)
|
|||
EVT_SIZE(BaseGrid::OnSize)
|
||||
EVT_COMMAND_SCROLL(GRID_SCROLLBAR,BaseGrid::OnScroll)
|
||||
EVT_MOUSE_EVENTS(BaseGrid::OnMouseEvent)
|
||||
EVT_KEY_DOWN(BaseGrid::OnKeyPress)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
|
@ -512,6 +522,13 @@ void BaseGrid::OnMouseEvent(wxMouseEvent &event) {
|
|||
bool validRow = row >= 0 && row < GetRows();
|
||||
if (!validRow) row = -1;
|
||||
|
||||
// Get focus
|
||||
if (event.ButtonDown()) {
|
||||
if (Options.AsBool(_T("Grid Allow Focus"))) {
|
||||
SetFocus();
|
||||
}
|
||||
}
|
||||
|
||||
// Click type
|
||||
if (click && !holding && validRow) {
|
||||
holding = true;
|
||||
|
@ -537,6 +554,9 @@ void BaseGrid::OnMouseEvent(wxMouseEvent &event) {
|
|||
|
||||
// Click
|
||||
if ((click || holding) && validRow) {
|
||||
// Disable extending
|
||||
extendRow = -1;
|
||||
|
||||
// Toggle selected
|
||||
if (click && ctrl && !shift && !alt) {
|
||||
SelectRow(row,true,!IsInSelection(row,0));
|
||||
|
@ -803,3 +823,84 @@ void BaseGrid::UpdateMaps() {
|
|||
// Refresh
|
||||
Refresh(false);
|
||||
}
|
||||
|
||||
|
||||
/////////////
|
||||
// Key press
|
||||
void BaseGrid::OnKeyPress(wxKeyEvent &event) {
|
||||
int key = event.KeyCode();
|
||||
|
||||
// Left/right, forward to seek bar if video is loaded
|
||||
if (key == WXK_LEFT || key == WXK_RIGHT) {
|
||||
if (video->loaded) {
|
||||
video->ControlSlider->SetFocus();
|
||||
video->ControlSlider->AddPendingEvent(event);
|
||||
return;
|
||||
}
|
||||
event.Skip();
|
||||
return;
|
||||
}
|
||||
|
||||
// Up/down
|
||||
int dir = 0;
|
||||
if (key == WXK_UP) dir = -1;
|
||||
if (key == WXK_DOWN) dir = 1;
|
||||
|
||||
// Moving
|
||||
if (dir) {
|
||||
// Modifiers
|
||||
bool ctrl = event.m_controlDown;
|
||||
bool alt = event.m_altDown;
|
||||
bool shift = event.m_shiftDown;
|
||||
|
||||
// Move selection
|
||||
if (!ctrl && !shift && !alt) {
|
||||
int next = editBox->linen+dir;
|
||||
editBox->SetToLine(next);
|
||||
SelectRow(next);
|
||||
MakeCellVisible(next,0,false);
|
||||
extendRow = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
// Move active only
|
||||
if (alt && !shift && !ctrl) {
|
||||
int next = editBox->linen+dir;
|
||||
editBox->SetToLine(next);
|
||||
Refresh(false);
|
||||
MakeCellVisible(next,0,false);
|
||||
extendRow = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
// Add to selection
|
||||
if (shift && !ctrl && !alt) {
|
||||
if (extendRow == -1) {
|
||||
extendRow = editBox->linen+dir;
|
||||
extendRow = MID(0,extendRow,GetRows());
|
||||
SelectRow(extendRow,true);
|
||||
}
|
||||
|
||||
else {
|
||||
// Add
|
||||
if ((extendRow > editBox->linen && dir == 1) || (extendRow < editBox->linen && dir == -1) || extendRow == editBox->linen) {
|
||||
extendRow += dir;
|
||||
extendRow = MID(0,extendRow,GetRows());
|
||||
SelectRow(extendRow,true);
|
||||
}
|
||||
|
||||
// Remove (moving back)
|
||||
else {
|
||||
SelectRow(extendRow,true,false);
|
||||
extendRow += dir;
|
||||
extendRow = MID(0,extendRow,GetRows());
|
||||
}
|
||||
}
|
||||
|
||||
MakeCellVisible(extendRow,0,false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
|
|
|
@ -62,6 +62,7 @@ private:
|
|||
int lineHeight;
|
||||
int colWidth[16];
|
||||
int lastRow;
|
||||
int extendRow;
|
||||
bool holding;
|
||||
wxFont font;
|
||||
wxScrollBar *scrollBar;
|
||||
|
@ -71,6 +72,7 @@ private:
|
|||
void OnSize(wxSizeEvent &event);
|
||||
void OnScroll(wxScrollEvent &event);
|
||||
void OnMouseEvent(wxMouseEvent &event);
|
||||
void OnKeyPress(wxKeyEvent &event);
|
||||
|
||||
void DrawImage(wxDC &dc);
|
||||
|
||||
|
@ -93,7 +95,7 @@ public:
|
|||
void SetColumnWidths();
|
||||
void BeginBatch();
|
||||
void EndBatch();
|
||||
void MakeCellVisible(int row, int col);
|
||||
void MakeCellVisible(int row, int col,bool center=true);
|
||||
|
||||
void SelectRow(int row, bool addToSelected = false, bool select=true);
|
||||
void ClearSelection();
|
||||
|
|
|
@ -21,7 +21,7 @@ Please visit http://aegisub.net to download latest version
|
|||
- 1,1+2 recombining lines where 1 is a substring of 2 no longer causes incorrect behavior. 1+2,2 similarly fixed. This fix also gives more sanity-checking in the recombining (jfs)
|
||||
- Replaced the subtitles grid with a custom control, which should hopefully behave and look better. (AMZ) Changes are:
|
||||
o Currently active line is now highlighted with a border.
|
||||
o The grid can no longer receive focus.
|
||||
o The grid can optionally no longer receive focus (this behavior is disabled by default, change "Grid Allow Focus" to 0 in config.dat to prevent it from getting focus).
|
||||
o Fixed bug related to tag cycling, which would reset grid, move video and force a refresh of everything (slow, and could undo uncommited changes).
|
||||
o Rows colliding with the currently active one will now be highlighted in grid.
|
||||
o Selected comments are now highlighted in a different color.
|
||||
|
@ -38,7 +38,7 @@ Please visit http://aegisub.net to download latest version
|
|||
- Implemented Redo. (AMZ)
|
||||
- Fonts collector will now default collection to same folder as script (Set to "?script" on config.dat). (AMZ)
|
||||
- Alt+Left/Right on the video seek bar will now seek by increments of 10 frames (increment is customizeable in config.dat). (AMZ)
|
||||
- Added a simple audio resync method afor video playback. (AMZ)
|
||||
- Added a simple audio resync method for video playback. (AMZ)
|
||||
- Audio timing will now apply to all selected lines, as well as active line. (AMZ)
|
||||
- Added a volume slider bar to audio mode. (AMZ)
|
||||
- Fixed some internal workings, which should make Aegisub use considerably less RAM (especially for large Karaoke files, 3-4x less RAM usage was measured with a 9 MB file). (AMZ)
|
||||
|
|
|
@ -144,6 +144,7 @@ void OptionsManager::LoadDefaults() {
|
|||
wchar_t temp = 0x2600;
|
||||
SetText(_T("Grid hide overrides char"),temp);
|
||||
SetInt(_T("Grid font size"),8);
|
||||
SetBool(_T("Grid allow focus"),true);
|
||||
|
||||
SetBool(_T("Highlight subs in frame"),true);
|
||||
|
||||
|
|
|
@ -373,6 +373,13 @@ void VideoSlider::OnKeyDown(wxKeyEvent &event) {
|
|||
}
|
||||
}
|
||||
|
||||
// Forward up/down to grid
|
||||
if (key == WXK_UP || key == WXK_DOWN) {
|
||||
grid->AddPendingEvent(event);
|
||||
grid->SetFocus();
|
||||
return;
|
||||
}
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue