#pragma once #include "cvfBase.h" #include "cvfArray.h" #include "cvfCamera.h" #include "cvfOverlayItem.h" #include "cvfRect.h" #include "cvfString.h" namespace cvf { class Font; class ShaderProgram; class MatrixState; class TextDrawer; } namespace caf { class CategoryMapper; //================================================================================================== // // //================================================================================================== class CategoryLegend : public cvf::OverlayItem { public: CategoryLegend(cvf::Font* font, const CategoryMapper* categoryMapper); virtual ~CategoryLegend(); virtual cvf::Vec2ui sizeHint(); virtual void render(cvf::OpenGLContext* oglContext, const cvf::Vec2i& position, const cvf::Vec2ui& size); virtual void renderSoftware(cvf::OpenGLContext* oglContext, const cvf::Vec2i& position, const cvf::Vec2ui& size); virtual bool pick(int oglXCoord, int oglYCoord, const cvf::Vec2i& position, const cvf::Vec2ui& size); void setSizeHint(const cvf::Vec2ui& size); void setColor(const cvf::Color3f& color); const cvf::Color3f& color() const; void setLineColor(const cvf::Color3f& lineColor); const cvf::Color3f& lineColor() const; void setLineWidth(int lineWidth); int lineWidth() const; void setTitle(const cvf::String& title); cvf::String title() const; size_t categoryCount() const; protected: //================================================================================================== // // Helper for storing layout info // //================================================================================================== struct OverlayColorLegendLayoutInfo { OverlayColorLegendLayoutInfo(const cvf::Vec2i& pos, const cvf::Vec2ui& setSize) { position = pos; size = setSize; } float charHeight; float lineSpacing; cvf::Vec2f margins; float tickX; float x0, x1; cvf::Rectf legendRect; cvf::Vec2i position; cvf::Vec2ui size; }; void render(cvf::OpenGLContext* oglContext, const cvf::Vec2i& position, const cvf::Vec2ui& size, bool software); virtual void renderLegend(cvf::OpenGLContext* oglContext, OverlayColorLegendLayoutInfo* layout, const cvf::MatrixState& matrixState); virtual void renderLegendImmediateMode(cvf::OpenGLContext* oglContext, OverlayColorLegendLayoutInfo* layout); virtual void setupTextDrawer(cvf::TextDrawer* textDrawer, OverlayColorLegendLayoutInfo* layout); void layoutInfo(OverlayColorLegendLayoutInfo* layout); protected: std::vector m_visibleCategoryLabels; // Skip labels ending up on top of previous visible label cvf::Vec2ui m_sizeHint; // Pixel size of the color legend area cvf::Color3f m_color; cvf::Color3f m_lineColor; int m_lineWidth; std::vector m_titleStrings; cvf::ref m_font; cvf::cref m_categoryMapper; }; }