Memory leak in RefreshMapper, fixes #5323
This commit is contained in:
parent
351f8f4e12
commit
159e1784f4
@ -19,12 +19,13 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "eventmapper.h"
|
#include "eventmapper.h"
|
||||||
|
#include "multilangmgr.h"
|
||||||
|
|
||||||
|
|
||||||
ProcEventMapper::ProcEventMapper()
|
ProcEventMapper::ProcEventMapper()
|
||||||
{
|
{
|
||||||
for (int event = 0; event < rtengine::NUMOFEVENTS; ++event) {
|
for (int event = 0; event < rtengine::NUMOFEVENTS; ++event) {
|
||||||
history_msgs_[event] = "HISTORY_MSG_" + std::to_string(event + 1);
|
history_msgs_[event] = M("HISTORY_MSG_" + std::to_string(event + 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,16 +39,22 @@ ProcEventMapper *ProcEventMapper::getInstance()
|
|||||||
|
|
||||||
rtengine::ProcEvent ProcEventMapper::newEvent(int action, const std::string &history_msg)
|
rtengine::ProcEvent ProcEventMapper::newEvent(int action, const std::string &history_msg)
|
||||||
{
|
{
|
||||||
|
std::string eventkey = std::to_string(action) + history_msg;
|
||||||
|
const auto ret = events_.find(eventkey);
|
||||||
|
if (ret == events_.end()) {
|
||||||
rtengine::ProcEvent event = rtengine::RefreshMapper::getInstance()->newEvent();
|
rtengine::ProcEvent event = rtengine::RefreshMapper::getInstance()->newEvent();
|
||||||
rtengine::RefreshMapper::getInstance()->mapEvent(event, action);
|
rtengine::RefreshMapper::getInstance()->mapEvent(event, action);
|
||||||
|
events_.emplace(std::move(eventkey), event);
|
||||||
if (history_msg.empty()) {
|
if (history_msg.empty()) {
|
||||||
history_msgs_[event] = "HISTORY_MSG_" + std::to_string(event + 1);
|
history_msgs_[event] = M("HISTORY_MSG_" + std::to_string(event + 1));
|
||||||
} else {
|
} else {
|
||||||
history_msgs_[event] = history_msg;
|
history_msgs_[event] = M(history_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
return event;
|
return event;
|
||||||
|
} else {
|
||||||
|
return ret->second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <map>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include "../rtengine/refreshmap.h"
|
#include "../rtengine/refreshmap.h"
|
||||||
|
|
||||||
@ -34,4 +35,5 @@ private:
|
|||||||
ProcEventMapper();
|
ProcEventMapper();
|
||||||
|
|
||||||
std::unordered_map<int, std::string> history_msgs_;
|
std::unordered_map<int, std::string> history_msgs_;
|
||||||
|
std::map<std::string, rtengine::ProcEvent> events_;
|
||||||
};
|
};
|
||||||
|
@ -225,15 +225,14 @@ void History::procParamsChanged(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
selchangehist.block (true);
|
selchangehist.block(true);
|
||||||
selchangebm.block (true);
|
selchangebm.block(true);
|
||||||
|
|
||||||
if (ev == EvPhotoLoaded) {
|
if (ev == EvPhotoLoaded) {
|
||||||
initHistory ();
|
initHistory();
|
||||||
}
|
}
|
||||||
|
|
||||||
// construct formatted list content
|
// construct formatted list content
|
||||||
Glib::ustring text = M(ProcEventMapper::getInstance()->getHistoryMsg(ev));
|
|
||||||
|
|
||||||
Glib::RefPtr<Gtk::TreeSelection> selection = hTreeView->get_selection();
|
Glib::RefPtr<Gtk::TreeSelection> selection = hTreeView->get_selection();
|
||||||
Gtk::TreeModel::iterator iter = selection->get_selected();
|
Gtk::TreeModel::iterator iter = selection->get_selected();
|
||||||
@ -243,12 +242,12 @@ void History::procParamsChanged(
|
|||||||
++iter;
|
++iter;
|
||||||
|
|
||||||
while (iter) {
|
while (iter) {
|
||||||
iter = historyModel->erase (iter);
|
iter = historyModel->erase(iter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// lookup the last remaining item in the list
|
// lookup the last remaining item in the list
|
||||||
int size = historyModel->children().size ();
|
const int size = historyModel->children().size();
|
||||||
Gtk::TreeModel::Row row;
|
Gtk::TreeModel::Row row;
|
||||||
|
|
||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
@ -258,47 +257,43 @@ void History::procParamsChanged(
|
|||||||
// if there is no last item or its chev!=ev, create a new one
|
// if there is no last item or its chev!=ev, create a new one
|
||||||
if (size == 0 || !row || row[historyColumns.chev] != ev || ev == EvProfileChanged) {
|
if (size == 0 || !row || row[historyColumns.chev] != ev || ev == EvProfileChanged) {
|
||||||
Gtk::TreeModel::Row newrow = *(historyModel->append());
|
Gtk::TreeModel::Row newrow = *(historyModel->append());
|
||||||
newrow[historyColumns.text] = text;
|
newrow[historyColumns.text] = ProcEventMapper::getInstance()->getHistoryMsg(ev);
|
||||||
newrow[historyColumns.value] = g_markup_escape_text(descr.c_str(), -1);
|
newrow[historyColumns.value] = g_markup_escape_text(descr.c_str(), -1);
|
||||||
newrow[historyColumns.chev] = ev;
|
newrow[historyColumns.chev] = ev;
|
||||||
newrow[historyColumns.params] = *params;
|
newrow[historyColumns.params] = *params;
|
||||||
newrow[historyColumns.paramsEdited] = paramsEdited ? *paramsEdited : defParamsEdited;
|
newrow[historyColumns.paramsEdited] = paramsEdited ? *paramsEdited : defParamsEdited;
|
||||||
|
|
||||||
if (ev != EvBookmarkSelected) {
|
if (ev != EvBookmarkSelected) {
|
||||||
selection->select (newrow);
|
selection->select(newrow);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (blistener && row && !blistenerLock) {
|
if (blistener && row && !blistenerLock) {
|
||||||
blistener->historyBeforeLineChanged (row[historyColumns.params]);
|
blistener->historyBeforeLineChanged(row[historyColumns.params]);
|
||||||
} else if (blistener && size == 0 && !blistenerLock) {
|
} else if (blistener && size == 0 && !blistenerLock) {
|
||||||
blistener->historyBeforeLineChanged (newrow[historyColumns.params]);
|
blistener->historyBeforeLineChanged(newrow[historyColumns.params]);
|
||||||
}
|
}
|
||||||
}
|
} else { // else just update it
|
||||||
// else just update it
|
|
||||||
else {
|
|
||||||
row[historyColumns.text] = text;
|
|
||||||
row[historyColumns.value] = g_markup_escape_text(descr.c_str(), -1);
|
row[historyColumns.value] = g_markup_escape_text(descr.c_str(), -1);
|
||||||
row[historyColumns.chev] = ev;
|
|
||||||
row[historyColumns.params] = *params;
|
row[historyColumns.params] = *params;
|
||||||
row[historyColumns.paramsEdited] = paramsEdited ? *paramsEdited : defParamsEdited;
|
row[historyColumns.paramsEdited] = paramsEdited ? *paramsEdited : defParamsEdited;
|
||||||
|
|
||||||
if (ev != EvBookmarkSelected) {
|
if (ev != EvBookmarkSelected) {
|
||||||
selection->select (row);
|
selection->select(row);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ev != EvBookmarkSelected) {
|
if (ev != EvBookmarkSelected) {
|
||||||
bTreeView->get_selection()->unselect_all ();
|
bTreeView->get_selection()->unselect_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!selection->get_selected_rows().empty()) {
|
if (!selection->get_selected_rows().empty()) {
|
||||||
std::vector<Gtk::TreeModel::Path> selp = selection->get_selected_rows();
|
std::vector<Gtk::TreeModel::Path> selp = selection->get_selected_rows();
|
||||||
hTreeView->scroll_to_row (*selp.begin());
|
hTreeView->scroll_to_row(*selp.begin());
|
||||||
}
|
}
|
||||||
|
|
||||||
selchangehist.block (false);
|
selchangehist.block(false);
|
||||||
selchangebm.block (false);
|
selchangebm.block(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void History::clearParamChanges ()
|
void History::clearParamChanges ()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user