renderwidget.cpp 52.5 KB
Newer Older
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/***************************************************************************
 *   Copyright (C) 2008 by Jean-Baptiste Mardelle (jb@kdenlive.org)        *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
 ***************************************************************************/

20

21 22 23
#include "renderwidget.h"
#include "kdenlivesettings.h"
#include "ui_saveprofile_ui.h"
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
24 25 26

#include <KStandardDirs>
#include <KDebug>
27
#include <KMessageBox>
28
#include <KComboBox>
29
#include <KRun>
30
#include <KIO/NetAccess>
31
// #include <knewstuff2/engine.h>
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
32

33 34 35 36 37 38 39 40
#include <QDomDocument>
#include <QItemDelegate>
#include <QTreeWidgetItem>
#include <QListWidgetItem>
#include <QHeaderView>
#include <QMenu>
#include <QProcess>
#include <QInputDialog>
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
41

42 43 44 45 46
const int GroupRole = Qt::UserRole;
const int ExtensionRole = GroupRole + 1;
const int StandardRole = GroupRole + 2;
const int RenderRole = GroupRole + 3;
const int ParamsRole = GroupRole + 4;
47
const int EditableRole = GroupRole + 5;
48
const int MetaGroupRole = GroupRole + 6;
49
const int ExtraRole = GroupRole + 7;
50

51
RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent): QDialog(parent), m_projectFolder(projectfolder) {
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
52
    m_view.setupUi(this);
53
    setWindowTitle(i18n("Rendering"));
54 55 56 57
    m_view.buttonDelete->setIcon(KIcon("trash-empty"));
    m_view.buttonDelete->setToolTip(i18n("Delete profile"));
    m_view.buttonDelete->setEnabled(false);

58 59 60 61
    m_view.buttonEdit->setIcon(KIcon("document-properties"));
    m_view.buttonEdit->setToolTip(i18n("Edit profile"));
    m_view.buttonEdit->setEnabled(false);

62 63 64
    m_view.buttonSave->setIcon(KIcon("document-new"));
    m_view.buttonSave->setToolTip(i18n("Create new profile"));

65 66 67 68 69 70
    m_view.buttonInfo->setIcon(KIcon("help-about"));

    if (KdenliveSettings::showrenderparams()) {
        m_view.buttonInfo->setDown(true);
    } else m_view.advanced_params->hide();

71 72
    m_view.rescale_size->setInputMask("0099\\x0099");
    m_view.rescale_size->setText("320x240");
73

74 75

    QMenu *renderMenu = new QMenu(i18n("Start Rendering"), this);
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
76
    QAction *renderAction = renderMenu->addAction(KIcon("video-x-generic"), i18n("Render to File"));
77
    connect(renderAction, SIGNAL(triggered()), this, SLOT(slotExport()));
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
78
    QAction *scriptAction = renderMenu->addAction(KIcon("application-x-shellscript"), i18n("Generate Script"));
79 80 81 82 83 84 85 86 87 88
    connect(scriptAction, SIGNAL(triggered()), this, SLOT(slotGenerateScript()));

    m_view.buttonStart->setMenu(renderMenu);
    m_view.buttonStart->setPopupMode(QToolButton::MenuButtonPopup);
    m_view.buttonStart->setDefaultAction(renderAction);
    m_view.buttonStart->setToolButtonStyle(Qt::ToolButtonTextOnly);
    m_view.abort_job->setEnabled(false);
    m_view.start_script->setEnabled(false);
    m_view.delete_script->setEnabled(false);

89 90
    m_view.format_list->setAlternatingRowColors(true);
    m_view.size_list->setAlternatingRowColors(true);
91

92
    parseProfiles();
93 94 95 96 97 98
    parseScriptFiles();

    connect(m_view.start_script, SIGNAL(clicked()), this, SLOT(slotStartScript()));
    connect(m_view.delete_script, SIGNAL(clicked()), this, SLOT(slotDeleteScript()));
    connect(m_view.scripts_list, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(slotCheckScript()));
    connect(m_view.running_jobs, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(slotCheckJob()));
99

100 101
    connect(m_view.buttonInfo, SIGNAL(clicked()), this, SLOT(showInfoPanel()));

102
    connect(m_view.buttonSave, SIGNAL(clicked()), this, SLOT(slotSaveProfile()));
103
    connect(m_view.buttonEdit, SIGNAL(clicked()), this, SLOT(slotEditProfile()));
104
    connect(m_view.buttonDelete, SIGNAL(clicked()), this, SLOT(slotDeleteProfile()));
105
    connect(m_view.abort_job, SIGNAL(clicked()), this, SLOT(slotAbortCurrentJob()));
106 107
    connect(m_view.buttonClose, SIGNAL(clicked()), this, SLOT(hide()));
    connect(m_view.buttonClose2, SIGNAL(clicked()), this, SLOT(hide()));
108
    connect(m_view.buttonClose3, SIGNAL(clicked()), this, SLOT(hide()));
109 110
    connect(m_view.rescale, SIGNAL(toggled(bool)), m_view.rescale_size, SLOT(setEnabled(bool)));
    connect(m_view.destination_list, SIGNAL(activated(int)), this, SLOT(refreshView()));
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
111
    connect(m_view.out_file, SIGNAL(textChanged(const QString &)), this, SLOT(slotUpdateButtons()));
112
    connect(m_view.out_file, SIGNAL(urlSelected(const KUrl &)), this, SLOT(slotUpdateButtons(const KUrl &)));
113 114
    connect(m_view.format_list, SIGNAL(currentRowChanged(int)), this, SLOT(refreshView()));
    connect(m_view.size_list, SIGNAL(currentRowChanged(int)), this, SLOT(refreshParams()));
115

116 117
    connect(m_view.size_list, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(slotEditItem(QListWidgetItem *)));

118 119 120 121 122 123 124
    connect(m_view.render_guide, SIGNAL(clicked(bool)), this, SLOT(slotUpdateGuideBox()));
    connect(m_view.render_zone, SIGNAL(clicked(bool)), this, SLOT(slotUpdateGuideBox()));
    connect(m_view.render_full, SIGNAL(clicked(bool)), this, SLOT(slotUpdateGuideBox()));

    connect(m_view.guide_end, SIGNAL(activated(int)), this, SLOT(slotCheckStartGuidePosition()));
    connect(m_view.guide_start, SIGNAL(activated(int)), this, SLOT(slotCheckEndGuidePosition()));

125
    connect(m_view.format_selection, SIGNAL(activated(int)), this, SLOT(refreshView()));
126

Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
127
    m_view.buttonStart->setEnabled(false);
128
    m_view.rescale_size->setEnabled(false);
129
    m_view.guides_box->setVisible(false);
130 131 132 133
    m_view.open_dvd->setVisible(false);
    m_view.open_browser->setVisible(false);
    m_view.error_box->setVisible(false);

134 135
    m_view.splitter->setStretchFactor(1, 5);
    m_view.splitter->setStretchFactor(0, 2);
136

137
    m_view.out_file->setMode(KFile::File);
138

139
    m_view.running_jobs->setHeaderLabels(QStringList() << QString() << i18n("File") << i18n("Progress"));
140
    m_view.running_jobs->setItemDelegate(new RenderViewDelegate(this));
141

142 143 144
    QHeaderView *header = m_view.running_jobs->header();
    QFontMetrics fm = fontMetrics();
    //header->resizeSection(0, fm.width("typical-name-for-a-torrent.torrent"));
145 146
    header->setResizeMode(0, QHeaderView::Fixed);
    header->resizeSection(0, 30);
147
    header->setResizeMode(1, QHeaderView::Interactive);
148 149 150 151
    header->resizeSection(1, fm.width("typical-name-for-a-file.torrent"));
    header->setResizeMode(2, QHeaderView::Fixed);
    header->resizeSection(1, width() * 2 / 3);
    header->setResizeMode(2, QHeaderView::Interactive);
152 153
    //header->setResizeMode(1, QHeaderView::Fixed);

154 155 156 157
    m_view.scripts_list->setHeaderLabels(QStringList() << i18n("Script Files"));
    m_view.scripts_list->setItemDelegate(new RenderScriptDelegate(this));


158
    focusFirstVisibleItem();
159 160
}

