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"