From 05a837d483eeb9102ffa832b4a5c6698f2482a62 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 15 Oct 2012 17:19:40 +0200 Subject: [PATCH] Fix broken dvd menu, add support for VLC to preview DVD --- src/dvdwizard.cpp | 60 ++++++++++++++++++++++++++----------------- src/dvdwizard.h | 1 + src/dvdwizardmenu.cpp | 12 ++++++--- src/dvdwizardmenu.h | 2 +- src/wizard.cpp | 8 +++++- src/wizard.h | 16 +++++------- 6 files changed, 61 insertions(+), 38 deletions(-) diff --git a/src/dvdwizard.cpp b/src/dvdwizard.cpp index 68a3580a..4cc09174 100644 --- a/src/dvdwizard.cpp +++ b/src/dvdwizard.cpp @@ -126,6 +126,7 @@ DvdWizard::~DvdWizard() { m_authorFile.remove(); m_menuFile.remove(); + m_menuVobFile.remove(); blockSignals(true); delete m_burnMenu; if (m_dvdauthor) { @@ -195,16 +196,16 @@ void DvdWizard::generateDvd() //temp5.setAutoRemove(false); temp5.open(); - KTemporaryFile temp6; - temp6.setSuffix(".xml"); - //temp6.setAutoRemove(false); - temp6.open(); - m_menuFile.close(); - m_menuFile.setSuffix(".mpg"); + m_menuFile.setSuffix(".xml"); m_menuFile.setAutoRemove(false); m_menuFile.open(); + m_menuVobFile.close(); + m_menuVobFile.setSuffix(".mpg"); + m_menuVobFile.setAutoRemove(false); + m_menuVobFile.open(); + m_authorFile.close(); m_authorFile.setSuffix(".xml"); m_authorFile.setAutoRemove(false); @@ -222,7 +223,7 @@ void DvdWizard::generateDvd() if (m_pageMenu->createMenu()) { m_pageMenu->createButtonImages(temp1.fileName(), temp2.fileName(), temp3.fileName()); - m_pageMenu->createBackgroundImage(temp4.fileName()); + m_pageMenu->createBackgroundImage(temp1.fileName(), temp4.fileName()); images->setIcon(KIcon("dialog-ok")); @@ -294,11 +295,9 @@ void DvdWizard::generateDvd() spu.setAttribute("force", "yes"); spu.setAttribute("start", "00:00:00.00"); spu.setAttribute("image", temp1.fileName()); - spu.setAttribute("select", temp2.fileName()); + spu.setAttribute("select", temp2.fileName()); spu.setAttribute("highlight", temp3.fileName()); - /*spu.setAttribute("autooutline", "infer"); - spu.setAttribute("outlinewidth", "12"); - spu.setAttribute("autoorder", "rows");*/ + /*spu.setAttribute("autoorder", "rows");*/ int max = buttons.count() - 1; int i = 0; @@ -318,15 +317,19 @@ void DvdWizard::generateDvd() // We need to make sure that the y coordinate is a multiple of 2, otherwise button may not be displayed buttonsTarget.append(it.key()); + int y0 = r.y() - 2; + if (y0 % 2 == 1) y0++; + int y1 = r.bottom() + 2; + if (y1 % 2 == 1) y1++; but.setAttribute("x0", QString::number(r.x())); - but.setAttribute("y0", QString::number((int) 2 * (r.y() / 2))); + but.setAttribute("y0", QString::number(y0)); but.setAttribute("x1", QString::number(r.right())); - but.setAttribute("y1", QString::number((int) 2 * (r.bottom() / 2))); + but.setAttribute("y1", QString::number(y1)); spu.appendChild(but); i++; } - QFile data(temp6.fileName()); + QFile data(m_menuFile.fileName()); if (data.open(QFile::WriteOnly)) { data.write(doc.toString().toUtf8()); } @@ -335,8 +338,8 @@ void DvdWizard::generateDvd() kDebug() << " SPUMUX DATA: " << doc.toString(); QStringList args; - args.append(temp6.fileName()); - kDebug() << "SPM ARGS: " << args << temp5.fileName() << m_menuFile.fileName(); + args.append(m_menuFile.fileName()); + kDebug() << "SPM ARGS: " << args << temp5.fileName() << m_menuVobFile.fileName(); QProcess spumux; @@ -352,7 +355,7 @@ void DvdWizard::generateDvd() if (m_pageMenu->menuMovie()) spumux.setStandardInputFile(m_pageMenu->menuMoviePath()); else spumux.setStandardInputFile(temp5.fileName()); - spumux.setStandardOutputFile(m_menuFile.fileName()); + spumux.setStandardOutputFile(m_menuVobFile.fileName()); spumux.start("spumux", args); if (spumux.waitForFinished()) { m_status.error_log->append(spumux.readAllStandardError()); @@ -384,7 +387,7 @@ void DvdWizard::generateDvd() } spuitem->setIcon(KIcon("dialog-ok")); - kDebug() << "/// DONE: " << m_menuFile.fileName(); + kDebug() << "/// DONE: " << m_menuVobFile.fileName(); } // create dvdauthor xml @@ -431,6 +434,9 @@ void DvdWizard::generateDvd() pgc.appendChild(pre); QDomText nametext = dvddoc.createTextNode("{g1 = 0;}"); pre.appendChild(nametext); + QDomElement menuvob = dvddoc.createElement("vob"); + menuvob.setAttribute("file", m_menuVobFile.fileName()); + pgc.appendChild(menuvob); for (int i = 0; i < buttons.count(); i++) { QDomElement button = dvddoc.createElement("button"); button.setAttribute("name", 'b' + QString::number(i)); @@ -438,9 +444,6 @@ void DvdWizard::generateDvd() button.appendChild(nametext); pgc.appendChild(button); } - QDomElement menuvob = dvddoc.createElement("vob"); - menuvob.setAttribute("file", m_menuFile.fileName()); - pgc.appendChild(menuvob); if (m_pageMenu->loopMovie()) { QDomElement menuloop = dvddoc.createElement("post"); @@ -705,9 +708,18 @@ void DvdWizard::cleanup() void DvdWizard::slotPreview() { - QString programName("xine"); - QString exec = KStandardDirs::findExe(programName); - if (exec.isEmpty()) KMessageBox::sorry(this, i18n("You need program %1 to perform this action", programName)); + QStringList programNames; + programNames << "xine" << "vlc"; + QString exec; + foreach(const QString &prog, programNames) { + exec = KStandardDirs::findExe(prog); + if (!exec.isEmpty()) { + break; + } + } + if (exec.isEmpty()) { + KMessageBox::sorry(this, i18n("Previewing requires one of these applications (%1)", programNames.join(","))); + } else QProcess::startDetached(exec, QStringList() << "dvd://" + m_status.iso_image->url().path()); } diff --git a/src/dvdwizard.h b/src/dvdwizard.h index a7639407..4f045be9 100644 --- a/src/dvdwizard.h +++ b/src/dvdwizard.h @@ -56,6 +56,7 @@ private: DvdWizardChapters *m_pageChapters; KTemporaryFile m_authorFile; KTemporaryFile m_menuFile; + KTemporaryFile m_menuVobFile; QProcess *m_dvdauthor; QProcess *m_mkiso; QString m_creationLog; diff --git a/src/dvdwizardmenu.cpp b/src/dvdwizardmenu.cpp index 4ebb1ac8..cc285bda 100644 --- a/src/dvdwizardmenu.cpp +++ b/src/dvdwizardmenu.cpp @@ -462,7 +462,6 @@ void DvdWizardMenu::createButtonImages(const QString &img1, const QString &img2, 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); - #if QT_VERSION >= 0x040800 QImage img(m_width, m_height, QImage::Format_ARGB32); img.fill(Qt::transparent); @@ -504,7 +503,7 @@ void DvdWizardMenu::createButtonImages(const QString &img1, const QString &img2, #else img.setNumColors(4); #endif - img.save(img3); + img.save(img3); #if QT_VERSION >= 0x040800 img.fill(Qt::transparent); @@ -534,7 +533,7 @@ void DvdWizardMenu::createButtonImages(const QString &img1, const QString &img2, } -void DvdWizardMenu::createBackgroundImage(const QString &img1) +void DvdWizardMenu::createBackgroundImage(const QString &overlayMenu, const QString &img1) { QImage img; if (m_view.background_list->currentIndex() == 0) { @@ -554,6 +553,13 @@ void DvdWizardMenu::createBackgroundImage(const QString &img1) 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); } diff --git a/src/dvdwizardmenu.h b/src/dvdwizardmenu.h index 4f6b7324..bde32110 100644 --- a/src/dvdwizardmenu.h +++ b/src/dvdwizardmenu.h @@ -133,7 +133,7 @@ public: virtual ~DvdWizardMenu(); virtual bool isComplete() const; bool createMenu() const; - void createBackgroundImage(const QString &img1); + void createBackgroundImage(const QString &overlayMenu, const QString &img1); void createButtonImages(const QString &img1, const QString &img2, const QString &img3); void setTargets(QStringList list, QStringList targetlist); QMap buttonsInfo(); diff --git a/src/wizard.cpp b/src/wizard.cpp index 4539a3fc..4b79d072 100644 --- a/src/wizard.cpp +++ b/src/wizard.cpp @@ -464,7 +464,13 @@ void Wizard::slotCheckPrograms() item = new QTreeWidgetItem(m_check.programList, QStringList() << QString() << i18n("xine")); item->setData(1, Qt::UserRole, i18n("Required to preview your DVD")); item->setSizeHint(0, itemSize); - if (KStandardDirs::findExe("xine").isEmpty()) item->setIcon(0, m_badIcon); + if (KStandardDirs::findExe("xine").isEmpty()) { + if (!KStandardDirs::findExe("vlc").isEmpty()) { + item->setText(1, i18n("vlc")); + item->setIcon(0, m_okIcon); + } + else item->setIcon(0, m_badIcon); + } else item->setIcon(0, m_okIcon); // set up some default applications diff --git a/src/wizard.h b/src/wizard.h index 134009cb..134e4e0b 100644 --- a/src/wizard.h +++ b/src/wizard.h @@ -42,18 +42,17 @@ public: } void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { if (index.column() == 1) { - const bool hover = option.state & (QStyle::State_Selected); - QRect r1 = option.rect; painter->save(); - if (hover) { - painter->setPen(option.palette.color(QPalette::HighlightedText)); - QColor backgroundColor = option.palette.color(QPalette::Highlight); - painter->setBrush(QBrush(backgroundColor)); - painter->fillRect(r1, backgroundColor); - } + QStyleOptionViewItemV4 opt(option); + QStyle *style = opt.widget ? opt.widget->style() : QApplication::style(); + const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1; + style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget); + QFont font = painter->font(); font.setBold(true); painter->setFont(font); + QRect r1 = option.rect; + r1.adjust(0, textMargin, 0, - textMargin); int mid = (int)((r1.height() / 2)); r1.setBottom(r1.y() + mid); QRect r2 = option.rect; @@ -62,7 +61,6 @@ public: font.setBold(false); painter->setFont(font); QString subText = index.data(Qt::UserRole).toString(); - painter->setPen(option.palette.color(QPalette::Mid)); painter->drawText(r2, Qt::AlignLeft | Qt::AlignVCenter , subText); painter->restore(); } else { -- 2.39.5