161
void RenderWidget::slotEditItem(QListWidgetItem *item) {
162 163
    QString edit = item->data(EditableRole).toString();
    if (edit.isEmpty() || !edit.endsWith("customprofiles.xml")) slotSaveProfile();
164 165 166
    else slotEditProfile();
}

167 168 169 170 171 172 173 174 175 176
void RenderWidget::showInfoPanel() {
    if (m_view.advanced_params->isVisible()) {
        m_view.advanced_params->setVisible(false);
        m_view.buttonInfo->setDown(false);
        KdenliveSettings::setShowrenderparams(false);
    } else {
        m_view.advanced_params->setVisible(true);
        m_view.buttonInfo->setDown(true);
        KdenliveSettings::setShowrenderparams(true);
    }
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
177 178
}

179 180 181 182
void RenderWidget::setDocumentPath(const QString path) {
    m_projectFolder = path;
    const QString fileName = m_view.out_file->url().fileName();
    m_view.out_file->setUrl(KUrl(m_projectFolder + '/' + fileName));
183
    parseScriptFiles();
184 185
}

186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
void RenderWidget::slotUpdateGuideBox() {
    m_view.guides_box->setVisible(m_view.render_guide->isChecked());
}

void RenderWidget::slotCheckStartGuidePosition() {
    if (m_view.guide_start->currentIndex() > m_view.guide_end->currentIndex())
        m_view.guide_start->setCurrentIndex(m_view.guide_end->currentIndex());
}

void RenderWidget::slotCheckEndGuidePosition() {
    if (m_view.guide_end->currentIndex() < m_view.guide_start->currentIndex())
        m_view.guide_end->setCurrentIndex(m_view.guide_start->currentIndex());
}

void RenderWidget::setGuides(QDomElement guidesxml, double duration) {
    m_view.guide_start->clear();
    m_view.guide_end->clear();
    QDomNodeList nodes = guidesxml.elementsByTagName("guide");
    if (nodes.count() > 0) {
205
        m_view.guide_start->addItem(i18n("Render"), "0");
206 207 208 209 210 211 212 213 214 215 216 217 218
        m_view.render_guide->setEnabled(true);
    } else m_view.render_guide->setEnabled(false);
    for (int i = 0; i < nodes.count(); i++) {
        QDomElement e = nodes.item(i).toElement();
        if (!e.isNull()) {
            m_view.guide_start->addItem(e.attribute("comment"), e.attribute("time").toDouble());
            m_view.guide_end->addItem(e.attribute("comment"), e.attribute("time").toDouble());
        }
    }
    if (nodes.count() > 0)
        m_view.guide_end->addItem(i18n("End"), QString::number(duration));
}

219 220 221 222
// Will be called when the user selects an output file via the file dialog.
// File extension will be added automatically.
void RenderWidget::slotUpdateButtons(KUrl url) {
    if (m_view.out_file->url().isEmpty()) m_view.buttonStart->setEnabled(false);
223
    else m_view.buttonStart->setEnabled(true);
224
    if (url != 0) {
225 226 227 228
        QListWidgetItem *item = m_view.size_list->currentItem();
        QString extension = item->data(ExtensionRole).toString();
        url = filenameWithExtension(url, extension);
        m_view.out_file->setUrl(url);
229 230 231
    }
}

232
// Will be called when the user changes the output file path in the text line.
233
// File extension must NOT be added, would make editing impossible!
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
234 235
void RenderWidget::slotUpdateButtons() {
    if (m_view.out_file->url().isEmpty()) m_view.buttonStart->setEnabled(false);
236
    else m_view.buttonStart->setEnabled(true);
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
237 238
}

