]> git.sesse.net Git - kdenlive/blob - src/titlewidget.cpp
4614ec4c326e9d9ff485dd3a4c7b929fd65660d6
[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 <QDomDocument>
22 #include <KDebug>
23 #include <QGraphicsItem>
24 #include <QGraphicsSvgItem>
25 #include <KFileDialog>
26
27 int settingUp=false;
28
29 TitleWidget::TitleWidget (QDialog *parent):QDialog(parent){
30         setupUi(this);
31         connect (newTextButton,SIGNAL(clicked()), this, SLOT( slotNewText()));
32         connect (newRectButton,SIGNAL(clicked()), this, SLOT( slotNewRect()));
33         connect (kcolorbutton, SIGNAL ( clicked()), this, SLOT( slotChangeBackground()) ) ;
34         connect (horizontalSlider, SIGNAL ( valueChanged(int) ), this, SLOT( slotChangeBackground()) ) ;
35         connect (ktextedit, SIGNAL(textChanged()), this , SLOT (textChanged()));
36         connect (fontColorButton, SIGNAL ( clicked()), this, SLOT( textChanged()) ) ;
37         //connect (fontBold, SIGNAL ( clicked()), this, SLOT( setBold()) ) ;
38         connect (loadButton, SIGNAL ( clicked()), this, SLOT( loadTitle() ) ) ;
39         connect (saveButton, SIGNAL ( clicked()), this, SLOT( saveTitle() ) ) ;
40         
41         
42         connect (kfontrequester, SIGNAL ( fontSelected(const QFont &)), this, SLOT( textChanged()) ) ;
43         connect(textAlpha, SIGNAL( valueChanged(int) ), this, SLOT (textChanged()));
44         //connect (ktextedit, SIGNAL(selectionChanged()), this , SLOT (textChanged()));
45         
46         connect(rectFAlpha, SIGNAL( valueChanged(int) ), this, SLOT (rectChanged()));
47         connect(rectBAlpha, SIGNAL( valueChanged(int) ), this, SLOT (rectChanged()));
48         connect(rectFColor, SIGNAL( clicked() ), this, SLOT (rectChanged()));
49         connect(rectBColor, SIGNAL( clicked() ), this, SLOT (rectChanged()));
50         connect(rectLineWidth, SIGNAL( valueChanged(int) ), this, SLOT (rectChanged()));
51         
52         connect (startViewportX,SIGNAL(valueChanged(int)), this, SLOT( setupViewports()));
53         connect (startViewportY,SIGNAL(valueChanged(int)), this, SLOT( setupViewports()));
54         connect (startViewportSize,SIGNAL(valueChanged(int)), this, SLOT( setupViewports()));
55         connect (endViewportX,SIGNAL(valueChanged(int)), this, SLOT( setupViewports()));
56         connect (endViewportY,SIGNAL(valueChanged(int)), this, SLOT( setupViewports()));
57         connect (endViewportSize,SIGNAL(valueChanged(int)), this, SLOT( setupViewports()));     
58         
59         connect (zValue, SIGNAL (valueChanged(int)), this, SLOT (zIndexChanged(int)));
60         connect (svgfilename, SIGNAL (urlSelected(const KUrl&) ), this,SLOT( svgSelected(const KUrl &)) );
61         connect (itemzoom, SIGNAL (valueChanged(int) ), this,SLOT( itemScaled(int)) );
62         connect (itemrotate, SIGNAL (valueChanged(int) ), this,SLOT( itemRotate(int)) );
63         
64         GraphicsSceneRectMove *scene=new GraphicsSceneRectMove(this);
65         
66         // a gradient background
67         QRadialGradient *gradient=new QRadialGradient(0, 0, 10);
68         gradient->setSpread(QGradient::ReflectSpread);
69         //scene->setBackgroundBrush(*gradient);
70         
71         graphicsView->setScene(scene);
72         m_titledocument.setScene(scene);
73         connect (graphicsView->scene(), SIGNAL (selectionChanged()), this , SLOT( selectionChanged()));
74         initViewports();
75         
76         graphicsView->show();
77         graphicsView->setRenderHint(QPainter::Antialiasing);
78         graphicsView->setInteractive(true);
79         graphicsView->resize(400, 300);
80         
81         toolBox->setItemEnabled(2,false);
82         toolBox->setItemEnabled(3,false);
83 }
84
85 void TitleWidget::initViewports(){
86         startViewport=new QGraphicsPolygonItem(QPolygonF(QRectF(0,0,0,0)));
87         endViewport=new QGraphicsPolygonItem(QPolygonF(QRectF(0,0,0,0)));
88         
89         QPen startpen(Qt::DotLine);
90         QPen endpen(Qt::DashDotLine);
91         startpen.setColor(QColor(100,200,100,140));
92         endpen.setColor(QColor(200,100,100,140));
93         
94         startViewport->setPen(startpen);
95         endViewport->setPen(endpen);
96         
97         startViewportSize->setValue(40);
98         endViewportSize->setValue(40);
99         
100         startViewport->setZValue(-1000);
101         endViewport->setZValue(-1000);
102         
103         startViewport->setFlags(/*QGraphicsItem::ItemIsMovable|*/QGraphicsItem::ItemIsSelectable);
104         endViewport->setFlags(/*QGraphicsItem::ItemIsMovable|*/QGraphicsItem::ItemIsSelectable);
105         
106         graphicsView->scene()->addItem(startViewport);
107         graphicsView->scene()->addItem(endViewport);
108 }
109
110 void TitleWidget::slotNewRect(){
111         
112         QGraphicsRectItem * ri=graphicsView->scene()->addRect(-50,-50,100,100);
113         ri->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
114 }
115
116 void TitleWidget::slotNewText(){
117         QGraphicsTextItem *tt=graphicsView->scene()->addText("Text here");
118         tt->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
119         tt->setTextInteractionFlags (Qt::TextEditorInteraction);
120         connect (tt->document(), SIGNAL (contentsChanged()), this, SLOT(selectionChanged()));
121         kDebug() << tt->metaObject()->className();
122         /*QGraphicsRectItem * ri=graphicsView->scene()->addRect(-50,-50,100,100);
123         ri->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);*/
124         
125 }
126
127 void TitleWidget::zIndexChanged(int v){
128         QList<QGraphicsItem*> l=graphicsView->scene()->selectedItems();
129         if (l.size()>=1){
130                 l[0]->setZValue(v);
131         }
132 }
133
134 void TitleWidget::selectionChanged(){
135         QList<QGraphicsItem*> l=graphicsView->scene()->selectedItems();
136         toolBox->setItemEnabled(2,false);
137         toolBox->setItemEnabled(3,false);
138         if (l.size()==1){
139                 
140                 if ((l[0])->type()==8  ){
141                         QGraphicsTextItem* i=((QGraphicsTextItem*)l[0]);
142                         if (l[0]->hasFocus() )
143                         ktextedit->setHtml(i->toHtml());
144                         toolBox->setCurrentIndex(2);
145                         toolBox->setItemEnabled(2,true);
146                 }else
147                 if ((l[0])->type()==3){
148                         settingUp=true;
149                         QGraphicsRectItem *rec=((QGraphicsRectItem*)l[0]);
150                         toolBox->setCurrentIndex(3);
151                         toolBox->setItemEnabled(3,true);
152                         rectFAlpha->setValue(rec->pen().color().alpha());
153                         rectBAlpha->setValue(rec->brush().isOpaque() ? rec->brush().color().alpha() : 0);
154                         kDebug() << rec->brush().color().alpha();
155                         QColor fcol=rec->pen().color();
156                         QColor bcol=rec->brush().color();
157                         //fcol.setAlpha(255);
158                         //bcol.setAlpha(255);
159                         rectFColor->setColor(fcol);
160                         rectBColor->setColor(bcol);
161                         settingUp=false;
162                         rectLineWidth->setValue(rec->pen().width());
163                 }
164                 else{
165                         //toolBox->setCurrentIndex(0);
166                 }
167                 zValue->setValue((int)l[0]->zValue());
168                 itemzoom->setValue((int)transformations[l[0]].scalex*100);
169                 itemrotate->setValue((int)transformations[l[0]].rotate);
170         }
171 }
172
173 void TitleWidget::slotChangeBackground(){
174         QColor color=kcolorbutton->color();
175         color.setAlpha(horizontalSlider->value());
176         graphicsView->scene()->setBackgroundBrush(QBrush(color));
177 }
178
179 void TitleWidget::textChanged(){
180         QList<QGraphicsItem*> l=graphicsView->scene()->selectedItems();
181         if (l.size()==1 && (l[0])->type()==8 && !l[0]->hasFocus()){
182                 kDebug() << ktextedit->document()->toHtml();
183                 ((QGraphicsTextItem*)l[0])->setHtml(ktextedit->toHtml());
184         }
185 }
186
187 void TitleWidget::rectChanged(){
188         QList<QGraphicsItem*> l=graphicsView->scene()->selectedItems();
189         if (l.size()==1 && (l[0])->type()==3 && !settingUp){
190                 QGraphicsRectItem *rec=(QGraphicsRectItem*)l[0];
191                 QColor f=rectFColor->color();
192                 f.setAlpha(rectFAlpha->value());
193                 QPen penf(f);
194                 penf.setWidth(rectLineWidth->value());
195                 rec->setPen(penf);
196                 QColor b=rectBColor->color();
197                 b.setAlpha(rectBAlpha->value());
198                 rec->setBrush(QBrush(b));
199         }
200 }
201
202 void TitleWidget::fontBold(){
203         QList<QGraphicsItem*> l=graphicsView->scene()->selectedItems();
204         if (l.size()==1 && (l[0])->type()==8 && !l[0]->hasFocus()){
205                 //ktextedit->document()->setTextOption();
206         }
207 }
208
209 void TitleWidget::svgSelected(const KUrl& u){
210         QGraphicsSvgItem *svg=new QGraphicsSvgItem(u.toLocalFile());
211         svg->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
212         graphicsView->scene()->addItem(svg);
213 }
214
215 void TitleWidget::itemScaled(int val) {
216         QList<QGraphicsItem*> l=graphicsView->scene()->selectedItems();
217         if (l.size()==1){
218                 Transform x=transformations[l[0]];
219                 x.scalex=(double)val/100.0;
220                 x.scaley=(double)val/100.0;
221                 QTransform qtrans;
222                 qtrans.scale(x.scalex,x.scaley);
223                 qtrans.rotate(x.rotate);
224                 l[0]->setTransform(qtrans);
225                 transformations[l[0]]=x;
226         }
227 }
228
229 void TitleWidget::itemRotate(int val) {
230         QList<QGraphicsItem*> l=graphicsView->scene()->selectedItems();
231         if (l.size()==1){
232                 Transform x=transformations[l[0]];
233                 x.rotate=(double)val;
234                 QTransform qtrans;
235                 qtrans.scale(x.scalex,x.scaley);
236                 qtrans.rotate(x.rotate);
237                 l[0]->setTransform(qtrans);
238                 transformations[l[0]]=x;
239         }
240 }
241
242 void TitleWidget::setupViewports(){
243         double aspect_ratio=4.0/3.0;//read from project
244         
245         QRectF sp(0,0,0,0);
246         QRectF ep(0,0,0,0);
247         
248         double sv_size=startViewportSize->value();
249         double ev_size=endViewportSize->value();
250         sp.adjust(-sv_size,-sv_size/aspect_ratio,sv_size,sv_size/aspect_ratio);
251         ep.adjust(-ev_size,-ev_size/aspect_ratio,ev_size,ev_size/aspect_ratio); 
252         
253         startViewport->setPos(startViewportX->value(), startViewportY->value());
254         endViewport->setPos(endViewportX->value(),endViewportY->value());
255         
256         startViewport->setPolygon(QPolygonF(sp));
257         endViewport->setPolygon(QPolygonF(ep));
258         
259 }
260
261 void TitleWidget::loadTitle(){
262         KUrl url= KFileDialog::getOpenUrl( KUrl(), "*.kdenlivetitle",this,tr("Save Title"));
263         m_titledocument.loadDocument(url,startViewport,endViewport);
264 }
265
266 void TitleWidget::saveTitle(){
267         KUrl url= KFileDialog::getSaveUrl( KUrl(), "*.kdenlivetitle",this,tr("Save Title"));
268         m_titledocument.saveDocument(url,startViewport,endViewport);
269 }
270
271 #include "moc_titlewidget.cpp"
272