From 956670089702cab586ca0f916a31778bf620880a Mon Sep 17 00:00:00 2001 From: Janus Date: Sun, 2 Dec 2012 12:55:06 +0000 Subject: [PATCH] Fix7734. Avoid race conditions in ToolBar animation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Axel Dörfler --- src/apps/showimage/ShowImageWindow.cpp | 15 +++++++-------- src/apps/showimage/ShowImageWindow.h | 1 + 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/apps/showimage/ShowImageWindow.cpp b/src/apps/showimage/ShowImageWindow.cpp index 85d4f3cba3..8464ed20d7 100644 --- a/src/apps/showimage/ShowImageWindow.cpp +++ b/src/apps/showimage/ShowImageWindow.cpp @@ -210,6 +210,8 @@ ShowImageWindow::ShowImageWindow(BRect frame, const entry_ref& ref, else fToolBarView->Hide(); + fToolBarVisible = fShowToolBar; + viewFrame.bottom = contentView->Bounds().bottom; viewFrame.bottom -= B_H_SCROLL_BAR_HEIGHT; @@ -1051,12 +1053,9 @@ ShowImageWindow::MessageReceived(BMessage* message) if (message->FindFloat("offset", &offset) == B_OK && message->FindBool("show", &show) == B_OK) { // Compensate rounding errors with the final placement - if (show) - fToolBarView->MoveTo(fToolBarView->Frame().left, 0); - else { - fToolBarView->MoveTo(fToolBarView->Frame().left, offset); + fToolBarView->MoveTo(fToolBarView->Frame().left, offset); + if (!show) fToolBarView->Hide(); - } BRect frame = fToolBarView->Parent()->Bounds(); frame.top = fToolBarView->Frame().bottom + 1; fScrollView->MoveTo(fScrollView->Frame().left, frame.top); @@ -1519,9 +1518,10 @@ ShowImageWindow::_UpdateRatingMenu() void ShowImageWindow::_SetToolBarVisible(bool visible, bool animate) { - if (visible == !fToolBarView->IsHidden()) + if (visible == fToolBarVisible) return; + fToolBarVisible = visible; float diff = fToolBarView->Bounds().Height() + 2; if (!visible) diff = -diff; @@ -1533,14 +1533,13 @@ ShowImageWindow::_SetToolBarVisible(bool visible, bool animate) // not to block the window thread. const float kAnimationOffsets[] = { 0.05, 0.2, 0.5, 0.2, 0.05 }; const int32 steps = sizeof(kAnimationOffsets) / sizeof(float); - float originalY = fToolBarView->Frame().top; for (int32 i = 0; i < steps; i++) { BMessage message(kMsgSlideToolBar); message.AddFloat("offset", floorf(diff * kAnimationOffsets[i])); PostMessage(&message, this); } BMessage finalMessage(kMsgFinishSlidingToolBar); - finalMessage.AddFloat("offset", originalY + diff); + finalMessage.AddFloat("offset", visible ? 0 : diff); finalMessage.AddBool("show", visible); PostMessage(&finalMessage, this); } else { diff --git a/src/apps/showimage/ShowImageWindow.h b/src/apps/showimage/ShowImageWindow.h index f5cf499b41..4834739c02 100644 --- a/src/apps/showimage/ShowImageWindow.h +++ b/src/apps/showimage/ShowImageWindow.h @@ -115,6 +115,7 @@ private: BMenu* fSlideShowDelayMenu; BMenu* fRatingMenu; ToolBarView* fToolBarView; + bool fToolBarVisible; BScrollView* fScrollView; BScrollBar* fVerticalScrollBar; ShowImageView* fImageView;