File indexing completed on 2025-04-20 04:27:46
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"