File indexing completed on 2024-11-10 05:13:56

0001 /*
0002     SPDX-FileCopyrightText: 1999 Michael Kropfberger <michael.kropfberger@gmx.net>
0003     SPDX-FileCopyrightText: 2009 Dario Andres Rodriguez <andresbajotierra@gmail.com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 //
0009 // 1999-11-29 Espen Sand
0010 // Converted to QLayout and QListView + cleanups
0011 //
0012 
0013 #include "mntconfig.h"
0014 
0015 #include <KMessageBox>
0016 #include <KIconLoader>
0017 #include <KConfigGroup>
0018 #include <KSharedConfig>
0019 
0020 #include <QPixmap>
0021 #include <QCloseEvent>
0022 #include <QFileDialog>
0023 #include <QTreeWidget>
0024 #include <QTreeWidgetItem>
0025 
0026 #ifndef CMAKE_UNITY_BUILD
0027 static bool GUI;
0028 #endif
0029 
0030 MntConfigWidget::MntConfigWidget(QWidget *parent, bool init)
0031         : QWidget(parent)
0032 {
0033     mInitializing = false;
0034 
0035     GUI = !init;
0036     if (GUI)
0037     {
0038         setupUi(this);
0039 
0040         //tabList fillup waits until disklist.readDF() is done...
0041         mDiskList.readFSTAB();
0042         mDiskList.readDF();
0043         mInitializing = true;
0044         connect( &mDiskList, &DiskList::readDFDone, this, &MntConfigWidget::readDFDone);
0045 
0046         connect ( m_listWidget, &QTreeWidget::itemClicked , this, &MntConfigWidget::clicked );
0047         m_listWidget->setHeaderLabels( QStringList() << QLatin1String( "" ) << i18n("Device")
0048                                        << i18n("Mount Point") << i18n("Mount Command") << i18n("Unmount Command") );
0049         m_listWidget->setColumnWidth( 0, 20 );
0050 
0051         QString text = QStringLiteral("%1: %2  %3: %4").
0052                arg(i18n("Device")).
0053                arg(i18nc("No device is selected", "None")).
0054                arg(i18n("Mount Point")).
0055                arg(i18nc("No mount point is selected", "None"));
0056 
0057         mGroupBox->setEnabled( false );
0058         mGroupBox->setTitle(text);
0059 
0060         connect( mIconLineEdit, &QLineEdit::textEdited,
0061                  this,&MntConfigWidget::iconChanged);
0062         connect( mIconLineEdit, &QLineEdit::textEdited,
0063                  this,&MntConfigWidget::slotChanged);
0064 
0065         mIconButton->setIconType(KIconLoader::Small, KIconLoader::Device);
0066         mIconButton->setFixedHeight( mIconButton->sizeHint().height() );
0067 
0068         connect( mIconButton, &KIconButton::iconChanged, this, &MntConfigWidget::iconChangedButton);
0069         connect( mIconButton, &KIconButton::iconChanged, this, &MntConfigWidget::slotChanged);
0070 
0071         connect( mDefaultIconButton, &QAbstractButton::clicked, this, &MntConfigWidget::iconDefault );
0072         connect( mDefaultIconButton, &QAbstractButton::clicked, this, &MntConfigWidget::slotChanged );
0073 
0074         connect( mMountLineEdit,&QLineEdit::textChanged,
0075                 this,&MntConfigWidget::mntCmdChanged);
0076         connect( mMountLineEdit, &QLineEdit::textChanged,
0077                 this,&MntConfigWidget::slotChanged);
0078 
0079         connect( mMountButton, &QAbstractButton::clicked, this, &MntConfigWidget::selectMntFile );
0080 
0081         connect( mUmountLineEdit, &QLineEdit::textChanged,
0082                  this,&MntConfigWidget::umntCmdChanged);
0083         connect( mUmountLineEdit, &QLineEdit::textChanged,
0084                  this,&MntConfigWidget::slotChanged);
0085 
0086         connect( mUmountButton,&QAbstractButton::clicked,this,&MntConfigWidget::selectUmntFile);
0087     }
0088 
0089     loadSettings();
0090     if(init)
0091     {
0092         applySettings();
0093     }
0094 }
0095 
0096 
0097 MntConfigWidget::~MntConfigWidget( void )
0098 {
0099     delete m_listWidget;
0100 }
0101 
0102 
0103 void MntConfigWidget::readDFDone( void )
0104 {
0105     mInitializing = false;
0106     m_listWidget->clear();
0107 
0108     QTreeWidgetItem *item = nullptr;
0109 
0110     DisksConstIterator itr = mDiskList.disksConstIteratorBegin();
0111     DisksConstIterator end = mDiskList.disksConstIteratorEnd();
0112     for (; itr != end; ++itr)
0113     {
0114         DiskEntry * disk = *itr;
0115         item = new QTreeWidgetItem( m_listWidget, QStringList() << QString() << disk->deviceName()
0116                                     << disk->mountPoint() << disk->mountCommand() << disk->umountCommand() );
0117         item->setIcon( IconCol, QIcon::fromTheme( disk->iconName() ) );
0118     }
0119 
0120     /*
0121     //Adjust dialog size (?)
0122     m_listWidget->resizeColumnToContents( 2 );
0123     m_listWidget->resize(m_listWidget->sizeHint());
0124     m_listWidget->adjustSize();
0125     */
0126 
0127     loadSettings();
0128     applySettings();
0129 }
0130 
0131 
0132 void MntConfigWidget::applySettings( void )
0133 {
0134     mDiskList.applySettings();
0135 
0136     KConfigGroup config(KSharedConfig::openConfig(), QStringLiteral("MntConfig"));
0137     if( GUI )
0138     {
0139         config.writeEntry("Width", width() );
0140         config.writeEntry("Height", height() );
0141     }
0142     config.sync();
0143 }
0144 
0145 
0146 void MntConfigWidget::loadSettings( void )
0147 {
0148     KConfigGroup config = KSharedConfig::openConfig()->group(QStringLiteral("MntConfig"));
0149     if( !mInitializing && GUI )
0150     {
0151         if( isWindow() )
0152         {
0153             int w = config.readEntry("Width",this->width() );
0154             int h = config.readEntry("Height",this->height() );
0155             resize(w,h);
0156         }
0157 
0158         QList<QTreeWidgetItem*> list = m_listWidget->selectedItems();
0159         if( list.size() == 1 )
0160             clicked( list.at(0), 0 );
0161     }
0162 }
0163 
0164 
0165 void MntConfigWidget::clicked( QTreeWidgetItem * item , int col )
0166 {
0167     Q_UNUSED(col);
0168 
0169     QTreeWidgetItem * header = m_listWidget->headerItem();
0170 
0171     mGroupBox->setEnabled( true );
0172     mGroupBox->setTitle( QStringLiteral("%1: %2  %3: %4").
0173                          arg(header->text( DeviceCol )).
0174                          arg(item->text( DeviceCol )).
0175                          arg(header->text( MountPointCol )).
0176                          arg(item->text( MountPointCol )) );
0177 
0178 
0179     const QIcon icon = item->icon( IconCol );
0180     if( !icon.isNull() )
0181         mIconButton->setIcon( icon );
0182 
0183     DiskEntry * disk = selectedDisk( item );
0184     if (!disk)
0185         return;
0186 
0187     mIconLineEdit->setText( disk->iconName() );
0188 
0189     mMountLineEdit->setText( item->text( MountCommandCol ) );
0190     mUmountLineEdit->setText( item->text( UmountCommandCol ) );
0191 }
0192 
0193 
0194 void MntConfigWidget::iconChangedButton(const QString &iconName)
0195 {
0196     iconChanged(iconName);
0197 }
0198 
0199 void MntConfigWidget::iconChanged(const QString &iconName)
0200 {
0201     QList<QTreeWidgetItem*> list = m_listWidget->selectedItems();
0202     QTreeWidgetItem * item = list.at(0);
0203 
0204     DiskEntry * disk = selectedDisk( item );
0205     if ( !disk )
0206         return;
0207 
0208     disk->setIconName(iconName);
0209     mIconLineEdit->setText(iconName);
0210 
0211     const int smallIcon = qApp->style()->pixelMetric(QStyle::PM_SmallIconSize);
0212     const QPixmap icon = QIcon::fromTheme( iconName ).pixmap(smallIcon);
0213     item->setIcon( IconCol, icon );
0214     mIconButton->setIcon( icon );
0215 
0216     slotChanged();
0217 }
0218 
0219 void MntConfigWidget::iconDefault()
0220 {
0221     QList<QTreeWidgetItem*> list = m_listWidget->selectedItems();
0222     QTreeWidgetItem * item = list.at(0);
0223 
0224     DiskEntry * disk = selectedDisk( item );
0225     if ( !disk )
0226         return;
0227 
0228     iconChanged(disk->guessIconName());
0229 }
0230 
0231 void MntConfigWidget::selectMntFile()
0232 {
0233     QUrl url = QFileDialog::getOpenFileUrl( this, QStringLiteral( "*" ));
0234 
0235     if( url.isEmpty() )
0236         return;
0237 
0238     if( !url.isLocalFile() )
0239     {
0240         KMessageBox::error( nullptr, i18n( "Only local files supported." ) );
0241         return;
0242     }
0243 
0244     mMountLineEdit->setText( url.path() );
0245 }
0246 
0247 void MntConfigWidget::selectUmntFile()
0248 {
0249     QUrl url = QFileDialog::getOpenFileUrl( this, QStringLiteral( "*" ));
0250 
0251     if( url.isEmpty() )
0252         return;
0253 
0254     if( !url.isLocalFile() )
0255     {
0256         KMessageBox::error( nullptr, i18n( "Only local files are currently supported." ) );
0257         return;
0258     }
0259 
0260     mUmountLineEdit->setText( url.path() );
0261 }
0262 
0263 void MntConfigWidget::mntCmdChanged( const QString &data )
0264 {
0265 
0266     QList<QTreeWidgetItem*> list = m_listWidget->selectedItems();
0267     QTreeWidgetItem * item = list.at(0);
0268 
0269     DiskEntry * disk = selectedDisk( item );
0270     if ( !disk )
0271         return;
0272 
0273     disk->setMountCommand( data );
0274     item->setText( MountCommandCol , data );
0275 
0276 }
0277 
0278 
0279 void MntConfigWidget::umntCmdChanged( const QString &data )
0280 {
0281     QList<QTreeWidgetItem*> list = m_listWidget->selectedItems();
0282     QTreeWidgetItem * item = list.at(0);
0283 
0284     DiskEntry * disk = selectedDisk( item );
0285     if ( !disk )
0286         return;
0287 
0288     disk->setUmountCommand( data );
0289     item->setText( UmountCommandCol , data );
0290 
0291 }
0292 
0293 DiskEntry * MntConfigWidget::selectedDisk( QTreeWidgetItem * item )
0294 {
0295     if( item == nullptr )
0296     {
0297         QList<QTreeWidgetItem*> selected = m_listWidget->selectedItems();
0298         if ( selected.size() == 1 )
0299             item =  selected.at(0);
0300         else
0301             return nullptr;
0302     }
0303 
0304     DiskEntry * tmpDisk = new DiskEntry(item->text( DeviceCol ));
0305     tmpDisk->setMountPoint(item->text( MountPointCol ));
0306 
0307     int pos = mDiskList.find(tmpDisk);
0308 
0309     delete tmpDisk;
0310 
0311     return mDiskList.at(pos);
0312 }
0313 
0314 void MntConfigWidget::closeEvent(QCloseEvent *)
0315 {
0316 }
0317 
0318 void MntConfigWidget::slotChanged()
0319 {
0320     Q_EMIT configChanged();
0321 }
0322 
0323 
0324 
0325 #include "moc_mntconfig.cpp"