diff --git a/core/base_grid.cpp b/core/base_grid.cpp index 8cae17339..f5becda19 100644 --- a/core/base_grid.cpp +++ b/core/base_grid.cpp @@ -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(); +} diff --git a/core/base_grid.h b/core/base_grid.h index 904181653..d11094d83 100644 --- a/core/base_grid.h +++ b/core/base_grid.h @@ -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(); diff --git a/core/changelog.txt b/core/changelog.txt index c818fa1cf..1cd89b84f 100644 --- a/core/changelog.txt +++ b/core/changelog.txt @@ -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) diff --git a/core/options.cpp b/core/options.cpp index 0806fdcfb..91b224180 100644 --- a/core/options.cpp +++ b/core/options.cpp @@ -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); diff --git a/core/video_slider.cpp b/core/video_slider.cpp index 3ce82a76f..75a9c4948 100644 --- a/core/video_slider.cpp +++ b/core/video_slider.cpp @@ -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(); }