diff --git a/stuff/profiles/layouts/rooms/Default/menubar_template.xml b/stuff/profiles/layouts/rooms/Default/menubar_template.xml index b8f53ac..8b8ff9f 100644 --- a/stuff/profiles/layouts/rooms/Default/menubar_template.xml +++ b/stuff/profiles/layouts/rooms/Default/menubar_template.xml @@ -158,6 +158,7 @@ MI_MergeCmapped MI_MergeColumns + MI_MergeColumnsWOGroups MI_DeleteMatchLines MI_DeleteInk diff --git a/toonz/sources/toonz/columnselection.cpp b/toonz/sources/toonz/columnselection.cpp index c58e3ae..06d39a8 100644 --- a/toonz/sources/toonz/columnselection.cpp +++ b/toonz/sources/toonz/columnselection.cpp @@ -201,6 +201,7 @@ void TColumnSelection::selectColumn(int col, bool on) { m_indices.erase(col); CommandManager::instance()->enable(MI_MergeColumns, false); + CommandManager::instance()->enable(MI_MergeColumnsWOGroups, false); CommandManager::instance()->enable(MI_ApplyMatchLines, false); CommandManager::instance()->enable(MI_MergeCmapped, false); @@ -216,6 +217,7 @@ void TColumnSelection::selectColumn(int col, bool on) { if (it == m_indices.end()) { CommandManager::instance()->enable(MI_MergeColumns, true); + CommandManager::instance()->enable(MI_MergeColumnsWOGroups, true); return; } diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index 2ac4133..89239c9 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -1785,6 +1785,9 @@ void MainWindow::defineActions() { QAction *mergeLevelsAction = createMenuXsheetAction(MI_MergeColumns, tr("&Merge Levels"), ""); mergeLevelsAction->setIcon(QIcon(":Resources/merge.svg")); + QAction *mergeLevelsWOGroupsAction = + createMenuXsheetAction(MI_MergeColumnsWOGroups, tr("&Merge Levels Without Groups"), ""); + mergeLevelsWOGroupsAction->setIcon(QIcon(":Resources/merge.svg")); createMenuXsheetAction(MI_InsertFx, tr("&New FX..."), "Ctrl+F"); QAction *newOutputAction = createMenuXsheetAction(MI_NewOutputFx, tr("&New Output"), "Alt+O"); diff --git a/toonz/sources/toonz/matchline.h b/toonz/sources/toonz/matchline.h index 8161c62..2d68add 100644 --- a/toonz/sources/toonz/matchline.h +++ b/toonz/sources/toonz/matchline.h @@ -97,8 +97,8 @@ public: void deleteMatchlines(TXshSimpleLevel *sl, const std::set &fids); void deleteInk(TXshSimpleLevel *sl, const std::set &fids); -void mergeColumns(int dstColumn, int srcColumn, bool isRedo); -void mergeColumns(const std::set &columns); +void mergeColumns(int dstColumn, int srcColumn, bool isRedo, bool groupLevels); +void mergeColumns(const std::set &columns, bool groupLevels); void doMatchlines(int column, int mColumn, int index, int inkPrevalence, int MatchlineSessionId = 0); void mergeCmapped(int dstColumn, int srcColumn, const QString &fullpath, diff --git a/toonz/sources/toonz/matchlinecommand.cpp b/toonz/sources/toonz/matchlinecommand.cpp index 59ed43a..b5fdfcc 100644 --- a/toonz/sources/toonz/matchlinecommand.cpp +++ b/toonz/sources/toonz/matchlinecommand.cpp @@ -124,13 +124,48 @@ public: return; } - mergeColumns(indices); + mergeColumns(indices, true); TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); } } MergeColumnsCommand; //***************************************************************************** +// MergeColumns /wo Groups command +//***************************************************************************** + +class MergeColumnsCommandWOGroups final : public MenuItemHandler { +public: + MergeColumnsCommandWOGroups() : MenuItemHandler(MI_MergeColumnsWOGroups) {} + + void execute() override { + TColumnSelection *selection = + dynamic_cast(TSelection::getCurrent()); + + std::set indices = + selection ? selection->getIndices() : std::set(); + + if (indices.empty()) { + DVGui::warning(QObject::tr( + "It is not possible to execute the merge column command because " + "no column was selected.")); + return; + } + + if (indices.size() == 1) { + DVGui::warning(QObject::tr( + "It is not possible to execute the merge column command because " + "only one columns is selected.")); + return; + } + + mergeColumns(indices, false); + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); + } + +} MergeColumnsWOGroupsCommand; + +//***************************************************************************** // ApplyMatchlines command //***************************************************************************** diff --git a/toonz/sources/toonz/menubar.cpp b/toonz/sources/toonz/menubar.cpp index 7be2a2f..6f8b03e 100644 --- a/toonz/sources/toonz/menubar.cpp +++ b/toonz/sources/toonz/menubar.cpp @@ -668,6 +668,7 @@ QMenuBar *StackedMenuBar::createInknPaintMenuBar() { addMenuItem(filesMenu, MI_DeleteInk); addMenuItem(filesMenu, MI_MergeCmapped); addMenuItem(filesMenu, MI_MergeColumns); + addMenuItem(filesMenu, MI_MergeColumnsWOGroups); filesMenu->addSeparator(); addMenuItem(filesMenu, MI_LoadScene); addMenuItem(filesMenu, MI_SaveScene); @@ -1255,6 +1256,7 @@ QMenuBar *StackedMenuBar::createFullMenuBar() { addMenuItem(xsheetMenu, MI_MergeCmapped); xsheetMenu->addSeparator(); addMenuItem(xsheetMenu, MI_MergeColumns); + addMenuItem(xsheetMenu, MI_MergeColumnsWOGroups); addMenuItem(xsheetMenu, MI_DeleteMatchLines); addMenuItem(xsheetMenu, MI_DeleteInk); xsheetMenu->addSeparator(); diff --git a/toonz/sources/toonz/menubarcommandids.h b/toonz/sources/toonz/menubarcommandids.h index f8dd74e..3778d10 100644 --- a/toonz/sources/toonz/menubarcommandids.h +++ b/toonz/sources/toonz/menubarcommandids.h @@ -131,6 +131,7 @@ #define MI_ApplyMatchLines "MI_ApplyMatchLines" #define MI_MergeCmapped "MI_MergeCmapped" #define MI_MergeColumns "MI_MergeColumns" +#define MI_MergeColumnsWOGroups "MI_MergeColumnsWOGroups" #define MI_DeleteMatchLines "MI_DeleteMatchLines" #define MI_DeleteInk "MI_DeleteInk" #define MI_InsertSceneFrame "MI_InsertSceneFrame" diff --git a/toonz/sources/toonz/mergecolumns.cpp b/toonz/sources/toonz/mergecolumns.cpp index 6dcd82d..e280ce6 100644 --- a/toonz/sources/toonz/mergecolumns.cpp +++ b/toonz/sources/toonz/mergecolumns.cpp @@ -144,7 +144,7 @@ bool needTobeGrouped(const TVectorImageP &vimg) { //--------------------------------------------------------------------------------------- -void mergeVectorColumns(const std::vector &matchingLevels) { +void mergeVectorColumns(const std::vector &matchingLevels, bool groupLevels) { if (matchingLevels.empty()) return; int i = 0; @@ -157,9 +157,9 @@ void mergeVectorColumns(const std::vector &matchingLevels) { throw TRopException("Cannot merge columns of different image types!"); // img->lock(); - if (needTobeGrouped(vimg)) vimg->group(0, vimg->getStrokeCount()); + if (needTobeGrouped(vimg) && groupLevels) vimg->group(0, vimg->getStrokeCount()); bool ungroup = false; - if (needTobeGrouped(vmatch)) { + if (needTobeGrouped(vmatch) && groupLevels) { ungroup = true; vmatch->group(0, vmatch->getStrokeCount()); } @@ -184,12 +184,13 @@ class MergeColumnsUndo final : public TUndo { int m_column, m_mColumn; TPalette *m_palette; + bool m_groupLevels; public: MergeColumnsUndo(TXshLevelP xl, int matchlineSessionId, int column, TXshSimpleLevel *level, const std::map &images, int mColumn, - TPalette *palette) + TPalette *palette, bool groupLevels) : TUndo() , m_xl(xl) , m_matchlineSessionId(matchlineSessionId) @@ -197,7 +198,8 @@ public: , m_column(column) , m_mColumn(mColumn) , m_images(images) - , m_palette(palette->clone()) {} + , m_palette(palette->clone()) + , m_groupLevels(groupLevels) {} void undo() const override { QApplication::setOverrideCursor(Qt::WaitCursor); @@ -225,7 +227,7 @@ public: void redo() const override { QApplication::setOverrideCursor(Qt::WaitCursor); - mergeColumns(m_column, m_mColumn, true); + mergeColumns(m_column, m_mColumn, true, m_groupLevels); QApplication::restoreOverrideCursor(); } @@ -250,7 +252,7 @@ public: //----------------------------------------------------------------------------- -void mergeColumns(const std::set &columns) { +void mergeColumns(const std::set &columns, bool groupLevels) { QApplication::setOverrideCursor(Qt::WaitCursor); std::set::const_iterator it = columns.begin(); @@ -260,7 +262,7 @@ void mergeColumns(const std::set &columns) { TUndoManager::manager()->beginBlock(); - for (; it != columns.end(); ++it) mergeColumns(dstColumn, *it, false); + for (; it != columns.end(); ++it) mergeColumns(dstColumn, *it, false, groupLevels); TUndoManager::manager()->endBlock(); @@ -271,7 +273,7 @@ void mergeColumns(const std::set &columns) { static int MergeColumnsSessionId = 0; -void mergeColumns(int column, int mColumn, bool isRedo) { +void mergeColumns(int column, int mColumn, bool isRedo, bool groupLevels) { if (!isRedo) MergeColumnsSessionId++; TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); int start, end; @@ -386,7 +388,7 @@ void mergeColumns(int column, int mColumn, bool isRedo) { if (!isRedo) TUndoManager::manager()->add( new MergeColumnsUndo(xl, MergeColumnsSessionId, column, level, images, - mColumn, level->getPalette())); + mColumn, level->getPalette(), groupLevels)); if (areRasters) { mergeRasterColumns(matchingLevels); @@ -399,7 +401,7 @@ void mergeColumns(int column, int mColumn, bool isRedo) { ToolUtils::updateSaveBox(cell[i].getSimpleLevel(), cell[i].m_frameId); } } else - mergeVectorColumns(matchingLevels); + mergeVectorColumns(matchingLevels, groupLevels); TXshLevel *sl = TApp::instance()->getCurrentScene()->getScene()->getLevelSet()->getLevel(