GUI: fixed issues with result list scrolling and paging

This commit is contained in:
Jean-Francois Dockes 2012-05-23 10:37:38 +02:00
parent fda3f6e5c4
commit a90b8bd4e9
4 changed files with 100 additions and 35 deletions

View File

@ -562,12 +562,13 @@ void ResList::resPageUpOrBack()
if (vpos == verticalScrollBar()->value()) if (vpos == verticalScrollBar()->value())
resultPageBack(); resultPageBack();
#else #else
QWebFrame *frame = page()->mainFrame(); if (scrollIsAtTop()) {
int vpos = frame->scrollBarValue(Qt::Vertical);
if (vpos != frame->scrollBarMinimum(Qt::Vertical))
frame->scroll(0, -int(0.9*geometry().height()));
else
resultPageBack(); resultPageBack();
} else {
QWebFrame *frame = page()->mainFrame();
frame->scroll(0, -int(0.9*geometry().height()));
}
setupArrows();
#endif #endif
} }
@ -581,21 +582,70 @@ void ResList::resPageDownOrNext()
if (vpos == verticalScrollBar()->value()) if (vpos == verticalScrollBar()->value())
resultPageNext(); resultPageNext();
#else #else
QWebFrame *frame = page()->mainFrame(); if (scrollIsAtBottom()) {
int vpos = frame->scrollBarValue(Qt::Vertical);
if (vpos != frame->scrollBarMaximum(Qt::Vertical))
frame->scroll(0, int(0.9*geometry().height()));
else
resultPageNext(); resultPageNext();
} else {
QWebFrame *frame = page()->mainFrame();
frame->scroll(0, int(0.9*geometry().height()));
}
setupArrows();
#endif #endif
} }
void ResList::setupArrows()
{
emit prevPageAvailable(m_pager->hasPrev() || !scrollIsAtTop());
emit nextPageAvailable(m_pager->hasNext() || !scrollIsAtBottom());
}
bool ResList::scrollIsAtBottom()
{
#ifdef RESLIST_TEXTBROWSER
return false;
#else
QWebFrame *frame = page()->mainFrame();
bool ret;
if (!frame || frame->scrollBarGeometry(Qt::Vertical).isEmpty()) {
ret = true;
} else {
int max = frame->scrollBarMaximum(Qt::Vertical);
int cur = frame->scrollBarValue(Qt::Vertical);
ret = (max != 0) && (cur == max);
LOGDEB2(("Scrollatbottom: cur %d max %d\n", cur, max));
}
LOGDEB2(("scrollIsAtBottom: returning %d\n", ret));
return ret;
#endif
}
bool ResList::scrollIsAtTop()
{
#ifdef RESLIST_TEXTBROWSER
return false;
#else
QWebFrame *frame = page()->mainFrame();
bool ret;
if (!frame || frame->scrollBarGeometry(Qt::Vertical).isEmpty()) {
ret = true;
} else {
int cur = frame->scrollBarValue(Qt::Vertical);
int min = frame->scrollBarMinimum(Qt::Vertical);
LOGDEB(("Scrollattop: cur %d min %d\n", cur, min));
ret = (cur == min);
}
#endif
LOGDEB2(("scrollIsAtTop: returning %d\n", ret));
return ret;
}
// Show previous page of results. We just set the current number back // Show previous page of results. We just set the current number back
// 2 pages and show next page. // 2 pages and show next page.
void ResList::resultPageBack() void ResList::resultPageBack()
{ {
m_pager->resultPageBack(); if (m_pager->hasPrev()) {
displayPage(); m_pager->resultPageBack();
displayPage();
}
} }
// Go to the first page // Go to the first page
@ -607,6 +657,21 @@ void ResList::resultPageFirst()
displayPage(); displayPage();
} }
// Fill up result list window with next screen of hits
void ResList::resultPageNext()
{
if (m_pager->hasNext()) {
m_pager->resultPageNext();
displayPage();
}
}
void ResList::resultPageFor(int docnum)
{
m_pager->resultPageFor(docnum);
displayPage();
}
void ResList::append(const QString &text) void ResList::append(const QString &text)
{ {
LOGDEB2(("QtGuiReslistPager::appendQString : %s\n", LOGDEB2(("QtGuiReslistPager::appendQString : %s\n",
@ -618,19 +683,6 @@ void ResList::append(const QString &text)
#endif #endif
} }
// Fill up result list window with next screen of hits
void ResList::resultPageNext()
{
m_pager->resultPageNext();
displayPage();
}
void ResList::resultPageFor(int docnum)
{
m_pager->resultPageFor(docnum);
displayPage();
}
void ResList::displayPage() void ResList::displayPage()
{ {
resetView(); resetView();
@ -641,10 +693,10 @@ void ResList::displayPage()
setHtml(m_text); setHtml(m_text);
#endif #endif
LOGDEB0(("ResList::resultPageNext: hasNext %d hasPrev %d\n", LOGDEB0(("ResList::displayPg: hasNext %d atBot %d hasPrev %d at Top %d \n",
m_pager->hasPrev(), m_pager->hasNext())); m_pager->hasPrev(), scrollIsAtBottom(),
emit prevPageAvailable(m_pager->hasPrev()); m_pager->hasNext(), scrollIsAtTop()));
emit nextPageAvailable(m_pager->hasNext()); setupArrows();
// Possibly color paragraph of current preview if any // Possibly color paragraph of current preview if any
previewExposed(m_curPvDoc); previewExposed(m_curPvDoc);

View File

@ -134,6 +134,9 @@ class ResList : public RESLIST_PARENTCLASS
virtual void displayPage(); // Display current page virtual void displayPage(); // Display current page
static int newListId(); static int newListId();
void resetView(); void resetView();
bool scrollIsAtTop();
bool scrollIsAtBottom();
void setupArrows();
}; };

View File

@ -49,8 +49,9 @@ static PlainToRichHtReslist g_hiliter;
ResListPager::ResListPager(int pagesize) ResListPager::ResListPager(int pagesize)
: m_pagesize(pagesize), : m_pagesize(pagesize),
m_newpagesize(pagesize), m_newpagesize(pagesize),
m_resultsInCurrentPage(0),
m_winfirst(-1), m_winfirst(-1),
m_hasNext(false), m_hasNext(true),
m_hiliter(&g_hiliter) m_hiliter(&g_hiliter)
{ {
} }
@ -71,12 +72,19 @@ void ResListPager::resultPageNext()
} else { } else {
m_winfirst += m_respage.size(); m_winfirst += m_respage.size();
} }
// Get the next page of results. // Get the next page of results. Note that we look ahead by one to
// determine if there is actually a next page
vector<ResListEntry> npage; vector<ResListEntry> npage;
int pagelen = m_docSource->getSeqSlice(m_winfirst, m_pagesize, npage); int pagelen = m_docSource->getSeqSlice(m_winfirst, m_pagesize + 1, npage);
// If page was truncated, there is no next // If page was truncated, there is no next
m_hasNext = (pagelen == m_pagesize); m_hasNext = (pagelen == m_pagesize + 1);
// Get rid of the possible excess result
if (pagelen == m_pagesize + 1) {
npage.resize(m_pagesize);
pagelen--;
}
if (pagelen <= 0) { if (pagelen <= 0) {
// No results ? This can only happen on the first page or if the // No results ? This can only happen on the first page or if the
@ -94,6 +102,7 @@ void ResListPager::resultPageNext()
} }
return; return;
} }
m_resultsInCurrentPage = pagelen;
m_respage = npage; m_respage = npage;
} }

View File

@ -44,7 +44,7 @@ public:
{ {
m_pagesize = m_newpagesize; m_pagesize = m_newpagesize;
m_winfirst = winfirst; m_winfirst = winfirst;
m_hasNext = false; m_hasNext = true;
m_docSource = src; m_docSource = src;
m_respage.clear(); m_respage.clear();
} }
@ -78,7 +78,7 @@ public:
} }
void resultPageBack() { void resultPageBack() {
if (m_winfirst <= 0) return; if (m_winfirst <= 0) return;
m_winfirst -= 2 * m_pagesize; m_winfirst -= m_resultsInCurrentPage + m_pagesize;
resultPageNext(); resultPageNext();
} }
void resultPageNext(); void resultPageNext();
@ -120,6 +120,7 @@ public:
private: private:
int m_pagesize; int m_pagesize;
int m_newpagesize; int m_newpagesize;
int m_resultsInCurrentPage;
// First docnum (from docseq) in current page // First docnum (from docseq) in current page
int m_winfirst; int m_winfirst;
bool m_hasNext; bool m_hasNext;