diff options
Diffstat (limited to 'viewGridNavigator.cpp')
-rw-r--r-- | viewGridNavigator.cpp | 121 |
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); |