]> git.sesse.net Git - kdenlive/blob - src/titlewidget.cpp
rotate and zoom ( but dialog seems not correct in resize sometimes)
[kdenlive] / src / titlewidget.cpp
1 /***************************************************************************
2                           titlewidget.h  -  description
3                              -------------------
4     begin                : Feb 28 2008
5     copyright            : (C) 2008 by Marco Gittler
6     email                : g.marco@freenet.de
7  ***************************************************************************/
8
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17
18 #include "titlewidget.h"
19 #include "graphicsscenerectmove.h"
20 #include <QGraphicsView>
21 #include <KDebug>
22 #include <QGraphicsItem>
23 #include <QGraphicsSvgItem>
24
25 int settingUp=false;
26
27 TitleWidget::TitleWidget (QDialog *parent):QDialog(parent){
28         setupUi(this);
29         connect (newTextButton,SIGNAL(clicked()), this, SLOT( slotNewText()));
30         connect (newRectButton,SIGNAL(clicked()), this, SLOT( slotNewRect()));
31         connect (kcolorbutton, SIGNAL ( clicked()), this, SLOT( slotChangeBackground()) ) ;
32         connect (horizontalSlider, SIGNAL ( valueChanged(int) ), this, SLOT( slotChangeBackground()) ) ;
33         connect (ktextedit, SIGNAL(textChanged()), this , SLOT (textChanged()));
34         connect (fontColorButton, SIGNAL ( clicked()), this, SLOT( textChanged()) ) ;
35         //connect (fontBold, SIGNAL ( clicked()), this, SLOT( setBold()) ) ;
36         
37         connect (kfontrequester, SIGNAL ( fontSelected(const QFont &)), this, SLOT( textChanged()) ) ;
38         connect(textAlpha, SIGNAL( valueChanged(int) ), this, SLOT (textChanged()));
39         //connect (ktextedit, SIGNAL(selectionChanged()), this , SLOT (textChanged()));
40         
41         connect(rectFAlpha, SIGNAL( valueChanged(int) ), this, SLOT (rectChanged()));
42         connect(rectBAlpha, SIGNAL( valueChanged(int) ), this, SLOT (rectChanged()));
43         connect(rectFColor, SIGNAL( clicked() ), this, SLOT (rectChanged()));
44         connect(rectBColor, SIGNAL( clicked() ), this, SLOT (rectChanged()));
45         connect(rectLineWidth, SIGNAL( valueChanged(int) ), this, SLOT (rectChanged()));
46         
47         connect (startViewportX,SIGNAL(valueChanged(int)), this, SLOT( setupViewports()));
48         connect (startViewportY,SIGNAL(valueChanged(int)), this, SLOT( setupViewports()));
49         connect (startViewportSize,SIGNAL(valueChanged(int)), this, SLOT( setupViewports()));
50         connect (endViewportX,SIGNAL(valueChanged(int)), this, SLOT( setupViewports()));
51         connect (endViewportY,SIGNAL(valueChanged(int)), this, SLOT( setupViewports()));
52         connect (endViewportSize,SIGNAL(valueChanged(int)), this, SLOT( setupViewports()));     
53         
54         connect (zValue, SIGNAL (valueChanged(int)), this, SLOT (zIndexChanged(int)));
55         connect (svgfilename, SIGNAL (urlSelected(const KUrl&) ), this,SLOT( svgSelected(const KUrl &)) );
56         connect (itemzoom, SIGNAL (valueChanged(int) ), this,SLOT( itemScaled(int)) );
57         connect (itemrotate, SIGNAL (valueChanged(int) ), this,SLOT( itemRotate(int)) );
58         
59         GraphicsSceneRectMove *scene=new GraphicsSceneRectMove(this);
60         
61         // a gradient background
62         QRadialGradient *gradient=new QRadialGradient(0, 0, 10);
63         gradient->setSpread(QGradient::ReflectSpread);
64         //scene->setBackgroundBrush(*gradient);
65         
66         graphicsView->setScene(scene);
67         connect (graphicsView->scene(), SIGNAL (selectionChanged()), this , SLOT( selectionChanged()));
68         initViewports();
69         
70         graphicsView->show();
71         graphicsView->setRenderHint(QPainter::Antialiasing);
72         graphicsView->setInteractive(true);
73         graphicsView->resize(400, 300);
74         
75         toolBox->setItemEnabled(2,false);
76         toolBox->setItemEnabled(3,false);
77 }
78
79 void TitleWidget::initViewports(){
80         startViewport=new QGraphicsPolygonItem(QPolygonF(QRectF(0,0,0,0)));
81         endViewport=new QGraphicsPolygonItem(QPolygonF(QRectF(0,0,0,0)));
82         
83         QPen startpen(Qt::DotLine);
84         QPen endpen(Qt::DashDotLine);
85         startpen.setColor(QColor(100,200,100,140));
86         endpen.setColor(QColor(200,100,100,140));
87         
88         startViewport->setPen(startpen);
89         endViewport->setPen(endpen);
90         
91         startViewportSize->setValue(40);
92         endViewportSize->setValue(40);
93         
94         startViewport->setZValue(-1000);
95         endViewport->setZValue(-1000);
96         
97         startViewport->setFlags(/*QGraphicsItem::ItemIsMovable|*/QGraphicsItem::ItemIsSelectable);
98         endViewport->setFlags(/*QGraphicsItem::ItemIsMovable|*/QGraphicsItem::ItemIsSelectable);
99         
100         graphicsView->scene()->addItem(startViewport);
101         graphicsView->scene()->addItem(endViewport);
102 }
103
104 void TitleWidget::slotNewRect(){
105         
106         QGraphicsRectItem * ri=graphicsView->scene()->addRect(-50,-50,100,100);
107         ri->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
108 }
109
110 void TitleWidget::slotNewText(){
111         QGraphicsTextItem *tt=graphicsView->scene()->addText("Text here");
112         tt->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
113         tt->setTextInteractionFlags (Qt::TextEditorInteraction);
114         connect (tt->document(), SIGNAL (contentsChanged()), this, SLOT(selectionChanged()));
115         kDebug() << tt->metaObject()->className();
116         /*QGraphicsRectItem * ri=graphicsView->scene()->addRect(-50,-50,100,100);
117         ri->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);*/
118         
119 }
120
121 void TitleWidget::zIndexChanged(int v){
122         QList<QGraphicsItem*> l=graphicsView->scene()->selectedItems();
123         if (l.size()>=1){
124                 l[0]->setZValue(v);
125         }
126 }
127
128 void TitleWidget::selectionChanged(){
129         QList<QGraphicsItem*> l=graphicsView->scene()->selectedItems();
130         toolBox->setItemEnabled(2,false);
131         toolBox->setItemEnabled(3,false);
132         if (l.size()==1){
133                 
134                 if ((l[0])->type()==8  ){
135                         QGraphicsTextItem* i=((QGraphicsTextItem*)l[0]);
136                         if (l[0]->hasFocus() )
137                         ktextedit->setHtml(i->toHtml());
138                         toolBox->setCurrentIndex(2);
139                         toolBox->setItemEnabled(2,true);
140                 }else
141                 if ((l[0])->type()==3){
142                         settingUp=true;
143                         QGraphicsRectItem *rec=((QGraphicsRectItem*)l[0]);
144                         toolBox->setCurrentIndex(3);
145                         toolBox->setItemEnabled(3,true);
146                         rectFAlpha->setValue(rec->pen().color().alpha());
147                         rectBAlpha->setValue(rec->brush().isOpaque() ? rec->brush().color().alpha() : 0);
148                         kDebug() << rec->brush().color().alpha();
149                         QColor fcol=rec->pen().color();
150                         QColor bcol=rec->brush().color();
151                         //fcol.setAlpha(255);
152                         //bcol.setAlpha(255);
153                         rectFColor->setColor(fcol);
154                         rectBColor->setColor(bcol);
155                         settingUp=false;
156                         rectLineWidth->setValue(rec->pen().width());
157                 }
158                 else{
159                         //toolBox->setCurrentIndex(0);
160                 }
161                 zValue->setValue(l[0]->zValue());
162                 itemzoom->setValue(transformations[l[0]].scalex*100);
163                 itemrotate->setValue(transformations[l[0]].rotate);
164         }
165 }
166
167 void TitleWidget::slotChangeBackground(){
168         QColor color=kcolorbutton->color();
169         color.setAlpha(horizontalSlider->value());
170         graphicsView->scene()->setBackgroundBrush(QBrush(color));
171 }
172
173 void TitleWidget::textChanged(){
174         QList<QGraphicsItem*> l=graphicsView->scene()->selectedItems();
175         if (l.size()==1 && (l[0])->type()==8 && !l[0]->hasFocus()){
176                 kDebug() << ktextedit->document()->toHtml();
177                 ((QGraphicsTextItem*)l[0])->setHtml(ktextedit->toHtml());
178         }
179 }
180
181 void TitleWidget::rectChanged(){
182         QList<QGraphicsItem*> l=graphicsView->scene()->selectedItems();
183         if (l.size()==1 && (l[0])->type()==3 && !settingUp){
184                 QGraphicsRectItem *rec=(QGraphicsRectItem*)l[0];
185                 QColor f=rectFColor->color();
186                 f.setAlpha(rectFAlpha->value());
187                 QPen penf(f);
188                 penf.setWidth(rectLineWidth->value());
189                 rec->setPen(penf);
190                 QColor b=rectBColor->color();
191                 b.setAlpha(rectBAlpha->value());
192                 rec->setBrush(QBrush(b));
193         }
194 }
195
196 void TitleWidget::fontBold(){
197         QList<QGraphicsItem*> l=graphicsView->scene()->selectedItems();
198         if (l.size()==1 && (l[0])->type()==8 && !l[0]->hasFocus()){
199                 //ktextedit->document()->setTextOption();
200         }
201 }
202
203 void TitleWidget::svgSelected(const KUrl& u){
204         QGraphicsSvgItem *svg=new QGraphicsSvgItem(u.toLocalFile());
205         svg->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
206         graphicsView->scene()->addItem(svg);
207 }
208
209 void TitleWidget::itemScaled(int val) {
210         QList<QGraphicsItem*> l=graphicsView->scene()->selectedItems();
211         if (l.size()==1){
212                 Transform x=transformations[l[0]];
213                 x.scalex=(double)val/100.0;
214                 x.scaley=(double)val/100.0;
215                 QTransform qtrans;
216                 qtrans.scale(x.scalex,x.scaley);
217                 qtrans.rotate(x.rotate);
218                 l[0]->setTransform(qtrans);
219                 transformations[l[0]]=x;
220         }
221 }
222
223 void TitleWidget::itemRotate(int val) {
224         QList<QGraphicsItem*> l=graphicsView->scene()->selectedItems();
225         if (l.size()==1){
226                 Transform x=transformations[l[0]];
227                 x.rotate=(double)val;
228                 QTransform qtrans;
229                 qtrans.scale(x.scalex,x.scaley);
230                 qtrans.rotate(x.rotate);
231                 l[0]->setTransform(qtrans);
232                 transformations[l[0]]=x;
233         }
234 }
235
236 void TitleWidget::setupViewports(){
237         double aspect_ratio=4.0/3.0;//read from project
238         
239         QRectF sp(startViewportX->value(), startViewportY->value(),0,0);
240         QRectF ep(endViewportX->value(),endViewportY->value(),0,0);
241         
242         double sv_size=startViewportSize->value();
243         double ev_size=endViewportSize->value();
244         sp.adjust(-sv_size,-sv_size/aspect_ratio,sv_size,sv_size/aspect_ratio);
245         ep.adjust(-ev_size,-ev_size/aspect_ratio,ev_size,ev_size/aspect_ratio); 
246         
247         startViewport->setPolygon(QPolygonF(sp));
248         endViewport->setPolygon(QPolygonF(ep));
249         
250 }
251 #include "moc_titlewidget.cpp"
252