summaryrefslogtreecommitdiff
path: root/viewGridNavigator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'viewGridNavigator.cpp')
-rw-r--r--viewGridNavigator.cpp121
1 files changed, 74 insertions, 47 deletions
diff --git a/viewGridNavigator.cpp b/viewGridNavigator.cpp
index 8600edd..0984bb5 100644
--- a/viewGridNavigator.cpp
+++ b/viewGridNavigator.cpp
@@ -55,24 +55,34 @@ void cViewGridNavigator::FilterElements(int scrollOffset)
{
if(m_vElements.size() == 0) return;
- int startOffset = scrollOffset;
- int endOffset = startOffset + (m_rows * m_columns);
- if(scrollOffset < 0) {
- endOffset = (m_rows * m_columns) + scrollOffset;
+ m_startIndex += scrollOffset;
+ if(m_startIndex < 0) m_startIndex = 0;
+
+ m_endIndex = m_startIndex + (m_rows * m_columns);
+ if(m_endIndex > m_vElements.size()) m_endIndex = m_vElements.size();
+
+ if(scrollOffset > 0 && m_startIndex >= m_endIndex) {
+ // allign elements
+ int delta = m_vElements.size() % m_columns;
+ delta = m_rows * m_columns - m_columns + delta;
+ m_startIndex = m_endIndex - delta;
}
-
- //remove non visible elements from grid
- if(scrollOffset !=0 ) {
- auto startIt = m_firstElementIter;
- auto endIt = m_firstElementIter + scrollOffset;
- if(scrollOffset < 0) {
- startIt = m_lastElementIter + scrollOffset;
- endIt = m_lastElementIter;
- }
- if(startIt < m_vElements.begin()) startIt = m_vElements.begin();
- if(endIt > m_vElements.end()) endIt = m_vElements.end();
-
- for(std::vector<cGridElement*>::iterator it = startIt; it != endIt; ++it) {
+
+ unsigned int i = 0;
+ int pos = 0;
+ for(auto it = m_vElements.begin(); it != m_vElements.end(); ++it) {
+
+ if(i >= m_startIndex && i < m_endIndex) {
+ cGridElement *elem = *it;
+ elem->Position = pos++;
+ SetGridElementData(elem);
+
+ if(m_setIterator) {
+ m_activeElementIter = it;
+ m_pGrid->SetCurrent((*m_activeElementIter)->GridElementId(), true);
+ m_setIterator = false;
+ }
+ } else {
m_pGrid->Delete((*it)->GridElementId());
(*it)->Dirty();
(*it)->Position = -1;
@@ -80,28 +90,9 @@ void cViewGridNavigator::FilterElements(int scrollOffset)
// Remove Queued Downloads
cPictureCache::GetInstance().Remove(*it);
}
+ i++;
}
- std::vector<cGridElement*>::iterator begin = m_firstElementIter + startOffset;
- std::vector<cGridElement*>::iterator end = m_firstElementIter + endOffset;
- if(begin < m_vElements.begin()) begin = m_vElements.begin();
- if(end > m_vElements.end()) end = m_vElements.end();
-
- int pos = 0;
- for(std::vector<cGridElement*>::iterator it = begin; it != end; ++it) {
- cGridElement *elem = *it;
- elem->Position = pos++;
- SetGridElementData(elem);
- }
-
- if(m_setIterator) {
- m_activeElementIter = begin;
- m_pGrid->SetCurrent((*m_activeElementIter)->GridElementId(), true);
- m_setIterator = false;
- }
-
- m_firstElementIter = begin;
- m_lastElementIter = end;
m_newDimensions = false;
}
@@ -117,7 +108,6 @@ void cViewGridNavigator::SetGridElementData(cGridElement *obj)
x = width * column;
y= height * row;
- //std::cout << "ID: " << obj->GridElementId() << "\tPos: " << obj->Position << "\t\tx: " << x << "\t\ty: " << y << "\t\twi: " << width << "\t\thei: " << height << "\tCol: " << column << "\tRow: " << row << std::endl;
cMutexLock MutexLock(&cPlexSdOsd::RedrawMutex);
if(obj->IsNew() || m_newDimensions) {
// fill data
@@ -138,7 +128,7 @@ void cViewGridNavigator::SetGridElementData(cGridElement *obj)
cGridElement* cViewGridNavigator::SelectedObject()
{
- if(!m_setIterator)
+ if(!m_setIterator)
return *m_activeElementIter;
return NULL;
}
@@ -152,13 +142,28 @@ void cViewGridNavigator::SetGridDimensions(int rows, int columns)
bool cViewGridNavigator::NavigateDown()
{
- if (m_setIterator || m_activeElementIter == m_vElements.end() - 1) return false;
+ if (m_setIterator ) return false;
auto next = m_activeElementIter + m_columns;
- if(next >= m_vElements.end()) next = m_vElements.end()-1;
+
+ bool scrollallaround = false;
+ if (next >= m_vElements.end() && Config::GetInstance().ScrollAllAround) {
+ next = m_vElements.begin();
+ scrollallaround = true;
+ } else if(next >= m_vElements.end()) {
+ next = m_activeElementIter; // stay at current element //m_vElements.end()-1;
+ return false;
+ }
// scroll down?
if(!(*next)->IsVisible()) {
- FilterElements(m_columns);
+ int scrolloffset = m_columns;
+ if(Config::GetInstance().ScrollByPage) {
+ scrolloffset = m_columns*m_rows;
+ }
+ if(scrollallaround)
+ scrolloffset = -((*m_activeElementIter)->AbsolutePosition);
+
+ FilterElements(scrolloffset);
}
m_pGrid->SetCurrent((*m_activeElementIter)->GridElementId(), false);
@@ -169,13 +174,28 @@ bool cViewGridNavigator::NavigateDown()
bool cViewGridNavigator::NavigateUp()
{
- if (m_setIterator || m_activeElementIter == m_vElements.begin()) return false;
+ if (m_setIterator) return false;
auto next = m_activeElementIter - m_columns;
- if(next < m_vElements.begin()) next = m_vElements.begin();
+
+ bool scrollallaround = false;
+ if (next < m_vElements.begin() && Config::GetInstance().ScrollAllAround) {
+ next = m_vElements.end() - 1;
+ scrollallaround = true;
+ } else if(next < m_vElements.begin()) {
+ next = m_activeElementIter; // stay at current element //m_vElements.end()-1;
+ return false;
+ }
//scroll up?
if(!(*next)->IsVisible()) {
- FilterElements(-m_columns);
+ int scrolloffset = -m_columns;
+ if(Config::GetInstance().ScrollByPage) {
+ scrolloffset = -m_columns*m_rows;
+ }
+ if(scrollallaround)
+ scrolloffset = m_vElements.size();
+
+ FilterElements(scrolloffset);
}
m_pGrid->SetCurrent((*m_activeElementIter)->GridElementId(), false);
@@ -192,7 +212,11 @@ bool cViewGridNavigator::NavigateLeft()
if(!(*next)->IsVisible()) {
auto temp = m_activeElementIter;
- FilterElements(-m_columns);
+ if(Config::GetInstance().ScrollByPage)
+ FilterElements(-m_columns*m_rows);
+ else
+ FilterElements(-m_columns);
+
m_activeElementIter = temp;
}
@@ -209,7 +233,10 @@ bool cViewGridNavigator::NavigateRight()
if(next >= m_vElements.end()) next = m_vElements.end()-1;
if(!(*next)->IsVisible()) {
- FilterElements(m_columns);
+ if(Config::GetInstance().ScrollByPage)
+ FilterElements(m_columns*m_rows);
+ else
+ FilterElements(m_columns);
}
m_pGrid->SetCurrent((*m_activeElementIter)->GridElementId(), false);