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

0001 /*
0002     SPDX-FileCopyrightText: 1998-2009 Sebastian Trueg <trueg@k3b.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "k3bdiroperator.h"
0007 
0008 #include "k3bapplication.h"
0009 #include "k3b.h"
0010 #include "k3bcore.h"
0011 #include "k3baction.h"
0012 
0013 #include <KBookmarkManager>
0014 #include <KBookmarkMenu>
0015 #include <KConfigGroup>
0016 #include <KLocalizedString>
0017 #include <KActionCollection>
0018 #include <KActionMenu>
0019 
0020 #include <QDir>
0021 #include <QAction>
0022 #include <QMenu>
0023 
0024 K3b::DirOperator::DirOperator(const QUrl& url, QWidget* parent )
0025     : KDirOperator( url, parent )
0026 {
0027     setMode( KFile::Files );
0028 
0029     // disable the del-key since we still have a focus problem and users keep
0030     // deleting files when they want to remove project entries
0031     QAction* aTrash = action(KDirOperator::Trash);
0032     if( aTrash ) {
0033         aTrash->setShortcut( 0 );
0034     }
0035 
0036     // add the bookmark stuff
0037 
0038     QString dirPath = QStandardPaths::writableLocation( QStandardPaths::GenericDataLocation );
0039     QDir().mkpath( dirPath );
0040     QString bookmarksFile = dirPath + '/' + QString::fromLatin1("k3b/bookmarks.xml");
0041 
0042 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
0043     KBookmarkManager* bmMan = KBookmarkManager::managerForFile( bookmarksFile, "k3b" );
0044     bmMan->setEditorOptions( i18n("K3b Bookmarks"), false );
0045     bmMan->setUpdate( true );
0046 #else
0047     KBookmarkManager* bmMan = new KBookmarkManager( bookmarksFile, this );
0048 #endif
0049 
0050     m_bmPopup = new KActionMenu( QIcon::fromTheme("bookmarks"),i18n("Bookmarks"), this);
0051     m_bmPopup->setPopupMode( QToolButton::InstantPopup );
0052     m_bmMenu = new KBookmarkMenu(bmMan, this, m_bmPopup->menu());
0053 
0054     m_bmActionAddFileToProject = K3b::createAction( this,i18n("&Add to Project"), 0, Qt::SHIFT|Qt::Key_Return,
0055                                                     this, SLOT(slotAddFilesToProject()),
0056                                                     nullptr, "add_file_to_project");
0057 
0058     connect( this, SIGNAL(fileSelected(KFileItem)),
0059              this, SLOT(slotAddFilesToProject()) );
0060     connect( this, &KDirOperator::contextMenuAboutToShow,
0061              this, &DirOperator::extendContextMenu );
0062 }
0063 
0064 
0065 K3b::DirOperator::~DirOperator()
0066 {
0067     delete m_bmMenu;
0068 }
0069 
0070 
0071 void K3b::DirOperator::readConfig( const KConfigGroup& grp )
0072 {
0073     KDirOperator::readConfig( grp );
0074     
0075     m_bmPopup->setVisible( grp.readEntry( "show bookmarks", false ) );
0076     
0077     // There seems to be a bug in the KDELibs which makes setURL crash on
0078     // some systems when used with a non-existing url
0079     QString lastUrl = grp.readPathEntry( "last url", QDir::home().absolutePath() );
0080     while( !QFile::exists(lastUrl) ) {
0081         QString urlUp = lastUrl.section( '/', 0, -2 );
0082         if( urlUp == lastUrl )
0083             lastUrl = QDir::home().absolutePath();
0084         else
0085             lastUrl = urlUp;
0086     }
0087     
0088     // There seems to be another bug in KDELibs which shows
0089     // neverending busy cursor when we call setUrl() after setView()
0090     // so we call it in the right order (see bug 113649)
0091     setUrl( QUrl::fromLocalFile(lastUrl), true );
0092     setViewMode( KFile::Default );
0093 
0094     emit urlEntered( url() );
0095 }
0096 
0097 
0098 void K3b::DirOperator::writeConfig( KConfigGroup& grp )
0099 {
0100     KDirOperator::writeConfig(grp );
0101     grp.writeEntry( "show bookmarks", m_bmPopup->isVisible() );
0102     grp.writePathEntry( "last url", url().toLocalFile() );
0103 }
0104 
0105 
0106 void K3b::DirOperator::openBookmark(const KBookmark & bm, Qt::MouseButtons, Qt::KeyboardModifiers)
0107 {
0108     setUrl( bm.url(), true );
0109 }
0110 
0111 
0112 QString K3b::DirOperator::currentTitle() const
0113 {
0114     return url().toDisplayString( QUrl::PreferLocalFile | QUrl::StripTrailingSlash );
0115 }
0116 
0117 
0118 QUrl K3b::DirOperator::currentUrl() const
0119 {
0120     return url();
0121 }
0122 
0123 
0124 void K3b::DirOperator::extendContextMenu( const KFileItem&, QMenu* menu )
0125 {
0126     QAction* firstAction = menu->actions().first();
0127     menu->insertAction( firstAction, m_bmActionAddFileToProject );
0128     menu->insertSeparator( firstAction );
0129     menu->addSeparator();
0130     menu->addAction( m_bmPopup );
0131 
0132     bool hasSelection = !selectedItems().isEmpty();
0133     /*
0134       view() && view()->selectedItems() &&
0135       !view()->selectedItems()->isEmpty();
0136     */
0137     m_bmActionAddFileToProject->setEnabled( hasSelection && k3bappcore->k3bMainWindow()->activeView() != 0 );
0138 }
0139 
0140 
0141 void K3b::DirOperator::slotAddFilesToProject()
0142 {
0143     QList<QUrl> files;
0144     QList<KFileItem> items(selectedItems());
0145     Q_FOREACH( const KFileItem& fileItem, items ) {
0146         files.append( fileItem.url() );
0147     }
0148     if( !files.isEmpty() ) {
0149         k3bappcore->k3bMainWindow()->addUrls( files );
0150     }
0151 }
0152 
0153 #include "moc_k3bdiroperator.cpp"