/**
* This file is part of GpgFrontend.
*
* GpgFrontend is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Foobar is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Foobar. If not, see .
*
* The initial version of the source code is inherited from gpg4usb-team.
* Their source code version also complies with GNU General Public License.
*
* The source code version of this software was modified and released
* by Saturneric starting on May 12, 2021.
*
*/
#include "MainWindow.h"
namespace GpgFrontend::UI {
void MainWindow::createActions() {
/* Main Menu
*/
newTabAct = new QAction(_("New"), this);
newTabAct->setIcon(QIcon(":misc_doc.png"));
QList newTabActShortcutList;
newTabActShortcutList.append(QKeySequence(Qt::CTRL + Qt::Key_N));
newTabActShortcutList.append(QKeySequence(Qt::CTRL + Qt::Key_T));
newTabAct->setShortcuts(newTabActShortcutList);
newTabAct->setToolTip(_("Open a new file"));
connect(newTabAct, SIGNAL(triggered()), edit, SLOT(slotNewTab()));
openAct = new QAction(_("Open..."), this);
openAct->setIcon(QIcon(":fileopen.png"));
openAct->setShortcut(QKeySequence::Open);
openAct->setToolTip(_("Open an existing file"));
connect(openAct, SIGNAL(triggered()), edit, SLOT(slotOpen()));
browserAct = new QAction(_("Browser"), this);
browserAct->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_B));
browserAct->setToolTip(_("Open a file browser"));
connect(browserAct, SIGNAL(triggered()), this, SLOT(slotOpenFileTab()));
saveAct = new QAction(_("Save"), this);
saveAct->setIcon(QIcon(":filesave.png"));
saveAct->setShortcut(QKeySequence::Save);
saveAct->setToolTip(_("Save the current File"));
connect(saveAct, SIGNAL(triggered()), edit, SLOT(slotSave()));
saveAsAct = new QAction(QString(_("Save As")) + "...", this);
saveAsAct->setIcon(QIcon(":filesaveas.png"));
saveAsAct->setShortcut(QKeySequence::SaveAs);
saveAsAct->setToolTip(_("Save the current File as..."));
connect(saveAsAct, SIGNAL(triggered()), edit, SLOT(slotSaveAs()));
printAct = new QAction(_("Print"), this);
printAct->setIcon(QIcon(":fileprint.png"));
printAct->setShortcut(QKeySequence::Print);
printAct->setToolTip(_("Print Document"));
connect(printAct, SIGNAL(triggered()), edit, SLOT(slotPrint()));
closeTabAct = new QAction(_("Close"), this);
closeTabAct->setShortcut(QKeySequence::Close);
closeTabAct->setToolTip(_("Close file"));
connect(closeTabAct, SIGNAL(triggered()), edit, SLOT(slotCloseTab()));
quitAct = new QAction(_("Quit"), this);
quitAct->setShortcut(QKeySequence::Quit);
quitAct->setIcon(QIcon(":exit.png"));
quitAct->setToolTip(_("Quit Program"));
connect(quitAct, SIGNAL(triggered()), this, SLOT(close()));
/* Edit Menu
*/
undoAct = new QAction(_("Undo"), this);
undoAct->setShortcut(QKeySequence::Undo);
undoAct->setToolTip(_("Undo Last Edit Action"));
connect(undoAct, SIGNAL(triggered()), edit, SLOT(slotUndo()));
redoAct = new QAction(_("Redo"), this);
redoAct->setShortcut(QKeySequence::Redo);
redoAct->setToolTip(_("Redo Last Edit Action"));
connect(redoAct, SIGNAL(triggered()), edit, SLOT(slotRedo()));
zoomInAct = new QAction(_("Zoom In"), this);
zoomInAct->setShortcut(QKeySequence::ZoomIn);
connect(zoomInAct, SIGNAL(triggered()), edit, SLOT(slotZoomIn()));
zoomOutAct = new QAction(_("Zoom Out"), this);
zoomOutAct->setShortcut(QKeySequence::ZoomOut);
connect(zoomOutAct, SIGNAL(triggered()), edit, SLOT(slotZoomOut()));
pasteAct = new QAction(_("Paste"), this);
pasteAct->setIcon(QIcon(":button_paste.png"));
pasteAct->setShortcut(QKeySequence::Paste);
pasteAct->setToolTip(_("Paste Text From Clipboard"));
connect(pasteAct, SIGNAL(triggered()), edit, SLOT(slotPaste()));
cutAct = new QAction(_("Cut"), this);
cutAct->setIcon(QIcon(":button_cut.png"));
cutAct->setShortcut(QKeySequence::Cut);
cutAct->setToolTip(
_("Cut the current selection's contents to the "
"clipboard"));
connect(cutAct, SIGNAL(triggered()), edit, SLOT(slotCut()));
copyAct = new QAction(_("Copy"), this);
copyAct->setIcon(QIcon(":button_copy.png"));
copyAct->setShortcut(QKeySequence::Copy);
copyAct->setToolTip(
_("Copy the current selection's contents to the "
"clipboard"));
connect(copyAct, SIGNAL(triggered()), edit, SLOT(slotCopy()));
quoteAct = new QAction(_("Quote"), this);
quoteAct->setIcon(QIcon(":quote.png"));
quoteAct->setToolTip(_("Quote whole text"));
connect(quoteAct, SIGNAL(triggered()), edit, SLOT(slotQuote()));
selectAllAct = new QAction(_("Select All"), this);
selectAllAct->setIcon(QIcon(":edit.png"));
selectAllAct->setShortcut(QKeySequence::SelectAll);
selectAllAct->setToolTip(_("Select the whole text"));
connect(selectAllAct, SIGNAL(triggered()), edit, SLOT(slotSelectAll()));
findAct = new QAction(_("Find"), this);
findAct->setShortcut(QKeySequence::Find);
findAct->setToolTip(_("Find a word"));
connect(findAct, SIGNAL(triggered()), this, SLOT(slotFind()));
cleanDoubleLinebreaksAct = new QAction(_("Remove spacing"), this);
cleanDoubleLinebreaksAct->setIcon(QIcon(":format-line-spacing-triple.png"));
// cleanDoubleLineBreaksAct->setShortcut(QKeySequence::SelectAll);
cleanDoubleLinebreaksAct->setToolTip(
_("Remove double linebreaks, e.g. in pasted text from Web Mailer"));
connect(cleanDoubleLinebreaksAct, SIGNAL(triggered()), this,
SLOT(slotCleanDoubleLinebreaks()));
openSettingsAct = new QAction(_("Settings"), this);
openSettingsAct->setToolTip(_("Open settings dialog"));
openSettingsAct->setShortcut(QKeySequence::Preferences);
connect(openSettingsAct, SIGNAL(triggered()), this,
SLOT(slotOpenSettingsDialog()));
/* Crypt Menu
*/
encryptAct = new QAction(_("Encrypt"), this);
encryptAct->setIcon(QIcon(":encrypted.png"));
encryptAct->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_E));
encryptAct->setToolTip(_("Encrypt Message"));
connect(encryptAct, SIGNAL(triggered()), this, SLOT(slotEncrypt()));
encryptSignAct = new QAction(_("Encrypt Sign"), this);
encryptSignAct->setIcon(QIcon(":encrypted_signed.png"));
encryptSignAct->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_E));
encryptSignAct->setToolTip(_("Encrypt and Sign Message"));
connect(encryptSignAct, SIGNAL(triggered()), this, SLOT(slotEncryptSign()));
decryptAct = new QAction(_("Decrypt"), this);
decryptAct->setIcon(QIcon(":decrypted.png"));
decryptAct->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_D));
decryptAct->setToolTip(_("Decrypt Message"));
connect(decryptAct, SIGNAL(triggered()), this, SLOT(slotDecrypt()));
decryptVerifyAct = new QAction(_("Decrypt Verify"), this);
decryptVerifyAct->setIcon(QIcon(":decrypted_verified.png"));
decryptVerifyAct->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_D));
decryptVerifyAct->setToolTip(_("Decrypt and Verify Message"));
connect(decryptVerifyAct, SIGNAL(triggered()), this,
SLOT(slotDecryptVerify()));
/*
* File encryption submenu
*/
fileEncryptAct = new QAction(_("Encrypt File"), this);
fileEncryptAct->setToolTip(_("Encrypt File"));
connect(fileEncryptAct, SIGNAL(triggered()), this,
SLOT(slotFileEncryptCustom()));
fileDecryptAct = new QAction(_("Decrypt File"), this);
fileDecryptAct->setToolTip(_("Decrypt File"));
connect(fileDecryptAct, SIGNAL(triggered()), this,
SLOT(slotFileDecryptCustom()));
fileSignAct = new QAction(_("Sign File"), this);
fileSignAct->setToolTip(_("Sign File"));
connect(fileSignAct, SIGNAL(triggered()), this, SLOT(slotFileSignCustom()));
fileVerifyAct = new QAction(_("Verify File"), this);
fileVerifyAct->setToolTip(_("Verify File"));
connect(fileVerifyAct, SIGNAL(triggered()), this,
SLOT(slotFileVerifyCustom()));
signAct = new QAction(_("Sign"), this);
signAct->setIcon(QIcon(":signature.png"));
signAct->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_I));
signAct->setToolTip(_("Sign Message"));
connect(signAct, SIGNAL(triggered()), this, SLOT(slotSign()));
verifyAct = new QAction(_("Verify"), this);
verifyAct->setIcon(QIcon(":verify.png"));
verifyAct->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_V));
verifyAct->setToolTip(_("Verify Message"));
connect(verifyAct, SIGNAL(triggered()), this, SLOT(slotVerify()));
/* Key Menu
*/
importKeyFromEditAct = new QAction(_("Editor"), this);
importKeyFromEditAct->setIcon(QIcon(":txt.png"));
importKeyFromEditAct->setToolTip(_("Import New Key From Editor"));
connect(importKeyFromEditAct, SIGNAL(triggered()), this,
SLOT(slotImportKeyFromEdit()));
openKeyManagementAct = new QAction(_("Manage Keys"), this);
openKeyManagementAct->setIcon(QIcon(":keymgmt.png"));
openKeyManagementAct->setToolTip(_("Open Key Management"));
connect(openKeyManagementAct, SIGNAL(triggered()), this,
SLOT(slotOpenKeyManagement()));
/*
* About Menu
*/
aboutAct = new QAction(_("About"), this);
aboutAct->setIcon(QIcon(":help.png"));
aboutAct->setToolTip(_("Show the application's About box"));
connect(aboutAct, SIGNAL(triggered()), this, SLOT(slotAbout()));
/*
* Check Update Menu
*/
checkUpdateAct = new QAction(_("Check for Updates"), this);
checkUpdateAct->setIcon(QIcon(":help.png"));
checkUpdateAct->setToolTip(_("Check for updates"));
connect(checkUpdateAct, SIGNAL(triggered()), this, SLOT(slotCheckUpdate()));
startWizardAct = new QAction(_("Open Wizard"), this);
startWizardAct->setToolTip(_("Open the wizard"));
connect(startWizardAct, SIGNAL(triggered()), this, SLOT(slotStartWizard()));
/* Popup-Menu-Action for KeyList
*/
appendSelectedKeysAct =
new QAction(_("Append Selected Key(s) To Text"), this);
appendSelectedKeysAct->setToolTip(
_("Append The Selected Keys To Text in Editor"));
connect(appendSelectedKeysAct, SIGNAL(triggered()), this,
SLOT(slotAppendSelectedKeys()));
copyMailAddressToClipboardAct = new QAction(_("Copy Email"), this);
copyMailAddressToClipboardAct->setToolTip(
_("Copy selected Email to clipboard"));
connect(copyMailAddressToClipboardAct, SIGNAL(triggered()), this,
SLOT(slotCopyMailAddressToClipboard()));
// TODO: find central place for shared actions, to avoid code-duplication with
// keymgmt.cpp
showKeyDetailsAct = new QAction(_("Show Key Details"), this);
showKeyDetailsAct->setToolTip(_("Show Details for this Key"));
connect(showKeyDetailsAct, SIGNAL(triggered()), this,
SLOT(slotShowKeyDetails()));
refreshKeysFromKeyserverAct =
new QAction(_("Refresh Key From Key Server"), this);
refreshKeysFromKeyserverAct->setToolTip(
_("Refresh key from default key server"));
connect(refreshKeysFromKeyserverAct, SIGNAL(triggered()), this,
SLOT(refreshKeysFromKeyserver()));
uploadKeyToServerAct = new QAction(_("Upload Public Key(s) To Server"), this);
uploadKeyToServerAct->setToolTip(
_("Upload The Selected Public Keys To Server"));
connect(uploadKeyToServerAct, SIGNAL(triggered()), this,
SLOT(uploadKeyToServer()));
/* Key-Shortcuts for Tab-Switchung-Action
*/
switchTabUpAct = new QAction(this);
switchTabUpAct->setShortcut(QKeySequence::NextChild);
connect(switchTabUpAct, SIGNAL(triggered()), edit, SLOT(slotSwitchTabUp()));
this->addAction(switchTabUpAct);
switchTabDownAct = new QAction(this);
switchTabDownAct->setShortcut(QKeySequence::PreviousChild);
connect(switchTabDownAct, SIGNAL(triggered()), edit,
SLOT(slotSwitchTabDown()));
this->addAction(switchTabDownAct);
cutPgpHeaderAct = new QAction(_("Remove PGP Header"), this);
connect(cutPgpHeaderAct, SIGNAL(triggered()), this, SLOT(slotCutPgpHeader()));
addPgpHeaderAct = new QAction(_("Add PGP Header"), this);
connect(addPgpHeaderAct, SIGNAL(triggered()), this, SLOT(slotAddPgpHeader()));
}
void MainWindow::createMenus() {
fileMenu = menuBar()->addMenu(_("File"));
fileMenu->addAction(newTabAct);
fileMenu->addAction(browserAct);
fileMenu->addAction(openAct);
fileMenu->addSeparator();
fileMenu->addAction(saveAct);
fileMenu->addAction(saveAsAct);
fileMenu->addSeparator();
fileMenu->addAction(printAct);
fileMenu->addSeparator();
fileMenu->addAction(closeTabAct);
fileMenu->addAction(quitAct);
editMenu = menuBar()->addMenu(_("Edit"));
editMenu->addAction(undoAct);
editMenu->addAction(redoAct);
editMenu->addSeparator();
editMenu->addAction(zoomInAct);
editMenu->addAction(zoomOutAct);
editMenu->addSeparator();
editMenu->addAction(copyAct);
editMenu->addAction(cutAct);
editMenu->addAction(pasteAct);
editMenu->addAction(selectAllAct);
editMenu->addAction(findAct);
editMenu->addSeparator();
editMenu->addAction(quoteAct);
editMenu->addAction(cleanDoubleLinebreaksAct);
editMenu->addSeparator();
editMenu->addAction(openSettingsAct);
fileEncMenu = new QMenu(_("File..."));
fileEncMenu->addAction(fileEncryptAct);
fileEncMenu->addAction(fileDecryptAct);
fileEncMenu->addAction(fileSignAct);
fileEncMenu->addAction(fileVerifyAct);
cryptMenu = menuBar()->addMenu(_("Crypt"));
cryptMenu->addAction(encryptAct);
cryptMenu->addAction(encryptSignAct);
cryptMenu->addAction(decryptAct);
cryptMenu->addAction(decryptVerifyAct);
cryptMenu->addSeparator();
cryptMenu->addAction(signAct);
cryptMenu->addAction(verifyAct);
cryptMenu->addSeparator();
cryptMenu->addMenu(fileEncMenu);
keyMenu = menuBar()->addMenu(_("Keys"));
importKeyMenu = keyMenu->addMenu(_("Import Key"));
importKeyMenu->setIcon(QIcon(":key_import.png"));
importKeyMenu->addAction(keyMgmt->importKeyFromFileAct);
importKeyMenu->addAction(importKeyFromEditAct);
importKeyMenu->addAction(keyMgmt->importKeyFromClipboardAct);
importKeyMenu->addAction(keyMgmt->importKeyFromKeyServerAct);
importKeyMenu->addAction(keyMgmt->importKeyFromKeyServerAct);
keyMenu->addAction(openKeyManagementAct);
steganoMenu = menuBar()->addMenu(_("Steganography"));
steganoMenu->addAction(cutPgpHeaderAct);
steganoMenu->addAction(addPgpHeaderAct);
#ifdef ADVANCED_SUPPORT
// Hide menu, when steganography menu is disabled in settings
if (!settings.value("advanced/steganography").toBool()) {
this->menuBar()->removeAction(steganoMenu->menuAction());
}
#endif
viewMenu = menuBar()->addMenu(_("View"));
helpMenu = menuBar()->addMenu(_("Help"));
helpMenu->addAction(startWizardAct);
helpMenu->addSeparator();
helpMenu->addAction(checkUpdateAct);
helpMenu->addAction(aboutAct);
}
void MainWindow::createToolBars() {
fileToolBar = addToolBar(_("File"));
fileToolBar->setObjectName("fileToolBar");
fileToolBar->addAction(newTabAct);
fileToolBar->addAction(openAct);
fileToolBar->addAction(saveAct);
fileToolBar->hide();
viewMenu->addAction(fileToolBar->toggleViewAction());
cryptToolBar = addToolBar(_("Crypt"));
cryptToolBar->setObjectName("cryptToolBar");
cryptToolBar->addAction(encryptAct);
cryptToolBar->addAction(encryptSignAct);
cryptToolBar->addAction(decryptAct);
cryptToolBar->addAction(decryptVerifyAct);
cryptToolBar->addAction(signAct);
cryptToolBar->addAction(verifyAct);
viewMenu->addAction(cryptToolBar->toggleViewAction());
keyToolBar = addToolBar(_("Key"));
keyToolBar->setObjectName("keyToolBar");
keyToolBar->addAction(openKeyManagementAct);
viewMenu->addAction(keyToolBar->toggleViewAction());
editToolBar = addToolBar(_("Edit"));
editToolBar->setObjectName("editToolBar");
editToolBar->addAction(copyAct);
editToolBar->addAction(pasteAct);
editToolBar->addAction(selectAllAct);
viewMenu->addAction(editToolBar->toggleViewAction());
specialEditToolBar = addToolBar(_("Special Edit"));
specialEditToolBar->setObjectName("specialEditToolBar");
specialEditToolBar->addAction(quoteAct);
specialEditToolBar->addAction(cleanDoubleLinebreaksAct);
specialEditToolBar->hide();
viewMenu->addAction(specialEditToolBar->toggleViewAction());
// Add dropdown menu for key import to keytoolbar
importButton = new QToolButton();
importButton->setMenu(importKeyMenu);
importButton->setPopupMode(QToolButton::InstantPopup);
importButton->setIcon(QIcon(":key_import.png"));
importButton->setToolTip(_("Import key from..."));
importButton->setText(_("Import key"));
keyToolBar->addWidget(importButton);
// Add dropdown menu for file encryption/decryption to crypttoolbar
fileEncButton = new QToolButton();
connect(fileEncButton, SIGNAL(clicked(bool)), this, SLOT(slotOpenFileTab()));
fileEncButton->setPopupMode(QToolButton::InstantPopup);
fileEncButton->setIcon(QIcon(":fileencryption.png"));
fileEncButton->setToolTip(_("Browser to view and operate file"));
fileEncButton->setText(_("Browser"));
fileToolBar->addWidget(fileEncButton);
}
void MainWindow::createStatusBar() {
auto* statusBarBox = new QWidget();
auto* statusBarBoxLayout = new QHBoxLayout();
QPixmap* pixmap;
// icon which should be shown if there are files in attachments-folder
pixmap = new QPixmap(":statusbar_icon.png");
statusBarIcon = new QLabel();
statusBar()->addWidget(statusBarIcon);
statusBarIcon->setPixmap(*pixmap);
statusBar()->insertPermanentWidget(0, statusBarIcon, 0);
statusBarIcon->hide();
statusBar()->showMessage(_("Ready"), 2000);
statusBarBox->setLayout(statusBarBoxLayout);
}
void MainWindow::createDockWindows() {
/* KeyList-Dockwindow
*/
keyListDock = new QDockWidget(_("Key ToolBox"), this);
keyListDock->setObjectName("EncryptDock");
keyListDock->setAllowedAreas(Qt::LeftDockWidgetArea |
Qt::RightDockWidgetArea);
keyListDock->setMinimumWidth(460);
addDockWidget(Qt::RightDockWidgetArea, keyListDock);
keyListDock->setWidget(mKeyList);
viewMenu->addAction(keyListDock->toggleViewAction());
infoBoardDock = new QDockWidget(_("Information Board"), this);
infoBoardDock->setObjectName("Information Board");
infoBoardDock->setAllowedAreas(Qt::BottomDockWidgetArea);
addDockWidget(Qt::BottomDockWidgetArea, infoBoardDock);
infoBoardDock->setWidget(infoBoard);
infoBoardDock->widget()->layout()->setContentsMargins(0, 0, 0, 0);
viewMenu->addAction(infoBoardDock->toggleViewAction());
}
} // namespace GpgFrontend::UI