Hello community, here is the log from the commit of package icecream-monitor for openSUSE:Factory checked in at 2018-02-06 16:48:11 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/icecream-monitor (Old) and /work/SRC/openSUSE:Factory/.icecream-monitor.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "icecream-monitor" Tue Feb 6 16:48:11 2018 rev:28 rq:572528 version:3.1.0 Changes: -------- --- /work/SRC/openSUSE:Factory/icecream-monitor/icecream-monitor.changes 2016-07-12 23:51:38.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.icecream-monitor.new/icecream-monitor.changes 2018-02-06 16:48:50.356952371 +0100 @@ -1,0 +2,8 @@ +Thu Dec 21 01:52:52 UTC 2017 - [email protected] + +- Update to version 3.1.0: + - added scheduler option + - summary view improvements + - bugfixes + +------------------------------------------------------------------- Old: ---- icemon-3.0.1.tar.xz New: ---- icemon-3.1.0.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ icecream-monitor.spec ++++++ --- /var/tmp/diff_new_pack.5OHSSJ/_old 2018-02-06 16:48:51.112916999 +0100 +++ /var/tmp/diff_new_pack.5OHSSJ/_new 2018-02-06 16:48:51.112916999 +0100 @@ -1,7 +1,7 @@ # # spec file for package icecream-monitor # -# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -29,7 +29,7 @@ License: GPL-2.0+ Group: Development/Tools/Building Url: https://github.com/icecc/icemon -Version: 3.0.1 +Version: 3.1.0 Release: 0 Source0: icemon-%{version}.tar.xz BuildRoot: %{_tmppath}/%{name}-%{version}-build ++++++ _service ++++++ --- /var/tmp/diff_new_pack.5OHSSJ/_old 2018-02-06 16:48:51.156914940 +0100 +++ /var/tmp/diff_new_pack.5OHSSJ/_new 2018-02-06 16:48:51.156914940 +0100 @@ -1,8 +1,8 @@ <services> <service name="tar_scm" mode="disabled"> - <param name="versionformat">3.0.1</param> + <param name="versionformat">3.1.0</param> <param name="url">http://github.com/icecc/icemon.git</param> - <param name="revision">refs/tags/v3.0.1</param> + <param name="revision">refs/tags/v3.1.0</param> <param name="scm">git</param> </service> <service name="recompress" mode="disabled"> ++++++ icemon-3.0.1.tar.xz -> icemon-3.1.0.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/CHANGELOG.md new/icemon-3.1.0/CHANGELOG.md --- old/icemon-3.0.1/CHANGELOG.md 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/CHANGELOG.md 2017-04-07 00:20:44.000000000 +0200 @@ -1,3 +1,22 @@ +## 3.1.0 (2017-04-07) + +Features: + +- Summary view: Multiple improvements (#23) + - Displays average time for each submitted jobs + - Added display of average build time for finished jobs +- Added scheduler hostname option (#27) + +Bugfixes: + +- Fixed summary view stateWidget color not updated correctly (#23) +- ListView: Sorted file sizes correctly (643abfbbdeed806aa5a08f0c1cfcdaf7ba79d748) +- Fixed filtering in detailed host view (#26) + +Internal Changes: + +- Lots of cleanups, more strict compiler flags, etc. + ## 3.0.1 (2016-02-06) Bugfixes: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/CMakeLists.txt new/icemon-3.1.0/CMakeLists.txt --- old/icemon-3.0.1/CMakeLists.txt 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/CMakeLists.txt 2017-04-07 00:20:44.000000000 +0200 @@ -15,7 +15,7 @@ # version info set(ICEMON_VERSION_MAJOR "3") -set(ICEMON_VERSION_MINOR "0") +set(ICEMON_VERSION_MINOR "1") set(ICEMON_VERSION_PATCH "0") set(ICEMON_VERSION "${ICEMON_VERSION_MAJOR}.${ICEMON_VERSION_MINOR}.${ICEMON_VERSION_PATCH}") set(ICEMON_VERSION_STRING "${ICEMON_VERSION}") @@ -71,7 +71,7 @@ if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") check_cxx_compiler_flag(-Wunused-but-set-variable HAVE_GCC_UNUSED_BUT_SET) check_cxx_compiler_flag(-Wlogical-op HAVE_GCC_LOGICAL_OP) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated -Wextra -Woverloaded-virtual -Winit-self -Wmissing-include-dirs -Wunused -Wno-div-by-zero -Wundef -Wpointer-arith -Wcast-qual -Wcast-align -Wmissing-noreturn -Werror=return-type") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated -Wextra -Woverloaded-virtual -Winit-self -Wmissing-include-dirs -Wunused -Wno-div-by-zero -Wundef -Wpointer-arith -Wcast-qual -Wcast-align -Wmissing-noreturn -Werror=return-type -pedantic") if(HAVE_GCC_UNUSED_BUT_SET) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wunused-but-set-variable") endif() @@ -83,11 +83,13 @@ add_definitions( -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050400 + -DQT_NO_CAST_FROM_ASCII + -DQT_NO_CAST_FROM_BYTEARRAY + -DQT_NO_CAST_TO_ASCII -DQT_NO_URL_CAST_FROM_STRING -DQT_STRICT_ITERATORS -DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS - #-DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_BYTEARRAY ) include_directories( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/README.md new/icemon-3.1.0/README.md --- old/icemon-3.0.1/README.md 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/README.md 2017-04-07 00:20:44.000000000 +0200 @@ -8,6 +8,8 @@  +[](https://travis-ci.org/icecc/icemon) + Installation ------------ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/doc/man-icemon.1.xml new/icemon-3.1.0/doc/man-icemon.1.xml --- old/icemon-3.0.1/doc/man-icemon.1.xml 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/doc/man-icemon.1.xml 2017-04-07 00:20:44.000000000 +0200 @@ -59,6 +59,14 @@ </para></listitem> </varlistentry> + +<varlistentry> +<term><option>-s</option>, <option>--scheduler</option> +<parameter>host-name</parameter></term> +<listitem><para>The hostname of the Icecream scheduler &icemon; should connect to. +</para></listitem> +</varlistentry> + </variablelist> </refsect1> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/icemon.kdev4 new/icemon-3.1.0/icemon.kdev4 --- old/icemon-3.0.1/icemon.kdev4 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/icemon.kdev4 1970-01-01 01:00:00.000000000 +0100 @@ -1,3 +0,0 @@ -[Project] -Manager=KDevCMakeManager -Name=icemon diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/fakemonitor.cc new/icemon-3.1.0/src/fakemonitor.cc --- old/icemon-3.0.1/src/fakemonitor.cc 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/fakemonitor.cc 2017-04-07 00:20:44.000000000 +0200 @@ -35,6 +35,7 @@ const int MAX_JOB_COUNT = 10; const int MAX_HOST_COUNT = 40; +const int MAX_JOB_SIZE = 1024 * 1024 * 24; const QStringList JOB_FILENAMES(QStringList() << QStringLiteral("/tmp/filename.cc") @@ -94,10 +95,15 @@ Job job(JOB_ID++, clientId, fileName); time_t rawtime; time(&rawtime); - job.setStartTime(rawtime); - job.setState(Job::Compiling); + job.startTime = rawtime; + job.state = Job::Compiling; + job.in_compressed = qrand() % MAX_JOB_SIZE * 0.75; // random factor + job.in_uncompressed = qrand() % MAX_JOB_SIZE; + job.in_compressed = qrand() % MAX_JOB_SIZE ; + job.in_uncompressed = qrand() % MAX_JOB_SIZE * 0.75; // random factor + job.real_msec = 200; const int serverId = ((JOB_ID + 1) % MAX_HOST_COUNT) + 1; - job.setServer(serverId); + job.server = serverId; emit jobUpdated(job); m_activeJobs << job; @@ -105,7 +111,7 @@ if (m_activeJobs.size() > MAX_JOB_COUNT) { Job job = m_activeJobs.first(); m_activeJobs.removeFirst(); - job.setState(Job::Finished); + job.state = Job::Finished; emit jobUpdated(job); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/icecreammonitor.cc new/icemon-3.1.0/src/icecreammonitor.cc --- old/icemon-3.0.1/src/icecreammonitor.cc 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/icecreammonitor.cc 2017-04-07 00:20:44.000000000 +0200 @@ -110,6 +110,7 @@ return; } + const string hostname = currentSchedname().isEmpty() ? "" : currentSchedname().data(); list<string> names; if (!currentNetname().isEmpty()) { @@ -127,7 +128,7 @@ if (!m_discover || m_discover->timed_out()) { delete m_discover; - m_discover = new DiscoverSched(QBA_toStdString(currentNetname())); + m_discover = new DiscoverSched(QBA_toStdString(currentNetname()), 2, hostname); } m_scheduler = m_discover->try_get_scheduler(); @@ -241,7 +242,7 @@ m_rememberedJobs[m->job_id] = Job(m->job_id, m->hostid, QString::fromStdString(m->file), QStringLiteral("C++")); - m_rememberedJobs[m->job_id].setState(Job::LocalOnly); + m_rememberedJobs[m->job_id].state = Job::LocalOnly; emit jobUpdated(m_rememberedJobs[m->job_id]); } @@ -258,7 +259,7 @@ return; } - (*it).setState(Job::Finished); + (*it).state = Job::Finished; emit jobUpdated(*it); if (m_rememberedJobs.size() > 3000) { // now remove 1000 @@ -309,9 +310,9 @@ return; } - (*it).setServer(m->hostid); - (*it).setStartTime(m->stime); - (*it).setState(Job::Compiling); + (*it).server = m->hostid; + (*it).startTime = m->stime; + (*it).state = Job::Compiling; emit jobUpdated(*it); } @@ -331,9 +332,9 @@ (*it).exitcode = m->exitcode; if (m->exitcode) { - (*it).setState(Job::Failed); + (*it).state = Job::Failed; } else { - (*it).setState(Job::Finished); + (*it).state = Job::Finished; (*it).real_msec = m->real_msec; (*it).user_msec = m->user_msec; (*it).sys_msec = m->sys_msec; /* system time used */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/job.cc new/icemon-3.1.0/src/job.cc --- old/icemon-3.0.1/src/job.cc 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/job.cc 2017-04-07 00:20:44.000000000 +0200 @@ -26,17 +26,17 @@ #include <QApplication> Job::Job(unsigned int id, unsigned int client, const QString &filename, const QString &lang) - : m_id(id) - , m_fileName(filename) - , m_lang(lang) - , m_state(WaitingForCS) - , m_client(client) + : id(id) + , fileName(filename) + , server(0) + , client(client) + , lang(lang) + , state(WaitingForCS) , real_msec(0) , user_msec(0) , sys_msec(0) , pfaults(0) , exitcode(0) - , m_server(0) , in_compressed(0) , in_uncompressed(0) , out_compressed(0) @@ -46,7 +46,7 @@ QString Job::stateAsString() const { - switch (m_state) { + switch (state) { case WaitingForCS: return QApplication::tr("Waiting"); break; @@ -71,10 +71,10 @@ QDebug operator<<(QDebug dbg, const Job &job) { - return dbg.nospace() << "Job[id=" << job.jobId() - << ", client=" << job.client() - << ", server=" << job.server() - << ", fileName=" << job.fileName() + return dbg.nospace() << "Job[id=" << job.id + << ", client=" << job.client + << ", server=" << job.server + << ", fileName=" << job.fileName << ", state=" << job.stateAsString() << "]"; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/job.h new/icemon-3.1.0/src/job.h --- old/icemon-3.0.1/src/job.h 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/job.h 2017-04-07 00:20:44.000000000 +0200 @@ -37,40 +37,22 @@ const QString &filename = QString(), const QString &lang = QString()); - bool operator==(const Job &rhs) const { return m_id == rhs.m_id; } - bool operator!=(const Job &rhs) const { return m_id != rhs.m_id; } - int operator<(const Job &rhs) const { return m_id < rhs.m_id; } - - unsigned int jobId() const { return m_id; } - QString fileName() const { return m_fileName; } - unsigned int client() const { return m_client; } - unsigned int server() const { return m_server; } - State state() const { return m_state; } + bool operator==(const Job &rhs) const { return id == rhs.id; } + bool operator!=(const Job &rhs) const { return id != rhs.id; } + int operator<(const Job &rhs) const { return id < rhs.id; } + QString stateAsString() const; - time_t stime() const { return m_stime; } - bool isDone() const { return m_state == Finished || m_state == Failed; } - bool isActive() const { return m_state == LocalOnly || m_state == Compiling; } - - void setServer(unsigned int hostid) { - m_server = hostid; - } - void setStartTime(time_t t) { - m_stime = t; - } - void setState(State ss) { - m_state = ss; - } - -private: - unsigned int m_id; - QString m_fileName; - unsigned int m_server; - unsigned int m_client; - QString m_lang; - State m_state; - time_t m_stime; + bool isDone() const { return state == Finished || state == Failed; } + bool isActive() const { return state == LocalOnly || state == Compiling; } + + unsigned int id; + QString fileName; + unsigned int server; + unsigned int client; + QString lang; + State state; + time_t startTime; -public: unsigned int real_msec; /* real time it used */ unsigned int user_msec; /* user time used */ unsigned int sys_msec; /* system time used */ @@ -91,7 +73,7 @@ { public: IdleJob() - : Job() { setState(Job::Idle); } + : Job() { state = Job::Idle; } }; typedef QMap<unsigned int, Job> JobList; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/main.cc new/icemon-3.1.0/src/main.cc --- old/icemon-3.0.1/src/main.cc 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/main.cc 2017-04-07 00:20:44.000000000 +0200 @@ -43,6 +43,10 @@ QCoreApplication::translate("main", "Icecream network name."), QCoreApplication::translate("main", "name", "network name")); parser.addOption(netnameOption); + QCommandLineOption schednameOption(QStringList() << QStringLiteral("s") << QStringLiteral("scheduler"), + QCoreApplication::translate("main", "Icecream scheduler hostname"), + QCoreApplication::translate("main", "hostname", "scheduler hostname")); + parser.addOption(schednameOption); QCommandLineOption testmodeOption(QStringLiteral("testmode"), QCoreApplication::translate("main", "Testing mode.")); parser.addOption(testmodeOption); @@ -50,11 +54,15 @@ parser.process(app); const QByteArray netName = parser.value(netnameOption).toLatin1(); + const QByteArray schedName = parser.value(schednameOption).toLatin1(); MainWindow mainWindow; if (!netName.isEmpty()) { mainWindow.setCurrentNet(netName); } + if (!schedName.isEmpty()) { + mainWindow.setCurrentSched(schedName); + } if (parser.isSet(testmodeOption)) { mainWindow.setTestModeEnabled(true); } @@ -62,4 +70,3 @@ return app.exec(); } - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/mainwindow.cc new/icemon-3.1.0/src/mainwindow.cc --- old/icemon-3.0.1/src/mainwindow.cc 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/mainwindow.cc 2017-04-07 00:20:44.000000000 +0200 @@ -44,6 +44,7 @@ #include <algorithm> namespace { + struct PlatformStat { PlatformStat() @@ -54,7 +55,6 @@ unsigned int maxJobs; }; -const StatusViewFactory s_viewFactory; } MainWindow::MainWindow(QWidget *parent) @@ -157,7 +157,7 @@ restoreState(settings.value(QStringLiteral("windowState")).toByteArray()); QString viewId = settings.value(QStringLiteral("currentView")).toString(); - StatusView *view = s_viewFactory.create(viewId, this); + auto view = StatusViewFactory::create(viewId, this); setView(view); } @@ -260,11 +260,11 @@ "Stephan Kulow <[email protected]><br/>" "Cornelius Schumacher <[email protected]></p>" "Homepage: <a href=\"%4\">%4</a><br/><br/>" - "Licensed under the GPLv2.<br/>") - .arg(QLatin1String(Icemon::Version::appName)) - .arg(QLatin1String(Icemon::Version::version)) - .arg(QLatin1String(Icemon::Version::description)) - .arg(QLatin1String(Icemon::Version::homePage)); + "Licensed under the GPLv2.<br/>").arg( + QLatin1String(Icemon::Version::appName), + QLatin1String(Icemon::Version::version), + QLatin1String(Icemon::Version::description), + QLatin1String(Icemon::Version::homePage)); QMessageBox::about(this, tr("About %1") .arg(QLatin1String(Icemon::Version::appShortName)), about); @@ -292,10 +292,10 @@ void MainWindow::updateJob(const Job &job) { if (job.isActive()) { - m_activeJobs[job.jobId()] = job; + m_activeJobs[job.id] = job; updateJobStats(); } else if (job.isDone()) { - m_activeJobs.remove(job.jobId()); + m_activeJobs.remove(job.id); updateJobStats(); } } @@ -316,7 +316,7 @@ } } for (JobList::const_iterator i = m_activeJobs.constBegin(); i != m_activeJobs.constEnd(); ++i) { - const HostInfo *server = hostMap[i.value().server() != 0 ? i.value().server() : i.value().client()]; + const HostInfo *server = hostMap[i.value().server != 0 ? i.value().server : i.value().client]; if (!server->isOffline() && !server->noRemote()) { ++perPlatformStats[server->platform()].jobs; } @@ -354,16 +354,21 @@ m_jobStatsWidget->setVisible(true); } -void MainWindow::setCurrentNet(const QByteArray &netName) +void MainWindow::setCurrentNet(const QByteArray &netname) +{ + m_monitor->setCurrentNetname(netname); +} + +void MainWindow::setCurrentSched(const QByteArray &schedname) { - m_monitor->setCurrentNetname(netName); + m_monitor->setCurrentSchedname(schedname); } void MainWindow::handleViewModeActionTriggered(QAction *action) { const QString viewId = action->data().toString(); Q_ASSERT(!viewId.isEmpty()); - setView(s_viewFactory.create(viewId, this)); + setView(StatusViewFactory::create(viewId, this)); } // It's nasty that we have to hard-code the implementations of Monitor diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/mainwindow.h new/icemon-3.1.0/src/mainwindow.h --- old/icemon-3.0.1/src/mainwindow.h 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/mainwindow.h 2017-04-07 00:20:44.000000000 +0200 @@ -46,6 +46,7 @@ virtual ~MainWindow(); void setCurrentNet(const QByteArray &netname); + void setCurrentSched(const QByteArray &schedname); Monitor *monitor() const; StatusView *view() const; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/models/joblistmodel.cc new/icemon-3.1.0/src/models/joblistmodel.cc --- old/icemon-3.0.1/src/models/joblistmodel.cc 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/models/joblistmodel.cc 2017-04-07 00:20:44.000000000 +0200 @@ -82,6 +82,8 @@ , m_numberOfFilePathParts(2) , m_expireDuration(-1) , m_expireTimer(new QTimer(this)) + , m_jobType(AllJobs) + , m_hostid(0) { connect(m_expireTimer, SIGNAL(timeout()), this, SLOT(slotExpireFinishedJobs())); @@ -107,6 +109,14 @@ } } +void JobListModel::setHostId(unsigned int hostid) +{ + if (m_hostid == hostid) + return; + m_hostid = hostid; + clear(); +} + void JobListModel::updateJob(const Job &job) { const int index = m_jobs.indexOf(job); @@ -114,12 +124,16 @@ m_jobs[index] = job; emit dataChanged(indexForJob(job, 0), indexForJob(job, _JobColumnCount - 1)); } else { + if (m_hostid && m_jobType == RemoteJobs && job.server != m_hostid) + return; + if (m_hostid && m_jobType == LocalJobs && job.client != m_hostid) + return; beginInsertRows(QModelIndex(), m_jobs.size(), m_jobs.size()); m_jobs << job; endInsertRows(); } - const bool finished = (job.state() == Job::Finished || job.state() == Job::Failed); + const bool finished = (job.state == Job::Finished || job.state == Job::Failed); if (finished) { expireItem(job); } @@ -192,13 +206,13 @@ if (role == Qt::DisplayRole) { switch (column) { case JobColumnID: - return job.jobId(); + return job.id; case JobColumnFilename: - return trimFilePath(job.fileName(), m_numberOfFilePathParts); + return trimFilePath(job.fileName, m_numberOfFilePathParts); case JobColumnClient: - return manager->nameForHost(job.client()); + return manager->nameForHost(job.client); case JobColumnServer: - return manager->nameForHost(job.server()); + return manager->nameForHost(job.server); case JobColumnState: return job.stateAsString(); case JobColumnReal: @@ -256,7 +270,7 @@ bool operator()(const Job &job) const { - return job.jobId() == m_jobId; + return job.id == m_jobId; } private: @@ -288,7 +302,7 @@ void JobListModel::removeItem(const Job &job) { - removeItemById(job.jobId()); + removeItemById(job.id); } void JobListModel::removeItemById(unsigned int jobId) @@ -308,7 +322,7 @@ } const uint currentTime = QDateTime::currentDateTime().toTime_t(); - m_finishedJobs.push_back(FinishedJob(currentTime, job.jobId())); + m_finishedJobs.push_back(FinishedJob(currentTime, job.id)); if (!m_expireTimer->isActive()) { m_expireTimer->start(1000); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/models/joblistmodel.h new/icemon-3.1.0/src/models/joblistmodel.h --- old/icemon-3.0.1/src/models/joblistmodel.h 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/models/joblistmodel.h 2017-04-07 00:20:44.000000000 +0200 @@ -52,6 +52,13 @@ _JobColumnCount }; + enum JobType + { + AllJobs, + LocalJobs, + RemoteJobs + }; + explicit JobListModel(QObject *parent = nullptr); Monitor *monitor() const; @@ -74,6 +81,11 @@ Job jobForIndex(const QModelIndex &index) const; QModelIndex indexForJob(const Job &job, int column); + void setHostId(unsigned int hostid); + unsigned int hostId() const { return m_hostid; } + void setJobType(JobType type) { m_jobType = type; } + JobType jobType() const { return m_jobType; } + private Q_SLOTS: void slotExpireFinishedJobs(); @@ -116,12 +128,14 @@ uint time; uint jobId; }; - typedef QVector<FinishedJob> FinishedJobs; + using FinishedJobs = QVector<JobListModel::FinishedJob>; /// List with job ids that are expired FinishedJobs m_finishedJobs; QTimer *m_expireTimer; + JobType m_jobType; + unsigned int m_hostid; }; class JobListSortFilterProxyModel @@ -130,6 +144,7 @@ Q_OBJECT public: JobListSortFilterProxyModel(QObject *parent = nullptr); + protected: virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const override; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/monitor.cc new/icemon-3.1.0/src/monitor.cc --- old/icemon-3.0.1/src/monitor.cc 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/monitor.cc 2017-04-07 00:20:44.000000000 +0200 @@ -39,6 +39,16 @@ m_currentNetname = netname; } +QByteArray Monitor::currentSchedname() const +{ + return m_currentSchedname; +} + +void Monitor::setCurrentSchedname(const QByteArray &schedname) +{ + m_currentSchedname = schedname; +} + Monitor::SchedulerState Monitor::schedulerState() const { return m_schedulerState; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/monitor.h new/icemon-3.1.0/src/monitor.h --- old/icemon-3.0.1/src/monitor.h 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/monitor.h 2017-04-07 00:20:44.000000000 +0200 @@ -51,6 +51,9 @@ QByteArray currentNetname() const; void setCurrentNetname(const QByteArray &); + QByteArray currentSchedname() const; + void setCurrentSchedname(const QByteArray &); + SchedulerState schedulerState() const; virtual QList<Job> jobHistory() const; @@ -70,6 +73,7 @@ private: HostInfoManager *m_hostInfoManager; QByteArray m_currentNetname; + QByteArray m_currentSchedname; SchedulerState m_schedulerState; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/statusview.cc new/icemon-3.1.0/src/statusview.cc --- old/icemon-3.0.1/src/statusview.cc 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/statusview.cc 2017-04-07 00:20:44.000000000 +0200 @@ -124,13 +124,13 @@ unsigned int StatusView::processor(const Job &job) { unsigned int ret = 0; - if (job.state() == Job::LocalOnly || job.state() == Job::WaitingForCS) { - ret = job.client(); + if (job.state == Job::LocalOnly || job.state == Job::WaitingForCS) { + ret = job.client; } else { - ret = job.server(); + ret = job.server; if (!ret) { - // Q_ASSERT( job.state() == Job::Finished ); - ret = job.client(); + // Q_ASSERT( job.m_state == Job::Finished ); + ret = job.client; } } Q_ASSERT(ret); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/statusview.h new/icemon-3.1.0/src/statusview.h --- old/icemon-3.0.1/src/statusview.h 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/statusview.h 2017-04-07 00:20:44.000000000 +0200 @@ -46,7 +46,7 @@ NoOptions = 0, ///< No option RememberJobsOption = 1 ///< Show old jobs in case this view gets reactivated }; - Q_DECLARE_FLAGS(Options, Option); + Q_DECLARE_FLAGS(Options, Option) StatusView(QObject *parent = nullptr); virtual ~StatusView(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/statusviewfactory.cc new/icemon-3.1.0/src/statusviewfactory.cc --- old/icemon-3.0.1/src/statusviewfactory.cc 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/statusviewfactory.cc 2017-04-07 00:20:44.000000000 +0200 @@ -27,11 +27,7 @@ #include "views/listview.h" #include "views/flowtableview.h" -StatusViewFactory::StatusViewFactory() -{ -} - -StatusView *StatusViewFactory::create(const QString &id, QObject *parent) const +StatusView *StatusViewFactory::create(const QString &id, QObject *parent) { if (id == QLatin1String("list")) { return new ListStatusView(parent); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/statusviewfactory.h new/icemon-3.1.0/src/statusviewfactory.h --- old/icemon-3.0.1/src/statusviewfactory.h 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/statusviewfactory.h 2017-04-07 00:20:44.000000000 +0200 @@ -18,6 +18,9 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#ifndef ICEMON_STATUSVIEWFACTORY_H +#define ICEMON_STATUSVIEWFACTORY_H + class StatusView; class QObject; @@ -26,8 +29,8 @@ class StatusViewFactory { public: - StatusViewFactory(); - - StatusView *create(const QString &id, - QObject *parent = nullptr) const; + static StatusView *create(const QString &id, + QObject *parent = nullptr); }; + +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/types.h new/icemon-3.1.0/src/types.h --- old/icemon-3.0.1/src/types.h 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/types.h 2017-04-07 00:20:44.000000000 +0200 @@ -23,6 +23,6 @@ #include <qglobal.h> -typedef unsigned int HostId; +using HostId = unsigned int; #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/views/detailedhostview.cc new/icemon-3.1.0/src/views/detailedhostview.cc --- old/icemon-3.0.1/src/views/detailedhostview.cc 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/views/detailedhostview.cc 2017-04-07 00:20:44.000000000 +0200 @@ -69,8 +69,8 @@ mHostListView = new HostListView(hosts); mHostListView->setModel(mSortedHostListModel); dummy->addWidget(mHostListView); - //connect(mHostListView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)), - // SLOT(slotNodeActivated())); + connect(mHostListView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)), + SLOT(slotNodeActivated())); auto locals = new QWidget(viewSplitter); dummy = new QVBoxLayout(locals); @@ -79,6 +79,7 @@ mLocalJobsModel = new JobListModel(this); mLocalJobsModel->setExpireDuration(5); + mLocalJobsModel->setJobType(JobListModel::LocalJobs); mSortedLocalJobsModel = new JobListSortFilterProxyModel(this); mSortedLocalJobsModel->setDynamicSortFilter(true); mSortedLocalJobsModel->setSourceModel(mLocalJobsModel); @@ -96,6 +97,7 @@ mRemoteJobsModel = new JobListModel(this); mRemoteJobsModel->setExpireDuration(5); + mRemoteJobsModel->setJobType(JobListModel::RemoteJobs); mSortedRemoteJobsModel = new JobListSortFilterProxyModel(this); mSortedRemoteJobsModel->setDynamicSortFilter(true); mSortedRemoteJobsModel->setSourceModel(mRemoteJobsModel); @@ -146,6 +148,15 @@ } } +void DetailedHostView::slotNodeActivated() +{ + const unsigned int hostid = mHostListView->currentIndex().data(HostListModel::HostIdRole).value<unsigned int>(); + if (!hostid) + return; + mLocalJobsModel->setHostId(hostid); + mRemoteJobsModel->setHostId(hostid); +} + QWidget *DetailedHostView::widget() const { return m_widget.data(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/views/detailedhostview.h new/icemon-3.1.0/src/views/detailedhostview.h --- old/icemon-3.0.1/src/views/detailedhostview.h 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/views/detailedhostview.h 2017-04-07 00:20:44.000000000 +0200 @@ -31,6 +31,7 @@ class JobListModel; class HostListView; class QSortFilterProxyModel; +class JobListSortFilterProxyModel; class DetailedHostView : public StatusView @@ -48,6 +49,9 @@ void checkNode(unsigned int hostid) override; +private slots: + void slotNodeActivated(); + private: void createKnownHosts(); @@ -59,11 +63,11 @@ JobListModel *mLocalJobsModel; JobListView *mLocalJobsView; - QSortFilterProxyModel *mSortedLocalJobsModel; + JobListSortFilterProxyModel *mSortedLocalJobsModel; JobListModel *mRemoteJobsModel; JobListView *mRemoteJobsView; - QSortFilterProxyModel *mSortedRemoteJobsModel; + JobListSortFilterProxyModel *mSortedRemoteJobsModel; }; #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/views/flowtableview.cc new/icemon-3.1.0/src/views/flowtableview.cc --- old/icemon-3.0.1/src/views/flowtableview.cc 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/views/flowtableview.cc 2017-04-07 00:20:44.000000000 +0200 @@ -51,12 +51,12 @@ m_isVirgin = false; } - if (m_currentJob.state() == Job::Compiling || - m_currentJob.state() == Job::LocalOnly) { + if (m_currentJob.state == Job::Compiling || + m_currentJob.state == Job::LocalOnly) { QLinearGradient gradient; gradient.setCoordinateMode(QGradient::ObjectBoundingMode); gradient.setColorAt(0, palette().base().color()); - gradient.setColorAt(1, m_statusView->hostColor(m_currentJob.client())); + gradient.setColorAt(1, m_statusView->hostColor(m_currentJob.client)); p.fillRect(width() - 1, 0, 1, height(), gradient); } else { p.fillRect(width() - 1, 0, 1, height(), palette().base().color()); @@ -92,7 +92,7 @@ void FlowTableView::update(const Job &job) { - int serverId = job.server(); + int serverId = job.server; if (serverId == 0) { return; } @@ -106,14 +106,14 @@ QTableWidgetItem *fileNameItem = m_widget->item(serverRow, 1); QTableWidgetItem *jobStateItem = m_widget->item(serverRow, 3); - if (job.state() == Job::Finished) { + if (job.state == Job::Finished) { fileNameItem->setText(QLatin1String("")); jobStateItem->setText(QLatin1String("")); } else { - QString filePath = job.fileName(); + QString filePath = job.fileName; QString fileName = filePath.mid(filePath.lastIndexOf(QLatin1Char('/')) + 1); fileNameItem->setText(fileName); - fileNameItem->setToolTip(job.fileName()); + fileNameItem->setToolTip(job.fileName); fileNameItem->setFlags(Qt::ItemIsEnabled); jobStateItem->setText(job.stateAsString()); jobStateItem->setToolTip(job.stateAsString()); @@ -127,9 +127,9 @@ // update the host column for the server requesting the job QTableWidgetItem *hostNameItem = m_widget->item(serverRow, 0); int usageCount = hostNameItem->data(Qt::UserRole).toInt(); - if (job.state() == Job::LocalOnly || job.state() == Job::Compiling) { + if (job.state == Job::LocalOnly || job.state == Job::Compiling) { ++usageCount; - } else if (job.state() == Job::Finished || job.state() == Job::Failed) { + } else if (job.state == Job::Finished || job.state == Job::Failed) { --usageCount; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/views/ganttstatusview.cc new/icemon-3.1.0/src/views/ganttstatusview.cc --- old/icemon-3.0.1/src/views/ganttstatusview.cc 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/views/ganttstatusview.cc 2017-04-07 00:20:44.000000000 +0200 @@ -156,14 +156,14 @@ void GanttProgress::update(const Job &job) { if (!m_jobs.isEmpty() && m_jobs.first().job == job) { - if (job.state() == Job::Finished || job.state() == Job::Failed) { + if (job.state == Job::Finished || job.state == Job::Failed) { Job j = IdleJob(); m_jobs.prepend(JobData(j, mClock)); mIsFree = true; } } else { m_jobs.prepend(JobData(job, mClock)); - mIsFree = (job.state() == Job::Idle); + mIsFree = (job.state == Job::Idle); } } @@ -197,7 +197,7 @@ if (xWidth > 4 && height() > 4) { int width = xWidth - 4; - QString s = (*it).job.fileName(); + QString s = (*it).job.fileName; if (!s.isEmpty()) { s = s.mid(s.lastIndexOf(QLatin1Char('/')) + 1, s.length()); @@ -247,11 +247,11 @@ QColor GanttProgress::colorForStatus(const Job &job) const { - if (job.state() == Job::Idle) { + if (job.state == Job::Idle) { return Qt::gray; } else { - QColor c = mStatusView->hostColor(job.client()); - if (job.state() == Job::LocalOnly) { + QColor c = mStatusView->hostColor(job.client); + if (job.state == Job::LocalOnly) { return c.light(); } else { return c; @@ -319,33 +319,33 @@ return; } - if (job.state() == Job::WaitingForCS) { + if (job.state == Job::WaitingForCS) { return; } QMap<unsigned int, GanttProgress *>::Iterator it; - it = mJobMap.find(job.jobId()); + it = mJobMap.find(job.id); if (it != mJobMap.end()) { it.value()->update(job); - if (job.state() == Job::Finished || job.state() == Job::Failed) { + if (job.state == Job::Finished || job.state == Job::Failed) { mJobMap.erase(it); } return; } - if (job.state() == Job::Finished || job.state() == Job::Failed) { + if (job.state == Job::Finished || job.state == Job::Failed) { return; } GanttProgress *slot = nullptr; unsigned int processor; - if (job.state() == Job::LocalOnly) { - processor = job.client(); + if (job.state == Job::LocalOnly) { + processor = job.client; } else { - processor = job.server(); + processor = job.server; } if (!processor) { @@ -371,7 +371,7 @@ } Q_ASSERT(slot); - mJobMap.insert(job.jobId(), slot); + mJobMap.insert(job.id, slot); slot->update(job); mAgeMap[processor] = 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/views/ganttstatusview.h new/icemon-3.1.0/src/views/ganttstatusview.h --- old/icemon-3.0.1/src/views/ganttstatusview.h 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/views/ganttstatusview.h 2017-04-07 00:20:44.000000000 +0200 @@ -161,7 +161,7 @@ GanttTimeScaleWidget *mTimeScale; - typedef QList<GanttProgress *> SlotList; + using SlotList = QList<GanttProgress *>; typedef QMap<unsigned int, SlotList> NodeMap; NodeMap mNodeMap; typedef QMap<unsigned int, int> AgeMap; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/views/listview.cc new/icemon-3.1.0/src/views/listview.cc --- old/icemon-3.0.1/src/views/listview.cc 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/views/listview.cc 2017-04-07 00:20:44.000000000 +0200 @@ -27,7 +27,6 @@ #include "models/joblistmodel.h" #include <QBoxLayout> -#include <QSortFilterProxyModel> ListStatusView::ListStatusView(QObject *parent) : StatusView(parent) @@ -35,7 +34,7 @@ , mJobsListView(new JobListView(m_widget.data())) { mJobsListModel = new JobListModel(this); - mSortedJobsListModel = new QSortFilterProxyModel(this); + mSortedJobsListModel = new JobListSortFilterProxyModel(this); mSortedJobsListModel->setDynamicSortFilter(true); mSortedJobsListModel->setSourceModel(mJobsListModel); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/views/starview.cc new/icemon-3.1.0/src/views/starview.cc --- old/icemon-3.0.1/src/views/starview.cc 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/views/starview.cc 2017-04-07 00:20:44.000000000 +0200 @@ -265,17 +265,17 @@ void HostItem::update(const Job &job) { - setIsCompiling(job.state() == Job::Compiling); - setClient(job.client()); + setIsCompiling(job.state == Job::Compiling); + setClient(job.client); - if (job.state() == Job::WaitingForCS) { + if (job.state == Job::WaitingForCS) { return; } - bool finished = job.state() == Job::Finished || - job.state() == Job::Failed; + bool finished = job.state == Job::Finished || + job.state == Job::Failed; - JobList::Iterator it = m_jobs.find(job.jobId()); + JobList::Iterator it = m_jobs.find(job.id); bool newJob = (it == m_jobs.end()); if (newJob && finished) { @@ -286,7 +286,7 @@ } if (newJob) { - m_jobs.insert(job.jobId(), job); + m_jobs.insert(job.id, job); createJobHalo(job); updateName(); } else if (finished) { @@ -335,8 +335,8 @@ QGraphicsEllipseItem *halo = it.value(); halo->setZValue(70 - count); halo->setRect(halo->x() - baseXMargin() - count * HaloMargin, halo->y() - baseYMargin() - count * HaloMargin, mBaseWidth + count * HaloMargin * 2, mBaseHeight + count * HaloMargin * 2); - halo->setBrush(mHostInfoManager->hostColor(it.key().client())); - halo->setPen(mHostInfoManager->hostColor(it.key().client()).darker(PenDarkerFactor)); + halo->setBrush(mHostInfoManager->hostColor(it.key().client)); + halo->setPen(mHostInfoManager->hostColor(it.key().client).darker(PenDarkerFactor)); ++count; } } @@ -382,7 +382,7 @@ void StarView::update(const Job &job) { - if (job.state() == Job::WaitingForCS) { + if (job.state == Job::WaitingForCS) { m_widget->drawNodeStatus(); return; } @@ -399,15 +399,15 @@ hostItem->update(job); - bool finished = job.state() == Job::Finished || job.state() == Job::Failed; + bool finished = job.state == Job::Finished || job.state == Job::Failed; QMap<unsigned int, HostItem *>::Iterator it; - it = mJobMap.find(job.jobId()); + it = mJobMap.find(job.id); if (it != mJobMap.end()) { (*it)->update(job); if (finished) { mJobMap.erase(it); - unsigned int clientid = job.client(); + unsigned int clientid = job.client; HostItem *clientItem = findHostItem(clientid); if (clientItem) { clientItem->setIsActiveClient(false); @@ -418,11 +418,11 @@ } if (!finished) { - mJobMap.insert(job.jobId(), hostItem); + mJobMap.insert(job.id, hostItem); } - if (job.state() == Job::Compiling) { - unsigned int clientid = job.client(); + if (job.state == Job::Compiling) { + unsigned int clientid = job.client; HostItem *clientItem = findHostItem(clientid); if (clientItem) { clientItem->setClient(clientid); @@ -582,14 +582,18 @@ if (hostInfo) { QToolTip::showText(gp + QPoint(10, 10), hostInfo->toolTip(), this, itemRect); } else { - QToolTip::showText(gp + QPoint(10, 10), - "<h3><b>" + tr("Scheduler") + "</b></h3>" - "<table>" + - "<tr><td>" + tr("Host: %1").arg(m_starView->hostInfoManager()->schedulerName()) + "</td></tr>" + - "<tr><td>" + tr("Network name: %1").arg(m_starView->hostInfoManager()->networkName()) + "</td></tr>" + - "</table>" - "<p><img align=\"right\" src=\":/images/icemonnode.png\"/></p>", - this, itemRect); + QToolTip::showText(gp + QPoint(10, 10), QStringLiteral( + "<h3><b>%1</b></h3>" + "<table>" + "<tr><td>%2</td></tr>" + "<tr><td>%3</td></tr>" + "</table>" + "<p><img align=\"right\" src=\":/images/icemonnode.png\"/></p>") + .arg(tr("Scheduler"), + tr("Host: %1").arg(m_starView->hostInfoManager()->schedulerName()), + tr("Network name: %1").arg(m_starView->hostInfoManager()->networkName()) + ), + this, itemRect); } } else { QToolTip::hideText(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/views/summaryview.cc new/icemon-3.1.0/src/views/summaryview.cc --- old/icemon-3.0.1/src/views/summaryview.cc 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/views/summaryview.cc 2017-04-07 00:20:44.000000000 +0200 @@ -61,6 +61,10 @@ SummaryViewItem::SummaryViewItem(unsigned int hostid, QWidget *parent, SummaryView *view, QGridLayout *layout) : m_jobCount(0) + , m_totalJobsLength(0.0f) + , m_finishedJobCount(0) + , m_totalRequestedJobsLength(0.0f) + , m_requestedJobCount(0) , m_view(view) { const int row = layout->rowCount(); @@ -84,6 +88,12 @@ l->show(); labelLayout->addWidget(l); + m_speedLabel = new QLabel(labelBox); + m_speedLabel->setToolTip(QApplication::tr("Average job time for a file sent by this client / total number of jobs sent.")); + m_speedLabel->setAlignment(Qt::AlignCenter); + m_speedLabel->show(); + labelLayout->addWidget(m_speedLabel); + const int maxJobs = view->hostInfoManager()->maxJobs(hostid); m_jobHandlers.resize(maxJobs); @@ -94,7 +104,7 @@ m_jobHandlers[i].stateWidget->setLineWidth(2); m_jobHandlers[i].stateWidget->setFixedHeight(15); QPalette palette = m_jobHandlers[i].stateWidget->palette(); - palette.setColor(m_jobHandlers[i].stateWidget->backgroundRole(), Qt::black); + palette.setColor(m_jobHandlers[i].stateWidget->foregroundRole(), Qt::black); m_jobHandlers[i].stateWidget->setPalette(palette); m_jobHandlers[i].stateWidget->show(); labelLayout->addWidget(m_jobHandlers[i].stateWidget); @@ -111,6 +121,7 @@ grid->setSpacing(5); m_jobsLabel = addLine(QApplication::tr("Jobs:"), detailsBox, grid, Qt::AlignBottom, QStringLiteral("0")); + m_jobsLabel->setToolTip(QApplication::tr("Total number of jobs processed by this server / average duration of each job.")); for (int i = 0; i < maxJobs; i++) { if (maxJobs > 1) { @@ -133,28 +144,56 @@ m_widgets.clear(); } +void SummaryViewItem::updateStats() +{ + const double avgDuration = m_finishedJobCount > 0 ? m_totalJobsLength / m_finishedJobCount : 0.0f; + m_jobsLabel->setText(QApplication::tr("%1 (Ø duration: %2 ms)").arg( + QString::number(m_jobCount), + QString::number(avgDuration, 'f', 0) + )); + + const double avgTime = m_requestedJobCount > 0 ? m_totalRequestedJobsLength / m_requestedJobCount : 0.0f; + if (qIsNull(avgTime)) { + m_speedLabel->setText(QString()); + } else { + m_speedLabel->setText(QApplication::tr("Ø job time: %1 ms\nrequested jobs count: %2").arg( + QString::number(avgTime, 'f', 0), + QString::number(m_requestedJobCount) + )); + } +} + +void SummaryViewItem::updateClient(const Job &job) +{ + if (job.state == Job::Finished) { + m_totalRequestedJobsLength += job.real_msec; + m_requestedJobCount++; + updateStats(); + } +} + void SummaryViewItem::update(const Job &job) { - switch (job.state()) { + switch (job.state) { case Job::Compiling: { m_jobCount++; - m_jobsLabel->setText(QString::number(m_jobCount)); + updateStats(); QVector<JobHandler>::Iterator it = m_jobHandlers.begin(); while (it != m_jobHandlers.end() && !(*it).currentFile.isNull()) ++it; if (it != m_jobHandlers.end()) { - const QColor nodeColor = m_view->hostInfoManager()->hostColor(job.client()); + const QColor nodeColor = m_view->hostInfoManager()->hostColor(job.client); QPalette palette = (*it).stateWidget->palette(); - palette.setColor((*it).stateWidget->backgroundRole(), nodeColor); + palette.setColor((*it).stateWidget->foregroundRole(), nodeColor); (*it).stateWidget->setPalette(palette); - const QString fileName = job.fileName().section(QLatin1Char('/'), -1); - const QString hostName = m_view->nameForHost(job.client()); + const QString fileName = job.fileName.section(QLatin1Char('/'), -1); + const QString hostName = m_view->nameForHost(job.client); (*it).sourceLabel->setText(QStringLiteral("%1 (%2)").arg(fileName).arg(hostName)); (*it).stateLabel->setText(job.stateAsString()); - (*it).currentFile = job.fileName(); + (*it).currentFile = job.fileName; } break; } @@ -162,16 +201,22 @@ case Job::Failed: { QVector<JobHandler>::Iterator it = m_jobHandlers.begin(); - while (it != m_jobHandlers.end() && (*it).currentFile != job.fileName()) + while (it != m_jobHandlers.end() && (*it).currentFile != job.fileName) ++it; if (it != m_jobHandlers.end()) { QPalette palette = (*it).stateWidget->palette(); - palette.setColor((*it).stateWidget->backgroundRole(), Qt::black); + palette.setColor((*it).stateWidget->foregroundRole(), Qt::black); (*it).stateWidget->setPalette(palette); + (*it).stateWidget->repaint(); (*it).sourceLabel->clear(); (*it).stateLabel->setText(job.stateAsString()); (*it).currentFile = QString(); + if (job.state == Job::Finished) { + m_totalJobsLength += job.real_msec; + m_finishedJobCount++; + updateStats(); + } } break; } @@ -252,16 +297,22 @@ void SummaryView::update(const Job &job) { - if (!job.server()) { + if (!job.server) { return; } - SummaryViewItem *i = m_items[job.server()]; + SummaryViewItem *i = m_items[job.server]; if (!i) { - i = new SummaryViewItem(job.server(), m_base, this, m_layout); - m_items.insert(job.server(), i); + i = new SummaryViewItem(job.server, m_base, this, m_layout); + m_items.insert(job.server, i); + m_widget->widget()->setMinimumHeight(m_widget->widget()->sizeHint().height()); } i->update(job); + + i = m_items[job.client]; + if (i) { + i->updateClient(job); + } } void SummaryView::checkNode(unsigned int hostid) @@ -274,5 +325,6 @@ } else if (!m_items[hostid]) { auto i = new SummaryViewItem(hostid, m_base, this, m_layout); m_items.insert(hostid, i); + m_widget->widget()->setMinimumHeight(m_widget->widget()->sizeHint().height()); } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/icemon-3.0.1/src/views/summaryview.h new/icemon-3.1.0/src/views/summaryview.h --- old/icemon-3.0.1/src/views/summaryview.h 2016-07-05 00:06:38.000000000 +0200 +++ new/icemon-3.1.0/src/views/summaryview.h 2017-04-07 00:20:44.000000000 +0200 @@ -38,12 +38,14 @@ SummaryViewItem(unsigned int hostid, QWidget *parent, SummaryView *view, QGridLayout *layout); ~SummaryViewItem(); void update(const Job &job); + void updateClient(const Job &job); private: QLabel *addLine(const QString &caption, QWidget *parent, QGridLayout *grid, Qt::Alignment flags = Qt::AlignTop, const QString &status = QString()); - + void updateStats(); + struct JobHandler { JobHandler() @@ -57,9 +59,16 @@ QString currentFile; }; + QLabel *m_speedLabel; QLabel *m_jobsLabel; int m_jobCount; + double m_totalJobsLength; + int m_finishedJobCount; + + double m_totalRequestedJobsLength; + int m_requestedJobCount; + SummaryView *m_view; QVector<JobHandler> m_jobHandlers;
