aboutsummaryrefslogtreecommitdiff
path: root/notebookmodel.cc
diff options
context:
space:
mode:
Diffstat (limited to 'notebookmodel.cc')
-rw-r--r--notebookmodel.cc137
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 &notebook) con
return QDir(notebookDirectory(pen, notebook));
}
-QIcon NotebookModel::getNotebookIcon(const QString &pen, const QString &notebook) 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 &notebook) 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 &notebook) 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 &notebook) 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 &notebook
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 &notebook) 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());
}
}