File indexing completed on 2024-04-21 16:33:17
0001 /* 0002 SPDX-FileCopyrightText: 2000 Shie Erlich <krusader@users.sourceforge.net> 0003 SPDX-FileCopyrightText: 2000 Rafi Yanai <krusader@users.sourceforge.net> 0004 SPDX-FileCopyrightText: 2004-2022 Krusader Krew <https://krusader.org> 0005 0006 SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 #include "kractions.h" 0010 0011 // QtWidgets 0012 #include <QAction> 0013 #include <QMenu> 0014 0015 #include <KI18n/KLocalizedString> 0016 #include <KWidgetsAddons/KToggleAction> 0017 #include <KWidgetsAddons/KToolBarPopupAction> 0018 #include <KXmlGui/KActionCollection> 0019 #include <KXmlGui/KToggleToolBarAction> 0020 #include <KXmlGui/KXMLGUIFactory> 0021 0022 #include "Dialogs/popularurls.h" 0023 #include "GUI/krremoteencodingmenu.h" 0024 #include "JobMan/jobman.h" 0025 #include "MountMan/kmountman.h" 0026 #include "Panel/PanelView/krviewfactory.h" 0027 #include "UserAction/useraction.h" 0028 #include "defaults.h" 0029 #include "icon.h" 0030 #include "krslots.h" 0031 #include "krtrashhandler.h" 0032 #include "krusader.h" 0033 #include "krusaderview.h" 0034 0035 QAction *KrActions::actCompare = nullptr; 0036 QAction *KrActions::actDiskUsage = nullptr; 0037 QAction *KrActions::actHomeTerminal = nullptr; 0038 QAction *KrActions::actRemoteEncoding = nullptr; 0039 RecentlyClosedTabsMenu *KrActions::actClosedTabsMenu = nullptr; 0040 QAction *KrActions::actProfiles = nullptr; 0041 QAction *KrActions::actMultiRename = nullptr; 0042 QAction *KrActions::actMountMan = nullptr; 0043 QAction *KrActions::actNewTool = nullptr; 0044 QAction *KrActions::actKonfigurator = nullptr; 0045 QAction *KrActions::actToolsSetup = nullptr; 0046 QAction *KrActions::actSwapPanels = nullptr; 0047 QAction *KrActions::actSwapSides = nullptr; 0048 QAction *KrActions::actFind = nullptr; 0049 QAction *KrActions::actLocate = nullptr; 0050 QAction *KrActions::actSwitchFullScreenTE = nullptr; 0051 QAction *KrActions::actAddBookmark = nullptr; 0052 QAction *KrActions::actSavePosition = nullptr; 0053 QAction *KrActions::actSelectColorMask = nullptr; 0054 QAction *KrActions::actOpenLeftBm = nullptr; 0055 QAction *KrActions::actOpenRightBm = nullptr; 0056 QAction *KrActions::actCmdlinePopup = nullptr; 0057 QAction *KrActions::actSplit = nullptr; 0058 QAction *KrActions::actCombine = nullptr; 0059 QAction *KrActions::actUserMenu = nullptr; 0060 QAction *KrActions::actManageUseractions = nullptr; 0061 #ifdef SYNCHRONIZER_ENABLED 0062 QAction *KrActions::actSyncDirs = nullptr; 0063 #endif 0064 QAction *KrActions::actF10Quit = nullptr; 0065 QAction *KrActions::actEmptyTrash = nullptr; 0066 QAction *KrActions::actTrashBin = nullptr; 0067 QAction *KrActions::actPopularUrls = nullptr; 0068 0069 KToggleAction *KrActions::actToggleTerminal = nullptr; 0070 QAction *KrActions::actVerticalMode = nullptr; 0071 QAction *KrActions::actSelectNewerAndSingle = nullptr; 0072 QAction *KrActions::actSelectSingle = nullptr; 0073 QAction *KrActions::actSelectNewer = nullptr; 0074 QAction *KrActions::actSelectDifferentAndSingle = nullptr; 0075 QAction *KrActions::actSelectDifferent = nullptr; 0076 QAction **KrActions::compareArray[] = {&actSelectNewerAndSingle, &actSelectNewer, &actSelectSingle, &actSelectDifferentAndSingle, &actSelectDifferent, nullptr}; 0077 QAction *KrActions::actExecStartAndForget = nullptr; 0078 QAction *KrActions::actExecCollectSeparate = nullptr; 0079 QAction *KrActions::actExecCollectTogether = nullptr; 0080 QAction *KrActions::actExecTerminalExternal = nullptr; 0081 QAction *KrActions::actExecTerminalEmbedded = nullptr; 0082 QAction **KrActions::execTypeArray[] = 0083 {&actExecStartAndForget, &actExecCollectSeparate, &actExecCollectTogether, &actExecTerminalExternal, &actExecTerminalEmbedded, nullptr}; 0084 KToggleAction *KrActions::actToggleFnkeys = nullptr; 0085 KToggleAction *KrActions::actToggleCmdline = nullptr; 0086 KToggleAction *KrActions::actShowStatusBar = nullptr; 0087 KToggleAction *KrActions::actToggleHidden = nullptr; 0088 KToggleAction *KrActions::actCompareDirs = nullptr; 0089 0090 QAction *KrActions::actJobProgress = nullptr; 0091 QAction *KrActions::actJobControl = nullptr; 0092 QAction *KrActions::actJobMode = nullptr; 0093 QAction *KrActions::actJobUndo = nullptr; 0094 0095 QAction *createAction(const QString &text, 0096 const QString &iconName, 0097 const QKeySequence &shortcut, 0098 QObject *recv, 0099 const char *slot, 0100 const QString &name, 0101 Krusader *krusaderApp) 0102 { 0103 QAction *a; 0104 if (iconName.isEmpty()) 0105 a = new QAction(text, krusaderApp); 0106 else 0107 a = new QAction(Icon(iconName), text, krusaderApp); 0108 krusaderApp->connect(a, SIGNAL(triggered(bool)), recv, slot); 0109 krusaderApp->actionCollection()->addAction(name, a); 0110 krusaderApp->actionCollection()->setDefaultShortcut(a, shortcut); 0111 return a; 0112 } 0113 0114 QAction *createAction(const QString &text, 0115 const QString &iconName, 0116 const QList<QKeySequence> &shortcuts, 0117 QObject *recv, 0118 const char *slot, 0119 const QString &name, 0120 Krusader *krusaderApp) 0121 { 0122 QAction *a; 0123 if (iconName.isEmpty()) 0124 a = new QAction(text, krusaderApp); 0125 else 0126 a = new QAction(Icon(iconName), text, krusaderApp); 0127 krusaderApp->connect(a, SIGNAL(triggered(bool)), recv, slot); 0128 krusaderApp->actionCollection()->addAction(name, a); 0129 krusaderApp->actionCollection()->setDefaultShortcuts(a, shortcuts); 0130 return a; 0131 } 0132 0133 KToggleAction *createToggleAction(const QString &text, 0134 const QString &iconName, 0135 const QKeySequence &shortcut, 0136 QObject *recv, 0137 const char *slot, 0138 const QString &name, 0139 Krusader *krusaderApp) 0140 { 0141 KToggleAction *a; 0142 if (iconName == nullptr) 0143 a = new KToggleAction(text, krusaderApp); 0144 else 0145 a = new KToggleAction(Icon(iconName), text, krusaderApp); 0146 krusaderApp->connect(a, SIGNAL(triggered(bool)), recv, slot); 0147 krusaderApp->actionCollection()->addAction(name, a); 0148 krusaderApp->actionCollection()->setDefaultShortcut(a, shortcut); 0149 return a; 0150 } 0151 0152 void KrActions::setupActions(Krusader *krusaderApp) 0153 { 0154 #define NEW_KACTION(VAR, TEXT, ICON_NAME, SHORTCUT, RECV_OBJ, SLOT_NAME, NAME) \ 0155 VAR = createAction(TEXT, ICON_NAME, SHORTCUT, RECV_OBJ, SLOT_NAME, NAME, krusaderApp); 0156 0157 #define NEW_KTOGGLEACTION(VAR, TEXT, ICON_NAME, SHORTCUT, RECV_OBJ, SLOT_NAME, NAME) \ 0158 VAR = createToggleAction(TEXT, ICON_NAME, SHORTCUT, RECV_OBJ, SLOT_NAME, NAME, krusaderApp); 0159 0160 // first come the TODO actions 0161 // actSync = 0;//new QAction(i18n("S&ynchronize Dirs"), 0, krusaderApp, 0, actionCollection(), "sync dirs"); 0162 // actNewTool = 0;//new QAction(i18n("&Add a new tool"), 0, krusaderApp, 0, actionCollection(), "add tool"); 0163 // actToolsSetup = 0;//new QAction(i18n("&Tools Menu Setup"), 0, 0, krusaderApp, 0, actionCollection(), "tools setup"); 0164 // KStandardAction::print(SLOTS, 0,actionCollection(),"std_print"); 0165 // KStandardAction::showMenubar( SLOTS, SLOT(showMenubar()), actionCollection(), "std_menubar" ); 0166 0167 /* Shortcut disabled because of the Terminal Emulator bug. */ 0168 KConfigGroup group(krConfig, "Private"); 0169 int compareMode = group.readEntry("Compare Mode", 0); 0170 int cmdExecMode = group.readEntry("Command Execution Mode", 0); 0171 QAction *tmp; 0172 Q_UNUSED(tmp); 0173 0174 NEW_KACTION(tmp, i18n("Tab-Switch panel"), nullptr, Qt::Key_Tab, MAIN_VIEW, SLOT(panelSwitch()), "tab"); 0175 0176 KToggleToolBarAction *actShowToolBar = new KToggleToolBarAction(krusaderApp->toolBar(), i18n("Show Main Toolbar"), krusaderApp); 0177 krusaderApp->actionCollection()->addAction(KStandardAction::name(KStandardAction::ShowToolbar), actShowToolBar); 0178 0179 KToggleToolBarAction *actShowJobToolBar = new KToggleToolBarAction(krusaderApp->toolBar("jobToolBar"), i18n("Show Job Toolbar"), krusaderApp); 0180 krusaderApp->actionCollection()->addAction("toggle show jobbar", actShowJobToolBar); 0181 0182 KToggleToolBarAction *actShowActionsToolBar = new KToggleToolBarAction(krusaderApp->toolBar("actionsToolBar"), i18n("Show Actions Toolbar"), krusaderApp); 0183 krusaderApp->actionCollection()->addAction("toggle actions toolbar", actShowActionsToolBar); 0184 0185 actShowStatusBar = KStandardAction::showStatusbar(SLOTS, SLOT(updateStatusbarVisibility()), krusaderApp->actionCollection()); 0186 KStandardAction::quit(krusaderApp, SLOT(quit()), krusaderApp->actionCollection()); 0187 KStandardAction::configureToolbars(krusaderApp, SLOT(configureToolbars()), krusaderApp->actionCollection()); 0188 KStandardAction::keyBindings(krusaderApp->guiFactory(), SLOT(configureShortcuts()), krusaderApp->actionCollection()); 0189 0190 // the toggle actions 0191 NEW_KTOGGLEACTION(actToggleFnkeys, i18n("Show &FN Keys Bar"), nullptr, 0, SLOTS, SLOT(toggleFnkeys()), "toggle fn bar"); 0192 0193 NEW_KTOGGLEACTION(actToggleCmdline, i18n("Show &Command Line"), nullptr, 0, SLOTS, SLOT(toggleCmdline()), "toggle command line"); 0194 0195 NEW_KTOGGLEACTION(actToggleTerminal, 0196 i18n("Show &Embedded Terminal"), 0197 nullptr, 0198 Qt::CTRL + Qt::ALT + Qt::Key_E, 0199 SLOTS, 0200 SLOT(toggleTerminal()), 0201 "toggle terminal emulator"); 0202 0203 NEW_KTOGGLEACTION(actToggleHidden, 0204 i18n("Show &Hidden Files"), 0205 nullptr, 0206 Qt::ALT + Qt::Key_Period, 0207 SLOTS, 0208 SLOT(showHiddenFiles(bool)), 0209 "toggle hidden files"); 0210 0211 NEW_KACTION(actSwapPanels, i18n("S&wap Panels"), nullptr, Qt::CTRL + Qt::Key_U, SLOTS, SLOT(swapPanels()), "swap panels"); 0212 0213 NEW_KACTION(actEmptyTrash, i18n("Empty Trash"), "trash-empty", 0, SLOTS, SLOT(emptyTrash()), "emptytrash"); 0214 0215 NEW_KACTION(actTrashBin, i18n("Trash Popup Menu"), KrTrashHandler::trashIconName(), 0, SLOTS, SLOT(trashPopupMenu()), "trashbin"); 0216 0217 NEW_KACTION(actSwapSides, i18n("Sw&ap Sides"), nullptr, Qt::CTRL + Qt::SHIFT + Qt::Key_U, SLOTS, SLOT(toggleSwapSides()), "toggle swap sides"); 0218 actToggleHidden->setChecked(KConfigGroup(krConfig, "Look&Feel").readEntry("Show Hidden", _ShowHidden)); 0219 0220 // and then the DONE actions 0221 NEW_KACTION(actCmdlinePopup, i18n("popup cmdline"), nullptr, Qt::CTRL + Qt::Key_Slash, SLOTS, SLOT(cmdlinePopup()), "cmdline popup"); 0222 0223 NEW_KACTION(tmp, i18n("Start &Root Mode Krusader"), "krusader_root", Qt::ALT + Qt::SHIFT + Qt::Key_K, SLOTS, SLOT(rootKrusader()), "root krusader"); 0224 NEW_KACTION(actProfiles, i18n("Pro&files"), "user-identity", Qt::ALT + Qt::SHIFT + Qt::Key_L, MAIN_VIEW, SLOT(profiles()), "profile"); 0225 NEW_KACTION(actSplit, i18n("Sp&lit File..."), "split", Qt::CTRL + Qt::Key_P, SLOTS, SLOT(slotSplit()), "split"); 0226 NEW_KACTION(actCombine, i18n("Com&bine Files..."), "kr_combine", 0, SLOTS, SLOT(slotCombine()), "combine"); 0227 NEW_KACTION(actSelectNewerAndSingle, i18n("&Select Newer and Single"), nullptr, 0, SLOTS, SLOT(compareSetup()), "select_newer_and_single"); 0228 NEW_KACTION(actSelectNewer, i18n("Select &Newer"), nullptr, 0, SLOTS, SLOT(compareSetup()), "select_newer"); 0229 NEW_KACTION(actSelectSingle, i18n("Select &Single"), nullptr, 0, SLOTS, SLOT(compareSetup()), "select_single"); 0230 NEW_KACTION(actSelectDifferentAndSingle, i18n("Select Different &and Single"), nullptr, 0, SLOTS, SLOT(compareSetup()), "select_different_and_single"); 0231 NEW_KACTION(actSelectDifferent, i18n("Select &Different"), nullptr, 0, SLOTS, SLOT(compareSetup()), "select_different"); 0232 actSelectNewerAndSingle->setCheckable(true); 0233 actSelectNewer->setCheckable(true); 0234 actSelectSingle->setCheckable(true); 0235 actSelectDifferentAndSingle->setCheckable(true); 0236 actSelectDifferent->setCheckable(true); 0237 auto *selectGroup = new QActionGroup(krusaderApp); 0238 selectGroup->setExclusive(true); 0239 selectGroup->addAction(actSelectNewerAndSingle); 0240 selectGroup->addAction(actSelectNewer); 0241 selectGroup->addAction(actSelectSingle); 0242 selectGroup->addAction(actSelectDifferentAndSingle); 0243 selectGroup->addAction(actSelectDifferent); 0244 if (compareMode < (int)(sizeof(compareArray) / sizeof(QAction **)) - 1) 0245 (*compareArray[compareMode])->setChecked(true); 0246 NEW_KACTION(actExecStartAndForget, i18n("Start and &Forget"), nullptr, 0, SLOTS, SLOT(execTypeSetup()), "exec_start_and_forget"); 0247 NEW_KACTION(actExecCollectSeparate, 0248 i18n("Display &Separated Standard and Error Output"), 0249 nullptr, 0250 0, 0251 SLOTS, 0252 SLOT(execTypeSetup()), 0253 "exec_collect_separate"); 0254 NEW_KACTION(actExecCollectTogether, i18n("Display &Mixed Standard and Error Output"), nullptr, 0, SLOTS, SLOT(execTypeSetup()), "exec_collect_together"); 0255 NEW_KACTION(actExecTerminalExternal, i18n("Start in &New Terminal"), nullptr, 0, SLOTS, SLOT(execTypeSetup()), "exec_terminal_external"); 0256 NEW_KACTION(actExecTerminalEmbedded, i18n("Send to &Embedded Terminal Emulator"), nullptr, 0, SLOTS, SLOT(execTypeSetup()), "exec_terminal_embedded"); 0257 actExecStartAndForget->setCheckable(true); 0258 actExecCollectSeparate->setCheckable(true); 0259 actExecCollectTogether->setCheckable(true); 0260 actExecTerminalExternal->setCheckable(true); 0261 actExecTerminalEmbedded->setCheckable(true); 0262 auto *actionGroup = new QActionGroup(krusaderApp); 0263 actionGroup->setExclusive(true); 0264 actionGroup->addAction(actExecStartAndForget); 0265 actionGroup->addAction(actExecCollectSeparate); 0266 actionGroup->addAction(actExecCollectTogether); 0267 actionGroup->addAction(actExecTerminalExternal); 0268 actionGroup->addAction(actExecTerminalEmbedded); 0269 if (cmdExecMode < (int)(sizeof(execTypeArray) / sizeof(QAction **)) - 1) 0270 (*execTypeArray[cmdExecMode])->setChecked(true); 0271 0272 NEW_KACTION(actHomeTerminal, i18n("Start &Terminal"), "utilities-terminal", 0, SLOTS, SLOT(homeTerminal()), "terminal@home"); 0273 0274 actMountMan = krMtMan.action(); 0275 krusaderApp->actionCollection()->addAction("mountman", actMountMan); 0276 krusaderApp->actionCollection()->setDefaultShortcut(actMountMan, Qt::ALT + Qt::Key_Slash); 0277 0278 NEW_KACTION(actFind, i18n("&Search..."), "system-search", Qt::CTRL + Qt::Key_S, SLOTS, SLOT(search()), "find"); 0279 NEW_KACTION(actLocate, i18n("&Locate..."), "edit-find", Qt::SHIFT + Qt::CTRL + Qt::Key_L, SLOTS, SLOT(locate()), "locate"); 0280 #ifdef SYNCHRONIZER_ENABLED 0281 NEW_KACTION(actSyncDirs, i18n("Synchronize Fol&ders..."), "folder-sync", Qt::CTRL + Qt::Key_Y, SLOTS, SLOT(slotSynchronizeDirs()), "sync dirs"); 0282 #endif 0283 NEW_KACTION(actDiskUsage, i18n("D&isk Usage..."), "kr_diskusage", Qt::ALT + Qt::SHIFT + Qt::Key_S, SLOTS, SLOT(slotDiskUsage()), "disk usage"); 0284 NEW_KACTION(actKonfigurator, 0285 i18n("Configure &Krusader..."), 0286 "configure", 0287 KStandardShortcut::shortcut(KStandardShortcut::Preferences), 0288 SLOTS, 0289 SLOT(startKonfigurator()), 0290 "konfigurator"); 0291 NEW_KACTION(actSavePosition, i18n("Save &Position"), nullptr, 0, krusaderApp, SLOT(savePosition()), "save position"); 0292 NEW_KACTION(actCompare, i18n("Compare b&y Content..."), "kr_comparedirs", 0, SLOTS, SLOT(compareContent()), "compare"); 0293 NEW_KACTION(actMultiRename, i18n("Multi &Rename..."), "edit-rename", Qt::SHIFT + Qt::Key_F2, SLOTS, SLOT(multiRename()), "multirename"); 0294 0295 NEW_KACTION(actAddBookmark, i18n("Add Bookmark"), "bookmark-new", KStandardShortcut::addBookmark(), SLOTS, SLOT(addBookmark()), "add bookmark"); 0296 NEW_KACTION(actVerticalMode, 0297 i18n("Vertical Mode"), 0298 "view-split-top-bottom", 0299 Qt::ALT + Qt::CTRL + Qt::Key_R, 0300 MAIN_VIEW, 0301 SLOT(toggleVerticalMode()), 0302 "toggle vertical mode"); 0303 actUserMenu = new KActionMenu(i18n("User&actions"), krusaderApp); 0304 krusaderApp->actionCollection()->addAction("useractionmenu", actUserMenu); 0305 NEW_KACTION(actManageUseractions, i18n("Manage User Actions..."), nullptr, 0, SLOTS, SLOT(manageUseractions()), "manage useractions"); 0306 0307 actRemoteEncoding = new KrRemoteEncodingMenu(i18n("Select Remote Charset"), "character-set", krusaderApp->actionCollection()); 0308 0309 actClosedTabsMenu = new RecentlyClosedTabsMenu(i18n("Recently Closed Tabs"), "edit-undo", krusaderApp->actionCollection()); 0310 actClosedTabsMenu->setEnabled(false); 0311 0312 NEW_KACTION(actF10Quit, i18n("Quit"), nullptr, Qt::Key_F10, krusaderApp, SLOT(quit()), "F10_Quit"); 0313 actF10Quit->setToolTip(i18n("Quit Krusader.")); 0314 0315 NEW_KACTION(actPopularUrls, i18n("Popular URLs..."), nullptr, Qt::CTRL + Qt::Key_Z, krusaderApp->popularUrls(), SLOT(showDialog()), "Popular_Urls"); 0316 NEW_KACTION(actSwitchFullScreenTE, 0317 i18n("Toggle Fullscreen Embedded Terminal"), 0318 nullptr, 0319 Qt::CTRL + Qt::ALT + Qt::Key_F, 0320 MAIN_VIEW, 0321 SLOT(toggleFullScreenTerminalEmulator()), 0322 "switch_fullscreen_te"); 0323 0324 NEW_KACTION(tmp, i18n("Move Focus Up"), nullptr, Qt::CTRL + Qt::SHIFT + Qt::Key_Up, MAIN_VIEW, SLOT(focusUp()), "move_focus_up"); 0325 NEW_KACTION(tmp, i18n("Move Focus Down"), nullptr, Qt::CTRL + Qt::SHIFT + Qt::Key_Down, MAIN_VIEW, SLOT(focusDown()), "move_focus_down"); 0326 0327 // job manager actions 0328 actJobControl = krJobMan->controlAction(); 0329 krusaderApp->actionCollection()->addAction("job control", actJobControl); 0330 krusaderApp->actionCollection()->setDefaultShortcut(actJobControl, Qt::CTRL + Qt::ALT + Qt::Key_P); 0331 actJobProgress = krJobMan->progressAction(); 0332 krusaderApp->actionCollection()->addAction("job progress", actJobProgress); 0333 actJobMode = krJobMan->modeAction(); 0334 krusaderApp->actionCollection()->addAction("job mode", actJobMode); 0335 actJobUndo = krJobMan->undoAction(); 0336 krusaderApp->actionCollection()->addAction("job undo", actJobUndo); 0337 krusaderApp->actionCollection()->setDefaultShortcut(actJobUndo, Qt::CTRL + Qt::ALT + Qt::Key_Z); 0338 0339 // and at last we can set the tool-tips 0340 actKonfigurator->setToolTip(i18n("Setup Krusader the way you like it")); 0341 actFind->setToolTip(i18n("Search for files")); 0342 0343 // setup all UserActions 0344 krUserAction = new UserAction(); 0345 }