239
void RenderWidget::slotSaveProfile() {
240
    //TODO: update to correctly use metagroups
241 242 243
    Ui::SaveProfile_UI ui;
    QDialog *d = new QDialog(this);
    ui.setupUi(d);
244 245

    for (int i = 0; i < m_view.destination_list->count(); i++)
246
        ui.destination_list->addItem(m_view.destination_list->itemIcon(i), m_view.destination_list->itemText(i), m_view.destination_list->itemData(i, Qt::UserRole));
247 248

    ui.destination_list->setCurrentIndex(m_view.destination_list->currentIndex());
249
    QString dest = ui.destination_list->itemData(ui.destination_list->currentIndex(), Qt::UserRole).toString();
250

251 252 253
    QString customGroup = m_view.format_list->currentItem()->text();
    if (customGroup.isEmpty()) customGroup = i18n("Custom");
    ui.group_name->setText(customGroup);
254

255
    ui.parameters->setText(m_view.advanced_params->toPlainText());
256 257
    ui.extension->setText(m_view.size_list->currentItem()->data(ExtensionRole).toString());
    ui.profile_name->setFocus();
258
    if (d->exec() == QDialog::Accepted && !ui.profile_name->text().simplified().isEmpty()) {
259
        QString exportFile = KStandardDirs::locateLocal("appdata", "export/customprofiles.xml");
260 261 262 263 264
        QDomDocument doc;
        QFile file(exportFile);
        doc.setContent(&file, false);
        file.close();
        QDomElement documentElement;
265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
        QDomElement profiles = doc.documentElement();
        if (profiles.isNull() || profiles.tagName() != "profiles") {
            doc.clear();
            profiles = doc.createElement("profiles");
            profiles.setAttribute("version", 1);
            doc.appendChild(profiles);
        }
        int version = profiles.attribute("version", 0).toInt();
        if (version < 1) {
            kDebug() << "// OLD profile version";
            doc.clear();
            profiles = doc.createElement("profiles");
            profiles.setAttribute("version", 1);
            doc.appendChild(profiles);
        }

281
        QString newProfileName = ui.profile_name->text().simplified();
282 283 284 285
        QString newGroupName = ui.group_name->text().simplified();
        if (newGroupName.isEmpty()) newGroupName = i18n("Custom");
        QString newMetaGroupId = ui.destination_list->itemData(ui.destination_list->currentIndex(), Qt::UserRole).toString();
        QDomNodeList profilelist = doc.elementsByTagName("profile");
286
        int i = 0;
287 288 289 290 291 292 293 294 295 296 297
        while (!profilelist.item(i).isNull()) {
            // make sure a profile with same name doesn't exist
            documentElement = profilelist.item(i).toElement();
            QString profileName = documentElement.attribute("name");
            if (profileName == newProfileName) {
                // a profile with that same name already exists
                bool ok;
                newProfileName = QInputDialog::getText(this, i18n("Profile already exists"), i18n("This profile name already exists. Change the name if you don't want to overwrite it."), QLineEdit::Normal, newProfileName, &ok);
                if (!ok) return;
                if (profileName == newProfileName) {
                    profiles.removeChild(profilelist.item(i));
298 299 300
                    break;
                }
            }
301
            i++;
302
        }
303

304 305
        QDomElement profileElement = doc.createElement("profile");
        profileElement.setAttribute("name", newProfileName);
306 307
        profileElement.setAttribute("category", newGroupName);
        profileElement.setAttribute("destinationid", newMetaGroupId);
308
        profileElement.setAttribute("extension", ui.extension->text().simplified());
309
        profileElement.setAttribute("args", ui.parameters->toPlainText().simplified());
310
        profiles.appendChild(profileElement);
311 312 313 314 315 316 317 318 319 320 321

        //QCString save = doc.toString().utf8();

        if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
            KMessageBox::sorry(this, i18n("Unable to write to file %1", exportFile));
            delete d;
            return;
        }
        QTextStream out(&file);
        out << doc.toString();
        file.close();
322
        parseProfiles(newMetaGroupId, newGroupName, newProfileName);
323 324 325 326
    }
    delete d;
}

