File indexing completed on 2024-05-05 04:51:47

0001 /*
0002     SPDX-FileCopyrightText: 2003-2007 Sebastian Trueg <trueg@k3b.org>
0003     SPDX-FileCopyrightText: 2009 Arthur Renato Mello <arthur@mandriva.com>
0004     SPDX-FileCopyrightText: 2009 Gustavo Pichorim Boiko <gustavo.boiko@kdemail.net>
0005     SPDX-FileCopyrightText: 2009-2010 Michal Malek <michalm@jabster.pl>
0006     SPDX-FileCopyrightText: 1998-2009 Sebastian Trueg <trueg@k3b.org>
0007 
0008     SPDX-License-Identifier: GPL-2.0-or-later
0009 */
0010 
0011 
0012 #include "k3bmovixview.h"
0013 #include "k3bmovixprojectmodel.h"
0014 #include "k3bmovixdoc.h"
0015 #include "k3bmovixburndialog.h"
0016 #include "k3bmovixfileitem.h"
0017 
0018 #include "k3bdatapropertiesdialog.h"
0019 #include "k3baction.h"
0020 #include "k3bvolumenamewidget.h"
0021 
0022 #include <KLocalizedString>
0023 #include <KMessageBox>
0024 #include <KToolBar>
0025 
0026 #include <QDebug>
0027 #include <QItemSelectionModel>
0028 #include <QList>
0029 #include <QUrl>
0030 #include <QAction>
0031 #include <QFileDialog>
0032 #include <QHeaderView>
0033 #include <QTreeView>
0034 
0035 K3b::MovixView::MovixView( K3b::MovixDoc* doc, QWidget* parent )
0036 :
0037     View( doc, parent ),
0038     m_doc( doc ),
0039     m_model( new MovixProjectModel( m_doc, this ) ),
0040     m_view( new QTreeView( this ) )
0041 {
0042     m_view->setModel( m_model );
0043     m_view->setAcceptDrops( true );
0044     m_view->setDragEnabled( true );
0045     m_view->setDragDropMode( QTreeView::DragDrop );
0046     m_view->setItemsExpandable( false );
0047     m_view->setRootIsDecorated( false );
0048     m_view->setSelectionMode( QTreeView::ExtendedSelection );
0049     m_view->setVerticalScrollMode( QAbstractItemView::ScrollPerPixel );
0050     m_view->setContextMenuPolicy( Qt::ActionsContextMenu );
0051     // FIXME: make QHeaderView::Interactive the default but connect to model changes and call header()->resizeSections( QHeaderView::ResizeToContents );
0052     m_view->header()->setSectionResizeMode( QHeaderView::ResizeToContents );
0053     m_view->setEditTriggers( QAbstractItemView::NoEditTriggers );
0054     setMainWidget( m_view );
0055 
0056     // setup actions
0057     m_actionProperties = K3b::createAction( this, i18n("Properties"), "document-properties",
0058                                             0, this, SLOT(showPropertiesDialog()),
0059                                             actionCollection(), "movix_show_props" );
0060     m_actionRemove = K3b::createAction( this, i18n( "Remove" ), "edit-delete",
0061                                         Qt::Key_Delete, this, SLOT(slotRemove()),
0062                                         actionCollection(), "movix_remove_item" );
0063     m_actionRemoveSubTitle = K3b::createAction( this, i18n( "Remove Subtitle File" ), "edit-delete",
0064                                                 0, this, SLOT(slotRemoveSubTitleItems()),
0065                                                 actionCollection(), "movix_remove_subtitle_item" );
0066     m_actionAddSubTitle = K3b::createAction( this, i18n("Add Subtitle File..."), 0,
0067                                              0, this, SLOT(slotAddSubTitleFile()),
0068                                              actionCollection(), "movix_add_subtitle" );
0069 
0070     connect( m_view->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
0071              this, SLOT(slotSelectionChanged()) );
0072 
0073     QAction* separator = new QAction( this );
0074     separator->setSeparator( true );
0075     m_view->addAction( m_actionRemove );
0076     m_view->addAction( m_actionRemoveSubTitle );
0077     m_view->addAction( m_actionAddSubTitle );
0078     m_view->addAction( separator );
0079     m_view->addAction( m_actionProperties );
0080     m_view->addAction( separator );
0081     m_view->addAction( actionCollection()->action("project_burn") );
0082 
0083     // Setup toolbar
0084     toolBox()->addActions( createPluginsActions( m_doc->type() ) );
0085     toolBox()->addWidget( new VolumeNameWidget( doc, toolBox() ) );
0086 }
0087 
0088 
0089 K3b::MovixView::~MovixView()
0090 {
0091 }
0092 
0093 
0094 void K3b::MovixView::showPropertiesDialog()
0095 {
0096     const QModelIndexList selection = m_view->selectionModel()->selectedRows();
0097 
0098     if( selection.isEmpty() ) {
0099         // show project properties
0100         slotProperties();
0101     }
0102     else {
0103         QList<K3b::DataItem*> items;
0104 
0105         foreach(const QModelIndex &index, selection)
0106             items.append(m_model->itemForIndex(index));
0107 
0108         K3b::DataPropertiesDialog dlg( items, this );
0109         dlg.exec();
0110     }
0111 }
0112 
0113 
0114 void K3b::MovixView::slotRemoveSubTitleItems()
0115 {
0116     const QModelIndexList selection = m_view->selectionModel()->selectedRows();
0117     if ( !selection.count() )
0118         return;
0119 
0120     K3b::MovixFileItem *item = 0;
0121     Q_FOREACH( const QModelIndex& index, selection ) {
0122         item = m_model->itemForIndex(index);
0123         if (item)
0124             m_doc->removeSubTitleItem( item );
0125     }
0126 }
0127 
0128 
0129 void K3b::MovixView::slotAddSubTitleFile()
0130 {
0131     const QModelIndexList selection = m_view->selectionModel()->selectedRows();
0132     if( !selection.count() )
0133         return;
0134 
0135     MovixFileItem *item = 0;
0136     foreach( const QModelIndex& index, selection )
0137     {
0138         item = m_model->itemForIndex(index);
0139         if( item )
0140             break;
0141     }
0142 
0143     if( item ) {
0144         QUrl url = QFileDialog::getOpenFileUrl( this );
0145         if( url.isValid() ) {
0146             if( url.isLocalFile() )
0147                 m_doc->addSubTitleItem( item, url );
0148             else
0149                 KMessageBox::error( 0, i18n("K3b currently only supports local files.") );
0150         }
0151     }
0152 }
0153 
0154 
0155 void K3b::MovixView::slotSelectionChanged()
0156 {
0157     const QModelIndexList selection = m_view->selectionModel()->selectedRows();
0158     if( selection.count() >= 1 ) {
0159         m_actionRemove->setEnabled(true);
0160 
0161         bool subtitle = false;
0162         // check if any of the items have a subtitle
0163         Q_FOREACH( const QModelIndex& index, selection ) {
0164             K3b::MovixFileItem *item = m_model->itemForIndex(index);
0165             if (item && item->subTitleItem()) {
0166                 subtitle = true;
0167                 break;
0168             }
0169         }
0170         m_actionRemoveSubTitle->setEnabled( subtitle );
0171         // only enable the subtitle adding if there is just one item selected
0172         m_actionAddSubTitle->setEnabled( selection.count() == 1 );
0173     }
0174     else {
0175         m_actionRemove->setEnabled(false);
0176         m_actionRemoveSubTitle->setEnabled( false );
0177         m_actionAddSubTitle->setEnabled( false );
0178     }
0179 }
0180 
0181 
0182 void K3b::MovixView::slotRemove()
0183 {
0184     const QModelIndexList selected = m_view->selectionModel()->selectedRows();
0185 
0186     // create a list of persistent model indexes to be able to remove all of them
0187     QList<QPersistentModelIndex> indexes;
0188     Q_FOREACH( const QModelIndex& index, selected ) {
0189         indexes.append( QPersistentModelIndex( index ) );
0190     }
0191 
0192     // and now ask the indexes to be removed
0193     Q_FOREACH( const QPersistentModelIndex& index, indexes ) {
0194         m_model->removeRow( index.row(), index.parent() );
0195     }
0196 }
0197 
0198 
0199 K3b::ProjectBurnDialog* K3b::MovixView::newBurnDialog( QWidget* parent )
0200 {
0201     return new K3b::MovixBurnDialog( m_doc, parent );
0202 }
0203 
0204 #include "moc_k3bmovixview.cpp"