X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fdvdwizardmenu.cpp;h=3abced6481cfb5c088cb3182d8775042c7e9cbb7;hb=f2f647f6220099121190250e89983e1585bf3cef;hp=38ac05a719ee74df68a56523817680411d6a3736;hpb=71e41ad0c197e2e2eb033dff7800427f64d3428f;p=kdenlive diff --git a/src/dvdwizardmenu.cpp b/src/dvdwizardmenu.cpp index 38ac05a7..3abced64 100644 --- a/src/dvdwizardmenu.cpp +++ b/src/dvdwizardmenu.cpp @@ -30,11 +30,14 @@ #include "kthumb.h" -DvdWizardMenu::DvdWizardMenu(const QString &profile, QWidget *parent) : +enum { DvdButtonItem = QGraphicsItem::UserType + 1, DvdButtonUnderlineItem = QGraphicsItem::UserType + 2 }; + +DvdWizardMenu::DvdWizardMenu(DVDFORMAT format, QWidget *parent) : QWizardPage(parent), m_color(NULL), m_safeRect(NULL), - m_finalSize(720, 576) + m_finalSize(720, 576), + m_movieLength(-1) { m_view.setupUi(this); m_view.play_text->setText(i18n("Play")); @@ -60,9 +63,7 @@ DvdWizardMenu::DvdWizardMenu(const QString &profile, QWidget *parent) : m_view.add_button->setToolTip(i18n("Add new button")); m_view.delete_button->setToolTip(i18n("Delete current button")); - if (profile == "dv_ntsc" || profile == "dv_ntsc_wide") { - changeProfile(false); - } else changeProfile(true); + changeProfile(format); // Create color background @@ -123,7 +124,7 @@ DvdWizardMenu::DvdWizardMenu(const QString &profile, QWidget *parent) : connect(m_view.background_image, SIGNAL(textChanged(const QString &)), this, SLOT(buildImage())); connect(m_view.background_color, SIGNAL(changed(const QColor &)), this, SLOT(buildColor())); - connect(m_view.background_list, SIGNAL(activated(int)), this, SLOT(checkBackgroundType(int))); + connect(m_view.background_list, SIGNAL(currentIndexChanged(int)), this, SLOT(checkBackgroundType(int))); connect(m_view.target_list, SIGNAL(activated(int)), this, SLOT(setButtonTarget(int))); connect(m_view.back_to_menu, SIGNAL(toggled(bool)), this, SLOT(setBackToMenu(bool))); @@ -159,7 +160,7 @@ void DvdWizardMenu::slotEnableShadows(int enable) #if KDE_IS_VERSION(4,6,0) QList list = m_scene->items(); for (int i = 0; i < list.count(); i++) { - if (list.at(i)->type() == QGraphicsItem::UserType + 1) { + if (list.at(i)->type() == DvdButtonItem) { if (enable) { QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this); shadow->setBlurRadius(7); @@ -182,7 +183,7 @@ bool DvdWizardMenu::isComplete() const int buttonCount = 0; // check that the menu buttons don't collide for (int i = 0; i < list.count(); i++) { - if (list.at(i)->type() == QGraphicsItem::UserType + 1) { + if (list.at(i)->type() == DvdButtonItem) { buttonCount++; DvdButton *button = static_cast < DvdButton* >(list.at(i)); QList collisions = button->collidingItems(); @@ -260,7 +261,7 @@ void DvdWizardMenu::setButtonTarget(int ix) { QList list = m_scene->selectedItems(); for (int i = 0; i < list.count(); i++) { - if (list.at(i)->type() == QGraphicsItem::UserType + 1) { + if (list.at(i)->type() == DvdButtonItem) { DvdButton *button = static_cast < DvdButton* >(list.at(i)); button->setTarget(ix, m_view.target_list->itemData(ix).toString()); break; @@ -273,7 +274,7 @@ void DvdWizardMenu::setBackToMenu(bool backToMenu) { QList list = m_scene->selectedItems(); for (int i = 0; i < list.count(); i++) { - if (list.at(i)->type() == QGraphicsItem::UserType + 1) { + if (list.at(i)->type() == DvdButtonItem) { DvdButton *button = static_cast < DvdButton* >(list.at(i)); button->setBackMenu(backToMenu); break; @@ -287,7 +288,7 @@ void DvdWizardMenu::buttonChanged() QList list = m_scene->selectedItems(); bool foundButton = false; for (int i = 0; i < list.count(); i++) { - if (list.at(i)->type() == QGraphicsItem::UserType + 1) { + if (list.at(i)->type() == DvdButtonItem) { m_view.play_text->blockSignals(true); m_view.font_size->blockSignals(true); m_view.font_family->blockSignals(true); @@ -329,10 +330,10 @@ void DvdWizardMenu::addButton() #endif //font.setStyleStrategy(QFont::NoAntialias); button->setFont(font); + button->setDefaultTextColor(m_view.text_color->color()); button->setZValue(4); QRectF r = button->sceneBoundingRect(); m_scene->addItem(button); - updateColor(m_view.text_color->color()); button->setPos((m_width - r.width()) / 2, (m_height - r.height()) / 2); button->setSelected(true); } @@ -341,24 +342,36 @@ void DvdWizardMenu::deleteButton() { QList list = m_scene->selectedItems(); for (int i = 0; i < list.count(); i++) { - if (list.at(i)->type() == QGraphicsItem::UserType + 1) { + if (list.at(i)->type() == DvdButtonItem) { delete list.at(i); break; } } } -void DvdWizardMenu::changeProfile(bool isPal) -{ - m_isPal = isPal; - if (isPal == false) { - m_finalSize = QSize(720, 480); - m_width = 640; - m_height = 480; - } else { - m_finalSize = QSize(720, 576); - m_width = 768; - m_height = 576; +void DvdWizardMenu::changeProfile(DVDFORMAT format) +{ + m_format = format; + switch (m_format) { + case PAL_WIDE: + m_finalSize = QSize(720, 576); + m_width = 1024; + m_height = 576; + break; + case NTSC_WIDE: + m_finalSize = QSize(720, 480); + m_width = 853; + m_height = 480; + break; + case NTSC: + m_finalSize = QSize(720, 480); + m_width = 640; + m_height = 480; + break; + default: + m_finalSize = QSize(720, 576); + m_width = 768; + m_height = 576; } updatePreview(); } @@ -441,11 +454,16 @@ void DvdWizardMenu::buildImage() pix = pix.scaled(m_width, m_height); } else if (m_view.background_list->currentIndex() == 2) { // video background - int w; - if (m_isPal) w = 768; - else w = 640; - pix = KThumb::getImage(m_view.background_image->url(), 0, w, m_height); - pix = pix.scaled(m_width, m_height); + m_movieLength = -1; + QString profileName = DvdWizardVob::getDvdProfile(m_format); + Mlt::Profile profile(profileName.toUtf8().constData()); + profile.set_explicit(true); + Mlt::Producer *producer = new Mlt::Producer(profile, m_view.background_image->url().path().toUtf8().data()); + if (producer && producer->is_valid()) { + pix = QPixmap::fromImage(KThumb::getFrame(producer, 0, m_finalSize.width(), m_width, m_height)); + m_movieLength = producer->get_length(); + } + if (producer) delete producer; } m_background->setPixmap(pix); m_scene->addItem(m_background); @@ -465,7 +483,7 @@ void DvdWizardMenu::buildButton() DvdButton *button = NULL; QList list = m_scene->selectedItems(); for (int i = 0; i < list.count(); i++) { - if (list.at(i)->type() == QGraphicsItem::UserType + 1) { + if (list.at(i)->type() == DvdButtonItem) { button = static_cast < DvdButton* >(list.at(i)); break; } @@ -489,7 +507,7 @@ void DvdWizardMenu::prepareUnderLines() { QList list = m_scene->items(); for (int i = 0; i < list.count(); i++) { - if (list.at(i)->type() == QGraphicsItem::UserType + 1) { + if (list.at(i)->type() == DvdButtonItem) { QRectF r = list.at(i)->sceneBoundingRect(); int bottom = r.bottom() - 1; if (bottom % 2 == 1) bottom = bottom - 1; @@ -498,9 +516,9 @@ void DvdWizardMenu::prepareUnderLines() underlineHeight = qMin(underlineHeight, 10); underlineHeight = qMax(underlineHeight, 2); r.setTop(bottom - underlineHeight); + r.setBottom(bottom); r.adjust(2, 0, -2, 0); - QGraphicsRectItem *underline = new QGraphicsRectItem(r); - underline->setData(Qt::UserRole, QString("underline")); + DvdButtonUnderline *underline = new DvdButtonUnderline(r); m_scene->addItem(underline); list.at(i)->setVisible(false); } @@ -512,10 +530,10 @@ void DvdWizardMenu::resetUnderLines() QList list = m_scene->items(); QList toDelete; for (int i = 0; i < list.count(); i++) { - if (list.at(i)->data(Qt::UserRole).toString() == "underline") { + if (list.at(i)->type() == DvdButtonUnderlineItem) { toDelete.append(list.at(i)); } - if (list.at(i)->type() == QGraphicsItem::UserType + 1) { + if (list.at(i)->type() == DvdButtonItem) { list.at(i)->setVisible(true); } } @@ -529,8 +547,8 @@ void DvdWizardMenu::updateUnderlineColor(QColor c) { QList list = m_scene->items(); for (int i = 0; i < list.count(); i++) { - if (list.at(i)->data(Qt::UserRole).toString() == "underline") { - QGraphicsRectItem *underline = static_cast < QGraphicsRectItem* >(list.at(i)); + if (list.at(i)->type() == DvdButtonUnderlineItem) { + DvdButtonUnderline *underline = static_cast < DvdButtonUnderline* >(list.at(i)); underline->setPen(Qt::NoPen); c.setAlpha(150); underline->setBrush(c); @@ -544,7 +562,7 @@ void DvdWizardMenu::updateColor(QColor c) DvdButton *button = NULL; QList list = m_scene->items(); for (int i = 0; i < list.count(); i++) { - if (list.at(i)->type() == QGraphicsItem::UserType + 1) { + if (list.at(i)->type() == DvdButtonItem) { button = static_cast < DvdButton* >(list.at(i)); button->setDefaultTextColor(c); } @@ -552,10 +570,19 @@ void DvdWizardMenu::updateColor(QColor c) } -void DvdWizardMenu::createButtonImages(const QString &img1, const QString &img2, const QString &img3) +void DvdWizardMenu::createButtonImages(const QString &selected_image, const QString &highlighted_image, bool letterbox) { if (m_view.create_menu->isChecked()) { m_scene->clearSelection(); + QRectF source(0, 0, m_width, m_height); + QRectF target; + if (!letterbox) target = QRectF(0, 0, m_finalSize.width(), m_finalSize.height()); + else { + // Scale the button images to fit a letterbox image + double factor = (double) m_width / m_finalSize.width(); + int letterboxHeight = m_height / factor; + target = QRectF(0, (m_finalSize.height() - letterboxHeight) / 2, m_finalSize.width(), letterboxHeight); + } if (m_safeRect->scene() != 0) m_scene->removeItem(m_safeRect); if (m_color->scene() != 0) m_scene->removeItem(m_color); if (m_background->scene() != 0) m_scene->removeItem(m_background); @@ -563,36 +590,17 @@ void DvdWizardMenu::createButtonImages(const QString &img1, const QString &img2, #if QT_VERSION >= 0x040800 QImage img(m_finalSize.width(), m_finalSize.height(), QImage::Format_ARGB32); img.fill(Qt::transparent); - updateUnderlineColor(m_view.text_color->color()); + updateUnderlineColor(m_view.highlighted_color->color()); #else QImage img(m_finalSize.width(), m_finalSize.height(), QImage::Format_Mono); img.fill(Qt::white); updateUnderlineColor(Qt::black); #endif - QPainter p(&img); - //p.setRenderHints(QPainter::Antialiasing, false); - //p.setRenderHints(QPainter::TextAntialiasing, false); - m_scene->render(&p, QRectF(0, 0, m_finalSize.width(), m_finalSize.height()), QRectF(0, 0, m_width, m_height), Qt::IgnoreAspectRatio); - p.end(); -#if QT_VERSION >= 0x040800 -#elif QT_VERSION >= 0x040600 - img.setColor(0, m_view.text_color->color().rgb()); - img.setColor(1, qRgba(0,0,0,0)); -#else - img.setNumColors(4); -#endif - img.save(img1); - -#if QT_VERSION >= 0x040800 - img.fill(Qt::transparent); - updateUnderlineColor(m_view.highlighted_color->color()); -#else - img.fill(Qt::white); -#endif + QPainter p; p.begin(&img); //p.setRenderHints(QPainter::Antialiasing, false); //p.setRenderHints(QPainter::TextAntialiasing, false); - m_scene->render(&p, QRectF(0, 0, m_finalSize.width(), m_finalSize.height()), QRectF(0, 0, m_width, m_height), Qt::IgnoreAspectRatio); + m_scene->render(&p, target, source, Qt::IgnoreAspectRatio); p.end(); #if QT_VERSION >= 0x040800 #elif QT_VERSION >= 0x040600 @@ -601,7 +609,7 @@ void DvdWizardMenu::createButtonImages(const QString &img1, const QString &img2, #else img.setNumColors(4); #endif - img.save(img3); + img.save(highlighted_image); #if QT_VERSION >= 0x040800 img.fill(Qt::transparent); @@ -612,7 +620,7 @@ void DvdWizardMenu::createButtonImages(const QString &img1, const QString &img2, p.begin(&img); //p.setRenderHints(QPainter::Antialiasing, false); //p.setRenderHints(QPainter::TextAntialiasing, false); - m_scene->render(&p, QRectF(0, 0, m_finalSize.width(), m_finalSize.height()), QRectF(0, 0, m_width, m_height), Qt::IgnoreAspectRatio); + m_scene->render(&p, target, source, Qt::IgnoreAspectRatio); p.end(); #if QT_VERSION >= 0x040800 #elif QT_VERSION >= 0x040600 @@ -621,7 +629,7 @@ void DvdWizardMenu::createButtonImages(const QString &img1, const QString &img2, #else img.setNumColors(4); #endif - img.save(img2); + img.save(selected_image); resetUnderLines(); m_scene->addItem(m_safeRect); m_scene->addItem(m_color); @@ -630,48 +638,44 @@ void DvdWizardMenu::createButtonImages(const QString &img1, const QString &img2, } -void DvdWizardMenu::createBackgroundImage(const QString &overlayMenu, const QString &img1) +void DvdWizardMenu::createBackgroundImage(const QString &img1, bool letterbox) { m_scene->clearSelection(); if (m_safeRect->scene() != 0) m_scene->removeItem(m_safeRect); + bool showBg = false; QImage img(m_width, m_height, QImage::Format_ARGB32); + + //TODO: Should the image be scaled when letterboxing? + /* + QRectF source(0, 0, m_width, m_height); + QRectF target; + if (!letterbox) target = QRectF(0, 0, m_finalSize.width(), m_finalSize.height()); + else { + // Scale the button images to fit a letterbox image + double factor = (double) m_width / m_finalSize.width(); + int letterboxHeight = m_height / factor; + target = QRectF(0, (m_finalSize.height() - letterboxHeight) / 2, m_finalSize.width(), letterboxHeight); + }*/ + + if (menuMovie()) { + showBg = true; + if (m_background->scene() != 0) m_scene->removeItem(m_background); + if (m_color->scene() != 0) m_scene->removeItem(m_color); + img.fill(Qt::transparent); + } updateColor(m_view.text_color->color()); QPainter p(&img); p.setRenderHints(QPainter::Antialiasing, true); p.setRenderHints(QPainter::TextAntialiasing, true); m_scene->render(&p, QRectF(0, 0, img.width(), img.height())); + //m_scene->render(&p, target, source, Qt::IgnoreAspectRatio); p.end(); img.save(img1); m_scene->addItem(m_safeRect); - return; - - - /*QImage img; - if (m_view.background_list->currentIndex() == 0) { - // color background - if (m_isPal) - img = QImage(768, 576, QImage::Format_ARGB32); - else - img = QImage(720, 540, QImage::Format_ARGB32); - img.fill(m_view.background_color->color().rgb()); - } else if (m_view.background_list->currentIndex() == 1) { - img.load(m_view.background_image->url().path()); - if (m_isPal) { - if (img.width() != 768 || img.height() != 576) - img = img.scaled(768, 576, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); - } else { - if (img.width() != 720 || img.height() != 540) - img = img.scaled(720, 540, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); - } - } else return; - // Overlay Normal menu - QImage menu(overlayMenu); - QPainter p(&img); - QRectF target(0, 0, img.width(), img.height()); - QRectF src(0, 0, menu.width(), menu.height()); - p.drawImage(target, menu, src); - p.end(); - img.save(img1);*/ + if (showBg) { + m_scene->addItem(m_background); + m_scene->addItem(m_color); + } } bool DvdWizardMenu::createMenu() const @@ -694,17 +698,29 @@ QString DvdWizardMenu::menuMoviePath() const return m_view.background_image->url().path(); } +int DvdWizardMenu::menuMovieLength() const +{ + return m_movieLength; +} + -QMap DvdWizardMenu::buttonsInfo() +QMap DvdWizardMenu::buttonsInfo(bool letterbox) { QMap info; QList list = m_scene->items(); - double ratio = (double) m_finalSize.width() / m_width; + double ratiox = (double) m_finalSize.width() / m_width; + double ratioy = 1; + int offset = 0; + if (letterbox) { + int letterboxHeight = m_height * ratiox; + ratioy = (double) letterboxHeight / m_finalSize.height(); + offset = (m_finalSize.height() - letterboxHeight) / 2; + } for (int i = 0; i < list.count(); i++) { - if (list.at(i)->type() == QGraphicsItem::UserType + 1) { + if (list.at(i)->type() == DvdButtonItem) { DvdButton *button = static_cast < DvdButton* >(list.at(i)); QRectF r = button->sceneBoundingRect(); - QRect adjustedRect(r.x() * ratio, r.y(), r.width() * ratio, r.height()); + QRect adjustedRect(r.x() * ratiox, offset + r.y() * ratioy, r.width() * ratiox, r.height() * ratioy); // Make sure y1 is not odd (requested by spumux) if (adjustedRect.height() % 2 == 1) adjustedRect.setHeight(adjustedRect.height() + 1); if (adjustedRect.y() % 2 == 1) adjustedRect.setY(adjustedRect.y() - 1); @@ -716,11 +732,6 @@ QMap DvdWizardMenu::buttonsInfo() return info; } -bool DvdWizardMenu::isPalMenu() const -{ - return m_isPal; -} - QDomElement DvdWizardMenu::toXml() const { QDomDocument doc; @@ -746,7 +757,7 @@ QDomElement DvdWizardMenu::toXml() const int buttonCount = 0; for (int i = 0; i < list.count(); i++) { - if (list.at(i)->type() == QGraphicsItem::UserType + 1) { + if (list.at(i)->type() == DvdButtonItem) { buttonCount++; DvdButton *button = static_cast < DvdButton* >(list.at(i)); QDomElement xmlbutton = doc.createElement("button"); @@ -766,11 +777,12 @@ QDomElement DvdWizardMenu::toXml() const } -void DvdWizardMenu::loadXml(QDomElement xml) +void DvdWizardMenu::loadXml(DVDFORMAT format, QDomElement xml) { kDebug() << "// LOADING MENU"; if (xml.isNull()) return; kDebug() << "// LOADING MENU 1"; + changeProfile(format); m_view.create_menu->setChecked(xml.attribute("enabled").toInt()); if (xml.hasAttribute("background_color")) { m_view.background_list->setCurrentIndex(0); @@ -797,7 +809,7 @@ void DvdWizardMenu::loadXml(QDomElement xml) QList list = m_scene->items(); for (int i = 0; i < list.count(); i++) { - if (list.at(i)->type() == QGraphicsItem::UserType + 1) { + if (list.at(i)->type() == DvdButtonItem) { delete list.at(i); i--; }