Skip to content
Snippets Groups Projects
Commit 2c75536c authored by Rainer Kartmann's avatar Rainer Kartmann
Browse files

Added feature to clear single layers from the DebugDrawerViewer

parent 13f087ca
No related branches found
No related tags found
No related merge requests found
......@@ -7,20 +7,92 @@
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
<height>94</height>
</rect>
</property>
<property name="windowTitle">
<string>DebugDrawerViewerWidget</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<item row="3" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QComboBox" name="comboClearLayer">
<property name="toolTip">
<string>Select a layer to clear</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnClearLayer">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Clear the selected layer</string>
</property>
<property name="text">
<string>Clear Layer</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="btnClearAll">
<property name="toolTip">
<string>Clear all layers</string>
</property>
<property name="text">
<string>Remove All Visualizations</string>
<string>Clear All Layers</string>
</property>
</widget>
</item>
<item row="0" column="0">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
......
......@@ -22,6 +22,9 @@
#include "DebugDrawerViewerWidgetController.h"
#include <ArmarXCore/core/ArmarXManager.h>
#include <QTimer>
#include <string>
......@@ -33,6 +36,9 @@ DebugDrawerViewerWidgetController::DebugDrawerViewerWidgetController()
rootVisu = nullptr;
widget.setupUi(getWidget());
QTimer* timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateComboClearLayer()));
timer->start(100);
}
......@@ -55,6 +61,7 @@ void DebugDrawerViewerWidgetController::onInitComponent()
enableMainWidgetAsync(false);
connect(widget.btnClearAll, SIGNAL(clicked()), this, SLOT(on_btnClearAll_clicked()), Qt::UniqueConnection);
connect(widget.btnClearLayer, SIGNAL(clicked()), this, SLOT(on_btnClearLayer_clicked()), Qt::UniqueConnection);
}
......@@ -109,3 +116,171 @@ void armarx::DebugDrawerViewerWidgetController::on_btnClearAll_clicked()
debugDrawer->clearAll();
}
}
void DebugDrawerViewerWidgetController::on_btnClearLayer_clicked()
{
if (debugDrawer)
{
int index = widget.comboClearLayer->currentIndex();
std::string layerName = widget.comboClearLayer->itemData(index).toString().toStdString();
if (!layerName.empty())
{
ARMARX_INFO << "Clearing layer: '" << layerName << "'";
debugDrawer->clearLayer(layerName);
}
}
}
void DebugDrawerViewerWidgetController::updateComboClearLayer()
{
QComboBox* combo = widget.comboClearLayer;
auto setItalic = [combo](bool italic)
{
QFont font = combo->font();
font.setItalic(italic);
combo->setFont(font);
};
auto setHint = [combo, &setItalic](const std::string & hint)
{
QString itemText(hint.c_str());
QString itemData("");
setItalic(true);
if (combo->count() != 1)
{
combo->clear();
combo->insertItem(0, itemText, itemData);
}
else
{
combo->setItemText(0, itemText);
combo->setItemData(0, itemData);
}
};
if (!debugDrawer)
{
setHint("not connected");
return;
}
// fetch layer information
LayerInformationSequence layers = debugDrawer->layerInformation();
if (layers.empty())
{
setHint("no layers");
return;
}
else if (combo->font().italic())
{
setItalic(false);
}
const int numLayers = static_cast<int>(layers.size());
// sort the layers by name
std::sort(layers.begin(), layers.end(), [](const LayerInformation & lhs, const LayerInformation & rhs)
{
for (std::size_t i = 0; i < lhs.layerName.size() && i < lhs.layerName.size(); ++i)
{
auto lhsLow = std::tolower(lhs.layerName[i]);
auto rhsLow = std::tolower(rhs.layerName[i]);
if (lhsLow < rhsLow)
{
return true;
}
else if (lhsLow > rhsLow)
{
return false;
}
}
// if one is a prefix of the other, the shorter is the "smaller" one
return lhs.layerName.size() < rhs.layerName.size();
});
for (int i = 0; i < static_cast<int>(layers.size()); ++i)
{
const LayerInformation& layer = layers[static_cast<std::size_t>(i)];
QString layerName(layer.layerName.c_str());
if (i < combo->count()) // in range
{
QString itemData = combo->itemData(i).toString();
// remove deleted layers
while (itemData.size() != 0 && itemData < layerName)
{
// item layer is smaller than next layer
// => item layer was deleted
ARMARX_INFO << "Removing " << itemData;
combo->removeItem(i);
itemData = i < combo->count() ? combo->itemData(i).toString() : "";
}
// update existing layer
if (itemData == layerName)
{
ARMARX_INFO << "Updating " << itemData;
combo->setItemText(i, makeLayerItemText(layer));
}
else // (itemData > layerName)
{
// item layer is further down than current layer
// => insert current layer here
ARMARX_INFO << "Inserting " << layerName << " before " << itemData;
combo->insertItem(i, makeLayerItemText(layer), layerName);
}
}
else // out of range
{
ARMARX_INFO << "Inserting " << layerName << " at end";
combo->insertItem(i, makeLayerItemText(layer), layerName);
}
// check invariant
ARMARX_CHECK_EQUAL(combo->itemData(i).toString(), layerName);
}
// remove excessive items
while (combo->count() > numLayers)
{
combo->removeItem(combo->count() - 1);
}
}
QString DebugDrawerViewerWidgetController::makeLayerItemText(const LayerInformation& layer)
{
std::vector<std::string> annotations;
if (layer.elementCount == 0)
{
annotations.push_back("empty");
}
if (!layer.visible)
{
annotations.push_back("hidden");
}
if (annotations.empty())
{
return { layer.layerName.c_str() };
}
else
{
std::stringstream itemText;
itemText << layer.layerName
<< " (" << boost::algorithm::join(annotations, ", ") << ")";
return { itemText.str().c_str() };
}
}
......@@ -100,6 +100,20 @@ namespace armarx
/// Clear all layers.
void on_btnClearAll_clicked();
/// Clear the selected layer.
void on_btnClearLayer_clicked();
/// Fetch the layer information and update the combo box items.
void updateComboClearLayer();
private:
/// Make an item text for a layer entry in the clear layer combo box.
static QString makeLayerItemText(const LayerInformation& layer);
private:
/// Widget Form
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment