Changeset View
Changeset View
Standalone View
Standalone View
source/gui/CChart.cpp
Show All 25 Lines | |||||
#include "gui/GUIMatrix.h" | #include "gui/GUIMatrix.h" | ||||
#include "ps/CLogger.h" | #include "ps/CLogger.h" | ||||
#include "ps/Profile.h" | #include "ps/Profile.h" | ||||
#include "renderer/Renderer.h" | #include "renderer/Renderer.h" | ||||
#include <cmath> | #include <cmath> | ||||
CChart::CChart(CGUI& pGUI) | CChart::CChart(CGUI& pGUI) | ||||
: IGUIObject(pGUI), IGUITextOwner(pGUI) | : IGUIObject(pGUI), IGUITextOwner(pGUI), | ||||
{ | m_AxisColor(), | ||||
AddSetting<CGUIColor>("axis_color"); | m_AxisWidth(), | ||||
AddSetting<float>("axis_width"); | m_BufferZone(), | ||||
AddSetting<float>("buffer_zone"); | m_Font(), | ||||
AddSetting<CStrW>("font"); | m_FormatX(), | ||||
AddSetting<CStrW>("format_x"); | m_FormatY(), | ||||
AddSetting<CStrW>("format_y"); | m_SeriesColor(), | ||||
AddSetting<CGUIList>("series_color"); | m_SeriesSetting(), | ||||
AddSetting<CGUISeries>("series"); | m_TextAlign() | ||||
AddSetting<EAlign>("text_align"); | { | ||||
RegisterSetting<CGUIColor>("axis_color", m_AxisColor); | |||||
m_AxisWidth = GetSetting<float>("axis_width"); | RegisterSetting<float>("axis_width", m_AxisWidth); | ||||
m_FormatX = GetSetting<CStrW>("format_x"); | RegisterSetting<float>("buffer_zone", m_BufferZone); | ||||
m_FormatY = GetSetting<CStrW>("format_y"); | RegisterSetting<CStrW>("font", m_Font); | ||||
RegisterSetting<CStrW>("format_x", m_FormatX); | |||||
RegisterSetting<CStrW>("format_y", m_FormatY); | |||||
RegisterSetting<CGUIList>("series_color", m_SeriesColor); | |||||
RegisterSetting<CGUISeries>("series", m_SeriesSetting); | |||||
RegisterSetting<EAlign>("text_align", m_TextAlign); | |||||
} | } | ||||
CChart::~CChart() | CChart::~CChart() | ||||
{ | { | ||||
} | } | ||||
void CChart::HandleMessage(SGUIMessage& Message) | void CChart::HandleMessage(SGUIMessage& Message) | ||||
{ | { | ||||
// TODO: implement zoom | // TODO: implement zoom | ||||
switch (Message.type) | switch (Message.type) | ||||
{ | { | ||||
case GUIM_SETTINGS_UPDATED: | case GUIM_SETTINGS_UPDATED: | ||||
{ | { | ||||
m_AxisWidth = GetSetting<float>("axis_width"); | |||||
m_FormatX = GetSetting<CStrW>("format_x"); | |||||
m_FormatY = GetSetting<CStrW>("format_y"); | |||||
UpdateSeries(); | UpdateSeries(); | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
void CChart::DrawLine(const CShaderProgramPtr& shader, const CGUIColor& color, const std::vector<float>& vertices) const | void CChart::DrawLine(const CShaderProgramPtr& shader, const CGUIColor& color, const std::vector<float>& vertices) const | ||||
{ | { | ||||
Show All 28 Lines | |||||
#define ADD(x, y) vertices.push_back(x); vertices.push_back(y); vertices.push_back(bz + 0.5f); | #define ADD(x, y) vertices.push_back(x); vertices.push_back(y); vertices.push_back(bz + 0.5f); | ||||
ADD(m_CachedActualSize.right, m_CachedActualSize.bottom); | ADD(m_CachedActualSize.right, m_CachedActualSize.bottom); | ||||
ADD(rect.right + m_AxisWidth, rect.bottom); | ADD(rect.right + m_AxisWidth, rect.bottom); | ||||
ADD(m_CachedActualSize.left, m_CachedActualSize.bottom); | ADD(m_CachedActualSize.left, m_CachedActualSize.bottom); | ||||
ADD(rect.left, rect.bottom); | ADD(rect.left, rect.bottom); | ||||
ADD(m_CachedActualSize.left, m_CachedActualSize.top); | ADD(m_CachedActualSize.left, m_CachedActualSize.top); | ||||
ADD(rect.left, rect.top - m_AxisWidth); | ADD(rect.left, rect.top - m_AxisWidth); | ||||
#undef ADD | #undef ADD | ||||
DrawTriangleStrip(shader, GetSetting<CGUIColor>("axis_color"), vertices); | DrawTriangleStrip(shader, m_AxisColor, vertices); | ||||
} | } | ||||
void CChart::Draw() | void CChart::Draw() | ||||
{ | { | ||||
PROFILE3("render chart"); | PROFILE3("render chart"); | ||||
if (m_Series.empty()) | if (m_Series.empty()) | ||||
return; | return; | ||||
▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | CRect CChart::GetChartRect() const | ||||
return CRect( | return CRect( | ||||
m_CachedActualSize.TopLeft() + CPos(m_AxisWidth, m_AxisWidth), | m_CachedActualSize.TopLeft() + CPos(m_AxisWidth, m_AxisWidth), | ||||
m_CachedActualSize.BottomRight() - CPos(m_AxisWidth, m_AxisWidth) | m_CachedActualSize.BottomRight() - CPos(m_AxisWidth, m_AxisWidth) | ||||
); | ); | ||||
} | } | ||||
void CChart::UpdateSeries() | void CChart::UpdateSeries() | ||||
{ | { | ||||
const CGUISeries& pSeries = GetSetting<CGUISeries>("series"); | |||||
const CGUIList& pSeriesColor = GetSetting<CGUIList>("series_color"); | |||||
m_Series.clear(); | m_Series.clear(); | ||||
m_Series.resize(pSeries.m_Series.size()); | m_Series.resize(m_SeriesSetting.m_Series.size()); | ||||
for (size_t i = 0; i < pSeries.m_Series.size(); ++i) | |||||
for (size_t i = 0; i < m_SeriesSetting.m_Series.size(); ++i) | |||||
{ | { | ||||
CChartData& data = m_Series[i]; | CChartData& data = m_Series[i]; | ||||
if (i < pSeriesColor.m_Items.size() && !data.m_Color.ParseString(m_pGUI, pSeriesColor.m_Items[i].GetOriginalString().ToUTF8(), 0)) | if (i < m_SeriesColor.m_Items.size() && !data.m_Color.ParseString(m_pGUI, m_SeriesColor.m_Items[i].GetOriginalString().ToUTF8(), 0)) | ||||
LOGWARNING("GUI: Error parsing 'series_color' (\"%s\")", utf8_from_wstring(pSeriesColor.m_Items[i].GetOriginalString())); | LOGWARNING("GUI: Error parsing 'series_color' (\"%s\")", utf8_from_wstring(m_SeriesColor.m_Items[i].GetOriginalString())); | ||||
data.m_Points = pSeries.m_Series[i]; | data.m_Points = m_SeriesSetting.m_Series[i]; | ||||
} | } | ||||
UpdateBounds(); | UpdateBounds(); | ||||
SetupText(); | SetupText(); | ||||
} | } | ||||
void CChart::SetupText() | void CChart::SetupText() | ||||
{ | { | ||||
m_GeneratedTexts.clear(); | m_GeneratedTexts.clear(); | ||||
m_TextPositions.clear(); | m_TextPositions.clear(); | ||||
if (m_Series.empty()) | if (m_Series.empty()) | ||||
return; | return; | ||||
const CStrW& font = GetSetting<CStrW>("font"); | |||||
const float buffer_zone = GetSetting<float>("buffer_zone"); | |||||
// Add Y-axis | // Add Y-axis | ||||
m_FormatY = GetSetting<CStrW>("format_y"); | |||||
const float height = GetChartRect().GetHeight(); | const float height = GetChartRect().GetHeight(); | ||||
// TODO: split values depend on the format; | // TODO: split values depend on the format; | ||||
if (m_EqualY) | if (m_EqualY) | ||||
{ | { | ||||
// We don't need to generate many items for equal values | // We don't need to generate many items for equal values | ||||
AddFormattedValue(m_FormatY, m_RightTop.Y, font, buffer_zone); | AddFormattedValue(m_FormatY, m_RightTop.Y, m_Font, m_BufferZone); | ||||
m_TextPositions.emplace_back(GetChartRect().TopLeft()); | m_TextPositions.emplace_back(GetChartRect().TopLeft()); | ||||
} | } | ||||
else | else | ||||
for (int i = 0; i < 3; ++i) | for (int i = 0; i < 3; ++i) | ||||
{ | { | ||||
AddFormattedValue(m_FormatY, m_RightTop.Y - (m_RightTop.Y - m_LeftBottom.Y) / 3.f * i, font, buffer_zone); | AddFormattedValue(m_FormatY, m_RightTop.Y - (m_RightTop.Y - m_LeftBottom.Y) / 3.f * i, m_Font, m_BufferZone); | ||||
m_TextPositions.emplace_back(GetChartRect().TopLeft() + CPos(0.f, height / 3.f * i)); | m_TextPositions.emplace_back(GetChartRect().TopLeft() + CPos(0.f, height / 3.f * i)); | ||||
} | } | ||||
// Add X-axis | // Add X-axis | ||||
m_FormatX = GetSetting<CStrW>("format_x"); | |||||
const float width = GetChartRect().GetWidth(); | const float width = GetChartRect().GetWidth(); | ||||
if (m_EqualX) | if (m_EqualX) | ||||
{ | { | ||||
CSize text_size = AddFormattedValue(m_FormatX, m_RightTop.X, font, buffer_zone); | CSize text_size = AddFormattedValue(m_FormatX, m_RightTop.X, m_Font, m_BufferZone); | ||||
m_TextPositions.emplace_back(GetChartRect().BottomRight() - text_size); | m_TextPositions.emplace_back(GetChartRect().BottomRight() - text_size); | ||||
} | } | ||||
else | else | ||||
for (int i = 0; i < 3; ++i) | for (int i = 0; i < 3; ++i) | ||||
{ | { | ||||
CSize text_size = AddFormattedValue(m_FormatX, m_RightTop.X - (m_RightTop.X - m_LeftBottom.X) / 3 * i, font, buffer_zone); | CSize text_size = AddFormattedValue(m_FormatX, m_RightTop.X - (m_RightTop.X - m_LeftBottom.X) / 3 * i, m_Font, m_BufferZone); | ||||
m_TextPositions.emplace_back(GetChartRect().BottomRight() - text_size - CPos(width / 3 * i, 0.f)); | m_TextPositions.emplace_back(GetChartRect().BottomRight() - text_size - CPos(width / 3 * i, 0.f)); | ||||
} | } | ||||
} | } | ||||
CSize CChart::AddFormattedValue(const CStrW& format, const float value, const CStrW& font, const float buffer_zone) | CSize CChart::AddFormattedValue(const CStrW& format, const float value, const CStrW& font, const float buffer_zone) | ||||
{ | { | ||||
// TODO: we need to catch cases with equal formatted values. | // TODO: we need to catch cases with equal formatted values. | ||||
CGUIString gui_str; | CGUIString gui_str; | ||||
▲ Show 20 Lines • Show All 64 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator