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(