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 }