327 328 329 330 331 332 333 334 335 336 337 338
void RenderWidget::slotEditProfile() {
    QListWidgetItem *item = m_view.size_list->currentItem();
    if (!item) return;
    QString currentGroup = m_view.format_list->currentItem()->text();

    QString params = item->data(ParamsRole).toString();
    QString extension = item->data(ExtensionRole).toString();
    QString currentProfile = item->text();

    Ui::SaveProfile_UI ui;
    QDialog *d = new QDialog(this);
    ui.setupUi(d);
339 340 341 342 343 344 345 346 347 348 349

    for (int i = 0; i < m_view.destination_list->count(); i++)
        ui.destination_list->addItem(m_view.destination_list->itemIcon(i), m_view.destination_list->itemText(i), m_view.destination_list->itemData(i, Qt::UserRole));

    ui.destination_list->setCurrentIndex(m_view.destination_list->currentIndex());
    QString dest = ui.destination_list->itemData(ui.destination_list->currentIndex(), Qt::UserRole).toString();

    QString customGroup = m_view.format_list->currentItem()->text();
    if (customGroup.isEmpty()) customGroup = i18n("Custom");
    ui.group_name->setText(customGroup);

350 351 352 353
    ui.profile_name->setText(currentProfile);
    ui.extension->setText(extension);
    ui.parameters->setText(params);
    ui.profile_name->setFocus();
354
    d->setWindowTitle(i18n("Edit Profile"));
355
    if (d->exec() == QDialog::Accepted) {
356
        slotDeleteProfile(false);
357
        QString exportFile = KStandardDirs::locateLocal("appdata", "export/customprofiles.xml");
358 359 360 361 362
        QDomDocument doc;
        QFile file(exportFile);
        doc.setContent(&file, false);
        file.close();
        QDomElement documentElement;
363 364 365 366 367 368 369 370 371 372 373 374 375 376 377
        QDomElement profiles = doc.documentElement();

        if (profiles.isNull() || profiles.tagName() != "profiles") {
            doc.clear();
            profiles = doc.createElement("profiles");
            profiles.setAttribute("version", 1);
            doc.appendChild(profiles);
        }

        int version = profiles.attribute("version", 0).toInt();
        if (version < 1) {
            kDebug() << "// OLD profile version";
            doc.clear();
            profiles = doc.createElement("profiles");
            profiles.setAttribute("version", 1);
378
            doc.appendChild(profiles);
379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397
        }

        QString newProfileName = ui.profile_name->text().simplified();
        QString newGroupName = ui.group_name->text().simplified();
        if (newGroupName.isEmpty()) newGroupName = i18n("Custom");
        QString newMetaGroupId = ui.destination_list->itemData(ui.destination_list->currentIndex(), Qt::UserRole).toString();
        QDomNodeList profilelist = doc.elementsByTagName("profile");
        int i = 0;
        while (!profilelist.item(i).isNull()) {
            // make sure a profile with same name doesn't exist
            documentElement = profilelist.item(i).toElement();
            QString profileName = documentElement.attribute("name");
            if (profileName == newProfileName) {
                // a profile with that same name already exists
                bool ok;
                newProfileName = QInputDialog::getText(this, i18n("Profile already exists"), i18n("This profile name already exists. Change the name if you don't want to overwrite it."), QLineEdit::Normal, newProfileName, &ok);
                if (!ok) return;
                if (profileName == newProfileName) {
                    profiles.removeChild(profilelist.item(i));
398 399 400
                    break;
                }
            }
401
            i++;
402
        }
403

404 405
        QDomElement profileElement = doc.createElement("profile");
        profileElement.setAttribute("name", newProfileName);
406 407
        profileElement.setAttribute("category", newGroupName);
        profileElement.setAttribute("destinationid", newMetaGroupId);
408
        profileElement.setAttribute("extension", ui.extension->text().simplified());
409
        profileElement.setAttribute("args", ui.parameters->toPlainText().simplified());
410
        profiles.appendChild(profileElement);
411 412 413 414 415 416 417 418 419 420 421

        //QCString save = doc.toString().utf8();

        if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
            KMessageBox::sorry(this, i18n("Unable to write to file %1", exportFile));
            delete d;
            return;
        }
        QTextStream out(&file);
        out << doc.toString();
        file.close();
422
        parseProfiles(newMetaGroupId, newGroupName, newProfileName);
423 424 425 426
    }
    delete d;
}

427
void RenderWidget::slotDeleteProfile(bool refresh) {
428 429 430 431 432 433 434 435 436 437 438
    //TODO: delete a profile installed by KNewStuff the easy way
    /*
    QString edit = m_view.size_list->currentItem()->data(EditableRole).toString();
    if (!edit.endsWith("customprofiles.xml")) {
        // This is a KNewStuff installed file, process through KNS
        KNS::Engine engine(0);
        if (engine.init("kdenlive_render.knsrc")) {
            KNS::Entry::List entries;
        }
        return;
    }*/
439 440
    QString currentGroup = m_view.format_list->currentItem()->text();
    QString currentProfile = m_view.size_list->currentItem()->text();
441
    QString metaGroupId = m_view.destination_list->itemData(m_view.destination_list->currentIndex(), Qt::UserRole).toString();
442

443
    QString exportFile = KStandardDirs::locateLocal("appdata", "export/customprofiles.xml");
444 445 446 447 448 449
    QDomDocument doc;
    QFile file(exportFile);
    doc.setContent(&file, false);
    file.close();

    QDomElement documentElement;
450
    QDomNodeList profiles = doc.elementsByTagName("profile");
451
    int i = 0;
452 453 454
    QString groupName;
    QString profileName;
    QString destination;
455

456 457 458 459 460 461 462 463 464
    while (!profiles.item(i).isNull()) {
        documentElement = profiles.item(i).toElement();
        profileName = documentElement.attribute("name");
        groupName = documentElement.attribute("category");
        destination = documentElement.attribute("destinationid");

        if (profileName == currentProfile && groupName == currentGroup && destination == metaGroupId) {
            kDebug() << "// GOT it: " << profileName;
            doc.documentElement().removeChild(profiles.item(i));
465 466 467 468 469 470 471 472 473 474 475 476
            break;
        }
        i++;
    }

    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        KMessageBox::sorry(this, i18n("Unable to write to file %1", exportFile));
        return;
    }
    QTextStream out(&file);
    out << doc.toString();
    file.close();
477 478 479 480
    if (refresh) {
        parseProfiles(metaGroupId, currentGroup);
        focusFirstVisibleItem();
    }
481 482
}

483 484 485 486 487
void RenderWidget::updateButtons() {
    if (!m_view.size_list->currentItem() || m_view.size_list->currentItem()->isHidden()) {
        m_view.buttonSave->setEnabled(false);
        m_view.buttonDelete->setEnabled(false);
        m_view.buttonEdit->setEnabled(false);
488
        m_view.buttonStart->setEnabled(false);
489 490
    } else {
        m_view.buttonSave->setEnabled(true);
491
        m_view.buttonStart->setEnabled(m_view.size_list->currentItem()->flags() & Qt::ItemIsEnabled);
492
        QString edit = m_view.size_list->currentItem()->data(EditableRole).toString();
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
493
        if (edit.isEmpty() || !edit.endsWith("customprofiles.xml")) {
494 495 496
            m_view.buttonDelete->setEnabled(false);
            m_view.buttonEdit->setEnabled(false);
        } else {
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
497 498
            m_view.buttonDelete->setEnabled(true);
            m_view.buttonEdit->setEnabled(true);
499 500 501 502 503
        }
    }
}


504
void RenderWidget::focusFirstVisibleItem() {
505 506 507 508
    if (m_view.size_list->currentItem() && !m_view.size_list->currentItem()->isHidden()) {
        updateButtons();
        return;
    }
509
    for (uint ix = 0; ix < m_view.size_list->count(); ix++) {
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
510 511 512 513 514
        QListWidgetItem *item = m_view.size_list->item(ix);
        if (item && !item->isHidden()) {
            m_view.size_list->setCurrentRow(ix);
            break;
        }
515 516
    }
    if (!m_view.size_list->currentItem()) m_view.size_list->setCurrentRow(0);
517
    updateButtons();
518 519
}

