2626#include < iterator>
2727#include < memory>
2828#include < type_traits>
29+ #include < utility>
2930
3031#include < Qt>
3132#include < QtGlobal>
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
17971870void Map::deleteTemplate (int pos)
17981871{
1799- Template* temp = getTemplate (pos);
1800- removeTemplate (pos);
1801- delete temp;
1872+ void (removeTemplate (pos));
18021873}
18031874
18041875void 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
18251895int 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
18361903void Map::setTemplatesDirty ()
@@ -1841,6 +1908,7 @@ void Map::setTemplatesDirty()
18411908
18421909void 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
18761940bool 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+
19041968void 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