Fix forward navigation control on Linux.
[dorian] / adopterwindow.cpp
index 5e9ef64..b60b61a 100644 (file)
 #include "progress.h"
 #include "translucentbutton.h"
 
-AdopterWindow::AdopterWindow(QWidget *parent):
-    QMainWindow(parent), bookView(0), grabbingVolumeKeys(false), toolBar(0),
-    progress(0), previousButton(0), nextButton(0)
+AdopterWindow::AdopterWindow(QWidget *parent): MainBase(parent), bookView(0),
+    grabbingVolumeKeys(false), progress(0), previousButton(0), nextButton(0)
 {
     TRACE;
 
-#ifdef Q_WS_MAEMO_5
-    setAttribute(Qt::WA_Maemo5StackedWindow, true);
-#endif
-
-    QFrame *frame = new QFrame(this);
-    QVBoxLayout *layout = new QVBoxLayout(frame);
-    layout->setMargin(0);
-    frame->setLayout(layout);
-    //frame->show();
-    setCentralWidget(frame);
-
-#ifdef Q_OS_SYMBIAN
-    QAction *closeAction = new QAction(parent? tr("Back"): tr("Exit"), this);
-    closeAction->setSoftKeyRole(QAction::NegativeSoftKey);
-    connect(closeAction, SIGNAL(triggered()), this, SLOT(close()));
-    QMainWindow::addAction(closeAction);
-#else
-    // Tool bar
-    setUnifiedTitleAndToolBarOnMac(true);
-    toolBar = addToolBar("");
-    toolBar->setMovable(false);
-    toolBar->setFloatable(false);
-    toolBar->toggleViewAction()->setVisible(false);
-#if defined(Q_WS_X11) && !defined(Q_WS_MAEMO_5)
-    toolBar->setIconSize(QSize(42, 42));
-#endif
-#endif // Q_OS_SYMBIAN
-
-    // Monitor settings
+    // Monitor settings changes
     connect(Settings::instance(), SIGNAL(valueChanged(const QString &)),
             this, SLOT(onSettingsChanged(const QString &)));
+
 }
 
 void AdopterWindow::takeBookView(BookView *view,
@@ -66,12 +38,14 @@ void AdopterWindow::takeBookView(BookView *view,
     Q_ASSERT(previous);
     Q_ASSERT(next);
 
-    leaveBookView();
+    if (bookView) {
+        return;
+    }
 
     bookView = view;
     bookView->setParent(this);
     centralWidget()->layout()->addWidget(bookView);
-    bookView->show();
+    // bookView->show();
 
     progress = prog;
     previousButton = previous;
@@ -79,19 +53,30 @@ void AdopterWindow::takeBookView(BookView *view,
     progress->setParent(this);
     previousButton->setParent(this);
     nextButton->setParent(this);
+
+    // Handle page and/or volume keys
+    connect(this, SIGNAL(pageUp()), this, SLOT(onPageUp()),
+            Qt::QueuedConnection);
+    connect(this, SIGNAL(pageDown()), this, SLOT(onPageDown()),
+            Qt::QueuedConnection);
 }
 
 void AdopterWindow::leaveBookView()
 {
     TRACE;
-    if (bookView) {
-        bookView->hide();
-        centralWidget()->layout()->removeWidget(bookView);
+
+    if (!bookView) {
+        return;
     }
+
+    // bookView->hide();
+    centralWidget()->layout()->removeWidget(bookView);
     bookView = 0;
     progress = 0;
     nextButton = 0;
     previousButton = 0;
+    disconnect(this, SLOT(onPageUp()));
+    disconnect(this, SLOT(onPageDown()));
 }
 
 bool AdopterWindow::hasBookView()
@@ -99,76 +84,6 @@ bool AdopterWindow::hasBookView()
     return bookView != 0;
 }
 
-void AdopterWindow::show()
-{
-    Trace t("AdopterWindow::show");
-#ifdef Q_OS_SYMBIAN
-    foreach (QWidget *w, QApplication::allWidgets()) {
-        w->setContextMenuPolicy(Qt::NoContextMenu);
-    }
-    showMaximized();
-#else
-    QMainWindow::show();
-#endif
-}
-
-QAction *AdopterWindow::addToolBarAction(QObject *receiver,
-                                         const char *member,
-                                         const QString &iconName,
-                                         const QString &text,
-                                         bool important)
-{
-    TRACE;
-    qDebug() << "icon" << iconName << "text" << text;
-    QAction *action;
-#ifndef Q_OS_SYMBIAN
-    Q_UNUSED(important);
-    action = toolBar->addAction(QIcon(Platform::instance()->icon(iconName)),
-                                text, receiver, member);
-#else
-    if (!toolBar && important) {
-        // Create tool bar if needed
-        toolBar = new QToolBar("", this);
-        // toolBar->setFixedHeight(63);
-        toolBar->setStyleSheet("margin:0; border:0; padding:0");
-        toolBar->setSizePolicy(QSizePolicy::MinimumExpanding,
-                               QSizePolicy::Maximum);
-        addToolBar(Qt::BottomToolBarArea, toolBar);
-    }
-    if (important) {
-        // Add tool bar action
-        QPushButton *button = new QPushButton(this);
-        button->setIconSize(QSize(60, 60));
-        button->setFixedSize(89, 60);
-        button->setIcon(QIcon(Platform::instance()->icon(iconName)));
-        button->setSizePolicy(QSizePolicy::MinimumExpanding,
-                              QSizePolicy::Maximum);
-        connect(button, SIGNAL(clicked()), receiver, member);
-        toolBar->addWidget(button);
-    }
-    // Add menu action, too
-    action = new QAction(text, this);
-    menuBar()->addAction(action);
-    connect(action, SIGNAL(triggered()), receiver, member);
-#endif
-
-#if defined Q_WS_MAEMO_5
-    action->setText("");
-    action->setToolTip("");
-#endif
-
-    return action;
-}
-
-void AdopterWindow::addToolBarSpace()
-{
-#ifndef Q_OS_SYMBIAN
-    QFrame *frame = new QFrame(toolBar);
-    frame->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
-    toolBar->addWidget(frame);
-#endif
-}
-
 void AdopterWindow::grabVolumeKeys(bool grab)
 {
     TRACE;
@@ -211,41 +126,11 @@ void AdopterWindow::doGrabVolumeKeys(bool grab)
 
 #endif // Q_WS_MAEMO_5
 
-#ifdef Q_OS_SYMBIAN
-
-void AdopterWindow::updateToolBar()
-{
-    TRACE;
-    if (toolBar) {
-        QRect geometry = QApplication::desktop()->geometry();
-        bool isPortrait = geometry.width() < geometry.height();
-        bool isToolBarHidden = toolBar->isHidden();
-        if (isPortrait && isToolBarHidden) {
-            qDebug() << "Show tool bar";
-            toolBar->setVisible(true);
-        } else if (!isPortrait && !isToolBarHidden) {
-            qDebug() << "Hide tool bar";
-            toolBar->setVisible(false);
-        }
-    }
-}
-
-bool AdopterWindow::portrait()
-{
-    QRect geometry = QApplication::desktop()->geometry();
-    return geometry.width() < geometry.height();
-}
-
-#endif // Q_OS_SYMBIAN
-
-void AdopterWindow::showEvent(QShowEvent *e)
+void AdopterWindow::showEvent(QShowEvent *event)
 {
     Trace t("AdopterWindow::showEvent");
 
-#ifdef Q_OS_SYMBIAN
-    updateToolBar();
-#endif
-    QMainWindow::showEvent(e);
+    MainBase::showEvent(event);
 #if defined(Q_WS_MAEMO_5)
     doGrabVolumeKeys(grabbingVolumeKeys);
 #endif
@@ -255,43 +140,59 @@ void AdopterWindow::showEvent(QShowEvent *e)
 void AdopterWindow::resizeEvent(QResizeEvent *event)
 {
     Trace t("AdopterWindow::resizeEvent");
-#ifdef Q_OS_SYMBIAN
-    updateToolBar();
-#endif
-    QMainWindow::resizeEvent(event);
+
+    MainBase::resizeEvent(event);
     placeDecorations();
+#if defined(Q_WS_MAEMO_5) || defined(Q_OS_SYMBIAN)
+    // Restore previous reading position
+    if (bookView) {
+        bookView->scheduleRestoreLastBookmark();
+    }
+#endif // defined(Q_WS_MAEMO_5) || defined(Q_OS_SYMBIAN)
+}
+
+void AdopterWindow::closeEvent(QCloseEvent *event)
+{
+    Trace t("AdopterWindow::closeEvent");
+    if (bookView) {
+        bookView->setLastBookmark();
+    }
+    hide();
+    MainBase::closeEvent(event);
+}
+
+void AdopterWindow::leaveEvent(QEvent *event)
+{
+    Trace t("AdopterWindow::leaveEvent");
+    if (bookView) {
+        bookView->setLastBookmark();
+    }
+    MainBase::leaveEvent(event);
 }
 
 void AdopterWindow::keyPressEvent(QKeyEvent *event)
 {
-    TRACE;
-    if (bookView && grabbingVolumeKeys) {
-        switch (event->key()) {
+    Trace t("AdopterWindow::keyPressEvent");
+
+    switch (event->key()) {
+    case Qt::Key_PageDown:
 #ifdef Q_WS_MAEMO_5
-        case Qt::Key_F7:
-            qDebug() << "F7";
-            bookView->goNextPage();
-            event->accept();
-            break;
-        case Qt::Key_F8:
-            qDebug() << "F8";
-            bookView->goPreviousPage();
-            event->accept();
-            break;
-#endif // Q_WS_MAEMO_5
-        case Qt::Key_PageUp:
-            bookView->goPreviousPage();
-            event->accept();
-            break;
-        case Qt::Key_PageDown:
-            bookView->goNextPage();
-            event->accept();
-            break;
-        default:
-            ;
-        }
+    case Qt::Key_F7:
+#endif
+        emit pageDown();
+        event->accept();
+        break;
+    case Qt::Key_PageUp:
+#ifdef Q_WS_MAEMO_5
+    case Qt::Key_F8:
+#endif
+        emit pageUp();
+        event->accept();
+        break;
+    default:
+        ;
     }
-    QMainWindow::keyPressEvent(event);
+    MainBase::keyPressEvent(event);
 }
 
 void AdopterWindow::onSettingsChanged(const QString &key)
@@ -308,41 +209,50 @@ void AdopterWindow::placeDecorations()
     Trace t("AdopterWindow::placeDecorations");
 
     if (!hasBookView()) {
+        qDebug() << "Doesn't have the book view";
         return;
     }
 
-    int toolBarHeight = 0;
+    qDebug() << "Has the book view";
+    int extraHeight = 0;
+
+#if defined(Q_WS_X11) && !defined(Q_WS_MAEMO_5)
+    extraHeight += toolBarHeight();
+#endif
 
     QRect geo = bookView->geometry();
     qDebug() << "bookView:" << geo;
 
-#ifdef Q_OS_SYMBIAN
-    // Work around Symbian bug: If tool bar is hidden, increase bottom
-    // decorator widgets' Y coordinates by the tool bar's height
-    if (toolBar && toolBar->isHidden()) {
-        toolBarHeight = toolBar->height();
-    }
-
-    // Work around another Symbian bug: When returning from full screen mode
-    // in landscape, the book view widget's height is miscalculated.
-    // My apologies for this kludge
-    if (geo.height() == 288) {
-        qDebug() << "Adjusting bottom Y";
-        toolBarHeight -= 288 - 223;
-    }
-#endif // Q_OS_SYMBIAN
-
     progress->setGeometry(geo.x(),
-        geo.y() + geo.height() - progress->thickness() + toolBarHeight,
+        geo.y() + geo.height() - progress->thickness() + extraHeight,
         geo.width(), progress->thickness());
     previousButton->setGeometry(geo.x(),
-        geo.y() + geo.height() - TranslucentButton::pixels + toolBarHeight,
+        geo.y() + geo.height() - TranslucentButton::pixels + extraHeight,
         TranslucentButton::pixels, TranslucentButton::pixels);
     nextButton->setGeometry(
         geo.x() + geo.width() - TranslucentButton::pixels,
-        geo.y(), TranslucentButton::pixels, TranslucentButton::pixels);
+        geo.y() + extraHeight, TranslucentButton::pixels,
+        TranslucentButton::pixels);
     progress->flash();
     previousButton->flash();
     nextButton->flash();
     qDebug() << "progress:" << progress->geometry();
 }
+
+void AdopterWindow::onPageUp()
+{
+    if (bookView && grabbingVolumeKeys) {
+        setEnabled(false);
+        bookView->goPreviousPage();
+        setEnabled(true);
+    }
+}
+
+void AdopterWindow::onPageDown()
+{
+    if (bookView && grabbingVolumeKeys) {
+        setEnabled(false);
+        bookView->goNextPage();
+        setEnabled(true);
+    }
+}