]> git.sesse.net Git - kdenlive/blob - src/titlewidget.cpp
6e457bd67c3755031ae533de514a7be289ae41bd
[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
19
20 #include <QGraphicsView>
21 #include <QDomDocument>
22 #include <KDebug>
23 #include <KGlobalSettings>
24 #include <QGraphicsItem>
25 #include <QGraphicsSvgItem>
26 #include <KFileDialog>
27
28 #include "titlewidget.h"
29 #include "kdenlivesettings.h"
30
31 int settingUp = false;
32
33 TitleWidget::TitleWidget(Render *render, QWidget *parent): QDialog(parent) {
34     setupUi(this);
35     frame_properties->setFont(KGlobalSettings::toolBarFont());
36     frame_properties->setEnabled(false);
37     connect(newTextButton, SIGNAL(clicked()), this, SLOT(slotNewText()));
38     connect(newRectButton, SIGNAL(clicked()), this, SLOT(slotNewRect()));
39     connect(kcolorbutton, SIGNAL(clicked()), this, SLOT(slotChangeBackground())) ;
40     connect(horizontalSlider, SIGNAL(valueChanged(int)), this, SLOT(slotChangeBackground())) ;
41     connect(ktextedit, SIGNAL(textChanged()), this , SLOT(textChanged()));
42     connect(fontColorButton, SIGNAL(clicked()), this, SLOT(textChanged())) ;
43     //connect (fontBold, SIGNAL ( clicked()), this, SLOT( setBold()) ) ;
44     connect(loadButton, SIGNAL(clicked()), this, SLOT(loadTitle())) ;
45     connect(saveButton, SIGNAL(clicked()), this, SLOT(saveTitle())) ;
46
47
48     connect(kfontrequester, SIGNAL(fontSelected(const QFont &)), this, SLOT(textChanged())) ;
49     connect(textAlpha, SIGNAL(valueChanged(int)), this, SLOT(textChanged()));
50     //connect (ktextedit, SIGNAL(selectionChanged()), this , SLOT (textChanged()));
51
52     connect(rectFAlpha, SIGNAL(valueChanged(int)), this, SLOT(rectChanged()));
53     connect(rectBAlpha, SIGNAL(valueChanged(int)), this, SLOT(rectChanged()));
54     connect(rectFColor, SIGNAL(clicked()), this, SLOT(rectChanged()));
55     connect(rectBColor, SIGNAL(clicked()), this, SLOT(rectChanged()));
56     connect(rectLineWidth, SIGNAL(valueChanged(int)), this, SLOT(rectChanged()));
57
58     connect(startViewportX, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));
59     connect(startViewportY, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));
60     connect(startViewportSize, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));
61     connect(endViewportX, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));
62     connect(endViewportY, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));
63     connect(endViewportSize, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));
64
65     connect(zValue, SIGNAL(valueChanged(int)), this, SLOT(zIndexChanged(int)));
66     connect(svgfilename, SIGNAL(urlSelected(const KUrl&)), this, SLOT(svgSelected(const KUrl &)));
67     connect(itemzoom, SIGNAL(valueChanged(int)), this, SLOT(itemScaled(int)));
68     connect(itemrotate, SIGNAL(valueChanged(int)), this, SLOT(itemRotate(int)));
69
70     connect(value_x, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustSelectedItem()));
71     connect(value_y, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustSelectedItem()));
72     connect(value_w, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustSelectedItem()));
73     connect(value_h, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustSelectedItem()));
74     connect(buttonFitZoom, SIGNAL(clicked()), this, SLOT(slotAdjustZoom()));
75     connect(buttonRealSize, SIGNAL(clicked()), this, SLOT(slotZoomOneToOne()));
76
77     buttonFitZoom->setIcon(KIcon("zoom-fit-best"));
78     buttonRealSize->setIcon(KIcon("zoom-original"));
79     m_scene = new GraphicsSceneRectMove(this);
80
81     // a gradient background
82     QRadialGradient *gradient = new QRadialGradient(0, 0, 10);
83     gradient->setSpread(QGradient::ReflectSpread);
84     //scene->setBackgroundBrush(*gradient);
85
86
87     graphicsView->setScene(m_scene);
88     m_titledocument.setScene(m_scene);
89     connect(graphicsView->scene(), SIGNAL(selectionChanged()), this , SLOT(selectionChanged()));
90     connect(m_scene, SIGNAL(itemMoved()), this , SLOT(selectionChanged()));
91     connect(m_scene, SIGNAL(sceneZoom(bool)), this , SLOT(slotZoom(bool)));
92     connect(zoom_slider, SIGNAL(valueChanged(int)), this , SLOT(slotUpdateZoom(int)));
93
94
95     QPen framepen(Qt::DotLine);
96     framepen.setColor(Qt::red);
97     m_frameWidth = render->renderWidth();
98     m_frameHeight = render->renderHeight();
99     m_frameBorder = new QGraphicsRectItem(QRectF(0, 0, m_frameWidth, m_frameHeight));
100     m_frameBorder->setPen(framepen);
101     m_frameBorder->setZValue(-1000);
102     m_frameBorder->setFlags(QGraphicsItem::ItemClipsToShape);
103     graphicsView->scene()->addItem(m_frameBorder);
104     initViewports();
105
106     graphicsView->show();
107     graphicsView->setRenderHint(QPainter::Antialiasing);
108     graphicsView->setInteractive(true);
109     slotAdjustZoom();
110     //graphicsView->resize(400, 300);
111     kDebug() << "// TITLE WIDGWT: " << graphicsView->viewport()->width() << "x" << graphicsView->viewport()->height();
112     toolBox->setItemEnabled(2, false);
113     toolBox->setItemEnabled(3, false);
114 }
115
116
117 //virtual
118 void TitleWidget::resizeEvent(QResizeEvent * event) {
119     //slotAdjustZoom();
120 }
121
122 void TitleWidget::initViewports() {
123     startViewport = new QGraphicsPolygonItem(QPolygonF(QRectF(0, 0, 0, 0)));
124     endViewport = new QGraphicsPolygonItem(QPolygonF(QRectF(0, 0, 0, 0)));
125
126     QPen startpen(Qt::DotLine);
127     QPen endpen(Qt::DashDotLine);
128     startpen.setColor(QColor(100, 200, 100, 140));
129     endpen.setColor(QColor(200, 100, 100, 140));
130
131     startViewport->setPen(startpen);
132     endViewport->setPen(endpen);
133
134     startViewportSize->setValue(40);
135     endViewportSize->setValue(40);
136
137     startViewport->setZValue(-1000);
138     endViewport->setZValue(-1000);
139
140     startViewport->setFlags(/*QGraphicsItem::ItemIsMovable|*/QGraphicsItem::ItemIsSelectable);
141     endViewport->setFlags(/*QGraphicsItem::ItemIsMovable|*/QGraphicsItem::ItemIsSelectable);
142
143     graphicsView->scene()->addItem(startViewport);
144     graphicsView->scene()->addItem(endViewport);
145 }
146
147 void TitleWidget::slotUpdateZoom(int pos) {
148     m_scene->setZoom((double) pos / 7);
149     zoom_label->setText("x" + QString::number((double) pos / 7, 'g', 2));
150 }
151
152 void TitleWidget::slotZoom(bool up) {
153     int pos = zoom_slider->value();
154     if (up) pos++;
155     else pos--;
156     zoom_slider->setValue(pos);
157 }
158
159 void TitleWidget::slotAdjustZoom() {
160     double scalex = graphicsView->width() / (double)(m_frameWidth * 1.2);
161     double scaley = graphicsView->height() / (double)(m_frameHeight * 1.2);
162     if (scalex > scaley) scalex = scaley;
163     int zoompos = (int)(scalex * 7 + 0.5);
164     zoom_slider->setValue(zoompos);
165     graphicsView->centerOn(m_frameBorder);
166 }
167
168 void TitleWidget::slotZoomOneToOne() {
169     zoom_slider->setValue(7);
170     graphicsView->centerOn(m_frameBorder);
171 }
172
173 void TitleWidget::slotNewRect() {
174     QGraphicsRectItem * ri = graphicsView->scene()->addRect(0, 0, 100, 100);
175     ri->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
176     ri->setPos(m_frameWidth / 2, m_frameHeight / 2);
177     QColor f = rectFColor->color();
178     f.setAlpha(rectFAlpha->value());
179     QPen penf(f);
180     penf.setWidth(rectLineWidth->value());
181     ri->setPen(penf);
182     QColor b = rectBColor->color();
183     b.setAlpha(rectBAlpha->value());
184     ri->setBrush(QBrush(b));
185 }
186
187 void TitleWidget::slotNewText() {
188     QGraphicsTextItem *tt = graphicsView->scene()->addText("Text here");
189     tt->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
190     tt->setTextInteractionFlags(Qt::NoTextInteraction);
191     tt->setPos(m_frameWidth / 2, m_frameHeight / 2);
192     tt->setFont(kfontrequester->font());
193     connect(tt->document(), SIGNAL(contentsChanged()), this, SLOT(selectionChanged()));
194     kDebug() << tt->metaObject()->className();
195     /*QGraphicsRectItem * ri=graphicsView->scene()->addRect(-50,-50,100,100);
196     ri->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);*/
197
198 }
199
200 void TitleWidget::zIndexChanged(int v) {
201     QList<QGraphicsItem*> l = graphicsView->scene()->selectedItems();
202     if (l.size() >= 1) {
203         l[0]->setZValue(v);
204     }
205 }
206
207 void TitleWidget::selectionChanged() {
208     QList<QGraphicsItem*> l = graphicsView->scene()->selectedItems();
209     toolBox->setItemEnabled(2, false);
210     toolBox->setItemEnabled(3, false);
211     value_x->blockSignals(true);
212     value_y->blockSignals(true);
213     value_w->blockSignals(true);
214     value_h->blockSignals(true);
215     if (l.size() == 1) {
216         if ((l[0])->type() == 8) {
217             QGraphicsTextItem* i = ((QGraphicsTextItem*)l[0]);
218             if (l[0]->hasFocus())
219                 ktextedit->setHtml(i->toHtml());
220             toolBox->setCurrentIndex(2);
221             toolBox->setItemEnabled(2, true);
222             value_x->setValue((int) i->pos().x());
223             value_y->setValue((int) i->pos().y());
224             value_w->setValue((int) i->boundingRect().width());
225             value_h->setValue((int) i->boundingRect().height());
226             frame_properties->setEnabled(true);
227             value_w->setEnabled(false);
228             value_h->setEnabled(false);
229         } else
230             if ((l[0])->type() == 3) {
231                 settingUp = true;
232                 QGraphicsRectItem *rec = ((QGraphicsRectItem*)l[0]);
233                 toolBox->setCurrentIndex(3);
234                 toolBox->setItemEnabled(3, true);
235                 rectFAlpha->setValue(rec->pen().color().alpha());
236                 rectBAlpha->setValue(rec->brush().color().alpha());
237                 kDebug() << rec->brush().color().alpha();
238                 QColor fcol = rec->pen().color();
239                 QColor bcol = rec->brush().color();
240                 //fcol.setAlpha(255);
241                 //bcol.setAlpha(255);
242                 rectFColor->setColor(fcol);
243                 rectBColor->setColor(bcol);
244                 settingUp = false;
245                 rectLineWidth->setValue(rec->pen().width());
246                 value_x->setValue((int) rec->pos().x());
247                 value_y->setValue((int) rec->pos().y());
248                 value_w->setValue((int) rec->rect().width());
249                 value_h->setValue((int) rec->rect().height());
250                 frame_properties->setEnabled(true);
251                 value_w->setEnabled(true);
252                 value_h->setEnabled(true);
253             } else {
254                 //toolBox->setCurrentIndex(0);
255                 frame_properties->setEnabled(false);
256             }
257         zValue->setValue((int)l[0]->zValue());
258         itemzoom->setValue((int)transformations[l[0]].scalex*100);
259         itemrotate->setValue((int)transformations[l[0]].rotate);
260         value_x->blockSignals(false);
261         value_y->blockSignals(false);
262         value_w->blockSignals(false);
263         value_h->blockSignals(false);
264     }
265 }
266
267 void TitleWidget::slotAdjustSelectedItem() {
268     QList<QGraphicsItem*> l = graphicsView->scene()->selectedItems();
269     if (l.size() >= 1) {
270         if (l[0]->type() == 3) {
271             //rect item
272             QGraphicsRectItem *rec = ((QGraphicsRectItem*)l[0]);
273             rec->setPos(value_x->value(), value_y->value());
274             rec->setRect(QRect(0, 0, value_w->value(), value_h->value()));
275         } else if (l[0]->type() == 8) {
276             //text item
277             QGraphicsTextItem *rec = ((QGraphicsTextItem*)l[0]);
278             rec->setPos(value_x->value(), value_y->value());
279         }
280     }
281 }
282
283 void TitleWidget::slotChangeBackground() {
284     QColor color = kcolorbutton->color();
285     color.setAlpha(horizontalSlider->value());
286     graphicsView->scene()->setBackgroundBrush(QBrush(color));
287 }
288
289 void TitleWidget::textChanged() {
290     QList<QGraphicsItem*> l = graphicsView->scene()->selectedItems();
291     if (l.size() == 1 && (l[0])->type() == 8 && !l[0]->hasFocus()) {
292         kDebug() << ktextedit->document()->toHtml();
293         ((QGraphicsTextItem*)l[0])->setHtml(ktextedit->toHtml());
294     }
295 }
296
297 void TitleWidget::rectChanged() {
298     QList<QGraphicsItem*> l = graphicsView->scene()->selectedItems();
299     if (l.size() == 1 && (l[0])->type() == 3 && !settingUp) {
300         QGraphicsRectItem *rec = (QGraphicsRectItem*)l[0];
301         QColor f = rectFColor->color();
302         f.setAlpha(rectFAlpha->value());
303         QPen penf(f);
304         penf.setWidth(rectLineWidth->value());
305         rec->setPen(penf);
306         QColor b = rectBColor->color();
307         b.setAlpha(rectBAlpha->value());
308         rec->setBrush(QBrush(b));
309     }
310 }
311
312 void TitleWidget::fontBold() {
313     QList<QGraphicsItem*> l = graphicsView->scene()->selectedItems();
314     if (l.size() == 1 && (l[0])->type() == 8 && !l[0]->hasFocus()) {
315         //ktextedit->document()->setTextOption();
316     }
317 }
318
319 void TitleWidget::svgSelected(const KUrl& u) {
320     QGraphicsSvgItem *svg = new QGraphicsSvgItem(u.toLocalFile());
321     svg->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
322     graphicsView->scene()->addItem(svg);
323 }
324
325 void TitleWidget::itemScaled(int val) {
326     QList<QGraphicsItem*> l = graphicsView->scene()->selectedItems();
327     if (l.size() == 1) {
328         Transform x = transformations[l[0]];
329         x.scalex = (double)val / 100.0;
330         x.scaley = (double)val / 100.0;
331         QTransform qtrans;
332         qtrans.scale(x.scalex, x.scaley);
333         qtrans.rotate(x.rotate);
334         l[0]->setTransform(qtrans);
335         transformations[l[0]] = x;
336     }
337 }
338
339 void TitleWidget::itemRotate(int val) {
340     QList<QGraphicsItem*> l = graphicsView->scene()->selectedItems();
341     if (l.size() == 1) {
342         Transform x = transformations[l[0]];
343         x.rotate = (double)val;
344         QTransform qtrans;
345         qtrans.scale(x.scalex, x.scaley);
346         qtrans.rotate(x.rotate);
347         l[0]->setTransform(qtrans);
348         transformations[l[0]] = x;
349     }
350 }
351
352
353 void TitleWidget::setupViewports() {
354     double aspect_ratio = 4.0 / 3.0;//read from project
355
356     QRectF sp(0, 0, 0, 0);
357     QRectF ep(0, 0, 0, 0);
358
359     double sv_size = startViewportSize->value();
360     double ev_size = endViewportSize->value();
361     sp.adjust(-sv_size, -sv_size / aspect_ratio, sv_size, sv_size / aspect_ratio);
362     ep.adjust(-ev_size, -ev_size / aspect_ratio, ev_size, ev_size / aspect_ratio);
363
364     startViewport->setPos(startViewportX->value(), startViewportY->value());
365     endViewport->setPos(endViewportX->value(), endViewportY->value());
366
367     startViewport->setPolygon(QPolygonF(sp));
368     endViewport->setPolygon(QPolygonF(ep));
369
370 }
371
372 void TitleWidget::loadTitle() {
373     KUrl url = KFileDialog::getOpenUrl(KUrl(), "*.kdenlivetitle", this, tr("Save Title"));
374     m_titledocument.loadDocument(url, startViewport, endViewport);
375 }
376
377 void TitleWidget::saveTitle() {
378     KUrl url = KFileDialog::getSaveUrl(KUrl(), "*.kdenlivetitle", this, tr("Save Title"));
379     m_titledocument.saveDocument(url, startViewport, endViewport);
380 }
381
382 #include "moc_titlewidget.cpp"
383