X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fdvdwizardmenu.cpp;h=c0e86f852d76bddb2cd532643c09879943d4dcba;hb=4e8bd1d7f5b456324e8d9006e1f2702ae57c8a8b;hp=bd0b940338fc9adabc659c8e0850bd11a8bed0d7;hpb=5eaf1ee0d7dd737ab4bd544e2c4f7467a2e0ea9a;p=kdenlive diff --git a/src/dvdwizardmenu.cpp b/src/dvdwizardmenu.cpp index bd0b9403..c0e86f85 100644 --- a/src/dvdwizardmenu.cpp +++ b/src/dvdwizardmenu.cpp @@ -30,6 +30,8 @@ #include "kthumb.h" +enum { DvdButtonItem = QGraphicsItem::UserType + 1, DvdButtonUnderlineItem = QGraphicsItem::UserType + 2 }; + DvdWizardMenu::DvdWizardMenu(DVDFORMAT format, QWidget *parent) : QWizardPage(parent), m_color(NULL), @@ -44,14 +46,6 @@ DvdWizardMenu::DvdWizardMenu(DVDFORMAT format, QWidget *parent) : m_view.menu_preview->setMouseTracking(true); connect(m_view.create_menu, SIGNAL(toggled(bool)), m_view.menu_box, SLOT(setEnabled(bool))); connect(m_view.create_menu, SIGNAL(toggled(bool)), this, SIGNAL(completeChanged())); - -#if KDE_IS_VERSION(4,7,0) - m_menuMessage = new KMessageWidget; - QGridLayout *s = static_cast (layout()); - s->addWidget(m_menuMessage, 7, 0, 1, -1); - m_menuMessage->hide(); - m_view.error_message->hide(); -#endif m_view.add_button->setIcon(KIcon("document-new")); m_view.delete_button->setIcon(KIcon("trash-empty")); @@ -132,7 +126,7 @@ DvdWizardMenu::DvdWizardMenu(DVDFORMAT format, QWidget *parent) : connect(m_view.zoom_button, SIGNAL(pressed()), this, SLOT(slotZoom())); connect(m_view.unzoom_button, SIGNAL(pressed()), this, SLOT(slotUnZoom())); connect(m_scene, SIGNAL(selectionChanged()), this, SLOT(buttonChanged())); - connect(m_scene, SIGNAL(changed(const QList &)), this, SIGNAL(completeChanged())); + connect(m_scene, SIGNAL(sceneChanged()), this, SIGNAL(completeChanged())); // red background for error message KColorScheme scheme(palette().currentColorGroup(), KColorScheme::Window, KSharedConfig::openConfig(KdenliveSettings::colortheme())); @@ -140,9 +134,16 @@ DvdWizardMenu::DvdWizardMenu(DVDFORMAT format, QWidget *parent) : p.setColor(QPalette::Background, scheme.background(KColorScheme::NegativeBackground).color()); m_view.error_message->setAutoFillBackground(true); m_view.error_message->setPalette(p); - m_view.menu_box->setEnabled(false); +#if KDE_IS_VERSION(4,7,0) + m_menuMessage = new KMessageWidget; + QGridLayout *s = static_cast (layout()); + s->addWidget(m_menuMessage, 7, 0, 1, -1); + m_menuMessage->hide(); + m_view.error_message->hide(); +#endif + } DvdWizardMenu::~DvdWizardMenu() @@ -158,7 +159,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); @@ -181,7 +182,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(); @@ -189,9 +190,9 @@ bool DvdWizardMenu::isComplete() const for (int j = 0; j < collisions.count(); j++) { if (collisions.at(j)->type() == button->type()) { #if KDE_IS_VERSION(4,7,0) - m_menuMessage->setText(i18n("Buttons overlapping")); - m_menuMessage->setMessageType(KMessageWidget::Warning); - m_menuMessage->animatedShow(); + m_menuMessage->setText(i18n("Buttons overlapping")); + m_menuMessage->setMessageType(KMessageWidget::Warning); + m_menuMessage->show(); #else m_view.error_message->setText(i18n("Buttons overlapping")); m_view.error_message->setHidden(false); @@ -208,7 +209,7 @@ bool DvdWizardMenu::isComplete() const #if KDE_IS_VERSION(4,7,0) m_menuMessage->setText(i18n("No button in menu")); m_menuMessage->setMessageType(KMessageWidget::Warning); - m_menuMessage->animatedShow(); + m_menuMessage->show(); #else m_view.error_message->setText(i18n("No button in menu")); m_view.error_message->setHidden(false); @@ -222,7 +223,7 @@ bool DvdWizardMenu::isComplete() const #if KDE_IS_VERSION(4,7,0) m_menuMessage->setText(i18n("Missing background image")); m_menuMessage->setMessageType(KMessageWidget::Warning); - m_menuMessage->animatedShow(); + m_menuMessage->show(); #else m_view.error_message->setText(i18n("Missing background image")); m_view.error_message->setHidden(false); @@ -232,7 +233,7 @@ bool DvdWizardMenu::isComplete() const } #if KDE_IS_VERSION(4,7,0) - m_menuMessage->animatedHide(); + m_menuMessage->hide(); #endif // check that we have a "Play all" entry @@ -244,7 +245,7 @@ bool DvdWizardMenu::isComplete() const #if KDE_IS_VERSION(4,7,0) m_menuMessage->setText(i18n("No menu entry for %1", m_view.target_list->itemText(i))); m_menuMessage->setMessageType(KMessageWidget::Warning); - m_menuMessage->animatedShow(); + m_menuMessage->show(); #else m_view.error_message->setText(i18n("No menu entry for %1", m_view.target_list->itemText(i))); m_view.error_message->setHidden(false); @@ -259,7 +260,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; @@ -272,7 +273,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; @@ -286,7 +287,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); @@ -340,7 +341,7 @@ 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; } @@ -427,6 +428,7 @@ void DvdWizardMenu::checkBackgroundType(int ix) m_view.loop_movie->setVisible(true); } } + emit completeChanged(); } void DvdWizardMenu::buildColor() @@ -456,7 +458,7 @@ void DvdWizardMenu::buildImage() 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()); + Mlt::Producer *producer = new Mlt::Producer(profile, m_view.background_image->url().path().toUtf8().constData()); if (producer && producer->is_valid()) { pix = QPixmap::fromImage(KThumb::getFrame(producer, 0, m_finalSize.width(), m_width, m_height)); m_movieLength = producer->get_length(); @@ -481,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; } @@ -493,6 +495,8 @@ void DvdWizardMenu::buildButton() //font.setStyleStrategy(QFont::NoAntialias); button->setFont(font); button->setDefaultTextColor(m_view.text_color->color()); + // Check for button overlapping in case we changed text / size + emit completeChanged(); } void DvdWizardMenu::updateColor() @@ -505,7 +509,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; @@ -514,9 +518,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); } @@ -528,10 +532,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); } } @@ -545,8 +549,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); @@ -560,7 +564,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); } @@ -568,7 +572,7 @@ void DvdWizardMenu::updateColor(QColor c) } -void DvdWizardMenu::createButtonImages(const QString &img1, const QString &img2, const QString &img3, bool letterbox) +void DvdWizardMenu::createButtonImages(const QString &selected_image, const QString &highlighted_image, bool letterbox) { if (m_view.create_menu->isChecked()) { m_scene->clearSelection(); @@ -588,32 +592,13 @@ 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, target, source, 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); @@ -626,7 +611,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); @@ -646,7 +631,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); @@ -655,17 +640,29 @@ 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); - if (menuMovie() && m_background->scene() != 0) { + + //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; - m_scene->removeItem(m_background); + if (m_background->scene() != 0) m_scene->removeItem(m_background); if (m_color->scene() != 0) m_scene->removeItem(m_color); - if (m_safeRect->scene() != 0) m_scene->removeItem(m_safeRect); img.fill(Qt::transparent); } updateColor(m_view.text_color->color()); @@ -673,6 +670,7 @@ void DvdWizardMenu::createBackgroundImage(const QString &overlayMenu, const QStr 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); @@ -680,35 +678,6 @@ void DvdWizardMenu::createBackgroundImage(const QString &overlayMenu, const QStr m_scene->addItem(m_background); m_scene->addItem(m_color); } - 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);*/ } bool DvdWizardMenu::createMenu() const @@ -750,7 +719,7 @@ QMap DvdWizardMenu::buttonsInfo(bool letterbox) 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() * ratiox, offset + r.y() * ratioy, r.width() * ratiox, r.height() * ratioy); @@ -790,15 +759,15 @@ 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"); xmlbutton.setAttribute("target", button->target()); xmlbutton.setAttribute("command", button->command()); xmlbutton.setAttribute("backtomenu", button->backMenu()); - xmlbutton.setAttribute("posx", button->pos().x()); - xmlbutton.setAttribute("posy", button->pos().y()); + xmlbutton.setAttribute("posx", (int) button->pos().x()); + xmlbutton.setAttribute("posy", (int) button->pos().y()); xmlbutton.setAttribute("text", button->toPlainText()); QFont font = button->font(); xmlbutton.setAttribute("font_size", font.pixelSize()); @@ -842,7 +811,7 @@ void DvdWizardMenu::loadXml(DVDFORMAT format, 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--; } @@ -871,7 +840,7 @@ void DvdWizardMenu::loadXml(DVDFORMAT format, QDomElement xml) button->setDefaultTextColor(m_view.text_color->color()); button->setZValue(4); m_scene->addItem(button); - button->setPos(e.attribute("posx").toDouble(), e.attribute("posy").toDouble()); + button->setPos(e.attribute("posx").toInt(), e.attribute("posy").toInt()); } }