Kaydet (Commit) 4866b20e authored tarafından Jan Holesovsky's avatar Jan Holesovsky

Slidesorter: Show the buttons on the opposite side...

...compared to where the mouse entered the slide thumbnail.  This
seems to prevent a user annoyance when you very often used to hide
the slide, instead of just selecting it.
üst ebd3d9c7
...@@ -226,13 +226,15 @@ public: ...@@ -226,13 +226,15 @@ public:
const bool bAnimate = true); const bool bAnimate = true);
void SetPageUnderMouse ( void SetPageUnderMouse (
const model::SharedPageDescriptor& rpDescriptor, const model::SharedPageDescriptor& rpDescriptor,
const bool bAnimate = true); const bool bAnimate = true,
const Point& rMousePosition = Point());
bool SetState ( bool SetState (
const model::SharedPageDescriptor& rpDescriptor, const model::SharedPageDescriptor& rpDescriptor,
const model::PageDescriptor::State eState, const model::PageDescriptor::State eState,
const bool bStateValue, const bool bStateValue,
const bool bAnimate = true); const bool bAnimate = true,
const Point& rMousePosition = Point());
void UpdateOrientation (void); void UpdateOrientation (void);
......
...@@ -69,6 +69,11 @@ public: ...@@ -69,6 +69,11 @@ public:
const Point aMouseModelLocation, const Point aMouseModelLocation,
const bool bIsMouseButtonDown); const bool bIsMouseButtonDown);
/// Decide whether the button should be drawn at the top, or the bottom.
void UpdateButtonPosition(
const model::SharedPageDescriptor& rpDescriptor,
const Point& rMousePosition);
void ResetPage (void); void ResetPage (void);
bool IsMouseOverBar (void) const; bool IsMouseOverBar (void) const;
......
...@@ -958,7 +958,7 @@ void SlideSorterView::UpdatePageUnderMouse ( ...@@ -958,7 +958,7 @@ void SlideSorterView::UpdatePageUnderMouse (
const bool bAnimate) const bool bAnimate)
{ {
// Update the page under the mouse. // Update the page under the mouse.
SetPageUnderMouse(rpDescriptor, bAnimate); SetPageUnderMouse(rpDescriptor, bAnimate, rMousePosition);
// Tell the button bar about the new mouse position. // Tell the button bar about the new mouse position.
SharedSdWindow pWindow (mrSlideSorter.GetContentWindow()); SharedSdWindow pWindow (mrSlideSorter.GetContentWindow());
...@@ -986,7 +986,8 @@ void SlideSorterView::UpdatePageUnderMouse ( ...@@ -986,7 +986,8 @@ void SlideSorterView::UpdatePageUnderMouse (
void SlideSorterView::SetPageUnderMouse ( void SlideSorterView::SetPageUnderMouse (
const model::SharedPageDescriptor& rpDescriptor, const model::SharedPageDescriptor& rpDescriptor,
const bool bAnimate) const bool bAnimate,
const Point& rMousePosition)
{ {
if (mpPageUnderMouse != rpDescriptor) if (mpPageUnderMouse != rpDescriptor)
{ {
...@@ -996,7 +997,7 @@ void SlideSorterView::SetPageUnderMouse ( ...@@ -996,7 +997,7 @@ void SlideSorterView::SetPageUnderMouse (
mpPageUnderMouse = rpDescriptor; mpPageUnderMouse = rpDescriptor;
if (mpPageUnderMouse) if (mpPageUnderMouse)
SetState(mpPageUnderMouse, PageDescriptor::ST_MouseOver, true, bAnimate); SetState(mpPageUnderMouse, PageDescriptor::ST_MouseOver, true, bAnimate, rMousePosition);
// Change the quick help text to display the name of the page under // Change the quick help text to display the name of the page under
// the mouse. // the mouse.
...@@ -1011,7 +1012,8 @@ bool SlideSorterView::SetState ( ...@@ -1011,7 +1012,8 @@ bool SlideSorterView::SetState (
const model::SharedPageDescriptor& rpDescriptor, const model::SharedPageDescriptor& rpDescriptor,
const PageDescriptor::State eState, const PageDescriptor::State eState,
const bool bStateValue, const bool bStateValue,
const bool bAnimate) const bool bAnimate,
const Point& rMousePosition)
{ {
model::SharedPageDescriptor pDescriptor (rpDescriptor); model::SharedPageDescriptor pDescriptor (rpDescriptor);
if ( ! pDescriptor) if ( ! pDescriptor)
...@@ -1039,7 +1041,11 @@ bool SlideSorterView::SetState ( ...@@ -1039,7 +1041,11 @@ bool SlideSorterView::SetState (
if (eState == PageDescriptor::ST_MouseOver) if (eState == PageDescriptor::ST_MouseOver)
{ {
if (bStateValue) if (bStateValue)
{
if (bAnimate)
GetButtonBar().UpdateButtonPosition(rpDescriptor, rMousePosition);
GetButtonBar().RequestFadeIn(rpDescriptor, bAnimate); GetButtonBar().RequestFadeIn(rpDescriptor, bAnimate);
}
else else
GetButtonBar().RequestFadeOut(rpDescriptor, bAnimate); GetButtonBar().RequestFadeOut(rpDescriptor, bAnimate);
} }
......
...@@ -67,20 +67,26 @@ namespace sd { namespace slidesorter { namespace view { ...@@ -67,20 +67,26 @@ namespace sd { namespace slidesorter { namespace view {
*/ */
class ButtonBar::BackgroundTheme class ButtonBar::BackgroundTheme
{ {
public:
enum ButtonPosition { TOP, BOTTOM };
public: public:
BackgroundTheme( BackgroundTheme(
const ::boost::shared_ptr<Theme>& rpTheme, const ::boost::shared_ptr<Theme>& rpTheme,
const ::std::vector<SharedButton>& rButtons); const ::std::vector<SharedButton>& rButtons);
virtual ~BackgroundTheme() { } ~BackgroundTheme() { }
/** Set the preview bounding box, the maximal area in which to display /** Set the preview bounding box, the maximal area in which to display
buttons. A call to this method triggers a call to Layout(). buttons. A call to this method triggers a call to Layout().
*/ */
void SetPreviewBoundingBox (const Rectangle& rPreviewBoundingBox); void SetPreviewBoundingBox (const Rectangle& rPreviewBoundingBox);
Button::IconSize GetIconSize (void) const; Button::IconSize GetIconSize (void) const;
virtual BitmapEx CreateBackground () const; BitmapEx CreateBackground () const;
virtual Point GetBackgroundLocation (void); Point GetBackgroundLocation (void);
virtual Rectangle GetButtonArea (void); Rectangle GetButtonArea (void);
void SetButtonPosition( ButtonPosition ePosition ) { mePosition = ePosition; }
/// Compute the positions & sizes.
void Layout (void);
protected: protected:
::boost::shared_ptr<Theme> mpTheme; ::boost::shared_ptr<Theme> mpTheme;
...@@ -92,7 +98,8 @@ protected: ...@@ -92,7 +98,8 @@ protected:
Rectangle maButtonArea; Rectangle maButtonArea;
Point maBackgroundLocation; Point maBackgroundLocation;
virtual void Layout (void); /// This comes into effect only during Layout(), before it only caches the value.
ButtonPosition mePosition;
private: private:
void UpdateMinimumIconSizes(const ::std::vector<SharedButton>& rButtons); void UpdateMinimumIconSizes(const ::std::vector<SharedButton>& rButtons);
...@@ -275,6 +282,24 @@ void ButtonBar::ProcessMouseMotionEvent ( ...@@ -275,6 +282,24 @@ void ButtonBar::ProcessMouseMotionEvent (
} }
void ButtonBar::UpdateButtonPosition(
const model::SharedPageDescriptor& rpDescriptor,
const Point& rMousePosition)
{
if (rpDescriptor && mpBackgroundTheme)
{
Rectangle aRectangle( rpDescriptor->GetBoundingBox() );
aRectangle.Bottom() -= aRectangle.GetHeight() / 2;
if (aRectangle.IsInside(rMousePosition))
mpBackgroundTheme->SetButtonPosition(ButtonBar::BackgroundTheme::BOTTOM);
else
mpBackgroundTheme->SetButtonPosition(ButtonBar::BackgroundTheme::TOP);
// Relayout, to propagate the newest location of the buttons
LayoutButtons();
}
}
void ButtonBar::ResetPage (void) void ButtonBar::ResetPage (void)
...@@ -503,6 +528,7 @@ bool ButtonBar::LayoutButtons (void) ...@@ -503,6 +528,7 @@ bool ButtonBar::LayoutButtons (void)
nMaximumHeight += 2*nBorder; nMaximumHeight += 2*nBorder;
// Set up the bounding box of the button bar. // Set up the bounding box of the button bar.
mpBackgroundTheme->Layout();
maButtonBoundingBox = mpBackgroundTheme->GetButtonArea(); maButtonBoundingBox = mpBackgroundTheme->GetButtonArea();
maBackgroundLocation = mpBackgroundTheme->GetBackgroundLocation(); maBackgroundLocation = mpBackgroundTheme->GetBackgroundLocation();
if (mrSlideSorter.GetTheme()->GetIntegerValue(Theme::Integer_ButtonPaintType) == 1) if (mrSlideSorter.GetTheme()->GetIntegerValue(Theme::Integer_ButtonPaintType) == 1)
...@@ -710,7 +736,8 @@ ButtonBar::BackgroundTheme::BackgroundTheme ( ...@@ -710,7 +736,8 @@ ButtonBar::BackgroundTheme::BackgroundTheme (
const ::std::vector<SharedButton>& rButtons) const ::std::vector<SharedButton>& rButtons)
: mpTheme(rpTheme), : mpTheme(rpTheme),
maButtonArea(), maButtonArea(),
maBackgroundLocation() maBackgroundLocation(),
mePosition( BOTTOM )
{ {
UpdateMinimumIconSizes(rButtons); UpdateMinimumIconSizes(rButtons);
} }
...@@ -833,9 +860,9 @@ void ButtonBar::BackgroundTheme::Layout (void) ...@@ -833,9 +860,9 @@ void ButtonBar::BackgroundTheme::Layout (void)
} }
maBackgroundLocation = Point( maBackgroundLocation = Point(
maPreviewBoundingBox.Left() maPreviewBoundingBox.Left() + (maPreviewBoundingBox.GetWidth()-aImageSize.Width())/2,
+ (maPreviewBoundingBox.GetWidth()-aImageSize.Width())/2, mePosition == TOP? maPreviewBoundingBox.Top():
maPreviewBoundingBox.Bottom() - aImageSize.Height()); maPreviewBoundingBox.Bottom() - aImageSize.Height());
maButtonArea = Rectangle(maBackgroundLocation, aImageSize); maButtonArea = Rectangle(maBackgroundLocation, aImageSize);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment