modify abstracttool iface
[yamf.git] / yamf / tools / selection / select.cpp
blob2e7f29bc4d72848f49a10ba8c62ab98e72b389d3
1 /***************************************************************************
2 * Copyright (C) 2007 Jorge Cuadrado *
3 * kuadrosxx@gmail.com *
4 * *
5 * This library is free software; you can redistribute it and/or *
6 * modify it under the terms of the GNU Lesser General Public *
7 * License as published by the Free Software Foundation; either *
8 * version 2.1 of the License, or (at your option) any later version. *
9 * *
10 * This library is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
13 * Lesser General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU Lesser General Public *
16 * License along with this library; if not, write to the Free Software *
17 * Foundation, Inc., *
18 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *
19 ***************************************************************************/
21 #include "select.h"
23 #include <dgraphics/itemtransformer.h>
25 #include <dgui/action.h>
26 #include <dgui/iconloader.h>
28 #include <QList>
30 #include <model/frame.h>
32 #include <drawing/photogram.h>
33 #include <drawing/paintarea.h>
34 #include <drawing/brushmanager.h>
36 #include <QGraphicsSceneMouseEvent>
37 #include <QGraphicsItem>
39 namespace YAMF {
40 namespace Drawing {
41 namespace Tool {
43 struct Select::Private
45 Private() : transformer(0) {}
46 DGui::Action *action;
47 QList<DGraphics::ItemTransformer *> transformers;
49 DGraphics::ItemTransformer* transformer;
52 /**
53 * @~spanish
54 * Construye la herramienta para transformar un objeto grafico.
56 Select::Select(QObject *parent): Drawing::AbstractTool(parent), d(new Private)
58 d->action = new DGui::Action( DGui::IconLoader::self()->load("tool-pointer.svg"), tr("Select"), this);
62 /**
63 * Destructor
65 Select::~Select()
67 delete d;
70 /**
71 * @~spanish
72 * Inicializa la herramienta, permite que los items dentro de el fotograma se puedan seleccionar y mover.
74 void Select::init(Photogram *photogram)
76 foreach(QGraphicsView * view, photogram->views())
78 foreach(QGraphicsItem *item, view->scene()->items())
80 item->setFlags(QGraphicsItem::ItemIsSelectable);
81 item->setFlag(QGraphicsItem::ItemIsMovable, true);
86 /**
87 * @~spanish
88 * Retorna el id de la herramienta.
90 QString Select::id() const
92 return "select";
95 /**
96 * @~spanish
97 * Función sobrecargada para implementar la transformación de los objetos graficos.
99 void Select::press(const QGraphicsSceneMouseEvent *input)
101 PaintArea *paintArea = this->paintArea();
103 paintArea->setDragMode (QGraphicsView::RubberBandDrag);
104 if(d->transformer)
106 d->transformer = 0;
109 QGraphicsScene *scene = paintArea->scene();
111 foreach(QGraphicsItem *item, scene->items())
113 item->setFlag(QGraphicsItem::ItemIsMovable, true);
114 item->setFlag(QGraphicsItem::ItemIsSelectable, true);
117 if( input->modifiers() != Qt::ControlModifier )
119 foreach(DGraphics::ItemTransformer *transformer, d->transformers)
121 if(scene->mouseGrabberItem() == transformer->item())
123 switch(transformer->operation())
125 case DGraphics::ItemTransformer::Scale:
127 transformer->setOperation(DGraphics::ItemTransformer::Rotate);
129 break;
130 case DGraphics::ItemTransformer::Rotate:
132 transformer->setOperation(DGraphics::ItemTransformer::Scale);
134 break;
137 d->transformer = transformer;
138 break;
146 * @~spanish
147 * Función sobrecargada para implementar la transformación de los objetos graficos.
149 void Select::move(const QGraphicsSceneMouseEvent *input)
151 if(d->transformer)
153 switch(d->transformer->operation())
155 case DGraphics::ItemTransformer::Scale:
157 d->transformer->setOperation(DGraphics::ItemTransformer::Rotate);
159 break;
160 case DGraphics::ItemTransformer::Rotate:
162 d->transformer->setOperation(DGraphics::ItemTransformer::Scale);
164 break;
167 d->transformer = 0;
172 * @~spanish
173 * Función sobrecargada para implementar la transformación de los objetos graficos.
175 void Select::release(const QGraphicsSceneMouseEvent *input)
177 PaintArea *paintArea = this->paintArea();
178 QGraphicsScene *scene = paintArea->scene();
180 if(scene->selectedItems().count() > 0)
182 QList<QGraphicsItem *> selecteds = scene->selectedItems();
183 QList<DGraphics::ItemTransformer *>::iterator it = d->transformers.begin();
184 QList<DGraphics::ItemTransformer *>::iterator itEnd = d->transformers.end();
185 while(it != itEnd)
187 int itemIndex = scene->selectedItems().indexOf((*it)->item() );
189 if(itemIndex != -1 )
191 selecteds.removeAt(itemIndex);
193 else
195 delete d->transformers.takeAt(d->transformers.indexOf((*it)));
197 ++it;
200 foreach(QGraphicsItem *item, selecteds)
202 if( paintArea->currentFrame()->logicalIndexOf(item) > -1 )
204 DGraphics::ItemTransformer *transformer = new DGraphics::ItemTransformer(item, scene);
205 d->transformers << transformer;
209 else
211 qDeleteAll(d->transformers);
212 d->transformers.clear();
217 * @~spanish
218 * Función reimplemenatada para evita que se des-aparescan los nodos de trasnformación del fotograma.
220 void Select::photogramChanged(Photogram *const photogram)
222 if(photogram->selectedItems().count() > 0)
224 QList<QGraphicsItem *> seleceteds = photogram->selectedItems();
225 foreach(DGraphics::ItemTransformer *transformer, d->transformers)
227 if(seleceteds.contains(transformer->item()))
229 transformer->show();
231 else
233 d->transformers.removeAll(transformer);
237 else
239 qDeleteAll(d->transformers);
240 d->transformers.clear();
245 * @~spanish
246 * Retorna la acción que representa la herramienta.
248 DGui::Action *Select::action() const
250 return d->action;
254 * @~spanish
255 * Retorna que la herramienta es de tipo Selection.
257 int Select::type() const
259 return AbstractTool::Selection;
263 * @~spanish
264 * Elimina los nodos cuando se cambia de herramienta.
266 void Select::aboutToChangeTool()
268 qDeleteAll(d->transformers);
269 d->transformers.clear();