forked from mia/Aegisub
Eliminate flickering when moving the mouse over the karaoke split/join bar
Originally committed to SVN as r5681.
This commit is contained in:
parent
ab52f9a441
commit
7b1dea1a7a
2 changed files with 39 additions and 25 deletions
|
@ -128,23 +128,19 @@ void AudioKaraoke::OnFileChanged(int type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioKaraoke::SetEnabled(bool en) {
|
void AudioKaraoke::SetEnabled(bool en) {
|
||||||
if (en) {
|
enabled = en;
|
||||||
LoadFromLine();
|
|
||||||
enabled = true;
|
|
||||||
c->audioController->SetTimingController(CreateKaraokeTimingController(c, kara.get(), file_changed));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
accept_button->Enable(false);
|
|
||||||
cancel_button->Enable(false);
|
|
||||||
enabled = false;
|
|
||||||
c->audioController->SetTimingController(CreateDialogueTimingController(c));
|
|
||||||
}
|
|
||||||
|
|
||||||
c->audioBox->ShowKaraokeBar(en);
|
c->audioBox->ShowKaraokeBar(enabled);
|
||||||
split_area->SetSize(GetSize().GetWidth(), -1);
|
split_area->SetSize(GetSize().GetWidth(), -1);
|
||||||
|
|
||||||
if (en)
|
if (enabled) {
|
||||||
|
LoadFromLine();
|
||||||
|
c->audioController->SetTimingController(CreateKaraokeTimingController(c, kara.get(), file_changed));
|
||||||
Refresh(false);
|
Refresh(false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
c->audioController->SetTimingController(CreateDialogueTimingController(c));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioKaraoke::OnPaint(wxPaintEvent &evt) {
|
void AudioKaraoke::OnPaint(wxPaintEvent &evt) {
|
||||||
|
@ -152,14 +148,31 @@ void AudioKaraoke::OnPaint(wxPaintEvent &evt) {
|
||||||
split_area->GetClientSize(&w, &h);
|
split_area->GetClientSize(&w, &h);
|
||||||
|
|
||||||
wxPaintDC dc(split_area);
|
wxPaintDC dc(split_area);
|
||||||
|
wxMemoryDC bmp_dc(rendered_line);
|
||||||
|
|
||||||
|
// Draw the text and split lines
|
||||||
|
dc.Blit(0, 0, w, h, &bmp_dc, 0, 0);
|
||||||
|
|
||||||
|
// Draw the split line under the mouse
|
||||||
|
dc.SetPen(*wxRED);
|
||||||
|
dc.DrawLine(mouse_pos, 0, mouse_pos, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioKaraoke::RenderText() {
|
||||||
|
int w, h;
|
||||||
|
split_area->GetClientSize(&w, &h);
|
||||||
|
|
||||||
|
if (split_area->GetClientSize() != rendered_line.GetSize()) {
|
||||||
|
rendered_line = wxBitmap(w, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxMemoryDC dc(rendered_line);
|
||||||
|
|
||||||
// Draw background
|
// Draw background
|
||||||
dc.SetBrush(wxBrush(wxSystemSettings::GetColour(enabled ? wxSYS_COLOUR_WINDOW : wxSYS_COLOUR_FRAMEBK)));
|
dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)));
|
||||||
dc.SetPen(*wxTRANSPARENT_PEN);
|
dc.SetPen(*wxTRANSPARENT_PEN);
|
||||||
dc.DrawRectangle(0, 0, w, h);
|
dc.DrawRectangle(0, 0, w, h);
|
||||||
|
|
||||||
if (!enabled) return;
|
|
||||||
|
|
||||||
dc.SetFont(split_font);
|
dc.SetFont(split_font);
|
||||||
dc.SetTextForeground(wxColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)));
|
dc.SetTextForeground(wxColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)));
|
||||||
|
|
||||||
|
@ -169,10 +182,6 @@ void AudioKaraoke::OnPaint(wxPaintEvent &evt) {
|
||||||
dc.DrawText(spaced_text[i], char_x[i], y);
|
dc.DrawText(spaced_text[i], char_x[i], y);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw the split line under the mouse
|
|
||||||
dc.SetPen(*wxRED);
|
|
||||||
dc.DrawLine(mouse_pos, 0, mouse_pos, h);
|
|
||||||
|
|
||||||
// Draw the lines between each syllable
|
// Draw the lines between each syllable
|
||||||
dc.SetPen(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT));
|
dc.SetPen(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT));
|
||||||
for (size_t i = 0; i < syl_lines.size(); ++i) {
|
for (size_t i = 0; i < syl_lines.size(); ++i) {
|
||||||
|
@ -202,7 +211,6 @@ void AudioKaraoke::OnContextMenu(wxContextMenuEvent&) {
|
||||||
void AudioKaraoke::OnMouse(wxMouseEvent &event) {
|
void AudioKaraoke::OnMouse(wxMouseEvent &event) {
|
||||||
if (!enabled) return;
|
if (!enabled) return;
|
||||||
|
|
||||||
int old_mouse_pos = mouse_pos;
|
|
||||||
mouse_pos = event.GetX();
|
mouse_pos = event.GetX();
|
||||||
|
|
||||||
if (event.Leaving())
|
if (event.Leaving())
|
||||||
|
@ -210,10 +218,7 @@ void AudioKaraoke::OnMouse(wxMouseEvent &event) {
|
||||||
|
|
||||||
if (!event.LeftDown()) {
|
if (!event.LeftDown()) {
|
||||||
// Erase the old line and draw the new one
|
// Erase the old line and draw the new one
|
||||||
wxRect r1(mouse_pos - 1, 0, mouse_pos + 1, 100);
|
split_area->Refresh(false);
|
||||||
wxRect r2(old_mouse_pos - 1, 0, old_mouse_pos + 1, 100);
|
|
||||||
split_area->Refresh(false, &r1);
|
|
||||||
split_area->Refresh(false, &r2);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -282,6 +287,8 @@ void AudioKaraoke::SetDisplayText() {
|
||||||
// Get line height
|
// Get line height
|
||||||
wxSize extents = dc.GetTextExtent(spaced_text);
|
wxSize extents = dc.GetTextExtent(spaced_text);
|
||||||
char_height = extents.GetHeight();
|
char_height = extents.GetHeight();
|
||||||
|
|
||||||
|
RenderText();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioKaraoke::CancelSplit() {
|
void AudioKaraoke::CancelSplit() {
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include <wx/bitmap.h>
|
||||||
#include <wx/window.h>
|
#include <wx/window.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -82,6 +83,9 @@ class AudioKaraoke : public wxWindow, private SelectionListener<AssDialogue> {
|
||||||
/// Current line's stripped text with spaces added between each syllable
|
/// Current line's stripped text with spaces added between each syllable
|
||||||
wxString spaced_text;
|
wxString spaced_text;
|
||||||
|
|
||||||
|
/// spaced_text + syl_lines rendered to a bitmap
|
||||||
|
wxBitmap rendered_line;
|
||||||
|
|
||||||
/// Indexes in spaced_text which are the beginning of syllables
|
/// Indexes in spaced_text which are the beginning of syllables
|
||||||
std::vector<int> syl_start_points;
|
std::vector<int> syl_start_points;
|
||||||
|
|
||||||
|
@ -114,6 +118,9 @@ class AudioKaraoke : public wxWindow, private SelectionListener<AssDialogue> {
|
||||||
/// Set the karaoke tags for the selected syllables to the indicated one
|
/// Set the karaoke tags for the selected syllables to the indicated one
|
||||||
void SetTagType(wxString new_type);
|
void SetTagType(wxString new_type);
|
||||||
|
|
||||||
|
/// Prerender the current line along with syllable split lines
|
||||||
|
void RenderText();
|
||||||
|
|
||||||
/// Refresh the area of the display around a single character
|
/// Refresh the area of the display around a single character
|
||||||
/// @param pos Index in spaced_text
|
/// @param pos Index in spaced_text
|
||||||
void LimitedRefresh(int pos);
|
void LimitedRefresh(int pos);
|
||||||
|
|
Loading…
Reference in a new issue