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 }