]> git.sesse.net Git - kdenlive/blobdiff - src/titlewidget.cpp
New features: Titles can now be larger than the frame size. Then, you can add a compo...
[kdenlive] / src / titlewidget.cpp
index d8876baee1b957cd39d892de922a20c89ea938b8..e3d1f8251405bc17c9033068787b8267aa88aa71 100644 (file)
@@ -30,6 +30,8 @@
 #include <QTimer>
 #include <QToolBar>
 #include <QMenu>
+#include <QTextBlockFormat>
+#include <QTextCursor>
 
 int settingUp = false;
 
@@ -99,6 +101,10 @@ TitleWidget::TitleWidget(KUrl url, QString projectPath, Render *render, QWidget
     connect(buttonBold, SIGNAL(clicked()), this, SLOT(slotUpdateText()));
     connect(buttonItalic, SIGNAL(clicked()), this, SLOT(slotUpdateText()));
     connect(buttonUnder, SIGNAL(clicked()), this, SLOT(slotUpdateText()));
+    connect(buttonAlignLeft, SIGNAL(clicked()), this, SLOT(slotUpdateText()));
+    connect(buttonAlignRight, SIGNAL(clicked()), this, SLOT(slotUpdateText()));
+    connect(buttonAlignCenter, SIGNAL(clicked()), this, SLOT(slotUpdateText()));
+    connect(buttonAlignNone, SIGNAL(clicked()), this, SLOT(slotUpdateText()));
     connect(displayBg, SIGNAL(stateChanged(int)), this, SLOT(displayBackgroundFrame()));
 
     // mbd
@@ -109,6 +115,13 @@ TitleWidget::TitleWidget(KUrl url, QString projectPath, Render *render, QWidget
     buttonBold->setIcon(KIcon("format-text-bold"));
     buttonItalic->setIcon(KIcon("format-text-italic"));
     buttonUnder->setIcon(KIcon("format-text-underline"));
+    buttonAlignCenter->setIcon(KIcon("format-justify-center"));
+    buttonAlignLeft->setIcon(KIcon("format-justify-left"));
+    buttonAlignRight->setIcon(KIcon("format-justify-right"));
+    buttonAlignNone->setToolTip(i18n("No alignment"));
+    buttonAlignRight->setToolTip(i18n("Align right"));
+    buttonAlignLeft->setToolTip(i18n("Align left"));
+    buttonAlignCenter->setToolTip(i18n("Align center"));
 
     itemhcenter->setIcon(KIcon("kdenlive-align-hor"));
     itemhcenter->setToolTip(i18n("Align item horizontally"));
@@ -458,6 +471,10 @@ void TitleWidget::selectionChanged()
             buttonUnder->blockSignals(true);
             fontColorButton->blockSignals(true);
             textAlpha->blockSignals(true);
+            buttonAlignLeft->blockSignals(true);
+            buttonAlignRight->blockSignals(true);
+            buttonAlignNone->blockSignals(true);
+            buttonAlignCenter->blockSignals(true);
 
             QFont font = i->font();
             font_family->setCurrentFont(font);
@@ -470,6 +487,13 @@ void TitleWidget::selectionChanged()
             fontColorButton->setColor(color);
             textAlpha->setValue(color.alpha());
 
+            QTextCursor cur = i->textCursor();
+            QTextBlockFormat format = cur.blockFormat();
+            if (i->textWidth() == -1) buttonAlignNone->setChecked(true);
+            else if (format.alignment() == Qt::AlignHCenter) buttonAlignCenter->setChecked(true);
+            else if (format.alignment() == Qt::AlignRight) buttonAlignRight->setChecked(true);
+            else if (format.alignment() == Qt::AlignLeft) buttonAlignLeft->setChecked(true);
+
             font_size->blockSignals(false);
             font_family->blockSignals(false);
             buttonBold->blockSignals(false);
@@ -477,6 +501,10 @@ void TitleWidget::selectionChanged()
             buttonUnder->blockSignals(false);
             fontColorButton->blockSignals(false);
             textAlpha->blockSignals(false);
+            buttonAlignLeft->blockSignals(false);
+            buttonAlignRight->blockSignals(false);
+            buttonAlignNone->blockSignals(false);
+            buttonAlignCenter->blockSignals(false);
 
             value_x->setValue((int) i->pos().x());
             value_y->setValue((int) i->pos().y());
@@ -576,9 +604,27 @@ void TitleWidget::slotUpdateText()
     }
     if (!item) return;
     //if (item->textCursor().selection ().isEmpty())
+    QTextCursor cur = item->textCursor();
+    QTextBlockFormat format = cur.blockFormat();
+    if (buttonAlignLeft->isChecked() || buttonAlignCenter->isChecked() || buttonAlignRight->isChecked()) {
+        item->setTextWidth(item->boundingRect().width());
+        if (buttonAlignCenter->isChecked()) format.setAlignment(Qt::AlignHCenter);
+        else if (buttonAlignRight->isChecked()) format.setAlignment(Qt::AlignRight);
+        else if (buttonAlignLeft->isChecked()) format.setAlignment(Qt::AlignLeft);
+    } else {
+        format.setAlignment(Qt::AlignLeft);
+        item->setTextWidth(-1);
+    }
+
     {
         item->setFont(font);
         item->setDefaultTextColor(color);
+        cur.select(QTextCursor::Document);
+        cur.setBlockFormat(format);
+        item->setTextCursor(cur);
+        cur.clearSelection();
+        item->setTextCursor(cur);
+
     }
     /*else {
     QTextDocumentFragment selec = item->textCursor().selection ();
@@ -722,12 +768,18 @@ void TitleWidget::saveTitle(KUrl url)
 
 QDomDocument TitleWidget::xml()
 {
-    return m_titledocument.xml(m_startViewport, m_endViewport);
+    QDomDocument doc = m_titledocument.xml(m_startViewport, m_endViewport);
+    if (cropImage->isChecked()) {
+        doc.documentElement().setAttribute("crop", 1);
+    }
+    return doc;
 }
 
 void TitleWidget::setXml(QDomDocument doc)
 {
     m_count = m_titledocument.loadFromXml(doc, m_startViewport, m_endViewport);
+    QDomElement e = doc.documentElement();
+    cropImage->setChecked(e.hasAttribute("crop"));
     m_transformations.clear();
     QList <QGraphicsItem *> items = graphicsView->scene()->items();
     const double PI = 4.0 * atan(1.0);
@@ -754,7 +806,27 @@ void TitleWidget::setXml(QDomDocument doc)
 
 QImage TitleWidget::renderedPixmap()
 {
-    QImage pix(m_frameWidth, m_frameHeight, QImage::Format_ARGB32);
+    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;
+        }
+    }
+
+    QImage pix(maxX, maxY, QImage::Format_ARGB32);
     pix.fill(Qt::transparent);
     QPainter painter(&pix);
     painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::HighQualityAntialiasing);
@@ -765,7 +837,7 @@ QImage TitleWidget::renderedPixmap()
     m_endViewport->setVisible(false);
     m_frameImage->setVisible(false);
 
-    m_scene->render(&painter, QRectF(), QRectF(0, 0, m_frameWidth, m_frameHeight));
+    m_scene->render(&painter, QRectF(), QRectF(minX, minY, maxX - minX, maxY - minY));
     painter.end();
     m_frameBorder->setPen(framepen);
     m_startViewport->setVisible(true);
@@ -804,6 +876,8 @@ 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();
 
@@ -832,5 +906,7 @@ 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()));
 }