520
void RenderWidget::slotExport(bool scriptExport) {
521 522
    QListWidgetItem *item = m_view.size_list->currentItem();
    if (!item) return;
523

524 525 526
    const QString dest = m_view.out_file->url().path();
    if (dest.isEmpty()) return;
    QFile f(dest);
527
    if (f.exists()) {
528
        if (KMessageBox::warningYesNo(this, i18n("Output file already exists. Do you want to overwrite it ?")) != KMessageBox::Yes)
529 530
            return;
    }
531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552

    QString scriptName;
    if (scriptExport) {
        bool ok;
        int ix = 0;
        QString scriptsFolder = m_projectFolder + "/scripts/";
        KStandardDirs::makeDir(scriptsFolder);
        QString path = scriptsFolder + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh";
        while (QFile::exists(path)) {
            ix++;
            path = scriptsFolder + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh";
        }
        scriptName = QInputDialog::getText(this, i18n("Create Render Script"), i18n("Script name (will be saved in: %1)", scriptsFolder), QLineEdit::Normal, KUrl(path).fileName(), &ok);
        if (!ok || scriptName.isEmpty()) return;
        scriptName.prepend(scriptsFolder);
        QFile f(scriptName);
        if (f.exists()) {
            if (KMessageBox::warningYesNo(this, i18n("Script file already exists. Do you want to overwrite it ?")) != KMessageBox::Yes)
                return;
        }
    }

553 554 555 556 557 558 559
    QStringList overlayargs;
    if (m_view.tc_overlay->isChecked()) {
        QString filterFile = KStandardDirs::locate("appdata", "metadata.properties");
        overlayargs << "meta.attr.timecode=1" << "meta.attr.timecode.markup=#timecode";
        overlayargs << "-attach" << "data_feed:attr_check" << "-attach";
        overlayargs << "data_show:" + filterFile << "_fezzik=1" << "dynamic=1";
    }
560 561 562 563 564 565
    double startPos = -1;
    double endPos = -1;
    if (m_view.render_guide->isChecked()) {
        startPos = m_view.guide_start->itemData(m_view.guide_start->currentIndex()).toDouble();
        endPos = m_view.guide_end->itemData(m_view.guide_end->currentIndex()).toDouble();
    }
566
    QString renderArgs = m_view.advanced_params->toPlainText();
567 568 569 570 571 572 573 574 575 576 577

    // Adjust frame scale
    int width;
    int height;
    if (m_view.rescale->isChecked() && m_view.rescale->isEnabled()) {
        width = m_view.rescale_size->text().section('x', 0, 0).toInt();
        height = m_view.rescale_size->text().section('x', 1, 1).toInt();
    } else {
        width = m_profile.width;
        height = m_profile.height;
    }
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
578
    renderArgs.replace("%dar", '@' + QString::number(m_profile.display_aspect_num) + '/' + QString::number(m_profile.display_aspect_den));
579 580 581 582 583 584 585 586

    // Adjust scanning
    if (m_view.scanning_list->currentIndex() == 1) renderArgs.append(" progressive=1");
    else if (m_view.scanning_list->currentIndex() == 2) renderArgs.append(" progressive=0");

    // disable audio if requested
    if (!m_view.export_audio->isChecked())
        renderArgs.append(" an=1 ");
587 588 589 590 591

    // Check if the rendering profile is different from project profile,
    // in which case we need to use the producer_comsumer from MLT
    bool resizeProfile = false;

592
    QString std = renderArgs;
593 594
    QString destination = m_view.destination_list->itemData(m_view.destination_list->currentIndex()).toString();
    if (std.contains(" s=")) {
595 596
        QString subsize = std.section(" s=", 1, 1);
        subsize = subsize.section(' ', 0, 0).toLower();
597
        const QString currentSize = QString::number(width) + 'x' + QString::number(height);
598
        if (subsize != currentSize) resizeProfile = true;
599
    } else if (destination != "audioonly") {
600
        // Add current size parametrer
601
        renderArgs.append(QString(" s=%1x%2").arg(width).arg(height));
602 603
    }

604 605
    // insert item in running jobs list
    QTreeWidgetItem *renderItem;
606
    QList<QTreeWidgetItem *> existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1);
607
    if (!existing.isEmpty()) renderItem = existing.at(0);
608 609
    else renderItem = new QTreeWidgetItem(m_view.running_jobs, QStringList() << QString() << dest << QString());
    renderItem->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 2));
610
    renderItem->setData(1, Qt::UserRole + 1, QTime::currentTime());
611

612
    // Set rendering type
613 614 615 616
    QString group = m_view.size_list->currentItem()->data(MetaGroupRole).toString();
    if (group == "dvd" && m_view.open_dvd->isChecked()) {
        renderItem->setData(0, Qt::UserRole, group);
        if (renderArgs.contains("profile=")) {
617
            // rendering profile contains an MLT profile, so pass it to the running jog item, useful for dvd
618 619 620 621 622
            QString prof = renderArgs.section("profile=", 1, 1);
            prof = prof.section(' ', 0, 0);
            kDebug() << "// render profile: " << prof;
            renderItem->setData(0, Qt::UserRole + 1, prof);
        }
623 624 625 626 627
    } else if (group == "websites" && m_view.open_browser->isChecked()) {
        renderItem->setData(0, Qt::UserRole, group);
        // pass the url
        QString url = m_view.size_list->currentItem()->data(ExtraRole).toString();
        renderItem->setData(0, Qt::UserRole + 1, url);
628
    }
629

630 631 632 633 634 635
    emit doRender(dest, item->data(RenderRole).toString(), overlayargs, renderArgs.simplified().split(' '), m_view.render_zone->isChecked(), m_view.play_after->isChecked(), startPos, endPos, resizeProfile, scriptName);
    if (scriptName.isEmpty()) m_view.tabWidget->setCurrentIndex(1);
    else {
        QTimer::singleShot(400, this, SLOT(parseScriptFiles()));
        m_view.tabWidget->setCurrentIndex(2);
    }
636 637
}

