Skip to content

Commit 3cdc8b8

Browse files
authored
Merge GH-1653
Major rework of Map's template API and of TemplateListWidget
2 parents 6318774 + 4438096 commit 3cdc8b8

32 files changed

+1491
-1043
lines changed

code-check-wrapper.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ for I in \
9494
template_list_widget.cpp \
9595
template_map.cpp \
9696
template_placeholder.cpp \
97+
template_table_model.cpp \
9798
template_tool \
9899
template_track.cpp \
99100
text_brwoser_dialog \

src/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ set(Mapper_Common_SRCS
166166
templates/template_placeholder.cpp
167167
templates/template_position_dock_widget.cpp
168168
templates/template_positioning_dialog.cpp
169+
templates/template_table_model.cpp
169170
templates/template_tool_move.cpp
170171
templates/template_tool_paint.cpp
171172
templates/template_track.cpp

src/core/map.cpp

Lines changed: 120 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <iterator>
2727
#include <memory>
2828
#include <type_traits>
29+
#include <utility>
2930

3031
#include <Qt>
3132
#include <QtGlobal>
@@ -37,6 +38,7 @@
3738
#include <QPainter>
3839
#include <QPoint>
3940
#include <QPointF>
41+
#include <QSignalBlocker>
4042
#include <QTimer>
4143
#include <QTranslator>
4244

@@ -446,13 +448,8 @@ void Map::clear()
446448
{
447449
undo_manager->clear();
448450

449-
for (auto temp : templates)
450-
delete temp;
451451
templates.clear();
452452
first_front_template = 0;
453-
454-
for (auto temp : closed_templates)
455-
delete temp;
456453
closed_templates.clear();
457454

458455
object_selection.clear();
@@ -1774,31 +1771,105 @@ void Map::updateSymbolIconZoom()
17741771

17751772

17761773

1777-
void Map::setTemplate(Template* temp, int pos)
1774+
void Map::setFirstFrontTemplate(int pos)
17781775
{
1779-
templates[pos] = temp;
1780-
emit templateChanged(pos, templates[pos]);
1776+
if (getFirstFrontTemplate() == pos)
1777+
return;
1778+
1779+
auto first = begin(templates) + std::min(getNumTemplates(), pos);
1780+
auto last = begin(templates) + std::min(getNumTemplates(), getFirstFrontTemplate());
1781+
if (getFirstFrontTemplate() < pos)
1782+
{
1783+
using std::swap;
1784+
swap(first, last);
1785+
}
1786+
auto const old_pos = first_front_template;
1787+
std::for_each(first, last, [](auto& templ) { templ->setTemplateAreaDirty(); });
1788+
emit firstFrontTemplateAboutToBeChanged(old_pos, pos);
1789+
first_front_template = pos;
1790+
emit firstFrontTemplateChanged(old_pos, pos);
1791+
std::for_each(first, last, [](auto& templ) { templ->setTemplateAreaDirty(); });
1792+
setTemplatesDirty();
17811793
}
17821794

1783-
void Map::addTemplate(Template* temp, int pos)
1795+
std::unique_ptr<Template> Map::setTemplate(int pos, std::unique_ptr<Template> temp)
17841796
{
1785-
templates.insert(templates.begin() + pos, temp);
1786-
emit templateAdded(pos, temp);
1797+
using std::swap;
1798+
auto const it = begin(templates) + pos;
1799+
(*it)->setTemplateAreaDirty();
1800+
swap(temp, *it);
1801+
emit templateChanged(pos, it->get());
1802+
(*it)->setTemplateAreaDirty();
1803+
setTemplatesDirty();
1804+
return temp;
17871805
}
17881806

1789-
void Map::removeTemplate(int pos)
1807+
void Map::addTemplate(int pos, std::unique_ptr<Template> temp)
17901808
{
1791-
auto it = templates.begin() + pos;
1792-
Template* temp = *it;
1809+
auto front = getFirstFrontTemplate();
1810+
auto in_background = pos < front;
1811+
if (in_background)
1812+
{
1813+
if (pos < 0)
1814+
pos = front;
1815+
++front;
1816+
}
1817+
auto it = begin(templates) + pos;
1818+
emit templateAboutToBeAdded(pos, temp.get(), in_background);
1819+
it = templates.insert(it, std::move(temp));
1820+
{
1821+
QSignalBlocker block(this);
1822+
setFirstFrontTemplate(front);
1823+
}
1824+
emit templateAdded(pos, it->get());
1825+
setTemplatesDirty();
1826+
}
1827+
1828+
void Map::moveTemplate(int old_pos, int new_pos)
1829+
{
1830+
if (old_pos == new_pos)
1831+
return;
1832+
1833+
auto* temp = getTemplate(old_pos);
1834+
temp->setTemplateAreaDirty();
1835+
emit templateAboutToBeMoved(old_pos, new_pos, temp);
1836+
1837+
auto old_it = begin(templates) + old_pos;
1838+
auto new_it = begin(templates) + new_pos;
1839+
if (old_pos < new_pos)
1840+
std::rotate(old_it, old_it + 1, new_it + 1);
1841+
else
1842+
std::rotate(new_it, old_it, old_it + 1);
1843+
1844+
emit templateMoved(old_pos, new_pos, temp);
1845+
temp->setTemplateAreaDirty();
1846+
setTemplatesDirty();
1847+
}
1848+
1849+
std::unique_ptr<Template> Map::removeTemplate(int pos)
1850+
{
1851+
auto front = getFirstFrontTemplate();
1852+
if (pos < front || getNumTemplates() < front)
1853+
{
1854+
--front;
1855+
}
1856+
auto const it = begin(templates) + pos;
1857+
(*it)->setTemplateAreaDirty();
1858+
emit templateAboutToBeDeleted(pos, it->get());
1859+
auto temp = std::move(*it);
17931860
templates.erase(it);
1794-
emit templateDeleted(pos, temp);
1861+
{
1862+
QSignalBlocker block(this);
1863+
setFirstFrontTemplate(front);
1864+
}
1865+
emit templateDeleted(pos, temp.get());
1866+
setTemplatesDirty();
1867+
return temp;
17951868
}
17961869

17971870
void Map::deleteTemplate(int pos)
17981871
{
1799-
Template* temp = getTemplate(pos);
1800-
removeTemplate(pos);
1801-
delete temp;
1872+
void(removeTemplate(pos));
18021873
}
18031874

18041875
void Map::setTemplateAreaDirty(Template* temp, const QRectF& area, int pixel_border)
@@ -1813,24 +1884,20 @@ void Map::setTemplateAreaDirty(Template* temp, const QRectF& area, int pixel_bor
18131884
}
18141885
}
18151886

1816-
void Map::setTemplateAreaDirty(int i)
1887+
void Map::setTemplateAreaDirty(int pos)
18171888
{
1818-
if (i == -1)
1889+
if (pos == -1)
18191890
return; // no assert here as convenience, so setTemplateAreaDirty(-1) can be called without effect for the map part
1820-
Q_ASSERT(i >= 0 && i < (int)templates.size());
1821-
1822-
templates[i]->setTemplateAreaDirty();
1891+
Q_ASSERT(pos < getNumTemplates());
1892+
getTemplate(pos)->setTemplateAreaDirty();
18231893
}
18241894

18251895
int Map::findTemplateIndex(const Template* temp) const
18261896
{
1827-
int size = (int)templates.size();
1828-
for (int i = 0; i < size; ++i)
1829-
{
1830-
if (templates[i] == temp)
1831-
return i;
1832-
}
1833-
return -1;
1897+
auto const first = begin(templates);
1898+
auto const last = end(templates);
1899+
auto const it = std::find_if(first, last, [temp](auto const& t) { return t.get() == temp; });
1900+
return it == last ? -1 : int(std::distance(first, it));
18341901
}
18351902

18361903
void Map::setTemplatesDirty()
@@ -1841,6 +1908,7 @@ void Map::setTemplatesDirty()
18411908

18421909
void Map::emitTemplateChanged(Template* temp)
18431910
{
1911+
setTemplatesDirty();
18441912
auto const pos = findTemplateIndex(temp);
18451913
if (pos >= 0)
18461914
emit templateChanged(pos, temp);
@@ -1851,56 +1919,52 @@ void Map::clearClosedTemplates()
18511919
if (closed_templates.empty())
18521920
return;
18531921

1854-
for (Template* temp : closed_templates)
1855-
delete temp;
1856-
18571922
closed_templates.clear();
18581923
setTemplatesDirty();
18591924
emit closedTemplateAvailabilityChanged();
18601925
}
18611926

1862-
void Map::closeTemplate(int i)
1927+
void Map::closeTemplate(int pos)
18631928
{
1864-
Template* temp = getTemplate(i);
1865-
removeTemplate(i);
1929+
auto temp = removeTemplate(pos);
18661930

18671931
if (temp->getTemplateState() == Template::Loaded)
18681932
temp->unloadTemplateFile();
18691933

1870-
closed_templates.push_back(temp);
1934+
closed_templates.push_back(std::move(temp));
18711935
setTemplatesDirty();
18721936
if (closed_templates.size() == 1)
18731937
emit closedTemplateAvailabilityChanged();
18741938
}
18751939

18761940
bool Map::reloadClosedTemplate(int i, int target_pos, QWidget* dialog_parent, const QString& map_path)
18771941
{
1878-
Template* temp = closed_templates[i];
1942+
auto const it_closed = begin(closed_templates) + i;
1943+
auto temp = std::move(*it_closed);
1944+
closed_templates.erase(it_closed);
18791945

18801946
// Try to find and load the template again
1881-
if (temp->getTemplateState() != Template::Loaded)
1947+
if (temp->getTemplateState() != Template::Loaded
1948+
&& !temp->tryToFindAndReloadTemplateFile(map_path))
18821949
{
1883-
if (!temp->tryToFindAndReloadTemplateFile(map_path))
1884-
{
1885-
if (!temp->execSwitchTemplateFileDialog(dialog_parent))
1886-
return false;
1887-
}
1950+
temp->execSwitchTemplateFileDialog(dialog_parent);
18881951
}
18891952

1890-
// If successfully loaded, add to template list again
1891-
if (temp->getTemplateState() == Template::Loaded)
1953+
// If not loaded successfully, re-add to list of closed templates
1954+
if (temp->getTemplateState() != Template::Loaded)
18921955
{
1893-
closed_templates.erase(closed_templates.begin() + i);
1894-
addTemplate(temp, target_pos);
1895-
temp->setTemplateAreaDirty();
1896-
setTemplatesDirty();
1897-
if (closed_templates.empty())
1898-
emit closedTemplateAvailabilityChanged();
1899-
return true;
1956+
closed_templates.push_back(std::move(temp));
1957+
return false;
19001958
}
1901-
return false;
1959+
1960+
addTemplate(target_pos, std::move(temp));
1961+
if (closed_templates.empty())
1962+
emit closedTemplateAvailabilityChanged();
1963+
return true;
19021964
}
19031965

1966+
1967+
19041968
void Map::push(UndoStep *step)
19051969
{
19061970
undo_manager->push(std::unique_ptr<UndoStep>(step));
@@ -2090,9 +2154,9 @@ QRectF Map::calculateExtent(bool include_helper_symbols, bool include_templates,
20902154
// Templates
20912155
if (include_templates)
20922156
{
2093-
for (const Template* temp : templates)
2157+
for (const auto& temp : templates)
20942158
{
2095-
if (view && !view->isTemplateVisible(temp))
2159+
if (view && !view->isTemplateVisible(temp.get()))
20962160
continue;
20972161
if (temp->getTemplateState() != Template::Loaded)
20982162
continue;

0 commit comments

Comments
 (0)