diff options
Diffstat (limited to 'src/ui/widgets/FilePage.cpp')
-rw-r--r-- | src/ui/widgets/FilePage.cpp | 165 |
1 files changed, 157 insertions, 8 deletions
diff --git a/src/ui/widgets/FilePage.cpp b/src/ui/widgets/FilePage.cpp index e3d73670..91299f7f 100644 --- a/src/ui/widgets/FilePage.cpp +++ b/src/ui/widgets/FilePage.cpp @@ -24,35 +24,65 @@ #include "ui/widgets/FilePage.h" +#include "MainWindow.h" + FilePage::FilePage(QWidget *parent) : QWidget(parent) { + + qDebug() << "First Parent" << parent; + firstParent = parent; + qDebug() << "New File Page"; dirModel = new QFileSystemModel(); - dirModel->setRootPath(QDir::currentPath()); dirTreeView = new QTreeView(); dirTreeView->setModel(dirModel); dirTreeView->setAnimated(true); dirTreeView->setIndentation(20); - dirTreeView->setSortingEnabled(true); dirTreeView->setRootIndex(dirModel->index(QDir::currentPath())); + dirTreeView->setContextMenuPolicy(Qt::CustomContextMenu); + mPath = dirModel->rootPath(); + + createPopupMenu(); - upLevelButton = new QPushButton("UP Level"); + upLevelButton = new QPushButton("<"); connect(upLevelButton, SIGNAL(clicked(bool)), this, SLOT(slotUpLevel())); + refreshButton = new QPushButton("Refresh"); + connect(refreshButton, SIGNAL(clicked(bool)), this, SLOT(slotGoPath())); + + goPathButton = new QPushButton("Go"); + connect(goPathButton, SIGNAL(clicked(bool)), this, SLOT(slotGoPath())); + + pathEdit = new QLineEdit(); + pathEdit->setText(dirModel->rootPath()); + auto *menuLayout = new QHBoxLayout(); menuLayout->addWidget(upLevelButton); - menuLayout->addStretch(0); + menuLayout->setStretchFactor(upLevelButton, 1); + menuLayout->addWidget(pathEdit); + menuLayout->setStretchFactor(pathEdit, 8); + menuLayout->addWidget(goPathButton); + menuLayout->setStretchFactor(goPathButton, 1); + // menuLayout->addWidget(refreshButton); + // menuLayout->setStretchFactor(refreshButton, 1); auto *layout = new QVBoxLayout(); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); layout->addLayout(menuLayout); + layout->setStretchFactor(menuLayout, 1); layout->addWidget(dirTreeView); + layout->setStretchFactor(dirTreeView, 8); this->setLayout(layout); connect(dirTreeView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(fileTreeViewItemClicked(const QModelIndex &))); connect(dirTreeView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(fileTreeViewItemDoubleClicked(const QModelIndex &))); + connect(dirTreeView, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onCustomContextMenu(const QPoint &))); + + emit pathChanged(mPath); } @@ -63,12 +93,14 @@ void FilePage::fileTreeViewItemClicked(const QModelIndex &index) { void FilePage::slotUpLevel() { QModelIndex currentRoot = dirTreeView->rootIndex(); - mPath = dirModel->fileInfo(currentRoot).absoluteFilePath(); + mPath = dirModel->fileInfo(currentRoot.parent()).absoluteFilePath(); auto fileInfo = QFileInfo(mPath); if(fileInfo.isDir() && fileInfo.isReadable() && fileInfo.isExecutable()) { dirTreeView->setRootIndex(currentRoot.parent()); + pathEdit->setText(mPath); } qDebug() << "Current Root mPath" << mPath; + emit pathChanged(mPath); } void FilePage::fileTreeViewItemDoubleClicked(const QModelIndex &index) { @@ -76,13 +108,130 @@ void FilePage::fileTreeViewItemDoubleClicked(const QModelIndex &index) { auto fileInfo = QFileInfo(mPath); if(fileInfo.isDir() && fileInfo.isReadable() && fileInfo.isExecutable()) { dirTreeView->setRootIndex(index); + pathEdit->setText(mPath); } qDebug() << "Index mPath" << mPath; + emit pathChanged(mPath); +} + +QString FilePage::getSelected() const { + return mPath; } -void FilePage::getSelected(QString &path) { +void FilePage::slotGoPath() { + qDebug() << "getSelected" << pathEdit->text(); + auto fileInfo = QFileInfo(pathEdit->text()); + if(fileInfo.isDir() && fileInfo.isReadable() && fileInfo.isExecutable()) { + mPath = fileInfo.filePath(); + qDebug() << "Set Path" << mPath; + dirTreeView->setRootIndex(dirModel->index(fileInfo.filePath())); + } else { + QMessageBox::critical(this, "Error", "The path is unprivileged or unreachable."); + } + emit pathChanged(mPath); +} + +void FilePage::createPopupMenu() { + popUpMenu = new QMenu(); + + auto openItemAct = new QAction(tr("Open"), this); + connect(openItemAct, SIGNAL(triggered()), this, SLOT(slotOpenItem())); + auto deleteItemAct = new QAction(tr("Delete"), this); + connect(deleteItemAct, SIGNAL(triggered()), this, SLOT(slotDeleteItem())); + encryptItemAct = new QAction(tr("Encrypt and Sign"), this); + connect(encryptItemAct, SIGNAL(triggered()), this, SLOT(slotEncryptItem())); + decryptItemAct = new QAction(tr("Decrypt and Verify"), this); + connect(decryptItemAct, SIGNAL(triggered()), this, SLOT(slotDecryptItem())); + signItemAct = new QAction(tr("Only Sign"), this); + connect(signItemAct, SIGNAL(triggered()), this, SLOT(slotSignItem())); + verifyItemAct = new QAction(tr("Only Verify"), this); + connect(verifyItemAct, SIGNAL(triggered()), this, SLOT(slotVerifyItem())); + + popUpMenu->addAction(openItemAct); + popUpMenu->addAction(deleteItemAct); + popUpMenu->addSeparator(); + popUpMenu->addAction(encryptItemAct); + popUpMenu->addAction(decryptItemAct); + popUpMenu->addAction(signItemAct); + popUpMenu->addAction(verifyItemAct); + +} + +void FilePage::onCustomContextMenu(const QPoint &point) { + QModelIndex index = dirTreeView->indexAt(point); + mPath = dirModel->fileInfo(index).absoluteFilePath(); + qDebug() << "Right Click" << mPath; + if (index.isValid()) { + QFileInfo info(mPath); + encryptItemAct->setEnabled(info.isFile() && (info.suffix() != "gpg" && info.suffix() != "sig")); + decryptItemAct->setEnabled(info.isFile() && info.suffix() == "gpg"); + signItemAct->setEnabled(info.isFile() && (info.suffix() != "gpg" && info.suffix() != "sig")); + verifyItemAct->setEnabled(info.isFile() && (info.suffix() == "sig" || info.suffix() == "gpg")); + + popUpMenu->exec(dirTreeView->viewport()->mapToGlobal(point)); + } +} + +void FilePage::slotOpenItem() { + QFileInfo info(mPath); + if(info.isDir()) { + qDebug() << "getSelected" << pathEdit->text(); + if(info.isReadable() && info.isExecutable()) { + qDebug() << "Set Path" << info.filePath(); + dirTreeView->setRootIndex(dirModel->index(info.filePath())); + } else { + QMessageBox::critical(this, "Error", "The path is unprivileged or unreachable."); + } + } else { + auto mainWindow = qobject_cast<MainWindow *>(firstParent); + qDebug() << "Open Item" << mPath; + if (mainWindow != nullptr) + mainWindow->slotOpenFile(mPath); + } + emit pathChanged(mPath); +} + +void FilePage::slotDeleteItem() { QModelIndex index = dirTreeView->currentIndex(); QVariant data = dirTreeView->model()->data(index); - path = data.toString(); - qDebug() << "Target Path" << mPath; + + auto ret = QMessageBox::warning(this, + tr("Warning"), + tr("Are you sure you want to delete it?"), + QMessageBox::Ok | QMessageBox::Cancel); + + if(ret == QMessageBox::Cancel) + return; + + qDebug() << "Delete Item" << data.toString(); + + if(!dirModel->remove(index)){ + QMessageBox::critical(this, + tr("Error"), + tr("Unable to delete the file or folder.")); + } +} + +void FilePage::slotEncryptItem() { + auto mainWindow = qobject_cast<MainWindow *>(firstParent); + if(mainWindow != nullptr) + mainWindow->slotFileEncryptSign(); +} + +void FilePage::slotDecryptItem() { + auto mainWindow = qobject_cast<MainWindow *>(firstParent); + if(mainWindow != nullptr) + mainWindow->slotFileDecryptVerify(); +} + +void FilePage::slotSignItem() { + auto mainWindow = qobject_cast<MainWindow *>(firstParent); + if(mainWindow != nullptr) + mainWindow->slotFileSign(); +} + +void FilePage::slotVerifyItem() { + auto mainWindow = qobject_cast<MainWindow *>(firstParent); + if(mainWindow != nullptr) + mainWindow->slotFileVerify(); } |