1 /***************************************************************************
2 * Copyright (C) 2007 Jorge Cuadrado *
3 * kuadrosxx@gmail.com *
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. *
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. *
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 *
18 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *
19 ***************************************************************************/
23 #include <dgraphics/itemtransformer.h>
25 #include <dgui/action.h>
26 #include <dgui/iconloader.h>
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>
43 struct Select::Private
45 Private() : transformer(0) {}
47 QList
<DGraphics::ItemTransformer
*> transformers
;
49 DGraphics::ItemTransformer
* transformer
;
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);
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);
88 * Retorna el id de la herramienta.
90 QString
Select::id() const
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
);
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
);
130 case DGraphics::ItemTransformer::Rotate
:
132 transformer
->setOperation(DGraphics::ItemTransformer::Scale
);
137 d
->transformer
= transformer
;
147 * Función sobrecargada para implementar la transformación de los objetos graficos.
149 void Select::move(const QGraphicsSceneMouseEvent
*input
)
153 switch(d
->transformer
->operation())
155 case DGraphics::ItemTransformer::Scale
:
157 d
->transformer
->setOperation(DGraphics::ItemTransformer::Rotate
);
160 case DGraphics::ItemTransformer::Rotate
:
162 d
->transformer
->setOperation(DGraphics::ItemTransformer::Scale
);
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();
187 int itemIndex
= scene
->selectedItems().indexOf((*it
)->item() );
191 selecteds
.removeAt(itemIndex
);
195 delete d
->transformers
.takeAt(d
->transformers
.indexOf((*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
;
211 qDeleteAll(d
->transformers
);
212 d
->transformers
.clear();
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()))
233 d
->transformers
.removeAll(transformer
);
239 qDeleteAll(d
->transformers
);
240 d
->transformers
.clear();
246 * Retorna la acción que representa la herramienta.
248 DGui::Action
*Select::action() const
255 * Retorna que la herramienta es de tipo Selection.
257 int Select::type() const
259 return AbstractTool::Selection
;
264 * Elimina los nodos cuando se cambia de herramienta.
266 void Select::aboutToChangeTool()
268 qDeleteAll(d
->transformers
);
269 d
->transformers
.clear();