From 84980e75744aae78c5ab5da1641b24d94dfb1839 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Fri, 12 Aug 2011 14:39:57 +0100 Subject: [PATCH] For documents with page label, make the lower bar lineedit be the page label instead of number MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We show the actual number in a separate qlabel too Based on a patch by Daniel Oberländer BUGS: 187237 FIXED-IN: 4.8.0 --- ui/minibar.cpp | 161 ++++++++++++++++++++++++++++++++++++------------- ui/minibar.h | 57 ++++++++++++++++- 2 files changed, 174 insertions(+), 44 deletions(-) diff --git a/ui/minibar.cpp b/ui/minibar.cpp index c253df85a..7e77dec54 100644 --- a/ui/minibar.cpp +++ b/ui/minibar.cpp @@ -30,26 +30,7 @@ // local includes #include "core/document.h" - -// [private widget] lineEdit for entering/validating page numbers -class PagesEdit : public KLineEdit -{ - public: - PagesEdit( MiniBar * parent ); - void setPagesNumber( int pages ); - void setText( const QString & ); - - protected: - void focusInEvent( QFocusEvent * e ); - void focusOutEvent( QFocusEvent * e ); - void mousePressEvent( QMouseEvent * e ); - void wheelEvent( QWheelEvent * e ); - - private: - MiniBar * m_miniBar; - bool m_eatClick; - QIntValidator * m_validator; -}; +#include "core/page.h" // [private widget] a flat qpushbutton that enlights on hover class HoverButton : public QToolButton @@ -79,9 +60,17 @@ MiniBar::MiniBar( QWidget * parent, Okular::Document * document ) m_prevButton->setIconSize( buttonSize ); horLayout->addWidget( m_prevButton ); // bottom: left lineEdit (current page box) - m_pagesEdit = new PagesEdit( this ); - horLayout->addWidget( m_pagesEdit ); - m_pagesEdit->installEventFilter( this ); + m_pageNumberEdit = new PageNumberEdit( this ); + horLayout->addWidget( m_pageNumberEdit ); + m_pageNumberEdit->installEventFilter( this ); + // bottom: left labelWidget (current page label) + m_pageLabelEdit = new PageLabelEdit( this ); + horLayout->addWidget(m_pageLabelEdit); + m_pageLabelEdit->installEventFilter( this ); + // bottom: left labelWidget (current page label) + m_pageNumberLabel = new QLabel( this ); + m_pageNumberLabel->setAlignment( Qt::AlignCenter ); + horLayout->addWidget(m_pageNumberLabel); // bottom: central 'of' label horLayout->addSpacing(5); horLayout->addWidget( new QLabel( i18nc( "Layouted like: '5 [pages] of 10'", "of" ), this ) ); @@ -103,7 +92,8 @@ MiniBar::MiniBar( QWidget * parent, Okular::Document * document ) resizeForPage( 0 ); // connect signals from child widgets to internal handlers / signals bouncers - connect( m_pagesEdit, SIGNAL(returnPressed()), this, SLOT(slotChangePage()) ); + connect( m_pageNumberEdit, SIGNAL(returnPressed()), this, SLOT(slotChangePage()) ); + connect( m_pageLabelEdit, SIGNAL(pageNumberChosen(int)), this, SLOT(slotChangePage(int)) ); connect( m_pagesButton, SIGNAL(clicked()), this, SIGNAL(gotoPage()) ); connect( m_prevButton, SIGNAL(clicked()), this, SIGNAL(prevPage()) ); connect( m_nextButton, SIGNAL(clicked()), this, SIGNAL(nextPage()) ); @@ -121,12 +111,13 @@ MiniBar::~MiniBar() bool MiniBar::eventFilter( QObject *target, QEvent *event ) { - if ( target == m_pagesEdit ) + if ( target == m_pageNumberEdit || target == m_pageLabelEdit ) { if ( event->type() == QEvent::KeyPress ) { QKeyEvent *keyEvent = static_cast( event ); - if ( keyEvent->key() == Qt::Key_PageUp || keyEvent->key() == Qt::Key_PageDown ) + int key = keyEvent->key(); + if ( key == Qt::Key_PageUp || key == Qt::Key_PageDown || key == Qt::Key_Up || key == Qt::Key_Down ) { emit forwardKeyPressEvent( keyEvent ); return true; @@ -153,12 +144,28 @@ void MiniBar::notifySetup( const QVector< Okular::Page * > & pageVector, int set // resize width of widgets resizeForPage( pages ); - + + bool labelsDiffer = false; + foreach(const Okular::Page * page, pageVector) + { + if (!page->label().isEmpty()) + { + if (page->label().toInt() != (page->number() + 1)) + { + labelsDiffer = true; + } + } + } + // update child widgets - m_pagesEdit->setPagesNumber( pages ); + m_pageLabelEdit->setPageLabels( pageVector ); + m_pageNumberEdit->setPagesNumber( pages ); m_pagesButton->setText( QString::number( pages ) ); m_prevButton->setEnabled( false ); m_nextButton->setEnabled( false ); + m_pageLabelEdit->setVisible( labelsDiffer ); + m_pageNumberLabel->setVisible( labelsDiffer ); + m_pageNumberEdit->setVisible( !labelsDiffer ); resize( minimumSizeHint() ); @@ -179,14 +186,17 @@ void MiniBar::notifyViewportChanged( bool /*smoothMove*/ ) m_prevButton->setEnabled( page > 0 ); m_nextButton->setEnabled( page < ( pages - 1 ) ); // update text on widgets - m_pagesEdit->setText( QString::number( page + 1 ) ); + const QString pageNumber = QString::number( page + 1 ); + m_pageNumberEdit->setText( pageNumber ); + m_pageNumberLabel->setText( pageNumber ); + m_pageLabelEdit->setText( m_document->page(page)->label() ); } } void MiniBar::slotChangePage() { // get text from the lineEdit - QString pageNumber = m_pagesEdit->text(); + QString pageNumber = m_pageNumberEdit->text(); // convert it to page number and go to that page bool ok; @@ -194,11 +204,17 @@ void MiniBar::slotChangePage() if ( ok && number >= 0 && number < (int)m_document->pages() && number != m_currentPage ) { - m_document->setViewportPage( number ); - m_pagesEdit->clearFocus(); + slotChangePage( number ); } } +void MiniBar::slotChangePage( int pageNumber ) +{ + m_document->setViewportPage( pageNumber ); + m_pageNumberEdit->clearFocus(); + m_pageLabelEdit->clearFocus(); +} + void MiniBar::slotEmitNextPage() { // emit signal @@ -214,8 +230,12 @@ void MiniBar::slotEmitPrevPage() void MiniBar::resizeForPage( int pages ) { int numberWidth = 10 + fontMetrics().width( QString::number( pages ) ); - m_pagesEdit->setMinimumWidth( numberWidth ); - m_pagesEdit->setMaximumWidth( 2 * numberWidth ); + m_pageNumberEdit->setMinimumWidth( numberWidth ); + m_pageNumberEdit->setMaximumWidth( 2 * numberWidth ); + m_pageLabelEdit->setMinimumWidth( numberWidth ); + m_pageLabelEdit->setMaximumWidth( 2 * numberWidth ); + m_pageNumberLabel->setMinimumWidth( numberWidth ); + m_pageNumberLabel->setMaximumWidth( 2 * numberWidth ); m_pagesButton->setMinimumWidth( numberWidth ); m_pagesButton->setMaximumWidth( 2 * numberWidth ); } @@ -325,15 +345,76 @@ void ProgressWidget::paintEvent( QPaintEvent * e ) } } +/** PageLabelEdit **/ -/** PagesEdit **/ +PageLabelEdit::PageLabelEdit( MiniBar * parent ) + : PagesEdit( parent ) +{ + setVisible( false ); + connect( this, SIGNAL(returnPressed()), this, SLOT(pageChosen()) ); +} -PagesEdit::PagesEdit( MiniBar * parent ) - : KLineEdit( parent ), m_miniBar( parent ), m_eatClick( false ) +void PageLabelEdit::setText( const QString & newText ) +{ + m_lastLabel = newText; + PagesEdit::setText( newText ); +} + +void PageLabelEdit::setPageLabels( const QVector &pageVector ) +{ + m_labelPageMap.clear(); + completionObject()->clear(); + foreach(const Okular::Page * page, pageVector) + { + if ( !page->label().isEmpty() ) + { + m_labelPageMap.insert( page->label(), page->number() ); + bool ok; + page->label().toInt( &ok ); + if ( !ok ) + { + // Only add to the completion objects labels that are not numbers + completionObject()->addItem( page->label() ); + } + } + } +} + +void PageLabelEdit::pageChosen() +{ + const QString newInput = text(); + const int pageNumber = m_labelPageMap.value( newInput, -1 ); + if (pageNumber != -1) + { + emit pageNumberChosen( pageNumber ); + } + else + { + setText( m_lastLabel ); + } +} + +/** PageNumberEdit **/ + +PageNumberEdit::PageNumberEdit( MiniBar * miniBar ) + : PagesEdit( miniBar ) { // use an integer validator m_validator = new QIntValidator( 1, 1, this ); setValidator( m_validator ); +} + +void PageNumberEdit::setPagesNumber( int pages ) +{ + m_validator->setTop( pages ); +} + + +/** PagesEdit **/ + +PagesEdit::PagesEdit( MiniBar * parent ) + : KLineEdit( parent ), m_miniBar( parent ), m_eatClick( false ) +{ // customize text properties setAlignment( Qt::AlignCenter ); @@ -343,11 +424,6 @@ PagesEdit::PagesEdit( MiniBar * parent ) QApplication::sendEvent( this, &fe ); } -void PagesEdit::setPagesNumber( int pages ) -{ - m_validator->setTop( pages ); -} - void PagesEdit::setText( const QString & newText ) { // call default handler if hasn't focus @@ -435,3 +511,4 @@ HoverButton::HoverButton( QWidget * parent ) } #include "minibar.moc" + diff --git a/ui/minibar.h b/ui/minibar.h index 6ec7d9cf4..e91a0fdcf 100644 --- a/ui/minibar.h +++ b/ui/minibar.h @@ -12,14 +12,64 @@ #define _OKULAR_MINIBAR_H_ #include +#include #include "core/observer.h" namespace Okular { class Document; } -class PagesEdit; +class MiniBar; class HoverButton; +class QIntValidator; +class QLabel; + +// [private widget] lineEdit for entering/validating page numbers +class PagesEdit : public KLineEdit +{ + public: + PagesEdit( MiniBar * parent ); + void setText( const QString & ); + + protected: + void focusInEvent( QFocusEvent * e ); + void focusOutEvent( QFocusEvent * e ); + void mousePressEvent( QMouseEvent * e ); + void wheelEvent( QWheelEvent * e ); + + private: + MiniBar * m_miniBar; + bool m_eatClick; +}; + +class PageNumberEdit : public PagesEdit +{ + public: + PageNumberEdit( MiniBar * parent ); + void setPagesNumber( int pages ); + + private: + QIntValidator * m_validator; +}; + +class PageLabelEdit : public PagesEdit +{ + Q_OBJECT + public: + PageLabelEdit( MiniBar * parent ); + void setText( const QString & newText ); + void setPageLabels( const QVector< Okular::Page * > & pageVector ); + + signals: + void pageNumberChosen( int page ); + + private slots: + void pageChosen(); + + private: + QString m_lastLabel; + QMap m_labelPageMap; +}; /** * @short A widget to display page number and change current page. @@ -44,6 +94,7 @@ class MiniBar : public QWidget, public Okular::DocumentObserver public slots: void slotChangePage(); + void slotChangePage(int page); void slotEmitNextPage(); void slotEmitPrevPage(); @@ -52,7 +103,9 @@ class MiniBar : public QWidget, public Okular::DocumentObserver bool eventFilter( QObject *target, QEvent *event ); Okular::Document * m_document; - PagesEdit * m_pagesEdit; + PageNumberEdit * m_pageNumberEdit; + PageLabelEdit * m_pageLabelEdit; + QLabel * m_pageNumberLabel; HoverButton * m_prevButton; HoverButton * m_pagesButton; HoverButton * m_nextButton;