mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#52 Add background to category legend
This commit is contained in:
parent
c258528dc5
commit
7bd08067a9
@ -27,6 +27,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "cvfScalarMapper.h"
|
#include "cvfScalarMapper.h"
|
||||||
|
#include "cafInternalLegendRenderTools.h"
|
||||||
|
|
||||||
|
|
||||||
using namespace cvf;
|
using namespace cvf;
|
||||||
@ -41,6 +42,9 @@ CategoryLegend::CategoryLegend(Font* font, const CategoryMapper* categoryMapper)
|
|||||||
: m_sizeHint(200, 200),
|
: m_sizeHint(200, 200),
|
||||||
m_textColor(Color3::BLACK),
|
m_textColor(Color3::BLACK),
|
||||||
m_lineColor(Color3::BLACK),
|
m_lineColor(Color3::BLACK),
|
||||||
|
m_backgroundColor(1.0f, 1.0f, 1.0f, 0.8f),
|
||||||
|
m_backgroundFrameColor(0.0f, 0.0f, 0.0f, 0.5f),
|
||||||
|
m_isBackgroundEnabled(true),
|
||||||
m_lineWidth(1),
|
m_lineWidth(1),
|
||||||
m_font(font),
|
m_font(font),
|
||||||
m_categoryMapper(categoryMapper)
|
m_categoryMapper(categoryMapper)
|
||||||
@ -156,7 +160,10 @@ bool CategoryLegend::pick(int oglXCoord, int oglYCoord, const Vec2i& position, c
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
/// Set up camera/viewport and render
|
/// Set up camera/viewport and render
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void CategoryLegend::renderGeneric(OpenGLContext* oglContext, const Vec2i& position, const Vec2ui& size, bool software)
|
void CategoryLegend::renderGeneric(OpenGLContext* oglContext,
|
||||||
|
const Vec2i& position,
|
||||||
|
const Vec2ui& size,
|
||||||
|
bool software)
|
||||||
{
|
{
|
||||||
if (size.x() <= 0 || size.y() <= 0)
|
if (size.x() <= 0 || size.y() <= 0)
|
||||||
{
|
{
|
||||||
@ -176,18 +183,30 @@ void CategoryLegend::renderGeneric(OpenGLContext* oglContext, const Vec2i& posit
|
|||||||
layoutInfo(&layout);
|
layoutInfo(&layout);
|
||||||
|
|
||||||
// Set up text drawer
|
// Set up text drawer
|
||||||
|
float maxLegendRightPos = 0;
|
||||||
TextDrawer textDrawer(m_font.p());
|
TextDrawer textDrawer(m_font.p());
|
||||||
setupTextDrawer(&textDrawer, &layout);
|
setupTextDrawer(&textDrawer, &layout, &maxLegendRightPos);
|
||||||
|
|
||||||
|
Vec2f backgroundSize(maxLegendRightPos + 3.0f, (float)size.y());
|
||||||
|
|
||||||
// Do the actual rendering
|
// Do the actual rendering
|
||||||
if (software)
|
if (software)
|
||||||
{
|
{
|
||||||
|
if (m_isBackgroundEnabled) InternalLegendRenderTools::renderBackgroundImmediateMode(oglContext,
|
||||||
|
backgroundSize,
|
||||||
|
m_backgroundColor,
|
||||||
|
m_backgroundFrameColor);
|
||||||
renderLegendImmediateMode(oglContext, &layout);
|
renderLegendImmediateMode(oglContext, &layout);
|
||||||
textDrawer.renderSoftware(oglContext, camera);
|
textDrawer.renderSoftware(oglContext, camera);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const MatrixState matrixState(camera);
|
const MatrixState matrixState(camera);
|
||||||
|
if (m_isBackgroundEnabled) InternalLegendRenderTools::renderBackgroundUsingShaders(oglContext,
|
||||||
|
matrixState,
|
||||||
|
backgroundSize,
|
||||||
|
m_backgroundColor,
|
||||||
|
m_backgroundFrameColor);
|
||||||
renderLegendUsingShaders(oglContext, &layout, matrixState);
|
renderLegendUsingShaders(oglContext, &layout, matrixState);
|
||||||
textDrawer.render(oglContext, camera);
|
textDrawer.render(oglContext, camera);
|
||||||
}
|
}
|
||||||
@ -198,7 +217,9 @@ void CategoryLegend::renderGeneric(OpenGLContext* oglContext, const Vec2i& posit
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void CategoryLegend::setupTextDrawer(TextDrawer* textDrawer, OverlayColorLegendLayoutInfo* layout)
|
void CategoryLegend::setupTextDrawer(TextDrawer* textDrawer,
|
||||||
|
OverlayColorLegendLayoutInfo* layout,
|
||||||
|
float* maxLegendRightPos)
|
||||||
{
|
{
|
||||||
if (m_categoryMapper.isNull())
|
if (m_categoryMapper.isNull())
|
||||||
{
|
{
|
||||||
@ -207,6 +228,8 @@ void CategoryLegend::setupTextDrawer(TextDrawer* textDrawer, OverlayColorLegendL
|
|||||||
|
|
||||||
CVF_ASSERT(layout);
|
CVF_ASSERT(layout);
|
||||||
|
|
||||||
|
float legendRight = 0.0f;
|
||||||
|
|
||||||
textDrawer->setVerticalAlignment(TextDrawer::CENTER);
|
textDrawer->setVerticalAlignment(TextDrawer::CENTER);
|
||||||
textDrawer->setTextColor(m_textColor);
|
textDrawer->setTextColor(m_textColor);
|
||||||
|
|
||||||
@ -251,6 +274,9 @@ void CategoryLegend::setupTextDrawer(TextDrawer* textDrawer, OverlayColorLegendL
|
|||||||
Vec2f pos(textX, textY);
|
Vec2f pos(textX, textY);
|
||||||
textDrawer->addText(displayText, pos);
|
textDrawer->addText(displayText, pos);
|
||||||
|
|
||||||
|
float neededRightPos = pos.x() + m_font->textExtent(displayText).x();
|
||||||
|
legendRight = legendRight >= neededRightPos ? legendRight :neededRightPos;
|
||||||
|
|
||||||
lastVisibleTextY = textY;
|
lastVisibleTextY = textY;
|
||||||
m_visibleCategoryLabels.push_back(true);
|
m_visibleCategoryLabels.push_back(true);
|
||||||
}
|
}
|
||||||
@ -261,14 +287,21 @@ void CategoryLegend::setupTextDrawer(TextDrawer* textDrawer, OverlayColorLegendL
|
|||||||
Vec2f pos(layout->margins.x(), titleY);
|
Vec2f pos(layout->margins.x(), titleY);
|
||||||
textDrawer->addText(m_titleStrings[it], pos);
|
textDrawer->addText(m_titleStrings[it], pos);
|
||||||
|
|
||||||
|
float neededRightPos = pos.x() + m_font->textExtent(m_titleStrings[it]).x();
|
||||||
|
legendRight = legendRight >= neededRightPos ? legendRight :neededRightPos;
|
||||||
|
|
||||||
titleY -= layout->lineSpacing;
|
titleY -= layout->lineSpacing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*maxLegendRightPos = legendRight;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
/// Draw the legend using shader programs
|
/// Draw the legend using shader programs
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void CategoryLegend::renderLegendUsingShaders(OpenGLContext* oglContext, OverlayColorLegendLayoutInfo* layout, const MatrixState& matrixState)
|
void CategoryLegend::renderLegendUsingShaders(OpenGLContext* oglContext,
|
||||||
|
OverlayColorLegendLayoutInfo* layout,
|
||||||
|
const MatrixState& matrixState)
|
||||||
{
|
{
|
||||||
CVF_CALLSITE_OPENGL(oglContext);
|
CVF_CALLSITE_OPENGL(oglContext);
|
||||||
|
|
||||||
@ -530,6 +563,30 @@ void CategoryLegend::setLineWidth(int lineWidth)
|
|||||||
m_lineWidth = lineWidth;
|
m_lineWidth = lineWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void CategoryLegend::setBackgroundColor(const Color4f& backgroundColor)
|
||||||
|
{
|
||||||
|
m_backgroundColor = backgroundColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void CategoryLegend::setBackgroundFrameColor(const Color4f& backgroundFrameColor)
|
||||||
|
{
|
||||||
|
m_backgroundFrameColor = backgroundFrameColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void CategoryLegend::enableBackground(bool enable)
|
||||||
|
{
|
||||||
|
m_isBackgroundEnabled = enable;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,6 +36,10 @@ public:
|
|||||||
void setLineWidth(int lineWidth);
|
void setLineWidth(int lineWidth);
|
||||||
void setTitle(const cvf::String& title);
|
void setTitle(const cvf::String& title);
|
||||||
|
|
||||||
|
void enableBackground(bool enable);
|
||||||
|
void setBackgroundColor(const cvf::Color4f& backgroundColor);
|
||||||
|
void setBackgroundFrameColor(const cvf::Color4f& backgroundFrameColor);
|
||||||
|
|
||||||
size_t categoryCount() const;
|
size_t categoryCount() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -73,10 +77,18 @@ protected:
|
|||||||
|
|
||||||
void layoutInfo(OverlayColorLegendLayoutInfo* layout);
|
void layoutInfo(OverlayColorLegendLayoutInfo* layout);
|
||||||
|
|
||||||
void renderGeneric(cvf::OpenGLContext* oglContext, const cvf::Vec2i& position, const cvf::Vec2ui& size, bool software);
|
void renderGeneric(cvf::OpenGLContext* oglContext,
|
||||||
void setupTextDrawer(cvf::TextDrawer* textDrawer, OverlayColorLegendLayoutInfo* layout);
|
const cvf::Vec2i& position,
|
||||||
void renderLegendUsingShaders(cvf::OpenGLContext* oglContext, OverlayColorLegendLayoutInfo* layout, const cvf::MatrixState& matrixState);
|
const cvf::Vec2ui& size,
|
||||||
void renderLegendImmediateMode(cvf::OpenGLContext* oglContext, OverlayColorLegendLayoutInfo* layout);
|
bool software);
|
||||||
|
void setupTextDrawer(cvf::TextDrawer* textDrawer,
|
||||||
|
OverlayColorLegendLayoutInfo* layout,
|
||||||
|
float* maxLegendRightPos);
|
||||||
|
void renderLegendUsingShaders(cvf::OpenGLContext* oglContext,
|
||||||
|
OverlayColorLegendLayoutInfo* layout,
|
||||||
|
const cvf::MatrixState& matrixState);
|
||||||
|
void renderLegendImmediateMode(cvf::OpenGLContext* oglContext,
|
||||||
|
OverlayColorLegendLayoutInfo* layout);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::vector<bool> m_visibleCategoryLabels; // Skip labels ending up on top of previous visible label
|
std::vector<bool> m_visibleCategoryLabels; // Skip labels ending up on top of previous visible label
|
||||||
@ -89,6 +101,10 @@ protected:
|
|||||||
std::vector<cvf::String> m_titleStrings;
|
std::vector<cvf::String> m_titleStrings;
|
||||||
cvf::ref<cvf::Font> m_font;
|
cvf::ref<cvf::Font> m_font;
|
||||||
|
|
||||||
|
bool m_isBackgroundEnabled;
|
||||||
|
cvf::Color4f m_backgroundColor;
|
||||||
|
cvf::Color4f m_backgroundFrameColor;
|
||||||
|
|
||||||
cvf::cref<CategoryMapper> m_categoryMapper;
|
cvf::cref<CategoryMapper> m_categoryMapper;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user