| 1894 | } |
| 1895 | |
| 1896 | void MapEditorController::copy() |
| 1897 | { |
| 1898 | if (map->getNumSelectedObjects() == 0) |
| 1899 | return; |
| 1900 | |
| 1901 | // Create map containing required objects and their symbol and color dependencies |
| 1902 | Map copy_map; |
| 1903 | copy_map.setScaleDenominator(map->getScaleDenominator()); |
| 1904 | |
| 1905 | std::vector<bool> symbol_filter; |
| 1906 | symbol_filter.assign(map->getNumSymbols(), false); |
| 1907 | for (const auto* object : map->selectedObjects()) |
| 1908 | { |
| 1909 | int symbol_index = map->findSymbolIndex(object->getSymbol()); |
| 1910 | if (symbol_index >= 0) |
| 1911 | symbol_filter[symbol_index] = true; |
| 1912 | } |
| 1913 | |
| 1914 | // Copy all colors. This improves preservation of relative order during paste. |
| 1915 | copy_map.importMap(*map, Map::ColorImport); |
| 1916 | |
| 1917 | // Export symbols and colors into copy_map |
| 1918 | auto symbol_map = copy_map.importMap(*map, Map::MinimalSymbolImport, &symbol_filter, -1, true); |
| 1919 | |
| 1920 | // Duplicate all selected objects into copy map |
| 1921 | for (const auto* object : map->selectedObjects()) |
| 1922 | { |
| 1923 | auto* new_object = object->duplicate(); |
| 1924 | if (symbol_map.contains(new_object->getSymbol())) |
| 1925 | new_object->setSymbol(symbol_map.value(new_object->getSymbol()), true); |
| 1926 | |
| 1927 | copy_map.addObject(new_object); |
| 1928 | } |
| 1929 | |
| 1930 | // Save map to memory |
| 1931 | QBuffer buffer; |
| 1932 | if (!copy_map.exportToIODevice(buffer)) |
| 1933 | { |
| 1934 | QMessageBox::warning(nullptr, tr("Error"), tr("An internal error occurred, sorry!")); |
| 1935 | return; |
| 1936 | } |
| 1937 | |
| 1938 | // Put buffer into clipboard |
| 1939 | auto* mime_data = new QMimeData(); |
| 1940 | mime_data->setData(MimeType::OpenOrienteeringObjects(), buffer.data()); |
| 1941 | QApplication::clipboard()->setMimeData(mime_data); |
| 1942 | |
| 1943 | // Show message |
| 1944 | window->showStatusBarMessage(tr("Copied %n object(s)", nullptr, map->getNumSelectedObjects()), 2000); |
| 1945 | } |
| 1946 | |
| 1947 | |
| 1948 | void MapEditorController::paste() |
nothing calls this directly
no test coverage detected