* Exposed ValidScrollOffsetFor() as public method.
* Make validating the scroll offset in SetDataRect() optional. * Introduced SetDataRectAndScrollOffset() to set both atomically. This avoids some unwanted feedback when having to set them both anyway, but hook methods are called and re-enter back into the client code. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@41179 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,9 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2006, Haiku.
|
* Copyright 2001-2009, Ingo Weinhold <[email protected]>
|
||||||
* Distributed under the terms of the MIT License.
|
* All rights reserved. Distributed under the terms of the MIT license.
|
||||||
*
|
|
||||||
* Authors:
|
|
||||||
* Ingo Weinhold <[email protected]>
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "Scrollable.h"
|
#include "Scrollable.h"
|
||||||
@@ -13,8 +10,6 @@
|
|||||||
|
|
||||||
#include "Scroller.h"
|
#include "Scroller.h"
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
// constructor
|
// constructor
|
||||||
Scrollable::Scrollable()
|
Scrollable::Scrollable()
|
||||||
: fDataRect(0.0, 0.0, 0.0, 0.0),
|
: fDataRect(0.0, 0.0, 0.0, 0.0),
|
||||||
@@ -67,7 +62,7 @@ Scrollable::ScrollSource() const
|
|||||||
//
|
//
|
||||||
// Sets the data rect.
|
// Sets the data rect.
|
||||||
void
|
void
|
||||||
Scrollable::SetDataRect(BRect dataRect)
|
Scrollable::SetDataRect(BRect dataRect, bool validateScrollOffset)
|
||||||
{
|
{
|
||||||
if (fDataRect != dataRect && dataRect.IsValid()) {
|
if (fDataRect != dataRect && dataRect.IsValid()) {
|
||||||
BRect oldDataRect = fDataRect;
|
BRect oldDataRect = fDataRect;
|
||||||
@@ -78,9 +73,11 @@ Scrollable::SetDataRect(BRect dataRect)
|
|||||||
if (fScrollSource)
|
if (fScrollSource)
|
||||||
fScrollSource->DataRectChanged(oldDataRect, fDataRect);
|
fScrollSource->DataRectChanged(oldDataRect, fDataRect);
|
||||||
// adjust the scroll offset, if necessary
|
// adjust the scroll offset, if necessary
|
||||||
BPoint offset = _ValidScrollOffsetFor(fScrollOffset);
|
if (validateScrollOffset) {
|
||||||
if (offset != fScrollOffset)
|
BPoint offset = ValidScrollOffsetFor(fScrollOffset);
|
||||||
SetScrollOffset(offset);
|
if (offset != fScrollOffset)
|
||||||
|
SetScrollOffset(offset);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +97,7 @@ void
|
|||||||
Scrollable::SetScrollOffset(BPoint offset)
|
Scrollable::SetScrollOffset(BPoint offset)
|
||||||
{
|
{
|
||||||
// adjust the supplied offset to be valid
|
// adjust the supplied offset to be valid
|
||||||
offset = _ValidScrollOffsetFor(offset);
|
offset = ValidScrollOffsetFor(offset);
|
||||||
if (fScrollOffset != offset) {
|
if (fScrollOffset != offset) {
|
||||||
BPoint oldOffset = fScrollOffset;
|
BPoint oldOffset = fScrollOffset;
|
||||||
fScrollOffset = offset;
|
fScrollOffset = offset;
|
||||||
@@ -121,6 +118,62 @@ Scrollable::ScrollOffset() const
|
|||||||
return fScrollOffset;
|
return fScrollOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetDataRect
|
||||||
|
//
|
||||||
|
// Sets the data rect.
|
||||||
|
void
|
||||||
|
Scrollable::SetDataRectAndScrollOffset(BRect dataRect, BPoint offset)
|
||||||
|
{
|
||||||
|
if (fDataRect != dataRect && dataRect.IsValid()) {
|
||||||
|
|
||||||
|
BRect oldDataRect = fDataRect;
|
||||||
|
fDataRect = dataRect;
|
||||||
|
// notify ourselves
|
||||||
|
DataRectChanged(oldDataRect, fDataRect);
|
||||||
|
// notify scroller
|
||||||
|
if (fScrollSource) {
|
||||||
|
fScrollSource->SetScrollingEnabled(false);
|
||||||
|
fScrollSource->DataRectChanged(oldDataRect, fDataRect);
|
||||||
|
}
|
||||||
|
// adjust the scroll offset, if necessary
|
||||||
|
offset = ValidScrollOffsetFor(offset);
|
||||||
|
if (offset != fScrollOffset)
|
||||||
|
SetScrollOffset(offset);
|
||||||
|
|
||||||
|
if (fScrollSource)
|
||||||
|
fScrollSource->SetScrollingEnabled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidScrollOffsetFor
|
||||||
|
//
|
||||||
|
// Returns the valid scroll offset next to the supplied offset.
|
||||||
|
BPoint
|
||||||
|
Scrollable::ValidScrollOffsetFor(BPoint offset) const
|
||||||
|
{
|
||||||
|
return ValidScrollOffsetFor(offset, fDataRect);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidScrollOffsetFor
|
||||||
|
//
|
||||||
|
// Returns the valid scroll offset next to the supplied offset.
|
||||||
|
BPoint
|
||||||
|
Scrollable::ValidScrollOffsetFor(BPoint offset, const BRect& dataRect) const
|
||||||
|
{
|
||||||
|
float maxX = max_c(dataRect.left, dataRect.right - fVisibleWidth);
|
||||||
|
float maxY = max_c(dataRect.top, dataRect.bottom - fVisibleHeight);
|
||||||
|
// adjust the offset to be valid
|
||||||
|
if (offset.x < dataRect.left)
|
||||||
|
offset.x = dataRect.left;
|
||||||
|
else if (offset.x > maxX)
|
||||||
|
offset.x = maxX;
|
||||||
|
if (offset.y < dataRect.top)
|
||||||
|
offset.y = dataRect.top;
|
||||||
|
else if (offset.y > maxY)
|
||||||
|
offset.y = maxY;
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
// SetVisibleSize
|
// SetVisibleSize
|
||||||
//
|
//
|
||||||
// Sets the visible size.
|
// Sets the visible size.
|
||||||
@@ -141,7 +194,7 @@ Scrollable::SetVisibleSize(float width, float height)
|
|||||||
fVisibleWidth, fVisibleHeight);
|
fVisibleWidth, fVisibleHeight);
|
||||||
}
|
}
|
||||||
// adjust the scroll offset, if necessary
|
// adjust the scroll offset, if necessary
|
||||||
BPoint offset = _ValidScrollOffsetFor(fScrollOffset);
|
BPoint offset = ValidScrollOffsetFor(fScrollOffset);
|
||||||
if (offset != fScrollOffset)
|
if (offset != fScrollOffset)
|
||||||
SetScrollOffset(offset);
|
SetScrollOffset(offset);
|
||||||
}
|
}
|
||||||
@@ -207,23 +260,4 @@ Scrollable::ScrollSourceChanged(Scroller* /*oldSource*/,
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
// _ValidScrollOffsetFor
|
|
||||||
//
|
|
||||||
// Returns the valid scroll offset next to the supplied offset.
|
|
||||||
BPoint
|
|
||||||
Scrollable::_ValidScrollOffsetFor(BPoint offset) const
|
|
||||||
{
|
|
||||||
float maxX = max(fDataRect.left, fDataRect.right - fVisibleWidth);
|
|
||||||
float maxY = max(fDataRect.top, fDataRect.bottom - fVisibleHeight);
|
|
||||||
// adjust the offset to be valid
|
|
||||||
if (offset.x < fDataRect.left)
|
|
||||||
offset.x = fDataRect.left;
|
|
||||||
else if (offset.x > maxX)
|
|
||||||
offset.x = maxX;
|
|
||||||
if (offset.y < fDataRect.top)
|
|
||||||
offset.y = fDataRect.top;
|
|
||||||
else if (offset.y > maxY)
|
|
||||||
offset.y = maxY;
|
|
||||||
return offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2006, Haiku.
|
* Copyright 2001-2009, Ingo Weinhold <[email protected]>
|
||||||
* Distributed under the terms of the MIT License.
|
* All rights reserved. Distributed under the terms of the MIT license.
|
||||||
*
|
|
||||||
* Authors:
|
|
||||||
* Ingo Weinhold <[email protected]>
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SCROLLABLE_H
|
#ifndef SCROLLABLE_H
|
||||||
#define SCROLLABLE_H
|
#define SCROLLABLE_H
|
||||||
|
|
||||||
@@ -22,12 +18,20 @@ class Scrollable {
|
|||||||
void SetScrollSource(Scroller* source);
|
void SetScrollSource(Scroller* source);
|
||||||
Scroller* ScrollSource() const;
|
Scroller* ScrollSource() const;
|
||||||
|
|
||||||
void SetDataRect(BRect dataRect);
|
void SetDataRect(BRect dataRect,
|
||||||
|
bool validateScrollOffset = true);
|
||||||
BRect DataRect() const;
|
BRect DataRect() const;
|
||||||
|
|
||||||
void SetScrollOffset(BPoint offset);
|
virtual void SetScrollOffset(BPoint offset);
|
||||||
BPoint ScrollOffset() const;
|
BPoint ScrollOffset() const;
|
||||||
|
|
||||||
|
void SetDataRectAndScrollOffset(BRect dataRect,
|
||||||
|
BPoint offset);
|
||||||
|
|
||||||
|
BPoint ValidScrollOffsetFor(BPoint offset) const;
|
||||||
|
BPoint ValidScrollOffsetFor(BPoint offset,
|
||||||
|
const BRect& dataRect) const;
|
||||||
|
|
||||||
void SetVisibleSize(float width, float height);
|
void SetVisibleSize(float width, float height);
|
||||||
BRect VisibleBounds() const;
|
BRect VisibleBounds() const;
|
||||||
BRect VisibleRect() const;
|
BRect VisibleRect() const;
|
||||||
@@ -50,8 +54,6 @@ protected:
|
|||||||
float fVisibleWidth;
|
float fVisibleWidth;
|
||||||
float fVisibleHeight;
|
float fVisibleHeight;
|
||||||
Scroller* fScrollSource;
|
Scroller* fScrollSource;
|
||||||
|
|
||||||
BPoint _ValidScrollOffsetFor(BPoint offset) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user