#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<QStringListModel *>(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;
}