[Xfce4-commits] [panel-plugins/xfce4-hardware-monitor-plugin] 22/29: CurveView: Treat Curves for different monitor types as separate synced sources, so independent maxes
noreply at xfce.org
noreply at xfce.org
Mon Dec 18 12:45:53 CET 2017
This is an automated email from the git hooks/post-receive script.
o m e g a p h i l p u s h e d a c o m m i t t o b r a n c h m a s t e r
in repository panel-plugins/xfce4-hardware-monitor-plugin.
commit 0700a56d8349aea70a71a0d2f347d7960cd09105
Author: OmegaPhil <OmegaPhil at startmail.com>
Date: Sun Dec 10 20:24:49 2017 +0000
CurveView: Treat Curves for different monitor types as separate synced sources, so independent maxes
---
src/canvas-view.hpp | 5 ++
src/curve-view.cpp | 221 +++++++++++++++++++++++++++++++++++-----------------
src/curve-view.hpp | 6 +-
3 files changed, 160 insertions(+), 72 deletions(-)
diff --git a/src/canvas-view.hpp b/src/canvas-view.hpp
index 9bc2848..c6e4021 100644
--- a/src/canvas-view.hpp
+++ b/src/canvas-view.hpp
@@ -55,6 +55,11 @@ protected:
int size; // in pixels, width when vertical, else height
+ /* Used to locate monitor type of interest in monitor_maxes during
+ * visualisation draw loop */
+ typedef std::map<Glib::ustring, std::pair<int, int>>::iterator
+ mon_type_iterator;
+
std::auto_ptr<Gnome::Canvas::Canvas> canvas;
sigc::connection draw_timer;
diff --git a/src/curve-view.cpp b/src/curve-view.cpp
index 50dd1f6..3f4b74b 100644
--- a/src/curve-view.cpp
+++ b/src/curve-view.cpp
@@ -17,7 +17,10 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
-#include <algorithm> // for max/min[_element]()
+#include <algorithm> // For max/min[_element]()
+#include <list>
+#include <typeinfo> // For keeping track of monitor types in the visualisation
+#include <utility> // For keeping track of monitor types in the visualisation
#include <libgnomecanvasmm/line.h>
#include <libgnomecanvasmm/point.h>
@@ -267,29 +270,74 @@ void CurveView::do_detach(Monitor *monitor)
void CurveView::do_draw_loop()
{
- double max = 0, fixed_max = 0;
+ double max;
+
+ // Monitor maxes maintained as a pair of <normal max>, <fixed max>
+ std::map<Glib::ustring, std::pair<int, int>> monitor_maxes;
+
+ // Monitors collected by type to allow easy access to separated data sets
+ std::map<Glib::ustring, std::list<Curve*>> curves_by_mon_type;
+
Glib::ustring max_formatted, max_formatted_compact, monitor_data,
- monitor_data_compact, text_overlay_format_string, tag_string,
+ monitor_data_compact, overlay_text, per_type_overlay_text,
+ text_overlay_format_string, tag_string,
separator_string = plugin->get_viewer_text_overlay_separator();
bool graph_max_needed = false, graph_max_compact_needed = false,
monitor_data_needed = false, monitor_data_compact_needed = false,
text_overlay_enabled = plugin->get_viewer_text_overlay_enabled();
- /* Obtain maximum value of all curves in the view, separately tracking fixed
- * maxes incase all monitors are fixed. Graphs with fixed monitors are not
- * supposed to be scaled, but the text overlay still needs to refer to a max
- * if there are no normal monitors present */
+ /* Obtain maximum value of all curves in the view on a per monitor type basis,
+ * separately tracking fixed maxes incase all monitors are fixed. Graphs with
+ * fixed monitors are not supposed to be scaled, but the text overlay still
+ * needs to refer to a max if there are no normal monitors present
+ * Priority-wise, non-fixed monitor sources are always reported in preference
+ * to fixed-max sources
+ * On top of this, collect the curves together by monitor type so that they
+ * can be looped over later - easy to do this here while I'm already looping
+ * over everything, rather than maintaining a separate list on
+ * attaching/detaching monitors
+ * Unified maxes are needed even if the text overlay is not enabled */
+ mon_type_iterator it;
+ curves_mon_type_iterator it_mon_type;
+ Glib::ustring mon_type;
for (curve_iterator i = curves.begin(), end = curves.end(); i != end; ++i)
{
- if (!(*i)->monitor->fixed_max() && (*i)->get_max_value() > max)
- max = (*i)->get_max_value();
- else if ((*i)->monitor->fixed_max() && (*i)->monitor->max() > fixed_max)
- fixed_max = (*i)->monitor->max();
+ // To get the real type, Monitor* must be dereferrenced too...
+ mon_type = typeid(*((*i)->monitor)).name();
+
+ // If the monitor type hasn't yet been recorded, zero the maxes
+ it = monitor_maxes.find(mon_type);
+ if (it == monitor_maxes.end())
+ monitor_maxes[mon_type] = std::make_pair(0, 0);
+
+ if (!(*i)->monitor->fixed_max()
+ && (*i)->get_max_value() > monitor_maxes[mon_type].first)
+ monitor_maxes[mon_type].first = (*i)->get_max_value();
+ else if ((*i)->monitor->fixed_max()
+ && (*i)->monitor->max() > monitor_maxes[mon_type].second)
+ monitor_maxes[mon_type].second = (*i)->monitor->max();
+
+ // Record curve in monitor type list
+ it_mon_type = curves_by_mon_type.find(mon_type);
+ if (it_mon_type == curves_by_mon_type.end())
+ curves_by_mon_type[mon_type] = std::list<Curve*>();
+ curves_by_mon_type[mon_type].push_back(*i);
+ }
+
+ /* If a visualisation monitor type only has fixed maxes, then make sure the
+ * max value used is the fixed max
+ * Remember that a map iterator returns a pair of key,value!! */
+ for (mon_type_iterator i = monitor_maxes.begin(), end = monitor_maxes.end();
+ i != end; ++i)
+ {
+ if (i->second.first == 0 && i->second.second > 0)
+ i->second.first = i->second.second;
}
- if (max == 0 && fixed_max > 0)
- max = fixed_max;
- // If the text overlay is enabled, detecting all information required to output
+ /* I tried to split out the text overlay path from non-text overlay, but as
+ * the visualisation maxes need to be tied to monitor types and not simply
+ * the biggest value across all monitors, keeping everything together in a
+ * type-based loop is still the best way */
if (text_overlay_enabled)
{
text_overlay_format_string = plugin->get_viewer_text_overlay_format_string();
@@ -306,76 +354,110 @@ void CurveView::do_draw_loop()
graph_max_compact_needed = true;
}
- for (curve_iterator i = curves.begin(), end = curves.end(); i != end; ++i)
+ /* Looping for all monitor types being tracked - seems to be automagically
+ * sorted in alphabetical order??
+ * Curves are both plotted and monitor values collated for the text overlay */
+ for (curves_mon_type_iterator i = curves_by_mon_type.begin(),
+ end = curves_by_mon_type.end(); i != end; ++i)
{
+ /* Loading up relevant max, at this stage fixed_max is irrelevant -
+ * remember std::map iterator returns a pair itself! */
+ max = monitor_maxes[i->first].first;
+
+ // Debug code
+ /*plugin->debug_log(
+ String::ucompose("CurveView::do_draw_loop: In top curve monitor types"
+ " loop, monitor type '%1', max %2", i->first, max));*/
+
if (text_overlay_enabled)
{
- /* Using first monitor to obtain the text formatted value (with units) -
- * this mainly makes sense if all curves belong to the same monitor type */
- if (graph_max_needed && max_formatted.empty())
- max_formatted += "Max:" + separator_string +
- (*i)->monitor->format_value(max, false);
- if (graph_max_compact_needed && max_formatted_compact.empty())
- max_formatted_compact += "M:" + (*i)->monitor->format_value(max, true);
-
- // Collecting a string of monitor data to overlay later
- if (monitor_data_needed)
- {
- if (!(*i)->monitor->tag.empty())
- tag_string = (*i)->monitor->tag + ":" + separator_string;
- else
- tag_string = "";
+ // Resetting variables
+ monitor_data = monitor_data_compact = max_formatted
+ = max_formatted_compact = "";
+ }
- if (monitor_data.empty())
- {
- monitor_data = tag_string +
- (*i)->monitor->format_value((*i)->monitor->value(), false);
- }
- else
- {
- monitor_data.append(separator_string + tag_string +
- (*i)->monitor->format_value((*i)->monitor->value(), false));
- }
- }
- if (monitor_data_compact_needed)
+ for (curve_iterator r = i->second.begin(), end = i->second.end();
+ r != end; ++r)
+ {
+ /* With separating out the monitor curves based on type, the max and
+ * units reported on can be correct */
+ if (text_overlay_enabled)
{
- if (!(*i)->monitor->tag.empty())
- tag_string = (*i)->monitor->tag + ":";
- else
- tag_string = "";
-
- if (monitor_data_compact.empty())
+ if (graph_max_needed && max_formatted.empty())
+ max_formatted += "Max:" + separator_string +
+ (*r)->monitor->format_value(max, false);
+ if (graph_max_compact_needed && max_formatted_compact.empty())
+ max_formatted_compact += "M:" + (*r)->monitor->format_value(max, true);
+
+ // Collecting a string of monitor data to overlay later
+ if (monitor_data_needed)
{
- monitor_data_compact = tag_string +
- (*i)->monitor->format_value((*i)->monitor->value(), true);
+ if (!(*r)->monitor->tag.empty())
+ tag_string = (*r)->monitor->tag + ":" + separator_string;
+ else
+ tag_string = "";
+
+ if (monitor_data.empty())
+ {
+ monitor_data = tag_string +
+ (*r)->monitor->format_value((*r)->monitor->value(), false);
+ }
+ else
+ {
+ monitor_data.append(separator_string + tag_string +
+ (*r)->monitor->format_value((*r)->monitor->value(), false));
+ }
}
- else
+ if (monitor_data_compact_needed)
{
- monitor_data_compact.append(separator_string + tag_string +
- (*i)->monitor->format_value((*i)->monitor->value(), true));
+ if (!(*r)->monitor->tag.empty())
+ tag_string = (*r)->monitor->tag + ":";
+ else
+ tag_string = "";
+
+ if (monitor_data_compact.empty())
+ {
+ monitor_data_compact = tag_string +
+ (*r)->monitor->format_value((*r)->monitor->value(), true);
+ }
+ else
+ {
+ monitor_data_compact.append(separator_string + tag_string +
+ (*r)->monitor->format_value((*r)->monitor->value(), true));
+ }
}
}
+
+ // Drawing the curves with the unified max value
+ (*r)->draw(*canvas, width(), height(), max);
}
- // Drawing the curves with the unified max value
- (*i)->draw(*canvas, width(), height(), max);
+ if (text_overlay_enabled)
+ {
+ /* Generation of text to overlay. This is now done on a per monitor type
+ * basis so that the maxes and units can be correctly reported on
+ * C++ does not have 'replace all' functionality??? Presumably using regex
+ * would be too slow for here? */
+ per_type_overlay_text = text_overlay_format_string;
+ if (monitor_data_needed)
+ find_and_replace(per_type_overlay_text, monitor_full, monitor_data);
+ if (monitor_data_compact_needed)
+ find_and_replace(per_type_overlay_text, monitor_compact,
+ monitor_data_compact);
+ if (graph_max_needed)
+ find_and_replace(per_type_overlay_text, graph_max_full, max_formatted);
+ if (graph_max_compact_needed)
+ find_and_replace(per_type_overlay_text, graph_max_compact,
+ max_formatted_compact);
+ if (overlay_text.empty())
+ overlay_text = per_type_overlay_text;
+ else
+ overlay_text += separator_string + per_type_overlay_text;
+ }
}
- // Overlaying text of monitor values if desired
if (text_overlay_enabled)
{
- /* Generation of text to overlay - C++ does not have 'replace all'
- * functionality??? Presumably using regex would be too slow for here? */
- Glib::ustring overlay_text = text_overlay_format_string;
- if (monitor_data_needed)
- find_and_replace(overlay_text, monitor_full, monitor_data);
- if (monitor_data_compact_needed)
- find_and_replace(overlay_text, monitor_compact, monitor_data_compact);
- if (graph_max_needed)
- find_and_replace(overlay_text, graph_max_full, max_formatted);
- if (graph_max_compact_needed)
- find_and_replace(overlay_text, graph_max_compact, max_formatted_compact);
-
// Checking if overlay is already initialised
if (!text_overlay)
{
@@ -415,10 +497,9 @@ void CurveView::do_draw_loop()
if (text_overlay->property_y() != y)
text_overlay->property_y() = y;
}
-
- // Ensure text is erased if the overlay is disabled
else
{
+ // Text overlay not enabled - ensure text is erased
if (text_overlay && text_overlay->property_text() != "")
text_overlay->property_text() = "";
}
diff --git a/src/curve-view.hpp b/src/curve-view.hpp
index 1a72a59..31f1b21 100644
--- a/src/curve-view.hpp
+++ b/src/curve-view.hpp
@@ -20,8 +20,6 @@
#ifndef CURVE_VIEW_HPP
#define CURVE_VIEW_HPP
-#include <list>
-#include <vector>
#include <memory>
#include <libgnomecanvasmm/canvas.h>
@@ -68,6 +66,10 @@ private:
typedef curve_sequence::iterator curve_iterator;
curve_sequence curves;
+ // Used to move through curves maintained per monitor type
+ typedef std::map<Glib::ustring, std::list<Curve*>>::iterator
+ curves_mon_type_iterator;
+
Gnome::Canvas::Text *text_overlay;
// Text overlay format string substitution codes
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list