aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/Ui/qsui/listwidget.cpp48
-rw-r--r--src/plugins/Ui/qsui/listwidget.h9
-rw-r--r--src/plugins/Ui/skinned/listwidget.cpp45
-rw-r--r--src/plugins/Ui/skinned/listwidget.h9
4 files changed, 103 insertions, 8 deletions
diff --git a/src/plugins/Ui/qsui/listwidget.cpp b/src/plugins/Ui/qsui/listwidget.cpp
index 58b3754a0..524563fb1 100644
--- a/src/plugins/Ui/qsui/listwidget.cpp
+++ b/src/plugins/Ui/qsui/listwidget.cpp
@@ -66,6 +66,8 @@ ListWidget::ListWidget(PlayListModel *model, QWidget *parent)
m_first = 0;
m_row_count = 0;
m_select_on_release = false;
+ m_count = 0;
+ m_firstItem = 0;
setAcceptDrops(true);
setMouseTracking(true);
@@ -177,6 +179,8 @@ void ListWidget::setModel(PlayListModel *selected, PlayListModel *previous)
}
qApp->processEvents();
m_model = selected;
+ m_count = m_model->count();
+ m_firstItem = 0;
if(m_model->property("first_visible").isValid())
{
@@ -407,6 +411,14 @@ void ListWidget::updateList(int flags)
m_scrollBar->setValue(m_first);
emit positionChanged(m_first, m_first);
}
+ else if(!m_filterMode && (m_count > 0) && (m_count != m_model->count()) &&
+ m_firstItem && m_model->item(m_first) != m_firstItem)
+ {
+ restoreFirstVisible();
+ m_scrollBar->setMaximum(count - m_row_count);
+ m_scrollBar->setValue(m_first);
+ emit positionChanged(m_first, m_model->count() - m_row_count);
+ }
else
{
m_scrollBar->setMaximum(count - m_row_count);
@@ -415,6 +427,11 @@ void ListWidget::updateList(int flags)
}
m_scrollBar->blockSignals(false);
+ if(!m_filterMode)
+ {
+ m_firstItem = m_model->isEmpty() ? 0 : m_model->item(m_first);
+ m_count = m_model->count();
+ }
items = m_filterMode ? m_filteredItems.mid(m_first, m_row_count) : m_model->mid(m_first, m_row_count);
while(m_rows.count() < qMin(m_row_count, items.count()))
@@ -654,6 +671,37 @@ bool ListWidget::updateRowCount()
return false;
}
+void ListWidget::restoreFirstVisible()
+{
+ if(m_first >= m_model->count() || m_firstItem == m_model->item(m_first))
+ return;
+
+ int delta = m_model->count() - m_count;
+
+ if(delta > 0)
+ {
+ for(int i = m_first + 1; i <= qMin(m_model->count() - 1, m_first + delta); ++i)
+ {
+ if(m_model->item(i) == m_firstItem)
+ {
+ m_first = i;
+ break;
+ }
+ }
+ }
+ else
+ {
+ for(int i = m_first - 1; i >= qMax(0, m_first + delta); --i)
+ {
+ if(m_model->item(i) == m_firstItem)
+ {
+ m_first = i;
+ break;
+ }
+ }
+ }
+}
+
void ListWidget::updateScrollBars()
{
bool rtl = layoutDirection() == Qt::RightToLeft;
diff --git a/src/plugins/Ui/qsui/listwidget.h b/src/plugins/Ui/qsui/listwidget.h
index 284401c81..ab981f4d5 100644
--- a/src/plugins/Ui/qsui/listwidget.h
+++ b/src/plugins/Ui/qsui/listwidget.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2006-2016 by Ilya Kotov *
+ * Copyright (C) 2006-2018 by Ilya Kotov *
* forkotov02@ya.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -113,18 +113,19 @@ private:
* Returns string with queue number or(and) repeate flag for the \b item.
*/
const QString getExtraString(PlayListItem *item);
-
bool updateRowCount();
+ void restoreFirstVisible();
void updateScrollBars();
bool m_update;
int m_pressed_index;
QMenu *m_menu;
PlayListModel *m_model;
- int m_row_count, m_first;
+ int m_row_count, m_first, m_count; //visible rows, first visible index, total item count
+ PlayListItem *m_firstItem; //first visible item
int m_anchor_index;
/*!
- * Scroll direction that is preforming in current moment.
+ * Scroll direction that is performing in current moment.
*/
ScrollDirection m_scroll_direction;
int m_prev_y;
diff --git a/src/plugins/Ui/skinned/listwidget.cpp b/src/plugins/Ui/skinned/listwidget.cpp
index b82ab6e14..2a469e12d 100644
--- a/src/plugins/Ui/skinned/listwidget.cpp
+++ b/src/plugins/Ui/skinned/listwidget.cpp
@@ -64,6 +64,8 @@ ListWidget::ListWidget(QWidget *parent)
m_pressed_index = INVALID_INDEX;
m_first = 0;
m_row_count = 0;
+ m_count = 0;
+ m_firstItem = 0;
m_select_on_release = false;
setAcceptDrops(true);
@@ -321,9 +323,19 @@ void ListWidget::updateList(int flags)
m_first = qMax(0, m_model->count() - m_row_count);
emit positionChanged(m_first, m_first);
}
+ else if((m_count > 0) && (m_count != m_model->count()) &&
+ m_firstItem && m_model->item(m_first) != m_firstItem)
+ {
+ restoreFirstVisible();
+ emit positionChanged(m_first, m_model->count() - m_row_count);
+ }
else
+ {
emit positionChanged(m_first, m_model->count() - m_row_count);
+ }
+ m_firstItem = m_model->isEmpty() ? 0 : m_model->item(m_first);
+ m_count = m_model->count();
items = m_model->mid(m_first, m_row_count);
while(m_rows.count() < qMin(m_row_count, items.count()))
@@ -446,6 +458,8 @@ void ListWidget::setModel(PlayListModel *selected, PlayListModel *previous)
}
qApp->processEvents();
m_model = selected;
+ m_count = m_model->count();
+ m_firstItem = 0;
if(m_model->property("first_visible").isValid())
{
@@ -564,6 +578,37 @@ bool ListWidget::updateRowCount()
return false;
}
+void ListWidget::restoreFirstVisible()
+{
+ if(m_first >= m_model->count() || m_firstItem == m_model->item(m_first))
+ return;
+
+ int delta = m_model->count() - m_count;
+
+ if(delta > 0)
+ {
+ for(int i = m_first + 1; i <= qMin(m_model->count() - 1, m_first + delta); ++i)
+ {
+ if(m_model->item(i) == m_firstItem)
+ {
+ m_first = i;
+ break;
+ }
+ }
+ }
+ else
+ {
+ for(int i = m_first - 1; i >= qMax(0, m_first + delta); --i)
+ {
+ if(m_model->item(i) == m_firstItem)
+ {
+ m_first = i;
+ break;
+ }
+ }
+ }
+}
+
void ListWidget::mouseMoveEvent(QMouseEvent *e)
{
if(e->buttons() == Qt::LeftButton)
diff --git a/src/plugins/Ui/skinned/listwidget.h b/src/plugins/Ui/skinned/listwidget.h
index 9e019d630..abaa5fec8 100644
--- a/src/plugins/Ui/skinned/listwidget.h
+++ b/src/plugins/Ui/skinned/listwidget.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2006-2017 by Ilya Kotov *
+ * Copyright (C) 2006-2018 by Ilya Kotov *
* forkotov02@ya.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -109,18 +109,19 @@ private:
* Returns string with queue number or(and) repeate flag for the item number \b i.
*/
const QString getExtraString(int i);
-
bool updateRowCount();
+ void restoreFirstVisible();
bool m_update;
int m_pressed_index;
QMenu *m_menu;
PlayListModel *m_model;
- int m_row_count, m_first;
+ int m_row_count, m_first, m_count; //visible rows, first visible index, total item count
+ PlayListItem *m_firstItem; //first visible item
Skin *m_skin;
int m_anchor_index;
/*!
- * Scroll direction that is preforming in current moment.
+ * Scroll direction that is performing in current moment.
*/
ScrollDirection m_scroll_direction;
int m_prev_y;