638 639 640 641
void RenderWidget::setProfile(MltVideoProfile profile) {
    m_profile = profile;
    //WARNING: this way to tell the video standard is a bit hackish...
    if (m_profile.description.contains("pal", Qt::CaseInsensitive) || m_profile.description.contains("25", Qt::CaseInsensitive) || m_profile.description.contains("50", Qt::CaseInsensitive)) m_view.format_selection->setCurrentIndex(0);
642
    else m_view.format_selection->setCurrentIndex(1);
643
    m_view.scanning_list->setCurrentIndex(0);
644 645 646 647
    refreshView();
}

void RenderWidget::refreshView() {
648
    m_view.size_list->blockSignals(true);
649 650 651
    QListWidgetItem *sizeItem;

    QString destination;
652
    KIcon brokenIcon("dialog-close");
653 654 655
    if (m_view.destination_list->currentIndex() > 0)
        destination = m_view.destination_list->itemData(m_view.destination_list->currentIndex()).toString();

656

657 658 659 660 661 662 663 664 665 666
    if (destination == "dvd") m_view.open_dvd->setVisible(true);
    else m_view.open_dvd->setVisible(false);
    if (destination == "websites") m_view.open_browser->setVisible(true);
    else m_view.open_browser->setVisible(false);
    if (!destination.isEmpty() && QString("dvd websites audioonly").contains(destination))
        m_view.rescale->setEnabled(false);
    else m_view.rescale->setEnabled(true);
    // hide groups that are not in the correct destination
    for (int i = 0; i < m_view.format_list->count(); i++) {
        sizeItem = m_view.format_list->item(i);
667
        if (sizeItem->data(MetaGroupRole).toString() == destination) {
668
            sizeItem->setHidden(false);
669
            //kDebug() << "// SET GRP:: " << sizeItem->text() << ", METY:" << sizeItem->data(MetaGroupRole).toString();
670
        } else sizeItem->setHidden(true);
671 672 673 674 675 676 677 678 679 680 681
    }

    // activate first visible item
    QListWidgetItem * item = m_view.format_list->currentItem();
    if (!item || item->isHidden()) {
        for (int i = 0; i < m_view.format_list->count(); i++) {
            if (!m_view.format_list->item(i)->isHidden()) {
                m_view.format_list->setCurrentRow(i);
                break;
            }
        }
682 683
        item = m_view.format_list->currentItem();
    }
684 685 686 687 688 689 690 691
    if (!item || item->isHidden()) {
        m_view.format_list->setEnabled(false);
        m_view.size_list->setEnabled(false);
        return;
    } else {
        m_view.format_list->setEnabled(true);
        m_view.size_list->setEnabled(true);
    }
692 693 694 695 696 697
    int count = 0;
    for (int i = 0; i < m_view.format_list->count() && count < 2; i++) {
        if (!m_view.format_list->isRowHidden(i)) count++;
    }
    if (count > 1) m_view.format_list->setVisible(true);
    else m_view.format_list->setVisible(false);
698 699 700
    QString std;
    QString group = item->text();
    bool firstSelected = false;
701 702 703
    const QStringList formatsList = KdenliveSettings::supportedformats();
    const QStringList vcodecsList = KdenliveSettings::videocodecs();
    const QStringList acodecsList = KdenliveSettings::audiocodecs();
704

705 706
    for (int i = 0; i < m_view.size_list->count(); i++) {
        sizeItem = m_view.size_list->item(i);
707
        if ((sizeItem->data(GroupRole) == group || sizeItem->data(GroupRole).toString().isEmpty()) && sizeItem->data(MetaGroupRole) == destination) {
708
            std = sizeItem->data(StandardRole).toString();
709 710 711 712 713 714 715 716
            if (!std.isEmpty()) {
                if (std.contains("PAL", Qt::CaseInsensitive)) sizeItem->setHidden(m_view.format_selection->currentIndex() != 0);
                else if (std.contains("NTSC", Qt::CaseInsensitive)) sizeItem->setHidden(m_view.format_selection->currentIndex() != 1);
            } else {
                sizeItem->setHidden(false);
                if (!firstSelected) m_view.size_list->setCurrentItem(sizeItem);
                firstSelected = true;
            }
717

718 719 720 721 722 723 724 725 726 727 728
            if (!sizeItem->isHidden()) {
                // Make sure the selected profile uses an installed avformat codec / format
                std = sizeItem->data(ParamsRole).toString();

                if (!formatsList.isEmpty()) {
                    QString format;
                    if (std.startsWith("f=")) format = std.section("f=", 1, 1);
                    else if (std.contains(" f=")) format = std.section(" f=", 1, 1);
                    if (!format.isEmpty()) {
                        format = format.section(' ', 0, 0).toLower();
                        if (!formatsList.contains(format)) {
729
                            kDebug() << "***** UNSUPPORTED F: " << format;
730
                            //sizeItem->setHidden(true);
731
                            sizeItem->setFlags(Qt::ItemIsSelectable);
732 733
                            sizeItem->setToolTip(i18n("Unsupported video format: %1", format));
                            sizeItem->setIcon(brokenIcon);
734 735 736 737 738 739 740 741 742 743 744
                        }
                    }
                }
                if (!acodecsList.isEmpty() && !sizeItem->isHidden()) {
                    QString format;
                    if (std.startsWith("acodec=")) format = std.section("acodec=", 1, 1);
                    else if (std.contains(" acodec=")) format = std.section(" acodec=", 1, 1);
                    if (!format.isEmpty()) {
                        format = format.section(' ', 0, 0).toLower();
                        if (!acodecsList.contains(format)) {
                            kDebug() << "*****  UNSUPPORTED ACODEC: " << format;
745
                            //sizeItem->setHidden(true);
746
                            sizeItem->setFlags(Qt::ItemIsSelectable);
747 748
                            sizeItem->setToolTip(i18n("Unsupported audio codec: %1", format));
                            sizeItem->setIcon(brokenIcon);
749 750 751 752 753 754 755 756 757 758 759
                        }
                    }
                }
                if (!vcodecsList.isEmpty() && !sizeItem->isHidden()) {
                    QString format;
                    if (std.startsWith("vcodec=")) format = std.section("vcodec=", 1, 1);
                    else if (std.contains(" vcodec=")) format = std.section(" vcodec=", 1, 1);
                    if (!format.isEmpty()) {
                        format = format.section(' ', 0, 0).toLower();
                        if (!vcodecsList.contains(format)) {
                            kDebug() << "*****  UNSUPPORTED VCODEC: " << format;
760
                            //sizeItem->setHidden(true);
761
                            sizeItem->setFlags(Qt::ItemIsSelectable);
762 763
                            sizeItem->setToolTip(i18n("Unsupported video codec: %1", format));
                            sizeItem->setIcon(brokenIcon);
764 765 766 767
                        }
                    }
                }
            }
768 769
        } else sizeItem->setHidden(true);
    }
770
    focusFirstVisibleItem();
771 772
    m_view.size_list->blockSignals(false);
    refreshParams();
773 774
}

