-#include <QtGui>
-#include <QDebug>
-#include <QFileInfo>
#include <QDir>
-#include <QModelIndex>
-
-#ifdef Q_WS_MAEMO_5
-#include <QtMaemo5/QMaemo5InformationBox>
-#endif
+#include <QtGui>
#include "librarydialog.h"
#include "library.h"
#include "book.h"
#include "infodialog.h"
#include "settings.h"
+#include "listwindow.h"
+#include "trace.h"
+#include "bookfinder.h"
+#include "searchdialog.h"
+#include "platform.h"
+#include "searchresultsdialog.h"
+#include "progressdialog.h"
+#include "settings.h"
-LibraryDialog::LibraryDialog(QWidget *parent): QMainWindow(parent)
+LibraryDialog::LibraryDialog(QWidget *parent):
+ ListWindow(tr("(No books)"), parent)
{
-#ifdef Q_WS_MAEMO_5
- setAttribute(Qt::WA_Maemo5StackedWindow, true);
-#endif
+ TRACE;
setWindowTitle(tr("Library"));
+ setAttribute(Qt::WA_DeleteOnClose, true);
- QFrame *frame = new QFrame(this);
- setCentralWidget(frame);
- QHBoxLayout *horizontalLayout = new QHBoxLayout(frame);
- frame->setLayout(horizontalLayout);
+ // Add menu actions
+ sortByTitle =
+ addMenuAction(tr("Sort by title"), this, SLOT(onSortByTitle()));
+ sortByAuthor =
+ addMenuAction(tr("Sort by author"), this, SLOT(onSortByAuthor()));
- list = new QListView(this);
+ // Set model
sortedLibrary = new SortedLibrary(this);
- list->setModel(sortedLibrary);
- list->setSelectionMode(QAbstractItemView::SingleSelection);
- list->setSpacing(1);
- list->setUniformItemSizes(true);
+ setModel(sortedLibrary);
+ // Add action buttons
+ addButton(tr("Add book"), this, SLOT(onAdd()), "add");
+ addButton(tr("Add books from folder"), this,
+ SLOT(onAddFolder()), "folder");
+ addButton(tr("Search the Web"), this, SLOT(onSearch()), "search");
+ addItemButton(tr("Delete"), this, SLOT(onDelete()), "delete");
+
+ // Set selected item
Library *library = Library::instance();
QModelIndex current = library->nowReading();
- setSelected(current);
- horizontalLayout->addWidget(list);
-
-#ifndef Q_WS_MAEMO_5
- QDialogButtonBox *buttonBox = new QDialogButtonBox(Qt::Vertical);
- detailsButton = new QPushButton(tr("Details"), this);
- readButton = new QPushButton(tr("Read"), this);
- removeButton = new QPushButton(tr("Delete"), this);
- addButton = new QPushButton(tr("Add"), this);
-
- buttonBox->addButton(detailsButton, QDialogButtonBox::ActionRole);
- buttonBox->addButton(readButton, QDialogButtonBox::AcceptRole);
- buttonBox->addButton(removeButton, QDialogButtonBox::ActionRole);
- buttonBox->addButton(addButton, QDialogButtonBox::ActionRole);
- horizontalLayout->addWidget(buttonBox);
-#else
- QAction *addBookAction = menuBar()->addAction(tr("Add book"));
-#endif // Q_WS_MAEMO_5
-
- connect(Library::instance(), SIGNAL(nowReadingChanged()),
- this, SLOT(onCurrentBookChanged()));
- connect(Library::instance(),
- SIGNAL(rowsInserted(const QModelIndex &, int, int)),
- this,
- SLOT(onBookAdded()));
- connect(list, SIGNAL(activated(const QModelIndex &)),
+ setCurrentItem(sortedLibrary->mapFromSource(current));
+
+ // Search dialog box
+ searchDialog = new SearchDialog(this);
+ connect(Search::instance(), SIGNAL(endSearch()),
+ this, SLOT(showSearchResults()));
+
+ // Progress bar
+ progress = new ProgressDialog(tr("Adding books"), this);
+
+ connect(library, SIGNAL(rowsInserted(const QModelIndex &, int, int)),
+ this, SLOT(onBookAdded()));
+ connect(this, SIGNAL(activated(const QModelIndex &)),
this, SLOT(onItemActivated(const QModelIndex &)));
-#ifndef Q_WS_MAEMO_5
- connect(addButton, SIGNAL(clicked()), this, SLOT(onAdd()));
- connect(detailsButton, SIGNAL(clicked()), this, SLOT(onDetails()));
- connect(readButton, SIGNAL(clicked()), this, SLOT(onRead()));
- connect(removeButton, SIGNAL(clicked()), this, SLOT(onRemove()));
- connect(list->selectionModel(),
- SIGNAL(selectionChanged(const QItemSelection &,
- const QItemSelection &)),
- this, SLOT(onItemSelectionChanged()));
- onItemSelectionChanged();
-#else
- connect(addBookAction, SIGNAL(triggered()), this, SLOT(onAdd()));
-#endif // !Q_WS_MAEMO_5
+
+ // Retrieve default sort criteria
+ switch (Settings::instance()->value("lib/sortby").toInt()) {
+ case SortedLibrary::SortByAuthor:
+ onSortByAuthor();
+ break;
+ default:
+ onSortByTitle();
+ }
}
void LibraryDialog::onAdd()
}
// Get book file name
- QString path = QFileDialog::getOpenFileName(this, tr("Add Book"),
+ QString path = QFileDialog::getOpenFileName(this, tr("Add book"),
lastDir, "Books (*.epub)");
if (path == "") {
return;
// Add book to library
QModelIndex index = library->find(path);
if (index.isValid()) {
-#ifdef Q_WS_MAEMO_5
- QMaemo5InformationBox::information(this,
- tr("This book is already in the library"),
- QMaemo5InformationBox::DefaultTimeout);
-#else
- (void)QMessageBox::information(this, tr("Dorian"),
- tr("This book is already in the library"), QMessageBox::Ok);
-#endif // Q_WS_MAEMO_5
- setSelected(index);
+ Platform::instance()->information(
+ tr("This book is already in the library"), this);
+ setSelected(sortedLibrary->mapFromSource(index));
}
else {
library->add(path);
void LibraryDialog::onBookAdded()
{
Library *library = Library::instance();
- setSelected(library->index(library->rowCount() - 1));
+ setSelected(sortedLibrary->
+ mapFromSource(library->index(library->rowCount() - 1)));
}
-#ifndef Q_WS_MAEMO_5
-
-void LibraryDialog::onRemove()
+void LibraryDialog::onItemActivated(const QModelIndex &index)
{
- QModelIndex current = sortedLibrary->mapToSource(list->currentIndex());
- if (current.isValid()) {
- Book *currentBook = Library::instance()->book(current);
- QString title = currentBook->name();
- if (QMessageBox::Yes ==
- QMessageBox::question(this, "Delete book",
- "Delete book \"" + title + "\"?",
- QMessageBox::Yes | QMessageBox::No)) {
- Library::instance()->remove(current);
- }
- }
-}
+ TRACE;
-void LibraryDialog::onRead()
-{
- qDebug() << "LibraryDialog::onRead";
- QModelIndex current = sortedLibrary->mapToSource(list->currentIndex());
- if (current.isValid()) {
- Library::instance()->setNowReading(current);
- }
-}
+ QModelIndex libraryIndex = sortedLibrary->mapToSource(index);
+ Book *book = Library::instance()->book(libraryIndex);
+ int ret = (new InfoDialog(book, this))->exec();
-void LibraryDialog::onDetails()
-{
- onItemActivated(list->currentIndex());
+ switch (ret) {
+ case InfoDialog::Read:
+ Library::instance()->setNowReading(libraryIndex);
+ close();
+ break;
+ case InfoDialog::Delete:
+ Library::instance()->remove(libraryIndex);
+ break;
+ default:
+ ;
+ }
}
-#endif // Q_WS_MAEMO_5
-
-void LibraryDialog::onItemActivated(const QModelIndex &index)
+void LibraryDialog::onDelete()
{
- qDebug() << "LibraryDialog::onItemActivated";
- QModelIndex libraryIndex = sortedLibrary->mapToSource(index);
+ QModelIndex current = currentItem();
+ if (!current.isValid()) {
+ return;
+ }
+ QModelIndex libraryIndex = sortedLibrary->mapToSource(current);
Book *book = Library::instance()->book(libraryIndex);
- (new InfoDialog(book, this))->exec();
+ if (QMessageBox::Yes !=
+ QMessageBox::question(this, tr("Delete book"),
+ tr("Delete book \"%1\"?").arg(book->shortName()),
+ QMessageBox::Yes | QMessageBox::No)) {
+ return;
+ }
+ Library::instance()->remove(libraryIndex);
}
-QString LibraryDialog::createItemText(const Book *book)
+QString LibraryDialog::createItemText(Book *book)
{
- QString text = book->title + "\n";
+ Q_ASSERT(book);
+ QString text = book->shortName() + "\n";
if (book->creators.size()) {
text += book->creators[0];
for (int i = 1; i < book->creators.size(); i++) {
return text;
}
-#ifndef Q_WS_MAEMO_5
+void LibraryDialog::setSelected(const QModelIndex &libraryIndex)
+{
+ QModelIndex sortedIndex = sortedLibrary->mapFromSource(libraryIndex);
+ if (sortedIndex.isValid()) {
+ setCurrentItem(sortedIndex);
+ }
+}
-void LibraryDialog::onItemSelectionChanged()
+void LibraryDialog::onAddFolder()
{
- bool enable = selected().isValid();
- readButton->setEnabled(enable);
- detailsButton->setEnabled(enable);
- removeButton->setEnabled(enable);
+ TRACE;
+
+ // Get folder name
+ Settings *settings = Settings::instance();
+ QString last =
+ settings->value("lastfolderadded", QDir::homePath()).toString();
+ QString path =
+ QFileDialog::getExistingDirectory(this, tr("Select folder"), last);
+ if (path == "") {
+ return;
+ }
+ settings->setValue("lastfolderadded", QFileInfo(path).absolutePath());
+ qDebug() << path;
+
+ // Add books from folder
+ progress->setWindowTitle(tr("Adding books"));
+ BookFinder *bookFinder = new BookFinder(this);
+ Library *library = Library::instance();
+ connect(bookFinder, SIGNAL(begin(int)), progress, SLOT(setMaximum(int)));
+ connect(bookFinder, SIGNAL(add(const QString &)),
+ this, SLOT(onAddFromFolder(const QString &)));
+ connect(bookFinder, SIGNAL(add(const QString &)),
+ library, SLOT(add(const QString &)));
+ connect(bookFinder, SIGNAL(done(int)),
+ this, SLOT(onAddFromFolderDone(int)));
+ bookFinder->find(path, Library::instance()->bookPaths());
}
-#endif // Q_WS_MAEMO_5
+void LibraryDialog::onAddFromFolderDone(int added)
+{
+ QString msg;
-void LibraryDialog::onCurrentBookChanged()
+ switch (added) {
+ case 0: msg = tr("No new books found"); break;
+ case 1: msg = tr("One book added"); break;
+ default: msg = tr("%1 books added").arg(added);
+ }
+
+ progress->reset();
+ qDebug() << "LibraryDialog::onRefreshDone:" << msg;
+ Platform::instance()->information(msg, this);
+}
+
+void LibraryDialog::onAddFromFolder(const QString &path)
{
- close();
+ progress->setLabelText(QFileInfo(path).fileName());
+ progress->setValue(progress->value() + 1);
}
-void LibraryDialog::setSelected(const QModelIndex &libraryIndex)
+void LibraryDialog::onSearch()
{
- QModelIndex sortedIndex = sortedLibrary->mapFromSource(libraryIndex);
- list->selectionModel()->clearSelection();
- if (sortedIndex.isValid()) {
- list->selectionModel()->select(sortedIndex,
- QItemSelectionModel::Select);
- list->setCurrentIndex(sortedIndex);
+ TRACE;
+ int ret = searchDialog->exec();
+ qDebug() << "Search dialog returned" << ret;
+ if (ret != QDialog::Accepted) {
+ return;
}
+ progress->setLabelText(tr("Searching Project Gutenberg"));
+ progress->showWait();
+ Search::instance()->start(searchDialog->query());
}
-QModelIndex LibraryDialog::selected() const
+void LibraryDialog::showSearchResults()
{
- QModelIndexList selectedItems = list->selectionModel()->selectedIndexes();
- if (selectedItems.size()) {
- return sortedLibrary->mapToSource(selectedItems[0]);
+ progress->reset();
+ QList<Search::Result> results = Search::instance()->results();
+ if (results.isEmpty()) {
+ QMessageBox::information(this, tr("Search results"),
+ tr("No books found"));
+ return;
}
- return QModelIndex();
+
+ SearchResultsDialog *dialog = new SearchResultsDialog(results, this);
+ connect(dialog, SIGNAL(add(const Search::Result &)),
+ this, SLOT(onAddSearchResult(const Search::Result &)));
+ dialog->show();
+}
+
+void LibraryDialog::onSortByAuthor()
+{
+ TRACE;
+ sortedLibrary->setSortBy(SortedLibrary::SortByAuthor);
+ Settings::instance()->setValue("lib/sortby", SortedLibrary::SortByAuthor);
+ sortByAuthor->setChecked(true);
+ sortByTitle->setChecked(false);
}
-void LibraryDialog::closeEvent(QCloseEvent *event)
+void LibraryDialog::onSortByTitle()
{
-#ifdef Q_WS_MAEMO_5
- menuBar()->clear();
-#endif
- event->accept();
+ TRACE;
+ sortedLibrary->setSortBy(SortedLibrary::SortByTitle);
+ Settings::instance()->setValue("lib/sortby", SortedLibrary::SortByTitle);
+ sortByAuthor->setChecked(false);
+ sortByTitle->setChecked(true);
}