X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=mainwindow.cpp;h=074b33f30b1170f29c736e521fe385f5387f554b;hb=e5e113cbbbd0691ac179e311fe57082f992a63a0;hp=47319f1c0431998c6f5e71f5bf3c9757712be683;hpb=ed8d584a18548d3b0a1d537fe0e40afda38ac197;p=dorian diff --git a/mainwindow.cpp b/mainwindow.cpp index 47319f1..074b33f 100755 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,13 +1,11 @@ #include -#include -#include -#include -#include -#include +#include #ifdef Q_WS_MAEMO_5 -# include # include +# include +# include +# include # include # include #endif // Q_WS_MAEMO_5 @@ -26,26 +24,37 @@ #include "fullscreenwindow.h" #include "trace.h" #include "bookfinder.h" +#include "progress.h" +#include "dyalog.h" +#include "translucentbutton.h" +#include "platform.h" +#include "progressdialog.h" +#include "sortedlibrary.h" #ifdef DORIAN_TEST_MODEL -#include "modeltest.h" -#endif - -#ifdef Q_WS_MAC -# define ICON_PREFIX ":/icons/mac/" -#else -# define ICON_PREFIX ":/icons/" +# include "modeltest.h" #endif MainWindow::MainWindow(QWidget *parent): - QMainWindow(parent), view(0), preventBlankingTimer(-1) + AdopterWindow(parent), view(0), preventBlankingTimer(-1) { - Trace t("MainWindow::MainWindow"); + TRACE; #ifdef Q_WS_MAEMO_5 setAttribute(Qt::WA_Maemo5StackedWindow, true); #endif setWindowTitle("Dorian"); +#ifdef Q_OS_SYMBIAN + // Tool bar + toolBar = new QToolBar("", this /*frame*/); + toolBar->setFixedWidth(QApplication::desktop()-> + availableGeometry().width()); + toolBar->setFixedHeight(65); + toolBar->setStyleSheet("margin:0;border:0;padding:0"); + toolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum); + addToolBar(Qt::BottomToolBarArea, toolBar); +#endif + // Central widget. Must be an intermediate, because the book view widget // can be re-parented later QFrame *central = new QFrame(this); @@ -55,56 +64,105 @@ MainWindow::MainWindow(QWidget *parent): setCentralWidget(central); // Book view - view = new BookView(central); + view = new BookView(this); view->show(); layout->addWidget(view); - // Tool bar - setUnifiedTitleAndToolBarOnMac(true); - settings = new QDialog(this); - toolBar = addToolBar("controls"); - 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)); + // Dialogs + progress = new Progress(this); + + // Tool bar actions + +#ifdef Q_OS_SYMBIAN + fullScreenAction = addToolBarAction(this, SLOT(showBig()), + "view-fullscreen", tr("Full screen")); #endif - previousAction = addToolBarAction(view, SLOT(goPrevious()), "previous"); - nextAction = addToolBarAction(view, SLOT(goNext()), "next"); - chaptersAction = addToolBarAction(this, SLOT(showChapters()), "chapters"); - bookmarksAction = addToolBarAction(this, SLOT(showBookmarks()), "bookmarks"); + chaptersAction = addToolBarAction(this, SLOT(showChapters()), + "chapters", tr("Chapters"), true); + bookmarksAction = addToolBarAction(this, SLOT(showBookmarks()), + "bookmarks", tr("Bookmarks"), true); + infoAction = addToolBarAction(this, SLOT(showInfo()), + "info", tr("Book info"), true); + libraryAction = addToolBarAction(this, SLOT(showLibrary()), + "library", tr("Library"), true); #ifdef Q_WS_MAEMO_5 - infoAction = menuBar()->addAction(tr("Book details")); - connect(infoAction, SIGNAL(triggered()), this, SLOT(showInfo())); - libraryAction = menuBar()->addAction(tr("Library")); - connect(libraryAction, SIGNAL(triggered()), this, SLOT(showLibrary())); settingsAction = menuBar()->addAction(tr("Settings")); connect(settingsAction, SIGNAL(triggered()), this, SLOT(showSettings())); devToolsAction = menuBar()->addAction(tr("Developer")); connect(devToolsAction, SIGNAL(triggered()), this, SLOT(showDevTools())); + QAction *aboutAction = menuBar()->addAction(tr("About")); + connect(aboutAction, SIGNAL(triggered()), this, SLOT(about())); #else - infoAction = addToolBarAction(this, SLOT(showInfo()), "document-properties"); - libraryAction = addToolBarAction(this, SLOT(showLibrary()), - "system-file-manager"); settingsAction = addToolBarAction(this, SLOT(showSettings()), - "preferences-system"); - devToolsAction = addToolBarAction(this, SLOT(showDevTools()), "developer"); + "preferences-system", tr("Settings")); + devToolsAction = addToolBarAction(this, SLOT(showDevTools()), + "developer", tr("Developer")); + addToolBarAction(this, SLOT(about()), "about", tr("About")); #endif // Q_WS_MAEMO_5 - QFrame *frame = new QFrame(toolBar); - frame->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - toolBar->addWidget(frame); +#ifndef Q_OS_SYMBIAN + addToolBarSpace(); + fullScreenAction = addToolBarAction(this, SLOT(showBig()), + "view-fullscreen", tr("Full screen")); +#else + (void)addToolBarAction(this, SLOT(close()), "", tr("Exit")); +#endif - fullScreenAction = addToolBarAction(this, SLOT(showBig()), "view-fullscreen"); + // Buttons on top of the book view + previousButton = new TranslucentButton("back", this); + nextButton = new TranslucentButton("forward", this); // Handle model changes connect(Library::instance(), SIGNAL(nowReadingChanged()), this, SLOT(onCurrentBookChanged())); - // Load book on command line, or load last read book, or load default book + // Load library, upgrade it if needed + libraryProgress = new ProgressDialog(tr("Upgrading library"), this); + Library *library = Library::instance(); + connect(library, SIGNAL(beginUpgrade(int)), this, SLOT(onBeginUpgrade(int))); + connect(library, SIGNAL(upgrading(const QString &)), + this, SLOT(onUpgrading(const QString &))); + connect(library, SIGNAL(endUpgrade()), this, SLOT(onEndUpgrade())); + + // Handle loading book parts + connect(view, SIGNAL(partLoadStart(int)), this, SLOT(onPartLoadStart())); + connect(view, SIGNAL(partLoadEnd(int)), this, SLOT(onPartLoadEnd(int))); + + // Handle progress + connect(view, SIGNAL(progress(qreal)), progress, SLOT(setProgress(qreal))); + + // Shadow window for full screen reading + fullScreenWindow = new FullScreenWindow(this); + connect(fullScreenWindow, SIGNAL(restore()), this, SLOT(showRegular())); + + // Handle settings changes + connect(Settings::instance(), SIGNAL(valueChanged(const QString &)), + this, SLOT(onSettingsChanged(const QString &))); + + // Handle book view buttons + connect(nextButton, SIGNAL(triggered()), this, SLOT(goToNextPage())); + connect(previousButton, SIGNAL(triggered()), this, SLOT(goToPreviousPage())); + + // Adopt view, show window + showRegular(); + +#ifdef DORIAN_TEST_MODEL + (void)new ModelTest(Library::instance(), this); +#endif +} + +void MainWindow::initialize() +{ + TRACE; Library *library = Library::instance(); + + // Upgrade library if needed, then load it + library->upgrade(); + library->load(); + + // Load book on command line, or load last read book, or load default book if (QCoreApplication::arguments().size() == 2) { QString path = QCoreApplication::arguments()[1]; library->add(path); @@ -112,87 +170,118 @@ MainWindow::MainWindow(QWidget *parent): if (index.isValid()) { library->setNowReading(index); } - } - else { + } else { QModelIndex index = library->nowReading(); if (index.isValid()) { library->setNowReading(index); - } - else { + } else { if (!library->rowCount()) { - library->add(":/books/2 B R 0 2 B.epub"); + library->add(":/books/2BR02B.epub"); } - library->setNowReading(library->index(0)); + SortedLibrary sorted; + library->setNowReading(sorted.mapToSource(sorted.index(0, 0))); } } +} - // Handle settings changes - Settings *settings = Settings::instance(); - connect(settings, SIGNAL(valueChanged(const QString &)), - this, SLOT(onSettingsChanged(const QString &))); - settings->setValue("orientation", settings->value("orientation")); - settings->setValue("lightson", settings->value("lightson")); - - // Handle loading chapters - connect(view, SIGNAL(chapterLoadStart(int)), - this, SLOT(onChapterLoadStart())); - connect(view, SIGNAL(chapterLoadEnd(int)), - this, SLOT(onChapterLoadEnd(int))); +void MainWindow::onCurrentBookChanged() +{ + TRACE; + setCurrentBook(Library::instance()->nowReading()); +} - // Shadow window for full screen - fullScreenWindow = new FullScreenWindow(this); - connect(fullScreenWindow, SIGNAL(restore()), this, SLOT(showRegular())); +void MainWindow::showRegular() +{ + TRACE; - // Create thread for finding books in directories - bookFinder = new BookFinder(); - connect(bookFinder, SIGNAL(add(const QString &)), - library, SLOT(add(const QString &))); - connect(bookFinder, SIGNAL(remove(const QString &)), - library, SLOT(remove(const QString &))); - bookFinder->moveToThread(&bookFinderThread); - bookFinderThread.start(); + // Re-parent children + fullScreenWindow->leaveChildren(); + QList otherChildren; + otherChildren << progress << previousButton << nextButton; + takeChildren(view, otherChildren); #if 0 - bool ret = QMetaObject::invokeMethod( - bookFinder, - "find", - Q_ARG(QStringList, QStringList(QString("/Users/polster/Books"))), - Q_ARG(QStringList, library->bookPaths())); - t.trace(QString("Invoking BookFinder::find ") + (ret?"succeeded":"failed")); -#endif -#ifdef DORIAN_TEST_MODEL - (void)new ModelTest(Library::instance(), this); + // Adjust geometry of decorations + + QRect geo = geometry(); + qDebug() << "MainWindow (MainWindow::showRegular)" << geo; + qDebug() << "BookView (MainWindow::showRegular)" << view->geometry(); + int y = geo.height() - progress->thickness(); +#if defined(Q_WS_MAEMO_5) || defined(Q_OS_SYMBIAN) + bool hasToolBar = false; +# if defined(Q_OS_SYMBIAN) + hasToolBar = + (QApplication::desktop()->width() < QApplication::desktop()->height()); + qDebug() << (hasToolBar? "Portrait": "Landscape"); +# endif + if (!hasToolBar) { + y -= toolBar->height(); + } #endif -} + progress->setGeometry(0, y, geo.width(), y + progress->thickness()); -MainWindow::~MainWindow() -{ - bookFinderThread.quit(); - bookFinderThread.wait(); - delete bookFinder; -} +#if defined(Q_WS_MAEMO_5) || defined(Q_OS_SYMBIAN) + y = geo.height() - TranslucentButton::pixels; + if (!hasToolBar) { + y -= toolBar->height(); + } + previousButton->setGeometry(0, y, TranslucentButton::pixels, + TranslucentButton::pixels); + nextButton->setGeometry(geo.width() - TranslucentButton::pixels, 0, + TranslucentButton::pixels, TranslucentButton::pixels); +#else + previousButton->setGeometry(0, geo.height() - TranslucentButton::pixels, + TranslucentButton::pixels, TranslucentButton::pixels); + nextButton->setGeometry(geo.width() - TranslucentButton::pixels - 25, + toolBar->height(), TranslucentButton::pixels, + TranslucentButton::pixels); +#endif // Q_WS_MAEMO_5 + qDebug() << "previousButton geometry" << previousButton->geometry(); -void MainWindow::onCurrentBookChanged() -{ - setCurrentBook(Library::instance()->nowReading()); -} +#endif -void MainWindow::showRegular() -{ - Trace t("MainWindow::showRegular"); fullScreenWindow->hide(); - fullScreenWindow->leaveChild(); - view->setParent(centralWidget()); - centralWidget()->layout()->addWidget(view); + show(); +#if defined(Q_OS_SYMBIAN) + activateWindow(); +#endif } void MainWindow::showBig() { - Trace t("MainWindow::showBig"); - centralWidget()->layout()->removeWidget(view); - fullScreenWindow->takeChild(view); + TRACE; + + // Re-parent children + leaveChildren(); + fullScreenWindow->takeChildren(view, progress, previousButton, nextButton); + +#if 0 + + // Adjust geometry of decorations + QRect screen = QApplication::desktop()->screenGeometry(); + int y = screen.height() - progress->thickness(); + progress->setGeometry(0, y, screen.width(), y + progress->thickness()); +#if defined(Q_WS_MAEMO_5) + nextButton->setGeometry(screen.width() - TranslucentButton::pixels, 0, + TranslucentButton::pixels, TranslucentButton::pixels); +#else + nextButton->setGeometry(screen.width() - TranslucentButton::pixels - 25, 0, + TranslucentButton::pixels, TranslucentButton::pixels); +#endif // Q_WS_MAEMO_5 + previousButton->setGeometry(0, screen.height() - TranslucentButton::pixels, + TranslucentButton::pixels, TranslucentButton::pixels); + +#endif + +// #ifdef Q_OS_SYMBIAN + hide(); +// #endif + fullScreenWindow->showFullScreen(); +#ifdef Q_OS_SYMBIAN + fullScreenWindow->activateWindow(); +#endif } void MainWindow::setCurrentBook(const QModelIndex ¤t) @@ -203,14 +292,6 @@ void MainWindow::setCurrentBook(const QModelIndex ¤t) setWindowTitle(book? book->shortName(): tr("Dorian")); } -QAction *MainWindow::addToolBarAction(const QObject *receiver, - const char *member, - const QString &name) -{ - return toolBar-> - addAction(QIcon(ICON_PREFIX + name + ".png"), "", receiver, member); -} - void MainWindow::showLibrary() { (new LibraryDialog(this))->show(); @@ -224,7 +305,8 @@ void MainWindow::showSettings() void MainWindow::showInfo() { if (mCurrent.isValid()) { - (new InfoDialog(Library::instance()->book(mCurrent), this))->exec(); + (new InfoDialog(Library::instance()->book(mCurrent), this, false))-> + exec(); } } @@ -238,8 +320,8 @@ void MainWindow::showBookmarks() Book *book = Library::instance()->book(mCurrent); if (book) { BookmarksDialog *bookmarks = new BookmarksDialog(book, this); - bookmarks->setWindowModality(Qt::WindowModal); - connect(bookmarks, SIGNAL(addBookmark()), this, SLOT(onAddBookmark())); + connect(bookmarks, SIGNAL(addBookmark(const QString &)), + this, SLOT(onAddBookmark(const QString &))); connect(bookmarks, SIGNAL(goToBookmark(int)), this, SLOT(onGoToBookmark(int))); bookmarks->show(); @@ -248,30 +330,35 @@ void MainWindow::showBookmarks() void MainWindow::closeEvent(QCloseEvent *event) { - Trace t("MainWindow::closeEvent"); + TRACE; view->setLastBookmark(); - event->accept(); + AdopterWindow::closeEvent(event); } void MainWindow::onSettingsChanged(const QString &key) { -#ifdef Q_WS_MAEMO_5 +#if defined(Q_WS_MAEMO_5) if (key == "orientation") { - QString value = Settings::instance()->value(key).toString(); - Trace::trace(QString("MainWindow::onSettingsChanged: orientation %1"). - arg(value)); + QString value = Settings::instance()->value(key, + Platform::instance()->defaultOrientation()).toString(); + qDebug() << "MainWindow::onSettingsChanged: orientation" << value; if (value == "portrait") { setAttribute(Qt::WA_Maemo5LandscapeOrientation, false); setAttribute(Qt::WA_Maemo5PortraitOrientation, true); - } - else { + fullScreenWindow->setAttribute(Qt::WA_Maemo5LandscapeOrientation, + false); + fullScreenWindow->setAttribute(Qt::WA_Maemo5PortraitOrientation, true); + } else { setAttribute(Qt::WA_Maemo5PortraitOrientation, false); setAttribute(Qt::WA_Maemo5LandscapeOrientation, true); + fullScreenWindow->setAttribute(Qt::WA_Maemo5PortraitOrientation, + false); + fullScreenWindow->setAttribute(Qt::WA_Maemo5LandscapeOrientation, + true); } } else if (key == "lightson") { bool enable = Settings::instance()->value(key, false).toBool(); - Trace::trace(QString("MainWindow::onSettingsChanged: lightson: %1"). - arg(enable)); + qDebug() << "MainWindow::onSettingsChanged: lightson" << enable; killTimer(preventBlankingTimer); if (enable) { preventBlankingTimer = startTimer(29 * 1000); @@ -284,15 +371,13 @@ void MainWindow::onSettingsChanged(const QString &key) void MainWindow::onPartLoadStart() { - Trace t("MainWindow::onPartLoadStart"); -#ifdef Q_WS_MAEMO_5 - setAttribute(Qt::WA_Maemo5ShowProgressIndicator, true); -#endif + TRACE; + Platform::instance()->showBusy(this, true); } void MainWindow::onPartLoadEnd(int index) { - Trace t("MainWindow::onPartLoadEnd"); + TRACE; bool enablePrevious = false; bool enableNext = false; Book *book = Library::instance()->book(mCurrent); @@ -304,26 +389,19 @@ void MainWindow::onPartLoadEnd(int index) enableNext = true; } } -#ifdef Q_WS_MAEMO_5 - setAttribute(Qt::WA_Maemo5ShowProgressIndicator, false); - previousAction->setIcon(QIcon(enablePrevious? - ":/icons/previous.png" : ":/icons/previous-disabled.png")); - nextAction->setIcon(QIcon(enableNext? - ":/icons/next.png": ":/icons/next-disabled.png")); -#endif // Q_WS_MAEMO_5 - previousAction->setEnabled(enablePrevious); - nextAction->setEnabled(enableNext); + Platform::instance()->showBusy(this, false); } -void MainWindow::onAddBookmark() +void MainWindow::onAddBookmark(const QString ¬e) { - Trace t("MainWindow:onAddBookmark"); - view->addBookmark(); + TRACE; + view->addBookmark(note); + Platform::instance()->information(tr("Bookmarked current position"), this); } void MainWindow::onGoToBookmark(int index) { - Trace t("MainWindow::onGoToBookmark"); + TRACE; Book *book = Library::instance()->book(mCurrent); view->goToBookmark(book->bookmarks()[index]); } @@ -333,7 +411,6 @@ void MainWindow::showChapters() Book *book = Library::instance()->book(mCurrent); if (book) { ChaptersDialog *chapters = new ChaptersDialog(book, this); - chapters->setWindowModality(Qt::WindowModal); connect(chapters, SIGNAL(goToChapter(int)), this, SLOT(onGoToChapter(int))); chapters->show(); @@ -342,13 +419,14 @@ void MainWindow::showChapters() void MainWindow::onGoToChapter(int index) { - Trace t("MainWindow::onGoToChapter"); + TRACE; Book *book = Library::instance()->book(mCurrent); if (book) { - int partIndex = book->partFromChapter(index); + QString fragment; + int partIndex = book->partFromChapter(index, fragment); if (partIndex != -1) { - view->goToBookmark(Book::Bookmark(partIndex, 0)); + view->goToPart(partIndex, fragment); } } } @@ -361,6 +439,141 @@ void MainWindow::timerEvent(QTimerEvent *event) MCE_REQUEST_IF, QDBusConnection::systemBus()); mce.call(MCE_PREVENT_BLANK_REQ); #endif // Q_WS_MAEMO_5 - Trace::trace("MainWindow::timerEvent: Prevent display blanking"); + qDebug() << "MainWindow::timerEvent: Prevent display blanking"; + } + AdopterWindow::timerEvent(event); +} + +void MainWindow::resizeEvent(QResizeEvent *e) +{ + Trace t("MainWindow::resizeEvent"); +#ifdef Q_OS_SYMBIAN + // Tool bar is only useful in portrait mode + bool isPortrait = + (QApplication::desktop()->width() < QApplication::desktop()->height()); + toolBar->setVisible(isPortrait); +#endif + QTimer::singleShot(100, this, SLOT(placeChildren())); + AdopterWindow::resizeEvent(e); +} + +void MainWindow::placeChildren() +{ + Trace t("MainWindow::placeChildren"); + + int toolBarHeight = 0; + +#ifdef Q_OS_SYMBIAN + // Tool bar is only useful in portrait mode + bool isPortrait = + (QApplication::desktop()->width() < QApplication::desktop()->height()); + // toolBar->setVisible(isPortrait); + + // Work around Symbian bug: If there is no tool bar, increase decorator + // widgets' Y coordinates + if (!isPortrait) { + toolBarHeight = toolBar->height(); + } +#endif // Q_OS_SYMBIAN + + if (hasChild(view)) { + QRect geo = centralWidget()->geometry(); + qDebug() << "centralWidget (MainWindow::resizeEvent)" << geo; +#ifdef Q_OS_SYMBIAN + // FIXME: When returning from full screen in landscape mode, + // the central widget's height is miscalculated on Symbian. + // My apologies for this kludge + if (geo.height() == 288) { + geo.setHeight(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 (MainWindow::resizeEvent)" + << progress->geometry(); } + +} + +void MainWindow::about() +{ + Dyalog *aboutDialog = new Dyalog(this, false); + aboutDialog->setWindowTitle(tr("About Dorian")); + QString version = Platform::instance()->version(); + QLabel *label = new QLabel(aboutDialog); + label->setTextFormat(Qt::RichText); + label->setOpenExternalLinks(true); + label->setWordWrap(true); + label->setText(tr("Dorian %1