775 776 777 778 779 780 781 782 783
KUrl RenderWidget::filenameWithExtension(KUrl url, QString extension) {
    QString path;
    if (!url.isEmpty()) {
        path = url.path();
        int pos = path.lastIndexOf('.') + 1;
        if (pos == 0) path.append('.' + extension);
        else path = path.left(pos) + extension;

    } else {
784
        path = m_projectFolder + "/untitled." + extension;
785 786 787 788 789
    }
    return KUrl(path);
}


790 791
void RenderWidget::refreshParams() {
    QListWidgetItem *item = m_view.size_list->currentItem();
792 793 794 795 796
    if (!item || item->isHidden()) {
        m_view.advanced_params->clear();
        m_view.buttonStart->setEnabled(false);
        return;
    }
797 798
    QString params = item->data(ParamsRole).toString();
    QString extension = item->data(ExtensionRole).toString();
799
    m_view.advanced_params->setPlainText(params);
800 801 802 803 804 805 806 807 808
    QString destination = m_view.destination_list->itemData(m_view.destination_list->currentIndex()).toString();
    if (params.contains(" s=") || destination == "audioonly") {
        // profile has a fixed size, do not allow resize
        m_view.rescale->setEnabled(false);
        m_view.rescale_size->setEnabled(false);
    } else {
        m_view.rescale->setEnabled(true);
        m_view.rescale_size->setEnabled(true);
    }
809 810 811 812 813 814 815 816 817 818 819
    KUrl url = filenameWithExtension(m_view.out_file->url(), extension);
    m_view.out_file->setUrl(url);
//     if (!url.isEmpty()) {
//         QString path = url.path();
//         int pos = path.lastIndexOf('.') + 1;
//  if (pos == 0) path.append('.' + extension);
//         else path = path.left(pos) + extension;
//         m_view.out_file->setUrl(KUrl(path));
//     } else {
//         m_view.out_file->setUrl(KUrl(QDir::homePath() + "/untitled." + extension));
//     }
820
    m_view.out_file->setFilter("*." + extension);
821
    QString edit = item->data(EditableRole).toString();
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
822
    if (edit.isEmpty() || !edit.endsWith("customprofiles.xml")) {
823 824 825
        m_view.buttonDelete->setEnabled(false);
        m_view.buttonEdit->setEnabled(false);
    } else {
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
826 827
        m_view.buttonDelete->setEnabled(true);
        m_view.buttonEdit->setEnabled(true);
828
    }
829 830

    m_view.buttonStart->setEnabled(m_view.size_list->currentItem()->flags() & Qt::ItemIsEnabled);
831 832
}

833 834 835 836
void RenderWidget::reloadProfiles() {
    parseProfiles();
}

837
void RenderWidget::parseProfiles(QString meta, QString group, QString profile) {
838 839
    m_view.size_list->clear();
    m_view.format_list->clear();
840 841
    m_view.destination_list->clear();
    m_view.destination_list->addItem(KIcon("video-x-generic"), i18n("File rendering"));
842 843 844 845 846 847 848
    m_view.destination_list->addItem(KIcon("media-optical"), i18n("DVD"), "dvd");
    m_view.destination_list->addItem(KIcon("audio-x-generic"), i18n("Audio only"), "audioonly");
    m_view.destination_list->addItem(KIcon("applications-internet"), i18n("Web sites"), "websites");
    m_view.destination_list->addItem(KIcon("applications-multimedia"), i18n("Media players"), "mediaplayers");
    m_view.destination_list->addItem(KIcon("drive-harddisk"), i18n("Lossless / HQ"), "lossless");
    m_view.destination_list->addItem(KIcon("pda"), i18n("Mobile devices"), "mobile");

849
    QString exportFile = KStandardDirs::locate("appdata", "export/profiles.xml");
850
    parseFile(exportFile, false);
851 852 853 854 855 856


    QString exportFolder = KStandardDirs::locateLocal("appdata", "export/");
    QDir directory = QDir(exportFolder);
    QStringList filter;
    filter << "*.xml";
857 858 859 860
    QStringList fileList = directory.entryList(filter, QDir::Files);
    // We should parse customprofiles.xml in last position, so that user profiles
    // can also override profiles installed by KNewStuff
    fileList.removeAll("customprofiles.xml");
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
861
    foreach(const QString &filename, fileList)
862
    parseFile(exportFolder + '/' + filename, true);
863
    if (QFile::exists(exportFolder + "/customprofiles.xml")) parseFile(exportFolder + "/customprofiles.xml", true);
864

865 866 867 868 869
    if (!meta.isEmpty()) {
        m_view.destination_list->blockSignals(true);
        m_view.destination_list->setCurrentIndex(m_view.destination_list->findData(meta));
        m_view.destination_list->blockSignals(false);
    }
870
    refreshView();
871
    QList<QListWidgetItem *> child;
872
    if (!group.isEmpty()) child = m_view.format_list->findItems(group, Qt::MatchExactly);
873 874 875 876 877 878 879 880
    if (!child.isEmpty()) {
        for (int i = 0; i < child.count(); i++) {
            if (child.at(i)->data(MetaGroupRole).toString() == meta) {
                m_view.format_list->setCurrentItem(child.at(i));
                break;
            }
        }
    }
881 882
    child.clear();
    if (!profile.isEmpty()) child = m_view.size_list->findItems(profile, Qt::MatchExactly);
883
    if (!child.isEmpty()) m_view.size_list->setCurrentItem(child.at(0));
884 885 886
}

