source: synfigstudio/trunk/fuentes/src/synfigapp/actions/layerextract.cpp @ 481

Last change on this file since 481 was 481, checked in by jrpelegrina, 4 years ago

First release to xenial

File size: 4.9 KB
Line 
1/* === S Y N F I G ========================================================= */
2/*!     \file layerextract.cpp
3**      \brief Template File
4**
5**      $Id$
6**
7**      \legal
8**      ......... ... 2013 Ivan Mahonin
9**
10**      This package is free software; you can redistribute it and/or
11**      modify it under the terms of the GNU General Public License as
12**      published by the Free Software Foundation; either version 2 of
13**      the License, or (at your option) any later version.
14**
15**      This package is distributed in the hope that it will be useful,
16**      but WITHOUT ANY WARRANTY; without even the implied warranty of
17**      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18**      General Public License for more details.
19**      \endlegal
20*/
21/* ========================================================================= */
22
23/* === H E A D E R S ======================================================= */
24
25#ifdef USING_PCH
26#       include "pch.h"
27#else
28#ifdef HAVE_CONFIG_H
29#       include <config.h>
30#endif
31
32#include "layerextract.h"
33#include <synfigapp/canvasinterface.h>
34
35#include <synfigapp/general.h>
36
37#endif
38
39using namespace std;
40using namespace etl;
41using namespace synfig;
42using namespace synfigapp;
43using namespace Action;
44
45/* === M A C R O S ========================================================= */
46
47ACTION_INIT(Action::LayerExtract);
48ACTION_SET_NAME(Action::LayerExtract,"LayerExtract");
49ACTION_SET_LOCAL_NAME(Action::LayerExtract,N_("Extract Layer"));
50ACTION_SET_TASK(Action::LayerExtract,"extract");
51ACTION_SET_CATEGORY(Action::LayerExtract,Action::CATEGORY_LAYER);
52ACTION_SET_PRIORITY(Action::LayerExtract,0);
53ACTION_SET_VERSION(Action::LayerExtract,"0.0");
54ACTION_SET_CVS_ID(Action::LayerExtract,"$Id$");
55
56/* === G L O B A L S ======================================================= */
57
58/* === P R O C E D U R E S ================================================= */
59
60/* === M E T H O D S ======================================================= */
61
62Action::ParamVocab
63Action::LayerExtract::get_param_vocab()
64{
65        ParamVocab ret(Action::Super::get_param_vocab());
66
67        ret.push_back(ParamDesc("layer",Param::TYPE_LAYER)
68                .set_local_name(_("Layer"))
69                .set_desc(_("Layer to be extracted"))
70        );
71
72        ret.push_back(ParamDesc("filename",Param::TYPE_STRING)
73                .set_local_name(_("File name"))
74                .set_desc(_("File name witch path to store exported file"))
75                .set_user_supplied()
76        );
77
78        return ret;
79}
80
81bool
82Action::LayerExtract::is_candidate(const ParamList &x)
83{
84        if (!candidate_check(get_param_vocab(),x)) return false;
85
86        Layer::Handle layer=x.find("layer")->second.get_layer();
87        if(!layer) return false;
88
89        if (layer->get_param_list().count("filename") != 0)
90        {
91                String filename = layer->get_param("filename").get(String());
92                // TODO: literal "container:"
93                if (!filename.empty()
94                  && filename.substr(0, String("#").size()) == "#"
95              && layer->dynamic_param_list().count("filename") == 0)
96                        return true;
97        }
98
99        return false;
100}
101
102bool
103Action::LayerExtract::set_param(const synfig::String& name, const Action::Param &param)
104{
105        if(name=="layer" && param.get_type()==Param::TYPE_LAYER)
106        {
107                Layer::Handle layer = param.get_layer();
108
109                if (layer->get_param_list().count("filename") != 0)
110                {
111                        String filename = layer->get_param("filename").get(String());
112                        // TODO: literal "container:"
113                        if (!filename.empty()
114                          && filename.substr(0, String("#").size()) == "#"
115                      && layer->dynamic_param_list().count("filename") == 0)
116                        {
117                                this->layer = layer;
118                                return true;
119                        }
120                }
121
122                return false;
123        }
124
125        if(name=="filename" && param.get_type()==Param::TYPE_STRING)
126        {
127                filename = param.get_string();
128                return true;
129        }
130
131        return Action::CanvasSpecific::set_param(name,param);
132}
133
134bool
135Action::LayerExtract::is_ready()const
136{
137        if(!layer)
138                return false;
139        return Action::CanvasSpecific::is_ready();
140}
141
142void
143Action::LayerExtract::prepare()
144{
145        if(!first_time())
146                return;
147
148        if (layer) {
149                // TODO: "container:" and "images" literals
150                std::string old_filename = layer->get_param("filename").get(String());
151                old_filename = "#images/" + old_filename.substr(String("#").size());
152                std::string src_dir = get_canvas()->get_file_path();
153                if (!is_absolute_path(src_dir))
154                        src_dir = absolute_path(src_dir);
155
156                std::string absolute_filename
157                          =     filename.empty()           ? src_dir
158                          : is_absolute_path(filename) ? filename
159                          : cleanup_path(src_dir+ETL_DIRECTORY_SEPARATOR+filename);
160
161                FileSystem::Handle file_system = get_canvas()->get_identifier().file_system;
162
163                // try to copy file
164                if (!FileSystem::copy(file_system, old_filename, file_system, absolute_filename))
165                        throw Error(_("Cannot copy file"));
166
167                // create action to change layer param
168                ValueBase value;
169                value.set(absolute_filename);
170                Action::Handle action(Action::create("LayerParamSet"));
171                action->set_param("canvas",get_canvas());
172                action->set_param("canvas_interface",get_canvas_interface());
173                action->set_param("layer",layer);
174                action->set_param("param","filename");
175                action->set_param("new_value",value);
176                add_action_front(action);
177        }
178}
Note: See TracBrowser for help on using the repository browser.