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

0001 /*
0002     SPDX-FileCopyrightText: 1998-2009 Sebastian Trueg <trueg@k3b.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "k3bfileview.h"
0007 #include "k3b.h"
0008 #include "k3bdiroperator.h"
0009 #include "k3bapplication.h"
0010 
0011 #include <KFileFilterCombo>
0012 #include <KFileItem>
0013 #include <KLocalizedString>
0014 #include <KDirLister>
0015 #include <KActionMenu>
0016 #include <KToolBarSpacerAction>
0017 #include <KActionCollection>
0018 #include <KToolBar>
0019 
0020 #include <QDebug>
0021 #include <QDir>
0022 #include <QUrl>
0023 #include <QIcon>
0024 #include <QAction>
0025 #include <QHBoxLayout>
0026 #include <QLayout>
0027 #include <QLabel>
0028 #include <QProgressBar>
0029 #include <QToolButton>
0030 #include <QVBoxLayout>
0031 #include <QWidget>
0032 
0033 
0034 class K3b::FileView::Private
0035 {
0036 public:
0037     KToolBar* toolBox;
0038     DirOperator* dirOp;
0039     KFileFilterCombo* filterWidget;
0040     QAction* actionShowBookmarks;
0041 };
0042 
0043 
0044 K3b::FileView::FileView(QWidget *parent )
0045     : K3b::ContentsView( false, parent),
0046       d( new Private )
0047 {
0048     d->dirOp = new K3b::DirOperator( QUrl::fromLocalFile(QDir::home().absolutePath()), this );
0049     d->toolBox = new KToolBar( this );
0050     d->toolBox->setToolButtonStyle( Qt::ToolButtonIconOnly );
0051 
0052     QVBoxLayout* layout = new QVBoxLayout( this );
0053     layout->setContentsMargins( 0, 0, 0, 0 );
0054     layout->setSpacing( 0 );
0055     layout->addWidget( d->toolBox );
0056     layout->addWidget( d->dirOp, 1 );
0057 
0058     // setup actions
0059     QAction* actionBack = d->dirOp->action(KDirOperator::Back);
0060     QAction* actionForward = d->dirOp->action(KDirOperator::Forward);
0061     QAction* actionUp = d->dirOp->action(KDirOperator::Up);
0062     QAction* actionReload = d->dirOp->action(KDirOperator::Reload);
0063 
0064     // create filter selection combobox
0065     QWidget* filterBox = new QWidget( d->toolBox );
0066     QHBoxLayout* filterLayout = new QHBoxLayout( filterBox );
0067     filterLayout->addWidget( new QLabel( i18n("Filter:"), filterBox ) );
0068     d->filterWidget = new KFileFilterCombo( filterBox );
0069     filterLayout->addWidget( d->filterWidget );
0070     filterLayout->setContentsMargins( 0, 0, 0, 0 );
0071 
0072     d->filterWidget->setEditable( true );
0073 
0074 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
0075     QString filter = "*|" + i18n("All Files");
0076     filter += '\n' + "audio/x-mp3 audio/x-wav application/x-ogg|" + i18n("Sound Files");
0077     filter += '\n' + "audio/x-wav |" + i18n("Wave Sound Files");
0078     filter += '\n' + "audio/x-mp3 |" + i18n("MP3 Sound Files");
0079     filter += '\n' + "application/x-ogg |" + i18n("Ogg Vorbis Sound Files");
0080     filter += '\n' + "video/mpeg |" + i18n("MPEG Video Files");
0081     d->filterWidget->setFilter(filter);
0082 #else
0083     const QList<KFileFilter> filters {
0084         KFileFilter(i18n("All Files"), {"*"}, {}),
0085         KFileFilter(i18n("Sound Files"), {}, {"audio/x-mp3", "audio/x-wav", "application/x-ogg"}),
0086         KFileFilter(i18n("Wave Sound Files"), {}, {"audio/x-wav"}),
0087         KFileFilter(i18n("MP3 Sound Files"), {}, {"audio/x-mp3"}),
0088         KFileFilter(i18n("Ogg Vorbis Sound Files"), {}, {"application/x-ogg"}),
0089         KFileFilter(i18n("MPEG Video Files"), {}, {"video/mpeg"}),
0090     };
0091     d->filterWidget->setFilters(filters, filters.first());
0092 #endif
0093 
0094     d->actionShowBookmarks = new QAction( i18n("Show Bookmarks"), d->toolBox );
0095     d->actionShowBookmarks->setCheckable( true );
0096 
0097     KActionMenu* actionOptions = new KActionMenu( QIcon::fromTheme("configure"), i18n("Options"), d->toolBox );
0098     actionOptions->setPopupMode( QToolButton::InstantPopup );
0099     actionOptions->addAction( d->dirOp->action(KDirOperator::SortMenu) );
0100     actionOptions->addAction( d->dirOp->action(KDirOperator::ViewModeMenu) );
0101     actionOptions->addSeparator();
0102     actionOptions->addAction( d->dirOp->action(KDirOperator::DecorationMenu) );
0103     actionOptions->addSeparator();
0104     actionOptions->addAction( d->dirOp->action(KDirOperator::ShowHiddenFiles) );
0105     actionOptions->addAction( d->actionShowBookmarks );
0106     actionOptions->addAction( d->dirOp->action(KDirOperator::ShowPreview) );
0107 
0108     d->toolBox->addAction( actionBack );
0109     d->toolBox->addAction( actionForward );
0110     d->toolBox->addAction( actionUp );
0111     d->toolBox->addAction( actionReload );
0112     d->toolBox->addSeparator();
0113     d->toolBox->addAction( d->dirOp->action(KDirOperator::ShortView) );
0114     d->toolBox->addAction( d->dirOp->action(KDirOperator::DetailedView) );
0115     d->toolBox->addSeparator();
0116     d->toolBox->addSeparator();
0117     d->toolBox->addWidget( filterBox );
0118     d->toolBox->addAction( new KToolBarSpacerAction( d->toolBox ) );
0119     d->toolBox->addAction( actionOptions );
0120     d->toolBox->addAction( d->dirOp->bookmarkMenu() );
0121 
0122     if( QAction* action = d->dirOp->action(KDirOperator::ShowHiddenFiles) ) {
0123         action->setShortcut( Qt::ALT + Qt::Key_Period );
0124         action->setShortcutContext( Qt::ApplicationShortcut );
0125     }
0126 
0127     connect( d->dirOp, SIGNAL(urlEntered(QUrl)), this, SIGNAL(urlEntered(QUrl)) );
0128     connect( d->filterWidget, SIGNAL(filterChanged()), SLOT(slotFilterChanged()) );
0129     connect( d->actionShowBookmarks, SIGNAL(toggled(bool)), d->dirOp->bookmarkMenu(), SLOT(setVisible(bool)) );
0130 }
0131 
0132 
0133 K3b::FileView::~FileView()
0134 {
0135     delete d;
0136 }
0137 
0138 
0139 void K3b::FileView::setUrl(const QUrl& url, bool forward)
0140 {
0141     qDebug() << url;
0142     d->dirOp->setUrl( url, forward );
0143 }
0144 
0145 
0146 QUrl K3b::FileView::url()
0147 {
0148     return d->dirOp->url();
0149 }
0150 
0151 void K3b::FileView::slotFilterChanged()
0152 {
0153 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
0154     QString filter = d->filterWidget->currentFilter();
0155     d->dirOp->clearFilter();
0156 
0157     if( filter.indexOf( '/' ) > -1 ) {
0158         QStringList types = filter.split( ' ' );
0159         types.prepend( "inode/directory" );
0160         d->dirOp->setMimeFilter( types );
0161     }
0162     else
0163         d->dirOp->setNameFilter( filter );
0164 #else
0165     const KFileFilter filter = d->filterWidget->currentFilter();
0166     d->dirOp->clearFilter();
0167 
0168     if( !filter.mimePatterns().isEmpty() ) {
0169         QStringList types = filter.mimePatterns();
0170         types.prepend( "inode/directory" );
0171         d->dirOp->setMimeFilter( types );
0172     }
0173     else
0174         d->dirOp->setNameFilter( filter.filePatterns().join( QLatin1Char(' ') ) );
0175 #endif
0176 
0177     d->dirOp->rereadDir();
0178 }
0179 
0180 
0181 void K3b::FileView::reload()
0182 {
0183     d->dirOp->rereadDir();
0184 }
0185 
0186 
0187 void K3b::FileView::saveConfig( KConfigGroup grp )
0188 {
0189     d->dirOp->writeConfig(grp);
0190 }
0191 
0192 
0193 void K3b::FileView::readConfig( const KConfigGroup& grp )
0194 {
0195     d->dirOp->readConfig(grp);
0196     d->actionShowBookmarks->setChecked( d->dirOp->bookmarkMenu()->isVisible() );
0197 }
0198 
0199 #include "moc_k3bfileview.cpp"