///////////////////////////////////////////////////////////////////////////////
// LameXP - Audio Encoder Front-End
-// Copyright (C) 2004-2010 LoRd_MuldeR <MuldeR2@GMX.de>
+// Copyright (C) 2004-2012 LoRd_MuldeR <MuldeR2@GMX.de>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
#include <QUuid>
-ProgressModel::ProgressModel(void) :
+#define MAX_DISPLAY_ITEMS 48
+
+ProgressModel::ProgressModel(void)
+:
m_iconRunning(":/icons/media_play.png"),
m_iconPaused(":/icons/control_pause_blue.png"),
m_iconComplete(":/icons/tick.png"),
- m_iconFailed(":/icons/exclamation.png")
+ m_iconFailed(":/icons/exclamation.png"),
+ m_iconSystem(":/icons/computer.png"),
+ m_iconWarning(":/icons/error.png"),
+ m_iconPerformance(":/icons/clock.png")
{
}
case JobComplete:
return m_iconComplete;
break;
+ case JobSystem:
+ return m_iconSystem;
+ break;
+ case JobWarning:
+ return m_iconWarning;
+ break;
+ case JobPerformance:
+ return m_iconPerformance;
+ break;
default:
return m_iconFailed;
break;
switch(section)
{
case 0:
- return "Job";
+ return tr("Job");
break;
case 1:
- return "Status";
+ return tr("Status");
break;
default:
return QVariant();
void ProgressModel::addJob(const QUuid &jobId, const QString &jobName, const QString &jobInitialStatus, int jobInitialState)
{
- if(m_jobList.contains(jobId))
+ if(m_jobIdentifiers.contains(jobId))
{
return;
}
- beginResetModel();
+ while(m_jobList.count() >= MAX_DISPLAY_ITEMS)
+ {
+ beginRemoveRows(QModelIndex(), 0, 0);
+ m_jobListHidden.append(m_jobList.takeFirst());
+ m_jobIndexCache.clear();
+ endRemoveRows();
+ }
+
+ int newIndex = m_jobList.count();
+ beginInsertRows(QModelIndex(), newIndex, newIndex);
+
m_jobList.append(jobId);
m_jobName.insert(jobId, jobName);
m_jobStatus.insert(jobId, jobInitialStatus);
m_jobState.insert(jobId, jobInitialState);
m_jobLogFile.insert(jobId, QStringList());
- endResetModel();
+ m_jobIdentifiers.insert(jobId);
+
+ endInsertRows();
}
void ProgressModel::updateJob(const QUuid &jobId, const QString &newStatus, int newState)
{
- int row = m_jobList.indexOf(jobId);
-
- if(row < 0)
+ if(!m_jobIdentifiers.contains(jobId))
{
return;
}
-
+
if(!newStatus.isEmpty()) m_jobStatus.insert(jobId, newStatus);
if(newState >= 0) m_jobState.insert(jobId, newState);
-
- emit dataChanged(index(row, 0), index(row, 1));
+
+ const int row = m_jobIndexCache.value(jobId, -1);
+
+ if(row >= 0)
+ {
+ emit dataChanged(index(row, 0), index(row, 1));
+ }
+ else
+ {
+ const int tmp = m_jobList.indexOf(jobId);
+ if(tmp >= 0)
+ {
+ m_jobIndexCache.insert(jobId, tmp);
+ emit dataChanged(index(tmp, 0), index(tmp, 1));
+ }
+ }
}
void ProgressModel::appendToLog(const QUuid &jobId, const QString &line)
{
- if(m_jobList.contains(jobId))
+ if(m_jobIdentifiers.contains(jobId))
{
- m_jobLogFile[jobId].append(line);
+ m_jobLogFile[jobId].append(line.split('\n'));
}
}
return *(reinterpret_cast<QStringList*>(NULL));
}
+
+const QUuid &ProgressModel::getJobId(const QModelIndex &index)
+{
+ if(index.row() < m_jobList.count())
+ {
+ return m_jobList.at(index.row());
+ }
+
+ return *(reinterpret_cast<QUuid*>(NULL));
+}
+
+void ProgressModel::addSystemMessage(const QString &text, int type)
+{
+ const QUuid &jobId = QUuid::createUuid();
+
+ if(m_jobIdentifiers.contains(jobId))
+ {
+ return;
+ }
+
+ while(m_jobList.count() >= MAX_DISPLAY_ITEMS)
+ {
+ beginRemoveRows(QModelIndex(), 0, 0);
+ m_jobListHidden.append(m_jobList.takeFirst());
+ m_jobIndexCache.clear();
+ endRemoveRows();
+ }
+
+ int newIndex = m_jobList.count();
+ JobState jobState = JobState(-1);
+
+ switch(type)
+ {
+ case SysMsg_Warning:
+ jobState = JobWarning;
+ break;
+ case SysMsg_Performance:
+ jobState = JobPerformance;
+ break;
+ default:
+ jobState = JobSystem;
+ break;
+ }
+
+ beginInsertRows(QModelIndex(), newIndex, newIndex);
+
+ m_jobList.append(jobId);
+ m_jobName.insert(jobId, text);
+ m_jobStatus.insert(jobId, QString());
+ m_jobState.insert(jobId, jobState);
+ m_jobLogFile.insert(jobId, QStringList());
+ m_jobIdentifiers.insert(jobId);
+
+ endInsertRows();
+}
+
+void ProgressModel::restoreHiddenItems(void)
+{
+ if(!m_jobListHidden.isEmpty())
+ {
+ beginResetModel();
+ while(!m_jobListHidden.isEmpty())
+ {
+ m_jobList.prepend(m_jobListHidden.takeLast());
+ }
+ m_jobIndexCache.clear();
+ endResetModel();
+ }
+}