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 @@
 
 ![Screenshot: Star 
View](https://github.com/icecc/icemon/wiki/screenshots/icemon-starview.png)
 
+[![Build 
Status](https://travis-ci.org/icecc/icemon.svg?branch=master)](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 &lt;[email protected]&gt;<br/>"
                        "Cornelius Schumacher &lt;[email protected]&gt;</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;


Reply via email to