X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Ftitlewidget.cpp;h=b43c4eb24a86dde0cf044296eb22690de79af12e;hb=5b5d7c03796a6e3c9eef6c6573e8aecb0063fae8;hp=c37aad27420fec1cd701c99aedc10ad39e535223;hpb=cfe4e245b6ed270319685bcc948f34490fe8b57d;p=kdenlive diff --git a/src/titlewidget.cpp b/src/titlewidget.cpp index c37aad27..b43c4eb2 100644 --- a/src/titlewidget.cpp +++ b/src/titlewidget.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -37,12 +38,22 @@ #include #include +#if QT_VERSION >= 0x040600 +#include +#include +#include +#endif + int settingUp = false; const int IMAGEITEM = 7; const int RECTITEM = 3; const int TEXTITEM = 8; -static bool insertingValues = false; + +const int NOEFFECT = 0; +const int BLUREFFECT = 1; +const int SHADOWEFFECT = 2; +const int TYPEWRITEREFFECT = 3; TitleWidget::TitleWidget(KUrl url, Timecode tc, QString projectTitlePath, Render *render, QWidget *parent) : QDialog(parent), @@ -57,16 +68,13 @@ TitleWidget::TitleWidget(KUrl url, Timecode tc, QString projectTitlePath, Render { setupUi(this); setFont(KGlobalSettings::toolBarFont()); - //toolBox->setFont(KGlobalSettings::toolBarFont()); frame_properties->setEnabled(false); - rect_properties->setFixedHeight(frame_properties->height() + 4); - no_properties->setFixedHeight(frame_properties->height() + 4); - image_properties->setFixedHeight(frame_properties->height() + 4); - text_properties->setFixedHeight(frame_properties->height() + 4); frame_properties->setFixedHeight(frame_toolbar->height()); + + itemzoom->setSuffix(i18n("%")); m_frameWidth = render->renderWidth(); m_frameHeight = render->renderHeight(); - showToolbars(TITLE_NONE); + showToolbars(TITLE_SELECT); //TODO: get default title duration instead of hardcoded one title_duration->setText(m_tc.getTimecode(GenTime(5000 / 1000.0))); @@ -80,6 +88,8 @@ TitleWidget::TitleWidget(KUrl url, Timecode tc, QString projectTitlePath, Render connect(textAlpha, SIGNAL(valueChanged(int)), this, SLOT(slotUpdateText())); connect(font_weight_box, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdateText())); + connect(font_family, SIGNAL(editTextChanged(const QString &)), this, SLOT(slotFontText(const QString&))); + connect(rectFAlpha, SIGNAL(valueChanged(int)), this, SLOT(rectChanged())); connect(rectBAlpha, SIGNAL(valueChanged(int)), this, SLOT(rectChanged())); connect(rectFColor, SIGNAL(clicked()), this, SLOT(rectChanged())); @@ -93,6 +103,12 @@ TitleWidget::TitleWidget(KUrl url, Timecode tc, QString projectTitlePath, Render connect(endViewportY, SIGNAL(valueChanged(int)), this, SLOT(setupViewports())); connect(endViewportSize, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));*/ + // Fill effects + effect_list->addItem(i18n("None"), NOEFFECT); + effect_list->addItem(i18n("Typewriter"), TYPEWRITEREFFECT); + effect_list->addItem(i18n("Blur"), BLUREFFECT); + + connect(zValue, SIGNAL(valueChanged(int)), this, SLOT(zIndexChanged(int))); connect(itemzoom, SIGNAL(valueChanged(int)), this, SLOT(itemScaled(int))); connect(itemrotate, SIGNAL(valueChanged(int)), this, SLOT(itemRotate(int))); @@ -102,6 +118,15 @@ TitleWidget::TitleWidget(KUrl url, Timecode tc, QString projectTitlePath, Render connect(itembottom, SIGNAL(clicked()), this, SLOT(itemBottom())); connect(itemleft, SIGNAL(clicked()), this, SLOT(itemLeft())); connect(itemright, SIGNAL(clicked()), this, SLOT(itemRight())); + connect(effect_list, SIGNAL(currentIndexChanged(int)), this, SLOT(slotAddEffect(int))); + connect(typewriter_delay, SIGNAL(valueChanged(int)), this, SLOT(slotEditTypewriter(int))); + connect(typewriter_start, SIGNAL(valueChanged(int)), this, SLOT(slotEditTypewriter(int))); + connect(blur_radius, SIGNAL(valueChanged(int)), this, SLOT(slotEditBlur(int))); + connect(shadow_radius, SIGNAL(valueChanged(int)), this, SLOT(slotEditShadow())); + connect(shadow_x, SIGNAL(valueChanged(int)), this, SLOT(slotEditShadow())); + connect(shadow_y, SIGNAL(valueChanged(int)), this, SLOT(slotEditShadow())); + effect_stack->setHidden(true); + effect_frame->setEnabled(false); connect(origin_x_left, SIGNAL(clicked()), this, SLOT(slotOriginXClicked())); connect(origin_y_top, SIGNAL(clicked()), this, SLOT(slotOriginYClicked())); @@ -191,8 +216,10 @@ TitleWidget::TitleWidget(KUrl url, Timecode tc, QString projectTitlePath, Render QHBoxLayout *layout = new QHBoxLayout; frame_toolbar->setLayout(layout); - layout->setContentsMargins(2, 2, 2, 2); + layout->setContentsMargins(0, 0, 0, 0); QToolBar *m_toolbar = new QToolBar("titleToolBar", this); + int s = style()->pixelMetric(QStyle::PM_SmallIconSize); + m_toolbar->setIconSize(QSize(s, s)); m_buttonCursor = m_toolbar->addAction(KIcon("transform-move"), QString()); m_buttonCursor->setCheckable(true); @@ -295,6 +322,8 @@ TitleWidget::TitleWidget(KUrl url, Timecode tc, QString projectTitlePath, Render initAnimation(); connect(anim_start, SIGNAL(toggled(bool)), this, SLOT(slotAnimStart(bool))); connect(anim_end, SIGNAL(toggled(bool)), this, SLOT(slotAnimEnd(bool))); + + buttonBox->button(QDialogButtonBox::Ok)->setEnabled(KdenliveSettings::hastitleproducer()); } TitleWidget::~TitleWidget() @@ -334,6 +363,7 @@ QStringList TitleWidget::getFreeTitleInfo(const KUrl &projectUrl, bool isClone) return result; } +// static QString TitleWidget::getTitleResourceFromName(const KUrl &projectUrl, const QString &titleName) { QStringList result; @@ -342,6 +372,22 @@ QString TitleWidget::getTitleResourceFromName(const KUrl &projectUrl, const QStr return titlePath + titleName + ".png"; } +// static +QStringList TitleWidget::extractImageList(QString xml) +{ + QStringList result; + if (xml.isEmpty()) return result; + QDomDocument doc; + doc.setContent(xml); + QDomNodeList images = doc.elementsByTagName("content"); + for (int i = 0; i < images.count(); i++) { + if (images.at(i).toElement().hasAttribute("url")) + result.append(images.at(i).toElement().attribute("url")); + } + return result; +} + + //virtual void TitleWidget::resizeEvent(QResizeEvent * /*event*/) { @@ -386,7 +432,7 @@ void TitleWidget::slotSelectTool() enableToolbars(t); if (t == TITLE_RECTANGLE && (l.at(0) == m_endViewport || l.at(0) == m_startViewport)) { //graphicsView->centerOn(l.at(0)); - t = TITLE_NONE; + t = TITLE_SELECT; } showToolbars(t); @@ -401,7 +447,9 @@ void TitleWidget::slotSelectTool() void TitleWidget::slotImageTool() { - KUrl url = KFileDialog::getOpenUrl(KUrl(), "*.svg *.png *.jpg *.jpeg *.gif *.raw", this, i18n("Load Image")); + // TODO: find a way to get a list of all supported image types... + QString allExtensions = "image/gif image/jpeg image/png image/x-tga image/x-bmp image/svg+xml image/tiff image/x-xcf-gimp image/x-vnd.adobe.photoshop image/x-pcx image/x-exr"; + KUrl url = KFileDialog::getOpenUrl(KUrl(), allExtensions, this, i18n("Load Image")); //"*.svg *.png *.jpg *.jpeg *.gif *.raw" if (!url.isEmpty()) { if (url.path().endsWith(".svg")) { QGraphicsSvgItem *svg = new QGraphicsSvgItem(url.toLocalFile()); @@ -421,77 +469,21 @@ void TitleWidget::slotImageTool() } m_scene->setTool(TITLE_SELECT); showToolbars(TITLE_SELECT); - checkButton(TITLE_NONE); + checkButton(TITLE_SELECT); } void TitleWidget::showToolbars(TITLETOOL toolType) { - switch (toolType) { - case TITLE_TEXT: - rect_properties->setHidden(true); - image_properties->setHidden(true); - no_properties->setHidden(true); - text_properties->setHidden(false); - break; - case TITLE_RECTANGLE: - image_properties->setHidden(true); - no_properties->setHidden(true); - text_properties->setHidden(true); - rect_properties->setHidden(false); - break; - case TITLE_IMAGE: - no_properties->setHidden(true); - text_properties->setHidden(true); - rect_properties->setHidden(true); - image_properties->setHidden(false); - break; - default: - text_properties->setHidden(true); - rect_properties->setHidden(true); - image_properties->setHidden(true); - no_properties->setHidden(false); - break; - } + toolbar_stack->setCurrentIndex((int) toolType); } void TitleWidget::enableToolbars(TITLETOOL toolType) { // TITLETOOL is defined in graphicsscenerectmove.h - bool bFrame = false; - bool bText = false; - bool bRect = false; - bool bImage = false; - bool bValue_w = false; - bool bValue_h = false; - - switch (toolType) { - case TITLE_SELECT: - break; - case TITLE_TEXT: - bFrame = true; - bText = true; - break; - case TITLE_RECTANGLE: - bFrame = true; - bRect = true; - bValue_w = true; - bValue_h = true; - break; - case TITLE_IMAGE: - bFrame = true; - bValue_w = true; - bValue_h = true; - bImage = true; - break; - default: - break; - } - frame_properties->setEnabled(bFrame); - text_properties->setEnabled(bText); - rect_properties->setEnabled(bRect); - image_properties->setEnabled(bImage); - value_w->setEnabled(bValue_w); - value_h->setEnabled(bValue_h); + bool enable = false; + if (toolType == TITLE_RECTANGLE || toolType == TITLE_IMAGE) enable = true; + value_w->setEnabled(enable); + value_h->setEnabled(enable); } void TitleWidget::checkButton(TITLETOOL toolType) @@ -514,7 +506,7 @@ void TitleWidget::checkButton(TITLETOOL toolType) case TITLE_IMAGE: bImage = true; break; - case TITLE_NONE: + default: break; } @@ -543,7 +535,7 @@ void TitleWidget::displayBackgroundFrame() p.end(); m_frameImage->setPixmap(bg); } else { - m_frameImage->setPixmap(m_render->extractFrame((int) m_render->seekPosition().frames(m_render->fps()), m_frameWidth / 2, m_frameHeight / 2)); + m_frameImage->setPixmap(QPixmap::fromImage(m_render->extractFrame((int) m_render->seekPosition().frames(m_render->fps()), m_frameWidth / 2, m_frameHeight / 2))); } } @@ -676,6 +668,9 @@ void TitleWidget::selectionChanged() itemzoom->blockSignals(true); itemrotate->blockSignals(true); if (l.size() == 0) { + effect_stack->setHidden(true); + effect_frame->setEnabled(false); + effect_list->setCurrentIndex(0); bool blockX = !origin_x_left->signalsBlocked(); bool blockY = !origin_y_top->signalsBlocked(); if (blockX) origin_x_left->blockSignals(true); @@ -684,22 +679,62 @@ void TitleWidget::selectionChanged() origin_y_top->setChecked(false); updateTextOriginX(); updateTextOriginY(); - enableToolbars(TITLE_NONE); + enableToolbars(TITLE_SELECT); if (blockX) origin_x_left->blockSignals(false); if (blockY) origin_y_top->blockSignals(false); itemzoom->setEnabled(false); itemrotate->setEnabled(false); + frame_properties->setEnabled(false); } else if (l.size() == 1) { + effect_frame->setEnabled(true); + frame_properties->setEnabled(true); if (l.at(0) != m_startViewport && l.at(0) != m_endViewport) { itemzoom->setEnabled(true); itemrotate->setEnabled(true); } else { itemzoom->setEnabled(false); itemrotate->setEnabled(false); + updateInfoText(); } if (l.at(0)->type() == TEXTITEM) { showToolbars(TITLE_TEXT); QGraphicsTextItem* i = static_cast (l.at(0)); + if (!i->data(100).isNull()) { + // Item has an effect + QStringList effdata = i->data(100).toStringList(); + QString effectName = effdata.takeFirst(); + if (effectName == "typewriter") { + QStringList params = effdata.at(0).split(';'); + typewriter_delay->setValue(params.at(0).toInt()); + typewriter_start->setValue(params.at(1).toInt()); + effect_list->setCurrentIndex(effect_list->findData((int) TYPEWRITEREFFECT)); + effect_stack->setHidden(false); + } + } else { + if (i->graphicsEffect()) { + QGraphicsBlurEffect *blur = static_cast (i->graphicsEffect()); + if (blur) { + effect_list->setCurrentIndex(effect_list->findData((int) BLUREFFECT)); + int rad = (int) blur->blurRadius(); + blur_radius->setValue(rad); + effect_stack->setHidden(false); + } else { + QGraphicsDropShadowEffect *shad = static_cast (i->graphicsEffect()); + if (shad) { + effect_list->setCurrentIndex(effect_list->findData((int) SHADOWEFFECT)); + shadow_radius->setValue(shad->blurRadius()); + shadow_x->setValue(shad->xOffset()); + shadow_y->setValue(shad->yOffset()); + effect_stack->setHidden(false); + } + } + } else { + effect_list->blockSignals(true); + effect_list->setCurrentIndex(effect_list->findData((int) NOEFFECT)); + effect_list->blockSignals(false); + effect_stack->setHidden(true); + } + } //if (l[0]->hasFocus()) //toolBox->setCurrentIndex(0); //toolBox->setItemEnabled(2, true); @@ -758,7 +793,7 @@ void TitleWidget::selectionChanged() /*toolBox->setCurrentIndex(3); toolBox->widget(0)->setEnabled(false); toolBox->widget(1)->setEnabled(false);*/ - enableToolbars(TITLE_NONE); + enableToolbars(TITLE_SELECT); } else { /*toolBox->widget(0)->setEnabled(true); toolBox->widget(1)->setEnabled(true); @@ -792,11 +827,9 @@ void TitleWidget::selectionChanged() } else { //toolBox->setCurrentIndex(0); - showToolbars(TITLE_NONE); - enableToolbars(TITLE_NONE); - /*frame_properties->setEnabled(false); - text_properties->setEnabled(false); - rect_properties->setEnabled(false);*/ + showToolbars(TITLE_SELECT); + enableToolbars(TITLE_SELECT); + frame_properties->setEnabled(false); } zValue->setValue((int)l.at(0)->zValue()); itemzoom->setValue((int)(m_transformations.value(l.at(0)).scalex * 100.0 + 0.5)); @@ -1444,7 +1477,18 @@ void TitleWidget::saveTitle(KUrl url) { if (anim_start->isChecked()) slotAnimStart(false); if (anim_end->isChecked()) slotAnimEnd(false); - if (url.isEmpty()) url = KFileDialog::getSaveUrl(KUrl(m_projectTitlePath), "application/x-kdenlivetitle", this, i18n("Save Title")); + if (url.isEmpty()) { + KFileDialog *fs = new KFileDialog(KUrl(m_projectTitlePath), "application/x-kdenlivetitle", this); + fs->setOperationMode(KFileDialog::Saving); + fs->setMode(KFile::File); +#if KDE_IS_VERSION(4,2,0) + fs->setConfirmOverwrite(true); +#endif + fs->setKeepLocation(true); + fs->exec(); + url = fs->selectedUrl(); + delete fs; + } if (!url.isEmpty()) { if (m_titledocument.saveDocument(url, m_startViewport, m_endViewport, m_tc.getFrameCount(title_duration->text())) == false) KMessageBox::error(this, i18n("Cannot write to file %1", url.path())); @@ -1455,9 +1499,6 @@ QDomDocument TitleWidget::xml() { QDomDocument doc = m_titledocument.xml(m_startViewport, m_endViewport); doc.documentElement().setAttribute("out", m_tc.getFrameCount(title_duration->text())); - if (cropImage->isChecked()) { - doc.documentElement().setAttribute("crop", 1); - } return doc; } @@ -1479,7 +1520,6 @@ void TitleWidget::setXml(QDomDocument doc) else title_duration->setText(m_tc.getTimecode(GenTime(5000)));*/ QDomElement e = doc.documentElement(); - cropImage->setChecked(e.hasAttribute("crop")); m_transformations.clear(); QList items = graphicsView->scene()->items(); const double PI = 4.0 * atan(1.0); @@ -1512,54 +1552,6 @@ void TitleWidget::setXml(QDomDocument doc) slotSelectTool(); } -const QRect TitleWidget::renderedRect() -{ - int minX = 0; - int minY = 0; - int maxX = m_frameWidth; - int maxY = m_frameHeight; - if (!cropImage->isChecked()) { - m_scene->removeItem(m_startViewport); - m_scene->removeItem(m_endViewport); - QRect boundingRect = m_scene->itemsBoundingRect().toRect(); - if (boundingRect.left() < 0) minX = boundingRect.left(); - if (boundingRect.top() < 0) minY = boundingRect.top(); - if (boundingRect.right() > maxX) maxX = boundingRect.right(); - if (boundingRect.bottom() > maxY) maxY = boundingRect.bottom(); - if (minX < 0) { - maxX = maxX - minX; - } - if (minY < 0) { - maxY = maxY - minY; - } - } - QRect rect(minX, minY, maxX, maxY); - return rect; -} - -QImage TitleWidget::renderedPixmap() -{ - QRect rect = renderedRect(); - QImage pix(rect.width(), rect.height(), QImage::Format_ARGB32); - pix.fill(Qt::transparent); - QPainter painter(&pix); - painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::HighQualityAntialiasing); - m_scene->clearTextSelection(); - QPen framepen = m_frameBorder->pen(); - m_frameBorder->setPen(Qt::NoPen); - m_startViewport->setVisible(false); - m_endViewport->setVisible(false); - m_frameImage->setVisible(false); - - m_scene->render(&painter, QRectF(), rect); //QRectF(minX, minY, maxX - minX, maxY - minY)); - painter.end(); - m_frameBorder->setPen(framepen); - m_startViewport->setVisible(true); - m_endViewport->setVisible(true); - m_frameImage->setVisible(true); - return pix; -} - /** \brief Connected to the accepted signal - calls writeChoices */ void TitleWidget::slotAccepted() { @@ -1593,8 +1585,6 @@ void TitleWidget::writeChoices() titleConfig.writeEntry("background_color", kcolorbutton->color()); titleConfig.writeEntry("background_alpha", horizontalSlider->value()); - titleConfig.writeEntry("crop_image", cropImage->isChecked()); - //! \todo Not sure if I should sync - it is probably safe to do it config->sync(); @@ -1626,8 +1616,6 @@ void TitleWidget::readChoices() kcolorbutton->setColor(titleConfig.readEntry("background_color", kcolorbutton->color())); horizontalSlider->setValue(titleConfig.readEntry("background_alpha", horizontalSlider->value())); - - cropImage->setChecked(titleConfig.readEntry("crop_image", cropImage->isChecked())); } void TitleWidget::adjustFrameSize() @@ -1657,7 +1645,7 @@ void TitleWidget::slotAnimStart(bool anim) itemzoom->setEnabled(!anim); itemrotate->setEnabled(!anim); frame_toolbar->setEnabled(!anim); - rect_properties->setEnabled(!anim); + toolbar_stack->setEnabled(!anim); if (anim) { keep_aspect->setChecked(!m_startViewport->data(0).isNull()); m_startViewport->setZValue(1100); @@ -1668,10 +1656,12 @@ void TitleWidget::slotAnimStart(bool anim) m_startViewport->setSelected(true); selectionChanged(); slotSelectTool(); + if (m_startViewport->childItems().isEmpty()) addAnimInfoText(); } else { m_startViewport->setZValue(-1000); m_startViewport->setBrush(QBrush()); m_startViewport->setFlags(0); + if (!anim_end->isChecked()) deleteAnimInfoText(); } } @@ -1695,7 +1685,7 @@ void TitleWidget::slotAnimEnd(bool anim) itemzoom->setEnabled(!anim); itemrotate->setEnabled(!anim); frame_toolbar->setEnabled(!anim); - rect_properties->setEnabled(!anim); + toolbar_stack->setEnabled(!anim); if (anim) { keep_aspect->setChecked(!m_endViewport->data(0).isNull()); m_endViewport->setZValue(1100); @@ -1706,13 +1696,70 @@ void TitleWidget::slotAnimEnd(bool anim) m_endViewport->setSelected(true); selectionChanged(); slotSelectTool(); + if (m_endViewport->childItems().isEmpty()) addAnimInfoText(); } else { m_endViewport->setZValue(-1000); m_endViewport->setBrush(QBrush()); m_endViewport->setFlags(0); + if (!anim_start->isChecked()) deleteAnimInfoText(); + } +} + +void TitleWidget::addAnimInfoText() +{ + // add text to anim viewport + QGraphicsTextItem *t = new QGraphicsTextItem(i18n("Start"), m_startViewport); + QGraphicsTextItem *t2 = new QGraphicsTextItem(i18n("End"), m_endViewport); + QFont font = t->font(); + font.setPixelSize(m_startViewport->rect().width() / 10); + QColor col = m_startViewport->pen().color(); + col.setAlpha(255); + t->setDefaultTextColor(col); + t->setFont(font); + font.setPixelSize(m_endViewport->rect().width() / 10); + col = m_endViewport->pen().color(); + col.setAlpha(255); + t2->setDefaultTextColor(col); + t2->setFont(font); +} + +void TitleWidget::updateInfoText() +{ + // update info text font + if (!m_startViewport->childItems().isEmpty()) { + QGraphicsTextItem *item = static_cast (m_startViewport->childItems().at(0)); + if (item) { + QFont font = item->font(); + font.setPixelSize(m_startViewport->rect().width() / 10); + item->setFont(font); + } + } + if (!m_endViewport->childItems().isEmpty()) { + QGraphicsTextItem *item = static_cast (m_endViewport->childItems().at(0)); + if (item) { + QFont font = item->font(); + font.setPixelSize(m_endViewport->rect().width() / 10); + item->setFont(font); + } } } +void TitleWidget::deleteAnimInfoText() +{ + // end animation editing, remove info text + while (!m_startViewport->childItems().isEmpty()) { + QGraphicsItem *item = m_startViewport->childItems().at(0); + m_scene->removeItem(item); + delete item; + } + while (!m_endViewport->childItems().isEmpty()) { + QGraphicsItem *item = m_endViewport->childItems().at(0); + m_scene->removeItem(item); + delete item; + } +} + + void TitleWidget::slotKeepAspect(bool keep) { if (m_endViewport->zValue() == 1100) { @@ -1745,5 +1792,91 @@ void TitleWidget::slotResize200() } else m_startViewport->setRect(0, 0, m_frameWidth * 2, m_frameHeight * 2); } +void TitleWidget::slotAddEffect(int ix) +{ + QList l = graphicsView->scene()->selectedItems(); + int effect = effect_list->itemData(ix).toInt(); + if (effect == NOEFFECT) { + if (l.size() == 1) l[0]->setData(100, QVariant()); + effect_stack->setHidden(true); + return; + } + effect_stack->setCurrentIndex(effect - 1); + effect_stack->setHidden(false); + if (effect == TYPEWRITEREFFECT) { + if (l.size() == 1 && l.at(0)->type() == TEXTITEM) { + QStringList effdata = QStringList() << "typewriter" << QString::number(typewriter_delay->value()) + ";" + QString::number(typewriter_start->value()); + l[0]->setData(100, effdata); + } + } +#if QT_VERSION < 0x040600 + return; +#else + if (effect == BLUREFFECT) { + // Blur effect + if (l.size() == 1) { + QGraphicsEffect *eff = new QGraphicsBlurEffect(); + l[0]->setGraphicsEffect(eff); + } + } else if (effect == SHADOWEFFECT) { + if (l.size() == 1) { + QGraphicsEffect *eff = new QGraphicsDropShadowEffect(); + l[0]->setGraphicsEffect(eff); + } + } + +#endif +} + +void TitleWidget::slotFontText(const QString& s) +{ + const QFont f(s); + if (f.exactMatch()) { + // Font really exists (could also just be a «d» if the user + // starts typing «dejavu» for example). + font_family->setCurrentFont(f); + } + // TODO: typing dejavu serif does not recognize the font (takes sans). + // upper/lowercase problem? +} + +void TitleWidget::slotEditTypewriter(int ix) +{ + QList l = graphicsView->scene()->selectedItems(); + if (l.size() == 1) { + QStringList effdata = QStringList() << "typewriter" << QString::number(typewriter_delay->value()) + ";" + QString::number(typewriter_start->value()); + l[0]->setData(100, effdata); + } +} +void TitleWidget::slotEditBlur(int ix) +{ +#if QT_VERSION < 0x040600 + return; +#else + QList l = graphicsView->scene()->selectedItems(); + if (l.size() == 1) { + QGraphicsEffect *eff = l[0]->graphicsEffect(); + QGraphicsBlurEffect *blur = static_cast (eff); + if (blur) blur->setBlurRadius(ix); + } +#endif +} + +void TitleWidget::slotEditShadow() +{ +#if QT_VERSION < 0x040600 + return; +#else + QList l = graphicsView->scene()->selectedItems(); + if (l.size() == 1) { + QGraphicsEffect *eff = l[0]->graphicsEffect(); + QGraphicsDropShadowEffect *shadow = static_cast (eff); + if (shadow) { + shadow->setBlurRadius(shadow_radius->value()); + shadow->setOffset(shadow_x->value(), shadow_y->value()); + } + } +#endif +}