@@ -62,46 +62,70 @@ class DeleteLevelUndo final : public TUndo {
62
62
63
63
} // namespace
64
64
65
- // =============================================================================
66
- // RemoveUnusedLevelCommand
67
65
// -----------------------------------------------------------------------------
68
66
69
- class RemoveUnusedLevelsCommand final : public MenuItemHandler {
70
- public:
71
- RemoveUnusedLevelsCommand () : MenuItemHandler(MI_RemoveUnused) {}
67
+ bool LevelCmd::removeUnusedLevelsFromCast ( bool showMessage) {
68
+ TApp *app = TApp::instance ();
69
+ ToonzScene *scene = app-> getCurrentScene ()-> getScene ();
72
70
73
- void execute () override {
74
- TApp *app = TApp::instance ();
75
- ToonzScene *scene = app->getCurrentScene ()->getScene ();
71
+ TLevelSet *levelSet = scene->getLevelSet ();
76
72
77
- TLevelSet *levelSet = scene->getLevelSet ();
73
+ std::set<TXshLevel *> usedLevels;
74
+ scene->getTopXsheet ()->getUsedLevels (usedLevels);
78
75
79
- std::set<TXshLevel *> usedLevels;
80
- scene->getTopXsheet ()->getUsedLevels (usedLevels);
76
+ std::vector<TXshLevel *> unused;
81
77
82
- std::vector<TXshLevel *> unused;
83
-
84
- for (int i = 0 ; i < levelSet->getLevelCount (); i++) {
85
- TXshLevel *xl = levelSet->getLevel (i);
86
- if (usedLevels.count (xl) == 0 ) unused.push_back (xl);
78
+ for (int i = 0 ; i < levelSet->getLevelCount (); i++) {
79
+ TXshLevel *xl = levelSet->getLevel (i);
80
+ if (usedLevels.count (xl) == 0 ) unused.push_back (xl);
81
+ }
82
+ if (unused.empty ()) {
83
+ if (showMessage) DVGui::error (QObject::tr (" No unused levels" ));
84
+ return false ;
85
+ } else {
86
+ TUndoManager *um = TUndoManager::manager ();
87
+ um->beginBlock ();
88
+ for (int i = 0 ; i < (int )unused.size (); i++) {
89
+ TXshLevel *xl = unused[i];
90
+ um->add (new DeleteLevelUndo (xl));
91
+ scene->getLevelSet ()->removeLevel (xl);
87
92
}
88
- if (unused.empty ()) {
89
- DVGui::error (QObject::tr (" No unused levels" ));
90
- return ;
91
- } else {
92
- TUndoManager *um = TUndoManager::manager ();
93
- um->beginBlock ();
94
- for (int i = 0 ; i < (int )unused.size (); i++) {
95
- TXshLevel *xl = unused[i];
96
- um->add (new DeleteLevelUndo (xl));
97
- scene->getLevelSet ()->removeLevel (xl);
98
- }
99
- TApp::instance ()->getCurrentXsheet ()->notifyXsheetChanged ();
100
- TApp::instance ()->getCurrentScene ()->notifyCastChange ();
93
+ TApp::instance ()->getCurrentXsheet ()->notifyXsheetChanged ();
94
+ TApp::instance ()->getCurrentScene ()->notifyCastChange ();
95
+
96
+ um->endBlock ();
97
+ }
98
+ return true ;
99
+ }
101
100
102
- um->endBlock ();
101
+ bool LevelCmd::removeLevelFromCast (TXshLevel *level, ToonzScene *scene,
102
+ bool showMessage) {
103
+ if (!scene) scene = TApp::instance ()->getCurrentScene ()->getScene ();
104
+ if (scene->getChildStack ()->getTopXsheet ()->isLevelUsed (level)) {
105
+ if (showMessage) {
106
+ DVGui::error (
107
+ QObject::tr (" It is not possible to delete the used level %1." )
108
+ .arg (QString::fromStdWString (
109
+ level->getName ()))); // "E_CantDeleteUsedLevel_%1"
103
110
}
111
+ return false ;
112
+ } else {
113
+ TUndoManager *um = TUndoManager::manager ();
114
+ um->add (new DeleteLevelUndo (level));
115
+ scene->getLevelSet ()->removeLevel (level);
104
116
}
117
+ return true ;
118
+ }
119
+
120
+ // =============================================================================
121
+ // RemoveUnusedLevelCommand
122
+ // -----------------------------------------------------------------------------
123
+
124
+ class RemoveUnusedLevelsCommand final : public MenuItemHandler {
125
+ public:
126
+ RemoveUnusedLevelsCommand () : MenuItemHandler(MI_RemoveUnused) {}
127
+
128
+ void execute () override { LevelCmd::removeUnusedLevelsFromCast (); }
105
129
} removeUnusedLevelsCommand;
106
130
107
131
// =============================================================================
@@ -112,22 +136,6 @@ class RemoveLevelCommand final : public MenuItemHandler {
112
136
public:
113
137
RemoveLevelCommand () : MenuItemHandler(MI_RemoveLevel) {}
114
138
115
- bool removeLevel (TXshLevel *level) {
116
- TApp *app = TApp::instance ();
117
- ToonzScene *scene = app->getCurrentScene ()->getScene ();
118
- if (scene->getChildStack ()->getTopXsheet ()->isLevelUsed (level))
119
- DVGui::error (
120
- QObject::tr (" It is not possible to delete the used level %1." )
121
- .arg (QString::fromStdWString (
122
- level->getName ()))); // "E_CantDeleteUsedLevel_%1"
123
- else {
124
- TUndoManager *um = TUndoManager::manager ();
125
- um->add (new DeleteLevelUndo (level));
126
- scene->getLevelSet ()->removeLevel (level);
127
- }
128
- return true ;
129
- }
130
-
131
139
void execute () override {
132
140
TXsheet *xsheet = TApp::instance ()->getCurrentXsheet ()->getXsheet ();
133
141
CastSelection *castSelection =
@@ -142,7 +150,7 @@ class RemoveLevelCommand final : public MenuItemHandler {
142
150
}
143
151
int count = 0 ;
144
152
for (int i = 0 ; i < (int )levels.size (); i++)
145
- if (removeLevel (levels[i])) count++;
153
+ if (LevelCmd::removeLevelFromCast (levels[i])) count++;
146
154
if (count == 0 ) return ;
147
155
TApp::instance ()->getCurrentXsheet ()->notifyXsheetChanged ();
148
156
TApp::instance ()->getCurrentScene ()->notifyCastChange ();
@@ -522,7 +530,24 @@ void LevelCmd::addMissingLevelsToCast(std::set<TXshLevel *> &levels) {
522
530
std::wstring oldName = levelName;
523
531
NameModifier nm (levelName);
524
532
levelName = nm.getNext ();
525
- while (levelSet->hasLevel (levelName)) levelName = nm.getNext ();
533
+ while (1 ) {
534
+ TXshLevel *existingLevel = levelSet->getLevel (levelName);
535
+ // if the level name is not used in the cast, nothing to do
536
+ if (!existingLevel) break ;
537
+ // try if the existing level is unused in the xsheet and remove from the
538
+ // cast
539
+ else if (Preferences::instance ()->isAutoRemoveUnusedLevelsEnabled () &&
540
+ LevelCmd::removeLevelFromCast (
541
+ existingLevel,
542
+ TApp::instance ()->getCurrentScene ()->getScene (), false )) {
543
+ DVGui::info (
544
+ QObject::tr (" Removed unused level %1 from the scene cast. (This "
545
+ " behavior can be disabled in Preferences.)" )
546
+ .arg (QString::fromStdWString (levelName)));
547
+ break ;
548
+ }
549
+ levelName = nm.getNext ();
550
+ }
526
551
addLevelToCastUndo *undo =
527
552
new addLevelToCastUndo (level, levelName, oldName);
528
553
undo->m_isLastInRedoBlock = false ; // prevent to emit signal
0 commit comments