diff options
Diffstat (limited to 'notebookmodel.cc')
-rw-r--r-- | notebookmodel.cc | 137 |
1 files changed, 94 insertions, 43 deletions
diff --git a/notebookmodel.cc b/notebookmodel.cc index b9c897e..9a51bf9 100644 --- a/notebookmodel.cc +++ b/notebookmodel.cc @@ -29,6 +29,9 @@ #define NUM_COLUMNS 3 #define PEN_INDEX_ID 0xFFFFFFFFU +#define PEN_EXTENSION "pen" +#define ARCHIVE_EXTENSION "archive" + NotebookModel::NotebookModel(QObject *parent) : QAbstractItemModel(parent), _dataDir(userDataDirectory()), @@ -66,12 +69,27 @@ QString NotebookModel::userDataDirectory() QString NotebookModel::penDirectory(const QString &name) const { - return _dataDir.filePath(name + ".pen"); + return _dataDir.filePath(name); +} + +NotebookModel::PenTime NotebookModel::penUserTime(const QString &name) const +{ + QDir penDir = penDirectory(name); + QFile userTimeFile(penDir.filePath(PEN_USER_TIME_FILE)); + if (userTimeFile.open(QIODevice::ReadOnly | QIODevice::Text)) { + QString data = QString::fromUtf8(userTimeFile.readLine(32)); + userTimeFile.close(); + return data.toULongLong(); + } + + qWarning() << "Could not read last user time for pen" << name << "; shown dates are likely to be off"; + + return 0; } QString NotebookModel::notebookDirectory(const QString &penName, const QString &nbName) const { - return _dataDir.filePath(penName + ".pen" + "/" + nbName + ".afd"); + return _dataDir.filePath(penName + "/" + nbName); } QString NotebookModel::notebookDirectory(const QModelIndex &index) const @@ -89,7 +107,7 @@ QString NotebookModel::notebookDirectory(const QModelIndex &index) const QString NotebookModel::paperReplayDirectory(const QString &name) const { - return _dataDir.filePath(name + ".pen" + "/"+ PAPER_REPLAY); + return _dataDir.filePath(name + "/" + PAPER_REPLAY); } QVariant NotebookModel::data(const QModelIndex &index, int role) const @@ -99,22 +117,28 @@ QVariant NotebookModel::data(const QModelIndex &index, int role) const if (id == PEN_INDEX_ID) { int penIndex = index.row(); if (penIndex < 0 || penIndex >= _pens.size()) return QVariant(); + const QString &penName = _pens[penIndex]; switch (role) { case Qt::DisplayRole: switch (index.column()) { case 0: - return _pens[penIndex]; + return penDisplayName(penName); } break; case Qt::DecorationRole: switch (index.column()) { + case 0: + return penIcon(penName); case 2: - if (isPenLocked(_pens[penIndex])) { + if (isPenLocked(penName)) { return QApplication::style()->standardIcon(QStyle::SP_BrowserReload); } break; } break; + case FileNameRole: + return penName; + break; } } else { const QString &penName = _pens[id]; @@ -124,7 +148,7 @@ QVariant NotebookModel::data(const QModelIndex &index, int role) const case Qt::DisplayRole: switch (index.column()) { case 0: - return notebooks.at(index.row()); + return notebookDisplayName(penName, notebookName); case 1: if (notebookName != PAPER_REPLAY) { return estimatePagesOfNotebook(penName, notebookName); @@ -135,18 +159,12 @@ QVariant NotebookModel::data(const QModelIndex &index, int role) const case Qt::DecorationRole: switch (index.column()) { case 0: - return getNotebookIcon(penName, notebookName); + return notebookIcon(penName, notebookName); case 1: return QVariant(); case 2: - if (notebookName != PAPER_REPLAY) { - if (isNotebookLocked(penName, notebookName)) { - return QApplication::style()->standardIcon(QStyle::SP_BrowserReload); - } - } else { - if (isPaperReplayLocked(penName)) { - return QApplication::style()->standardIcon(QStyle::SP_BrowserReload); - } + if (isNotebookLocked(penName, notebookName)) { + return QApplication::style()->standardIcon(QStyle::SP_BrowserReload); } break; } @@ -154,12 +172,14 @@ QVariant NotebookModel::data(const QModelIndex &index, int role) const case Qt::TextAlignmentRole: switch (index.column()) { case 0: - return Qt::AlignLeft; + return QVariant::fromValue<int>(Qt::AlignLeft | Qt::AlignVCenter); case 1: case 2: return Qt::AlignCenter; } break; + case FileNameRole: + return notebookName; } } return QVariant(); @@ -239,10 +259,7 @@ int NotebookModel::columnCount(const QModelIndex &parent) const void NotebookModel::refresh() { - QStringList pens = _dataDir.entryList(QStringList("*.pen"), QDir::Dirs, QDir::Name); - for (int i = 0; i < pens.size(); i++) { - pens[i].chop(4); // Remove .pen extension - } + QStringList pens = _dataDir.entryList(QStringList{"*." PEN_EXTENSION, "*." ARCHIVE_EXTENSION}, QDir::Dirs, QDir::Name); // Insert/remove new/deleted pens int i = 0, j = 0; @@ -291,13 +308,11 @@ void NotebookModel::refreshPen(const QString &name) return; } + _iconCache.clear(); _watcher.addPath(penDir.canonicalPath()); QStringList &curNotebooks = _notebooks[name]; - QStringList diskNotebooks = penDir.entryList(QStringList("*.afd"), QDir::Dirs, QDir::Name); - for (int i = 0; i < diskNotebooks.size(); i++) { - diskNotebooks[i].chop(4); - } + QStringList diskNotebooks = penDir.entryList(QStringList("*." AFD_NOTEBOOK_EXTENSION), QDir::Dirs, QDir::Name); if (penDir.exists(PAPER_REPLAY)) diskNotebooks.append(PAPER_REPLAY); QModelIndex penIndex = index(indexOfPen(name), 0, QModelIndex()); @@ -357,33 +372,73 @@ QDir NotebookModel::notebookDir(const QString &pen, const QString ¬ebook) con return QDir(notebookDirectory(pen, notebook)); } -QIcon NotebookModel::getNotebookIcon(const QString &pen, const QString ¬ebook) const +QString NotebookModel::penDisplayName(const QString &pen) const { - static QStringList candidates; - if (candidates.isEmpty()) { - candidates << "userdata/icon/Notebook.png" - << "userdata/icon/active_64x64.png" - << "userdata/icon/active_32x32.png" - << "userdata/icon/active_16x16.png"; + if (pen.endsWith("." PEN_EXTENSION, Qt::CaseInsensitive)) { + return pen.chopped(strlen("." PEN_EXTENSION)); + } else if (pen.endsWith("." ARCHIVE_EXTENSION, Qt::CaseInsensitive)) { + return pen.chopped(strlen("." ARCHIVE_EXTENSION)); + } else { + return pen; + } +} + +QString NotebookModel::notebookDisplayName(const QString &pen, const QString ¬ebook) const +{ + Q_UNUSED(pen); + if (notebook.endsWith("." AFD_NOTEBOOK_EXTENSION, Qt::CaseInsensitive)) { + return notebook.chopped(strlen("." AFD_NOTEBOOK_EXTENSION)); + } else if (notebook == PAPER_REPLAY) { + return tr("Voice recordings"); + } else { + return notebook; + } +} + +QIcon NotebookModel::penIcon(const QString &pen) const +{ + if (isPenArchive(pen)) { + return QApplication::style()->standardIcon(QStyle::SP_DirOpenIcon); + } else { + return QIcon::fromTheme("scribiu"); + } +} + +QIcon NotebookModel::notebookIcon(const QString &pen, const QString ¬ebook) const +{ + if (notebook == PAPER_REPLAY) { + return QApplication::style()->standardIcon(QStyle::SP_MediaVolume); } - QIcon icon; QDir dir = notebookDir(pen, notebook); - if (dir.exists()) { + + QIcon icon = _iconCache.value(dir.path()); + if (icon.isNull() && dir.exists()) { + static const QStringList candidates{"userdata/icon/Notebook.png", + "userdata/icon/active_64x64.png", + "userdata/icon/active_32x32.png", + "userdata/icon/active_16x16.png"}; foreach (const QString &candidate, candidates) { if (dir.exists(candidate)) { icon.addFile(dir.filePath(candidate)); } } + + _iconCache.insert(dir.path(), icon); } return icon; } +bool NotebookModel::isPenArchive(const QString &pen) const +{ + return pen.endsWith("." ARCHIVE_EXTENSION); +} + bool NotebookModel::isPenLocked(const QString &pen) const { QDir dir = penDir(pen); - if (dir.exists(".sync.lck")) { + if (dir.exists(PEN_SYNC_LOCK_FILE)) { return true; // TODO check if stale } else { return false; @@ -393,7 +448,7 @@ bool NotebookModel::isPenLocked(const QString &pen) const bool NotebookModel::isNotebookLocked(const QString &pen, const QString ¬ebook) const { QDir dir = notebookDir(pen, notebook); - if (dir.exists(".sync.lck")) { + if (dir.exists(PEN_SYNC_LOCK_FILE)) { return true; } else { return false; @@ -402,12 +457,7 @@ bool NotebookModel::isNotebookLocked(const QString &pen, const QString ¬ebook bool NotebookModel::isPaperReplayLocked(const QString &pen) const { - QDir dir(paperReplayDirectory(pen)); - if (dir.exists(".sync.lck")) { - return true; - } else { - return false; - } + return isNotebookLocked(pen, PAPER_REPLAY); } int NotebookModel::estimatePagesOfNotebook(const QString &pen, const QString ¬ebook) const @@ -422,8 +472,9 @@ void NotebookModel::handleChangedDirectory(const QString &path) qDebug() << "changed" << path; if (path == _dataDir.absolutePath()) { refresh(); - } else if (path.endsWith(".pen")) { + } else if (path.endsWith("." PEN_EXTENSION, Qt::CaseInsensitive) + || path.endsWith("." ARCHIVE_EXTENSION, Qt::CaseInsensitive)) { QFileInfo finfo(path); - refreshPen(finfo.baseName()); + refreshPen(finfo.fileName()); } } |