#1833 AppFwk: Add support for dynamic labels on group-boxes

This commit is contained in:
Magne Sjaastad 2017-08-28 15:14:15 +02:00
parent 5f790273e9
commit c18e9c1293
7 changed files with 248 additions and 37 deletions

View File

@ -41,6 +41,8 @@ set( PROJECT_FILES
cafPdmUiTreeOrdering.cpp cafPdmUiTreeOrdering.cpp
cafPdmUiTreeOrdering.h cafPdmUiTreeOrdering.h
cafUiTreeItem.h cafUiTreeItem.h
cafPdmUiGroup.cpp
cafPdmUiGroup.h
cafSelectionManager.cpp cafSelectionManager.cpp
cafSelectionManager.h cafSelectionManager.h

View File

@ -0,0 +1,125 @@
//##################################################################################################
//
// Custom Visualization Core library
// Copyright (C) 2017 Ceetron Solutions AS
//
// This library may be used under the terms of either the GNU General Public License or
// the GNU Lesser General Public License as follows:
//
// GNU General Public License Usage
// This library is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <<http://www.gnu.org/licenses/gpl.html>>
// for more details.
//
// GNU Lesser General Public License Usage
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU Lesser General Public License at <<http://www.gnu.org/licenses/lgpl-2.1.html>>
// for more details.
//
//##################################################################################################
#include "cafPdmUiGroup.h"
namespace caf
{
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
PdmUiGroup::PdmUiGroup()
{
m_isCollapsedByDefault = false;
m_hasForcedExpandedState = false;
m_forcedCollapseState = false;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmUiGroup::setKeyword(const QString& keyword)
{
m_keyword = keyword;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString PdmUiGroup::keyword() const
{
if (!m_keyword.isEmpty())
{
return m_keyword;
}
// Fallback to uiName with default uiConfigName
return uiName();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool PdmUiGroup::isUiGroup()
{
return true;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmUiGroup::setCollapsedByDefault(bool doCollapse)
{
m_isCollapsedByDefault = doCollapse;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmUiGroup::setCollapsed(bool doCollapse)
{
m_hasForcedExpandedState = true;
m_forcedCollapseState = doCollapse;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool PdmUiGroup::isExpandedByDefault() const
{
return !m_isCollapsedByDefault;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool PdmUiGroup::hasForcedExpandedState() const
{
return m_hasForcedExpandedState;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool PdmUiGroup::forcedExpandedState() const
{
return !m_forcedCollapseState;
}
} //End of namespace caf

View File

@ -0,0 +1,80 @@
//##################################################################################################
//
// Custom Visualization Core library
// Copyright (C) 2017 Ceetron Solutions AS
//
// This library may be used under the terms of either the GNU General Public License or
// the GNU Lesser General Public License as follows:
//
// GNU General Public License Usage
// This library is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <<http://www.gnu.org/licenses/gpl.html>>
// for more details.
//
// GNU Lesser General Public License Usage
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU Lesser General Public License at <<http://www.gnu.org/licenses/lgpl-2.1.html>>
// for more details.
//
//##################################################################################################
#pragma once
#include "cafPdmUiItem.h"
#include "cafPdmUiOrdering.h"
namespace caf
{
//==================================================================================================
/// Class representing a group of fields communicated to the Gui
//==================================================================================================
class PdmUiGroup : public PdmUiItem, public PdmUiOrdering
{
public:
PdmUiGroup();
void setKeyword(const QString& keyword);
QString keyword() const;
virtual bool isUiGroup();
/// Set this group to be collapsed by default. When the user expands the group, the default no longer has any effect.
void setCollapsedByDefault(bool doCollapse);
/// Forcifully set the collapsed state of the group, overriding the previous user actions and the default
void setCollapsed(bool doCollapse);
// Pdm internal methods
bool isExpandedByDefault() const;
bool hasForcedExpandedState() const;
bool forcedExpandedState() const;
private:
bool m_isCollapsedByDefault;
bool m_hasForcedExpandedState;
bool m_forcedCollapseState;
QString m_keyword;
};
} // End of namespace caf

View File

@ -60,7 +60,7 @@ PdmUiOrdering::~PdmUiOrdering()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
PdmUiGroup* PdmUiOrdering::addNewGroup(QString displayName) PdmUiGroup* PdmUiOrdering::addNewGroup(const QString& displayName)
{ {
PdmUiGroup* group = new PdmUiGroup; PdmUiGroup* group = new PdmUiGroup;
group->setUiName(displayName); group->setUiName(displayName);
@ -71,6 +71,18 @@ PdmUiGroup* PdmUiOrdering::addNewGroup(QString displayName)
return group; return group;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
caf::PdmUiGroup* PdmUiOrdering::addNewGroupWithKeyword(const QString& displayName, const QString& keyword)
{
PdmUiGroup* group = addNewGroup(displayName);
group->setKeyword(keyword);
return group;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -61,7 +61,8 @@ public:
PdmUiOrdering(const PdmUiOrdering&) = delete; PdmUiOrdering(const PdmUiOrdering&) = delete;
PdmUiOrdering& operator=(const PdmUiOrdering&) = delete; PdmUiOrdering& operator=(const PdmUiOrdering&) = delete;
PdmUiGroup* addNewGroup(QString displayName); PdmUiGroup* addNewGroup(const QString& displayName);
PdmUiGroup* addNewGroupWithKeyword(const QString& displayName, const QString& keyword);
void add(const PdmFieldHandle* field); void add(const PdmFieldHandle* field);
void add(const PdmObjectHandle* obj); void add(const PdmObjectHandle* obj);
@ -80,34 +81,6 @@ private:
bool m_skipRemainingFields; bool m_skipRemainingFields;
}; };
//==================================================================================================
/// Class representing a group of fields communicated to the Gui
//==================================================================================================
class PdmUiGroup : public PdmUiItem, public PdmUiOrdering
{
public:
PdmUiGroup() { m_isCollapsedByDefault = false; m_hasForcedExpandedState = false; m_forcedCollapseState = false;}
virtual bool isUiGroup() { return true; }
/// Set this group to be collapsed by default. When the user expands the group, the default no longer has any effect.
void setCollapsedByDefault(bool doCollapse) { m_isCollapsedByDefault = doCollapse;}
/// Forcifully set the collapsed state of the group, overriding the previous user actions and the default
void setCollapsed(bool doCollapse) { m_hasForcedExpandedState = true; m_forcedCollapseState = doCollapse;}
// Pdm internal methods
bool isExpandedByDefault() const { return !m_isCollapsedByDefault;}
bool hasForcedExpandedState() const { return m_hasForcedExpandedState;}
bool forcedExpandedState() const { return !m_forcedCollapseState;}
private:
bool m_isCollapsedByDefault;
bool m_hasForcedExpandedState;
bool m_forcedCollapseState;
};
} // End of namespace caf } // End of namespace caf
#include "cafPdmUiGroup.h"

View File

@ -104,6 +104,21 @@ public:
private: private:
double m_doubleMember; double m_doubleMember;
protected:
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override
{
uiOrdering.add(&m_doubleField);
uiOrdering.add(&m_intField);
QString dynamicGroupName = QString("Dynamic Group Text (%1)").arg(m_intField);
caf::PdmUiGroup* group = uiOrdering.addNewGroupWithKeyword(dynamicGroupName, "MyTest");
group->add(&m_textField);
group->add(&m_proxyDoubleField);
}
}; };
CAF_PDM_SOURCE_INIT(SmallDemoPdmObject, "SmallDemoPdmObject"); CAF_PDM_SOURCE_INIT(SmallDemoPdmObject, "SmallDemoPdmObject");

View File

@ -218,7 +218,7 @@ void PdmUiDefaultObjectEditor::recursiveSetupFieldsAndGroups(const std::vector<P
PdmUiGroup* group = static_cast<PdmUiGroup*>(uiItems[i]); PdmUiGroup* group = static_cast<PdmUiGroup*>(uiItems[i]);
const std::vector<PdmUiItem*>& groupChildren = group->uiItems(); const std::vector<PdmUiItem*>& groupChildren = group->uiItems();
QString groupBoxKey = uiItems[i]->uiName(); QString groupBoxKey = group->keyword();
QMinimizePanel* groupBox = NULL; QMinimizePanel* groupBox = NULL;
QGridLayout* groupBoxLayout = NULL; QGridLayout* groupBoxLayout = NULL;
@ -229,7 +229,8 @@ void PdmUiDefaultObjectEditor::recursiveSetupFieldsAndGroups(const std::vector<P
if (it == m_groupBoxes.end()) if (it == m_groupBoxes.end())
{ {
groupBox = new QMinimizePanel( parent ); groupBox = new QMinimizePanel( parent );
groupBox->setTitle(uiItems[i]->uiName()); groupBox->setTitle(group->uiName(uiConfigName));
groupBox->setObjectName(group->keyword());
groupBoxLayout = new QGridLayout(); groupBoxLayout = new QGridLayout();
groupBox->contentFrame()->setLayout(groupBoxLayout); groupBox->contentFrame()->setLayout(groupBoxLayout);
connect(groupBox, SIGNAL(expandedChanged(bool)), this, SLOT(groupBoxExpandedStateToggled(bool))); connect(groupBox, SIGNAL(expandedChanged(bool)), this, SLOT(groupBoxExpandedStateToggled(bool)));
@ -255,6 +256,9 @@ void PdmUiDefaultObjectEditor::recursiveSetupFieldsAndGroups(const std::vector<P
bool isExpanded = isUiGroupExpanded(group); bool isExpanded = isUiGroupExpanded(group);
groupBox->setExpanded(isExpanded); groupBox->setExpanded(isExpanded);
// Update the title to be able to support dynamic group names
groupBox->setTitle(group->uiName(uiConfigName));
recursiveSetupFieldsAndGroups(groupChildren, groupBox->contentFrame(), groupBoxLayout, uiConfigName); recursiveSetupFieldsAndGroups(groupChildren, groupBox->contentFrame(), groupBoxLayout, uiConfigName);
currentRowIndex++; currentRowIndex++;
} }
@ -379,9 +383,9 @@ bool PdmUiDefaultObjectEditor::isUiGroupExpanded(const PdmUiGroup* uiGroup)
auto kwMapPair = m_objectKeywordGroupUiNameExpandedState.find(pdmObject()->xmlCapability()->classKeyword()); auto kwMapPair = m_objectKeywordGroupUiNameExpandedState.find(pdmObject()->xmlCapability()->classKeyword());
if ( kwMapPair != m_objectKeywordGroupUiNameExpandedState.end() ) if ( kwMapPair != m_objectKeywordGroupUiNameExpandedState.end() )
{ {
QString uiName = uiGroup->uiName(); QString keyword = uiGroup->keyword();
auto uiNameExpStatePair = kwMapPair->second.find(uiName); auto uiNameExpStatePair = kwMapPair->second.find(keyword);
if ( uiNameExpStatePair != kwMapPair->second.end() ) if ( uiNameExpStatePair != kwMapPair->second.end() )
{ {
return uiNameExpStatePair->second; return uiNameExpStatePair->second;
@ -403,7 +407,7 @@ void PdmUiDefaultObjectEditor::recursiveVerifyUniqueNames(const std::vector<PdmU
PdmUiGroup* group = static_cast<PdmUiGroup*>(uiItems[i]); PdmUiGroup* group = static_cast<PdmUiGroup*>(uiItems[i]);
const std::vector<PdmUiItem*>& groupChildren = group->uiItems(); const std::vector<PdmUiItem*>& groupChildren = group->uiItems();
QString groupBoxKey = uiItems[i]->uiName(); QString groupBoxKey = group->keyword();
if (groupNames->find(groupBoxKey) != groupNames->end()) if (groupNames->find(groupBoxKey) != groupNames->end())
{ {
@ -492,7 +496,7 @@ void PdmUiDefaultObjectEditor::groupBoxExpandedStateToggled(bool isExpanded)
if (!panel) return; if (!panel) return;
m_objectKeywordGroupUiNameExpandedState[objKeyword][panel->title()] = isExpanded; m_objectKeywordGroupUiNameExpandedState[objKeyword][panel->objectName()] = isExpanded;
} }