[app] Added positionViewAtIndex method to BooksListWatcher
It allows to avoid binding loops
This commit is contained in:
parent
6900ed151d
commit
1a8aad3139
2 changed files with 49 additions and 3 deletions
|
@ -38,6 +38,7 @@
|
||||||
#define LISTVIEW_CONTENT_X "contentX"
|
#define LISTVIEW_CONTENT_X "contentX"
|
||||||
#define LISTVIEW_CONTENT_Y "contentY"
|
#define LISTVIEW_CONTENT_Y "contentY"
|
||||||
#define LISTVIEW_INDEX_AT "indexAt"
|
#define LISTVIEW_INDEX_AT "indexAt"
|
||||||
|
#define LISTVIEW_POSITION_VIEW_AT_INDEX "positionViewAtIndex"
|
||||||
|
|
||||||
BooksListWatcher::BooksListWatcher(QObject* aParent) :
|
BooksListWatcher::BooksListWatcher(QObject* aParent) :
|
||||||
QObject(aParent),
|
QObject(aParent),
|
||||||
|
@ -45,6 +46,8 @@ BooksListWatcher::BooksListWatcher(QObject* aParent) :
|
||||||
iContentX(0),
|
iContentX(0),
|
||||||
iContentY(0),
|
iContentY(0),
|
||||||
iListView(NULL),
|
iListView(NULL),
|
||||||
|
iCenterMode(-1),
|
||||||
|
iPositionIsChanging(false),
|
||||||
iResizeTimer(new QTimer(this))
|
iResizeTimer(new QTimer(this))
|
||||||
{
|
{
|
||||||
iResizeTimer->setSingleShot(true);
|
iResizeTimer->setSingleShot(true);
|
||||||
|
@ -58,6 +61,7 @@ void BooksListWatcher::setListView(QQuickItem* aView)
|
||||||
const QSize oldSize(iSize);
|
const QSize oldSize(iSize);
|
||||||
if (iListView) iListView->disconnect(this);
|
if (iListView) iListView->disconnect(this);
|
||||||
iListView = aView;
|
iListView = aView;
|
||||||
|
iCenterMode = -1;
|
||||||
if (iListView) {
|
if (iListView) {
|
||||||
connect(iListView,
|
connect(iListView,
|
||||||
SIGNAL(widthChanged()),
|
SIGNAL(widthChanged()),
|
||||||
|
@ -110,6 +114,38 @@ qreal BooksListWatcher::getRealProperty(const char *name, qreal defaultValue)
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BooksListWatcher::positionViewAtIndex(int aIndex)
|
||||||
|
{
|
||||||
|
if (iListView) {
|
||||||
|
HDEBUG(aIndex);
|
||||||
|
if (iCenterMode < 0) {
|
||||||
|
bool ok = false;
|
||||||
|
const QMetaObject* metaObject = iListView->metaObject();
|
||||||
|
if (metaObject) {
|
||||||
|
int index = metaObject->indexOfEnumerator("PositionMode");
|
||||||
|
if (index >= 0) {
|
||||||
|
QMetaEnum metaEnum = metaObject->enumerator(index);
|
||||||
|
int value = metaEnum.keyToValue("Center", &ok);
|
||||||
|
if (ok) {
|
||||||
|
iCenterMode = value;
|
||||||
|
HDEBUG("Center =" << iCenterMode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HASSERT(ok);
|
||||||
|
if (!ok) {
|
||||||
|
// This is what it normally is
|
||||||
|
iCenterMode = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iPositionIsChanging = true;
|
||||||
|
QMetaObject::invokeMethod(iListView, LISTVIEW_POSITION_VIEW_AT_INDEX,
|
||||||
|
Q_ARG(int,aIndex), Q_ARG(int,iCenterMode));
|
||||||
|
iPositionIsChanging = false;
|
||||||
|
updateCurrentIndex();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
qreal BooksListWatcher::contentX()
|
qreal BooksListWatcher::contentX()
|
||||||
{
|
{
|
||||||
return getRealProperty(LISTVIEW_CONTENT_X);
|
return getRealProperty(LISTVIEW_CONTENT_X);
|
||||||
|
@ -193,18 +229,24 @@ void BooksListWatcher::onContentXChanged()
|
||||||
{
|
{
|
||||||
HASSERT(sender() == iListView);
|
HASSERT(sender() == iListView);
|
||||||
iContentX = contentX();
|
iContentX = contentX();
|
||||||
updateCurrentIndex();
|
if (!iPositionIsChanging) {
|
||||||
|
updateCurrentIndex();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BooksListWatcher::onContentYChanged()
|
void BooksListWatcher::onContentYChanged()
|
||||||
{
|
{
|
||||||
HASSERT(sender() == iListView);
|
HASSERT(sender() == iListView);
|
||||||
iContentY = contentY();
|
iContentY = contentY();
|
||||||
updateCurrentIndex();
|
if (!iPositionIsChanging) {
|
||||||
|
updateCurrentIndex();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BooksListWatcher::onContentSizeChanged()
|
void BooksListWatcher::onContentSizeChanged()
|
||||||
{
|
{
|
||||||
HASSERT(sender() == iListView);
|
HASSERT(sender() == iListView);
|
||||||
updateCurrentIndex();
|
if (!iPositionIsChanging) {
|
||||||
|
updateCurrentIndex();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,6 +59,8 @@ public:
|
||||||
QQuickItem* listView() const { return iListView; }
|
QQuickItem* listView() const { return iListView; }
|
||||||
void setListView(QQuickItem* aView);
|
void setListView(QQuickItem* aView);
|
||||||
|
|
||||||
|
Q_INVOKABLE void positionViewAtIndex(int aIndex);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
qreal contentX();
|
qreal contentX();
|
||||||
qreal contentY();
|
qreal contentY();
|
||||||
|
@ -88,6 +90,8 @@ private:
|
||||||
qreal iContentX;
|
qreal iContentX;
|
||||||
qreal iContentY;
|
qreal iContentY;
|
||||||
QQuickItem* iListView;
|
QQuickItem* iListView;
|
||||||
|
int iCenterMode;
|
||||||
|
bool iPositionIsChanging;
|
||||||
QTimer* iResizeTimer;
|
QTimer* iResizeTimer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue