ControlSpotPanel code cleanup

Bugfixes:
- Removes some memory link with edit widgets management
This commit is contained in:
Pandagrapher 2019-04-21 10:59:01 +02:00
parent 3423e45753
commit bf9acf0abd
3 changed files with 188 additions and 179 deletions

View File

@ -69,12 +69,11 @@ ControlSpotPanel::ControlSpotPanel():
avoid_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_AVOID")))), avoid_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_AVOID")))),
lastObject_(-1), lastObject_(-1),
lastCoord_(new Coord()),
nbSpotChanged_(false), nbSpotChanged_(false),
selSpotChanged_(false), selSpotChanged_(false),
nameChanged_(false), nameChanged_(false),
visibilityChanged_(false), visibilityChanged_(false),
eventType(0), eventType(None),
excluFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_EXCLUF")))) excluFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_EXCLUF"))))
{ {
Gtk::HBox* const hbox1_ = Gtk::manage(new Gtk::HBox(true, 4)); Gtk::HBox* const hbox1_ = Gtk::manage(new Gtk::HBox(true, 4));
@ -265,6 +264,31 @@ ControlSpotPanel::ControlSpotPanel():
pack_start(*avoid_); pack_start(*avoid_);
show_all(); show_all();
// Define row background color
// Mouseovered spot (opaque orange)
colorMouseover.set_red(1.);
colorMouseover.set_green(100. / 255.);
colorMouseover.set_blue(0.);
colorMouseover.set_alpha(1.);
// Nominal spot (transparent black)
colorNominal.set_red(0.);
colorNominal.set_green(0.);
colorNominal.set_blue(0.);
colorNominal.set_alpha(0.);
}
ControlSpotPanel::~ControlSpotPanel()
{
// visibleGeometry
for (auto i = EditSubscriber::visibleGeometry.begin(); i != EditSubscriber::visibleGeometry.end(); ++i) {
delete *i;
}
// mouseOverGeometry
for (auto i = EditSubscriber::mouseOverGeometry.begin(); i != EditSubscriber::mouseOverGeometry.end(); ++i) {
delete *i;
}
} }
void ControlSpotPanel::setEditProvider(EditDataProvider* provider) void ControlSpotPanel::setEditProvider(EditDataProvider* provider)
@ -277,22 +301,17 @@ void ControlSpotPanel::render_id(
{ {
auto row = *iter; auto row = *iter;
Gtk::CellRendererText *ct = static_cast<Gtk::CellRendererText *>(cell); Gtk::CellRendererText *ct = static_cast<Gtk::CellRendererText *>(cell);
int value = row[spots_.id];
ct->property_text() = std::to_string(value); // Render cell text
// Render background color ct->property_text() = std::to_string(row[spots_.id]);
Gdk::RGBA color;
if (row[spots_.mouseover]) { // Orange // Render cell background color
color.set_red(1.); if (row[spots_.mouseover]) {
color.set_green(100. / 255.); ct->property_background_rgba() = colorMouseover;
color.set_blue(0.); } else {
color.set_alpha(1.); ct->property_background_rgba() = colorNominal;
} else { // Transparent black
color.set_red(0.);
color.set_green(0.);
color.set_blue(0.);
color.set_alpha(0.);
} }
ct->property_background_rgba() = color;
} }
void ControlSpotPanel::render_name( void ControlSpotPanel::render_name(
@ -300,22 +319,16 @@ void ControlSpotPanel::render_name(
{ {
auto row = *iter; auto row = *iter;
Gtk::CellRendererText *ct = static_cast<Gtk::CellRendererText *>(cell); Gtk::CellRendererText *ct = static_cast<Gtk::CellRendererText *>(cell);
auto value = row[spots_.name];
ct->property_text() = value; // Render cell text
Gdk::RGBA color; ct->property_text() = row[spots_.name];
// Render background color
if (row[spots_.mouseover]) { // Orange // Render cell background color
color.set_red(1.); if (row[spots_.mouseover]) {
color.set_green(100. / 255.); ct->property_background_rgba() = colorMouseover;
color.set_blue(0.); } else {
color.set_alpha(1.); ct->property_background_rgba() = colorNominal;
} else { // Transparent black
color.set_red(0.);
color.set_green(0.);
color.set_blue(0.);
color.set_alpha(0.);
} }
ct->property_background_rgba() = color;
} }
void ControlSpotPanel::render_isvisible( void ControlSpotPanel::render_isvisible(
@ -323,28 +336,20 @@ void ControlSpotPanel::render_isvisible(
{ {
auto row = *iter; auto row = *iter;
Gtk::CellRendererText *ct = static_cast<Gtk::CellRendererText *>(cell); Gtk::CellRendererText *ct = static_cast<Gtk::CellRendererText *>(cell);
auto value = row[spots_.isvisible];
if (value) { // Render cell text
if (row[spots_.isvisible]) {
ct->property_text() = M("TP_LOCALLAB_ROW_VIS"); ct->property_text() = M("TP_LOCALLAB_ROW_VIS");
} else { } else {
ct->property_text() = M("TP_LOCALLAB_ROW_NVIS"); ct->property_text() = M("TP_LOCALLAB_ROW_NVIS");
} }
// Render background color // Render cell background color
Gdk::RGBA color; if (row[spots_.mouseover]) {
if (row[spots_.mouseover]) { // Orange ct->property_background_rgba() = colorMouseover;
color.set_red(1.); } else {
color.set_green(100. / 255.); ct->property_background_rgba() = colorNominal;
color.set_blue(0.);
color.set_alpha(1.);
} else { // Transparent black
color.set_red(0.);
color.set_green(0.);
color.set_blue(0.);
color.set_alpha(0.);
} }
ct->property_background_rgba() = color;
} }
void ControlSpotPanel::on_button_add() void ControlSpotPanel::on_button_add()
@ -358,7 +363,7 @@ void ControlSpotPanel::on_button_add()
// Raise event // Raise event
nbSpotChanged_ = true; nbSpotChanged_ = true;
selSpotChanged_ = true; selSpotChanged_ = true;
eventType = 1; // 1 = Spot creation event eventType = SpotCreation;
const int newId = getNewId(); const int newId = getNewId();
listener->panelChanged(EvLocallabSpotCreated, "ID#" + std::to_string(newId)); listener->panelChanged(EvLocallabSpotCreated, "ID#" + std::to_string(newId));
} }
@ -374,7 +379,7 @@ void ControlSpotPanel::on_button_delete()
// Raise event // Raise event
nbSpotChanged_ = true; nbSpotChanged_ = true;
selSpotChanged_ = true; selSpotChanged_ = true;
eventType = 2; // 2 = Spot deletion event eventType = SpotDeletion;
const int delId = getSelectedSpot(); const int delId = getSelectedSpot();
listener->panelChanged(EvLocallabSpotDeleted, "ID#" + std::to_string(delId)); listener->panelChanged(EvLocallabSpotDeleted, "ID#" + std::to_string(delId));
} }
@ -394,7 +399,7 @@ void ControlSpotPanel::on_button_duplicate()
} }
nbSpotChanged_ = true; nbSpotChanged_ = true;
selSpotChanged_ = true; selSpotChanged_ = true;
eventType = 4; // 4 = Spot duplication event eventType = SpotDuplication;
const int newId = getNewId(); const int newId = getNewId();
listener->panelChanged(EvLocallabSpotCreated, "ID#" + std::to_string(newId) listener->panelChanged(EvLocallabSpotCreated, "ID#" + std::to_string(newId)
+ " (" + M("TP_LOCALLAB_EV_DUPL") + " ID#" + " (" + M("TP_LOCALLAB_EV_DUPL") + " ID#"
@ -502,23 +507,23 @@ void ControlSpotPanel::load_ControlSpot_param()
// Load param in selected control spot // Load param in selected control spot
shape_->set_active(row[spots_.shape]); shape_->set_active(row[spots_.shape]);
spotMethod_->set_active(row[spots_.spotMethod]); spotMethod_->set_active(row[spots_.spotMethod]);
sensiexclu_->setValue(static_cast<double>(row[spots_.sensiexclu])); sensiexclu_->setValue((double)row[spots_.sensiexclu]);
structexclu_->setValue(static_cast<double>(row[spots_.structexclu])); structexclu_->setValue((double)row[spots_.structexclu]);
struc_->setValue(static_cast<double>(row[spots_.struc])); struc_->setValue((double)row[spots_.struc]);
shapeMethod_->set_active(row[spots_.shapeMethod]); shapeMethod_->set_active(row[spots_.shapeMethod]);
locX_->setValue(static_cast<double>(row[spots_.locX])); locX_->setValue((double)row[spots_.locX]);
locXL_->setValue(static_cast<double>(row[spots_.locXL])); locXL_->setValue((double)row[spots_.locXL]);
locY_->setValue(static_cast<double>(row[spots_.locY])); locY_->setValue((double)row[spots_.locY]);
locYT_->setValue(static_cast<double>(row[spots_.locYT])); locYT_->setValue((double)row[spots_.locYT]);
centerX_->setValue(static_cast<double>(row[spots_.centerX])); centerX_->setValue((double)row[spots_.centerX]);
centerY_->setValue(static_cast<double>(row[spots_.centerY])); centerY_->setValue((double)row[spots_.centerY]);
circrad_->setValue(static_cast<double>(row[spots_.circrad])); circrad_->setValue((double)row[spots_.circrad]);
qualityMethod_->set_active(row[spots_.qualityMethod]); qualityMethod_->set_active(row[spots_.qualityMethod]);
transit_->setValue(static_cast<double>(row[spots_.transit])); transit_->setValue((double)row[spots_.transit]);
thresh_->setValue(static_cast<double>(row[spots_.thresh])); thresh_->setValue((double)row[spots_.thresh]);
iter_->setValue(static_cast<double>(row[spots_.iter])); iter_->setValue((double)row[spots_.iter]);
balan_->setValue(static_cast<double>(row[spots_.balan])); balan_->setValue((double)row[spots_.balan]);
transitweak_->setValue(static_cast<double>(row[spots_.transitweak])); transitweak_->setValue((double)row[spots_.transitweak]);
avoid_->set_active(row[spots_.avoid]); avoid_->set_active(row[spots_.avoid]);
} }
@ -532,7 +537,7 @@ void ControlSpotPanel::controlspotChanged()
// Raise event // Raise event
selSpotChanged_ = true; selSpotChanged_ = true;
eventType = 3; // 3 = Spot selection event eventType = SpotSelection;
const int selId = getSelectedSpot(); const int selId = getSelectedSpot();
listener->panelChanged(EvLocallabSpotSelected, "ID#" + std::to_string(selId)); listener->panelChanged(EvLocallabSpotSelected, "ID#" + std::to_string(selId));
} }
@ -614,8 +619,8 @@ void ControlSpotPanel::shapeMethodChanged()
disableParamlistener(false); disableParamlistener(false);
row[spots_.shapeMethod] = shapeMethod_->get_active_row_number(); row[spots_.shapeMethod] = shapeMethod_->get_active_row_number();
row[spots_.locXL] = static_cast<int>(locX_->getValue()); row[spots_.locXL] = locX_->getIntValue();
row[spots_.locYT] = static_cast<int>(locY_->getValue()); row[spots_.locYT] = locY_->getIntValue();
updateControlSpotCurve(row); updateControlSpotCurve(row);
} else { // In batch mode, sliders are always independent } else { // In batch mode, sliders are always independent
@ -787,7 +792,7 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval)
Gtk::TreeModel::Row row = *iter; Gtk::TreeModel::Row row = *iter;
if (a == sensiexclu_) { if (a == sensiexclu_) {
row[spots_.sensiexclu] = (int) sensiexclu_->getValue(); row[spots_.sensiexclu] = sensiexclu_->getIntValue();
if (listener) { if (listener) {
listener->panelChanged(EvLocallabSpotSensiexclu, sensiexclu_->getTextValue()); listener->panelChanged(EvLocallabSpotSensiexclu, sensiexclu_->getTextValue());
@ -795,7 +800,7 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval)
} }
if (a == structexclu_) { if (a == structexclu_) {
row[spots_.structexclu] = (int) structexclu_->getValue(); row[spots_.structexclu] = structexclu_->getIntValue();
if (listener) { if (listener) {
listener->panelChanged(Evlocallabstructexlu, structexclu_->getTextValue()); listener->panelChanged(Evlocallabstructexlu, structexclu_->getTextValue());
@ -811,13 +816,13 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval)
} }
if (a == locX_) { if (a == locX_) {
row[spots_.locX] = (int) locX_->getValue(); row[spots_.locX] = locX_->getIntValue();
if (!batchMode && (method == 1 || method == 3)) { // Symmetrical cases (in batch mode, sliders are always independent) if (!batchMode && (method == 1 || method == 3)) { // Symmetrical cases (in batch mode, sliders are always independent)
disableParamlistener(true); disableParamlistener(true);
locXL_->setValue(locX_->getValue()); locXL_->setValue(locX_->getValue());
disableParamlistener(false); disableParamlistener(false);
row[spots_.locXL] = (int) locXL_->getValue(); row[spots_.locXL] = locXL_->getIntValue();
} }
updateControlSpotCurve(row); updateControlSpotCurve(row);
@ -828,13 +833,13 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval)
} }
if (a == locXL_) { if (a == locXL_) {
row[spots_.locXL] = (int) locXL_->getValue(); row[spots_.locXL] = locXL_->getIntValue();
if (!batchMode && (method == 1 || method == 3)) { // Symmetrical cases (in batch mode, sliders are always independent) if (!batchMode && (method == 1 || method == 3)) { // Symmetrical cases (in batch mode, sliders are always independent)
disableParamlistener(true); disableParamlistener(true);
locX_->setValue(locXL_->getValue()); locX_->setValue(locXL_->getValue());
disableParamlistener(false); disableParamlistener(false);
row[spots_.locX] = (int) locX_->getValue(); row[spots_.locX] = locX_->getIntValue();
} }
updateControlSpotCurve(row); updateControlSpotCurve(row);
@ -845,13 +850,13 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval)
} }
if (a == locY_) { if (a == locY_) {
row[spots_.locY] = (int) locY_->getValue(); row[spots_.locY] = locY_->getIntValue();
if (!batchMode && (method == 1 || method == 3)) { // Symmetrical cases (in batch mode, sliders are always independent) if (!batchMode && (method == 1 || method == 3)) { // Symmetrical cases (in batch mode, sliders are always independent)
disableParamlistener(true); disableParamlistener(true);
locYT_->setValue(locY_->getValue()); locYT_->setValue(locY_->getValue());
disableParamlistener(false); disableParamlistener(false);
row[spots_.locYT] = (int) locYT_->getValue(); row[spots_.locYT] = locYT_->getIntValue();
} }
updateControlSpotCurve(row); updateControlSpotCurve(row);
@ -862,13 +867,13 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval)
} }
if (a == locYT_) { if (a == locYT_) {
row[spots_.locYT] = (int) locYT_->getValue(); row[spots_.locYT] = locYT_->getIntValue();
if (!batchMode && (method == 1 || method == 3)) { // Symmetrical cases (in batch mode, sliders are always independent) if (!batchMode && (method == 1 || method == 3)) { // Symmetrical cases (in batch mode, sliders are always independent)
disableParamlistener(true); disableParamlistener(true);
locY_->setValue(locYT_->getValue()); locY_->setValue(locYT_->getValue());
disableParamlistener(false); disableParamlistener(false);
row[spots_.locY] = (int) locY_->getValue(); row[spots_.locY] = locY_->getIntValue();
} }
updateControlSpotCurve(row); updateControlSpotCurve(row);
@ -879,8 +884,8 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval)
} }
if (a == centerX_ || a == centerY_) { if (a == centerX_ || a == centerY_) {
row[spots_.centerX] = (int) centerX_->getValue(); row[spots_.centerX] = centerX_->getIntValue();
row[spots_.centerY] = (int) centerY_->getValue(); row[spots_.centerY] = centerY_->getIntValue();
updateControlSpotCurve(row); updateControlSpotCurve(row);
@ -890,7 +895,7 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval)
} }
if (a == circrad_) { if (a == circrad_) {
row[spots_.circrad] = (int) circrad_->getValue(); row[spots_.circrad] = circrad_->getIntValue();
updateControlSpotCurve(row); updateControlSpotCurve(row);
@ -900,7 +905,7 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval)
} }
if (a == transit_) { if (a == transit_) {
row[spots_.transit] = (int) transit_->getValue(); row[spots_.transit] = transit_->getIntValue();
if (listener) { if (listener) {
listener->panelChanged(EvLocallabSpotTransit, transit_->getTextValue()); listener->panelChanged(EvLocallabSpotTransit, transit_->getTextValue());
@ -917,7 +922,6 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval)
} }
if (a == iter_) { if (a == iter_) {
// row[spots_.iter] = (int) iter_->getValue();
row[spots_.iter] = iter_->getValue(); row[spots_.iter] = iter_->getValue();
if (listener) { if (listener) {
@ -1036,7 +1040,7 @@ void ControlSpotPanel::setParamEditable(bool cond)
avoid_->set_sensitive(cond); avoid_->set_sensitive(cond);
} }
void ControlSpotPanel::addControlSpotCurve(Gtk::TreeModel::Row row) void ControlSpotPanel::addControlSpotCurve(Gtk::TreeModel::Row& row)
{ {
// printf("addControlSpotCurve\n"); // printf("addControlSpotCurve\n");
@ -1120,7 +1124,7 @@ void ControlSpotPanel::addControlSpotCurve(Gtk::TreeModel::Row row)
row[spots_.curveid] = EditSubscriber::visibleGeometry.size() / 7; row[spots_.curveid] = EditSubscriber::visibleGeometry.size() / 7;
} }
void ControlSpotPanel::updateControlSpotCurve(Gtk::TreeModel::Row row) void ControlSpotPanel::updateControlSpotCurve(const Gtk::TreeModel::Row& row)
{ {
const int curveid_ = row[spots_.curveid]; const int curveid_ = row[spots_.curveid];
EditDataProvider* const dataProvider = getEditProvider(); EditDataProvider* const dataProvider = getEditProvider();
@ -1251,7 +1255,7 @@ void ControlSpotPanel::updateControlSpotCurve(Gtk::TreeModel::Row row)
} }
} }
void ControlSpotPanel::deleteControlSpotCurve(Gtk::TreeModel::Row row) void ControlSpotPanel::deleteControlSpotCurve(Gtk::TreeModel::Row& row)
{ {
const int curveid_ = row[spots_.curveid]; const int curveid_ = row[spots_.curveid];
@ -1262,27 +1266,21 @@ void ControlSpotPanel::deleteControlSpotCurve(Gtk::TreeModel::Row row)
} }
// visibleGeometry // visibleGeometry
EditSubscriber::visibleGeometry.erase(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7 + 6); for (int i = 6; i >= 0; i--) {
EditSubscriber::visibleGeometry.erase(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7 + 5); delete *(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7 + i);
EditSubscriber::visibleGeometry.erase(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7 + 4); EditSubscriber::visibleGeometry.erase(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7 + i);
EditSubscriber::visibleGeometry.erase(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7 + 3); }
EditSubscriber::visibleGeometry.erase(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7 + 2);
EditSubscriber::visibleGeometry.erase(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7 + 1);
EditSubscriber::visibleGeometry.erase(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7);
// mouseOverGeometry // mouseOverGeometry
EditSubscriber::mouseOverGeometry.erase(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7 + 6); for (int i = 6; i >= 0; i--) {
EditSubscriber::mouseOverGeometry.erase(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7 + 5); delete *(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7 + i);
EditSubscriber::mouseOverGeometry.erase(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7 + 4); EditSubscriber::mouseOverGeometry.erase(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7 + i);
EditSubscriber::mouseOverGeometry.erase(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7 + 3); }
EditSubscriber::mouseOverGeometry.erase(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7 + 2);
EditSubscriber::mouseOverGeometry.erase(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7 + 1);
EditSubscriber::mouseOverGeometry.erase(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7);
row[spots_.curveid] = 0; // Reset associated curve id row[spots_.curveid] = 0; // Reset associated curve id
// Reordering curve id // Reordering curve id
Gtk::TreeModel::Children children = treemodel_->children(); const Gtk::TreeModel::Children children = treemodel_->children();
for (auto iter = children.begin(); iter != children.end(); iter++) { for (auto iter = children.begin(); iter != children.end(); iter++) {
Gtk::TreeModel::Row r = *iter; Gtk::TreeModel::Row r = *iter;
@ -1293,7 +1291,7 @@ void ControlSpotPanel::deleteControlSpotCurve(Gtk::TreeModel::Row row)
} }
} }
void ControlSpotPanel::updateCurveOpacity(Gtk::TreeModel::Row selectedRow) void ControlSpotPanel::updateCurveOpacity(const Gtk::TreeModel::Row& selectedRow)
{ {
const int curveid_ = selectedRow[spots_.curveid]; const int curveid_ = selectedRow[spots_.curveid];
@ -1322,7 +1320,7 @@ CursorShape ControlSpotPanel::getCursor(int objectID) const
return CSHandOpen; return CSHandOpen;
} }
int rem_ = objectID % 7; const int rem_ = objectID % 7;
switch (rem_) { switch (rem_) {
case (0): // centerCircle: (curveid_ - 1) * 7 case (0): // centerCircle: (curveid_ - 1) * 7
@ -1362,22 +1360,21 @@ bool ControlSpotPanel::mouseOver(int modifierKey)
// Get selected row // Get selected row
const auto selIter = s->get_selected(); const auto selIter = s->get_selected();
Gtk::TreeModel::Row selRow = *selIter; const Gtk::TreeModel::Row selRow = *selIter;
int object_ = editProvider_->object; const int object_ = editProvider_->object;
if (object_ != lastObject_) { if (object_ != lastObject_) {
if (object_ == -1) { if (object_ == -1) {
// Reset mouseOver preview for visibleGeometry // Reset mouseOver preview for visibleGeometry
for (int it_ = 0; it_ < (int) EditSubscriber::visibleGeometry.size(); it_++) { for (size_t it_ = 0; it_ < EditSubscriber::visibleGeometry.size(); it_++) {
EditSubscriber::visibleGeometry.at(it_)->state = Geometry::NORMAL; EditSubscriber::visibleGeometry.at(it_)->state = Geometry::NORMAL;
} }
// Reset mouseOver preview for TreeView // Reset mouseOver preview for TreeView
Gtk::TreeModel::Children children = treemodel_->children(); const Gtk::TreeModel::Children children = treemodel_->children();
Gtk::TreeModel::Children::iterator iter;
for (iter = children.begin(); iter != children.end(); iter++) { for (auto iter = children.begin(); iter != children.end(); iter++) {
Gtk::TreeModel::Row row = *iter; Gtk::TreeModel::Row row = *iter;
row[spots_.mouseover] = false; row[spots_.mouseover] = false;
} }
@ -1387,13 +1384,13 @@ bool ControlSpotPanel::mouseOver(int modifierKey)
return false; return false;
} }
int curveId_ = object_ / 7 + 1; const int curveId_ = object_ / 7 + 1;
int rem = object_ % 7; const int rem = object_ % 7;
// Manage mouseOver preview for TreeView // Manage mouseOver preview for TreeView
Gtk::TreeModel::Children children = treemodel_->children(); const Gtk::TreeModel::Children children = treemodel_->children();
Gtk::TreeModel::Children::iterator iter;
for (iter = children.begin(); iter != children.end(); iter++) { for (auto iter = children.begin(); iter != children.end(); iter++) {
Gtk::TreeModel::Row row = *iter; Gtk::TreeModel::Row row = *iter;
if (row[spots_.curveid] == curveId_ && *row != *selRow) { if (row[spots_.curveid] == curveId_ && *row != *selRow) {
row[spots_.mouseover] = true; row[spots_.mouseover] = true;
@ -1484,11 +1481,11 @@ bool ControlSpotPanel::button1Pressed(int modifierKey)
} }
// Select associated control spot // Select associated control spot
int curveId_ = lastObject_ / 7 + 1; const int curveId_ = lastObject_ / 7 + 1;
Gtk::TreeModel::Children children = treemodel_->children(); Gtk::TreeModel::Children children = treemodel_->children();
for (auto iter = children.begin(); iter != children.end(); iter++) { for (auto iter = children.begin(); iter != children.end(); iter++) {
Gtk::TreeModel::Row r = *iter; const Gtk::TreeModel::Row r = *iter;
if (r[spots_.curveid] == curveId_) { if (r[spots_.curveid] == curveId_) {
treeview_->set_cursor(treemodel_->get_path(r)); treeview_->set_cursor(treemodel_->get_path(r));
@ -1496,7 +1493,7 @@ bool ControlSpotPanel::button1Pressed(int modifierKey)
} }
} }
lastCoord_->set(provider->posImage.x + provider->deltaImage.x, provider->posImage.y + provider->deltaImage.y); lastCoord_.set(provider->posImage.x + provider->deltaImage.x, provider->posImage.y + provider->deltaImage.y);
EditSubscriber::action = EditSubscriber::Action::DRAGGING; EditSubscriber::action = EditSubscriber::Action::DRAGGING;
return true; return true;
} }
@ -1524,18 +1521,18 @@ bool ControlSpotPanel::drag1(int modifierKey)
int imW, imH; int imW, imH;
provider->getImageSize(imW, imH); provider->getImageSize(imW, imH);
int rem = lastObject_ % 7; const int rem = lastObject_ % 7;
int method = shapeMethod_->get_active_row_number(); const int method = shapeMethod_->get_active_row_number();
Coord* newCoord = new Coord(provider->posImage.x + provider->deltaImage.x, provider->posImage.y + provider->deltaImage.y); Coord newCoord = Coord(provider->posImage.x + provider->deltaImage.x, provider->posImage.y + provider->deltaImage.y);
// Circle, Ellipses and Rectangle // Circle, Ellipses and Rectangle
if (rem >= 0 && rem < 3) { if (rem >= 0 && rem < 3) {
double deltaX = (double (newCoord->x) - double (lastCoord_->x)) * 2000. / double (imW); double deltaX = (double (newCoord.x) - double (lastCoord_.x)) * 2000. / double (imW);
double deltaY = (double (newCoord->y) - double (lastCoord_->y)) * 2000. / double (imH); double deltaY = (double (newCoord.y) - double (lastCoord_.y)) * 2000. / double (imH);
centerX_->setValue(centerX_->getValue() + deltaX); centerX_->setValue(centerX_->getValue() + deltaX);
centerY_->setValue(centerY_->getValue() + deltaY); centerY_->setValue(centerY_->getValue() + deltaY);
row[spots_.centerX] = (int) centerX_->getValue(); row[spots_.centerX] = centerX_->getIntValue();
row[spots_.centerY] = (int) centerY_->getValue(); row[spots_.centerY] = centerY_->getIntValue();
updateControlSpotCurve(row); updateControlSpotCurve(row);
@ -1546,15 +1543,15 @@ bool ControlSpotPanel::drag1(int modifierKey)
// cirX // cirX
if (rem == 3) { if (rem == 3) {
double deltaX = (double (newCoord->x) - double (lastCoord_->x)) * 2000. / double (imW); double deltaX = (double (newCoord.x) - double (lastCoord_.x)) * 2000. / double (imW);
locX_->setValue(locX_->getValue() + deltaX); locX_->setValue(locX_->getValue() + deltaX);
row[spots_.locX] = (int) locX_->getValue(); row[spots_.locX] = locX_->getIntValue();
if (method == 1 || method == 3) { // Symmetrical cases if (method == 1 || method == 3) { // Symmetrical cases
disableParamlistener(true); disableParamlistener(true);
locXL_->setValue(locX_->getValue()); locXL_->setValue(locX_->getValue());
disableParamlistener(false); disableParamlistener(false);
row[spots_.locXL] = (int) locXL_->getValue(); row[spots_.locXL] = locXL_->getIntValue();
} }
updateControlSpotCurve(row); updateControlSpotCurve(row);
@ -1566,15 +1563,15 @@ bool ControlSpotPanel::drag1(int modifierKey)
// cirXL // cirXL
if (rem == 4) { if (rem == 4) {
double deltaXL = (double (lastCoord_->x) - double (newCoord->x)) * 2000. / double (imW); double deltaXL = (double (lastCoord_.x) - double (newCoord.x)) * 2000. / double (imW);
locXL_->setValue(locXL_->getValue() + deltaXL); locXL_->setValue(locXL_->getValue() + deltaXL);
row[spots_.locXL] = (int) locXL_->getValue(); row[spots_.locXL] = locXL_->getIntValue();
if (method == 1 || method == 3) { // Symmetrical cases if (method == 1 || method == 3) { // Symmetrical cases
disableParamlistener(true); disableParamlistener(true);
locX_->setValue(locXL_->getValue()); locX_->setValue(locXL_->getValue());
disableParamlistener(false); disableParamlistener(false);
row[spots_.locX] = (int) locX_->getValue(); row[spots_.locX] = locX_->getIntValue();
} }
updateControlSpotCurve(row); updateControlSpotCurve(row);
@ -1586,15 +1583,15 @@ bool ControlSpotPanel::drag1(int modifierKey)
// cirY // cirY
if (rem == 5) { if (rem == 5) {
double deltaY = (double (newCoord->y) - double (lastCoord_->y)) * 2000. / double (imH); double deltaY = (double (newCoord.y) - double (lastCoord_.y)) * 2000. / double (imH);
locY_->setValue(locY_->getValue() + deltaY); locY_->setValue(locY_->getValue() + deltaY);
row[spots_.locY] = (int) locY_->getValue(); row[spots_.locY] = locY_->getIntValue();
if (method == 1 || method == 3) { // Symmetrical cases if (method == 1 || method == 3) { // Symmetrical cases
disableParamlistener(true); disableParamlistener(true);
locYT_->setValue(locY_->getValue()); locYT_->setValue(locY_->getValue());
disableParamlistener(false); disableParamlistener(false);
row[spots_.locYT] = (int) locYT_->getValue(); row[spots_.locYT] = locYT_->getIntValue();
} }
updateControlSpotCurve(row); updateControlSpotCurve(row);
@ -1606,15 +1603,15 @@ bool ControlSpotPanel::drag1(int modifierKey)
// cirYT // cirYT
if (rem == 6) { if (rem == 6) {
double deltaYT = (double (lastCoord_->y) - double (newCoord->y)) * 2000. / double (imH); double deltaYT = (double (lastCoord_.y) - double (newCoord.y)) * 2000. / double (imH);
locYT_->setValue(locYT_->getValue() + deltaYT); locYT_->setValue(locYT_->getValue() + deltaYT);
row[spots_.locYT] = (int) locYT_->getValue(); row[spots_.locYT] = locYT_->getIntValue();
if (method == 1 || method == 3) { // Symmetrical cases if (method == 1 || method == 3) { // Symmetrical cases
disableParamlistener(true); disableParamlistener(true);
locY_->setValue(locYT_->getValue()); locY_->setValue(locYT_->getValue());
disableParamlistener(false); disableParamlistener(false);
row[spots_.locY] = (int) locY_->getValue(); row[spots_.locY] = locY_->getIntValue();
} }
updateControlSpotCurve(row); updateControlSpotCurve(row);
@ -1624,18 +1621,18 @@ bool ControlSpotPanel::drag1(int modifierKey)
} }
} }
lastCoord_->set(newCoord->x, newCoord->y); lastCoord_.set(newCoord.x, newCoord.y);
return true; return true;
} }
int ControlSpotPanel::getEventType() int ControlSpotPanel::getEventType()
{ {
const int tmp = eventType; const int tmp = eventType;
eventType = 0; // Re-initialization at 0 if event type gotten eventType = None; // Re-initialization at "None" if event type gotten
return tmp; return tmp;
} }
ControlSpotPanel::SpotRow* ControlSpotPanel::getSpot(int id) ControlSpotPanel::SpotRow* ControlSpotPanel::getSpot(const int id)
{ {
// printf("getSpot: %d\n", id); // printf("getSpot: %d\n", id);
@ -1643,11 +1640,10 @@ ControlSpotPanel::SpotRow* ControlSpotPanel::getSpot(int id)
SpotRow* r = new SpotRow(); SpotRow* r = new SpotRow();
Gtk::TreeModel::Children children = treemodel_->children(); const Gtk::TreeModel::Children children = treemodel_->children();
Gtk::TreeModel::Children::iterator iter;
for (iter = children.begin(); iter != children.end(); iter++) { for (auto iter = children.begin(); iter != children.end(); iter++) {
Gtk::TreeModel::Row row = *iter; const Gtk::TreeModel::Row row = *iter;
if (row[spots_.id] == id) { if (row[spots_.id] == id) {
r->id = row[spots_.id]; r->id = row[spots_.id];
@ -1687,11 +1683,10 @@ std::vector<int>* ControlSpotPanel::getSpotIdList()
std::vector<int>* r = new std::vector<int>(); std::vector<int>* r = new std::vector<int>();
Gtk::TreeModel::Children children = treemodel_->children(); const Gtk::TreeModel::Children children = treemodel_->children();
Gtk::TreeModel::Children::iterator iter;
for (iter = children.begin(); iter != children.end(); iter++) { for (auto iter = children.begin(); iter != children.end(); iter++) {
Gtk::TreeModel::Row row = *iter; const Gtk::TreeModel::Row row = *iter;
r->push_back(row[spots_.id]); r->push_back(row[spots_.id]);
} }
@ -1711,14 +1706,14 @@ int ControlSpotPanel::getSelectedSpot()
return 0; return 0;
} }
auto iter = s->get_selected(); const auto iter = s->get_selected();
Gtk::TreeModel::Row row = *iter; const Gtk::TreeModel::Row row = *iter;
int id = row[spots_.id]; int id = row[spots_.id];
return id; return id;
} }
void ControlSpotPanel::setSelectedSpot(int id) void ControlSpotPanel::setSelectedSpot(const int id)
{ {
// printf("setSelectedSpot: %d\n", id); // printf("setSelectedSpot: %d\n", id);
@ -1726,11 +1721,10 @@ void ControlSpotPanel::setSelectedSpot(int id)
disableParamlistener(true); disableParamlistener(true);
Gtk::TreeModel::Children children = treemodel_->children(); const Gtk::TreeModel::Children children = treemodel_->children();
Gtk::TreeModel::Children::iterator iter;
for (iter = children.begin(); iter != children.end(); iter++) { for (auto iter = children.begin(); iter != children.end(); iter++) {
Gtk::TreeModel::Row row = *iter; const Gtk::TreeModel::Row row = *iter;
if (row[spots_.id] == id) { if (row[spots_.id] == id) {
treeview_->set_cursor(treemodel_->get_path(row)); treeview_->set_cursor(treemodel_->get_path(row));
@ -1749,12 +1743,11 @@ int ControlSpotPanel::getNewId()
// Looking for maximum used id // Looking for maximum used id
int max_row_id = 0; int max_row_id = 0;
Gtk::TreeModel::Children children = treemodel_->children(); const Gtk::TreeModel::Children children = treemodel_->children();
Gtk::TreeModel::Children::iterator iter;
for (iter = children.begin(); iter != children.end(); iter++) { for (auto iter = children.begin(); iter != children.end(); iter++) {
Gtk::TreeModel::Row row = *iter; const Gtk::TreeModel::Row row = *iter;
int iter_id = row[spots_.id]; const int iter_id = row[spots_.id];
max_row_id = std::max(max_row_id, iter_id); max_row_id = std::max(max_row_id, iter_id);
} }
@ -1813,10 +1806,9 @@ int ControlSpotPanel::updateControlSpot(SpotRow* spot)
disableParamlistener(true); disableParamlistener(true);
Gtk::TreeModel::Children children = treemodel_->children(); const Gtk::TreeModel::Children children = treemodel_->children();
Gtk::TreeModel::Children::iterator iter;
for (iter = children.begin(); iter != children.end(); iter++) { for (auto iter = children.begin(); iter != children.end(); iter++) {
Gtk::TreeModel::Row row = *iter; Gtk::TreeModel::Row row = *iter;
if (row[spots_.id] == spot->id) { if (row[spots_.id] == spot->id) {
@ -1855,7 +1847,7 @@ int ControlSpotPanel::updateControlSpot(SpotRow* spot)
return 0; return 0;
} }
void ControlSpotPanel::deleteControlSpot(int id) void ControlSpotPanel::deleteControlSpot(const int id)
{ {
// printf("deleteControlSpot: %d\n", id); // printf("deleteControlSpot: %d\n", id);
@ -1863,10 +1855,9 @@ void ControlSpotPanel::deleteControlSpot(int id)
disableParamlistener(true); disableParamlistener(true);
Gtk::TreeModel::Children children = treemodel_->children(); const Gtk::TreeModel::Children children = treemodel_->children();
Gtk::TreeModel::Children::iterator iter;
for (iter = children.begin(); iter != children.end(); iter++) { for (auto iter = children.begin(); iter != children.end(); iter++) {
Gtk::TreeModel::Row row = *iter; Gtk::TreeModel::Row row = *iter;
if (row[spots_.id] == id) { if (row[spots_.id] == id) {

View File

@ -97,11 +97,26 @@ public:
bool avoid; bool avoid;
}; };
/**
* An event type enumeration allows exchanges of spot panel event type from and to ControlSpotClass
*/
enum eventType {
None = 0,
SpotCreation = 1,
SpotDeletion = 2,
SpotSelection = 3,
SpotDuplication = 4
};
// Constructor and management functions // Constructor and management functions
/** /**
* Default constructor of ControlSpotPanel class * Default constructor of ControlSpotPanel class
*/ */
ControlSpotPanel(); ControlSpotPanel();
/**
* Destructor of ControlSpotPanel class
*/
~ControlSpotPanel();
/** /**
* Implementation of setEditProvider function of toolpanel.h * Implementation of setEditProvider function of toolpanel.h
* *
@ -111,7 +126,7 @@ public:
/** /**
* Getter of the event type raised by this panel * Getter of the event type raised by this panel
* *
* @return The raised event type (0 = No event, 1 = Spot creation event, 2 = Spot deletion event, 3 = Spot selection event) * @return The raised event type (refer to eventType enumeration)
*/ */
int getEventType(); int getEventType();
/** /**
@ -120,7 +135,7 @@ public:
* @param id The spot id to get params * @param id The spot id to get params
* @return A SpotRow structure containing params of associated spot * @return A SpotRow structure containing params of associated spot
*/ */
SpotRow* getSpot(int id); SpotRow* getSpot(const int id);
/** /**
* Get of spot id list * Get of spot id list
* *
@ -138,7 +153,7 @@ public:
* *
* @param id The id of spot to be selected * @param id The id of spot to be selected
*/ */
void setSelectedSpot(int id); void setSelectedSpot(const int id);
// Control spot creation functions // Control spot creation functions
/** /**
@ -168,7 +183,7 @@ public:
* *
* @param id The id of the spot to be deleted * @param id The id of the spot to be deleted
*/ */
void deleteControlSpot(int id); void deleteControlSpot(const int id);
// Panel widgets management functions // Panel widgets management functions
/** /**
@ -247,10 +262,10 @@ private:
void disableParamlistener(bool cond); void disableParamlistener(bool cond);
void addControlSpotCurve(Gtk::TreeModel::Row row); void addControlSpotCurve(Gtk::TreeModel::Row& row);
void updateControlSpotCurve(Gtk::TreeModel::Row row); void updateControlSpotCurve(const Gtk::TreeModel::Row& row);
void deleteControlSpotCurve(Gtk::TreeModel::Row row); void deleteControlSpotCurve(Gtk::TreeModel::Row& row);
void updateCurveOpacity(Gtk::TreeModel::Row selectedRow); void updateCurveOpacity(const Gtk::TreeModel::Row& selectedRow);
CursorShape getCursor(int objectID) const; CursorShape getCursor(int objectID) const;
bool mouseOver(int modifierKey); bool mouseOver(int modifierKey);
bool button1Pressed(int modifierKey); bool button1Pressed(int modifierKey);
@ -358,7 +373,7 @@ private:
// Internal variables // Internal variables
int lastObject_; int lastObject_;
rtengine::Coord* lastCoord_; rtengine::Coord lastCoord_;
bool nbSpotChanged_; bool nbSpotChanged_;
bool selSpotChanged_; bool selSpotChanged_;
bool nameChanged_; bool nameChanged_;
@ -366,6 +381,9 @@ private:
int eventType; // 0 = No event, 1 = Spot creation event, 2 = Spot deletion event, 3 = Spot selection event, 4 = Spot duplication event int eventType; // 0 = No event, 1 = Spot creation event, 2 = Spot deletion event, 3 = Spot selection event, 4 = Spot duplication event
Gtk::Frame* const excluFrame; Gtk::Frame* const excluFrame;
// Row background color
Gdk::RGBA colorMouseover, colorNominal;
// Treeview mutex // Treeview mutex
MyMutex mTreeview; MyMutex mTreeview;
}; };

View File

@ -1366,7 +1366,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited)
LocallabParams::LocallabSpot* newSpot; LocallabParams::LocallabSpot* newSpot;
switch (spotPanelEvent) { switch (spotPanelEvent) {
case (1): // 1 = Spot creation event case (ControlSpotPanel::SpotCreation): // Spot creation event
// Spot creation (default initialization) // Spot creation (default initialization)
newSpot = new LocallabParams::LocallabSpot(); newSpot = new LocallabParams::LocallabSpot();
spotId = expsettings->getNewId(); spotId = expsettings->getNewId();
@ -1459,7 +1459,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited)
break; break;
case (2): // 2 = Spot deletion event case (ControlSpotPanel::SpotDeletion): // Spot deletion event
// Get deleted spot index in ProcParams and update it // Get deleted spot index in ProcParams and update it
spotId = expsettings->getSelectedSpot(); spotId = expsettings->getSelectedSpot();
@ -1515,7 +1515,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited)
break; break;
case (3): // 3 = Spot selection event case (ControlSpotPanel::SpotSelection): // Spot selection event
spotId = expsettings->getSelectedSpot(); spotId = expsettings->getSelectedSpot();
for (int i = 0; i < pp->locallab.nbspot && i < (int)pp->locallab.spots.size(); i++) { for (int i = 0; i < pp->locallab.nbspot && i < (int)pp->locallab.spots.size(); i++) {
@ -1541,7 +1541,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited)
break; break;
case (4): // 4 = Spot duplication event case (ControlSpotPanel::SpotDuplication): // Spot duplication event
newSpot = nullptr; newSpot = nullptr;
spotId = expsettings->getSelectedSpot(); spotId = expsettings->getSelectedSpot();