1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-25 16:48:44 +02:00
audacity/src/LyricsWindow.cpp
Paul Licameli bf5228267a Calls to Disconnect or Unbind in destructors are not needed, if...
... it's either the source of the connection that is being destroyed, or other
object (such as an ancestor window) transitively owning it and so causing it to
be destroyed too;

or, the sink is being destroyed, and that sink is a wxEvtHandler (which is
always so for Disconnect, though not for Unbind in case Bind was passed a
member function of a non-wxEvtHandler).

wxWidgets takes care of erasing the connection in such cases.

This removes most calls to Disconnect and Unbind.  Many destructors shrank to
nothing.

Notably, in case of popup menu handling, the call to Disconnect is not removable
because the object being destroyed is neither the source nor the sink.
2018-02-21 19:28:06 -05:00

166 lines
5.4 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
LyricsWindow.cpp
Vaughan Johnson
Dominic Mazzoni
**********************************************************************/
#include "LyricsWindow.h"
#include "Lyrics.h"
#include "AudioIO.h"
#include "Project.h"
#include "TrackPanel.h" // for EVT_TRACK_PANEL_TIMER
#include <wx/radiobut.h>
#include <wx/toolbar.h>
#include <wx/settings.h>
#ifdef __WXMSW__
#include "../images/AudacityLogo.xpm"
#else
#include "../images/AudacityLogo48x48.xpm"
#endif
#ifdef __WXMAC__
#include <Carbon/Carbon.h>
#endif
enum {
kID_RadioButton_BouncingBall = 10101,
kID_RadioButton_Highlight,
};
BEGIN_EVENT_TABLE(LyricsWindow, wxFrame)
EVT_CLOSE(LyricsWindow::OnCloseWindow)
EVT_RADIOBUTTON(kID_RadioButton_BouncingBall, LyricsWindow::OnStyle_BouncingBall)
EVT_RADIOBUTTON(kID_RadioButton_Highlight, LyricsWindow::OnStyle_Highlight)
END_EVENT_TABLE()
const wxSize gSize = wxSize(LYRICS_DEFAULT_WIDTH, LYRICS_DEFAULT_HEIGHT);
LyricsWindow::LyricsWindow(AudacityProject *parent):
wxFrame(parent, -1,
wxString::Format(_("Audacity Karaoke%s"),
((parent->GetName() == wxEmptyString) ?
wxT("") :
wxString::Format(
wxT(" - %s"),
parent->GetName()))),
wxPoint(100, 300), gSize,
//v Bug in wxFRAME_FLOAT_ON_PARENT:
// If both the project frame and LyricsWindow are minimized and you restore LyricsWindow,
// you can't restore project frame until you close LyricsWindow, but then project frame and
// LyricsWindow are restored but LyricsWindow is unresponsive because it thinks it's not shown.
// wxDEFAULT_FRAME_STYLE | wxFRAME_FLOAT_ON_PARENT)
wxDEFAULT_FRAME_STYLE)
{
//vvv Still necessary? It's commented out in ToolManager and Meter, so I did so here.
// #ifdef __WXMAC__
// // WXMAC doesn't support wxFRAME_FLOAT_ON_PARENT, so we do
// SetWindowClass((WindowRef) MacGetWindowRef(), kFloatingWindowClass);
// #endif
mProject = parent;
// loads either the XPM or the windows resource, depending on the platform
#if !defined(__WXMAC__) && !defined(__WXX11__)
{
#ifdef __WXMSW__
wxIcon ic{ wxICON(AudacityLogo) };
#else
wxIcon ic{wxICON(AudacityLogo48x48)};
#endif
SetIcon(ic);
}
#endif
wxPoint panelPos(0, 0);
wxSize panelSize = gSize;
//vvv not yet working right in ported version, so choice is disabled.
// It seems when you select highlight style, the TrackPanel timer stops working, but
// going back to bouncing ball style starts it up again (!!!), per breakpoints in TrackPanel::OnTimer().
//
//wxToolBar* pToolBar = this->CreateToolBar();
//const int kHorizMargin = 8;
//wxASSERT(pToolBar); // To justify safenew
//wxRadioButton* pRadioButton_BouncingBall =
// safenew wxRadioButton(pToolBar, kID_RadioButton_BouncingBall, _("Bouncing Ball"), wxPoint(kHorizMargin, 4),
// wxDefaultSize, wxRB_GROUP);
//// Reposition to center vertically.
//wxSize tbSize = pToolBar->GetSize();
//wxSize btnSize = pRadioButton_BouncingBall->GetSize();
//int top = (tbSize.GetHeight() - btnSize.GetHeight()) / 2;
//pRadioButton_BouncingBall->Move(kHorizMargin, top);
//pToolBar->AddControl(pRadioButton_BouncingBall);
//
//int left = kHorizMargin + btnSize.GetWidth() + kHorizMargin; //vvv Doesn't actually work. Probably need sizers.
//wxRadioButton* pRadioButton_Highlight =
// safenew wxRadioButton(pToolBar, kID_RadioButton_Highlight, _("Highlight"), wxPoint(left, top));
//pToolBar->AddControl(pRadioButton_Highlight);
//
//panelPos.x += tbSize.GetHeight();
//panelSize.y -= tbSize.GetHeight();
//
//#if defined(__WXMAC__)
// wxColour face = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
// pRadioButton_BouncingBall->SetBackgroundColour(face);
// pRadioButton_Highlight->SetBackgroundColour(face);
//#endif
//
//pToolBar->Realize();
mLyricsPanel = safenew LyricsPanel(this, -1, panelPos, panelSize);
//vvv Highlight style is broken in ported version.
//switch (mLyricsPanel->GetLyricsStyle())
//{
// case LyricsPanel::kBouncingBallLyrics:
// pRadioButton_BouncingBall->SetValue(true); break;
// case LyricsPanel::kHighlightLyrics:
// default:
// pRadioButton_Highlight->SetValue(true); break;
//}
// Events from the project don't propagate directly to this other frame, so...
mProject->Connect(EVT_TRACK_PANEL_TIMER,
wxCommandEventHandler(LyricsWindow::OnTimer),
NULL,
this);
Center();
}
void LyricsWindow::OnCloseWindow(wxCloseEvent & WXUNUSED(event))
{
this->Hide();
}
void LyricsWindow::OnStyle_BouncingBall(wxCommandEvent & WXUNUSED(event))
{
mLyricsPanel->SetLyricsStyle(LyricsPanel::kBouncingBallLyrics);
}
void LyricsWindow::OnStyle_Highlight(wxCommandEvent & WXUNUSED(event))
{
mLyricsPanel->SetLyricsStyle(LyricsPanel::kHighlightLyrics);
}
void LyricsWindow::OnTimer(wxCommandEvent &event)
{
if (mProject->IsAudioActive())
{
GetLyricsPanel()->Update(gAudioIO->GetStreamTime());
}
else
{
// Reset lyrics display.
GetLyricsPanel()->Update(mProject->GetSel0());
}
// Let other listeners get the notification
event.Skip();
}