1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-21 23:00:06 +02:00

nonvirtual reimplementation of CellularPanel::FindCell using nodes

This commit is contained in:
Paul Licameli 2018-09-17 12:57:18 -04:00
parent 128ba93ae7
commit cfa7afcb24
6 changed files with 50 additions and 49 deletions

View File

@ -2141,19 +2141,6 @@ std::shared_ptr<TrackPanelNode> AdornedRulerPanel::Root()
return std::make_shared< MainGroup >( *this ); return std::make_shared< MainGroup >( *this );
} }
auto AdornedRulerPanel::FindCell(int mouseX, int mouseY) -> FoundCell
{
bool mayScrub = mProject->GetScrubber().CanScrub() &&
mShowScrubbing;
if (mayScrub && mScrubZone.Contains(mouseX, mouseY))
return { mScrubbingCell, mScrubZone };
if (mInner.Contains(mouseX, mouseY))
return { mQPCell, mInner };
return {};
}
wxRect AdornedRulerPanel::FindRect(const TrackPanelCell &cell) wxRect AdornedRulerPanel::FindRect(const TrackPanelCell &cell)
{ {
if (&cell == mScrubbingCell.get()) if (&cell == mScrubbingCell.get())

View File

@ -177,7 +177,6 @@ private:
// area into cells // area into cells
std::shared_ptr<TrackPanelNode> Root() override; std::shared_ptr<TrackPanelNode> Root() override;
FoundCell FindCell(int mouseX, int mouseY) override;
wxRect FindRect(const TrackPanelCell &cell) override; wxRect FindRect(const TrackPanelCell &cell) override;
public: public:
AudacityProject * GetProject() const override; AudacityProject * GetProject() const override;

View File

@ -937,7 +937,6 @@ namespace {
const auto end = children.end(); const auto end = children.end();
const auto nextCoord = ((next == end) ? upperBound : next->first - 1); const auto nextCoord = ((next == end) ? upperBound : next->first - 1);
// Some defense against bad overrides of TrackPanelGroup::Children
auto lesser = std::max(lowerBound, std::min(upperBound, iter->first)); auto lesser = std::max(lowerBound, std::min(upperBound, iter->first));
auto greater = std::max(lesser, std::min(upperBound, nextCoord)); auto greater = std::max(lesser, std::min(upperBound, nextCoord));
@ -976,6 +975,45 @@ void CellularPanel::Visit(
return; return;
} }
auto CellularPanel::FindCell(int mouseX, int mouseY) -> FoundCell
{
auto rect = this->GetClientRect();
auto node = Root();
while (node) {
if ( auto pCell = std::dynamic_pointer_cast< TrackPanelCell >( node ) )
// Found the bottom of the hierarchy
return { pCell, rect };
else if ( auto pGroup = dynamic_cast< TrackPanelGroup* >( node.get() ) ) {
// Ask node for its subdivision
const auto results = pGroup->Children( rect );
const bool divideX = results.first == TrackPanelGroup::Axis::X;
const auto &children = results.second;
// Find the correct child
const auto begin = children.begin(), end = children.end();
auto iter = std::upper_bound( begin, end,
(divideX ? mouseX : mouseY),
[&]( wxCoord coord, const TrackPanelGroup::Child &child ) {
return coord < child.first;
}
);
if (iter == begin)
break;
--iter;
// Descend the hierarchy of nodes
rect = Subdivide(rect, divideX, children, iter);
node = iter->second;
}
else
// Nulls in the array of children are allowed, to define a void with
// no cell
break;
}
return { {}, {} };
}
UIHandlePtr CellularPanel::Target() UIHandlePtr CellularPanel::Target()
{ {
auto &state = *mState; auto &state = *mState;

View File

@ -44,17 +44,10 @@ public:
virtual AudacityProject *GetProject() const = 0; virtual AudacityProject *GetProject() const = 0;
// Find track info by coordinate
struct FoundCell {
std::shared_ptr<TrackPanelCell> pCell;
wxRect rect;
};
// Get the root object defining a recursive subdivision of the panel's // Get the root object defining a recursive subdivision of the panel's
// area into cells // area into cells
virtual std::shared_ptr<TrackPanelNode> Root() = 0; virtual std::shared_ptr<TrackPanelNode> Root() = 0;
virtual FoundCell FindCell(int mouseX, int mouseY) = 0;
virtual wxRect FindRect(const TrackPanelCell &cell) = 0; virtual wxRect FindRect(const TrackPanelCell &cell) = 0;
// Structure and functions for generalized visitation of the subdivision // Structure and functions for generalized visitation of the subdivision
@ -93,6 +86,14 @@ public:
virtual bool TakesFocus() const = 0; virtual bool TakesFocus() const = 0;
public: public:
// Find cell by coordinate
struct FoundCell {
std::shared_ptr< TrackPanelCell > pCell;
wxRect rect;
};
FoundCell FindCell(int mouseX, int mouseY);
UIHandlePtr Target(); UIHandlePtr Target();
std::shared_ptr<TrackPanelCell> LastCell() const; std::shared_ptr<TrackPanelCell> LastCell() const;

View File

@ -126,13 +126,13 @@ time, but that width may be adjusted when tracks change their vertical scales.
GetLabelWidth() counts columns up to and including the VRuler. GetLabelWidth() counts columns up to and including the VRuler.
GetLeftOffset() is yet one more -- it counts the "one pixel" column. GetLeftOffset() is yet one more -- it counts the "one pixel" column.
FindCell() for label returns a rectangle that OMITS left, top, and bottom Cell for label has a rectangle that OMITS left, top, and bottom
margins margins
FindCell() for vruler returns a rectangle right of the label, Cell for vruler has a rectangle right of the label,
up to and including the One Pixel column, and OMITS top and bottom margins up to and including the One Pixel column, and OMITS top and bottom margins
FindCell() for track returns a rectangle with x == GetLeftOffset(), and OMITS Cell() for track returns a rectangle with x == GetLeftOffset(), and OMITS
right, top, and bottom margins right, top, and bottom margins
+--------------- ... ------ ... --------------------- ... ... -------------+ +--------------- ... ------ ... --------------------- ... ... -------------+
@ -2088,27 +2088,6 @@ std::shared_ptr<TrackPanelNode> TrackPanel::Root()
return std::make_shared< MainGroup >( *this ); return std::make_shared< MainGroup >( *this );
} }
/// Determines which cell is under the mouse
/// @param mouseX - mouse X position.
/// @param mouseY - mouse Y position.
auto TrackPanel::FindCell(int mouseX, int mouseY) -> FoundCell
{
auto range = Cells();
auto &iter = range.first, &end = range.second;
while
( iter != end &&
!(*iter).second.Contains( mouseX, mouseY ) )
++iter;
if (iter == end)
return {};
auto found = *iter;
return {
found.first,
found.second
};
}
wxRect TrackPanel::FindRect( const TrackPanelCell &cell ) wxRect TrackPanel::FindRect( const TrackPanelCell &cell )
{ {
auto range = Cells(); auto range = Cells();

View File

@ -341,9 +341,6 @@ protected:
// area into cells // area into cells
std::shared_ptr<TrackPanelNode> Root() override; std::shared_ptr<TrackPanelNode> Root() override;
// Find track info by coordinate
FoundCell FindCell(int mouseX, int mouseY) override;
// Find rectangle of the given cell // Find rectangle of the given cell
wxRect FindRect(const TrackPanelCell &cell) override; wxRect FindRect(const TrackPanelCell &cell) override;