diff --git a/server/TracyTimelineController.cpp b/server/TracyTimelineController.cpp index e7efe3f3..f0e0b648 100644 --- a/server/TracyTimelineController.cpp +++ b/server/TracyTimelineController.cpp @@ -24,17 +24,20 @@ void TimelineController::Begin() m_items.clear(); } -void TimelineController::End( double pxns, int offset, const ImVec2& wpos, bool hover, float yMin, float yMax ) +void TimelineController::End( double pxns, const ImVec2& wpos, bool hover, float yMin, float yMax ) { + int yOffset = 0; + for( auto& item : m_items ) { - item->Draw( m_firstFrame, pxns, offset, wpos, hover, yMin, yMax ); + item->Draw( m_firstFrame, pxns, yOffset, wpos, hover, yMin, yMax ); + yOffset += item->GetNextFrameHeight(); } const auto scrollPos = ImGui::GetScrollY(); - if( ( scrollPos == 0 && m_scroll != 0 ) || offset > m_height ) + if( ( scrollPos == 0 && m_scroll != 0 ) || yOffset > m_height ) { - m_height = offset; + m_height = yOffset; } m_scroll = scrollPos; } diff --git a/server/TracyTimelineController.hpp b/server/TracyTimelineController.hpp index 1d8e4f37..eb9e0af6 100644 --- a/server/TracyTimelineController.hpp +++ b/server/TracyTimelineController.hpp @@ -18,7 +18,7 @@ public: void FirstFrameExpired(); void Begin(); - void End( double pxns, int offset, const ImVec2& wpos, bool hover, float yMin, float yMax ); + void End( double pxns, const ImVec2& wpos, bool hover, float yMin, float yMax ); template void AddItem( U* data ) diff --git a/server/TracyTimelineItem.cpp b/server/TracyTimelineItem.cpp index 747be77b..54ac5ff6 100644 --- a/server/TracyTimelineItem.cpp +++ b/server/TracyTimelineItem.cpp @@ -17,11 +17,14 @@ TimelineItem::TimelineItem( View& view, Worker& worker ) { } -void TimelineItem::Draw( bool firstFrame, double pxns, int& offset, const ImVec2& wpos, bool hover, float yMin, float yMax ) +void TimelineItem::Draw( bool firstFrame, double pxns, int yOffset, const ImVec2& wpos, bool hover, float yMin, float yMax ) { + const auto yBegin = yOffset; + auto yEnd = yOffset; + if( !IsVisible() ) { - if( m_height != 0 ) AdjustThreadHeight( firstFrame, offset, offset ); + if( m_height != 0 ) AdjustThreadHeight( firstFrame, yBegin, yEnd ); return; } if( IsEmpty() ) return; @@ -29,32 +32,31 @@ void TimelineItem::Draw( bool firstFrame, double pxns, int& offset, const ImVec2 const auto w = ImGui::GetContentRegionAvail().x - 1; const auto ty = ImGui::GetTextLineHeight(); const auto ostep = ty + 1; - const auto yPos = wpos.y + offset; + const auto yPos = wpos.y + yBegin; const auto dpos = wpos + ImVec2( 0.5f, 0.5f ); - const auto oldOffset = offset; auto draw = ImGui::GetWindowDrawList(); ImGui::PushID( this ); - ImGui::PushClipRect( wpos + ImVec2( 0, offset ), wpos + ImVec2( w, offset + m_height ), true ); + ImGui::PushClipRect( wpos + ImVec2( 0, yBegin ), wpos + ImVec2( w, yBegin + m_height ), true ); - offset += ostep; + yEnd += ostep; if( m_showFull ) { - if( !DrawContents( pxns, offset, wpos, hover, yMin, yMax ) && !m_view.GetViewData().drawEmptyLabels ) + if( !DrawContents( pxns, yEnd, wpos, hover, yMin, yMax ) && !m_view.GetViewData().drawEmptyLabels ) { - offset = oldOffset; - AdjustThreadHeight( firstFrame, oldOffset, offset ); + yEnd = yBegin; + AdjustThreadHeight( firstFrame, yBegin, yEnd ); ImGui::PopClipRect(); ImGui::PopID(); return; } } - DrawOverlay( wpos + ImVec2( 0, oldOffset ), wpos + ImVec2( w, offset ) ); + DrawOverlay( wpos + ImVec2( 0, yBegin ), wpos + ImVec2( w, yEnd ) ); ImGui::PopClipRect(); float labelWidth; - const auto hdrOffset = oldOffset; + const auto hdrOffset = yBegin; const bool drawHeader = yPos + ty >= yMin && yPos <= yMax; if( drawHeader ) { @@ -112,39 +114,38 @@ void TimelineItem::Draw( bool firstFrame, double pxns, int& offset, const ImVec2 ImGui::EndPopup(); } - offset += 0.2f * ostep; - AdjustThreadHeight( firstFrame, oldOffset, offset ); + yEnd += 0.2f * ostep; + AdjustThreadHeight( firstFrame, yBegin, yEnd ); ImGui::PopID(); } -void TimelineItem::AdjustThreadHeight( bool firstFrame, int oldOffset, int& offset ) +void TimelineItem::AdjustThreadHeight( bool firstFrame, int yBegin, int yEnd ) { const auto speed = 4.0; const auto baseMove = 1.0; - const auto h = offset - oldOffset; + const auto newHeight = yEnd - yBegin; if( firstFrame ) { - m_height = h; + m_height = newHeight; } - else if( m_height != h ) + else if( m_height != newHeight ) { - const auto diff = h - m_height; + const auto diff = newHeight - m_height; const auto preClampMove = diff * speed * ImGui::GetIO().DeltaTime; if( diff > 0 ) { const auto move = preClampMove + baseMove; - m_height = int( std::min( m_height + move, h ) ); + m_height = int( std::min( m_height + move, newHeight ) ); } else { const auto move = preClampMove - baseMove; - m_height = int( std::max( m_height + move, h ) ); + m_height = int( std::max( m_height + move, newHeight ) ); } s_wasActive = true; } - offset = oldOffset + m_height; } void TimelineItem::VisibilityCheckbox() diff --git a/server/TracyTimelineItem.hpp b/server/TracyTimelineItem.hpp index 54e154aa..78a2725c 100644 --- a/server/TracyTimelineItem.hpp +++ b/server/TracyTimelineItem.hpp @@ -17,7 +17,8 @@ public: TimelineItem( View& view, Worker& worker ); virtual ~TimelineItem() = default; - void Draw( bool firstFrame, double pxns, int& offset, const ImVec2& wpos, bool hover, float yMin, float yMax ); + // draws the timeilne item and also updates the next frame height value + void Draw( bool firstFrame, double pxns, int yOffset, const ImVec2& wpos, bool hover, float yMin, float yMax ); void VisibilityCheckbox(); virtual void SetVisible( bool visible ) { m_visible = visible; } @@ -25,6 +26,9 @@ public: void SetShowFull( bool showFull ) { m_showFull = showFull; } + // returns 0 instead of the correct value for the first frame + int GetNextFrameHeight() const { return m_height; } + protected: virtual uint32_t HeaderColor() const = 0; virtual uint32_t HeaderColorInactive() const = 0; @@ -46,7 +50,7 @@ protected: bool m_showFull; private: - void AdjustThreadHeight( bool firstFrame, int oldOffset, int& offset ); + void AdjustThreadHeight( bool firstFrame, int yBegin, int yEnd ); int m_height; diff --git a/server/TracyView_Timeline.cpp b/server/TracyView_Timeline.cpp index 406a945b..cc656955 100644 --- a/server/TracyView_Timeline.cpp +++ b/server/TracyView_Timeline.cpp @@ -341,7 +341,6 @@ void View::DrawTimeline() draw = ImGui::GetWindowDrawList(); const auto ty = ImGui::GetTextLineHeight(); - int offset = 0; const auto to = 9.f; const auto th = ( ty - to ) * sqrt( 3 ) * 0.5; @@ -381,7 +380,7 @@ void View::DrawTimeline() } } - m_tc.End( pxns, offset, wpos, hover, yMin, yMax ); + m_tc.End( pxns, wpos, hover, yMin, yMax ); ImGui::EndChild(); m_lockHighlight = m_nextLockHighlight;