Copyright © 2010 " + "Akos Polster <akos@pipacs.com>
" + "Licensed under GNU General Public License, Version 3
" + "Source code:
" + "dorian.garage.maemo.org").arg(version)); + aboutDialog->addWidget(label); + aboutDialog->addStretch(); + aboutDialog->show(); +} + +void MainWindow::goToNextPage() +{ + nextButton->flash(); + previousButton->flash(); + view->goNextPage(); +} + +void MainWindow::goToPreviousPage() +{ + nextButton->flash(); + previousButton->flash(); + view->goPreviousPage(); +} + +void MainWindow::onBeginUpgrade(int total) +{ + libraryProgress->setVisible(total > 0); + libraryProgress->setWindowTitle(tr("Upgrading library")); + libraryProgress->setMaximum(total); +} + +void MainWindow::onUpgrading(const QString &path) +{ + libraryProgress->setLabelText(tr("Upgrading %1"). + arg(QFileInfo(path).fileName())); + libraryProgress->setValue(libraryProgress->value() + 1); +} + +void MainWindow::onEndUpgrade() +{ + libraryProgress->hide(); + libraryProgress->reset(); +} + +void MainWindow::onBeginLoad(int total) +{ + libraryProgress->setVisible(total > 0); + libraryProgress->setWindowTitle(tr("Loading library")); + libraryProgress->setMaximum(total); +} + +void MainWindow::onLoading(const QString &path) +{ + libraryProgress->setLabelText(tr("Loading %1"). + arg(QFileInfo(path).fileName())); + libraryProgress->setValue(libraryProgress->value() + 1); +} + +void MainWindow::onEndLoad() +{ + libraryProgress->hide(); + libraryProgress->reset(); }