File indexing completed on 2024-04-28 13:20:54

0001 /*
0002  *   SPDX-FileCopyrightText: 2000 Matthias Elter <elter@kde.org>
0003  *   SPDX-FileCopyrightText: 2008 Laurent Montel <montel@kde.org>
0004  *
0005  *   SPDX-License-Identifier: GPL-2.0-or-later
0006  *
0007  */
0008 
0009 #include "basictab.h"
0010 
0011 #include <QCheckBox>
0012 #include <QGridLayout>
0013 #include <QGroupBox>
0014 #include <QLabel>
0015 #include <QVBoxLayout>
0016 
0017 #include <KConfigGroup>
0018 #include <KDesktopFile>
0019 #include <KIconButton>
0020 #include <KKeySequenceWidget>
0021 #include <KLocalizedString>
0022 #include <KShell>
0023 #include <KUrlRequester>
0024 #include <QLineEdit>
0025 
0026 #include "globalaccel.h"
0027 
0028 #include "klinespellchecking.h"
0029 #include "menuinfo.h"
0030 
0031 BasicTab::BasicTab(QWidget *parent)
0032     : QTabWidget(parent)
0033 {
0034     initGeneralTab();
0035     initAdvancedTab();
0036     initConnections();
0037 
0038     slotDisableAction();
0039 }
0040 
0041 void BasicTab::initGeneralTab()
0042 {
0043     // general tab
0044     QWidget *generalTab = new QWidget();
0045     QGridLayout *generalTabLayout = new QGridLayout(generalTab);
0046     generalTab->setAcceptDrops(false);
0047 
0048     // name
0049     _nameLabel = new QLabel(i18n("&Name:"));
0050     generalTabLayout->addWidget(_nameLabel, 0, 0);
0051     _nameEdit = new QLineEdit();
0052     _nameEdit->setAcceptDrops(false);
0053     _nameEdit->setClearButtonEnabled(true);
0054     _nameLabel->setBuddy(_nameEdit);
0055     generalTabLayout->addWidget(_nameEdit, 0, 1, 1, 1);
0056 
0057     // description
0058     _descriptionLabel = new QLabel(i18n("&Description:"));
0059     generalTabLayout->addWidget(_descriptionLabel, 1, 0);
0060     _descriptionEdit = new KLineSpellChecking();
0061     _descriptionEdit->setAcceptDrops(false);
0062     _descriptionLabel->setBuddy(_descriptionEdit);
0063     generalTabLayout->addWidget(_descriptionEdit, 1, 1, 1, 1);
0064 
0065     // comment
0066     _commentLabel = new QLabel(i18n("&Comment:"));
0067     generalTabLayout->addWidget(_commentLabel, 2, 0);
0068     _commentEdit = new KLineSpellChecking();
0069     _commentEdit->setAcceptDrops(false);
0070     _commentLabel->setBuddy(_commentEdit);
0071     generalTabLayout->addWidget(_commentEdit, 2, 1, 1, 2);
0072 
0073     // environment variables
0074     _envarsLabel = new QLabel(i18nc("@label:textfield", "Environment Variables:"));
0075     generalTabLayout->addWidget(_envarsLabel, 3, 0);
0076     _envarsEdit = new QLineEdit();
0077     _envarsLabel->setBuddy(_envarsEdit);
0078     generalTabLayout->addWidget(_envarsEdit, 3, 1, 1, 2);
0079 
0080     // command
0081     _programLabel = new QLabel(i18nc("@label:textbox the name or path to a command-line program", "Program:"));
0082     generalTabLayout->addWidget(_programLabel, 4, 0);
0083     _programEdit = new KUrlRequester();
0084     _programEdit->lineEdit()->setAcceptDrops(false);
0085     _programLabel->setBuddy(_programEdit);
0086     generalTabLayout->addWidget(_programEdit, 4, 1, 1, 2);
0087 
0088     _argsLabel = new QLabel(i18nc("@label:textfield", "Command-Line Arguments:"));
0089     generalTabLayout->addWidget(_argsLabel, 5, 0);
0090     _argsEdit = new QLineEdit();
0091     _argsEdit->setWhatsThis(
0092         i18n("Following the command, you can have several place holders which will be replaced "
0093              "with the actual values when the actual program is run:\n"
0094              "%f - a single file name\n"
0095              "%F - a list of files; use for applications that can open several local files at once\n"
0096              "%u - a single URL\n"
0097              "%U - a list of URLs\n"
0098              "%d - the folder of the file to open\n"
0099              "%D - a list of folders\n"
0100              "%i - the icon\n"
0101              "%m - the mini-icon\n"
0102              "%c - the caption"));
0103     _argsLabel->setBuddy(_argsEdit);
0104     generalTabLayout->addWidget(_argsEdit, 5, 1, 1, 2);
0105 
0106     // launch feedback
0107     _launchCB = new QCheckBox(i18n("Enable &launch feedback"));
0108     generalTabLayout->addWidget(_launchCB, 6, 0, 1, 3);
0109 
0110     // KDE visibility
0111     _onlyShowInKdeCB = new QCheckBox(i18n("Only show when logged into a Plasma session"));
0112     generalTabLayout->addWidget(_onlyShowInKdeCB, 7, 0, 1, 3);
0113 
0114     // hidden entry
0115     _hiddenEntryCB = new QCheckBox(i18n("Hidden entry"));
0116     _hiddenEntryCB->hide();
0117     generalTabLayout->addWidget(_hiddenEntryCB, 8, 0, 1, 3);
0118 
0119     // icon
0120     _iconButton = new KIconButton();
0121     _iconButton->setFixedSize(56, 56);
0122     _iconButton->setIconSize(32);
0123     generalTabLayout->addWidget(_iconButton, 0, 2, 2, 1);
0124     generalTabLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), 8, 0, 1, 3);
0125 
0126     // add the general group
0127     addTab(generalTab, i18n("General"));
0128 }
0129 
0130 void BasicTab::initAdvancedTab()
0131 {
0132     // advanced tab
0133     QWidget *advancedTab = new QWidget();
0134     QVBoxLayout *advancedTabLayout = new QVBoxLayout(advancedTab);
0135 
0136     // work path
0137     _workPathGroup = new QGroupBox();
0138     QHBoxLayout *workPathGroupLayout = new QHBoxLayout(_workPathGroup);
0139     _pathLabel = new QLabel(i18n("&Work path:"));
0140     workPathGroupLayout->addWidget(_pathLabel);
0141     _pathEdit = new KUrlRequester();
0142     _pathEdit->setMode(KFile::Directory | KFile::LocalOnly);
0143     _pathEdit->lineEdit()->setAcceptDrops(false);
0144     _pathLabel->setBuddy(_pathEdit);
0145     workPathGroupLayout->addWidget(_pathEdit);
0146     advancedTabLayout->addWidget(_workPathGroup);
0147 
0148     // terminal CB
0149     _terminalGroup = new QGroupBox();
0150     QVBoxLayout *terminalGroupLayout = new QVBoxLayout(_terminalGroup);
0151     _terminalCB = new QCheckBox(i18n("Run in term&inal"));
0152     terminalGroupLayout->addWidget(_terminalCB);
0153     // terminal options
0154     QWidget *terminalOptionsGroup = new QWidget();
0155     QHBoxLayout *terminalOptionsGroupLayout = new QHBoxLayout(terminalOptionsGroup);
0156     _terminalOptionsLabel = new QLabel(i18n("Terminal &options:"));
0157     terminalOptionsGroupLayout->addWidget(_terminalOptionsLabel);
0158     _terminalOptionsEdit = new QLineEdit();
0159     _terminalOptionsEdit->setClearButtonEnabled(true);
0160     _terminalOptionsEdit->setAcceptDrops(false);
0161     _terminalOptionsEdit->setEnabled(false);
0162     _terminalOptionsLabel->setBuddy(_terminalOptionsEdit);
0163     terminalOptionsGroupLayout->addWidget(_terminalOptionsEdit);
0164     terminalGroupLayout->addWidget(terminalOptionsGroup);
0165     advancedTabLayout->addWidget(_terminalGroup);
0166 
0167     // user name CB
0168     _userGroup = new QGroupBox();
0169     QVBoxLayout *userGroupLayout = new QVBoxLayout(_userGroup);
0170     _userCB = new QCheckBox(i18n("&Run as a different user"));
0171     userGroupLayout->addWidget(_userCB);
0172     // user name
0173     QWidget *userNameGroup = new QWidget();
0174     QHBoxLayout *userNameGroupLayout = new QHBoxLayout(userNameGroup);
0175     _userNameLabel = new QLabel(i18n("&Username:"));
0176     userNameGroupLayout->addWidget(_userNameLabel);
0177     _userNameEdit = new QLineEdit();
0178     _userNameEdit->setClearButtonEnabled(true);
0179     _userNameEdit->setAcceptDrops(false);
0180     _userNameEdit->setEnabled(false);
0181     _userNameLabel->setBuddy(_userNameEdit);
0182     userNameGroupLayout->addWidget(_userNameEdit);
0183     userGroupLayout->addWidget(userNameGroup);
0184     advancedTabLayout->addWidget(_userGroup);
0185 
0186     // key binding
0187     _keyBindingGroup = new QGroupBox();
0188     QHBoxLayout *keyBindingGroupLayout = new QHBoxLayout(_keyBindingGroup);
0189     _keyBindingLabel = new QLabel(i18n("Current shortcut &key:"));
0190     keyBindingGroupLayout->addWidget(_keyBindingLabel);
0191     _keyBindingEdit = new KKeySequenceWidget();
0192     _keyBindingEdit->setMultiKeyShortcutsAllowed(false);
0193     _keyBindingLabel->setBuddy(_keyBindingEdit);
0194     keyBindingGroupLayout->addWidget(_keyBindingEdit);
0195     advancedTabLayout->addWidget(_keyBindingGroup);
0196 
0197     // push components to the top
0198     advancedTabLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding));
0199     // add the general group
0200     addTab(advancedTab, i18n("Advanced"));
0201 }
0202 
0203 void BasicTab::initConnections()
0204 {
0205     // general tab's components
0206     connect(_nameEdit, &QLineEdit::textChanged, this, &BasicTab::slotChanged);
0207     connect(_descriptionEdit, &KLineSpellChecking::textChanged, this, &BasicTab::slotChanged);
0208     connect(_commentEdit, &KLineSpellChecking::textChanged, this, &BasicTab::slotChanged);
0209     connect(_programEdit, &KUrlRequester::textChanged, this, &BasicTab::slotChanged);
0210     connect(_envarsEdit, &QLineEdit::textChanged, this, &BasicTab::slotChanged);
0211     connect(_argsEdit, &QLineEdit::textChanged, this, &BasicTab::slotChanged);
0212     connect(_programEdit, &KUrlRequester::urlSelected, this, &BasicTab::slotExecSelected);
0213     connect(_launchCB, &QCheckBox::clicked, this, &BasicTab::launchcb_clicked);
0214     connect(_onlyShowInKdeCB, &QCheckBox::clicked, this, &BasicTab::onlyshowcb_clicked);
0215     connect(_hiddenEntryCB, &QCheckBox::clicked, this, &BasicTab::hiddenentrycb_clicked);
0216     connect(_iconButton, &KIconButton::iconChanged, this, &BasicTab::slotChanged);
0217 
0218     // advanced tab's components
0219     connect(_pathEdit, &KUrlRequester::textChanged, this, &BasicTab::slotChanged);
0220     connect(_terminalCB, &QCheckBox::clicked, this, &BasicTab::termcb_clicked);
0221     connect(_terminalOptionsEdit, &QLineEdit::textChanged, this, &BasicTab::slotChanged);
0222     connect(_userCB, &QCheckBox::clicked, this, &BasicTab::uidcb_clicked);
0223     connect(_userNameEdit, &QLineEdit::textChanged, this, &BasicTab::slotChanged);
0224     connect(_keyBindingEdit, &KKeySequenceWidget::keySequenceChanged, this, &BasicTab::slotCapturedKeySequence);
0225 }
0226 
0227 void BasicTab::slotDisableAction()
0228 {
0229     // disable all group at the beginning.
0230     // because there is not file selected.
0231     _nameEdit->setEnabled(false);
0232     _descriptionEdit->setEnabled(false);
0233     _commentEdit->setEnabled(false);
0234     _programEdit->setEnabled(false);
0235     _envarsEdit->setEnabled(false);
0236     _argsEdit->setEnabled(false);
0237     _launchCB->setEnabled(false);
0238     _onlyShowInKdeCB->setEnabled(false);
0239     _hiddenEntryCB->setEnabled(false);
0240     _nameLabel->setEnabled(false);
0241     _descriptionLabel->setEnabled(false);
0242     _commentLabel->setEnabled(false);
0243     _programLabel->setEnabled(false);
0244     _envarsLabel->setEnabled(false);
0245     _argsLabel->setEnabled(false);
0246     _workPathGroup->setEnabled(false);
0247     _terminalGroup->setEnabled(false);
0248     _userGroup->setEnabled(false);
0249     _iconButton->setEnabled(false);
0250     // key binding part
0251     _keyBindingGroup->setEnabled(false);
0252 }
0253 
0254 void BasicTab::enableWidgets(bool isDF, bool isDeleted)
0255 {
0256     // set only basic attributes if it is not a .desktop file
0257     _nameEdit->setEnabled(!isDeleted);
0258     _descriptionEdit->setEnabled(!isDeleted);
0259     _commentEdit->setEnabled(!isDeleted);
0260     _iconButton->setEnabled(!isDeleted);
0261     _programEdit->setEnabled(isDF && !isDeleted);
0262     _envarsEdit->setEnabled(isDF && !isDeleted);
0263     _argsEdit->setEnabled(isDF && !isDeleted);
0264     _launchCB->setEnabled(isDF && !isDeleted);
0265     _onlyShowInKdeCB->setEnabled(isDF && !isDeleted);
0266     _hiddenEntryCB->setEnabled(isDF && !isDeleted);
0267     _nameLabel->setEnabled(!isDeleted);
0268     _descriptionLabel->setEnabled(!isDeleted);
0269     _commentLabel->setEnabled(!isDeleted);
0270     _programLabel->setEnabled(isDF && !isDeleted);
0271     _envarsLabel->setEnabled(isDF && !isDeleted);
0272     _argsLabel->setEnabled(isDF && !isDeleted);
0273 
0274     _workPathGroup->setEnabled(isDF && !isDeleted);
0275     _terminalGroup->setEnabled(isDF && !isDeleted);
0276     _userGroup->setEnabled(isDF && !isDeleted);
0277     _keyBindingGroup->setEnabled(isDF && !isDeleted);
0278 
0279     _terminalOptionsEdit->setEnabled(isDF && !isDeleted && _terminalCB->isChecked());
0280     _terminalOptionsLabel->setEnabled(isDF && !isDeleted && _terminalCB->isChecked());
0281 
0282     _userNameEdit->setEnabled(isDF && !isDeleted && _userCB->isChecked());
0283     _userNameLabel->setEnabled(isDF && !isDeleted && _userCB->isChecked());
0284 }
0285 
0286 void BasicTab::setFolderInfo(MenuFolderInfo *folderInfo)
0287 {
0288     blockSignals(true);
0289     _menuFolderInfo = folderInfo;
0290     _menuEntryInfo = 0;
0291 
0292     _nameEdit->setText(folderInfo->caption);
0293     _descriptionEdit->setText(folderInfo->genericname);
0294     _descriptionEdit->setCursorPosition(0);
0295     _commentEdit->setText(folderInfo->comment);
0296     _commentEdit->setCursorPosition(0);
0297     _iconButton->setIcon(folderInfo->icon);
0298 
0299     // clean all disabled fields and return
0300     _programEdit->lineEdit()->clear();
0301     _envarsEdit->clear();
0302     _argsEdit->clear();
0303     _pathEdit->lineEdit()->clear();
0304     _terminalOptionsEdit->clear();
0305     _userNameEdit->clear();
0306     _launchCB->setChecked(false);
0307     _terminalCB->setChecked(false);
0308     _onlyShowInKdeCB->setChecked(false);
0309     _hiddenEntryCB->setChecked(false);
0310     _userCB->setChecked(false);
0311     _keyBindingEdit->clearKeySequence();
0312 
0313     enableWidgets(false, folderInfo->hidden);
0314     blockSignals(false);
0315 }
0316 
0317 void BasicTab::setEntryInfo(MenuEntryInfo *entryInfo)
0318 {
0319     blockSignals(true);
0320     _menuFolderInfo = 0;
0321     _menuEntryInfo = entryInfo;
0322 
0323     if (!entryInfo) {
0324         _nameEdit->clear();
0325         _descriptionEdit->clear();
0326         _commentEdit->clear();
0327         _iconButton->setIcon(QString());
0328 
0329         // key binding part
0330         _keyBindingEdit->clearKeySequence();
0331 
0332         _programEdit->lineEdit()->clear();
0333         _envarsEdit->clear();
0334         _argsEdit->clear();
0335         _onlyShowInKdeCB->setChecked(false);
0336         _hiddenEntryCB->setChecked(false);
0337 
0338         _pathEdit->lineEdit()->clear();
0339         _terminalOptionsEdit->clear();
0340         _userNameEdit->clear();
0341 
0342         _launchCB->setChecked(false);
0343         _terminalCB->setChecked(false);
0344         _userCB->setChecked(false);
0345         enableWidgets(true, true);
0346         blockSignals(false);
0347         return;
0348     }
0349 
0350     KDesktopFile *df = entryInfo->desktopFile();
0351 
0352     _nameEdit->setText(df->readName());
0353     _descriptionEdit->setText(df->readGenericName());
0354     _descriptionEdit->setCursorPosition(0);
0355     _commentEdit->setText(df->readComment());
0356     _commentEdit->setCursorPosition(0);
0357     _iconButton->setIcon(df->readIcon());
0358 
0359     // key binding part
0360     if (!entryInfo->shortcut().isEmpty()) {
0361         _keyBindingEdit->setKeySequence(entryInfo->shortcut());
0362     } else {
0363         _keyBindingEdit->clearKeySequence();
0364     }
0365 
0366     QStringList execLine = KShell::splitArgs(df->desktopGroup().readEntry("Exec"));
0367     QStringList enVars = {};
0368     if (!execLine.isEmpty()) {
0369         // check for apps that use the env executable
0370         // to set the environment
0371         if (execLine[0] == QLatin1String("env")) {
0372             execLine.pop_front();
0373         }
0374         for (auto env : execLine) {
0375             if (!env.contains(QLatin1String("="))) {
0376                 break;
0377             }
0378             enVars += env;
0379             execLine.pop_front();
0380         }
0381 
0382         _programEdit->lineEdit()->setText(execLine.takeFirst());
0383     } else {
0384         _programEdit->lineEdit()->clear();
0385     }
0386     _argsEdit->setText(KShell::joinArgs(execLine));
0387     _envarsEdit->setText(KShell::joinArgs(enVars));
0388 
0389     _pathEdit->lineEdit()->setText(df->readPath());
0390     _terminalOptionsEdit->setText(df->desktopGroup().readEntry("TerminalOptions"));
0391     _userNameEdit->setText(df->desktopGroup().readEntry("X-KDE-Username"));
0392 
0393     if (df->desktopGroup().hasKey("StartupNotify")) {
0394         _launchCB->setChecked(df->desktopGroup().readEntry("StartupNotify", true));
0395     } else { // backwards comp.
0396         _launchCB->setChecked(df->desktopGroup().readEntry("X-KDE-StartupNotify", true));
0397     }
0398 
0399     // or maybe enable only if it contains nothing but KDE?
0400     _onlyShowInKdeCB->setChecked(df->desktopGroup().readXdgListEntry("OnlyShowIn").contains(QLatin1String("KDE")));
0401 
0402     if (df->desktopGroup().hasKey("NoDisplay")) {
0403         _hiddenEntryCB->setChecked(df->desktopGroup().readEntry("NoDisplay", true));
0404     } else {
0405         _hiddenEntryCB->setChecked(false);
0406     }
0407 
0408     _terminalCB->setChecked(df->desktopGroup().readEntry("Terminal", false));
0409 
0410     _userCB->setChecked(df->desktopGroup().readEntry("X-KDE-SubstituteUID", false));
0411 
0412     enableWidgets(true, entryInfo->hidden);
0413     blockSignals(false);
0414 }
0415 
0416 void BasicTab::apply()
0417 {
0418     if (_menuEntryInfo) {
0419         _menuEntryInfo->setDirty();
0420         _menuEntryInfo->setCaption(_nameEdit->text());
0421         _menuEntryInfo->setDescription(_descriptionEdit->text());
0422         _menuEntryInfo->setIcon(_iconButton->icon());
0423 
0424         KDesktopFile *df = _menuEntryInfo->desktopFile();
0425         KConfigGroup dg = df->desktopGroup();
0426         dg.writeEntry("Comment", _commentEdit->text());
0427         
0428         QStringList command;
0429         QStringList envars = KShell::splitArgs(_envarsEdit->text());
0430         if (!envars.isEmpty()) {
0431             envars.push_front(QLatin1String("env"));
0432             command << KShell::joinArgs(envars);
0433         }
0434         command << _programEdit->lineEdit()->text();
0435         const QStringList args = KShell::splitArgs(_argsEdit->text());
0436         if (!args.isEmpty()) {
0437             command << KShell::joinArgs(args);
0438         }
0439         dg.writeEntry("Exec", command.join(QLatin1Char(' ')));
0440 
0441         // NOT writePathEntry, it writes the entry with non-XDG-compliant flag: Path[$e]
0442         dg.writeEntry("Path", _pathEdit->lineEdit()->text());
0443 
0444         dg.writeEntry("Terminal", _terminalCB->isChecked());
0445         dg.writeEntry("TerminalOptions", _terminalOptionsEdit->text());
0446         dg.writeEntry("X-KDE-SubstituteUID", _userCB->isChecked());
0447         dg.writeEntry("X-KDE-Username", _userNameEdit->text());
0448         dg.writeEntry("StartupNotify", _launchCB->isChecked());
0449         dg.writeEntry("NoDisplay", _hiddenEntryCB->isChecked());
0450 
0451         QStringList onlyShowIn = df->desktopGroup().readXdgListEntry("OnlyShowIn");
0452         /* the exact semantics of this checkbox are unclear if there is more than just KDE in the list...
0453          * For example: - The list is "Gnome;", the user enables "Only show when logged into a Plasma session" - should we remove Gnome?
0454          *              - The list is "Gnome;KDE;", the user unchecks the box - should we keep Gnome?
0455          */
0456         if (_onlyShowInKdeCB->isChecked() && !onlyShowIn.contains(QLatin1String("KDE"))) {
0457             onlyShowIn << QStringLiteral("KDE");
0458         } else if (!_onlyShowInKdeCB->isChecked() && onlyShowIn.contains(QLatin1String("KDE"))) {
0459             onlyShowIn.removeAll(QStringLiteral("KDE"));
0460         }
0461         if (onlyShowIn.isEmpty()) {
0462             dg.deleteEntry("OnlyShowIn");
0463         } else {
0464             dg.writeXdgListEntry("OnlyShowIn", onlyShowIn);
0465         }
0466     } else {
0467         _menuFolderInfo->setCaption(_nameEdit->text());
0468         _menuFolderInfo->setGenericName(_descriptionEdit->text());
0469         _menuFolderInfo->setComment(_commentEdit->text());
0470         _menuFolderInfo->setIcon(_iconButton->icon());
0471     }
0472 }
0473 
0474 void BasicTab::slotChanged()
0475 {
0476     if (signalsBlocked()) {
0477         return;
0478     }
0479     apply();
0480     if (_menuEntryInfo) {
0481         emit changed(_menuEntryInfo);
0482     } else {
0483         emit changed(_menuFolderInfo);
0484     }
0485 }
0486 
0487 void BasicTab::launchcb_clicked()
0488 {
0489     slotChanged();
0490 }
0491 
0492 void BasicTab::onlyshowcb_clicked()
0493 {
0494     slotChanged();
0495 }
0496 
0497 void BasicTab::hiddenentrycb_clicked()
0498 {
0499     slotChanged();
0500 }
0501 
0502 void BasicTab::termcb_clicked()
0503 {
0504     _terminalOptionsEdit->setEnabled(_terminalCB->isChecked());
0505     _terminalOptionsLabel->setEnabled(_terminalCB->isChecked());
0506     slotChanged();
0507 }
0508 
0509 void BasicTab::uidcb_clicked()
0510 {
0511     _userNameEdit->setEnabled(_userCB->isChecked());
0512     _userNameLabel->setEnabled(_userCB->isChecked());
0513     slotChanged();
0514 }
0515 
0516 void BasicTab::slotExecSelected()
0517 {
0518     QString path = _programEdit->lineEdit()->text();
0519     if (!path.startsWith(QLatin1Char('\''))) {
0520         _programEdit->lineEdit()->setText(KShell::quoteArg(path));
0521     }
0522 }
0523 
0524 void BasicTab::slotCapturedKeySequence(const QKeySequence &seq)
0525 {
0526     if (signalsBlocked()) {
0527         return;
0528     }
0529     QKeySequence cut(seq);
0530     if (_menuEntryInfo->isShortcutAvailable(cut)) {
0531         _menuEntryInfo->setShortcut(cut);
0532     } else {
0533         // We will not assign the shortcut so reset the visible key sequence
0534         _keyBindingEdit->setKeySequence(QKeySequence());
0535     }
0536     if (_menuEntryInfo) {
0537         emit changed(_menuEntryInfo);
0538     }
0539 }
0540 
0541 void BasicTab::updateHiddenEntry(bool show)
0542 {
0543     if (show) {
0544         _hiddenEntryCB->show();
0545     } else {
0546         _hiddenEntryCB->hide();
0547     }
0548 }