#4184 Resize legend if it becomes larger than plot area.

This commit is contained in:
Gaute Lindkvist 2019-03-07 19:00:38 +01:00
parent 804a196ce3
commit 6f1ed595b5
5 changed files with 90 additions and 10 deletions

View File

@ -652,7 +652,7 @@ QList<caf::PdmOptionItemInfo> RimGridCrossPlotCurveSet::calculateValueOptions(co
else if (fieldNeedingOptions == &m_grouping) else if (fieldNeedingOptions == &m_grouping)
{ {
std::set<RigGridCrossPlotCurveGrouping> validOptions = { NO_GROUPING, GROUP_BY_TIME, GROUP_BY_FORMATION, GROUP_BY_RESULT }; std::set<RigGridCrossPlotCurveGrouping> validOptions = { NO_GROUPING, GROUP_BY_TIME, GROUP_BY_FORMATION, GROUP_BY_RESULT };
if (m_timeStep() != -1 || !(m_xAxisProperty->hasDynamicResult() || m_yAxisProperty->hasDynamicResult())) if (!hasMultipleTimeSteps())
{ {
validOptions.erase(GROUP_BY_TIME); validOptions.erase(GROUP_BY_TIME);
} }
@ -678,6 +678,7 @@ QList<caf::PdmOptionItemInfo> RimGridCrossPlotCurveSet::calculateValueOptions(co
void RimGridCrossPlotCurveSet::updateLegend() void RimGridCrossPlotCurveSet::updateLegend()
{ {
legendConfig()->setTitle(groupParameter()); legendConfig()->setTitle(groupParameter());
legendConfig()->disableAllTimeStepsRange(!hasMultipleTimeSteps());
RimGridCrossPlot* parent; RimGridCrossPlot* parent;
this->firstAncestorOrThisOfTypeAsserted(parent); this->firstAncestorOrThisOfTypeAsserted(parent);
@ -889,6 +890,15 @@ void RimGridCrossPlotCurveSet::defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTr
uiTreeOrdering.skipRemainingChildren(true); uiTreeOrdering.skipRemainingChildren(true);
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimGridCrossPlotCurveSet::hasMultipleTimeSteps() const
{
return m_timeStep() == -1 && (m_xAxisProperty->hasDynamicResult() || m_yAxisProperty->hasDynamicResult());
}
CAF_PDM_SOURCE_INIT(RimGridCrossPlotCurveSetNameConfig, "RimGridCrossPlotCurveSetNameConfig"); CAF_PDM_SOURCE_INIT(RimGridCrossPlotCurveSetNameConfig, "RimGridCrossPlotCurveSetNameConfig");
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -134,6 +134,7 @@ protected:
void defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "") override; void defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "") override;
bool hasMultipleTimeSteps() const;
private: private:
caf::PdmPtrField<RimCase*> m_case; caf::PdmPtrField<RimCase*> m_case;
caf::PdmField<int> m_timeStep; caf::PdmField<int> m_timeStep;

View File

@ -26,6 +26,8 @@
#include "cafTitledOverlayFrame.h" #include "cafTitledOverlayFrame.h"
#include <QResizeEvent>
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -37,18 +39,18 @@ RiuGridCrossQwtPlot::RiuGridCrossQwtPlot(RimViewWindow* ownerViewWindow, QWidget
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiuGridCrossQwtPlot::addOrUpdateCurveSetLegend(RimGridCrossPlotCurveSet* curveSetToShowLegendFor) void RiuGridCrossQwtPlot::addOrUpdateCurveSetLegend(RimGridCrossPlotCurveSet* curveSet)
{ {
RiuCvfOverlayItemWidget* overlayWidget = nullptr; RiuCvfOverlayItemWidget* overlayWidget = nullptr;
auto it = m_legendWidgets.find(curveSetToShowLegendFor); auto it = m_legendWidgets.find(curveSet);
if (it == m_legendWidgets.end() || it->second == nullptr) if (it == m_legendWidgets.end() || it->second == nullptr)
{ {
overlayWidget = new RiuCvfOverlayItemWidget(this); overlayWidget = new RiuCvfOverlayItemWidget(this);
new RiuWidgetDragger(overlayWidget); new RiuWidgetDragger(overlayWidget);
m_legendWidgets[curveSetToShowLegendFor] = overlayWidget; m_legendWidgets[curveSet] = overlayWidget;
} }
else else
{ {
@ -57,12 +59,11 @@ void RiuGridCrossQwtPlot::addOrUpdateCurveSetLegend(RimGridCrossPlotCurveSet* cu
if (overlayWidget) if (overlayWidget)
{ {
caf::TitledOverlayFrame* overlayItem = curveSetToShowLegendFor->legendConfig()->titledOverlayFrame(); caf::TitledOverlayFrame* overlayItem = curveSet->legendConfig()->titledOverlayFrame();
overlayItem->setRenderSize(overlayItem->preferredSize()); resizeOverlayItemToFitPlot(overlayItem);
overlayWidget->updateFromOverlayItem(overlayItem);
overlayWidget->updateFromOverlayItem(curveSetToShowLegendFor->legendConfig()->titledOverlayFrame());
} }
this->updateLegendLayout(); this->updateLegendLayout();
} }
@ -138,3 +139,64 @@ void RiuGridCrossQwtPlot::updateLegendLayout()
} }
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiuGridCrossQwtPlot::resizeEvent(QResizeEvent* e)
{
QwtPlot::resizeEvent(e);
RimGridCrossPlot* crossPlot = dynamic_cast<RimGridCrossPlot*>(ownerPlotDefinition());
if (!crossPlot) return;
bool anyLegendResized = false;
for (RimGridCrossPlotCurveSet* curveSet : crossPlot->curveSets())
{
if (!curveSet->isChecked() || !curveSet->legendConfig()->showLegend()) continue;
auto pairIt = m_legendWidgets.find(curveSet);
if (pairIt != m_legendWidgets.end())
{
RiuCvfOverlayItemWidget* overlayWidget = pairIt->second;
if (overlayWidget->isVisible())
{
caf::TitledOverlayFrame* overlayItem = curveSet->legendConfig()->titledOverlayFrame();
if (resizeOverlayItemToFitPlot(overlayItem))
{
anyLegendResized = true;
overlayWidget->updateFromOverlayItem(overlayItem);
}
}
}
}
if (anyLegendResized)
{
updateLegendLayout();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RiuGridCrossQwtPlot::resizeOverlayItemToFitPlot(caf::TitledOverlayFrame* overlayItem)
{
QSize plotSize = this->canvas()->contentsRect().size();
cvf::Vec2ui legendSize = overlayItem->preferredSize();
bool sizeAltered = false;
if (plotSize.width() > 0 && (double) legendSize.x() > 0.9 * plotSize.width())
{
legendSize.x() = (plotSize.width() * 9) / 10;
sizeAltered = true;
}
if (plotSize.height() > 0 && (double) legendSize.y() > 0.9 * plotSize.height())
{
legendSize.y() = (plotSize.height() * 9) / 10;
sizeAltered = true;
}
overlayItem->setRenderSize(legendSize);
return sizeAltered;
}

View File

@ -28,6 +28,10 @@
class RimGridCrossPlotCurveSet; class RimGridCrossPlotCurveSet;
class RiuCvfOverlayItemWidget; class RiuCvfOverlayItemWidget;
namespace caf
{
class TitledOverlayFrame;
}
//================================================================================================== //==================================================================================================
// //
// //
@ -46,7 +50,8 @@ public:
protected: protected:
void updateLayout() override; void updateLayout() override;
void updateLegendLayout(); void updateLegendLayout();
void resizeEvent(QResizeEvent *e) override;
bool resizeOverlayItemToFitPlot(caf::TitledOverlayFrame* overlayItem);
private: private:
std::map<caf::PdmPointer<RimGridCrossPlotCurveSet>, QPointer<RiuCvfOverlayItemWidget>> m_legendWidgets; std::map<caf::PdmPointer<RimGridCrossPlotCurveSet>, QPointer<RiuCvfOverlayItemWidget>> m_legendWidgets;
}; };

View File

@ -184,7 +184,9 @@ RiuQwtSymbol::PointSymbolEnum RiuQwtSymbol::cycledFilledSymbolStyle(int indexLev
{ {
std::vector<PointSymbolEnum> contrastingSymbols = std::vector<PointSymbolEnum> contrastingSymbols =
{ {
SYMBOL_ELLIPSE, SYMBOL_RECT }; SYMBOL_ELLIPSE, SYMBOL_RECT, SYMBOL_DIAMOND, SYMBOL_DOWN_TRIANGLE, SYMBOL_UP_TRIANGLE,
SYMBOL_LEFT_TRIANGLE, SYMBOL_RIGHT_TRIANGLE, SYMBOL_STAR2
};
return contrastingSymbols[indexLevel % (int)contrastingSymbols.size()]; return contrastingSymbols[indexLevel % (int)contrastingSymbols.size()];
} }