File indexing completed on 2024-04-14 04:45:11

0001 /*
0002     SPDX-FileCopyrightText: 2003-2008 Sebastian Trueg <trueg@k3b.org>
0003     SPDX-FileCopyrightText: 2011 Michal Malek <michalm@jabster.pl>
0004     SPDX-FileCopyrightText: 1998-2008 Sebastian Trueg <trueg@k3b.org>
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include <config-k3b.h>
0009 #include "k3bdirview.h"
0010 #include "k3b.h"
0011 #include "k3bappdevicemanager.h"
0012 #include "k3bapplication.h"
0013 #include "k3bdevice.h"
0014 #include "k3bdevicehandler.h"
0015 #include "k3bdiskinfoview.h"
0016 #include "k3bexternalbinmanager.h"
0017 #include "k3bfileview.h"
0018 #include "k3bfiletreeview.h"
0019 #include "k3bmediacache.h"
0020 #include "k3bthememanager.h"
0021 #include "rip/k3baudiocdview.h"
0022 #include "rip/k3bvideocdview.h"
0023 #ifdef ENABLE_DVD_RIPPING
0024 #include "rip/videodvd/k3bvideodvdrippingview.h"
0025 #endif
0026 
0027 #include <KConfigGroup>
0028 #include <KNotification>
0029 #include <KLocalizedString>
0030 #include <KMessageBox>
0031 
0032 #include <QDir>
0033 #include <QUrl>
0034 #include <QString>
0035 #include <QSplitter>
0036 #include <QStackedWidget>
0037 #include <QVBoxLayout>
0038 
0039 class K3b::DirView::Private
0040 {
0041 public:
0042     QStackedWidget* viewStack;
0043 
0044     AudioCdView* cdView;
0045     VideoCdView* videoView;
0046 #ifdef ENABLE_DVD_RIPPING
0047     VideoDVDRippingView* movieView;
0048 #endif
0049     FileView* fileView;
0050     DiskInfoView* infoView;
0051 
0052     QSplitter* mainSplitter;
0053     FileTreeView* fileTreeView;
0054 
0055     bool bViewDiskInfo;
0056     bool contextMediaInfoRequested;
0057 
0058     void setCurrentView( K3b::ContentsView* view );
0059 };
0060 
0061 
0062 void K3b::DirView::Private::setCurrentView( K3b::ContentsView* view )
0063 {
0064     if( ContentsView* previous = qobject_cast<ContentsView*>( viewStack->currentWidget() ) ) {
0065         previous->activate( false );
0066     }
0067 
0068     viewStack->setCurrentWidget( view );
0069     view->activate( true );
0070 }
0071 
0072 
0073 K3b::DirView::DirView( K3b::FileTreeView* treeView, QWidget* parent )
0074     : QWidget(parent),
0075       d( new Private )
0076 {
0077     d->fileTreeView = treeView;
0078     d->bViewDiskInfo = false;
0079     d->contextMediaInfoRequested = false;
0080 
0081     QVBoxLayout* layout = new QVBoxLayout( this );
0082     layout->setContentsMargins( 0, 0, 0, 0 );
0083 
0084     if( !d->fileTreeView ) {
0085         d->mainSplitter = new QSplitter( this );
0086         d->fileTreeView = new K3b::FileTreeView( d->mainSplitter );
0087         d->viewStack    = new QStackedWidget( d->mainSplitter );
0088         layout->addWidget( d->mainSplitter );
0089     }
0090     else {
0091         d->viewStack    = new QStackedWidget( this );
0092         d->mainSplitter = 0;
0093         layout->addWidget( d->viewStack );
0094     }
0095 
0096     d->fileView     = new K3b::FileView( d->viewStack );
0097     d->viewStack->addWidget( d->fileView );
0098     d->cdView       = new K3b::AudioCdView( d->viewStack );
0099     d->viewStack->addWidget( d->cdView );
0100     d->videoView    = new K3b::VideoCdView( d->viewStack );
0101     d->viewStack->addWidget( d->videoView );
0102     d->infoView     = new K3b::DiskInfoView( d->viewStack );
0103     d->viewStack->addWidget( d->infoView );
0104 #ifdef ENABLE_DVD_RIPPING
0105     d->movieView    = new K3b::VideoDVDRippingView( d->viewStack );
0106     d->viewStack->addWidget( d->movieView );
0107 #endif
0108 
0109     d->setCurrentView( d->fileView );
0110 
0111 //     d->fileTreeView->setCurrentDevice( k3bappcore->appDeviceManager()->currentDevice() );
0112 
0113     if( d->mainSplitter ) {
0114         // split
0115         QList<int> sizes = d->mainSplitter->sizes();
0116         int all = sizes[0] + sizes[1];
0117         sizes[1] = all*2/3;
0118         sizes[0] = all - sizes[1];
0119         d->mainSplitter->setSizes( sizes );
0120     }
0121 
0122     connect( d->fileTreeView, SIGNAL(activated(QUrl)),
0123              this, SLOT(slotDirActivated(QUrl)) );
0124     connect( d->fileTreeView, SIGNAL(activated(K3b::Device::Device*)),
0125              this, SLOT(showDevice(K3b::Device::Device*)) );
0126     connect( d->fileTreeView, SIGNAL(activated(K3b::Device::Device*)),
0127              this, SIGNAL(deviceSelected(K3b::Device::Device*)) );
0128 
0129     connect( d->fileView, SIGNAL(urlEntered(QUrl)), d->fileTreeView, SLOT(setSelectedUrl(QUrl)) );
0130     connect( d->fileView, SIGNAL(urlEntered(QUrl)), this, SIGNAL(urlEntered(QUrl)) );
0131 
0132     connect( k3bappcore->appDeviceManager(), SIGNAL(mountFinished(QString)),
0133              this, SLOT(slotMountFinished(QString)) );
0134     connect( k3bappcore->appDeviceManager(), SIGNAL(unmountFinished(bool)),
0135              this, SLOT(slotUnmountFinished(bool)) );
0136 }
0137 
0138 K3b::DirView::~DirView()
0139 {
0140     delete d;
0141 }
0142 
0143 
0144 void K3b::DirView::showUrl( const QUrl& url )
0145 {
0146     qDebug() << url;
0147     slotDirActivated( url );
0148 }
0149 
0150 
0151 void K3b::DirView::showDevice( K3b::Device::Device* dev )
0152 {
0153     d->contextMediaInfoRequested = true;
0154     d->fileTreeView->setSelectedDevice( dev );
0155     showMediumInfo( k3bappcore->mediaCache()->medium( dev ) );
0156 }
0157 
0158 
0159 void K3b::DirView::showDiskInfo( K3b::Device::Device* dev )
0160 {
0161     d->contextMediaInfoRequested = false;
0162     d->fileTreeView->setSelectedDevice( dev );
0163     showMediumInfo( k3bappcore->mediaCache()->medium( dev ) );
0164 }
0165 
0166 
0167 void K3b::DirView::showMediumInfo( const K3b::Medium& medium )
0168 {
0169     if( !d->contextMediaInfoRequested ||
0170         medium.diskInfo().diskState() == K3b::Device::STATE_EMPTY ||
0171         medium.diskInfo().diskState() == K3b::Device::STATE_NO_MEDIA ) {
0172 
0173         // show cd info
0174         d->setCurrentView( d->infoView );
0175         d->infoView->reload( medium );
0176         return;
0177     }
0178 
0179 #ifdef ENABLE_DVD_RIPPING
0180     else if( medium.content() & K3b::Medium::ContentVideoDVD ) {
0181         d->movieView->reload( medium );
0182         d->setCurrentView( d->movieView );
0183         return;
0184     }
0185 #endif
0186 
0187     else if( medium.content() & K3b::Medium::ContentVideoCD ) {
0188         if( k3bcore ->externalBinManager() ->foundBin( "vcdxrip" ) ) {
0189             d->setCurrentView( d->videoView );
0190             d->videoView->reload( medium );
0191         }
0192         else {
0193             KMessageBox::error( this, i18n("K3b uses vcdxrip from the vcdimager package to rip Video CDs. "
0194                                            "Please make sure it is installed.") );
0195             k3bappcore->appDeviceManager()->mountDisk( medium.device() );
0196         }
0197     }
0198 
0199     else if( medium.content() & K3b::Medium::ContentAudio ) {
0200         d->setCurrentView( d->cdView );
0201         d->cdView->reload( medium );
0202     }
0203 
0204     else if( medium.content() & K3b::Medium::ContentData ) {
0205         k3bappcore->appDeviceManager()->mountDisk( medium.device() );
0206     }
0207 
0208     else {
0209         // show cd info
0210         d->setCurrentView( d->infoView );
0211         d->infoView->reload( medium );
0212     }
0213 
0214     d->contextMediaInfoRequested = false;
0215 }
0216 
0217 
0218 void K3b::DirView::slotMountFinished( const QString& mp )
0219 {
0220     if( !mp.isEmpty() ) {
0221         slotDirActivated( QUrl::fromLocalFile(mp) );
0222         d->fileView->reload(); // HACK to get the contents shown... FIXME
0223     }
0224     else {
0225         d->setCurrentView( d->fileView );
0226         KNotification::event( "MountFailed",
0227                               i18n("Mount Failed"),
0228                               i18n("<p>K3b was unable to mount medium <b>%1</b> in device <em>%2 - %3</em>",
0229                                    k3bappcore->mediaCache()->medium( k3bappcore->appDeviceManager()->currentDevice() ).shortString(),
0230                                    k3bappcore->appDeviceManager()->currentDevice()->vendor(),
0231                                    k3bappcore->appDeviceManager()->currentDevice()->description() ) );
0232     }
0233 }
0234 
0235 
0236 void K3b::DirView::slotUnmountFinished( bool success )
0237 {
0238     if( success ) {
0239         // TODO: check if the fileview is still displaying a folder from the medium
0240     }
0241     else {
0242         KNotification::event( "MountFailed",
0243                               i18n("Unmount Failed"),
0244                               i18n("<p>K3b was unable to unmount medium <b>%1</b> in device <em>%2 - %3</em>",
0245                                    k3bappcore->mediaCache()->medium( k3bappcore->appDeviceManager()->currentDevice() ).shortString(),
0246                                    k3bappcore->appDeviceManager()->currentDevice()->vendor(),
0247                                    k3bappcore->appDeviceManager()->currentDevice()->description() ) );
0248     }
0249 }
0250 
0251 
0252 void K3b::DirView::slotDirActivated( const QUrl& url )
0253 {
0254     qDebug() << url;
0255     d->fileView->setUrl( url, true );
0256     d->setCurrentView( d->fileView );
0257 }
0258 
0259 
0260 void K3b::DirView::home()
0261 {
0262     slotDirActivated( QUrl::fromLocalFile(QDir::homePath()) );
0263 }
0264 
0265 
0266 void K3b::DirView::saveConfig( KConfigGroup grp )
0267 {
0268     d->fileView->saveConfig(grp);
0269 }
0270 
0271 
0272 void K3b::DirView::readConfig( const KConfigGroup &grp )
0273 {
0274     d->fileView->readConfig(grp);
0275 }
0276 
0277 #include "moc_k3bdirview.cpp"