Index: binaries/data/mods/mod/gui/common/modern/styles.xml
===================================================================
--- binaries/data/mods/mod/gui/common/modern/styles.xml
+++ binaries/data/mods/mod/gui/common/modern/styles.xml
@@ -172,4 +172,12 @@
text_valign="center"
sound_pressed="audio/interface/ui/ui_button_click.ogg"
/>
+
Index: binaries/data/mods/mod/gui/gui.rnc
===================================================================
--- binaries/data/mods/mod/gui/gui.rnc
+++ binaries/data/mods/mod/gui/gui.rnc
@@ -47,6 +47,7 @@
# Defaults are not put in here, because it ruins the concept of styles.
ex_settings =
attribute anchor { valign }?&
+ attribute axis_color { ccolor }?&
attribute buffer_zone { xsd:decimal }?&
attribute buffer_width { xsd:decimal }?&
attribute button_width { xsd:decimal }?&
@@ -56,6 +57,8 @@
attribute dropdown_buffer { xsd:decimal }?&
attribute enabled { bool }?&
attribute font { text }?&
+ attribute format_x { text }?&
+ attribute format_y { text }?&
attribute fov_wedge_color { ccolor }?&
attribute heading_height { text }?&
attribute hotkey { text }?&
Index: binaries/data/mods/mod/gui/gui.rng
===================================================================
--- binaries/data/mods/mod/gui/gui.rng
+++ binaries/data/mods/mod/gui/gui.rng
@@ -175,6 +175,11 @@
+
+
+
+
+
@@ -218,6 +223,12 @@
+
+
+
+
+
+
Index: binaries/data/mods/public/gui/summary/summary.xml
===================================================================
--- binaries/data/mods/public/gui/summary/summary.xml
+++ binaries/data/mods/public/gui/summary/summary.xml
@@ -195,7 +195,7 @@
-
+
Index: source/gui/CChart.h
===================================================================
--- source/gui/CChart.h
+++ source/gui/CChart.h
@@ -19,6 +19,7 @@
#define INCLUDED_CCHART
#include "GUI.h"
+#include "IGUITextOwner.h"
#include "graphics/Color.h"
#include "maths/Vector2D.h"
#include
@@ -35,7 +36,7 @@
*
* @see IGUIObject
*/
-class CChart : public IGUIObject
+class CChart : public IGUITextOwner
{
GUI_OBJECT(CChart)
@@ -58,13 +59,23 @@
void UpdateSeries();
+ void SetupText();
+
std::vector m_Series;
+ CVector2D m_LeftBottom, m_RightTop;
+
+ CStrW m_FormatX, m_FormatY;
+
+ std::vector m_TextPositions;
+
private:
/**
* Helper function
*/
void DrawLine(const CShaderProgramPtr& shader, const CColor& color, const std::vector& vertices) const;
+
+ CSize AddFormatedValue(const CStrW& format, const float value, const CStrW& font, const float buffer_zone);
};
#endif // INCLUDED_CCHART
Index: source/gui/CChart.cpp
===================================================================
--- source/gui/CChart.cpp
+++ source/gui/CChart.cpp
@@ -22,13 +22,23 @@
#include "lib/ogl.h"
#include "ps/CLogger.h"
#include "renderer/Renderer.h"
+#include "third_party/cppformat/format.h"
#include
CChart::CChart()
{
+ AddSetting(GUIST_CColor, "axis_color");
+ AddSetting(GUIST_float, "buffer_zone");
+ AddSetting(GUIST_CStrW, "font");
+ AddSetting(GUIST_CStrW, "format_x");
+ AddSetting(GUIST_CStrW, "format_y");
AddSetting(GUIST_CGUIList, "series_color");
AddSetting(GUIST_CGUISeries, "series");
+ AddSetting(GUIST_EAlign, "text_align");
+
+ GUI::GetSetting(this, "format_x", m_FormatX);
+ GUI::GetSetting(this, "format_y", m_FormatY);
}
CChart::~CChart()
@@ -90,28 +100,27 @@
CShaderProgramPtr shader = tech->GetShader();
shader->Uniform(str_transform, transform);
- CVector2D leftBottom, rightTop;
- leftBottom = rightTop = m_Series[0].m_Points[0];
+ m_LeftBottom = m_RightTop = m_Series[0].m_Points[0];
for (const CChartData& data : m_Series)
for (const CVector2D& point : data.m_Points)
{
- if (fabs(point.X) != std::numeric_limits::infinity() && point.X < leftBottom.X)
- leftBottom.X = point.X;
- if (fabs(point.Y) != std::numeric_limits::infinity() && point.Y < leftBottom.Y)
- leftBottom.Y = point.Y;
-
- if (fabs(point.X) != std::numeric_limits::infinity() && point.X > rightTop.X)
- rightTop.X = point.X;
- if (fabs(point.Y) != std::numeric_limits::infinity() && point.Y > rightTop.Y)
- rightTop.Y = point.Y;
+ if (fabs(point.X) != std::numeric_limits::infinity() && point.X < m_LeftBottom.X)
+ m_LeftBottom.X = point.X;
+ if (fabs(point.Y) != std::numeric_limits::infinity() && point.Y < m_LeftBottom.Y)
+ m_LeftBottom.Y = point.Y;
+
+ if (fabs(point.X) != std::numeric_limits::infinity() && point.X > m_RightTop.X)
+ m_RightTop.X = point.X;
+ if (fabs(point.Y) != std::numeric_limits::infinity() && point.Y > m_RightTop.Y)
+ m_RightTop.Y = point.Y;
}
- if (rightTop.Y == leftBottom.Y)
- rightTop.Y += 1;
- if (rightTop.X == leftBottom.X)
- rightTop.X += 1;
+ if (m_RightTop.Y == m_LeftBottom.Y)
+ m_RightTop.Y += 1;
+ if (m_RightTop.X == m_LeftBottom.X)
+ m_RightTop.X += 1;
- CVector2D scale(width / (rightTop.X - leftBottom.X), height / (rightTop.Y - leftBottom.Y));
+ CVector2D scale(width / (m_RightTop.X - m_LeftBottom.X), height / (m_RightTop.Y - m_LeftBottom.Y));
for (const CChartData& data : m_Series)
{
@@ -123,8 +132,8 @@
{
if (fabs(point.Y) != std::numeric_limits::infinity() && fabs(point.Y) != std::numeric_limits::infinity())
{
- vertices.push_back(rect.left + (point.X - leftBottom.X) * scale.X);
- vertices.push_back(rect.bottom - (point.Y - leftBottom.Y) * scale.Y);
+ vertices.push_back(rect.left + (point.X - m_LeftBottom.X) * scale.X);
+ vertices.push_back(rect.bottom - (point.Y - m_LeftBottom.Y) * scale.Y);
vertices.push_back(bz + 0.5f);
}
else
@@ -137,10 +146,25 @@
DrawLine(shader, data.m_Color, vertices);
}
+ std::vector vertices;
+#define ADD(x, y, z) vertices.push_back(x); vertices.push_back(y); vertices.push_back(z);
+ ADD(rect.left, rect.top, bz + 0.5f);
+ ADD(rect.left, rect.bottom, bz + 0.5f);
+ ADD(rect.right, rect.bottom, bz + 0.5f);
+ ADD(rect.right, rect.top, bz + 0.5f);
+ ADD(rect.left, rect.top, bz + 0.5f);
+#undef ADD
+ CColor axis_color(0.5f, 0.5f, 0.5f, 1.f);
+ GUI::GetSetting(this, "axis_color", axis_color);
+ DrawLine(shader, axis_color, vertices);
+
tech->EndPass();
// Reset depth mask
glDepthMask(1);
+
+ for (size_t i = 0; i < m_TextPositions.size(); ++i)
+ DrawText(i, CColor(1.f, 1.f, 1.f, 1.f), m_TextPositions[i], bz + 0.5f);
}
CRect CChart::GetChartRect() const
@@ -167,4 +191,59 @@
data.m_Points = pSeries->m_Series[i];
}
+
+ SetupText();
+}
+
+void CChart::SetupText()
+{
+ if (!GetGUI())
+ return;
+
+ for (SGUIText* const& t : m_GeneratedTexts)
+ delete t;
+ m_GeneratedTexts.clear();
+ m_TextPositions.clear();
+
+ if (m_Series.empty())
+ return;
+
+ CStrW font;
+ if (GUI::GetSetting(this, "font", font) != PSRETURN_OK || font.empty())
+ // Use the default if none is specified
+ // TODO Gee: (2004-08-14) Don't define standard like this. Do it with the default style.
+ font = L"default";
+
+ float buffer_zone = 0.f;
+ GUI::GetSetting(this, "buffer_zone", buffer_zone);
+
+ // Add Y-axis
+ GUI::GetSetting(this, "format_y", m_FormatY);
+ const float height = GetChartRect().GetHeight();
+ for (int i = 0; i < 3; ++i)
+ {
+ AddFormatedValue(m_FormatY, m_RightTop.Y - (m_RightTop.Y - m_LeftBottom.Y) / 3 * i, font, buffer_zone);
+ m_TextPositions.emplace_back(GetChartRect().TopLeft() + CPos(0.f, height / 3 * i));
+ }
+
+ // Add X-axis
+ GUI::GetSetting(this, "format_x", m_FormatX);
+ const float width = GetChartRect().GetWidth();
+ for (int i = 0; i < 3; ++i)
+ {
+ CSize text_size = AddFormatedValue(m_FormatX, m_RightTop.X - (m_RightTop.X - m_LeftBottom.X) / 3 * i, font, buffer_zone);
+ m_TextPositions.emplace_back(GetChartRect().BottomRight() - text_size - CPos(width / 3 * i, 0));
+ }
+}
+
+CSize CChart::AddFormatedValue(const CStrW& format, const float value, const CStrW& font, const float buffer_zone)
+{
+ wchar_t buffer[64];
+ swprintf(buffer, 64, format.c_str(), value);
+ CGUIString gui_str;
+ gui_str.SetValue(buffer);
+ SGUIText* text = new SGUIText();
+ *text = GetGUI()->GenerateText(gui_str, font, 0, buffer_zone, this);
+ AddText(text);
+ return text->m_Size;
}