X-Git-Url: http://git.maemo.org/git/?p=dorian;a=blobdiff_plain;f=bookmarksdialog.cpp;h=ddeb88cba4567cea2387b0bbdf6e883bee8d779d;hp=c0d1f1da967ff5ea81482c1558442a32a65cf08a;hb=HEAD;hpb=4efa152cf4c14afad41cdfc4561f67d7bb29cbea diff --git a/bookmarksdialog.cpp b/bookmarksdialog.cpp index c0d1f1d..ddeb88c 100644 --- a/bookmarksdialog.cpp +++ b/bookmarksdialog.cpp @@ -3,107 +3,136 @@ #include "bookmarksdialog.h" #include "book.h" #include "bookmarkinfodialog.h" +#include "trace.h" BookmarksDialog::BookmarksDialog(Book *book_, QWidget *parent): - QMainWindow(parent), book(book_) + ListWindow(tr("(No bookmarks)\n"), parent), book(book_) { -#ifdef Q_WS_MAEMO_5 - setAttribute(Qt::WA_Maemo5StackedWindow, true); -#endif setWindowTitle(tr("Bookmarks")); + if (!book) { + return; + } - QFrame *frame = new QFrame(this); - setCentralWidget(frame); - QHBoxLayout *horizontalLayout = new QHBoxLayout(this); - frame->setLayout(horizontalLayout); - - list = new QListWidget(this); - list->setSelectionMode(QAbstractItemView::SingleSelection); + // Build and set bookmark model foreach (Book::Bookmark bookmark, book_->bookmarks()) { - QString contentId = book_->toc[bookmark.chapter]; - QString contentTitle = book_->content[contentId].name; - (void)new QListWidgetItem(QIcon(":icons/bookmark.png"), contentTitle + - "\nAt " + QString::number((int)(bookmark.pos*100)) + "%", list); + data.append(bookmarkToText(bookmark)); } + QStringListModel *model = new QStringListModel(data, this); + setModel(model); - horizontalLayout->addWidget(list); - -#ifndef Q_WS_MAEMO_5 - QDialogButtonBox *buttonBox = new QDialogButtonBox(Qt::Vertical); - - QPushButton *goButton = new QPushButton(tr("Go"), this); - buttonBox->addButton(goButton, QDialogButtonBox::ActionRole); - connect(goButton, SIGNAL(clicked()), this, SLOT(onGo())); - - QPushButton *closeButton = new QPushButton(tr("Close"), this); - buttonBox->addButton(closeButton, QDialogButtonBox::AcceptRole); - connect(closeButton, SIGNAL(clicked()), this, SLOT(onClose())); - - QPushButton *addButton = new QPushButton(tr("Add"), this); - buttonBox->addButton(addButton, QDialogButtonBox::ActionRole); - connect(addButton, SIGNAL(clicked()), this, SLOT(onAdd())); + addButton(tr("Add bookmark"), this, SLOT(onAdd()), "add"); + addItemButton(tr("Go to bookmark"), this, SLOT(onGo()), "goto"); + addItemButton(tr("Edit bookmark"), this, SLOT(onEdit()), "edit"); + addItemButton(tr("Delete bookmark"), this, SLOT(onDelete()), "delete"); - QPushButton *deleteButton = new QPushButton(tr("Delete"), this); - buttonBox->addButton(deleteButton, QDialogButtonBox::DestructiveRole); - connect(deleteButton, SIGNAL(clicked()), this, SLOT(onDelete())); - - horizontalLayout->addWidget(buttonBox); -#else - QAction *addBookmarkAction = menuBar()->addAction(tr("Add bookmark")); - connect(addBookmarkAction, SIGNAL(triggered()), this, SLOT(onAdd())); -#endif // Q_WS_MAEMO_5 - connect(list, SIGNAL(itemActivated(QListWidgetItem *)), - this, SLOT(onItemActivated(QListWidgetItem *))); + connect(this, SIGNAL(activated(const QModelIndex &)), + this, SLOT(onItemActivated(const QModelIndex &))); } void BookmarksDialog::onGo() { - if (!list->selectedItems().isEmpty()) { - QListWidgetItem *item = list->selectedItems()[0]; - emit goToBookmark(list->row(item)); + TRACE; + QModelIndex current = currentItem(); + if (current.isValid()) { + emit goToBookmark(current.row()); close(); } } -void BookmarksDialog::onItemActivated(QListWidgetItem *item) +void BookmarksDialog::onItemActivated(const QModelIndex &index) { - switch ((new BookmarkInfoDialog(book, list->row(item), this))->exec()) { + TRACE; +#ifdef Q_WS_MAEMO_5 + switch ((new BookmarkInfoDialog(book, index.row(), this))->exec()) { case BookmarkInfoDialog::GoTo: onGo(); break; case BookmarkInfoDialog::Delete: - onDelete(); + reallyDelete(); break; default: ; } +#else + Q_UNUSED(index); +#endif } void BookmarksDialog::onAdd() { - emit addBookmark(); - close(); + TRACE; + bool ok; + QString text = QInputDialog::getText(this, tr("Add bookmark"), + tr("Note (optional):"), QLineEdit::Normal, QString(), &ok); + if (ok) { + emit addBookmark(text); + close(); + } } -void BookmarksDialog::onClose() +void BookmarksDialog::onDelete() { - close(); + TRACE; + if (!currentItem().isValid()) { + return; + } + if (QMessageBox::Yes != + QMessageBox::question(this, tr("Delete bookmark"), + tr("Delete bookmark?"), QMessageBox::Yes | QMessageBox::No)) { + return; + } + reallyDelete(); } -void BookmarksDialog::onDelete() +void BookmarksDialog::reallyDelete() { - if (!list->selectedItems().isEmpty()) { - QListWidgetItem *item = list->selectedItems()[0]; - int row = list->row(item); - book->deleteBookmark(row); - delete item; + TRACE; + QModelIndex current = currentItem(); + if (!current.isValid()) { + return; } + int row = current.row(); + model()->removeRow(row); + book->deleteBookmark(row); } -void BookmarksDialog::closeEvent(QCloseEvent *event) +void BookmarksDialog::onEdit() { -#ifdef Q_WS_MAEMO_5 - menuBar()->clear(); -#endif - event->accept(); + TRACE; + QModelIndex current = currentItem(); + if (!current.isValid()) { + return; + } + int row = current.row(); + Book::Bookmark b = book->bookmarks()[row]; + bool ok; + QString text = QInputDialog::getText(this, tr("Edit bookmark"), + tr("Note:"), QLineEdit::Normal, b.note, &ok); + if (!ok) { + return; + } + b.note = text; + book->setBookmarkNote(row, text); + QStringListModel *m = qobject_cast(model()); + if (m) { + m->setData(current, bookmarkToText(b), Qt::DisplayRole); + } +} + +QString BookmarksDialog::bookmarkToText(const Book::Bookmark &bookmark) +{ + // FIXME: Localize me + QString label("At "); + label += QString::number((int)(100 * book-> + getProgress(bookmark.part, bookmark.pos))) + "%"; + if (!bookmark.note.isEmpty()) { + label += ": " + bookmark.note; + } + label += "\n"; + int chapterIndex = book->chapterFromPart(bookmark.part); + if (chapterIndex != -1) { + QString chapterId = book->chapters[chapterIndex]; + label += "In \"" + book->content[chapterId].name + "\""; + } + return label; }