[kde-doc-english] [okular] /: Auto-fit zoom
Albert Astals Cid
aacid at kde.org
Sun Aug 18 15:20:41 UTC 2013
Git commit e4aa8317b5d49ad1129e23bda52415ff7dc0a290 by Albert Astals Cid, on behalf of Thomas Fischer.
Committed on 18/08/2013 at 15:19.
Pushed by aacid into branch 'master'.
Auto-fit zoom
BUGS: 249364
REVIEW: 110003
M +5 -0 conf/dlggeneralbase.ui
M +1 -1 conf/okular.kcfg
M +12 -0 doc/index.docbook
M +2 -1 part.rc
M +72 -8 ui/pageview.cpp
M +2 -1 ui/pageview.h
http://commits.kde.org/okular/e4aa8317b5d49ad1129e23bda52415ff7dc0a290
diff --git a/conf/dlggeneralbase.ui b/conf/dlggeneralbase.ui
index f2c9efd..b70af8a 100644
--- a/conf/dlggeneralbase.ui
+++ b/conf/dlggeneralbase.ui
@@ -353,6 +353,11 @@ For files which were opened before the previous zoom is applied.</string>
<string>Fit Page</string>
</property>
</item>
+ <item>
+ <property name="text">
+ <string>Auto Fit</string>
+ </property>
+ </item>
</widget>
</item>
</layout>
diff --git a/conf/okular.kcfg b/conf/okular.kcfg
index 1e23d61..deabd07 100644
--- a/conf/okular.kcfg
+++ b/conf/okular.kcfg
@@ -75,7 +75,7 @@
<group name="Zoom">
<entry key="ZoomMode" type="UInt" >
<default>1</default>
- <max>2</max>
+ <max>3</max>
</entry>
</group>
<group name="General" >
diff --git a/doc/index.docbook b/doc/index.docbook
index 432aee2..ed7a6a4 100644
--- a/doc/index.docbook
+++ b/doc/index.docbook
@@ -1076,6 +1076,18 @@ Context menu actions like Rename Bookmarks etc.)
<term>
<menuchoice>
<guimenu>View</guimenu>
+ <guimenuitem>Auto Fit</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para><action>Change the magnification</action> of the document view
+ to a value that, depending on the size relation between the page and the view area, automatically either makes the pages' width equal to the document view's width (like fit-page), the pages' height equal to the document view's height (like fit-height), or the whole page visible (like fit-page).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>
+ <menuchoice>
+ <guimenu>View</guimenu>
<guimenuitem>Continuous</guimenuitem>
</menuchoice>
</term>
diff --git a/part.rc b/part.rc
index 64aeffb..6b1f44e 100644
--- a/part.rc
+++ b/part.rc
@@ -1,5 +1,5 @@
<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
-<kpartgui name="okular_part" version="34">
+<kpartgui name="okular_part" version="35">
<MenuBar>
<Menu name="file"><text>&File</text>
<Action name="get_new_stuff" group="file_open"/>
@@ -32,6 +32,7 @@
<Action name="view_zoom_out"/>
<Action name="view_fit_to_width"/>
<Action name="view_fit_to_page"/>
+ <Action name="view_auto_fit"/>
<Separator/>
<Action name="view_continuous"/>
<Action name="view_render_mode"/>
diff --git a/ui/pageview.cpp b/ui/pageview.cpp
index 5944072..0d6c567 100644
--- a/ui/pageview.cpp
+++ b/ui/pageview.cpp
@@ -173,6 +173,7 @@ public:
// infinite resizing loop prevention
bool verticalScrollBarVisible;
+ bool horizontalScrollBarVisible;
// drag scroll
QPoint dragScrollVector;
@@ -197,6 +198,7 @@ public:
KAction * aZoomOut;
KToggleAction * aZoomFitWidth;
KToggleAction * aZoomFitPage;
+ KToggleAction * aZoomAutoFit;
KActionMenu * aViewMode;
KToggleAction * aViewContinuous;
QAction * aPrevAction;
@@ -306,6 +308,7 @@ PageView::PageView( QWidget *parent, Okular::Document *document )
d->aToggleAnnotator = 0;
d->aZoomFitWidth = 0;
d->aZoomFitPage = 0;
+ d->aZoomAutoFit = 0;
d->aViewMode = 0;
d->aViewContinuous = 0;
d->aPrevAction = 0;
@@ -337,6 +340,11 @@ PageView::PageView( QWidget *parent, Okular::Document *document )
d->zoomMode = PageView::ZoomFitPage;
break;
}
+ case 3:
+ {
+ d->zoomMode = PageView::ZoomFitAuto;
+ break;
+ }
}
d->delayResizeEventTimer = new QTimer( this );
@@ -466,6 +474,10 @@ void PageView::setupViewerActions( KActionCollection * ac )
ac->addAction("view_fit_to_page", d->aZoomFitPage );
connect( d->aZoomFitPage, SIGNAL(toggled(bool)), SLOT(slotFitToPageToggled(bool)) );
+ d->aZoomAutoFit = new KToggleAction(KIcon( "zoom-fit-best" ), i18n("&Auto Fit"), this);
+ ac->addAction("view_auto_fit", d->aZoomAutoFit );
+ connect( d->aZoomAutoFit, SIGNAL(toggled(bool)), SLOT(slotAutoFitToggled(bool)) );
+
// View-Layout actions
d->aViewMode = new KActionMenu( KIcon( "view-split-left-right" ), i18n( "&View Mode" ), this );
d->aViewMode->setDelayed( false );
@@ -638,6 +650,7 @@ void PageView::fitPageWidth( int page )
Okular::Settings::setViewMode( 0 );
d->aZoomFitWidth->setChecked( true );
d->aZoomFitPage->setChecked( false );
+ d->aZoomAutoFit->setChecked( false );
d->aViewMode->menu()->actions().at( 0 )->setChecked( true );
viewport()->setUpdatesEnabled( false );
slotRelayoutPages();
@@ -1606,7 +1619,7 @@ void PageView::resizeEvent( QResizeEvent *e )
return;
}
- if ( d->zoomMode == ZoomFitWidth && d->verticalScrollBarVisible && !verticalScrollBar()->isVisible() && qAbs(e->oldSize().height() - e->size().height()) < verticalScrollBar()->width() )
+ if ( ( d->zoomMode == ZoomFitWidth || d->zoomMode == ZoomFitAuto ) && d->verticalScrollBarVisible && !verticalScrollBar()->isVisible() && qAbs(e->oldSize().height() - e->size().height()) < verticalScrollBar()->width() )
{
// this saves us from infinite resizing loop because of scrollbars appearing and disappearing
// see bug 160628 for more info
@@ -1616,10 +1629,20 @@ void PageView::resizeEvent( QResizeEvent *e )
resizeContentArea( e->size() );
return;
}
+ else if ( d->zoomMode == ZoomFitAuto && d->horizontalScrollBarVisible && !horizontalScrollBar()->isVisible() && qAbs(e->oldSize().width() - e->size().width()) < horizontalScrollBar()->height() )
+ {
+ // this saves us from infinite resizing loop because of scrollbars appearing and disappearing
+ // TODO looks are still a bit ugly because things are left uncentered
+ // but better a bit ugly than unusable
+ d->horizontalScrollBarVisible = false;
+ resizeContentArea( e->size() );
+ return;
+ }
// start a timer that will refresh the pixmap after 0.2s
d->delayResizeEventTimer->start( 200 );
d->verticalScrollBarVisible = verticalScrollBar()->isVisible();
+ d->horizontalScrollBarVisible = horizontalScrollBar()->isVisible();
}
void PageView::keyPressEvent( QKeyEvent * e )
@@ -3283,7 +3306,7 @@ void PageView::updateItemSize( PageViewItem * item, int colWidth, int rowHeight
// Expand the crop slightly beyond the bounding box
static const double cropExpandRatio = 0.04;
- double cropExpand = cropExpandRatio * ( (crop.right-crop.left) + (crop.bottom-crop.top) ) / 2;
+ const double cropExpand = cropExpandRatio * ( (crop.right-crop.left) + (crop.bottom-crop.top) ) / 2;
crop = Okular::NormalizedRect(
crop.left - cropExpand,
crop.top - cropExpand,
@@ -3297,13 +3320,13 @@ void PageView::updateItemSize( PageViewItem * item, int colWidth, int rowHeight
static const double minCropRatio = 0.5;
if ( ( crop.right - crop.left ) < minCropRatio )
{
- double newLeft = ( crop.left + crop.right ) / 2 - minCropRatio/2;
+ const double newLeft = ( crop.left + crop.right ) / 2 - minCropRatio/2;
crop.left = qMax( 0.0, qMin( 1.0 - minCropRatio, newLeft ) );
crop.right = crop.left + minCropRatio;
}
if ( ( crop.bottom - crop.top ) < minCropRatio )
{
- double newTop = ( crop.top + crop.bottom ) / 2 - minCropRatio/2;
+ const double newTop = ( crop.top + crop.bottom ) / 2 - minCropRatio/2;
crop.top = qMax( 0.0, qMin( 1.0 - minCropRatio, newTop ) );
crop.bottom = crop.top + minCropRatio;
}
@@ -3331,12 +3354,40 @@ void PageView::updateItemSize( PageViewItem * item, int colWidth, int rowHeight
}
else if ( d->zoomMode == ZoomFitPage )
{
- double scaleW = (double)colWidth / (double)width;
- double scaleH = (double)rowHeight / (double)height;
+ const double scaleW = (double)colWidth / (double)width;
+ const double scaleH = (double)rowHeight / (double)height;
zoom = qMin( scaleW, scaleH );
item->setWHZC( (int)(zoom * width), (int)(zoom * height), zoom, crop );
d->zoomFactor = zoom;
}
+ else if ( d->zoomMode == ZoomFitAuto )
+ {
+ const double aspectRatioRelation = 1.25; // relation between aspect ratios for "auto fit"
+ const double uiAspect = (double)rowHeight / (double)colWidth;
+ const double pageAspect = (double)height / (double)width;
+ const double rel = uiAspect / pageAspect;
+
+ const bool isContinuous = Okular::Settings::viewContinuous();
+ if ( !isContinuous && rel > aspectRatioRelation )
+ {
+ // UI space is relatively much higher than the page
+ zoom = (double)rowHeight / (double)height;
+ }
+ else if ( rel < 1.0 / aspectRatioRelation )
+ {
+ // UI space is relatively much wider than the page in relation
+ zoom = (double)colWidth / (double)width;
+ }
+ else
+ {
+ // aspect ratios of page and UI space are very similar
+ const double scaleW = (double)colWidth / (double)width;
+ const double scaleH = (double)rowHeight / (double)height;
+ zoom = qMin( scaleW, scaleH );
+ }
+ item->setWHZC( (int)(zoom * width), (int)(zoom * height), zoom, crop );
+ d->zoomFactor = zoom;
+ }
#ifndef NDEBUG
else
kDebug() << "calling updateItemSize with unrecognized d->zoomMode!";
@@ -3520,6 +3571,8 @@ void PageView::updateZoom( ZoomMode newZoomMode )
newZoomMode = ZoomFitWidth;
else if ( d->aZoom->currentItem() == 1 )
newZoomMode = ZoomFitPage;
+ else if ( d->aZoom->currentItem() == 2 )
+ newZoomMode = ZoomFitAuto;
}
float newFactor = d->zoomFactor;
@@ -3547,6 +3600,9 @@ void PageView::updateZoom( ZoomMode newZoomMode )
case ZoomFitPage:
checkedZoomAction = d->aZoomFitPage;
break;
+ case ZoomFitAuto:
+ checkedZoomAction = d->aZoomAutoFit;
+ break;
case ZoomRefreshCurrent:
newZoomMode = ZoomFixed;
d->zoomFactor = -1;
@@ -3577,6 +3633,7 @@ void PageView::updateZoom( ZoomMode newZoomMode )
{
d->aZoomFitWidth->setChecked( checkedZoomAction == d->aZoomFitWidth );
d->aZoomFitPage->setChecked( checkedZoomAction == d->aZoomFitPage );
+ d->aZoomAutoFit->setChecked( checkedZoomAction == d->aZoomAutoFit );
}
}
else if ( newZoomMode == ZoomFixed && newFactor == d->zoomFactor )
@@ -3596,12 +3653,12 @@ void PageView::updateZoomText()
// add items that describe fit actions
QStringList translated;
- translated << i18n("Fit Width") << i18n("Fit Page");
+ translated << i18n("Fit Width") << i18n("Fit Page") << i18n("Auto Fit");
// add percent items
QString double_oh( "00" );
const float zoomValue[13] = { 0.12, 0.25, 0.33, 0.50, 0.66, 0.75, 1.00, 1.25, 1.50, 2.00, 4.00, 8.00, 16.00 };
- int idx = 0, selIdx = 2;
+ int idx = 0, selIdx = 3;
bool inserted = false; //use: "d->zoomMode != ZoomFixed" to hide Fit/* zoom ratio
int zoomValueCount = 11;
if ( d->document->supportsTiles() )
@@ -3631,6 +3688,8 @@ void PageView::updateZoomText()
selIdx = 0;
else if ( d->zoomMode == ZoomFitPage )
selIdx = 1;
+ else if ( d->zoomMode == ZoomFitAuto )
+ selIdx = 2;
// we have to temporarily enable the actions as otherwise we can't set a new current item
d->aZoom->setEnabled( true );
d->aZoom->selectableActionGroup()->setEnabled( true );
@@ -4391,6 +4450,11 @@ void PageView::slotFitToPageToggled( bool on )
if ( on ) updateZoom( ZoomFitPage );
}
+void PageView::slotAutoFitToggled( bool on )
+{
+ if ( on ) updateZoom( ZoomFitAuto );
+}
+
void PageView::slotViewMode( QAction *action )
{
const int nr = action->data().toInt();
diff --git a/ui/pageview.h b/ui/pageview.h
index 5484cc5..fd4e3ac 100644
--- a/ui/pageview.h
+++ b/ui/pageview.h
@@ -58,7 +58,7 @@ Q_OBJECT
~PageView();
// Zoom mode ( last 3 are internally used only! )
- enum ZoomMode { ZoomFixed = 0, ZoomFitWidth = 1, ZoomFitPage = 2,
+ enum ZoomMode { ZoomFixed = 0, ZoomFitWidth = 1, ZoomFitPage = 2, ZoomFitAuto = 3,
ZoomIn, ZoomOut, ZoomRefreshCurrent };
enum ClearMode { ClearAllSelection, ClearOnlyDividers };
@@ -233,6 +233,7 @@ Q_OBJECT
void slotZoomOut();
void slotFitToWidthToggled( bool );
void slotFitToPageToggled( bool );
+ void slotAutoFitToggled( bool );
void slotViewMode( QAction *action );
void slotContinuousToggled( bool );
void slotSetMouseNormal();
More information about the kde-doc-english
mailing list