From b6a2e37719df6055c054ef64c1d15c82d3e3a20f Mon Sep 17 00:00:00 2001
From: Janus <janus2@ymail.com>
Date: Sun, 2 Dec 2012 12:55:06 +0000
Subject: [PATCH] Fix7734. Avoid race conditions in ToolBar animation
---
src/apps/showimage/ShowImageWindow.cpp | 17 ++++++++---------
src/apps/showimage/ShowImageWindow.h | 1 +
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/src/apps/showimage/ShowImageWindow.cpp b/src/apps/showimage/ShowImageWindow.cpp
index b79059e..e871751 100644
a
|
b
|
ShowImageWindow::ShowImageWindow(BRect frame, const entry_ref& ref,
|
209 | 209 | viewFrame.top = fToolBarView->Frame().bottom + 1; |
210 | 210 | else |
211 | 211 | fToolBarView->Hide(); |
| 212 | |
| 213 | fToolBarVisible = fShowToolBar; |
212 | 214 | |
213 | 215 | viewFrame.bottom = contentView->Bounds().bottom; |
214 | 216 | viewFrame.bottom -= B_H_SCROLL_BAR_HEIGHT; |
… |
… |
ShowImageWindow::MessageReceived(BMessage* message)
|
1051 | 1053 | if (message->FindFloat("offset", &offset) == B_OK |
1052 | 1054 | && message->FindBool("show", &show) == B_OK) { |
1053 | 1055 | // Compensate rounding errors with the final placement |
1054 | | if (show) |
1055 | | fToolBarView->MoveTo(fToolBarView->Frame().left, 0); |
1056 | | else { |
1057 | | fToolBarView->MoveTo(fToolBarView->Frame().left, offset); |
| 1056 | fToolBarView->MoveTo(fToolBarView->Frame().left, offset); |
| 1057 | if (!show) |
1058 | 1058 | fToolBarView->Hide(); |
1059 | | } |
1060 | 1059 | BRect frame = fToolBarView->Parent()->Bounds(); |
1061 | 1060 | frame.top = fToolBarView->Frame().bottom + 1; |
1062 | 1061 | fScrollView->MoveTo(fScrollView->Frame().left, frame.top); |
… |
… |
ShowImageWindow::_UpdateRatingMenu()
|
1519 | 1518 | void |
1520 | 1519 | ShowImageWindow::_SetToolBarVisible(bool visible, bool animate) |
1521 | 1520 | { |
1522 | | if (visible == !fToolBarView->IsHidden()) |
| 1521 | if (visible == fToolBarVisible) |
1523 | 1522 | return; |
1524 | | |
| 1523 | |
| 1524 | fToolBarVisible = visible; |
1525 | 1525 | float diff = fToolBarView->Bounds().Height() + 2; |
1526 | 1526 | if (!visible) |
1527 | 1527 | diff = -diff; |
… |
… |
ShowImageWindow::_SetToolBarVisible(bool visible, bool animate)
|
1533 | 1533 | // not to block the window thread. |
1534 | 1534 | const float kAnimationOffsets[] = { 0.05, 0.2, 0.5, 0.2, 0.05 }; |
1535 | 1535 | const int32 steps = sizeof(kAnimationOffsets) / sizeof(float); |
1536 | | float originalY = fToolBarView->Frame().top; |
1537 | 1536 | for (int32 i = 0; i < steps; i++) { |
1538 | 1537 | BMessage message(kMsgSlideToolBar); |
1539 | 1538 | message.AddFloat("offset", floorf(diff * kAnimationOffsets[i])); |
1540 | 1539 | PostMessage(&message, this); |
1541 | 1540 | } |
1542 | 1541 | BMessage finalMessage(kMsgFinishSlidingToolBar); |
1543 | | finalMessage.AddFloat("offset", originalY + diff); |
| 1542 | finalMessage.AddFloat("offset", visible ? 0 : diff); |
1544 | 1543 | finalMessage.AddBool("show", visible); |
1545 | 1544 | PostMessage(&finalMessage, this); |
1546 | 1545 | } else { |
diff --git a/src/apps/showimage/ShowImageWindow.h b/src/apps/showimage/ShowImageWindow.h
index f5cf499..4834739 100644
a
|
b
|
private:
|
115 | 115 | BMenu* fSlideShowDelayMenu; |
116 | 116 | BMenu* fRatingMenu; |
117 | 117 | ToolBarView* fToolBarView; |
| 118 | bool fToolBarVisible; |
118 | 119 | BScrollView* fScrollView; |
119 | 120 | BScrollBar* fVerticalScrollBar; |
120 | 121 | ShowImageView* fImageView; |