diff --git a/server/TracyTimelineController.cpp b/server/TracyTimelineController.cpp index 7cabd444..e7efe3f3 100644 --- a/server/TracyTimelineController.cpp +++ b/server/TracyTimelineController.cpp @@ -32,13 +32,9 @@ void TimelineController::End( double pxns, int offset, const ImVec2& wpos, bool } const auto scrollPos = ImGui::GetScrollY(); - if( scrollPos == 0 && m_scroll != 0 ) + if( ( scrollPos == 0 && m_scroll != 0 ) || offset > m_height ) { - m_height = 0; - } - else - { - if( offset > m_height ) m_height = offset; + m_height = offset; } m_scroll = scrollPos; } diff --git a/server/TracyTimelineItem.cpp b/server/TracyTimelineItem.cpp index ca1d9dc7..747be77b 100644 --- a/server/TracyTimelineItem.cpp +++ b/server/TracyTimelineItem.cpp @@ -12,7 +12,6 @@ TimelineItem::TimelineItem( View& view, Worker& worker ) : m_visible( true ) , m_showFull( true ) , m_height( 0 ) - , m_offset( 0 ) , m_view( view ) , m_worker( worker ) { @@ -22,8 +21,7 @@ void TimelineItem::Draw( bool firstFrame, double pxns, int& offset, const ImVec2 { if( !IsVisible() ) { - m_height = 0; - m_offset = 0; + if( m_height != 0 ) AdjustThreadHeight( firstFrame, offset, offset ); return; } if( IsEmpty() ) return; @@ -31,7 +29,7 @@ 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 = AdjustThreadPosition( wpos.y, offset ); + const auto yPos = wpos.y + offset; const auto dpos = wpos + ImVec2( 0.5f, 0.5f ); const auto oldOffset = offset; auto draw = ImGui::GetWindowDrawList(); @@ -44,9 +42,8 @@ void TimelineItem::Draw( bool firstFrame, double pxns, int& offset, const ImVec2 { if( !DrawContents( pxns, offset, wpos, hover, yMin, yMax ) && !m_view.GetViewData().drawEmptyLabels ) { - m_height = 0; - m_offset = 0; offset = oldOffset; + AdjustThreadHeight( firstFrame, oldOffset, offset ); ImGui::PopClipRect(); ImGui::PopID(); return; @@ -123,44 +120,31 @@ void TimelineItem::Draw( bool firstFrame, double pxns, int& offset, const ImVec2 void TimelineItem::AdjustThreadHeight( bool firstFrame, int oldOffset, int& offset ) { + const auto speed = 4.0; + const auto baseMove = 1.0; + const auto h = offset - oldOffset; - if( m_height > h ) + if( firstFrame ) { m_height = h; - offset = oldOffset + m_height; } - else if( m_height < h ) + else if( m_height != h ) { - if( firstFrame ) + const auto diff = h - m_height; + const auto preClampMove = diff * speed * ImGui::GetIO().DeltaTime; + if( diff > 0 ) { - m_height = h; - offset = oldOffset + h; + const auto move = preClampMove + baseMove; + m_height = int( std::min( m_height + move, h ) ); } else { - const auto diff = h - m_height; - const auto move = std::max( 2.0, diff * 10.0 * ImGui::GetIO().DeltaTime ); - m_height = int( std::min( m_height + move, h ) ); - offset = oldOffset + m_height; - s_wasActive = true; + const auto move = preClampMove - baseMove; + m_height = int( std::max( m_height + move, h ) ); } - } -} - -float TimelineItem::AdjustThreadPosition( float wy, int& offset ) -{ - if( m_offset < offset ) - { - m_offset = offset; - } - else if( m_offset > offset ) - { - const auto diff = m_offset - offset; - const auto move = std::max( 2.0, diff * 10.0 * ImGui::GetIO().DeltaTime ); - offset = m_offset = int( std::max( m_offset - move, offset ) ); s_wasActive = true; } - return offset + wy; + offset = oldOffset + m_height; } void TimelineItem::VisibilityCheckbox() diff --git a/server/TracyTimelineItem.hpp b/server/TracyTimelineItem.hpp index c08d911a..54e154aa 100644 --- a/server/TracyTimelineItem.hpp +++ b/server/TracyTimelineItem.hpp @@ -47,10 +47,8 @@ protected: private: void AdjustThreadHeight( bool firstFrame, int oldOffset, int& offset ); - float AdjustThreadPosition( float wy, int& offset ); int m_height; - int m_offset; protected: View& m_view; diff --git a/server/TracyView_Timeline.cpp b/server/TracyView_Timeline.cpp index d7a3f996..406a945b 100644 --- a/server/TracyView_Timeline.cpp +++ b/server/TracyView_Timeline.cpp @@ -333,6 +333,7 @@ void View::DrawTimeline() const auto wpos = ImGui::GetCursorScreenPos(); const auto dpos = wpos + ImVec2( 0.5f, 0.5f ); + // note that m_tc.GetHeight() returns the height from the previous draw const auto h = std::max( m_tc.GetHeight(), ImGui::GetContentRegionAvail().y - 4 ); // magic border value ImGui::ItemSize( ImVec2( w, h ) );