X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=mainwindow.cpp;h=d32721482b94aca824ba2168ef6548509bb7e600;hb=145f1e2a34ad1c0b74f5b51692dc8b38fd0332ec;hp=fffffb1c7709ef4f494299b96c88848e2356b4cb;hpb=76446a14739779702a024d207be9fb52da36bd24;p=dorian diff --git a/mainwindow.cpp b/mainwindow.cpp index fffffb1..d327214 100755 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,11 +1,19 @@ #include #include #include -#include +#include #include +#include + #ifdef Q_WS_MAEMO_5 # include -#endif +# include +# include +# include +# include +# include +# include +#endif // Q_WS_MAEMO_5 #include "bookview.h" #include "book.h" @@ -14,10 +22,18 @@ #include "librarydialog.h" #include "devtools.h" #include "mainwindow.h" -#include "translucentbutton.h" #include "settingswindow.h" #include "bookmarksdialog.h" #include "settings.h" +#include "chaptersdialog.h" +#include "fullscreenwindow.h" +#include "trace.h" +#include "bookfinder.h" +#include "progress.h" + +#ifdef DORIAN_TEST_MODEL +#include "modeltest.h" +#endif #ifdef Q_WS_MAC # define ICON_PREFIX ":/icons/mac/" @@ -25,23 +41,33 @@ # define ICON_PREFIX ":/icons/" #endif -const Qt::WindowFlags WIN_BIG_FLAGS = - Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint; -const int WIN_BIG_TIMER = 3000; +const int PROGRESS_HEIGHT = 17; MainWindow::MainWindow(QWidget *parent): - QMainWindow(parent), view(0), book(0), isFullscreen(false) + QMainWindow(parent), view(0), preventBlankingTimer(-1) { + Trace t("MainWindow::MainWindow"); #ifdef Q_WS_MAEMO_5 setAttribute(Qt::WA_Maemo5StackedWindow, true); - // setAttribute(Qt::WA_Maemo5AutoOrientation, true); - // FIXME: There is not enough space for the toolbar in portrait mode + grabZoomKeys(); #endif setWindowTitle("Dorian"); + // Central widget. Must be an intermediate, because the book view widget + // can be re-parented later + QFrame *central = new QFrame(this); + QVBoxLayout *layout = new QVBoxLayout(central); + layout->setMargin(0); + central->setLayout(layout); + setCentralWidget(central); + // Book view - view = new BookView(this); - setCentralWidget(view); + view = new BookView(central); + view->show(); + layout->addWidget(view); + + // Progress + progress = new Progress(central); // Tool bar setUnifiedTitleAndToolBarOnMac(true); @@ -53,103 +79,143 @@ MainWindow::MainWindow(QWidget *parent): #if defined(Q_WS_X11) && !defined(Q_WS_MAEMO_5) toolBar->setIconSize(QSize(42, 42)); #endif + previousAction = addToolBarAction(view, SLOT(goPrevious()), "previous"); nextAction = addToolBarAction(view, SLOT(goNext()), "next"); - bookmarksAction = addToolBarAction(this, SLOT(showBookmarks()), - "bookmarks"); + chaptersAction = addToolBarAction(this, SLOT(showChapters()), "chapters"); + bookmarksAction = addToolBarAction(this, SLOT(showBookmarks()), "bookmarks"); + #ifdef Q_WS_MAEMO_5 - infoAction = new QAction(this); + 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())); #else infoAction = addToolBarAction(this, SLOT(showInfo()), "document-properties"); -#endif libraryAction = addToolBarAction(this, SLOT(showLibrary()), "system-file-manager"); settingsAction = addToolBarAction(this, SLOT(showSettings()), "preferences-system"); -#ifdef Q_WS_MAEMO_5 - devToolsAction = new QAction(this); -#else devToolsAction = addToolBarAction(this, SLOT(showDevTools()), "developer"); +#endif // Q_WS_MAEMO_5 + QFrame *frame = new QFrame(toolBar); frame->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); toolBar->addWidget(frame); -#endif - fullScreenAction = addToolBarAction(this, SLOT(showFullScreen()), - "view-fullscreen"); + + fullScreenAction = addToolBarAction(this, SLOT(showBig()), "view-fullscreen"); // Handle model changes - connect(Library::instance(), SIGNAL(currentBookChanged()), + connect(Library::instance(), SIGNAL(nowReadingChanged()), this, SLOT(onCurrentBookChanged())); - normalFlags = windowFlags(); - restoreButton = new TranslucentButton("view-fullscreen", this); - // Load book on command line, or load last read book, or load default book Library *library = Library::instance(); if (QCoreApplication::arguments().size() == 2) { QString path = QCoreApplication::arguments()[1]; library->add(path); - int index = library->find(path); - if (index != -1) { - library->setCurrent(index); + QModelIndex index = library->find(path); + if (index.isValid()) { + library->setNowReading(index); } } else { - Book *current = library->current(); - if (current) { - setCurrentBook(current); + QModelIndex index = library->nowReading(); + if (index.isValid()) { + library->setNowReading(index); } else { - if (!library->size()) { + if (!library->rowCount()) { library->add(":/books/2 B R 0 2 B.epub"); } - library->setCurrent(0); + library->setNowReading(library->index(0)); } } // Handle settings changes - connect(Settings::instance(), SIGNAL(valueChanged(const QString &)), + Settings *settings = Settings::instance(); + connect(settings, SIGNAL(valueChanged(const QString &)), this, SLOT(onSettingsChanged(const QString &))); - Settings::instance()->setValue("orientation", - Settings::instance()->value("orientation")); + 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))); + + // Handle progress + connect(view, SIGNAL(progress(qreal)), progress, SLOT(setProgress(qreal))); + + // Shadow window for full screen + fullScreenWindow = new FullScreenWindow(this); + connect(fullScreenWindow, SIGNAL(restore()), this, SLOT(showRegular())); + + // 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(); + +#ifdef DORIAN_TEST_MODEL + (void)new ModelTest(Library::instance(), this); +#endif +} + +MainWindow::~MainWindow() +{ + bookFinderThread.quit(); + bookFinderThread.wait(); + delete bookFinder; } void MainWindow::onCurrentBookChanged() { - setCurrentBook(Library::instance()->current()); + setCurrentBook(Library::instance()->nowReading()); } -void MainWindow::showNormal() +void MainWindow::showRegular() { - qDebug() << "MainWindow::showNormal"; - isFullscreen = false; - setWindowFlags(normalFlags); - hide(); - setGeometry(normalGeometry); - toolBar->show(); - restoreButton->hide(); - show(); + Trace t("MainWindow::showRegular"); + fullScreenWindow->hide(); + fullScreenWindow->leaveChild(); + view->setParent(centralWidget()); + progress->setParent(centralWidget()); + progress->setGeometry(0, 0, geometry().width(), PROGRESS_HEIGHT); + centralWidget()->layout()->addWidget(view); + progress->flash(); } -void MainWindow::showFullScreen() +void MainWindow::showBig() { - qDebug() << "MainWindow::showFullscreen"; - normalGeometry = geometry(); - isFullscreen = true; - toolBar->hide(); - setWindowFlags(normalFlags | WIN_BIG_FLAGS); - showMaximized(); - restoreButton->flash(); + Trace t("MainWindow::showBig"); + centralWidget()->layout()->removeWidget(view); + progress->setParent(fullScreenWindow); + progress->setGeometry(0, 0, QApplication::desktop()->screenGeometry().width(), + PROGRESS_HEIGHT); + fullScreenWindow->takeChild(view); + fullScreenWindow->showFullScreen(); + progress->flash(); } -void MainWindow::setCurrentBook(Book *current) +void MainWindow::setCurrentBook(const QModelIndex ¤t) { - book = current; - view->setBook(current); - setWindowTitle(current? current->title: "Dorian"); + mCurrent = current; + Book *book = Library::instance()->book(current); + view->setBook(book); + setWindowTitle(book? book->shortName(): tr("Dorian")); } -QAction *MainWindow::addToolBarAction(const QObject *receiver, const char *member, +QAction *MainWindow::addToolBarAction(const QObject *receiver, + const char *member, const QString &name) { return toolBar-> @@ -158,70 +224,42 @@ QAction *MainWindow::addToolBarAction(const QObject *receiver, const char *membe void MainWindow::showLibrary() { - LibraryDialog *dialog = new LibraryDialog(); - dialog->exec(); + (new LibraryDialog(this))->show(); } void MainWindow::showSettings() { - SettingsWindow *settings = new SettingsWindow(this); - settings->show(); + (new SettingsWindow(this))->show(); } void MainWindow::showInfo() { - if (book) { - InfoDialog *info = new InfoDialog(book, this); - info->exec(); + if (mCurrent.isValid()) { + (new InfoDialog(Library::instance()->book(mCurrent), this))->exec(); } } void MainWindow::showDevTools() { - DevTools *devTools = new DevTools(); - devTools->exec(); + (new DevTools())->exec(); } void MainWindow::showBookmarks() { + Book *book = Library::instance()->book(mCurrent); if (book) { BookmarksDialog *bookmarks = new BookmarksDialog(book, this); - int ret = bookmarks->exec(); - if (ret > 0) { - int index = ret - 1; - view->goToBookmark(book->bookmarks()[index]); - } - else if (ret < 0) { - view->addBookmark(); - } + bookmarks->setWindowModality(Qt::WindowModal); + connect(bookmarks, SIGNAL(addBookmark()), this, SLOT(onAddBookmark())); + connect(bookmarks, SIGNAL(goToBookmark(int)), + this, SLOT(onGoToBookmark(int))); + bookmarks->show(); } } -void MainWindow::MOUSE_ACTIVATE_EVENT(QMouseEvent *event) -{ - qDebug() << "MainWindow::mousePress/ReleaseEvent at" << event->pos() - << "against" << fullScreenZone(); - if (isFullscreen && fullScreenZone().contains(event->x(), event->y())) { - qDebug() << " In fullScreenZone"; - showNormal(); - } - QMainWindow::MOUSE_ACTIVATE_EVENT(event); -} - -QRect MainWindow::fullScreenZone() const -{ - return QRect(width() / 2 - 45, height() - 104, 95, 95); -} - -void MainWindow::resizeEvent(QResizeEvent *event) -{ - (void)event; - restoreButton->setGeometry(fullScreenZone()); -} - void MainWindow::closeEvent(QCloseEvent *event) { - qDebug() << "MainWindow::closeEvent"; + Trace t("MainWindow::closeEvent"); view->setLastBookmark(); event->accept(); } @@ -231,16 +269,139 @@ void MainWindow::onSettingsChanged(const QString &key) #ifdef Q_WS_MAEMO_5 if (key == "orientation") { QString value = Settings::instance()->value(key).toString(); + Trace::trace(QString("MainWindow::onSettingsChanged: orientation %1"). + arg(value)); if (value == "portrait") { - setAttribute(Qt::WA_Maemo5PortraitOrientation, true); setAttribute(Qt::WA_Maemo5LandscapeOrientation, false); + setAttribute(Qt::WA_Maemo5PortraitOrientation, true); } else { setAttribute(Qt::WA_Maemo5PortraitOrientation, false); 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)); + killTimer(preventBlankingTimer); + if (enable) { + preventBlankingTimer = startTimer(29 * 1000); + } } #else - (void)key; + Q_UNUSED(key); +#endif // Q_WS_MAEMO_5 +} + +void MainWindow::onPartLoadStart() +{ + Trace t("MainWindow::onPartLoadStart"); +#ifdef Q_WS_MAEMO_5 + setAttribute(Qt::WA_Maemo5ShowProgressIndicator, true); +#endif +} + +void MainWindow::onPartLoadEnd(int index) +{ + Trace t("MainWindow::onPartLoadEnd"); + bool enablePrevious = false; + bool enableNext = false; + Book *book = Library::instance()->book(mCurrent); + if (book) { + if (index > 0) { + enablePrevious = true; + } + if (index < (book->parts.size() - 1)) { + 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); +} + +void MainWindow::onAddBookmark() +{ + Trace t("MainWindow:onAddBookmark"); + view->addBookmark(); +} + +void MainWindow::onGoToBookmark(int index) +{ + Trace t("MainWindow::onGoToBookmark"); + Book *book = Library::instance()->book(mCurrent); + view->goToBookmark(book->bookmarks()[index]); +} + +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(); + } +} + +void MainWindow::onGoToChapter(int index) +{ + Trace t("MainWindow::onGoToChapter"); + + Book *book = Library::instance()->book(mCurrent); + if (book) { + int partIndex = book->partFromChapter(index); + if (partIndex != -1) { + view->goToBookmark(Book::Bookmark(partIndex, 0)); + } + } +} + +void MainWindow::timerEvent(QTimerEvent *event) +{ + if (event->timerId() == preventBlankingTimer) { +#ifdef Q_WS_MAEMO_5 + QDBusInterface mce(MCE_SERVICE, MCE_REQUEST_PATH, + MCE_REQUEST_IF, QDBusConnection::systemBus()); + mce.call(MCE_PREVENT_BLANK_REQ); +#endif // Q_WS_MAEMO_5 + Trace::trace("MainWindow::timerEvent: Prevent display blanking"); + } +} + +void MainWindow::resizeEvent(QResizeEvent *e) +{ + progress->setGeometry(QRect(0, 0, e->size().width(), PROGRESS_HEIGHT)); + QMainWindow::resizeEvent(e); +} + +void MainWindow::grabZoomKeys() +{ +#ifdef Q_WS_MAEMO_5 + if (!winId()) { + qCritical() << "Can't grab keys unless we have a window id"; + return; + } + unsigned long val = 1; + Atom atom = XInternAtom(QX11Info::display(), "_HILDON_ZOOM_KEY_ATOM", False); + if (!atom) { + qCritical() << "Unable to obtain _HILDON_ZOOM_KEY_ATOM"; + return; + } + XChangeProperty(QX11Info::display(), + winId(), + atom, + XA_INTEGER, + 32, + PropModeReplace, + reinterpret_cast(&val), + 1); #endif // Q_WS_MAEMO_5 }