k3bexporter.cpp 5.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/**
 * Copyright (C) 2004 Michael Pyne <mpyne@kde.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, see <http://www.gnu.org/licenses/>.
 */
16

17 18
#include "k3bexporter.h"

Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
19
#include <kprocess.h>
20 21 22 23 24 25
#include <kmessagebox.h>
#include <kurl.h>
#include <klocale.h>
#include <kaction.h>
#include <kactioncollection.h>
#include <kstandarddirs.h>
26
#include <kicon.h>
27 28 29
#include <kiconloader.h>
#include <kapplication.h>

30
#include <QMap>
31 32 33 34 35 36 37 38

#include "playlistitem.h"
#include "playlist.h"
#include "playlistbox.h"
#include "actioncollection.h"

using ActionCollection::actions;

39 40 41 42 43 44 45 46 47 48
// static member variable definition

PlaylistAction *K3bExporter::m_action = 0;

// Special KAction subclass used to automatically call a slot when activated,
// depending on the visible playlist at the time.  In other words, use *one*
// instance of this action for many playlists.
//
// This is used to handle some actions in the Playlist context menu.

Pierre Ducroquet's avatar
Pierre Ducroquet committed
49 50 51 52 53 54 55 56 57 58 59
PlaylistAction::PlaylistAction(const QString &userText,
                const QIcon &pix,
                const char *slot,
                const KShortcut &cut) :
    KAction(userText, actions()),
    m_slot(slot)
{
    setShortcut(cut);
    QAction::setIcon(pix);
    connect(this, SIGNAL(triggered()), this, SLOT(slotActivated()));
}
60

Pierre Ducroquet's avatar
Pierre Ducroquet committed
61 62 63 64 65 66 67 68
/**
 * Defines a QObject to call (using the m_slot SLOT) when an action is
 * emitted from a Playlist.
 */
void PlaylistAction::addCallMapping(const Playlist *p, QObject *obj)
{
    m_playlistRecipient[p] = obj;
}
69

Pierre Ducroquet's avatar
Pierre Ducroquet committed
70 71 72 73 74 75 76 77 78 79 80 81 82
void PlaylistAction::slotActivated()
{
    // Determine current playlist, and call its slot.
    Playlist *p = PlaylistCollection::instance()->visiblePlaylist();
    if(!p)
        return;
    // Make sure we're supposed to notify someone about this playlist.
    QObject *recipient = m_playlistRecipient[p];
    if(!recipient)
        return;
    // Invoke the slot using some trickery.
    recipient->metaObject()->invokeMethod(recipient, m_slot);
}
83

84 85 86 87 88 89
K3bExporter::K3bExporter(Playlist *parent) : PlaylistExporter(parent), m_parent(parent)
{
}

KAction *K3bExporter::action()
{
90 91 92
    if(!m_action && !KStandardDirs::findExe("k3b").isNull()) {
        m_action = new PlaylistAction(
            i18n("Add Selected Items to Audio or Data CD"),
93
            KIcon( QLatin1String( "k3b" )),
Pierre Ducroquet's avatar
Pierre Ducroquet committed
94
            "slotExport"
95
        );
96
        m_action->setShortcutConfigurable(false);
97
    }
98 99 100 101 102 103
    // Tell the action to let us know when it is activated when
    // m_parent is the visible playlist.  This allows us to reuse the
    // action to avoid duplicate entries in KActionCollection.
    if(m_action)
        m_action->addCallMapping(m_parent, this);
    return m_action;
104 105 106 107 108 109
}

void K3bExporter::exportPlaylistItems(const PlaylistItemList &items)
{
    if(items.empty())
        return;
Pierre Ducroquet's avatar
Pierre Ducroquet committed
110
    exportViaCmdLine(items);
111 112 113 114 115 116 117 118 119 120 121
}

void K3bExporter::slotExport()
{
    if(m_parent)
        exportPlaylistItems(m_parent->selectedItems());
}

void K3bExporter::exportViaCmdLine(const PlaylistItemList &items)
{
    K3bOpenMode mode = openMode();
Laurent Montel's avatar
Laurent Montel committed
122
    QByteArray cmdOption;
123 124 125 126 127 128 129

    switch(mode) {
    case AudioCD:
        cmdOption = "--audiocd";
        break;

    case DataCD:
130
        cmdOption = "--data";
131 132 133 134 135 136
        break;

    case Abort:
        return;
    }

Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
137
    KProcess process;
138

Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
139 140
    process << "k3b";
    process << cmdOption;
141 142 143

    PlaylistItemList::ConstIterator it;
    for(it = items.begin(); it != items.end(); ++it)
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
144
        process << (*it)->file().absFilePath();
145

Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
146
    if(!process.startDetached())
Andrew Coles's avatar
Andrew Coles committed
147
        KMessageBox::error(m_parent, i18n("Unable to start K3b."));
148 149 150 151 152 153 154 155 156
}

K3bExporter::K3bOpenMode K3bExporter::openMode()
{
    int reply = KMessageBox::questionYesNoCancel(
        m_parent,
        i18n("Create an audio mode CD suitable for CD players, or a data "
             "mode CD suitable for computers and other digital music "
             "players?"),
157
        i18n("Create K3b Project"),
Laurent Montel's avatar
Laurent Montel committed
158 159
        KGuiItem(i18n("Audio Mode")),
        KGuiItem(i18n("Data Mode"))
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
    );

    switch(reply) {
    case KMessageBox::Cancel:
        return Abort;

    case KMessageBox::No:
        return DataCD;

    case KMessageBox::Yes:
        return AudioCD;
    }

    return Abort;
}

K3bPlaylistExporter::K3bPlaylistExporter(PlaylistBox *parent) : K3bExporter(0),
    m_playlistBox(parent)
{
}

KAction *K3bPlaylistExporter::action()
{
    if(!KStandardDirs::findExe("k3b").isNull()) {
184
        KAction *action = new KAction(KIcon( QLatin1String( "k3b" )),
185
            i18n("Add Playlist to Audio or Data CD"),
186
            actions()
187
        );
188 189
        connect(action, SIGNAL(triggered(bool)), SLOT(slotExport()));
        return action;
190 191 192 193 194 195 196 197
    }

    return 0;
}

void K3bPlaylistExporter::slotExport()
{
    if(m_playlistBox) {
198 199
        setPlaylist(m_playlistBox->visiblePlaylist());
        exportPlaylistItems(m_playlistBox->visiblePlaylist()->items());
200 201 202 203 204
    }
}

#include "k3bexporter.moc"

205
// vim: set et sw=4 tw=0 sta: