333
355
void MainWindow::on_tabWidget_currentChanged(int index)
357
const bool hasCurrent = index != -1;
359
m_openContainingFolderAction->setEnabled(hasCurrent);
360
m_refreshAction->setEnabled(hasCurrent);
361
m_printAction->setEnabled(hasCurrent);
363
m_previousPageAction->setEnabled(hasCurrent);
364
m_nextPageAction->setEnabled(hasCurrent);
365
m_firstPageAction->setEnabled(hasCurrent);
366
m_lastPageAction->setEnabled(hasCurrent);
368
m_setFirstPageAction->setEnabled(hasCurrent);
370
m_jumpToPageAction->setEnabled(hasCurrent);
372
m_searchAction->setEnabled(hasCurrent);
374
m_copyToClipboardModeAction->setEnabled(hasCurrent);
375
m_addAnnotationModeAction->setEnabled(hasCurrent);
377
m_continuousModeAction->setEnabled(hasCurrent);
378
m_twoPagesModeAction->setEnabled(hasCurrent);
379
m_twoPagesWithCoverPageModeAction->setEnabled(hasCurrent);
380
m_multiplePagesModeAction->setEnabled(hasCurrent);
381
m_rightToLeftModeAction->setEnabled(hasCurrent);
383
m_zoomInAction->setEnabled(hasCurrent);
384
m_zoomOutAction->setEnabled(hasCurrent);
385
m_originalSizeAction->setEnabled(hasCurrent);
386
m_fitToPageWidthModeAction->setEnabled(hasCurrent);
387
m_fitToPageSizeModeAction->setEnabled(hasCurrent);
389
m_rotateLeftAction->setEnabled(hasCurrent);
390
m_rotateRightAction->setEnabled(hasCurrent);
392
m_invertColorsAction->setEnabled(hasCurrent);
394
m_fontsAction->setEnabled(hasCurrent);
396
m_presentationAction->setEnabled(hasCurrent);
398
m_previousTabAction->setEnabled(hasCurrent);
399
m_nextTabAction->setEnabled(hasCurrent);
400
m_closeTabAction->setEnabled(hasCurrent);
401
m_closeAllTabsAction->setEnabled(hasCurrent);
402
m_closeAllTabsButCurrentTabAction->setEnabled(hasCurrent);
404
m_previousBookmarkAction->setEnabled(hasCurrent);
405
m_nextBookmarkAction->setEnabled(hasCurrent);
406
m_addBookmarkAction->setEnabled(hasCurrent);
407
m_removeBookmarkAction->setEnabled(hasCurrent);
409
m_currentPageSpinBox->setEnabled(hasCurrent);
410
m_scaleFactorComboBox->setEnabled(hasCurrent);
411
m_searchLineEdit->setEnabled(hasCurrent);
412
m_matchCaseCheckBox->setEnabled(hasCurrent);
413
m_highlightAllCheckBox->setEnabled(hasCurrent);
337
m_openContainingFolderAction->setEnabled(true);
338
m_refreshAction->setEnabled(true);
339
417
m_saveCopyAction->setEnabled(currentTab()->canSave());
340
418
m_saveAsAction->setEnabled(currentTab()->canSave());
341
m_printAction->setEnabled(true);
343
m_previousPageAction->setEnabled(true);
344
m_nextPageAction->setEnabled(true);
345
m_firstPageAction->setEnabled(true);
346
m_lastPageAction->setEnabled(true);
348
m_jumpToPageAction->setEnabled(true);
350
m_searchAction->setEnabled(true);
352
m_copyToClipboardModeAction->setEnabled(true);
353
m_addAnnotationModeAction->setEnabled(true);
355
m_continuousModeAction->setEnabled(true);
356
m_twoPagesModeAction->setEnabled(true);
357
m_twoPagesWithCoverPageModeAction->setEnabled(true);
358
m_multiplePagesModeAction->setEnabled(true);
359
m_rightToLeftModeAction->setEnabled(true);
361
m_zoomInAction->setEnabled(true);
362
m_zoomOutAction->setEnabled(true);
363
m_originalSizeAction->setEnabled(true);
364
m_fitToPageWidthModeAction->setEnabled(true);
365
m_fitToPageSizeModeAction->setEnabled(true);
367
m_rotateLeftAction->setEnabled(true);
368
m_rotateRightAction->setEnabled(true);
370
m_invertColorsAction->setEnabled(true);
372
m_fontsAction->setEnabled(true);
374
m_presentationAction->setEnabled(true);
376
m_previousTabAction->setEnabled(true);
377
m_nextTabAction->setEnabled(true);
378
m_closeTabAction->setEnabled(true);
379
m_closeAllTabsAction->setEnabled(true);
380
m_closeAllTabsButCurrentTabAction->setEnabled(true);
382
m_previousBookmarkAction->setEnabled(true);
383
m_nextBookmarkAction->setEnabled(true);
384
m_addBookmarkAction->setEnabled(true);
385
m_removeBookmarkAction->setEnabled(true);
387
m_currentPageSpinBox->setEnabled(true);
388
m_scaleFactorComboBox->setEnabled(true);
389
m_searchLineEdit->setEnabled(true);
390
m_matchCaseCheckBox->setEnabled(true);
391
m_highlightAllCheckBox->setEnabled(true);
393
420
if(m_searchDock->isVisible())
424
m_openContainingFolderAction->setEnabled(false);
425
m_refreshAction->setEnabled(false);
426
452
m_saveCopyAction->setEnabled(false);
427
453
m_saveAsAction->setEnabled(false);
428
m_printAction->setEnabled(false);
430
m_previousPageAction->setEnabled(false);
431
m_nextPageAction->setEnabled(false);
432
m_firstPageAction->setEnabled(false);
433
m_lastPageAction->setEnabled(false);
435
m_jumpToPageAction->setEnabled(false);
437
m_jumpBackwardAction->setEnabled(false);
438
m_jumpForwardAction->setEnabled(false);
440
m_searchAction->setEnabled(false);
442
m_copyToClipboardModeAction->setEnabled(false);
443
m_addAnnotationModeAction->setEnabled(false);
445
m_continuousModeAction->setEnabled(false);
446
m_twoPagesModeAction->setEnabled(false);
447
m_twoPagesWithCoverPageModeAction->setEnabled(false);
448
m_multiplePagesModeAction->setEnabled(false);
449
m_rightToLeftModeAction->setEnabled(false);
451
m_zoomInAction->setEnabled(false);
452
m_zoomOutAction->setEnabled(false);
453
m_originalSizeAction->setEnabled(false);
454
m_fitToPageWidthModeAction->setEnabled(false);
455
m_fitToPageSizeModeAction->setEnabled(false);
457
m_rotateLeftAction->setEnabled(false);
458
m_rotateRightAction->setEnabled(false);
460
m_invertColorsAction->setEnabled(false);
462
m_fontsAction->setEnabled(false);
464
m_presentationAction->setEnabled(false);
466
m_previousTabAction->setEnabled(false);
467
m_nextTabAction->setEnabled(false);
468
m_closeTabAction->setEnabled(false);
469
m_closeAllTabsAction->setEnabled(false);
470
m_closeAllTabsButCurrentTabAction->setEnabled(false);
472
m_previousBookmarkAction->setEnabled(false);
473
m_nextBookmarkAction->setEnabled(false);
474
m_addBookmarkAction->setEnabled(false);
475
m_removeBookmarkAction->setEnabled(false);
477
m_currentPageSpinBox->setEnabled(false);
478
m_scaleFactorComboBox->setEnabled(false);
479
m_searchLineEdit->setEnabled(false);
480
m_matchCaseCheckBox->setEnabled(false);
481
m_highlightAllCheckBox->setEnabled(false);
483
455
if(m_searchDock->isVisible())
608
579
if(senderIsCurrentTab())
610
581
setWindowTitleForCurrentTab();
614
if(m_outlineView->header()->count() > 0)
616
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
618
m_outlineView->header()->setSectionResizeMode(0, QHeaderView::Stretch);
622
m_outlineView->header()->setResizeMode(0, QHeaderView::Stretch);
627
if(m_outlineView->header()->count() > 1)
629
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
631
m_outlineView->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
635
m_outlineView->header()->setResizeMode(1, QHeaderView::ResizeToContents);
640
m_outlineView->header()->setMinimumSectionSize(0);
641
m_outlineView->header()->setStretchLastSection(false);
642
m_outlineView->header()->setVisible(false);
646
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
648
m_propertiesView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
649
m_propertiesView->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
653
m_propertiesView->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
654
m_propertiesView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
658
m_propertiesView->horizontalHeader()->setVisible(false);
659
m_propertiesView->verticalHeader()->setVisible(false);
1068
1020
currentTab()->lastPage();
1023
void MainWindow::on_setFirstPage_triggered()
1026
const int pageNumber = getMappedNumber(this, SLOT(currentPage_textFromValue(int,bool*)), SLOT(currentPage_valueFromText(QString,bool*)),
1027
this, tr("Set first page"), tr("Select the first page of the body matter:"),
1028
currentTab()->currentPage(), 1, currentTab()->numberOfPages(), &ok);
1032
currentTab()->setFirstPage(pageNumber);
1071
1036
void MainWindow::on_jumpToPage_triggered()
1073
1038
bool ok = false;
1074
const int page = QInputDialog::getInt(this, tr("Jump to page"), tr("Page:"), currentTab()->currentPage(), 1, currentTab()->numberOfPages(), 1, &ok);
1039
const int pageNumber = getMappedNumber(this, SLOT(currentPage_textFromValue(int,bool*)), SLOT(currentPage_valueFromText(QString,bool*)),
1040
this, tr("Jump to page"), tr("Page:"),
1041
currentTab()->currentPage(), 1, currentTab()->numberOfPages(), &ok);
1078
currentTab()->jumpToPage(page);
1045
currentTab()->jumpToPage(pageNumber);
1442
1411
void MainWindow::on_addBookmark_triggered()
1445
const QString label = QInputDialog::getText(this, tr("Add bookmark"), tr("Label"), QLineEdit::Normal, tr("Jump to page %1").arg(currentTab()->currentPage()), &ok);
1452
BookmarkMenu* bookmark = bookmarkForCurrentTab();
1456
bookmark->addJumpToPageAction(currentTab()->currentPage(), label);
1460
bookmark = new BookmarkMenu(currentTab()->fileInfo(), this);
1462
bookmark->addJumpToPageAction(currentTab()->currentPage(), label);
1464
connect(bookmark, SIGNAL(openTriggered(QString)), SLOT(on_bookmark_openTriggered(QString)));
1465
connect(bookmark, SIGNAL(openInNewTabTriggered(QString)), SLOT(on_bookmark_openInNewTabTriggered(QString)));
1466
connect(bookmark, SIGNAL(jumpToPageTriggered(QString,int)), SLOT(on_bookmark_jumpToPageTriggered(QString,int)));
1468
m_bookmarksMenu->addMenu(bookmark);
1413
const QString& currentPageLabel = s_settings->mainWindow().usePageLabel() || currentTab()->hasFrontMatter()
1414
? currentTab()->pageLabelFromNumber(currentTab()->currentPage())
1415
: currentTab()->defaultPageLabelFromNumber(currentTab()->currentPage());
1417
BookmarkItem bookmark(currentTab()->currentPage(), tr("Jump to page %1").arg(currentPageLabel));
1419
BookmarkModel* model = bookmarkModelForCurrentTab(false);
1423
model->findBookmark(bookmark);
1426
QScopedPointer< BookmarkDialog > dialog(new BookmarkDialog(bookmark, this));
1428
if(dialog->exec() == QDialog::Accepted)
1432
model = bookmarkModelForCurrentTab(true);
1434
m_bookmarksView->setModel(model);
1437
model->addBookmark(bookmark);
1439
m_bookmarksMenuIsDirty = true;
1440
scheduleSaveBookmarks();
1472
1444
void MainWindow::on_removeBookmark_triggered()
1474
BookmarkMenu* bookmark = bookmarkForCurrentTab();
1446
BookmarkModel* model = bookmarkModelForCurrentTab();
1478
bookmark->removeJumpToPageAction(currentTab()->currentPage());
1450
model->removeBookmark(BookmarkItem(currentTab()->currentPage()));
1452
if(model->isEmpty())
1454
m_bookmarksView->setModel(0);
1456
BookmarkModel::forgetPath(currentTab()->fileInfo().absoluteFilePath());
1459
m_bookmarksMenuIsDirty = true;
1460
scheduleSaveBookmarks();
1482
1464
void MainWindow::on_removeAllBookmarks_triggered()
1484
foreach(const QAction* action, m_bookmarksMenu->actions())
1486
BookmarkMenu* bookmark = qobject_cast< BookmarkMenu* >(action->menu());
1466
m_bookmarksView->setModel(0);
1468
BookmarkModel::forgetAllPaths();
1470
m_bookmarksMenuIsDirty = true;
1471
scheduleSaveBookmarks();
1474
void MainWindow::on_bookmarksMenu_aboutToShow()
1476
if(!m_bookmarksMenuIsDirty)
1481
m_bookmarksMenuIsDirty = false;
1484
m_bookmarksMenu->clear();
1486
m_bookmarksMenu->addActions(QList< QAction* >() << m_previousBookmarkAction << m_nextBookmarkAction);
1487
m_bookmarksMenu->addSeparator();
1488
m_bookmarksMenu->addActions(QList< QAction* >() << m_addBookmarkAction << m_removeBookmarkAction << m_removeAllBookmarksAction);
1489
m_bookmarksMenu->addSeparator();
1491
foreach(const QString& absoluteFilePath, BookmarkModel::knownPaths())
1493
const BookmarkModel* model = BookmarkModel::fromPath(absoluteFilePath);
1495
BookmarkMenu* menu = new BookmarkMenu(QFileInfo(absoluteFilePath), m_bookmarksMenu);
1497
for(int row = 0, rowCount = model->rowCount(); row < rowCount; ++row)
1499
const QModelIndex index = model->index(row);
1501
menu->addJumpToPageAction(index.data(BookmarkModel::PageRole).toInt(), index.data(BookmarkModel::LabelRole).toString());
1504
connect(menu, SIGNAL(openTriggered(QString)), SLOT(on_bookmark_openTriggered(QString)));
1505
connect(menu, SIGNAL(openInNewTabTriggered(QString)), SLOT(on_bookmark_openInNewTabTriggered(QString)));
1506
connect(menu, SIGNAL(jumpToPageTriggered(QString,int)), SLOT(on_bookmark_jumpToPageTriggered(QString,int)));
1507
connect(menu, SIGNAL(removeBookmarkTriggered(QString)), SLOT(on_bookmark_removeBookmarkTriggered(QString)));
1509
m_bookmarksMenu->addMenu(menu);
1514
1532
jumpToPageOrOpenInNewTab(absoluteFilePath, page);
1535
void MainWindow::on_bookmark_removeBookmarkTriggered(const QString& absoluteFilePath)
1537
BookmarkModel* model = BookmarkModel::fromPath(absoluteFilePath);
1539
if(model == m_bookmarksView->model())
1541
m_bookmarksView->setModel(0);
1544
BookmarkModel::forgetPath(absoluteFilePath);
1546
m_bookmarksMenuIsDirty = true;
1547
scheduleSaveBookmarks();
1517
1550
void MainWindow::on_contents_triggered()
1519
QScopedPointer< HelpDialog > dialog(new HelpDialog(this));
1521
dialog->resize(s_settings->mainWindow().contentsDialogSize(dialog->sizeHint()));
1523
s_settings->mainWindow().setContentsDialogSize(dialog->size());
1552
if(m_helpDialog.isNull())
1554
m_helpDialog = new HelpDialog();
1556
m_helpDialog->show();
1557
m_helpDialog->setAttribute(Qt::WA_DeleteOnClose);
1559
connect(this, SIGNAL(destroyed()), m_helpDialog, SLOT(close()));
1562
m_helpDialog->raise();
1563
m_helpDialog->activateWindow();
1526
1566
void MainWindow::on_about_triggered()
1528
1568
QMessageBox::about(this, tr("About qpdfview"), (tr("<p><b>qpdfview %1</b></p><p>qpdfview is a tabbed document viewer using Qt.</p>"
1529
1569
"<p>This version includes:"
1570
"<ul>").arg(APPLICATION_VERSION)
1531
1571
#ifdef WITH_PDF
1532
+ tr("<li>PDF support using Poppler</li>")
1572
+ tr("<li>PDF support using Poppler %1</li>").arg(POPPLER_VERSION)
1533
1573
#endif // WITH_PDF
1535
+ tr("<li>PS support using libspectre</li>")
1575
+ tr("<li>PS support using libspectre %1</li>").arg(LIBSPECTRE_VERSION)
1536
1576
#endif // WITH_PS
1537
1577
#ifdef WITH_DJVU
1538
+ tr("<li>DjVu support using DjVuLibre</li>")
1578
+ tr("<li>DjVu support using DjVuLibre %1</li>").arg(DJVULIBRE_VERSION)
1539
1579
#endif // WITH_DJVU
1540
1580
#ifdef WITH_FITZ
1541
+ tr("<li>PDF support using Fitz</li>")
1581
+ tr("<li>PDF support using Fitz %1</li>").arg(FITZ_VERSION)
1542
1582
#endif // WITH_FITZ
1543
1583
#ifdef WITH_CUPS
1544
+ tr("<li>Printing support using CUPS</li>")
1584
+ tr("<li>Printing support using CUPS %1</li>").arg(CUPS_VERSION)
1545
1585
#endif // WITH_CUPS
1547
"<p>See <a href=\"https://launchpad.net/qpdfview\">launchpad.net/qpdfview</a> for more information.</p><p>© 2012-2014 The qpdfview developers</p>")).arg(QApplication::applicationVersion()));
1587
"<p>See <a href=\"https://launchpad.net/qpdfview\">launchpad.net/qpdfview</a> for more information.</p><p>© 2012-2014 The qpdfview developers</p>")));
1590
QString MainWindow::currentPage_textFromValue(int value, bool* ok) const
1592
if(currentTab() == 0 || !(s_settings->mainWindow().usePageLabel() || currentTab()->hasFrontMatter()))
1599
return currentTab()->pageLabelFromNumber(value);
1602
int MainWindow::currentPage_valueFromText(QString text, bool* ok) const
1604
if(currentTab() == 0 || !(s_settings->mainWindow().usePageLabel() || currentTab()->hasFrontMatter()))
1610
const QString& prefix = m_currentPageSpinBox->prefix();
1611
const QString& suffix = m_currentPageSpinBox->suffix();
1614
int size = text.size();
1616
if(!prefix.isEmpty() && text.startsWith(prefix))
1618
from += prefix.size();
1622
if(!suffix.isEmpty() && text.endsWith(suffix))
1624
size -= suffix.size();
1627
text = text.mid(from, size).trimmed();
1630
return currentTab()->pageNumberFromLabel(text);
1550
1633
void MainWindow::on_focusCurrentPage_activated()
1559
1642
m_scaleFactorComboBox->lineEdit()->selectAll();
1645
void MainWindow::on_toggleToolBars_triggered(bool checked)
1649
m_tabWidget->setTabBarPolicy(static_cast< TabWidget::TabBarPolicy >(m_tabBarHadPolicy));
1651
m_fileToolBar->setVisible(m_fileToolBarWasVisible);
1652
m_editToolBar->setVisible(m_editToolBarWasVisible);
1653
m_viewToolBar->setVisible(m_viewToolBarWasVisible);
1657
m_tabBarHadPolicy = static_cast< int >(m_tabWidget->tabBarPolicy());
1659
m_fileToolBarWasVisible = m_fileToolBar->isVisible();
1660
m_editToolBarWasVisible = m_editToolBar->isVisible();
1661
m_viewToolBarWasVisible = m_viewToolBar->isVisible();
1663
m_tabWidget->setTabBarPolicy(TabWidget::TabBarAlwaysOff);
1665
m_fileToolBar->setVisible(false);
1666
m_editToolBar->setVisible(false);
1667
m_viewToolBar->setVisible(false);
1671
void MainWindow::on_toggleMenuBar_triggered(bool checked)
1673
menuBar()->setVisible(checked);
1562
1676
void MainWindow::on_searchInitiated(const QString& text, bool allTabs)
1564
1678
if(!text.isEmpty())
1582
1696
currentTab()->setHighlightAll(checked);
1699
void MainWindow::on_outline_sectionCountChanged()
1701
if(m_outlineView->header()->count() > 0)
1703
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
1705
m_outlineView->header()->setSectionResizeMode(0, QHeaderView::Stretch);
1709
m_outlineView->header()->setResizeMode(0, QHeaderView::Stretch);
1711
#endif // QT_VERSION
1714
if(m_outlineView->header()->count() > 1)
1716
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
1718
m_outlineView->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
1722
m_outlineView->header()->setResizeMode(1, QHeaderView::ResizeToContents);
1724
#endif // QT_VERSION
1727
m_outlineView->header()->setMinimumSectionSize(0);
1728
m_outlineView->header()->setStretchLastSection(false);
1729
m_outlineView->header()->setVisible(false);
1585
1732
void MainWindow::on_outline_clicked(const QModelIndex& index)
1587
1734
bool ok = false;
1588
const int page = m_outlineView->model()->data(index, Qt::UserRole + 1).toInt(&ok);
1589
const qreal left = m_outlineView->model()->data(index, Qt::UserRole + 2).toReal();
1590
const qreal top = m_outlineView->model()->data(index, Qt::UserRole + 3).toReal();
1735
const int page = index.data(Qt::UserRole + 1).toInt(&ok);
1736
const qreal left = index.data(Qt::UserRole + 2).toReal();
1737
const qreal top = index.data(Qt::UserRole + 3).toReal();
1745
void MainWindow::on_properties_sectionCountChanged()
1747
if(m_propertiesView->horizontalHeader()->count() > 0)
1749
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
1751
m_propertiesView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
1755
m_propertiesView->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
1757
#endif // QT_VERSION
1760
if(m_propertiesView->horizontalHeader()->count() > 1)
1762
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
1764
m_propertiesView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
1768
m_propertiesView->horizontalHeader()->setResizeMode(1, QHeaderView::Stretch);
1770
#endif // QT_VERSION
1773
m_propertiesView->horizontalHeader()->setVisible(false);
1776
if(m_propertiesView->verticalHeader()->count() > 0)
1778
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
1780
m_propertiesView->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
1784
m_propertiesView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
1786
#endif // QT_VERSION
1789
m_propertiesView->verticalHeader()->setVisible(false);
1598
1792
void MainWindow::on_thumbnails_dockLocationChanged(Qt::DockWidgetArea area)
1600
1794
for(int index = 0; index < m_tabWidget->count(); ++index)
1624
void MainWindow::on_database_tabRestored(const QString& absoluteFilePath, bool continuousMode, LayoutMode layoutMode, ScaleMode scaleMode, qreal scaleFactor, Rotation rotation, int currentPage)
1818
void MainWindow::on_bookmarks_sectionCountChanged()
1820
if(m_bookmarksView->horizontalHeader()->count() > 0)
1822
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
1824
m_bookmarksView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
1828
m_bookmarksView->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
1830
#endif // QT_VERSION
1833
if(m_bookmarksView->horizontalHeader()->count() > 1)
1835
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
1837
m_bookmarksView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
1841
m_bookmarksView->horizontalHeader()->setResizeMode(1, QHeaderView::ResizeToContents);
1843
#endif // QT_VERSION
1846
m_bookmarksView->horizontalHeader()->setMinimumSectionSize(0);
1847
m_bookmarksView->horizontalHeader()->setStretchLastSection(false);
1848
m_bookmarksView->horizontalHeader()->setVisible(false);
1850
if(m_bookmarksView->verticalHeader()->count() > 0)
1852
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
1854
m_bookmarksView->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
1858
m_bookmarksView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
1860
#endif // QT_VERSION
1863
m_bookmarksView->verticalHeader()->setVisible(false);
1866
void MainWindow::on_bookmarks_clicked(const QModelIndex& index)
1869
const int page = index.data(BookmarkModel::PageRole).toInt(&ok);
1873
currentTab()->jumpToPage(page);
1877
void MainWindow::on_bookmarks_contextMenuRequested(const QPoint& pos)
1881
menu.addActions(QList< QAction* >() << m_previousBookmarkAction << m_nextBookmarkAction);
1882
menu.addSeparator();
1883
menu.addAction(m_addBookmarkAction);
1885
QAction* removeBookmarkAction = menu.addAction(tr("&Remove bookmark"));
1886
QAction* editBookmarkAction = menu.addAction(tr("&Edit bookmark"));
1888
const QModelIndex index = m_bookmarksView->indexAt(pos);
1890
removeBookmarkAction->setVisible(index.isValid());
1891
editBookmarkAction->setVisible(index.isValid());
1893
const QAction* action = menu.exec(m_bookmarksView->mapToGlobal(pos));
1895
if(action == removeBookmarkAction)
1897
BookmarkModel* model = qobject_cast< BookmarkModel* >(m_bookmarksView->model());
1901
model->removeBookmark(BookmarkItem(index.data(BookmarkModel::PageRole).toInt()));
1903
if(model->isEmpty())
1905
m_bookmarksView->setModel(0);
1907
BookmarkModel::forgetPath(currentTab()->fileInfo().absoluteFilePath());
1910
m_bookmarksMenuIsDirty = true;
1911
scheduleSaveBookmarks();
1915
else if(action == editBookmarkAction)
1917
BookmarkModel* model = qobject_cast< BookmarkModel* >(m_bookmarksView->model());
1921
BookmarkItem bookmark(index.data(BookmarkModel::PageRole).toInt());
1923
model->findBookmark(bookmark);
1925
QScopedPointer< BookmarkDialog > dialog(new BookmarkDialog(bookmark, this));
1927
if(dialog->exec() == QDialog::Accepted)
1929
model->addBookmark(bookmark);
1931
m_bookmarksMenuIsDirty = true;
1932
scheduleSaveBookmarks();
1938
void MainWindow::on_database_tabRestored(const QString& absoluteFilePath, bool continuousMode, LayoutMode layoutMode, bool rightToLeftMode, ScaleMode scaleMode, qreal scaleFactor, Rotation rotation, int currentPage)
1626
1940
if(openInNewTab(absoluteFilePath))
1628
1942
currentTab()->setContinuousMode(continuousMode);
1629
1943
currentTab()->setLayoutMode(layoutMode);
1944
currentTab()->setRightToLeftMode(rightToLeftMode);
1631
1946
currentTab()->setScaleMode(scaleMode);
1632
1947
currentTab()->setScaleFactor(scaleFactor);
1640
void MainWindow::on_database_bookmarkRestored(const QString& absoluteFilePath, const JumpList& jumps)
1642
BookmarkMenu* bookmark = new BookmarkMenu(QFileInfo(absoluteFilePath), this);
1644
foreach(const Jump jump, jumps)
1646
bookmark->addJumpToPageAction(jump.first, jump.second);
1649
connect(bookmark, SIGNAL(openTriggered(QString)), SLOT(on_bookmark_openTriggered(QString)));
1650
connect(bookmark, SIGNAL(openInNewTabTriggered(QString)), SLOT(on_bookmark_openInNewTabTriggered(QString)));
1651
connect(bookmark, SIGNAL(jumpToPageTriggered(QString,int)), SLOT(on_bookmark_jumpToPageTriggered(QString,int)));
1653
m_bookmarksMenu->addMenu(bookmark);
1656
1955
void MainWindow::on_saveDatabase_timeout()
1658
1957
if(s_settings->mainWindow().restoreTabs())
1959
s_database->saveTabs(tabs());
1663
1962
if(s_settings->mainWindow().restoreBookmarks())
1964
s_database->saveBookmarks();
1668
1967
if(s_settings->mainWindow().restorePerFileSettings())
1882
2197
setWindowTitle(tabText + QLatin1String("qpdfview") + instanceName);
1885
BookmarkMenu* MainWindow::bookmarkForCurrentTab() const
1887
foreach(QAction* action, m_bookmarksMenu->actions())
1889
BookmarkMenu* bookmark = qobject_cast< BookmarkMenu* >(action->menu());
1893
if(bookmark->absoluteFilePath() == currentTab()->fileInfo().absoluteFilePath())
2200
void MainWindow::setCurrentPageSuffixForCurrentTab()
2204
if(m_tabWidget->currentIndex() != -1)
2206
const int currentPage = currentTab()->currentPage();
2207
const int numberOfPages = currentTab()->numberOfPages();
2209
const QString& defaultPageLabel = currentTab()->defaultPageLabelFromNumber(currentPage);
2210
const QString& pageLabel = currentTab()->pageLabelFromNumber(currentPage);
2212
const QString& lastDefaultPageLabel = currentTab()->defaultPageLabelFromNumber(numberOfPages);
2214
if((s_settings->mainWindow().usePageLabel() || currentTab()->hasFrontMatter()) && defaultPageLabel != pageLabel)
2216
suffix = QString(" (%1 / %2)").arg(defaultPageLabel).arg(lastDefaultPageLabel);
2220
suffix = QString(" / %1").arg(lastDefaultPageLabel);
2225
suffix = QLatin1String(" / 1");
2228
m_currentPageSpinBox->setSuffix(suffix);
2231
BookmarkModel* MainWindow::bookmarkModelForCurrentTab(bool create)
2233
return BookmarkModel::fromPath(currentTab()->fileInfo().absoluteFilePath(), create);
1903
2236
void MainWindow::prepareDatabase()
1907
2240
s_database = Database::instance();
1910
connect(s_database, SIGNAL(tabRestored(QString,bool,LayoutMode,ScaleMode,qreal,Rotation,int)), SLOT(on_database_tabRestored(QString,bool,LayoutMode,ScaleMode,qreal,Rotation,int)));
1911
connect(s_database, SIGNAL(bookmarkRestored(QString,JumpList)), SLOT(on_database_bookmarkRestored(QString,JumpList)));
1914
s_database->restoreTabs();
1915
s_database->restoreBookmarks();
2243
connect(s_database, SIGNAL(tabRestored(QString,bool,LayoutMode,bool,ScaleMode,qreal,Rotation,int)), SLOT(on_database_tabRestored(QString,bool,LayoutMode,bool,ScaleMode,qreal,Rotation,int)));
1918
2245
m_saveDatabaseTimer = new QTimer(this);
2246
m_saveDatabaseTimer->setSingleShot(true);
2247
m_saveDatabaseTimer->setInterval(s_settings->mainWindow().saveDatabaseInterval());
1920
2249
connect(m_saveDatabaseTimer, SIGNAL(timeout()), SLOT(on_saveDatabase_timeout()));
1923
const int saveDatabaseInterval = s_settings->mainWindow().saveDatabaseInterval();
1925
if(saveDatabaseInterval > 0)
2252
void MainWindow::scheduleSaveDatabase()
2254
if(m_saveDatabaseTimer->interval() > 0 && !m_saveDatabaseTimer->isActive())
1927
m_saveDatabaseTimer->setInterval(saveDatabaseInterval);
1928
2256
m_saveDatabaseTimer->start();
1932
void MainWindow::saveTabs() const
1934
QList< const DocumentView* > tabs;
1936
for(int index = 0; index < m_tabWidget->count(); ++index)
1938
tabs.append(tab(index));
1941
s_database->saveTabs(tabs);
1944
void MainWindow::saveBookmarks() const
1946
QList< const BookmarkMenu* > bookmarks;
1948
foreach(const QAction* action, m_bookmarksMenu->actions())
1950
const BookmarkMenu* bookmark = qobject_cast< BookmarkMenu* >(action->menu());
1954
bookmarks.append(bookmark);
1958
s_database->saveBookmarks(bookmarks);
2260
void MainWindow::scheduleSaveTabs()
2262
if(s_settings->mainWindow().restoreTabs())
2264
scheduleSaveDatabase();
2268
void MainWindow::scheduleSaveBookmarks()
2270
if(s_settings->mainWindow().restoreBookmarks())
2272
scheduleSaveDatabase();
2276
void MainWindow::scheduleSavePerFileSettings()
2278
if(s_settings->mainWindow().restorePerFileSettings())
2280
scheduleSaveDatabase();
1961
2284
void MainWindow::createWidgets()
2055
2379
connect(action, SIGNAL(triggered()), member);
2061
QAction* MainWindow::createAction(const QString& text, const QString& objectName, const QString& iconName, const QKeySequence& shortcut, const char* member, bool checkable)
2387
QAction* MainWindow::createAction(const QString& text, const QString& objectName, const QString& iconName, const QKeySequence& shortcut, const char* member, bool checkable, bool checked)
2063
return createAction(text, objectName, QIcon::fromTheme(iconName, QIcon(QLatin1String(":icons/") + iconName + QLatin1String(".svg"))), shortcut, member, checkable);
2389
return createAction(text, objectName, QIcon::fromTheme(iconName, QIcon(QLatin1String(":icons/") + iconName + QLatin1String(".svg"))), shortcut, member, checkable, checked);
2066
2392
void MainWindow::createActions()
2070
2396
m_openAction = createAction(tr("&Open..."), QLatin1String("open"), QLatin1String("document-open"), QKeySequence::Open, SLOT(on_open_triggered()));
2071
2397
m_openInNewTabAction = createAction(tr("Open in new &tab..."), QLatin1String("openInNewTab"), QLatin1String("tab-new"), QKeySequence::AddTab, SLOT(on_openInNewTab_triggered()));
2072
m_openContainingFolderAction = createAction(tr("Open containing folder"), QString(), QIcon(), QKeySequence(), SLOT(on_openContainingFolder_triggered()));
2398
m_openContainingFolderAction = createAction(tr("Open containing &folder"), QLatin1String("openContainingFolder"), QLatin1String("folder"), QKeySequence(), SLOT(on_openContainingFolder_triggered()));
2073
2399
m_refreshAction = createAction(tr("&Refresh"), QLatin1String("refresh"), QLatin1String("view-refresh"), QKeySequence::Refresh, SLOT(on_refresh_triggered()));
2074
2400
m_saveCopyAction = createAction(tr("&Save copy..."), QLatin1String("saveCopy"), QLatin1String("document-save"), QKeySequence::Save, SLOT(on_saveCopy_triggered()));
2075
2401
m_saveAsAction = createAction(tr("Save &as..."), QLatin1String("saveAs"), QLatin1String("document-save-as"), QKeySequence::SaveAs, SLOT(on_saveAs_triggered()));
2083
2409
m_firstPageAction = createAction(tr("&First page"), QLatin1String("firstPage"), QLatin1String("go-first"), QKeySequence(Qt::Key_Home), SLOT(on_firstPage_triggered()));
2084
2410
m_lastPageAction = createAction(tr("&Last page"), QLatin1String("lastPage"), QLatin1String("go-last"), QKeySequence(Qt::Key_End), SLOT(on_lastPage_triggered()));
2412
m_setFirstPageAction = createAction(tr("&Set first page..."), QString(), QIcon(), QKeySequence(), SLOT(on_setFirstPage_triggered()));
2086
2414
m_jumpToPageAction = createAction(tr("&Jump to page..."), QLatin1String("jumpToPage"), QLatin1String("go-jump"), QKeySequence(Qt::CTRL + Qt::Key_J), SLOT(on_jumpToPage_triggered()));
2088
2416
m_jumpBackwardAction = createAction(tr("Jump &backward"), QLatin1String("jumpBackward"), QLatin1String("media-seek-backward"), QKeySequence(Qt::CTRL + Qt::Key_Return), SLOT(on_jumpBackward_triggered()));
2224
2554
m_outlineDock = createDock(tr("&Outline"), QLatin1String("outlineDock"), QKeySequence(Qt::Key_F6));
2226
m_outlineView = new TreeView(Qt::UserRole, this);
2556
m_outlineView = new TreeView(Qt::UserRole + 4, this);
2227
2557
m_outlineView->setAlternatingRowColors(true);
2228
2558
m_outlineView->setEditTriggers(QAbstractItemView::NoEditTriggers);
2229
2559
m_outlineView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
2230
2560
m_outlineView->setSelectionBehavior(QAbstractItemView::SelectRows);
2562
connect(m_outlineView->header(), SIGNAL(sectionCountChanged(int,int)), SLOT(on_outline_sectionCountChanged()));
2232
2563
connect(m_outlineView, SIGNAL(clicked(QModelIndex)), SLOT(on_outline_clicked(QModelIndex)));
2234
2565
m_outlineDock->setWidget(m_outlineView);
2257
2590
m_thumbnailsDock->setWidget(m_thumbnailsView);
2594
m_bookmarksDock = createDock(tr("&Bookmarks"), QLatin1String("bookmarksDock"), QKeySequence(Qt::Key_F9));
2596
m_bookmarksView = new QTableView(this);
2597
m_bookmarksView->setShowGrid(false);
2598
m_bookmarksView->setAlternatingRowColors(true);
2599
m_bookmarksView->setEditTriggers(QAbstractItemView::NoEditTriggers);
2600
m_bookmarksView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
2601
m_bookmarksView->setSelectionMode(QAbstractItemView::SingleSelection);
2602
m_bookmarksView->setSelectionBehavior(QAbstractItemView::SelectRows);
2603
m_bookmarksView->setContextMenuPolicy(Qt::CustomContextMenu);
2605
connect(m_bookmarksView->horizontalHeader(), SIGNAL(sectionCountChanged(int,int)), SLOT(on_bookmarks_sectionCountChanged()));
2606
connect(m_bookmarksView, SIGNAL(clicked(QModelIndex)), SLOT(on_bookmarks_clicked(QModelIndex)));
2607
connect(m_bookmarksView, SIGNAL(customContextMenuRequested(QPoint)), SLOT(on_bookmarks_contextMenuRequested(QPoint)));
2609
m_bookmarksDock->setWidget(m_bookmarksView);
2261
2613
m_searchDock = new QDockWidget(tr("&Search"), this);
2419
2777
mainWindow()->startSearch(text);
2422
void MainWindowAdaptor::raiseAndActivate()
2424
mainWindow()->raise();
2425
mainWindow()->activateWindow();
2780
#define ONLY_IF_CURRENT_TAB if(mainWindow()->m_tabWidget->currentIndex() == -1) { return; }
2782
void MainWindowAdaptor::previousPage()
2786
mainWindow()->on_previousPage_triggered();
2789
void MainWindowAdaptor::nextPage()
2793
mainWindow()->on_nextPage_triggered();
2796
void MainWindowAdaptor::firstPage()
2800
mainWindow()->on_firstPage_triggered();
2803
void MainWindowAdaptor::lastPage()
2807
mainWindow()->on_lastPage_triggered();
2810
void MainWindowAdaptor::previousBookmark()
2814
mainWindow()->on_previousBookmark_triggered();
2817
void MainWindowAdaptor::nextBookmark()
2821
mainWindow()->on_nextBookmark_triggered();
2824
bool MainWindowAdaptor::jumpToBookmark(const QString& label)
2826
if(mainWindow()->m_tabWidget->currentIndex() == -1) { return false; }
2828
const BookmarkModel* model = mainWindow()->bookmarkModelForCurrentTab();
2832
for(int row = 0, rowCount = model->rowCount(); row < rowCount; ++row)
2834
const QModelIndex index = model->index(row);
2836
if(label == index.data(BookmarkModel::LabelRole).toString())
2838
mainWindow()->currentTab()->jumpToPage(index.data(BookmarkModel::PageRole).toInt());
2848
void MainWindowAdaptor::continuousModeAction(bool checked)
2852
mainWindow()->on_continuousMode_triggered(checked);
2855
void MainWindowAdaptor::twoPagesModeAction(bool checked)
2859
mainWindow()->on_twoPagesMode_triggered(checked);
2862
void MainWindowAdaptor::twoPagesWithCoverPageModeAction(bool checked)
2866
mainWindow()->on_twoPagesWithCoverPageMode_triggered(checked);
2869
void MainWindowAdaptor::multiplePagesModeAction(bool checked)
2873
mainWindow()->on_multiplePagesMode_triggered(checked);
2876
void MainWindowAdaptor::fitToPageWidthModeAction(bool checked)
2880
mainWindow()->on_fitToPageWidthMode_triggered(checked);
2883
void MainWindowAdaptor::fitToPageSizeModeAction(bool checked)
2887
mainWindow()->on_fitToPageSizeMode_triggered(checked);
2890
void MainWindowAdaptor::invertColorsAction(bool checked)
2894
mainWindow()->on_invertColors_triggered(checked);
2897
void MainWindowAdaptor::fullscreenAction(bool checked)
2899
if(mainWindow()->m_fullscreenAction->isChecked() != checked)
2901
mainWindow()->m_fullscreenAction->trigger();
2905
void MainWindowAdaptor::presentationAction()
2909
mainWindow()->on_presentation_triggered();
2912
void MainWindowAdaptor::closeTab()
2916
mainWindow()->on_closeTab_triggered();
2919
void MainWindowAdaptor::closeAllTabs()
2921
mainWindow()->on_closeAllTabs_triggered();
2924
void MainWindowAdaptor::closeAllTabsButCurrentTab()
2926
mainWindow()->on_closeAllTabsButCurrentTab_triggered();
2929
bool MainWindowAdaptor::closeTab(const QString& absoluteFilePath)
2931
if(mainWindow()->m_tabWidget->currentIndex() == -1) { return false; }
2933
const QFileInfo fileInfo(absoluteFilePath);
2935
foreach(DocumentView* tab, mainWindow()->tabs())
2937
if(tab->fileInfo() == fileInfo)
2939
if(mainWindow()->saveModifications(tab))
2941
mainWindow()->closeTab(tab);
2428
2951
MainWindow* MainWindowAdaptor::mainWindow() const