| 
									
										
										
										
											2013-08-09 08:01:20 +08:00
										 |  |  | /* Aseprite
 | 
					
						
							| 
									
										
										
										
											2013-01-27 23:13:13 +08:00
										 |  |  |  * Copyright (C) 2001-2013  David Capello | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation; either version 2 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  * along with this program; if not, write to the Free Software | 
					
						
							|  |  |  |  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 08:20:19 +08:00
										 |  |  | #ifdef HAVE_CONFIG_H
 | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  | #include "config.h"
 | 
					
						
							| 
									
										
										
										
											2013-08-06 08:20:19 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 08:20:19 +08:00
										 |  |  | #include "app/app.h"
 | 
					
						
							|  |  |  | #include "app/commands/command.h"
 | 
					
						
							|  |  |  | #include "app/context_access.h"
 | 
					
						
							|  |  |  | #include "app/document_api.h"
 | 
					
						
							|  |  |  | #include "app/modules/gui.h"
 | 
					
						
							| 
									
										
										
										
											2013-12-16 07:21:31 +08:00
										 |  |  | #include "app/ui/main_window.h"
 | 
					
						
							| 
									
										
										
										
											2013-08-06 08:20:19 +08:00
										 |  |  | #include "app/ui/status_bar.h"
 | 
					
						
							| 
									
										
										
										
											2013-12-16 07:21:31 +08:00
										 |  |  | #include "app/ui/timeline.h"
 | 
					
						
							| 
									
										
										
										
											2013-08-06 08:20:19 +08:00
										 |  |  | #include "app/undo_transaction.h"
 | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  | #include "raster/layer.h"
 | 
					
						
							|  |  |  | #include "raster/sprite.h"
 | 
					
						
							| 
									
										
										
										
											2014-08-11 17:54:14 +08:00
										 |  |  | #include "ui/alert.h"
 | 
					
						
							| 
									
										
										
										
											2012-06-18 09:49:58 +08:00
										 |  |  | #include "ui/widget.h"
 | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 08:20:19 +08:00
										 |  |  | namespace app { | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  | class RemoveLayerCommand : public Command { | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  | public: | 
					
						
							|  |  |  |   RemoveLayerCommand(); | 
					
						
							| 
									
										
										
										
											2014-08-15 10:07:47 +08:00
										 |  |  |   Command* clone() const override { return new RemoveLayerCommand(*this); } | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  |   bool onEnabled(Context* context); | 
					
						
							|  |  |  |   void onExecute(Context* context); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RemoveLayerCommand::RemoveLayerCommand() | 
					
						
							|  |  |  |   : Command("RemoveLayer", | 
					
						
							|  |  |  |             "Remove Layer", | 
					
						
							|  |  |  |             CmdRecordableFlag) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool RemoveLayerCommand::onEnabled(Context* context) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-04-29 12:01:25 +08:00
										 |  |  |   return context->checkFlags(ContextFlags::ActiveDocumentIsWritable | | 
					
						
							|  |  |  |                              ContextFlags::HasActiveSprite | | 
					
						
							|  |  |  |                              ContextFlags::HasActiveLayer | | 
					
						
							|  |  |  |                              ContextFlags::ActiveLayerIsReadable | | 
					
						
							|  |  |  |                              ContextFlags::ActiveLayerIsWritable); | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void RemoveLayerCommand::onExecute(Context* context) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   std::string layer_name; | 
					
						
							| 
									
										
										
										
											2013-03-12 07:29:45 +08:00
										 |  |  |   ContextWriter writer(context); | 
					
						
							|  |  |  |   Document* document(writer.document()); | 
					
						
							| 
									
										
										
										
											2014-08-11 17:54:14 +08:00
										 |  |  |   Sprite* sprite(writer.sprite()); | 
					
						
							| 
									
										
										
										
											2013-03-12 07:29:45 +08:00
										 |  |  |   Layer* layer(writer.layer()); | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  |   { | 
					
						
							| 
									
										
										
										
											2013-03-12 07:29:45 +08:00
										 |  |  |     UndoTransaction undoTransaction(writer.context(), "Remove Layer"); | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-16 07:21:31 +08:00
										 |  |  |     // TODO the range of selected layer should be in the DocumentLocation.
 | 
					
						
							|  |  |  |     Timeline::Range range = App::instance()->getMainWindow()->getTimeline()->range(); | 
					
						
							|  |  |  |     if (range.enabled()) { | 
					
						
							| 
									
										
										
										
											2014-08-11 17:54:14 +08:00
										 |  |  |       if (range.layers() == sprite->countLayers()) { | 
					
						
							|  |  |  |         ui::Alert::show("Error<<You cannot delete all layers.||&OK"); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2013-12-16 07:21:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-25 10:50:45 +08:00
										 |  |  |       for (LayerIndex layer = range.layerEnd(); layer >= range.layerBegin(); --layer) { | 
					
						
							| 
									
										
										
										
											2013-12-16 07:21:31 +08:00
										 |  |  |         document->getApi().removeLayer(sprite->indexToLayer(layer)); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							| 
									
										
										
										
											2014-08-11 17:54:14 +08:00
										 |  |  |       if (sprite->countLayers() == 1) { | 
					
						
							|  |  |  |         ui::Alert::show("Error<<You cannot delete the last layer.||&OK"); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-30 12:28:15 +08:00
										 |  |  |       layer_name = layer->name(); | 
					
						
							| 
									
										
										
										
											2013-12-16 07:21:31 +08:00
										 |  |  |       document->getApi().removeLayer(layer); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     undoTransaction.commit(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   update_screen_for_document(document); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-10 00:20:58 +08:00
										 |  |  |   StatusBar::instance()->invalidate(); | 
					
						
							| 
									
										
										
										
											2013-12-16 07:21:31 +08:00
										 |  |  |   if (!layer_name.empty()) | 
					
						
							|  |  |  |     StatusBar::instance()->showTip(1000, "Layer `%s' removed", layer_name.c_str()); | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     StatusBar::instance()->showTip(1000, "Layers removed"); | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Command* CommandFactory::createRemoveLayerCommand() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return new RemoveLayerCommand; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-08-06 08:20:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | } // namespace app
 |