For documents with page label, make the lower bar lineedit be the page label instead of number

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
remotes/origin/textfind-and-transparency
Albert Astals Cid 15 years ago
parent ea82b3eb42
commit 84980e7574
  1. 161
      ui/minibar.cpp
  2. 57
      ui/minibar.h

@ -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<QKeyEvent *>( 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<Okular::Page *> &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"

@ -12,14 +12,64 @@
#define _OKULAR_MINIBAR_H_
#include <qwidget.h>
#include <klineedit.h>
#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<QString, int> 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;

Loading…
Cancel
Save