Skip to content
Snippets Groups Projects
Commit 4d34e32a authored by Raphael Grimm's avatar Raphael Grimm
Browse files

Fix layer section of simulator control plugin

parent 5fbb6d20
No related branches found
No related tags found
No related merge requests found
Pipeline #
......@@ -80,6 +80,21 @@ SimulatorControlController::SimulatorControlController()
// init gui
ui.setupUi(getWidget());
ui.layerTable->setColumnWidth(0, 200);
ui.layerTable->setColumnWidth(1, 40);
ui.layerTable->setColumnWidth(2, 40);
ui.layerTable->setColumnWidth(3, 80);
ui.layerTable->setColumnWidth(4, 80);
ui.layerTable->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
ui.layerTable->horizontalHeader()->setResizeMode(1, QHeaderView::Fixed);
ui.layerTable->horizontalHeader()->setResizeMode(2, QHeaderView::Fixed);
ui.layerTable->horizontalHeader()->setResizeMode(3, QHeaderView::Fixed);
ui.layerTable->horizontalHeader()->setResizeMode(4, QHeaderView::Fixed);
for(int i = ui.layerTable->rowCount();i;--i)
{
ui.layerTable->removeRow(0);
}
ARMARX_INFO << "Finished setup of SimulatorControlGuiPlugin" << flush;
}
......@@ -517,10 +532,11 @@ void SimulatorControlController::layerToggleVisibility(QString layerName)
{
auto name = layerName.toStdString();
if (layerVisibility.find(name) != layerVisibility.end())
if (layerVisibilityCheckBoxes.count(name))
{
ARMARX_VERBOSE << "Toggling visibility from " << layerVisibility.at(name) << " to " << !layerVisibility.at(name) << " for layer " << name << "...";
simulatorViewerPrx->enableLayerVisu(name, !layerVisibility.at(name));
const bool vis = layerVisibilityCheckBoxes.at(name).second->isChecked();
ARMARX_VERBOSE << "Toggling visibility from " << !vis << " to " << vis << " for layer " << name << "...";
simulatorViewerPrx->enableLayerVisu(name, vis);
ARMARX_VERBOSE << "done!";
}
}
......@@ -533,7 +549,6 @@ void SimulatorControlController::layerToggleVisibility(QString layerName)
void SimulatorControlController::layerPoll()
{
try
{
if (!simulatorViewerPrx)
......@@ -545,43 +560,110 @@ void SimulatorControlController::layerPoll()
{
auto layerInfo = simulatorViewerPrx->layerInformation();
ui.layerTable->setRowCount(layerInfo.size());
layerVisibility.clear();
LayerVisibilityCheckBoxesType newLayerVisibilityCheckBoxes;
const bool hideEmptyLayers = ui.checkBoxHideEmptyLayers->isChecked();
//fill&map signals
std::size_t tableIdx = 0;
for (std::size_t layerIdx = 0; layerIdx < layerInfo.size(); ++layerIdx)
//fill & map signals
for (const auto& layer : layerInfo)
{
const auto& layer = layerInfo.at(layerIdx);
if (!layer.elementCount && hideEmptyLayers)
auto& layerEntry = newLayerVisibilityCheckBoxes[layer.layerName];
int tableIdx = 0;
//create row if missing
{
continue;
if(layerVisibilityCheckBoxes.count(layer.layerName))
{
//already there
layerEntry = layerVisibilityCheckBoxes.at(layer.layerName);
layerVisibilityCheckBoxes.erase(layer.layerName);
//search for idx
bool found = false;
for(;tableIdx < ui.layerTable->rowCount(); ++tableIdx)
{
const QTableWidgetItem* item = ui.layerTable->item(tableIdx,0);
if(item)
{
found = (item->text() == QString::fromStdString(layer.layerName));
}
else
{
ARMARX_WARNING << "layerPoll(search old): item " << tableIdx << " is null";
}
if(found)
{
break;
}
}
}
else
{
ui.layerTable->insertRow(0);
//missing! -> create it
QString name = QString::fromStdString(layer.layerName);
//store visibility
//set text
ui.layerTable->setItem(0, 0, new QTableWidgetItem {name});
//add&connect checkbox
QCheckBox* box {new QCheckBox};
ui.layerTable->setCellWidget(0, 2, box);
layerEntry.second = box;
// layerEntry.first = ui.layerTable->item(0,0);
layerSignalMapperVisible.setMapping(box, name);
QObject::connect(box, SIGNAL(stateChanged(int)), &layerSignalMapperVisible, SLOT(map()));
//add&connect button clear
QPushButton* clear {new QPushButton{"Clear"}};
ui.layerTable->setCellWidget(0, 3, clear);
layerSignalMapperClear.setMapping(clear, name);
QObject::connect(clear, SIGNAL(clicked()), &layerSignalMapperClear, SLOT(map()));
//add&connect button remove
QPushButton* remove {new QPushButton{"Remove"}};
ui.layerTable->setCellWidget(0, 4, remove);
layerSignalMapperRemove.setMapping(remove, name);
QObject::connect(remove, SIGNAL(clicked()), &layerSignalMapperRemove, SLOT(map()));
}
}
QString name = QString::fromStdString(layer.layerName);
//store visibility
layerVisibility[layer.layerName] = layer.visible;
//set text
ui.layerTable->setItem(tableIdx, 0, new QTableWidgetItem {name});
// ARMARX_CHECK_NOT_NULL(layerEntry.first);
ARMARX_CHECK_NOT_NULL(layerEntry.second);
// const auto tableIdx = ui.layerTable->row(layerEntry.first);
QCheckBox* box = layerEntry.second;
//update layer
ui.layerTable->setItem(tableIdx, 1, new QTableWidgetItem {QString::number(layer.elementCount)});
//add&connect checkbox
std::unique_ptr<QCheckBox> box {new QCheckBox};
box->blockSignals(true);
box->setChecked(layer.visible);
layerSignalMapperVisible.setMapping(box.get(), name);
QObject::connect(box.get(), SIGNAL(stateChanged(int)), &layerSignalMapperVisible, SLOT(map()));
ui.layerTable->setCellWidget(tableIdx, 2, box.release());
//add&connect button clear
std::unique_ptr<QPushButton> clear {new QPushButton{"Clear"}};
layerSignalMapperClear.setMapping(clear.get(), name);
QObject::connect(clear.get(), SIGNAL(clicked()), &layerSignalMapperClear, SLOT(map()));
ui.layerTable->setCellWidget(tableIdx, 3, clear.release());
//add&connect button remove
std::unique_ptr<QPushButton> remove {new QPushButton{"Remove"}};
layerSignalMapperRemove.setMapping(remove.get(), name);
QObject::connect(remove.get(), SIGNAL(clicked()), &layerSignalMapperRemove, SLOT(map()));
ui.layerTable->setCellWidget(tableIdx, 4, remove.release());
++tableIdx;
box->blockSignals(false);
if (!layer.elementCount && hideEmptyLayers)
{
//hide it
ui.layerTable->hideRow(tableIdx);
continue;
}
ui.layerTable->showRow(tableIdx);
}
//remove old entries
for(const auto& pair : layerVisibilityCheckBoxes)
{
ui.layerTable->removeRow(ui.layerTable->row(pair.second.first));
}
for(int i = ui.layerTable->rowCount() - 1; i >= 0; --i)
{
const QTableWidgetItem* item = ui.layerTable->item(i,0);
if(item)
{
if(layerVisibilityCheckBoxes.count(item->text().toStdString()))
{
ui.layerTable->removeRow(i);
}
}
else
{
ARMARX_WARNING << "layerPoll(delete old): item " << i << " is null";
}
}
ui.layerTable->setRowCount(tableIdx);
layerVisibilityCheckBoxes = std::move(newLayerVisibilityCheckBoxes);
ui.layerTable->setRowCount(layerVisibilityCheckBoxes.size());
}
}
catch (...)
......
......@@ -38,6 +38,8 @@
#include <QSignalMapper>
#include <QTimer>
#include <QToolBar>
#include <QTableWidgetItem>
#include <QCheckBox>
/** Boost headers **/
#include <boost/shared_ptr.hpp>
......@@ -215,10 +217,12 @@ namespace armarx
* @brief Maps events to remove a layer from corresponding buttons contained in the table to layerClear
*/
QSignalMapper layerSignalMapperRemove;
using LayerVisibilityCheckBoxesType = std::map<std::string, std::pair<QTableWidgetItem*,QPointer<QCheckBox>>>;
/**
* @brief Stores whether a layer is currently visible.
* @brief Stores checkboxes to turn layers visible / invisible.
*/
std::unordered_map<std::string, bool> layerVisibility;
LayerVisibilityCheckBoxesType layerVisibilityCheckBoxes;
int timerId;
......
......@@ -430,24 +430,12 @@
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="columnCount">
<number>3</number>
<number>5</number>
</property>
<attribute name="horizontalHeaderCascadingSectionResizes">
<bool>true</bool>
</attribute>
<attribute name="horizontalHeaderDefaultSectionSize">
<number>80</number>
</attribute>
<attribute name="horizontalHeaderMinimumSectionSize">
<number>60</number>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderCascadingSectionResizes">
<bool>true</bool>
</attribute>
<column>
<property name="text">
<string>Name</string>
......@@ -463,6 +451,16 @@
<string>Visible</string>
</property>
</column>
<column>
<property name="text">
<string>Clear</string>
</property>
</column>
<column>
<property name="text">
<string>Remove</string>
</property>
</column>
</widget>
</item>
</layout>
......@@ -473,7 +471,7 @@
<x>0</x>
<y>0</y>
<width>413</width>
<height>736</height>
<height>745</height>
</rect>
</property>
<attribute name="label">
......
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