void RenderWidget::parseFile(QString exportFile, bool editable) {
887 888
    kDebug() << "// Parsing file: " << exportFile;
    kDebug() << "------------------------------";
889 890 891
    QDomDocument doc;
    QFile file(exportFile);
    doc.setContent(&file, false);
892
    file.close();
893 894
    QDomElement documentElement;
    QDomElement profileElement;
895 896
    QString extension;
    QListWidgetItem *item;
897 898
    QDomNodeList groups = doc.elementsByTagName("group");

899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933
    if (editable || groups.count() == 0) {
        QDomElement profiles = doc.documentElement();
        if (editable && profiles.attribute("version", 0).toInt() < 1) {
            kDebug() << "// OLD profile version";
            // this is an old profile version, update it
            QDomDocument newdoc;
            QDomElement newprofiles = newdoc.createElement("profiles");
            newprofiles.setAttribute("version", 1);
            newdoc.appendChild(newprofiles);
            QDomNodeList profilelist = doc.elementsByTagName("profile");
            for (int i = 0; i < profilelist.count(); i++) {
                QString category = i18n("Custom");
                QString extension;
                QDomNode parent = profilelist.at(i).parentNode();
                if (!parent.isNull()) {
                    QDomElement parentNode = parent.toElement();
                    if (parentNode.hasAttribute("name")) category = parentNode.attribute("name");
                    extension = parentNode.attribute("extension");
                }
                profilelist.at(i).toElement().setAttribute("category", category);
                if (!extension.isEmpty()) profilelist.at(i).toElement().setAttribute("extension", extension);
                QDomNode n = profilelist.at(i).cloneNode();
                newprofiles.appendChild(newdoc.importNode(n, true));
            }
            if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
                KMessageBox::sorry(this, i18n("Unable to write to file %1", exportFile));
                return;
            }
            QTextStream out(&file);
            out << newdoc.toString();
            file.close();
            parseFile(exportFile, editable);
            return;
        }

934 935 936 937 938
        QDomNode node = doc.elementsByTagName("profile").at(0);
        if (node.isNull()) {
            kDebug() << "// Export file: " << exportFile << " IS BROKEN";
            return;
        }
939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956
        int count = 1;
        while (!node.isNull()) {
            QDomElement profile = node.toElement();
            QString profileName = profile.attribute("name");
            QString standard = profile.attribute("standard");
            QString params = profile.attribute("args");
            QString category = profile.attribute("category", i18n("Custom"));
            QString dest = profile.attribute("destinationid");
            QString prof_extension = profile.attribute("extension");
            if (!prof_extension.isEmpty()) extension = prof_extension;

            QList <QListWidgetItem *> list = m_view.format_list->findItems(category, Qt::MatchExactly);
            bool exists = false;
            for (int j = 0; j < list.count(); j++) {
                if (list.at(j)->data(MetaGroupRole) == dest) {
                    exists = true;
                    break;
                }
957
            }
958 959 960 961 962
            if (!exists) {
                item = new QListWidgetItem(category, m_view.format_list);
                item->setData(MetaGroupRole, dest);
            }

963 964 965 966 967 968 969 970 971 972 973 974 975
            // Check if item with same name already exists and replace it,
            // allowing to override default profiles

            list = m_view.size_list->findItems(profileName, Qt::MatchExactly);

            for (int j = 0; j < list.count(); j++) {
                if (list.at(j)->data(MetaGroupRole) == dest) {
                    QListWidgetItem *duplicate = list.takeAt(j);
                    delete duplicate;
                    j--;
                }
            }

976 977 978
            item = new QListWidgetItem(profileName, m_view.size_list);
            //kDebug() << "// ADDINg item with name: " << profileName << ", GRP" << category << ", DEST:" << dest ;
            item->setData(GroupRole, category);
979
            item->setData(MetaGroupRole, dest);
980 981 982 983 984
            item->setData(ExtensionRole, extension);
            item->setData(RenderRole, "avformat");
            item->setData(StandardRole, standard);
            item->setData(ParamsRole, params);
            if (profile.hasAttribute("url")) item->setData(ExtraRole, profile.attribute("url"));
985 986 987
            if (editable) {
                item->setData(EditableRole, exportFile);
                if (exportFile.endsWith("customprofiles.xml")) item->setIcon(KIcon("emblem-favorite"));
Jean-Baptiste Mardelle's avatar
Jean-Baptiste Mardelle committed
988
                else item->setIcon(KIcon("applications-internet"));
989
            }
990 991
            node = doc.elementsByTagName("profile").at(count);
            count++;
992
        }
993 994
        return;
    }
995

996 997 998
    int i = 0;
    QString groupName;
    QString profileName;
999

1000 1001 1002 1003
    QString prof_extension;
    QString renderer;
    QString params;
    QString standard;
1004
    KIcon icon;
1005

1006 1007
    while (!groups.item(i).isNull()) {
        documentElement = groups.item(i).toElement();
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
        QDomNode gname = documentElement.elementsByTagName("groupname").at(0);
        QString metagroupName;
        QString metagroupId;
        if (!gname.isNull()) {
            metagroupName = gname.firstChild().nodeValue();
            metagroupId = gname.toElement().attribute("id");
            if (!metagroupName.isEmpty() && !m_view.destination_list->contains(metagroupName)) {
                if (metagroupId == "dvd") icon = KIcon("media-optical");
                else if (metagroupId == "audioonly") icon = KIcon("audio-x-generic");
                else if (metagroupId == "websites") icon = KIcon("applications-internet");
                else if (metagroupId == "mediaplayers") icon = KIcon("applications-multimedia");
                else if (metagroupId == "lossless")