| 
									
										
										
										
											2015-02-12 23:16:25 +08:00
										 |  |  | // Aseprite
 | 
					
						
							| 
									
										
										
										
											2016-04-23 00:19:06 +08:00
										 |  |  | // Copyright (C) 2001-2016  David Capello
 | 
					
						
							| 
									
										
										
										
											2015-02-12 23:16:25 +08:00
										 |  |  | //
 | 
					
						
							|  |  |  | // This program is free software; you can redistribute it and/or modify
 | 
					
						
							|  |  |  | // it under the terms of the GNU General Public License version 2 as
 | 
					
						
							|  |  |  | // published by the Free Software Foundation.
 | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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"
 | 
					
						
							|  |  |  | #include "app/ui/status_bar.h"
 | 
					
						
							| 
									
										
										
										
											2015-01-19 09:05:33 +08:00
										 |  |  | #include "app/transaction.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-21 09:21:31 +08:00
										 |  |  | #include "doc/layer.h"
 | 
					
						
							|  |  |  | #include "doc/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 { | 
					
						
							| 
									
										
										
										
											2015-02-12 23:16:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 08:20:19 +08:00
										 |  |  | 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: | 
					
						
							| 
									
										
										
										
											2015-10-01 03:34:43 +08:00
										 |  |  |   bool onEnabled(Context* context) override; | 
					
						
							|  |  |  |   void onExecute(Context* context) override; | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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 | | 
					
						
							| 
									
										
										
										
											2014-11-17 10:03:30 +08:00
										 |  |  |                              ContextFlags::ActiveLayerIsVisible | | 
					
						
							|  |  |  |                              ContextFlags::ActiveLayerIsEditable); | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void RemoveLayerCommand::onExecute(Context* context) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-14 01:53:02 +08:00
										 |  |  |   std::string layerName; | 
					
						
							| 
									
										
										
										
											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()); | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  |   { | 
					
						
							| 
									
										
										
										
											2015-01-19 09:05:33 +08:00
										 |  |  |     Transaction transaction(writer.context(), "Remove Layer"); | 
					
						
							|  |  |  |     DocumentApi api = document->getApi(transaction); | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 01:53:02 +08:00
										 |  |  |     const Site* site = writer.site(); | 
					
						
							| 
									
										
										
										
											2016-06-14 21:15:47 +08:00
										 |  |  |     if (site->inTimeline() && | 
					
						
							| 
									
										
										
										
											2016-06-14 01:53:02 +08:00
										 |  |  |         !site->selectedLayers().empty()) { | 
					
						
							|  |  |  |       SelectedLayers selLayers = site->selectedLayers(); | 
					
						
							|  |  |  |       remove_children_if_parent_is_selected(selLayers); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       int deletedTopLevelLayers = 0; | 
					
						
							|  |  |  |       for (Layer* layer : selLayers) { | 
					
						
							|  |  |  |         if (layer->parent() == sprite->root()) | 
					
						
							|  |  |  |           ++deletedTopLevelLayers; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (deletedTopLevelLayers == sprite->countLayers()) { | 
					
						
							| 
									
										
										
										
											2014-08-11 17:54:14 +08:00
										 |  |  |         ui::Alert::show("Error<<You cannot delete all layers.||&OK"); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2013-12-16 07:21:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 01:53:02 +08:00
										 |  |  |       for (Layer* layer : selLayers) { | 
					
						
							|  |  |  |         api.removeLayer(layer); | 
					
						
							| 
									
										
										
										
											2013-12-16 07:21:31 +08:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     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; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 01:53:02 +08:00
										 |  |  |       Layer* layer = writer.layer(); | 
					
						
							|  |  |  |       layerName = layer->name(); | 
					
						
							| 
									
										
										
										
											2015-01-19 09:05:33 +08:00
										 |  |  |       api.removeLayer(layer); | 
					
						
							| 
									
										
										
										
											2013-12-16 07:21:31 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-19 09:05:33 +08:00
										 |  |  |     transaction.commit(); | 
					
						
							| 
									
										
										
										
											2012-01-06 06:45:03 +08:00
										 |  |  |   } | 
					
						
							|  |  |  |   update_screen_for_document(document); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-10 00:20:58 +08:00
										 |  |  |   StatusBar::instance()->invalidate(); | 
					
						
							| 
									
										
										
										
											2016-06-14 01:53:02 +08:00
										 |  |  |   if (!layerName.empty()) | 
					
						
							|  |  |  |     StatusBar::instance()->showTip(1000, "Layer '%s' removed", layerName.c_str()); | 
					
						
							| 
									
										
										
										
											2013-12-16 07:21:31 +08:00
										 |  |  |   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
 |