From bf9acf0abdc30a938a05355b20c5410a7c1b5527 Mon Sep 17 00:00:00 2001 From: Pandagrapher Date: Sun, 21 Apr 2019 10:59:01 +0200 Subject: [PATCH] ControlSpotPanel code cleanup Bugfixes: - Removes some memory link with edit widgets management --- rtgui/controlspotpanel.cc | 323 ++++++++++++++++++-------------------- rtgui/controlspotpanel.h | 36 +++-- rtgui/locallab.cc | 8 +- 3 files changed, 188 insertions(+), 179 deletions(-) diff --git a/rtgui/controlspotpanel.cc b/rtgui/controlspotpanel.cc index e47a60944..df2a79539 100644 --- a/rtgui/controlspotpanel.cc +++ b/rtgui/controlspotpanel.cc @@ -69,12 +69,11 @@ ControlSpotPanel::ControlSpotPanel(): avoid_(Gtk::manage(new Gtk::CheckButton(M("TP_LOCALLAB_AVOID")))), lastObject_(-1), - lastCoord_(new Coord()), nbSpotChanged_(false), selSpotChanged_(false), nameChanged_(false), visibilityChanged_(false), - eventType(0), + eventType(None), excluFrame(Gtk::manage(new Gtk::Frame(M("TP_LOCALLAB_EXCLUF")))) { Gtk::HBox* const hbox1_ = Gtk::manage(new Gtk::HBox(true, 4)); @@ -265,6 +264,31 @@ ControlSpotPanel::ControlSpotPanel(): pack_start(*avoid_); 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) @@ -277,22 +301,17 @@ void ControlSpotPanel::render_id( { auto row = *iter; Gtk::CellRendererText *ct = static_cast(cell); - int value = row[spots_.id]; - ct->property_text() = std::to_string(value); - // Render background color - Gdk::RGBA color; - if (row[spots_.mouseover]) { // Orange - color.set_red(1.); - color.set_green(100. / 255.); - 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.); + + // Render cell text + ct->property_text() = std::to_string(row[spots_.id]); + + // Render cell background color + if (row[spots_.mouseover]) { + ct->property_background_rgba() = colorMouseover; + } else { + ct->property_background_rgba() = colorNominal; } - ct->property_background_rgba() = color; + } void ControlSpotPanel::render_name( @@ -300,22 +319,16 @@ void ControlSpotPanel::render_name( { auto row = *iter; Gtk::CellRendererText *ct = static_cast(cell); - auto value = row[spots_.name]; - ct->property_text() = value; - Gdk::RGBA color; - // Render background color - if (row[spots_.mouseover]) { // Orange - color.set_red(1.); - color.set_green(100. / 255.); - 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.); + + // Render cell text + ct->property_text() = row[spots_.name]; + + // Render cell background color + if (row[spots_.mouseover]) { + ct->property_background_rgba() = colorMouseover; + } else { + ct->property_background_rgba() = colorNominal; } - ct->property_background_rgba() = color; } void ControlSpotPanel::render_isvisible( @@ -323,28 +336,20 @@ void ControlSpotPanel::render_isvisible( { auto row = *iter; Gtk::CellRendererText *ct = static_cast(cell); - auto value = row[spots_.isvisible]; - if (value) { + // Render cell text + if (row[spots_.isvisible]) { ct->property_text() = M("TP_LOCALLAB_ROW_VIS"); } else { ct->property_text() = M("TP_LOCALLAB_ROW_NVIS"); } - // Render background color - Gdk::RGBA color; - if (row[spots_.mouseover]) { // Orange - color.set_red(1.); - color.set_green(100. / 255.); - 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.); + // Render cell background color + if (row[spots_.mouseover]) { + ct->property_background_rgba() = colorMouseover; + } else { + ct->property_background_rgba() = colorNominal; } - ct->property_background_rgba() = color; } void ControlSpotPanel::on_button_add() @@ -358,7 +363,7 @@ void ControlSpotPanel::on_button_add() // Raise event nbSpotChanged_ = true; selSpotChanged_ = true; - eventType = 1; // 1 = Spot creation event + eventType = SpotCreation; const int newId = getNewId(); listener->panelChanged(EvLocallabSpotCreated, "ID#" + std::to_string(newId)); } @@ -374,7 +379,7 @@ void ControlSpotPanel::on_button_delete() // Raise event nbSpotChanged_ = true; selSpotChanged_ = true; - eventType = 2; // 2 = Spot deletion event + eventType = SpotDeletion; const int delId = getSelectedSpot(); listener->panelChanged(EvLocallabSpotDeleted, "ID#" + std::to_string(delId)); } @@ -394,7 +399,7 @@ void ControlSpotPanel::on_button_duplicate() } nbSpotChanged_ = true; selSpotChanged_ = true; - eventType = 4; // 4 = Spot duplication event + eventType = SpotDuplication; const int newId = getNewId(); listener->panelChanged(EvLocallabSpotCreated, "ID#" + std::to_string(newId) + " (" + M("TP_LOCALLAB_EV_DUPL") + " ID#" @@ -502,23 +507,23 @@ void ControlSpotPanel::load_ControlSpot_param() // Load param in selected control spot shape_->set_active(row[spots_.shape]); spotMethod_->set_active(row[spots_.spotMethod]); - sensiexclu_->setValue(static_cast(row[spots_.sensiexclu])); - structexclu_->setValue(static_cast(row[spots_.structexclu])); - struc_->setValue(static_cast(row[spots_.struc])); + sensiexclu_->setValue((double)row[spots_.sensiexclu]); + structexclu_->setValue((double)row[spots_.structexclu]); + struc_->setValue((double)row[spots_.struc]); shapeMethod_->set_active(row[spots_.shapeMethod]); - locX_->setValue(static_cast(row[spots_.locX])); - locXL_->setValue(static_cast(row[spots_.locXL])); - locY_->setValue(static_cast(row[spots_.locY])); - locYT_->setValue(static_cast(row[spots_.locYT])); - centerX_->setValue(static_cast(row[spots_.centerX])); - centerY_->setValue(static_cast(row[spots_.centerY])); - circrad_->setValue(static_cast(row[spots_.circrad])); + locX_->setValue((double)row[spots_.locX]); + locXL_->setValue((double)row[spots_.locXL]); + locY_->setValue((double)row[spots_.locY]); + locYT_->setValue((double)row[spots_.locYT]); + centerX_->setValue((double)row[spots_.centerX]); + centerY_->setValue((double)row[spots_.centerY]); + circrad_->setValue((double)row[spots_.circrad]); qualityMethod_->set_active(row[spots_.qualityMethod]); - transit_->setValue(static_cast(row[spots_.transit])); - thresh_->setValue(static_cast(row[spots_.thresh])); - iter_->setValue(static_cast(row[spots_.iter])); - balan_->setValue(static_cast(row[spots_.balan])); - transitweak_->setValue(static_cast(row[spots_.transitweak])); + transit_->setValue((double)row[spots_.transit]); + thresh_->setValue((double)row[spots_.thresh]); + iter_->setValue((double)row[spots_.iter]); + balan_->setValue((double)row[spots_.balan]); + transitweak_->setValue((double)row[spots_.transitweak]); avoid_->set_active(row[spots_.avoid]); } @@ -532,7 +537,7 @@ void ControlSpotPanel::controlspotChanged() // Raise event selSpotChanged_ = true; - eventType = 3; // 3 = Spot selection event + eventType = SpotSelection; const int selId = getSelectedSpot(); listener->panelChanged(EvLocallabSpotSelected, "ID#" + std::to_string(selId)); } @@ -614,8 +619,8 @@ void ControlSpotPanel::shapeMethodChanged() disableParamlistener(false); row[spots_.shapeMethod] = shapeMethod_->get_active_row_number(); - row[spots_.locXL] = static_cast(locX_->getValue()); - row[spots_.locYT] = static_cast(locY_->getValue()); + row[spots_.locXL] = locX_->getIntValue(); + row[spots_.locYT] = locY_->getIntValue(); updateControlSpotCurve(row); } else { // In batch mode, sliders are always independent @@ -787,7 +792,7 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) Gtk::TreeModel::Row row = *iter; if (a == sensiexclu_) { - row[spots_.sensiexclu] = (int) sensiexclu_->getValue(); + row[spots_.sensiexclu] = sensiexclu_->getIntValue(); if (listener) { listener->panelChanged(EvLocallabSpotSensiexclu, sensiexclu_->getTextValue()); @@ -795,7 +800,7 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) } if (a == structexclu_) { - row[spots_.structexclu] = (int) structexclu_->getValue(); + row[spots_.structexclu] = structexclu_->getIntValue(); if (listener) { listener->panelChanged(Evlocallabstructexlu, structexclu_->getTextValue()); @@ -811,13 +816,13 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) } 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) disableParamlistener(true); locXL_->setValue(locX_->getValue()); disableParamlistener(false); - row[spots_.locXL] = (int) locXL_->getValue(); + row[spots_.locXL] = locXL_->getIntValue(); } updateControlSpotCurve(row); @@ -828,13 +833,13 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) } 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) disableParamlistener(true); locX_->setValue(locXL_->getValue()); disableParamlistener(false); - row[spots_.locX] = (int) locX_->getValue(); + row[spots_.locX] = locX_->getIntValue(); } updateControlSpotCurve(row); @@ -845,13 +850,13 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) } 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) disableParamlistener(true); locYT_->setValue(locY_->getValue()); disableParamlistener(false); - row[spots_.locYT] = (int) locYT_->getValue(); + row[spots_.locYT] = locYT_->getIntValue(); } updateControlSpotCurve(row); @@ -862,13 +867,13 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) } 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) disableParamlistener(true); locY_->setValue(locYT_->getValue()); disableParamlistener(false); - row[spots_.locY] = (int) locY_->getValue(); + row[spots_.locY] = locY_->getIntValue(); } updateControlSpotCurve(row); @@ -879,8 +884,8 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) } if (a == centerX_ || a == centerY_) { - row[spots_.centerX] = (int) centerX_->getValue(); - row[spots_.centerY] = (int) centerY_->getValue(); + row[spots_.centerX] = centerX_->getIntValue(); + row[spots_.centerY] = centerY_->getIntValue(); updateControlSpotCurve(row); @@ -890,7 +895,7 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) } if (a == circrad_) { - row[spots_.circrad] = (int) circrad_->getValue(); + row[spots_.circrad] = circrad_->getIntValue(); updateControlSpotCurve(row); @@ -900,7 +905,7 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) } if (a == transit_) { - row[spots_.transit] = (int) transit_->getValue(); + row[spots_.transit] = transit_->getIntValue(); if (listener) { listener->panelChanged(EvLocallabSpotTransit, transit_->getTextValue()); @@ -917,7 +922,6 @@ void ControlSpotPanel::adjusterChanged(Adjuster* a, double newval) } if (a == iter_) { - // row[spots_.iter] = (int) iter_->getValue(); row[spots_.iter] = iter_->getValue(); if (listener) { @@ -1036,7 +1040,7 @@ void ControlSpotPanel::setParamEditable(bool cond) avoid_->set_sensitive(cond); } -void ControlSpotPanel::addControlSpotCurve(Gtk::TreeModel::Row row) +void ControlSpotPanel::addControlSpotCurve(Gtk::TreeModel::Row& row) { // printf("addControlSpotCurve\n"); @@ -1120,7 +1124,7 @@ void ControlSpotPanel::addControlSpotCurve(Gtk::TreeModel::Row row) 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]; 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]; @@ -1262,27 +1266,21 @@ void ControlSpotPanel::deleteControlSpotCurve(Gtk::TreeModel::Row row) } // visibleGeometry - EditSubscriber::visibleGeometry.erase(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7 + 6); - EditSubscriber::visibleGeometry.erase(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7 + 5); - EditSubscriber::visibleGeometry.erase(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7 + 4); - 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); + for (int i = 6; i >= 0; i--) { + delete *(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7 + i); + EditSubscriber::visibleGeometry.erase(EditSubscriber::visibleGeometry.begin() + (curveid_ - 1) * 7 + i); + } // mouseOverGeometry - EditSubscriber::mouseOverGeometry.erase(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7 + 6); - EditSubscriber::mouseOverGeometry.erase(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7 + 5); - EditSubscriber::mouseOverGeometry.erase(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7 + 4); - 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); + for (int i = 6; i >= 0; i--) { + delete *(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7 + i); + EditSubscriber::mouseOverGeometry.erase(EditSubscriber::mouseOverGeometry.begin() + (curveid_ - 1) * 7 + i); + } row[spots_.curveid] = 0; // Reset associated 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++) { 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]; @@ -1322,7 +1320,7 @@ CursorShape ControlSpotPanel::getCursor(int objectID) const return CSHandOpen; } - int rem_ = objectID % 7; + const int rem_ = objectID % 7; switch (rem_) { case (0): // centerCircle: (curveid_ - 1) * 7 @@ -1362,22 +1360,21 @@ bool ControlSpotPanel::mouseOver(int modifierKey) // Get selected row 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_ == -1) { // 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; } // Reset mouseOver preview for TreeView - Gtk::TreeModel::Children children = treemodel_->children(); - Gtk::TreeModel::Children::iterator iter; + const Gtk::TreeModel::Children children = treemodel_->children(); - for (iter = children.begin(); iter != children.end(); iter++) { + for (auto iter = children.begin(); iter != children.end(); iter++) { Gtk::TreeModel::Row row = *iter; row[spots_.mouseover] = false; } @@ -1387,13 +1384,13 @@ bool ControlSpotPanel::mouseOver(int modifierKey) return false; } - int curveId_ = object_ / 7 + 1; - int rem = object_ % 7; + const int curveId_ = object_ / 7 + 1; + const int rem = object_ % 7; // Manage mouseOver preview for TreeView - Gtk::TreeModel::Children children = treemodel_->children(); - Gtk::TreeModel::Children::iterator iter; - for (iter = children.begin(); iter != children.end(); iter++) { + const Gtk::TreeModel::Children children = treemodel_->children(); + + for (auto iter = children.begin(); iter != children.end(); iter++) { Gtk::TreeModel::Row row = *iter; if (row[spots_.curveid] == curveId_ && *row != *selRow) { row[spots_.mouseover] = true; @@ -1484,11 +1481,11 @@ bool ControlSpotPanel::button1Pressed(int modifierKey) } // Select associated control spot - int curveId_ = lastObject_ / 7 + 1; + const int curveId_ = lastObject_ / 7 + 1; Gtk::TreeModel::Children children = treemodel_->children(); 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_) { 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; return true; } @@ -1524,18 +1521,18 @@ bool ControlSpotPanel::drag1(int modifierKey) int imW, imH; provider->getImageSize(imW, imH); - int rem = lastObject_ % 7; - int method = shapeMethod_->get_active_row_number(); - Coord* newCoord = new Coord(provider->posImage.x + provider->deltaImage.x, provider->posImage.y + provider->deltaImage.y); + const int rem = lastObject_ % 7; + const int method = shapeMethod_->get_active_row_number(); + Coord newCoord = Coord(provider->posImage.x + provider->deltaImage.x, provider->posImage.y + provider->deltaImage.y); // Circle, Ellipses and Rectangle if (rem >= 0 && rem < 3) { - double deltaX = (double (newCoord->x) - double (lastCoord_->x)) * 2000. / double (imW); - double deltaY = (double (newCoord->y) - double (lastCoord_->y)) * 2000. / double (imH); + double deltaX = (double (newCoord.x) - double (lastCoord_.x)) * 2000. / double (imW); + double deltaY = (double (newCoord.y) - double (lastCoord_.y)) * 2000. / double (imH); centerX_->setValue(centerX_->getValue() + deltaX); centerY_->setValue(centerY_->getValue() + deltaY); - row[spots_.centerX] = (int) centerX_->getValue(); - row[spots_.centerY] = (int) centerY_->getValue(); + row[spots_.centerX] = centerX_->getIntValue(); + row[spots_.centerY] = centerY_->getIntValue(); updateControlSpotCurve(row); @@ -1546,15 +1543,15 @@ bool ControlSpotPanel::drag1(int modifierKey) // cirX 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); - row[spots_.locX] = (int) locX_->getValue(); + row[spots_.locX] = locX_->getIntValue(); if (method == 1 || method == 3) { // Symmetrical cases disableParamlistener(true); locXL_->setValue(locX_->getValue()); disableParamlistener(false); - row[spots_.locXL] = (int) locXL_->getValue(); + row[spots_.locXL] = locXL_->getIntValue(); } updateControlSpotCurve(row); @@ -1566,15 +1563,15 @@ bool ControlSpotPanel::drag1(int modifierKey) // cirXL 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); - row[spots_.locXL] = (int) locXL_->getValue(); + row[spots_.locXL] = locXL_->getIntValue(); if (method == 1 || method == 3) { // Symmetrical cases disableParamlistener(true); locX_->setValue(locXL_->getValue()); disableParamlistener(false); - row[spots_.locX] = (int) locX_->getValue(); + row[spots_.locX] = locX_->getIntValue(); } updateControlSpotCurve(row); @@ -1586,15 +1583,15 @@ bool ControlSpotPanel::drag1(int modifierKey) // cirY 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); - row[spots_.locY] = (int) locY_->getValue(); + row[spots_.locY] = locY_->getIntValue(); if (method == 1 || method == 3) { // Symmetrical cases disableParamlistener(true); locYT_->setValue(locY_->getValue()); disableParamlistener(false); - row[spots_.locYT] = (int) locYT_->getValue(); + row[spots_.locYT] = locYT_->getIntValue(); } updateControlSpotCurve(row); @@ -1606,15 +1603,15 @@ bool ControlSpotPanel::drag1(int modifierKey) // cirYT 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); - row[spots_.locYT] = (int) locYT_->getValue(); + row[spots_.locYT] = locYT_->getIntValue(); if (method == 1 || method == 3) { // Symmetrical cases disableParamlistener(true); locY_->setValue(locYT_->getValue()); disableParamlistener(false); - row[spots_.locY] = (int) locY_->getValue(); + row[spots_.locY] = locY_->getIntValue(); } 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; } int ControlSpotPanel::getEventType() { 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; } -ControlSpotPanel::SpotRow* ControlSpotPanel::getSpot(int id) +ControlSpotPanel::SpotRow* ControlSpotPanel::getSpot(const int id) { // printf("getSpot: %d\n", id); @@ -1643,11 +1640,10 @@ ControlSpotPanel::SpotRow* ControlSpotPanel::getSpot(int id) SpotRow* r = new SpotRow(); - Gtk::TreeModel::Children children = treemodel_->children(); - Gtk::TreeModel::Children::iterator iter; + const Gtk::TreeModel::Children children = treemodel_->children(); - for (iter = children.begin(); iter != children.end(); iter++) { - Gtk::TreeModel::Row row = *iter; + for (auto iter = children.begin(); iter != children.end(); iter++) { + const Gtk::TreeModel::Row row = *iter; if (row[spots_.id] == id) { r->id = row[spots_.id]; @@ -1687,11 +1683,10 @@ std::vector* ControlSpotPanel::getSpotIdList() std::vector* r = new std::vector(); - Gtk::TreeModel::Children children = treemodel_->children(); - Gtk::TreeModel::Children::iterator iter; + const Gtk::TreeModel::Children children = treemodel_->children(); - for (iter = children.begin(); iter != children.end(); iter++) { - Gtk::TreeModel::Row row = *iter; + for (auto iter = children.begin(); iter != children.end(); iter++) { + const Gtk::TreeModel::Row row = *iter; r->push_back(row[spots_.id]); } @@ -1711,14 +1706,14 @@ int ControlSpotPanel::getSelectedSpot() return 0; } - auto iter = s->get_selected(); - Gtk::TreeModel::Row row = *iter; + const auto iter = s->get_selected(); + const Gtk::TreeModel::Row row = *iter; int id = row[spots_.id]; return id; } -void ControlSpotPanel::setSelectedSpot(int id) +void ControlSpotPanel::setSelectedSpot(const int id) { // printf("setSelectedSpot: %d\n", id); @@ -1726,11 +1721,10 @@ void ControlSpotPanel::setSelectedSpot(int id) disableParamlistener(true); - Gtk::TreeModel::Children children = treemodel_->children(); - Gtk::TreeModel::Children::iterator iter; + const Gtk::TreeModel::Children children = treemodel_->children(); - for (iter = children.begin(); iter != children.end(); iter++) { - Gtk::TreeModel::Row row = *iter; + for (auto iter = children.begin(); iter != children.end(); iter++) { + const Gtk::TreeModel::Row row = *iter; if (row[spots_.id] == id) { treeview_->set_cursor(treemodel_->get_path(row)); @@ -1749,12 +1743,11 @@ int ControlSpotPanel::getNewId() // Looking for maximum used id int max_row_id = 0; - Gtk::TreeModel::Children children = treemodel_->children(); - Gtk::TreeModel::Children::iterator iter; + const Gtk::TreeModel::Children children = treemodel_->children(); - for (iter = children.begin(); iter != children.end(); iter++) { - Gtk::TreeModel::Row row = *iter; - int iter_id = row[spots_.id]; + for (auto iter = children.begin(); iter != children.end(); iter++) { + const Gtk::TreeModel::Row row = *iter; + const int iter_id = row[spots_.id]; max_row_id = std::max(max_row_id, iter_id); } @@ -1813,10 +1806,9 @@ int ControlSpotPanel::updateControlSpot(SpotRow* spot) disableParamlistener(true); - Gtk::TreeModel::Children children = treemodel_->children(); - Gtk::TreeModel::Children::iterator iter; + const Gtk::TreeModel::Children children = treemodel_->children(); - for (iter = children.begin(); iter != children.end(); iter++) { + for (auto iter = children.begin(); iter != children.end(); iter++) { Gtk::TreeModel::Row row = *iter; if (row[spots_.id] == spot->id) { @@ -1855,7 +1847,7 @@ int ControlSpotPanel::updateControlSpot(SpotRow* spot) return 0; } -void ControlSpotPanel::deleteControlSpot(int id) +void ControlSpotPanel::deleteControlSpot(const int id) { // printf("deleteControlSpot: %d\n", id); @@ -1863,10 +1855,9 @@ void ControlSpotPanel::deleteControlSpot(int id) disableParamlistener(true); - Gtk::TreeModel::Children children = treemodel_->children(); - Gtk::TreeModel::Children::iterator iter; + const Gtk::TreeModel::Children children = treemodel_->children(); - for (iter = children.begin(); iter != children.end(); iter++) { + for (auto iter = children.begin(); iter != children.end(); iter++) { Gtk::TreeModel::Row row = *iter; if (row[spots_.id] == id) { diff --git a/rtgui/controlspotpanel.h b/rtgui/controlspotpanel.h index 5b1b07ff7..0bbccc572 100644 --- a/rtgui/controlspotpanel.h +++ b/rtgui/controlspotpanel.h @@ -97,11 +97,26 @@ public: 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 /** * Default constructor of ControlSpotPanel class */ ControlSpotPanel(); + /** + * Destructor of ControlSpotPanel class + */ + ~ControlSpotPanel(); /** * Implementation of setEditProvider function of toolpanel.h * @@ -111,7 +126,7 @@ public: /** * 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(); /** @@ -120,7 +135,7 @@ public: * @param id The spot id to get params * @return A SpotRow structure containing params of associated spot */ - SpotRow* getSpot(int id); + SpotRow* getSpot(const int id); /** * Get of spot id list * @@ -138,7 +153,7 @@ public: * * @param id The id of spot to be selected */ - void setSelectedSpot(int id); + void setSelectedSpot(const int id); // Control spot creation functions /** @@ -168,7 +183,7 @@ public: * * @param id The id of the spot to be deleted */ - void deleteControlSpot(int id); + void deleteControlSpot(const int id); // Panel widgets management functions /** @@ -247,10 +262,10 @@ private: void disableParamlistener(bool cond); - void addControlSpotCurve(Gtk::TreeModel::Row row); - void updateControlSpotCurve(Gtk::TreeModel::Row row); - void deleteControlSpotCurve(Gtk::TreeModel::Row row); - void updateCurveOpacity(Gtk::TreeModel::Row selectedRow); + void addControlSpotCurve(Gtk::TreeModel::Row& row); + void updateControlSpotCurve(const Gtk::TreeModel::Row& row); + void deleteControlSpotCurve(Gtk::TreeModel::Row& row); + void updateCurveOpacity(const Gtk::TreeModel::Row& selectedRow); CursorShape getCursor(int objectID) const; bool mouseOver(int modifierKey); bool button1Pressed(int modifierKey); @@ -358,7 +373,7 @@ private: // Internal variables int lastObject_; - rtengine::Coord* lastCoord_; + rtengine::Coord lastCoord_; bool nbSpotChanged_; bool selSpotChanged_; 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 Gtk::Frame* const excluFrame; + // Row background color + Gdk::RGBA colorMouseover, colorNominal; + // Treeview mutex MyMutex mTreeview; }; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index 2802e9e2a..0fb65a7ba 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -1366,7 +1366,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) LocallabParams::LocallabSpot* newSpot; switch (spotPanelEvent) { - case (1): // 1 = Spot creation event + case (ControlSpotPanel::SpotCreation): // Spot creation event // Spot creation (default initialization) newSpot = new LocallabParams::LocallabSpot(); spotId = expsettings->getNewId(); @@ -1459,7 +1459,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) break; - case (2): // 2 = Spot deletion event + case (ControlSpotPanel::SpotDeletion): // Spot deletion event // Get deleted spot index in ProcParams and update it spotId = expsettings->getSelectedSpot(); @@ -1515,7 +1515,7 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) break; - case (3): // 3 = Spot selection event + case (ControlSpotPanel::SpotSelection): // Spot selection event spotId = expsettings->getSelectedSpot(); 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; - case (4): // 4 = Spot duplication event + case (ControlSpotPanel::SpotDuplication): // Spot duplication event newSpot = nullptr; spotId = expsettings->getSelectedSpot();