Add new widget MainWindow.
[dorian] / adopterwindow.cpp
index a819594..8d8e6d0 100644 (file)
 #include "bookview.h"
 #include "platform.h"
 #include "settings.h"
+#include "progress.h"
+#include "translucentbutton.h"
 
 AdopterWindow::AdopterWindow(QWidget *parent):
-    QMainWindow(parent), bookView(0), grabbingVolumeKeys(false), toolBar(0)
+    QMainWindow(parent), bookView(0), grabbingVolumeKeys(false), toolBar(0),
+    progress(0), previousButton(0), nextButton(0)
 {
     TRACE;
 
@@ -26,7 +29,7 @@ AdopterWindow::AdopterWindow(QWidget *parent):
     QVBoxLayout *layout = new QVBoxLayout(frame);
     layout->setMargin(0);
     frame->setLayout(layout);
-    frame->show();
+    //frame->show();
     setCentralWidget(frame);
 
 #ifdef Q_OS_SYMBIAN
@@ -49,52 +52,70 @@ AdopterWindow::AdopterWindow(QWidget *parent):
     // Monitor settings
     connect(Settings::instance(), SIGNAL(valueChanged(const QString &)),
             this, SLOT(onSettingsChanged(const QString &)));
+
 }
 
-void AdopterWindow::takeChildren(BookView *view, const QList<QWidget *> &others)
+void AdopterWindow::takeBookView(BookView *view,
+                                 Progress *prog,
+                                 TranslucentButton *previous,
+                                 TranslucentButton *next)
 {
     TRACE;
-    leaveChildren();
-    if (view) {
-        bookView = view;
-        bookView->setParent(centralWidget());
-        bookView->show();
-        QVBoxLayout *layout =
-                qobject_cast<QVBoxLayout *>(centralWidget()->layout());
-        layout->addWidget(bookView, 1);
-    }
-    foreach (QWidget *child, others) {
-        if (child) {
-            child->setParent(this);
-        }
-    }
+
+    Q_ASSERT(view);
+    Q_ASSERT(prog);
+    Q_ASSERT(previous);
+    Q_ASSERT(next);
+
+    leaveBookView();
+
+    bookView = view;
+    bookView->setParent(this);
+    centralWidget()->layout()->addWidget(bookView);
+    bookView->show();
+
+    progress = prog;
+    previousButton = previous;
+    nextButton = next;
+    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::leaveChildren()
+void AdopterWindow::leaveBookView()
 {
     TRACE;
     if (bookView) {
+        bookView->hide();
         centralWidget()->layout()->removeWidget(bookView);
-        bookView = 0;
     }
+    bookView = 0;
+    progress = 0;
+    nextButton = 0;
+    previousButton = 0;
+    disconnect(this, SLOT(onPageUp()));
+    disconnect(this, SLOT(onPageDown()));
 }
 
-bool AdopterWindow::hasChild(QWidget *child)
+bool AdopterWindow::hasBookView()
 {
-    if (child == bookView) {
-        return true;
-    }
-    return this == child->parent();
+    return bookView != 0;
 }
 
 void AdopterWindow::show()
 {
+    Trace t("AdopterWindow::show");
 #ifdef Q_OS_SYMBIAN
     foreach (QWidget *w, QApplication::allWidgets()) {
         w->setContextMenuPolicy(Qt::NoContextMenu);
     }
     showMaximized();
-    raise();
 #else
     QMainWindow::show();
 #endif
@@ -114,7 +135,17 @@ QAction *AdopterWindow::addToolBarAction(QObject *receiver,
     action = toolBar->addAction(QIcon(Platform::instance()->icon(iconName)),
                                 text, receiver, member);
 #else
-    if (toolBar && important) {
+    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);
@@ -124,6 +155,7 @@ QAction *AdopterWindow::addToolBarAction(QObject *receiver,
         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);
@@ -169,7 +201,8 @@ void AdopterWindow::doGrabVolumeKeys(bool grab)
         return;
     }
     unsigned long val = grab? 1: 0;
-    Atom atom = XInternAtom(QX11Info::display(), "_HILDON_ZOOM_KEY_ATOM", False);
+    Atom atom =
+            XInternAtom(QX11Info::display(), "_HILDON_ZOOM_KEY_ATOM", False);
     if (!atom) {
         qCritical() << "Unable to obtain _HILDON_ZOOM_KEY_ATOM";
         return;
@@ -187,45 +220,98 @@ void AdopterWindow::doGrabVolumeKeys(bool grab)
 
 #endif // Q_WS_MAEMO_5
 
-#ifdef Q_WS_MAEMO_5
+#ifdef Q_OS_SYMBIAN
 
-void AdopterWindow::showEvent(QShowEvent *e)
+void AdopterWindow::updateToolBar()
 {
     TRACE;
-    doGrabVolumeKeys(grabbingVolumeKeys);
+    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)
+{
+    Trace t("AdopterWindow::showEvent");
+
+#ifdef Q_OS_SYMBIAN
+    updateToolBar();
+#endif
     QMainWindow::showEvent(e);
+#if defined(Q_WS_MAEMO_5)
+    doGrabVolumeKeys(grabbingVolumeKeys);
+#endif
+    placeDecorations();
 }
 
-#endif // Q_WS_MAEMO_5
+void AdopterWindow::resizeEvent(QResizeEvent *event)
+{
+    Trace t("AdopterWindow::resizeEvent");
+#ifdef Q_OS_SYMBIAN
+    updateToolBar();
+#endif
+    QMainWindow::resizeEvent(event);
+    placeDecorations();
+    if (bookView) {
+        QTimer::singleShot(110, bookView, SLOT(restoreLastBookmark()));
+    }
+}
+
+void AdopterWindow::closeEvent(QCloseEvent *event)
+{
+    Trace t("AdopterWindow::closeEvent");
+    if (bookView) {
+        bookView->setLastBookmark();
+    }
+    QMainWindow::closeEvent(event);
+}
+
+void AdopterWindow::leaveEvent(QEvent *event)
+{
+    Trace t("AdopterWindow::leaveEvent");
+    if (bookView) {
+        bookView->setLastBookmark();
+    }
+    QMainWindow::leaveEvent(event);
+}
 
 void AdopterWindow::keyPressEvent(QKeyEvent *event)
 {
     TRACE;
-    if (bookView && grabbingVolumeKeys) {
-        switch (event->key()) {
+    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);
 }
@@ -239,3 +325,65 @@ void AdopterWindow::onSettingsChanged(const QString &key)
     }
 }
 
+void AdopterWindow::placeDecorations()
+{
+    Trace t("AdopterWindow::placeDecorations");
+
+    if (!hasBookView()) {
+        return;
+    }
+
+    int toolBarHeight = 0;
+
+    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.width(), progress->thickness());
+    previousButton->setGeometry(geo.x(),
+        geo.y() + geo.height() - TranslucentButton::pixels + toolBarHeight,
+        TranslucentButton::pixels, TranslucentButton::pixels);
+    nextButton->setGeometry(
+        geo.x() + geo.width() - TranslucentButton::pixels,
+        geo.y(), 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);
+    }
+}
+