mirror of
https://github.com/cookiengineer/audacity
synced 2025-10-29 08:43:56 +01:00
TCP draw use hit target for button, slider state; remove hacky global
This commit is contained in:
@@ -1066,11 +1066,9 @@ void TrackPanel::OnContextMenu(wxContextMenuEvent & WXUNUSED(event))
|
||||
|
||||
struct TrackInfo::TCPLine {
|
||||
using DrawFunction = void (*)(
|
||||
wxDC *dc,
|
||||
TrackPanelDrawingContext &context,
|
||||
const wxRect &rect,
|
||||
const Track *maybeNULL,
|
||||
int pressed, // a value from MouseCaptureEnum; TODO: make it bool
|
||||
bool captured
|
||||
const Track *maybeNULL
|
||||
);
|
||||
|
||||
unsigned items; // a bitwise OR of values of the enum above
|
||||
@@ -1696,6 +1694,8 @@ void TrackPanel::Refresh(bool eraseBackground /* = TRUE */,
|
||||
DisplaySelection();
|
||||
}
|
||||
|
||||
#include "TrackPanelDrawingContext.h"
|
||||
|
||||
/// Draw the actual track areas. We only draw the borders
|
||||
/// and the little buttons and menues and whatnot here, the
|
||||
/// actual contents of each track are drawn by the TrackArtist.
|
||||
@@ -1856,20 +1856,21 @@ void TrackPanel::DrawEverythingElse(wxDC * dc,
|
||||
#include "tracks/ui/TrackControls.h"
|
||||
|
||||
void TrackInfo::DrawItems
|
||||
( wxDC *dc, const wxRect &rect, const Track &track,
|
||||
int mouseCapture, bool captured )
|
||||
( TrackPanelDrawingContext &context,
|
||||
const wxRect &rect, const Track &track )
|
||||
{
|
||||
const auto topLines = getTCPLines( track );
|
||||
const auto bottomLines = commonTrackTCPBottomLines;
|
||||
DrawItems
|
||||
( dc, rect, &track, topLines, bottomLines, mouseCapture, captured );
|
||||
( context, rect, &track, topLines, bottomLines );
|
||||
}
|
||||
|
||||
void TrackInfo::DrawItems
|
||||
( wxDC *dc, const wxRect &rect, const Track *pTrack,
|
||||
const std::vector<TCPLine> &topLines, const std::vector<TCPLine> &bottomLines,
|
||||
int mouseCapture, bool captured )
|
||||
( TrackPanelDrawingContext &context,
|
||||
const wxRect &rect, const Track *pTrack,
|
||||
const std::vector<TCPLine> &topLines, const std::vector<TCPLine> &bottomLines )
|
||||
{
|
||||
auto dc = &context.dc;
|
||||
TrackInfo::SetTrackInfoFont(dc);
|
||||
dc->SetTextForeground(theTheme.Colour(clrTrackPanelText));
|
||||
|
||||
@@ -1882,7 +1883,7 @@ void TrackInfo::DrawItems
|
||||
};
|
||||
if ( !TrackInfo::HideTopItem( rect, itemRect ) &&
|
||||
line.drawFunction )
|
||||
line.drawFunction( dc, itemRect, pTrack, mouseCapture, captured );
|
||||
line.drawFunction( context, itemRect, pTrack );
|
||||
yy += line.height + line.extraSpace;
|
||||
}
|
||||
}
|
||||
@@ -1895,20 +1896,26 @@ void TrackInfo::DrawItems
|
||||
rect.x, rect.y + yy,
|
||||
rect.width, line.height
|
||||
};
|
||||
line.drawFunction( dc, itemRect, pTrack, mouseCapture, captured );
|
||||
line.drawFunction( context, itemRect, pTrack );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#include "tracks/ui/TrackButtonHandles.h"
|
||||
void TrackInfo::CloseTitleDrawFunction
|
||||
( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, bool captured )
|
||||
( TrackPanelDrawingContext &context,
|
||||
const wxRect &rect, const Track *pTrack )
|
||||
{
|
||||
auto dc = &context.dc;
|
||||
bool selected = pTrack ? pTrack->GetSelected() : true;
|
||||
{
|
||||
bool down = captured && (pressed == TrackPanel::IsClosing);
|
||||
wxRect bev = rect;
|
||||
GetCloseBoxHorizontalBounds( rect, bev );
|
||||
auto target = dynamic_cast<CloseButtonHandle*>( context.target.get() );
|
||||
bool hit = target && target->GetTrack().get() == pTrack;
|
||||
bool captured = hit && target->IsClicked();
|
||||
bool down = captured && bev.Contains( context.lastState.GetPosition());
|
||||
AColor::Bevel2(*dc, !down, bev, selected );
|
||||
|
||||
#ifdef EXPERIMENTAL_THEMING
|
||||
@@ -1935,12 +1942,15 @@ void TrackInfo::CloseTitleDrawFunction
|
||||
}
|
||||
|
||||
{
|
||||
wxRect bev = rect;
|
||||
GetTitleBarHorizontalBounds( rect, bev );
|
||||
auto target = dynamic_cast<MenuButtonHandle*>( context.target.get() );
|
||||
bool hit = target && target->GetTrack().get() == pTrack;
|
||||
bool captured = hit && target->IsClicked();
|
||||
bool down = captured && bev.Contains( context.lastState.GetPosition());
|
||||
wxString titleStr =
|
||||
pTrack ? pTrack->GetName() : _("Name");
|
||||
|
||||
bool down = captured && (pressed == TrackPanel::IsPopping);
|
||||
wxRect bev = rect;
|
||||
GetTitleBarHorizontalBounds( rect, bev );
|
||||
//bev.Inflate(-1, -1);
|
||||
AColor::Bevel2(*dc, !down, bev, selected);
|
||||
|
||||
@@ -1993,15 +2003,20 @@ void TrackInfo::CloseTitleDrawFunction
|
||||
}
|
||||
|
||||
void TrackInfo::MinimizeSyncLockDrawFunction
|
||||
( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, bool captured )
|
||||
( TrackPanelDrawingContext &context,
|
||||
const wxRect &rect, const Track *pTrack )
|
||||
{
|
||||
auto dc = &context.dc;
|
||||
bool selected = pTrack ? pTrack->GetSelected() : true;
|
||||
bool syncLockSelected = pTrack ? pTrack->IsSyncLockSelected() : true;
|
||||
bool minimized = pTrack ? pTrack->GetMinimized() : false;
|
||||
{
|
||||
bool down = captured && (pressed == TrackPanel::IsMinimizing);
|
||||
wxRect bev = rect;
|
||||
GetMinimizeHorizontalBounds(rect, bev);
|
||||
auto target = dynamic_cast<MinimizeButtonHandle*>( context.target.get() );
|
||||
bool hit = target && target->GetTrack().get() == pTrack;
|
||||
bool captured = hit && target->IsClicked();
|
||||
bool down = captured && bev.Contains( context.lastState.GetPosition());
|
||||
|
||||
// Clear background to get rid of previous arrow
|
||||
//AColor::MediumTrackInfo(dc, t->GetSelected());
|
||||
@@ -2040,13 +2055,15 @@ void TrackInfo::MinimizeSyncLockDrawFunction
|
||||
}
|
||||
|
||||
void TrackInfo::MidiControlsDrawFunction
|
||||
( wxDC *dc, const wxRect &rect, const Track *pTrack, int, bool )
|
||||
( TrackPanelDrawingContext &context,
|
||||
const wxRect &rect, const Track *pTrack )
|
||||
{
|
||||
#ifdef EXPERIMENTAL_MIDI_OUT
|
||||
auto &dc = context.dc;
|
||||
wxRect midiRect = rect;
|
||||
GetMidiControlsHorizontalBounds(rect, midiRect);
|
||||
NoteTrack::DrawLabelControls
|
||||
( static_cast<const NoteTrack *>(pTrack), *dc, midiRect );
|
||||
( static_cast<const NoteTrack *>(pTrack), dc, midiRect );
|
||||
#endif // EXPERIMENTAL_MIDI_OUT
|
||||
}
|
||||
|
||||
@@ -2062,35 +2079,50 @@ void TrackInfo::SliderDrawFunction
|
||||
Selector( sliderRect, wt, captured, nullptr )->OnPaint(*dc, false);
|
||||
}
|
||||
|
||||
#include "tracks/playabletrack/wavetrack/ui/WaveTrackSliderHandles.h"
|
||||
void TrackInfo::PanSliderDrawFunction
|
||||
( wxDC *dc, const wxRect &rect, const Track *pTrack, int, bool captured )
|
||||
( TrackPanelDrawingContext &context,
|
||||
const wxRect &rect, const Track *pTrack )
|
||||
{
|
||||
auto target = dynamic_cast<PanSliderHandle*>( context.target.get() );
|
||||
auto dc = &context.dc;
|
||||
bool hit = target && target->GetTrack().get() == pTrack;
|
||||
bool captured = hit && target->IsClicked();
|
||||
SliderDrawFunction<WaveTrack>
|
||||
( &TrackInfo::PanSlider, dc, rect, pTrack, captured);
|
||||
}
|
||||
|
||||
void TrackInfo::GainSliderDrawFunction
|
||||
( wxDC *dc, const wxRect &rect, const Track *pTrack, int, bool captured )
|
||||
( TrackPanelDrawingContext &context,
|
||||
const wxRect &rect, const Track *pTrack )
|
||||
{
|
||||
auto target = dynamic_cast<GainSliderHandle*>( context.target.get() );
|
||||
auto dc = &context.dc;
|
||||
bool hit = target && target->GetTrack().get() == pTrack;
|
||||
bool captured = hit && target->IsClicked();
|
||||
SliderDrawFunction<WaveTrack>
|
||||
( &TrackInfo::GainSlider, dc, rect, pTrack, captured);
|
||||
}
|
||||
|
||||
#ifdef EXPERIMENTAL_MIDI_OUT
|
||||
#include "tracks/playabletrack/notetrack/ui/NoteTrackSliderHandles.h"
|
||||
void TrackInfo::VelocitySliderDrawFunction
|
||||
( wxDC *dc, const wxRect &rect, const Track *pTrack, int, bool captured )
|
||||
( TrackPanelDrawingContext &context,
|
||||
const wxRect &rect, const Track *pTrack )
|
||||
{
|
||||
auto dc = &context.dc;
|
||||
auto target = dynamic_cast<VelocitySliderHandle*>( context.target.get() );
|
||||
bool hit = target && target->GetTrack().get() == pTrack;
|
||||
bool captured = hit && target->IsClicked();
|
||||
SliderDrawFunction<NoteTrack>
|
||||
( &TrackInfo::VelocitySlider, dc, rect, pTrack, captured);
|
||||
}
|
||||
#endif
|
||||
|
||||
void TrackInfo::MuteOrSoloDrawFunction
|
||||
( wxDC *dc, const wxRect &bev, const Track *pTrack, int pressed, bool captured,
|
||||
( wxDC *dc, const wxRect &bev, const Track *pTrack, bool down, bool captured,
|
||||
bool solo )
|
||||
{
|
||||
bool down = captured &&
|
||||
(pressed == ( solo ? TrackPanel::IsSoloing : TrackPanel::IsMuting ));
|
||||
//bev.Inflate(-1, -1);
|
||||
bool selected = pTrack ? pTrack->GetSelected() : true;
|
||||
auto pt = dynamic_cast<const PlayableTrack *>(pTrack);
|
||||
@@ -2137,25 +2169,40 @@ void TrackInfo::MuteOrSoloDrawFunction
|
||||
dc->DrawText(str, bev.x + (bev.width - textWidth) / 2, bev.y + (bev.height - textHeight) / 2);
|
||||
}
|
||||
|
||||
#include "tracks/playabletrack/ui/PlayableTrackButtonHandles.h"
|
||||
void TrackInfo::WideMuteDrawFunction
|
||||
( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, bool captured )
|
||||
( TrackPanelDrawingContext &context,
|
||||
const wxRect &rect, const Track *pTrack )
|
||||
{
|
||||
auto dc = &context.dc;
|
||||
wxRect bev = rect;
|
||||
GetWideMuteSoloHorizontalBounds( rect, bev );
|
||||
MuteOrSoloDrawFunction( dc, bev, pTrack, pressed, captured, false );
|
||||
auto target = dynamic_cast<MuteButtonHandle*>( context.target.get() );
|
||||
bool hit = target && target->GetTrack().get() == pTrack;
|
||||
bool captured = hit && target->IsClicked();
|
||||
bool down = captured && bev.Contains( context.lastState.GetPosition());
|
||||
MuteOrSoloDrawFunction( dc, bev, pTrack, down, captured, false );
|
||||
}
|
||||
|
||||
void TrackInfo::WideSoloDrawFunction
|
||||
( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, bool captured )
|
||||
( TrackPanelDrawingContext &context,
|
||||
const wxRect &rect, const Track *pTrack )
|
||||
{
|
||||
auto dc = &context.dc;
|
||||
wxRect bev = rect;
|
||||
GetWideMuteSoloHorizontalBounds( rect, bev );
|
||||
MuteOrSoloDrawFunction( dc, bev, pTrack, pressed, captured, true );
|
||||
auto target = dynamic_cast<SoloButtonHandle*>( context.target.get() );
|
||||
bool hit = target && target->GetTrack().get() == pTrack;
|
||||
bool captured = hit && target->IsClicked();
|
||||
bool down = captured && bev.Contains( context.lastState.GetPosition());
|
||||
MuteOrSoloDrawFunction( dc, bev, pTrack, down, captured, true );
|
||||
}
|
||||
|
||||
void TrackInfo::MuteAndSoloDrawFunction
|
||||
( wxDC *dc, const wxRect &rect, const Track *pTrack, int pressed, bool captured )
|
||||
( TrackPanelDrawingContext &context,
|
||||
const wxRect &rect, const Track *pTrack )
|
||||
{
|
||||
auto dc = &context.dc;
|
||||
bool bHasSoloButton = TrackPanel::HasSoloButton();
|
||||
|
||||
wxRect bev = rect;
|
||||
@@ -2163,13 +2210,25 @@ void TrackInfo::MuteAndSoloDrawFunction
|
||||
GetNarrowMuteHorizontalBounds( rect, bev );
|
||||
else
|
||||
GetWideMuteSoloHorizontalBounds( rect, bev );
|
||||
MuteOrSoloDrawFunction( dc, bev, pTrack, pressed, captured, false );
|
||||
{
|
||||
auto target = dynamic_cast<MuteButtonHandle*>( context.target.get() );
|
||||
bool hit = target && target->GetTrack().get() == pTrack;
|
||||
bool captured = hit && target->IsClicked();
|
||||
bool down = captured && bev.Contains( context.lastState.GetPosition());
|
||||
MuteOrSoloDrawFunction( dc, bev, pTrack, down, captured, false );
|
||||
}
|
||||
|
||||
if( !bHasSoloButton )
|
||||
return;
|
||||
|
||||
GetNarrowSoloHorizontalBounds( rect, bev );
|
||||
MuteOrSoloDrawFunction( dc, bev, pTrack, pressed, captured, true );
|
||||
{
|
||||
auto target = dynamic_cast<SoloButtonHandle*>( context.target.get() );
|
||||
bool hit = target && target->GetTrack().get() == pTrack;
|
||||
bool captured = hit && target->IsClicked();
|
||||
bool down = captured && bev.Contains( context.lastState.GetPosition());
|
||||
MuteOrSoloDrawFunction( dc, bev, pTrack, down, captured, true );
|
||||
}
|
||||
}
|
||||
|
||||
void TrackInfo::StatusDrawFunction
|
||||
@@ -2180,8 +2239,10 @@ void TrackInfo::StatusDrawFunction
|
||||
}
|
||||
|
||||
void TrackInfo::Status1DrawFunction
|
||||
( wxDC *dc, const wxRect &rect, const Track *pTrack, int, bool )
|
||||
( TrackPanelDrawingContext &context,
|
||||
const wxRect &rect, const Track *pTrack )
|
||||
{
|
||||
auto dc = &context.dc;
|
||||
auto wt = static_cast<const WaveTrack*>(pTrack);
|
||||
|
||||
/// Returns the string to be displayed in the track label
|
||||
@@ -2208,8 +2269,10 @@ void TrackInfo::Status1DrawFunction
|
||||
}
|
||||
|
||||
void TrackInfo::Status2DrawFunction
|
||||
( wxDC *dc, const wxRect &rect, const Track *pTrack, int, bool )
|
||||
( TrackPanelDrawingContext &context,
|
||||
const wxRect &rect, const Track *pTrack )
|
||||
{
|
||||
auto dc = &context.dc;
|
||||
auto wt = static_cast<const WaveTrack*>(pTrack);
|
||||
auto format = wt ? wt->GetSampleFormat() : floatSample;
|
||||
auto s = GetSampleFormatStr(format);
|
||||
@@ -2256,16 +2319,8 @@ void TrackPanel::DrawOutside(Track * t, wxDC * dc, const wxRect & rec)
|
||||
rect.y += kTopMargin;
|
||||
rect.height -= (kBottomMargin + kTopMargin);
|
||||
|
||||
// Need to know which button, if any, to draw as pressed.
|
||||
const MouseCaptureEnum mouseCapture =
|
||||
// This public global variable is a hack for now, which should go away
|
||||
// when TrackPanelCell gets a virtual function into which we move this
|
||||
// drawing code.
|
||||
MouseCaptureEnum(TrackControls::gCaptureState);
|
||||
auto pClickedTrack = GetTracks()->Lock(mpClickedTrack);
|
||||
const bool captured = (t == pClickedTrack.get());
|
||||
|
||||
TrackInfo::DrawItems( dc, rect, *t, mouseCapture, captured );
|
||||
TrackPanelDrawingContext context{ *dc, Target(), mLastMouseState };
|
||||
TrackInfo::DrawItems( context, rect, *t );
|
||||
|
||||
//mTrackInfo.DrawBordersWithin( dc, rect, *t );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user