File indexing completed on 2024-04-28 17:06:08

0001 /*
0002     SPDX-FileCopyrightText: 2004 Csaba Karai <krusader@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2004-2022 Krusader Krew <https://krusader.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "kggeneral.h"
0009 
0010 // QtCore
0011 #include <QPointer>
0012 // QtGui
0013 #include <QFontMetrics>
0014 #include <QPixmap>
0015 // QtWidgets
0016 #include <QFrame>
0017 #include <QGridLayout>
0018 #include <QInputDialog>
0019 #include <QLabel>
0020 
0021 #include <KConfigCore/KSharedConfig>
0022 #include <KI18n/KLocalizedString>
0023 #include <KWidgetsAddons/KMessageBox>
0024 
0025 #include "../defaults.h"
0026 #include "../icon.h"
0027 #include "../krglobal.h"
0028 #include "krresulttabledialog.h"
0029 
0030 #define PAGE_GENERAL 0
0031 #define PAGE_VIEWER 1
0032 #define PAGE_EXTENSIONS 2
0033 
0034 KgGeneral::KgGeneral(bool first, QWidget *parent)
0035     : KonfiguratorPage(first, parent)
0036 {
0037     if (first)
0038         slotFindTools();
0039 
0040     tabWidget = new QTabWidget(this);
0041     setWidget(tabWidget);
0042     setWidgetResizable(true);
0043 
0044     createGeneralTab();
0045     createViewerTab();
0046     createExtensionsTab();
0047 }
0048 
0049 QWidget *KgGeneral::createTab(const QString &name)
0050 {
0051     auto *scrollArea = new QScrollArea(tabWidget);
0052     tabWidget->addTab(scrollArea, name);
0053     scrollArea->setFrameStyle(QFrame::NoFrame);
0054     scrollArea->setWidgetResizable(true);
0055 
0056     QWidget *tab = new QWidget(scrollArea);
0057     scrollArea->setWidget(tab);
0058 
0059     return tab;
0060 }
0061 
0062 void KgGeneral::createViewerTab()
0063 {
0064     QWidget *tab = createTab(i18n("Viewer/Editor"));
0065     auto *tabLayout = new QGridLayout(tab);
0066     tabLayout->setSpacing(6);
0067     tabLayout->setContentsMargins(11, 11, 11, 11);
0068 
0069     tabLayout->addWidget(createCheckBox("General",
0070                                         "View In Separate Window",
0071                                         _ViewInSeparateWindow,
0072                                         i18n("Internal editor and viewer opens each file in a separate window"),
0073                                         tab,
0074                                         false,
0075                                         i18n("If checked, each file will open in a separate window, otherwise, the viewer will work in a single, tabbed mode"),
0076                                         PAGE_VIEWER));
0077 
0078     tabLayout->addWidget(createCheckBox("General",
0079                                         "Viewer Hide Single Tab",
0080                                         _ViewerHideSingleTab,
0081                                         i18n("Hide the tab bar when only one tab is opened"),
0082                                         tab,
0083                                         false,
0084                                         i18n("If checked, the Viewer tab bar will hide if only one tab is open"),
0085                                         PAGE_VIEWER));
0086 
0087     // ------------------------- viewer ----------------------------------
0088 
0089     QGroupBox *viewerGrp = createFrame(i18n("Viewer"), tab);
0090     tabLayout->addWidget(viewerGrp, 2, 0);
0091 
0092     QGridLayout *viewerGrid = createGridLayout(viewerGrp);
0093 
0094     QWidget *hboxWidget2 = new QWidget(viewerGrp);
0095     auto *hbox2 = new QHBoxLayout(hboxWidget2);
0096 
0097     QWidget *vboxWidget = new QWidget(hboxWidget2);
0098     auto *vbox = new QVBoxLayout(vboxWidget);
0099 
0100     vbox->addWidget(new QLabel(i18n("Default viewer mode:"), vboxWidget));
0101 
0102     KONFIGURATOR_NAME_VALUE_TIP viewMode[] =
0103         //   name    value    tooltip
0104         {
0105             {i18n("Generic mode"), "generic", i18n("Use the system's default viewer")},
0106             {i18n("Text mode"), "text", i18n("View the file in text-only mode")},
0107             {i18n("Hex mode"), "hex", i18n("View the file in hex-mode (better for binary files)")},
0108             {i18n("Lister mode"), "lister", i18n("View the file with lister (for huge text files)")},
0109         };
0110 
0111     vbox->addWidget(createRadioButtonGroup("General", "Default Viewer Mode", "generic", 0, 4, viewMode, 4, vboxWidget, false, PAGE_VIEWER));
0112 
0113     vbox->addWidget(createCheckBox("General",
0114                                    "UseOktetaViewer",
0115                                    _UseOktetaViewer,
0116                                    i18n("Use Okteta as Hex viewer"),
0117                                    vboxWidget,
0118                                    false,
0119                                    i18n("If available, use Okteta as Hex viewer instead of the internal viewer"),
0120                                    PAGE_VIEWER));
0121 
0122     QWidget *hboxWidget4 = new QWidget(vboxWidget);
0123     auto *hbox4 = new QHBoxLayout(hboxWidget4);
0124 
0125     const QString listerLimitTip = i18n("If a text file is bigger than this size then lister will be used.");
0126     QLabel *label5 = new QLabel(i18n("Use lister if the text file is bigger than:"), hboxWidget4);
0127     hbox4->addWidget(label5);
0128     KonfiguratorSpinBox *spinBox =
0129         createSpinBox("General", "Lister Limit", _ListerLimit, 0, 0x7FFFFFFF, label5, hboxWidget4, false, listerLimitTip, PAGE_VIEWER);
0130     hbox4->addWidget(spinBox);
0131     QLabel *label6 = new QLabel(i18n("MB"), hboxWidget4);
0132     hbox4->addWidget(label6);
0133 
0134     vbox->addWidget(hboxWidget4);
0135 
0136     hbox2->addWidget(vboxWidget);
0137 
0138     viewerGrid->addWidget(hboxWidget2, 0, 0);
0139 
0140     // ------------------------- editor ----------------------------------
0141 
0142     QGroupBox *editorGrp = createFrame(i18n("Editor"), tab);
0143     tabLayout->addWidget(editorGrp, 3, 0);
0144     QGridLayout *editorGrid = createGridLayout(editorGrp);
0145 
0146     QLabel *label1 = new QLabel(i18n("Editor:"), editorGrp);
0147     editorGrid->addWidget(label1, 0, 0);
0148     KonfiguratorURLRequester *urlReq = createURLRequester("General", "Editor", "internal editor", label1, editorGrp, false, QString(), PAGE_VIEWER, false);
0149     editorGrid->addWidget(urlReq, 0, 1);
0150 
0151     QLabel *label2 = new QLabel(i18n("Hint: use 'internal editor' if you want to use Krusader's fast built-in editor"), editorGrp);
0152     editorGrid->addWidget(label2, 1, 0, 1, 2);
0153 }
0154 
0155 void KgGeneral::createExtensionsTab()
0156 {
0157     // ------------------------- atomic extensions ----------------------------------
0158 
0159     QWidget *tab = createTab(i18n("Atomic extensions"));
0160     auto *tabLayout = new QGridLayout(tab);
0161     tabLayout->setSpacing(6);
0162     tabLayout->setContentsMargins(11, 11, 11, 11);
0163 
0164     QWidget *vboxWidget2 = new QWidget(tab);
0165     tabLayout->addWidget(vboxWidget2);
0166 
0167     auto *vbox2 = new QVBoxLayout(vboxWidget2);
0168 
0169     QWidget *hboxWidget3 = new QWidget(vboxWidget2);
0170     vbox2->addWidget(hboxWidget3);
0171 
0172     auto *hbox3 = new QHBoxLayout(hboxWidget3);
0173 
0174     QLabel *atomLabel = new QLabel(i18n("Atomic extensions:"), hboxWidget3);
0175     hbox3->addWidget(atomLabel);
0176 
0177     int size = QFontMetrics(atomLabel->font()).height();
0178 
0179     auto *addButton = new QToolButton(hboxWidget3);
0180     hbox3->addWidget(addButton);
0181 
0182     QPixmap iconPixmap = Icon("list-add").pixmap(size);
0183     addButton->setFixedSize(iconPixmap.width() + 4, iconPixmap.height() + 4);
0184     addButton->setIcon(QIcon(iconPixmap));
0185     connect(addButton, &QToolButton::clicked, this, &KgGeneral::slotAddExtension);
0186 
0187     auto *removeButton = new QToolButton(hboxWidget3);
0188     hbox3->addWidget(removeButton);
0189 
0190     iconPixmap = Icon("list-remove").pixmap(size);
0191     removeButton->setFixedSize(iconPixmap.width() + 4, iconPixmap.height() + 4);
0192     removeButton->setIcon(QIcon(iconPixmap));
0193     connect(removeButton, &QToolButton::clicked, this, &KgGeneral::slotRemoveExtension);
0194 
0195     QStringList defaultAtomicExtensions;
0196     defaultAtomicExtensions += ".tar.gz";
0197     defaultAtomicExtensions += ".tar.bz2";
0198     defaultAtomicExtensions += ".tar.lzma";
0199     defaultAtomicExtensions += ".tar.xz";
0200     defaultAtomicExtensions += ".moc.cpp";
0201 
0202     listBox = createListBox("Look&Feel", "Atomic Extensions", defaultAtomicExtensions, vboxWidget2, true, QString(), PAGE_EXTENSIONS);
0203     vbox2->addWidget(listBox);
0204 }
0205 
0206 void KgGeneral::createGeneralTab()
0207 {
0208     QWidget *tab = createTab(i18n("General"));
0209     auto *kgGeneralLayout = new QGridLayout(tab);
0210     kgGeneralLayout->setSpacing(6);
0211     kgGeneralLayout->setContentsMargins(11, 11, 11, 11);
0212 
0213     //  -------------------------- GENERAL GROUPBOX ----------------------------------
0214 
0215     QGroupBox *generalGrp = createFrame(i18n("General"), tab);
0216     QGridLayout *generalGrid = createGridLayout(generalGrp);
0217 
0218     KONFIGURATOR_CHECKBOX_PARAM settings[] = {
0219         //   cfg_class  cfg_name                default             text                              restart tooltip
0220         {"Look&Feel",
0221          "Warn On Exit",
0222          _WarnOnExit,
0223          i18n("Warn on exit"),
0224          false,
0225          i18n("Display a warning when trying to close the main window.")}, // KDE4: move warn on exit to the other confirmations
0226         {"Look&Feel",
0227          "Minimize To Tray",
0228          _ShowTrayIcon,
0229          i18n("Show and close to tray"),
0230          false,
0231          i18n("Show an icon in the system tray and keep running in the background when the window is closed.")},
0232     };
0233     KonfiguratorCheckBoxGroup *cbs = createCheckBoxGroup(2, 0, settings, 2 /*count*/, generalGrp, PAGE_GENERAL);
0234     generalGrid->addWidget(cbs, 0, 0);
0235 
0236     // temp dir
0237 
0238     auto *hbox = new QHBoxLayout();
0239 
0240     QLabel *labelGrp = new QLabel(i18n("Temp Folder:"), generalGrp);
0241     hbox->addWidget(labelGrp);
0242     KonfiguratorURLRequester *urlReq3 = createURLRequester("General", "Temp Directory", _TempDirectory, labelGrp, generalGrp, false, QString(), PAGE_GENERAL);
0243     urlReq3->setMode(KFile::Directory);
0244     connect(urlReq3->extension(), &KonfiguratorExtension::applyManually, this, &KgGeneral::applyTempDir);
0245     hbox->addWidget(urlReq3);
0246     generalGrid->addLayout(hbox, 13, 0, 1, 1);
0247 
0248     QLabel *label4 = new QLabel(i18n("Note: you must have full permissions for the temporary folder."), generalGrp);
0249     generalGrid->addWidget(label4, 14, 0, 1, 1);
0250 
0251     kgGeneralLayout->addWidget(generalGrp, 0, 0);
0252 
0253     // ----------------------- delete mode --------------------------------------
0254 
0255     QGroupBox *delGrp = createFrame(i18n("Delete mode"), tab);
0256     QGridLayout *delGrid = createGridLayout(delGrp);
0257 
0258     KONFIGURATOR_NAME_VALUE_TIP deleteMode[] =
0259         //            name            value    tooltip
0260         {{i18n("Move to trash"), "true", i18n("Files will be moved to trash when deleted.")},
0261          {i18n("Delete files"), "false", i18n("Files will be permanently deleted.")}};
0262     KonfiguratorRadioButtons *trashRadio =
0263         createRadioButtonGroup("General", "Move To Trash", _MoveToTrash ? "true" : "false", 2, 0, deleteMode, 2, delGrp, false, PAGE_GENERAL);
0264     delGrid->addWidget(trashRadio);
0265 
0266     kgGeneralLayout->addWidget(delGrp, 1, 0);
0267 
0268     // ----------------------- terminal -----------------------------------------
0269 
0270     QGroupBox *terminalGrp = createFrame(i18n("Terminal"), tab);
0271     QGridLayout *terminalGrid = createGridLayout(terminalGrp);
0272 
0273     QLabel *label3 = new QLabel(i18n("External Terminal:"), generalGrp);
0274     terminalGrid->addWidget(label3, 0, 0);
0275     KonfiguratorURLRequester *urlReq2 = createURLRequester("General", "Terminal", _Terminal, label3, generalGrp, false, QString(), PAGE_GENERAL, false);
0276     terminalGrid->addWidget(urlReq2, 0, 1);
0277     QLabel *terminalLabel = new QLabel(i18n("%d will be replaced by the workdir."), terminalGrp);
0278     terminalGrid->addWidget(terminalLabel, 1, 1);
0279 
0280     KONFIGURATOR_CHECKBOX_PARAM terminal_settings[] = {
0281         //   cfg_class  cfg_name     default        text            restart tooltip
0282         {"General",
0283          "Send CDs",
0284          _SendCDs,
0285          i18n("Embedded Terminal sends Chdir on panel change"),
0286          false,
0287          i18n("When checked, whenever the panel is changed (for example, by pressing Tab), Krusader changes the current folder in the embedded terminal.")},
0288         {"General",
0289          "Follow Terminal CD",
0290          _FollowTerminalCD,
0291          i18n("Active panel follows Embedded Terminal working directory"),
0292          false,
0293          i18n("When checked, whenever terminal working directory is changed (for example, by executing 'cd' or 'popd' command), Krusader changes the current "
0294               "folder of active panel.")},
0295     };
0296     cbs = createCheckBoxGroup(1, 0, terminal_settings, 2 /*count*/, terminalGrp, PAGE_GENERAL);
0297     terminalGrid->addWidget(cbs, 2, 0, 1, 2);
0298 
0299     kgGeneralLayout->addWidget(terminalGrp, 2, 0);
0300 }
0301 
0302 void KgGeneral::applyTempDir(QObject *obj, const QString &configGroup, const QString &name)
0303 {
0304     auto *urlReq = qobject_cast<KonfiguratorURLRequester *>(obj);
0305     QString value = urlReq->url().toDisplayString(QUrl::PreferLocalFile);
0306 
0307     KConfigGroup(krConfig, configGroup).writeEntry(name, value);
0308 }
0309 
0310 void KgGeneral::slotFindTools()
0311 {
0312     QPointer<KrResultTableDialog> dlg = new KrResultTableDialog(this,
0313                                                                 KrResultTableDialog::Tool,
0314                                                                 i18n("Search results"),
0315                                                                 i18n("Searching for tools..."),
0316                                                                 "tools-wizard",
0317                                                                 i18n("Make sure to install new tools in your <code>$PATH</code> (e.g. /usr/bin)"));
0318     dlg->exec();
0319     delete dlg;
0320 }
0321 
0322 void KgGeneral::slotAddExtension()
0323 {
0324     bool ok;
0325     QString atomExt = QInputDialog::getText(this, i18n("Add new atomic extension"), i18n("Extension:"), QLineEdit::Normal, QString(), &ok);
0326 
0327     if (ok) {
0328         if (!atomExt.startsWith('.') || atomExt.indexOf('.', 1) == -1)
0329             KMessageBox::error(krMainWindow, i18n("Atomic extensions must start with '.' and must contain at least one more '.' character."), i18n("Error"));
0330         else
0331             listBox->addItem(atomExt);
0332     }
0333 }
0334 
0335 void KgGeneral::slotRemoveExtension()
0336 {
0337     QList<QListWidgetItem *> list = listBox->selectedItems();
0338 
0339     for (int i = 0; i != list.count(); i++)
0340         listBox->removeItem(list[i]->text());
0341 }