summaryrefslogtreecommitdiff
path: root/sd
diff options
context:
space:
mode:
authorJan Holesovsky <kendy@suse.cz>2012-02-17 23:32:52 +0100
committerJan Holesovsky <kendy@suse.cz>2012-02-17 23:47:51 +0100
commit4866b20ec6205b04cd21077fd00d68c4d4bb2c1b (patch)
tree8041346f92a408ee627d1e6bf032e3846fc22bf8 /sd
parentebd3d9c77e5c35258d8b49ddd18d9c52b10c6cc3 (diff)
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.
Diffstat (limited to 'sd')
-rw-r--r--sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx6
-rw-r--r--sd/source/ui/slidesorter/inc/view/SlsButtonBar.hxx5
-rw-r--r--sd/source/ui/slidesorter/view/SlideSorterView.cxx14
-rw-r--r--sd/source/ui/slidesorter/view/SlsButtonBar.cxx45
4 files changed, 55 insertions, 15 deletions
diff --git a/sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx b/sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx
index 4229665bc0f5..d65bb9077a74 100644
--- a/sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx
+++ b/sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx
@@ -226,13 +226,15 @@ public:
const bool bAnimate = true);
void SetPageUnderMouse (
const model::SharedPageDescriptor& rpDescriptor,
- const bool bAnimate = true);
+ const bool bAnimate = true,
+ const Point& rMousePosition = Point());
bool SetState (
const model::SharedPageDescriptor& rpDescriptor,
const model::PageDescriptor::State eState,
const bool bStateValue,
- const bool bAnimate = true);
+ const bool bAnimate = true,
+ const Point& rMousePosition = Point());
void UpdateOrientation (void);
diff --git a/sd/source/ui/slidesorter/inc/view/SlsButtonBar.hxx b/sd/source/ui/slidesorter/inc/view/SlsButtonBar.hxx
index 13b49f0e663f..c6faee310cd7 100644
--- a/sd/source/ui/slidesorter/inc/view/SlsButtonBar.hxx
+++ b/sd/source/ui/slidesorter/inc/view/SlsButtonBar.hxx
@@ -69,6 +69,11 @@ public:
const Point aMouseModelLocation,
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);
bool IsMouseOverBar (void) const;
diff --git a/sd/source/ui/slidesorter/view/SlideSorterView.cxx b/sd/source/ui/slidesorter/view/SlideSorterView.cxx
index 4d636772802a..935f191fa0fb 100644
--- a/sd/source/ui/slidesorter/view/SlideSorterView.cxx
+++ b/sd/source/ui/slidesorter/view/SlideSorterView.cxx
@@ -958,7 +958,7 @@ void SlideSorterView::UpdatePageUnderMouse (
const bool bAnimate)
{
// Update the page under the mouse.
- SetPageUnderMouse(rpDescriptor, bAnimate);
+ SetPageUnderMouse(rpDescriptor, bAnimate, rMousePosition);
// Tell the button bar about the new mouse position.
SharedSdWindow pWindow (mrSlideSorter.GetContentWindow());
@@ -986,7 +986,8 @@ void SlideSorterView::UpdatePageUnderMouse (
void SlideSorterView::SetPageUnderMouse (
const model::SharedPageDescriptor& rpDescriptor,
- const bool bAnimate)
+ const bool bAnimate,
+ const Point& rMousePosition)
{
if (mpPageUnderMouse != rpDescriptor)
{
@@ -996,7 +997,7 @@ void SlideSorterView::SetPageUnderMouse (
mpPageUnderMouse = rpDescriptor;
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
// the mouse.
@@ -1011,7 +1012,8 @@ bool SlideSorterView::SetState (
const model::SharedPageDescriptor& rpDescriptor,
const PageDescriptor::State eState,
const bool bStateValue,
- const bool bAnimate)
+ const bool bAnimate,
+ const Point& rMousePosition)
{
model::SharedPageDescriptor pDescriptor (rpDescriptor);
if ( ! pDescriptor)
@@ -1039,7 +1041,11 @@ bool SlideSorterView::SetState (
if (eState == PageDescriptor::ST_MouseOver)
{
if (bStateValue)
+ {
+ if (bAnimate)
+ GetButtonBar().UpdateButtonPosition(rpDescriptor, rMousePosition);
GetButtonBar().RequestFadeIn(rpDescriptor, bAnimate);
+ }
else
GetButtonBar().RequestFadeOut(rpDescriptor, bAnimate);
}
diff --git a/sd/source/ui/slidesorter/view/SlsButtonBar.cxx b/sd/source/ui/slidesorter/view/SlsButtonBar.cxx
index 06a207404862..fc4d05bbccc1 100644
--- a/sd/source/ui/slidesorter/view/SlsButtonBar.cxx
+++ b/sd/source/ui/slidesorter/view/SlsButtonBar.cxx
@@ -68,19 +68,25 @@ namespace sd { namespace slidesorter { namespace view {
class ButtonBar::BackgroundTheme
{
public:
+ enum ButtonPosition { TOP, BOTTOM };
+public:
BackgroundTheme(
const ::boost::shared_ptr<Theme>& rpTheme,
const ::std::vector<SharedButton>& rButtons);
- virtual ~BackgroundTheme() { }
+ ~BackgroundTheme() { }
/** Set the preview bounding box, the maximal area in which to display
buttons. A call to this method triggers a call to Layout().
*/
void SetPreviewBoundingBox (const Rectangle& rPreviewBoundingBox);
Button::IconSize GetIconSize (void) const;
- virtual BitmapEx CreateBackground () const;
- virtual Point GetBackgroundLocation (void);
- virtual Rectangle GetButtonArea (void);
+ BitmapEx CreateBackground () const;
+ Point GetBackgroundLocation (void);
+ Rectangle GetButtonArea (void);
+ void SetButtonPosition( ButtonPosition ePosition ) { mePosition = ePosition; }
+
+ /// Compute the positions & sizes.
+ void Layout (void);
protected:
::boost::shared_ptr<Theme> mpTheme;
@@ -92,7 +98,8 @@ protected:
Rectangle maButtonArea;
Point maBackgroundLocation;
- virtual void Layout (void);
+ /// This comes into effect only during Layout(), before it only caches the value.
+ ButtonPosition mePosition;
private:
void UpdateMinimumIconSizes(const ::std::vector<SharedButton>& rButtons);
@@ -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)
@@ -503,6 +528,7 @@ bool ButtonBar::LayoutButtons (void)
nMaximumHeight += 2*nBorder;
// Set up the bounding box of the button bar.
+ mpBackgroundTheme->Layout();
maButtonBoundingBox = mpBackgroundTheme->GetButtonArea();
maBackgroundLocation = mpBackgroundTheme->GetBackgroundLocation();
if (mrSlideSorter.GetTheme()->GetIntegerValue(Theme::Integer_ButtonPaintType) == 1)
@@ -710,7 +736,8 @@ ButtonBar::BackgroundTheme::BackgroundTheme (
const ::std::vector<SharedButton>& rButtons)
: mpTheme(rpTheme),
maButtonArea(),
- maBackgroundLocation()
+ maBackgroundLocation(),
+ mePosition( BOTTOM )
{
UpdateMinimumIconSizes(rButtons);
}
@@ -833,9 +860,9 @@ void ButtonBar::BackgroundTheme::Layout (void)
}
maBackgroundLocation = Point(
- maPreviewBoundingBox.Left()
- + (maPreviewBoundingBox.GetWidth()-aImageSize.Width())/2,
- maPreviewBoundingBox.Bottom() - aImageSize.Height());
+ maPreviewBoundingBox.Left() + (maPreviewBoundingBox.GetWidth()-aImageSize.Width())/2,
+ mePosition == TOP? maPreviewBoundingBox.Top():
+ maPreviewBoundingBox.Bottom() - aImageSize.Height());
maButtonArea = Rectangle(maBackgroundLocation, aImageSize);
}