1 /***************************************************************************
2 titlewidget.h - description
5 copyright : (C) 2008 by Marco Gittler
6 email : g.marco@freenet.de
7 ***************************************************************************/
9 /***************************************************************************
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. *
16 ***************************************************************************/
20 #include <QGraphicsView>
21 #include <QDomDocument>
23 #include <KGlobalSettings>
24 #include <QGraphicsItem>
25 #include <QGraphicsSvgItem>
26 #include <KFileDialog>
28 #include "titlewidget.h"
29 #include "kdenlivesettings.h"
31 int settingUp = false;
33 TitleWidget::TitleWidget(Render *render, QWidget *parent): QDialog(parent) {
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())) ;
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()));
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()));
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()));
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)));
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()));
77 buttonFitZoom->setIcon(KIcon("zoom-fit-best"));
78 buttonRealSize->setIcon(KIcon("zoom-original"));
79 m_scene = new GraphicsSceneRectMove(this);
81 // a gradient background
82 QRadialGradient *gradient = new QRadialGradient(0, 0, 10);
83 gradient->setSpread(QGradient::ReflectSpread);
84 //scene->setBackgroundBrush(*gradient);
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)));
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);
106 graphicsView->show();
107 graphicsView->setRenderHint(QPainter::Antialiasing);
108 graphicsView->setInteractive(true);
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);
118 void TitleWidget::resizeEvent(QResizeEvent * event) {
122 void TitleWidget::initViewports() {
123 startViewport = new QGraphicsPolygonItem(QPolygonF(QRectF(0, 0, 0, 0)));
124 endViewport = new QGraphicsPolygonItem(QPolygonF(QRectF(0, 0, 0, 0)));
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));
131 startViewport->setPen(startpen);
132 endViewport->setPen(endpen);
134 startViewportSize->setValue(40);
135 endViewportSize->setValue(40);
137 startViewport->setZValue(-1000);
138 endViewport->setZValue(-1000);
140 startViewport->setFlags(/*QGraphicsItem::ItemIsMovable|*/QGraphicsItem::ItemIsSelectable);
141 endViewport->setFlags(/*QGraphicsItem::ItemIsMovable|*/QGraphicsItem::ItemIsSelectable);
143 graphicsView->scene()->addItem(startViewport);
144 graphicsView->scene()->addItem(endViewport);
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));
152 void TitleWidget::slotZoom(bool up) {
153 int pos = zoom_slider->value();
156 zoom_slider->setValue(pos);
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);
168 void TitleWidget::slotZoomOneToOne() {
169 zoom_slider->setValue(7);
170 graphicsView->centerOn(m_frameBorder);
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());
180 penf.setWidth(rectLineWidth->value());
182 QColor b = rectBColor->color();
183 b.setAlpha(rectBAlpha->value());
184 ri->setBrush(QBrush(b));
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);*/
200 void TitleWidget::zIndexChanged(int v) {
201 QList<QGraphicsItem*> l = graphicsView->scene()->selectedItems();
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);
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);
230 if ((l[0])->type() == 3) {
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);
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);
254 //toolBox->setCurrentIndex(0);
255 frame_properties->setEnabled(false);
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);
267 void TitleWidget::slotAdjustSelectedItem() {
268 QList<QGraphicsItem*> l = graphicsView->scene()->selectedItems();
270 if (l[0]->type() == 3) {
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) {
277 QGraphicsTextItem *rec = ((QGraphicsTextItem*)l[0]);
278 rec->setPos(value_x->value(), value_y->value());
283 void TitleWidget::slotChangeBackground() {
284 QColor color = kcolorbutton->color();
285 color.setAlpha(horizontalSlider->value());
286 graphicsView->scene()->setBackgroundBrush(QBrush(color));
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());
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());
304 penf.setWidth(rectLineWidth->value());
306 QColor b = rectBColor->color();
307 b.setAlpha(rectBAlpha->value());
308 rec->setBrush(QBrush(b));
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();
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);
325 void TitleWidget::itemScaled(int val) {
326 QList<QGraphicsItem*> l = graphicsView->scene()->selectedItems();
328 Transform x = transformations[l[0]];
329 x.scalex = (double)val / 100.0;
330 x.scaley = (double)val / 100.0;
332 qtrans.scale(x.scalex, x.scaley);
333 qtrans.rotate(x.rotate);
334 l[0]->setTransform(qtrans);
335 transformations[l[0]] = x;
339 void TitleWidget::itemRotate(int val) {
340 QList<QGraphicsItem*> l = graphicsView->scene()->selectedItems();
342 Transform x = transformations[l[0]];
343 x.rotate = (double)val;
345 qtrans.scale(x.scalex, x.scaley);
346 qtrans.rotate(x.rotate);
347 l[0]->setTransform(qtrans);
348 transformations[l[0]] = x;
353 void TitleWidget::setupViewports() {
354 double aspect_ratio = 4.0 / 3.0;//read from project
356 QRectF sp(0, 0, 0, 0);
357 QRectF ep(0, 0, 0, 0);
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);
364 startViewport->setPos(startViewportX->value(), startViewportY->value());
365 endViewport->setPos(endViewportX->value(), endViewportY->value());
367 startViewport->setPolygon(QPolygonF(sp));
368 endViewport->setPolygon(QPolygonF(ep));
372 void TitleWidget::loadTitle() {
373 KUrl url = KFileDialog::getOpenUrl(KUrl(), "*.kdenlivetitle", this, tr("Save Title"));
374 m_titledocument.loadDocument(url, startViewport, endViewport);
377 void TitleWidget::saveTitle() {
378 KUrl url = KFileDialog::getSaveUrl(KUrl(), "*.kdenlivetitle", this, tr("Save Title"));
379 m_titledocument.saveDocument(url, startViewport, endViewport);
382 #include "moc_titlewidget.cpp"