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

0001 /*
0002     SPDX-FileCopyrightText: 2010 Michal Malek <michalm@jabster.pl>
0003     SPDX-FileCopyrightText: 1998-2008 Sebastian Trueg <trueg@k3b.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 
0009 #include "k3bdatapropertiesdialog.h"
0010 #include "k3bdiritem.h"
0011 #include "k3bfileitem.h"
0012 #include "k3bvalidators.h"
0013 
0014 #include <KLineEdit>
0015 #include <KLocalizedString>
0016 #include <KIconLoader>
0017 #include <KIO/Global>
0018 #include <KSqueezedTextLabel>
0019 
0020 #include <QFileInfo>
0021 #include <QUrl>
0022 #include <QValidator>
0023 #include <QCheckBox>
0024 #include <QDialogButtonBox>
0025 #include <QFrame>
0026 #include <QGridLayout>
0027 #include <QLabel>
0028 #include <QPushButton>
0029 #include <QTabWidget>
0030 #include <QToolTip>
0031 
0032 
0033 K3b::DataPropertiesDialog::DataPropertiesDialog( const QList<K3b::DataItem*>& dataItems, QWidget* parent )
0034     : QDialog( parent )
0035 {
0036     setWindowTitle( i18n("File Properties") );
0037 
0038     m_dataItems = dataItems;
0039 
0040     m_labelIcon = new QLabel( this );
0041     if ( dataItems.count() == 1 ) {
0042         m_editName = new KLineEdit( this );
0043         m_editName->setValidator( K3b::Validators::iso9660Validator( false, this ) );
0044         m_labelType = new QLabel( this );
0045         m_labelLocalName = new KSqueezedTextLabel( this );
0046         m_labelLocalLocation = new KSqueezedTextLabel( this );
0047         m_labelLocalLinkTarget = new KSqueezedTextLabel( this );
0048         m_extraInfoLabel = new QLabel( this );
0049     }
0050     else {
0051         m_multiSelectionLabel = new QLabel( this );
0052     }
0053 
0054     m_labelLocation = new KSqueezedTextLabel( this );
0055     m_labelSize = new QLabel( this );
0056     m_labelBlocks = new QLabel( this );
0057 
0058     // layout
0059     // -----------------------------
0060     QGridLayout* grid = new QGridLayout( this );
0061 
0062     grid->addWidget( m_labelIcon, 0, 0 );
0063     if ( dataItems.count() == 1 ) {
0064         grid->addWidget( m_editName, 0, 2 );
0065     }
0066     else {
0067         grid->addWidget( m_multiSelectionLabel, 0, 2 );
0068     }
0069     int row = 1;
0070 
0071     m_spacerLine = new QFrame( this );
0072     m_spacerLine->setFrameStyle( QFrame::HLine | QFrame::Sunken );
0073     grid->addWidget( m_spacerLine, row, 0, 1, 3 );
0074     ++row;
0075     if ( dataItems.count() == 1 ) {
0076         grid->addWidget( new QLabel( i18n("Type:"), this ), row, 0 );
0077         grid->addWidget( m_labelType, row++, 2 );
0078         grid->addWidget( m_extraInfoLabel, row++, 2 );
0079     }
0080     grid->addWidget( new QLabel( i18n("Location:"), this ), row, 0 );
0081     grid->addWidget( m_labelLocation, row++, 2 );
0082     grid->addWidget( new QLabel( i18n("Size:"), this ), row, 0 );
0083     grid->addWidget( m_labelSize, row++, 2 );
0084     grid->addWidget( new QLabel( i18n("Used blocks:"), this ), row, 0 );
0085     grid->addWidget( m_labelBlocks, row++, 2 );
0086 
0087     m_spacerLine = new QFrame( this );
0088     m_spacerLine->setFrameStyle( QFrame::HLine | QFrame::Sunken );
0089     grid->addWidget( m_spacerLine, row, 0, 1, 3 );
0090     ++row;
0091 
0092     if ( dataItems.count() == 1 ) {
0093         m_labelLocalNameText = new QLabel( i18n("Local name:"), this );
0094         grid->addWidget( m_labelLocalNameText, row, 0 );
0095         grid->addWidget( m_labelLocalName, row++, 2 );
0096         m_labelLocalLocationText = new QLabel( i18n("Local location:"), this );
0097         grid->addWidget( m_labelLocalLocationText, row, 0 );
0098         grid->addWidget( m_labelLocalLocation, row++, 2 );
0099         m_labelLocalLinkTargetText = new QLabel( i18n("Local link target:"), this );
0100         grid->addWidget( m_labelLocalLinkTargetText, row, 0 );
0101         grid->addWidget( m_labelLocalLinkTarget, row++, 2 );
0102     }
0103 
0104     grid->addItem( new QSpacerItem( 50, 1, QSizePolicy::Fixed, QSizePolicy::Fixed ), 0, 1 );
0105     grid->setColumnStretch( 2, 1 );
0106 
0107 
0108     // OPTIONS
0109     // /////////////////////////////////////////////////
0110     QTabWidget* optionTab = new QTabWidget( this );
0111     m_spacerLine = new QFrame( this );
0112     m_spacerLine->setFrameStyle( QFrame::HLine | QFrame::Sunken );
0113 
0114     grid->addWidget( m_spacerLine, row++, 0, 1, 3 );
0115     grid->setRowStretch( row++, 1 );
0116     grid->addWidget( optionTab, row++, 0, 1, 3 );
0117 
0118     QWidget* hideBox = new QWidget( optionTab );
0119     QGridLayout* hideBoxGrid = new QGridLayout( hideBox );
0120     m_checkHideOnRockRidge = new QCheckBox( i18n("Hide on RockRidge"), hideBox );
0121     m_checkHideOnJoliet = new QCheckBox( i18n("Hide on Joliet"), hideBox );
0122     hideBoxGrid->addWidget( m_checkHideOnRockRidge, 0, 0 );
0123     hideBoxGrid->addWidget( m_checkHideOnJoliet, 1, 0 );
0124     hideBoxGrid->setRowStretch( 2, 1 );
0125 //   grid->addMultiCellWidget( m_checkHideOnRockRidge, 10, 10, 0, 2 );
0126 //   grid->addMultiCellWidget( m_checkHideOnJoliet, 11, 11, 0, 2 );
0127 
0128     QWidget* sortingBox = new QWidget( optionTab );
0129     QGridLayout* sortingBoxGrid = new QGridLayout( sortingBox );
0130     m_editSortWeight = new KLineEdit( sortingBox );
0131     m_editSortWeight->setValidator( new QIntValidator( -2147483647, 2147483647, m_editSortWeight ) );
0132     m_editSortWeight->setAlignment( Qt::AlignRight );
0133     sortingBoxGrid->addWidget( new QLabel( i18n("Sort weight:"), sortingBox ), 0, 0 );
0134     sortingBoxGrid->addWidget( m_editSortWeight, 0, 1 );
0135     sortingBoxGrid->setColumnStretch( 1, 1 );
0136     sortingBoxGrid->setRowStretch( 1, 1 );
0137 
0138     optionTab->addTab( hideBox, i18n("Settings") );
0139     optionTab->addTab( sortingBox, i18n("Advanced") );
0140 
0141 
0142     // load the data
0143     // ----------------------------
0144     if ( dataItems.count() == 1 ) {
0145         loadItemProperties( dataItems.first() );
0146     }
0147     else {
0148         loadListProperties( dataItems );
0149     }
0150 
0151 
0152     m_checkHideOnRockRidge->setToolTip( i18n("Hide this file in the RockRidge filesystem") );
0153     m_checkHideOnJoliet->setToolTip( i18n("Hide this file in the Joliet filesystem") );
0154     m_editSortWeight->setToolTip( i18n("Modify the physical sorting") );
0155     m_checkHideOnRockRidge->setWhatsThis( i18n("<p>If this option is checked, the file or folder "
0156                                                "(and its entire contents) will be hidden on the "
0157                                                "ISO 9660 and RockRidge filesystem.</p>"
0158                                                "<p>This is useful, for example, for having different README "
0159                                                "files for RockRidge and Joliet, which can be managed "
0160                                                "by hiding README.joliet on RockRidge and README.rr "
0161                                                "on the Joliet filesystem.</p>") );
0162     m_checkHideOnJoliet->setWhatsThis( i18n("<p>If this option is checked, the file or folder "
0163                                             "(and its entire contents) will be hidden on the "
0164                                             "Joliet filesystem.</p>"
0165                                             "<p>This is useful, for example, for having different README "
0166                                             "files for RockRidge and Joliet, which can be managed "
0167                                             "by hiding README.joliet on RockRidge and README.rr "
0168                                             "on the Joliet filesystem.</p>") );
0169     m_editSortWeight->setWhatsThis( i18n("<p>This value modifies the physical sort order of the files "
0170                                          "in the ISO 9660 filesystem. A higher weighting means that the "
0171                                          "file will be located closer to the beginning of the image "
0172                                          "(and the disk)."
0173                                          "<p>This option is useful in order to optimize the data layout "
0174                                          "on a medium."
0175                                          "<p><b>Caution:</b> This does not sort the order of the file "
0176                                          "names that appear in the ISO 9660 folder. "
0177                                          "It sorts the order in which the file data is "
0178                                          "written to the image.") );
0179 
0180     QDialogButtonBox* buttonBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this );
0181     grid->addWidget( buttonBox, row++, 0, 1, 3 );
0182     connect( buttonBox, SIGNAL(accepted()), SLOT(accept()) );
0183     connect( buttonBox, SIGNAL(rejected()), SLOT(reject()) );
0184 }
0185 
0186 
0187 K3b::DataPropertiesDialog::~DataPropertiesDialog()
0188 {
0189 }
0190 
0191 
0192 void K3b::DataPropertiesDialog::loadItemProperties( K3b::DataItem* dataItem )
0193 {
0194     if( K3b::FileItem* fileItem = dynamic_cast<K3b::FileItem*>(dataItem) ) {
0195         QFileInfo fileInfo( fileItem->localPath() );
0196         qDebug() << fileItem->k3bPath() << fileItem->localPath();
0197         if( fileItem->isSymLink() ) {
0198             m_labelIcon->setPixmap( KIconLoader::global()->loadIcon( fileItem->mimeType().iconName(), KIconLoader::NoGroup, KIconLoader::SizeLarge,
0199                                                  KIconLoader::DefaultState, QStringList() << "emblem-symbolic-link", nullptr, true ) );
0200             m_labelType->setText( i18n( "Link to %1", fileItem->mimeType().comment() ) );
0201             m_labelLocalLinkTarget->setText( fileItem->linkDest() );
0202         }
0203         else {
0204             m_labelIcon->setPixmap( QIcon::fromTheme(fileItem->mimeType().iconName()).pixmap(KIconLoader::SizeLarge) );
0205             m_labelType->setText( fileItem->mimeType().comment() );
0206             m_labelLocalLinkTargetText->hide();
0207             m_labelLocalLinkTarget->hide();
0208         }
0209         m_labelLocalName->setText( fileInfo.fileName() );
0210         m_labelLocalLocation->setText( fileInfo.absolutePath() );
0211         m_labelSize->setText( KIO::convertSize(dataItem->size()) );
0212     }
0213     else if( K3b::DirItem* dirItem = dynamic_cast<K3b::DirItem*>(dataItem) ) {
0214         m_labelIcon->setPixmap( QIcon::fromTheme("folder").pixmap(KIconLoader::SizeLarge) );
0215         m_labelType->setText( i18n("Folder") );
0216         m_labelLocalNameText->hide();
0217         m_labelLocalName->hide();
0218         m_labelLocalLocationText->hide();
0219         m_labelLocalLocation->hide();
0220         m_labelLocalLinkTargetText->hide();
0221         m_labelLocalLinkTarget->hide();
0222         m_spacerLine->hide();
0223         m_labelSize->setText( KIO::convertSize(dataItem->size()) + "\n(" +
0224                               i18np("in one file", "in %1 files", dirItem->numFiles()) + ' ' +
0225                               i18np("and one folder", "and %1 folders", dirItem->numDirs()) + ')' );
0226     }
0227     else {
0228         m_labelIcon->setPixmap( QIcon::fromTheme("unknown").pixmap(KIconLoader::SizeLarge) );
0229         m_labelType->setText( i18n("Special file") );
0230         m_labelLocalNameText->hide();
0231         m_labelLocalName->hide();
0232         m_labelLocalLocationText->hide();
0233         m_labelLocalLocation->hide();
0234         m_labelLocalLinkTargetText->hide();
0235         m_labelLocalLinkTarget->hide();
0236         m_spacerLine->hide();
0237         m_labelSize->setText( KIO::convertSize(dataItem->size()) );
0238     }
0239 
0240     m_editName->setText( dataItem->k3bName() );
0241     m_labelBlocks->setText( QString::number(dataItem->blocks().lba()) );
0242 
0243     QString location = '/' + dataItem->k3bPath();
0244     if( location[location.length()-1] == '/' )
0245         location.truncate( location.length()-1 );
0246     location.truncate( location.lastIndexOf('/') );
0247     if( location.isEmpty() )
0248         location = '/';
0249     m_labelLocation->setText( location );
0250     m_extraInfoLabel->setText( QString( "(%1)" ).arg(dataItem->extraInfo()) );
0251     if( dataItem->extraInfo().isEmpty() )
0252         m_extraInfoLabel->hide();
0253 
0254     m_checkHideOnJoliet->setChecked( dataItem->hideOnJoliet() );
0255     m_checkHideOnRockRidge->setChecked( dataItem->hideOnRockRidge() );
0256     m_editSortWeight->setText( QString::number(dataItem->sortWeight()) );
0257 
0258     // if the parent is hidden the value cannot be changed (see K3b::DataItem::setHide...)
0259     if( dataItem->parent() ) {
0260         m_checkHideOnRockRidge->setDisabled( dataItem->parent()->hideOnRockRidge() );
0261         m_checkHideOnJoliet->setDisabled( dataItem->parent()->hideOnJoliet() );
0262     }
0263 
0264     if( !dataItem->isHideable() ) {
0265         m_checkHideOnJoliet->setDisabled(true);
0266         m_checkHideOnRockRidge->setDisabled(true);
0267         //    m_spacerLine->hide();
0268     }
0269 
0270     m_editName->setReadOnly( !dataItem->isRenameable() );
0271     m_editName->setFocus();
0272 }
0273 
0274 
0275 void K3b::DataPropertiesDialog::loadListProperties( const QList<K3b::DataItem*>& items )
0276 {
0277     m_labelIcon->setPixmap( QIcon::fromTheme("document-multiple").pixmap(KIconLoader::SizeLarge) );
0278 
0279     int files = 0;
0280     int folders = 0;
0281     KIO::filesize_t size = 0;
0282     K3b::Msf blocks = 0;
0283     for ( QList<K3b::DataItem*>::iterator it = m_dataItems.begin();
0284           it != m_dataItems.end(); ++it ) {
0285         K3b::DataItem* item = *it;
0286         if ( item->isFile() )
0287             ++files;
0288         else if ( item->isDir() )
0289             ++folders;
0290         blocks += item->blocks();
0291         size += item->size();
0292     }
0293     QString s = i18np( "One Item", "%1 Items", items.count() );
0294     s += " - ";
0295     if ( files > 0 )
0296         s += i18np( "One File", "%1 Files", files );
0297     else
0298         s += i18n( "No Files" );
0299     s += " - ";
0300     if ( folders > 0 )
0301         s += i18np( "One Folder", "%1 Folders", folders );
0302     else
0303         s += i18n( "No Folders" );
0304     m_multiSelectionLabel->setText( s );
0305 
0306     m_labelSize->setText( KIO::convertSize(size) );
0307     m_labelBlocks->setText( QString::number(blocks.lba()) );
0308 
0309     // the location of all items are the same since it is not possible to
0310     // select items from different folders
0311     // FIXME: maybe better use QString::section?
0312     QString location = '/' + items.first()->k3bPath();
0313     if( location[location.length()-1] == '/' )
0314         location.truncate( location.length()-1 );
0315     location.truncate( location.lastIndexOf('/') );
0316     if( location.isEmpty() )
0317         location = '/';
0318     m_labelLocation->setText( location );
0319 
0320 
0321     m_checkHideOnJoliet->setChecked( items.first()->hideOnJoliet() );
0322     for ( QList<K3b::DataItem*>::iterator it = m_dataItems.begin();
0323           it != m_dataItems.end(); ++it ) {
0324         K3b::DataItem* item = *it;
0325         if ( m_checkHideOnJoliet->isChecked() != item->hideOnJoliet() ) {
0326             m_checkHideOnJoliet->setCheckState( Qt::PartiallyChecked );
0327             break;
0328         }
0329     }
0330     m_checkHideOnRockRidge->setChecked( items.first()->hideOnRockRidge() );
0331     for ( QList<K3b::DataItem*>::iterator it = m_dataItems.begin();
0332           it != m_dataItems.end(); ++it ) {
0333         K3b::DataItem* item = *it;
0334         if ( m_checkHideOnRockRidge->isChecked() != item->hideOnRockRidge() ) {
0335             m_checkHideOnRockRidge->setCheckState( Qt::PartiallyChecked );
0336             break;
0337         }
0338     }
0339 
0340     int weight = items.first()->sortWeight();
0341     for ( QList<K3b::DataItem*>::iterator it = m_dataItems.begin();
0342           it != m_dataItems.end(); ++it ) {
0343         K3b::DataItem* item = *it;
0344         if ( weight != item->sortWeight() ) {
0345             weight = 0;
0346             break;
0347         }
0348     }
0349     m_editSortWeight->setText( QString::number( weight ) );
0350 }
0351 
0352 
0353 void K3b::DataPropertiesDialog::accept()
0354 {
0355     if ( m_dataItems.count() == 1 ) {
0356         m_dataItems.first()->setK3bName( m_editName->text() );
0357     }
0358 
0359     for ( QList<K3b::DataItem*>::iterator it = m_dataItems.begin();
0360           it != m_dataItems.end(); ++it ) {
0361         K3b::DataItem* item = *it;
0362         if ( m_checkHideOnRockRidge->checkState() != Qt::PartiallyChecked )
0363             item->setHideOnRockRidge( m_checkHideOnRockRidge->isChecked() );
0364         if ( m_checkHideOnJoliet->checkState() != Qt::PartiallyChecked )
0365             item->setHideOnJoliet( m_checkHideOnJoliet->isChecked() );
0366         if ( m_editSortWeight->isModified() )
0367             item->setSortWeight( m_editSortWeight->text().toInt() );
0368     }
0369 
0370     QDialog::accept();
0371 }
0372 
0373 #include "moc_k3bdatapropertiesdialog.cpp"