Merge pull request #16 from theparanoids/js-context-menu-for-table

Add Context menu to evidence table
main
Joel Smith 2020-07-02 12:54:00 -07:00 committed by GitHub
commit 7c37a8b539
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 65 deletions

View File

@ -34,22 +34,22 @@ enum ColumnIndexes {
EvidenceManager::EvidenceManager(DatabaseConnection* db, QWidget* parent)
: QDialog(parent), ui(new Ui::EvidenceManager) {
ui->setupUi(this);
this->db = db;
this->evidenceIDForRequest = 0; // initializing to remove clang-tidy warning
evidenceEditor = new EvidenceEditor(db, this);
filterForm = new EvidenceFilterForm(this);
submitButton =
new LoadingButton(ui->submitEvidenceButton->text(), this, ui->submitEvidenceButton);
evidenceTableContextMenu = new QMenu(this);
submitEvidenceAction = new QAction("Submit Evidence", evidenceTableContextMenu);
evidenceTableContextMenu->addAction(submitEvidenceAction);
deleteEvidenceAction = new QAction("Delete Evidence", evidenceTableContextMenu);
evidenceTableContextMenu->addAction(deleteEvidenceAction);
ui->evidenceTable->setContextMenuPolicy(Qt::CustomContextMenu);
// Replace the _evidenceEditorPlaceholder with a proper editor
UiHelpers::replacePlaceholder(ui->_evidenceEditorPlaceholder, evidenceEditor, ui->gridLayout);
evidenceEditor->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
UiHelpers::replacePlaceholder(ui->submitEvidenceButton, submitButton, ui->gridLayout);
ui->submitEvidenceButton->setVisible(false);
ui->gridLayout->removeWidget(ui->submitEvidenceButton);
wireUi();
}
@ -57,7 +57,9 @@ EvidenceManager::~EvidenceManager() {
delete ui;
delete evidenceEditor;
delete filterForm;
delete submitButton;
delete submitEvidenceAction;
delete deleteEvidenceAction;
delete evidenceTableContextMenu;
stopReply(&uploadAssetReply);
}
@ -72,10 +74,10 @@ void EvidenceManager::showEvent(QShowEvent* evt) {
}
void EvidenceManager::wireUi() {
// remap events to shorten the connect lines
auto btnClicked = &QPushButton::clicked;
connect(submitButton, btnClicked, this, &EvidenceManager::submitEvidenceButtonClicked);
connect(ui->deleteEvidenceButton, btnClicked, this,
&EvidenceManager::deleteEvidenceButtonClicked);
auto actionTriggered = &QAction::triggered;
connect(ui->applyFilterButton, btnClicked, this, &EvidenceManager::applyFilterButtonClicked);
connect(ui->resetFilterButton, btnClicked, this, &EvidenceManager::resetFilterButtonClicked);
connect(ui->editFiltersButton, btnClicked, this, &EvidenceManager::openFiltersMenu);
@ -83,14 +85,16 @@ void EvidenceManager::wireUi() {
&EvidenceManager::applyFilterButtonClicked);
connect(filterForm, &EvidenceFilterForm::evidenceSet, this, &EvidenceManager::applyFilterForm);
connect(ui->evidenceTable, &QTableWidget::currentCellChanged, this,
&EvidenceManager::onRowChanged);
connect(ui->evidenceTable, &QTableWidget::currentCellChanged, this, &EvidenceManager::onRowChanged);
connect(ui->evidenceTable, &QTableWidget::customContextMenuRequested, this,
&EvidenceManager::openTableContextMenu);
connect(submitEvidenceAction, actionTriggered, this, &EvidenceManager::submitEvidenceTriggered);
connect(deleteEvidenceAction, actionTriggered, this, &EvidenceManager::deleteEvidenceTriggered);
connect(this, &EvidenceManager::evidenceChanged, evidenceEditor, &EvidenceEditor::updateEvidence);
}
void EvidenceManager::submitEvidenceButtonClicked() {
submitButton->startAnimation();
setActionButtonsEnabled(false);
void EvidenceManager::submitEvidenceTriggered() {
if (saveData()) {
evidenceIDForRequest = selectedRowEvidenceID();
try {
@ -105,7 +109,7 @@ void EvidenceManager::submitEvidenceButtonClicked() {
}
}
void EvidenceManager::deleteEvidenceButtonClicked() {
void EvidenceManager::deleteEvidenceTriggered() {
auto reply = QMessageBox::question(this, "Discard Evidence",
"Are you sure you want to discard this evidence? This will "
"only delete this evidence on your computer.",
@ -131,6 +135,10 @@ void EvidenceManager::deleteEvidenceButtonClicked() {
}
}
void EvidenceManager::openTableContextMenu(QPoint pos) {
evidenceTableContextMenu->popup(ui->evidenceTable->viewport()->mapToGlobal(pos));
}
void EvidenceManager::applyFilterButtonClicked() { loadEvidence(); }
void EvidenceManager::resetFilterButtonClicked() {
@ -146,7 +154,6 @@ void EvidenceManager::applyFilterForm(const EvidenceFilters& filter) {
}
void EvidenceManager::loadEvidence() {
enableEvidenceButtons(false);
ui->evidenceTable->clearContents();
try {
@ -238,15 +245,6 @@ void EvidenceManager::refreshRow(int row) {
}
}
void EvidenceManager::setActionButtonsEnabled(bool enabled) {
enableEvidenceButtons(enabled);
}
void EvidenceManager::enableEvidenceButtons(bool enabled) {
submitButton->setEnabled(enabled);
ui->deleteEvidenceButton->setEnabled(enabled);
}
bool EvidenceManager::saveData() {
auto saveResponse = evidenceEditor->saveEvidence();
if (saveResponse.actionSucceeded) {
@ -273,16 +271,14 @@ void EvidenceManager::onRowChanged(int currentRow, int _currentColumn, int _prev
Q_UNUSED(_previousColumn);
if (currentRow == -1) {
enableEvidenceButtons(false);
emit evidenceChanged(-1, true);
return;
}
auto evidence = db->getEvidenceDetails(selectedRowEvidenceID());
enableEvidenceButtons(true);
auto readonly = evidence.uploadDate.isValid();
submitButton->setEnabled(!readonly);
submitEvidenceAction->setEnabled(!readonly);
emit evidenceChanged(evidence.id, true);
}
@ -319,8 +315,6 @@ void EvidenceManager::onUploadComplete() {
// we don't actually need anything from the uploadAssets reply, so just clean it up.
// one thing we might want to record: evidence uuid... not sure why we'd need it though.
submitButton->stopAnimation();
tidyReply(&uploadAssetReply);
}

View File

@ -7,6 +7,8 @@
#include <QDialog>
#include <QNetworkReply>
#include <QTableWidgetItem>
#include <QAction>
#include <QMenu>
#include "components/evidence_editor/evidenceeditor.h"
#include "components/loading_button/loadingbutton.h"
@ -46,23 +48,24 @@ class EvidenceManager : public QDialog {
void closeEvent(QCloseEvent* event) override;
private:
/// buildUi constructs the window structure.
void buildUi();
/// wireUi connects UI elements together
void wireUi();
/// openTableContextMenu opens a context menu over the evidenceTable when right-clicking
void openTableContextMenu(QPoint pos);
/// saveData stores any edits in evidence view. Deprecated (edits no longer available)
bool saveData();
/// loadEvidence retrieves data from the database and renders the evidence table
void loadEvidence();
/// setActionButtonsEnabled enables the delete/submit ui buttons
void setActionButtonsEnabled(bool enabled);
/// buildBaseEvidenceRow constructs a basic evidence row (fields and formatting, no data applied)
EvidenceRow buildBaseEvidenceRow(qint64 evidenceID);
/// refreshRow updates the indicated row (0-based) with updated (database) data.
void refreshRow(int row);
/// setRowText writes data the indicated row (0-based) based on the given model
void setRowText(int row, const model::Evidence& model);
///enableEvidenceButtons enables the delete/submit ui buttons
void enableEvidenceButtons(bool enable);
/// showEvent extends QDialog's showEvent. Resets the applied filters.
void showEvent(QShowEvent* evt) override;
@ -78,10 +81,10 @@ class EvidenceManager : public QDialog {
void evidenceChanged(quint64 evidenceID, bool readonly);
private slots:
/// submitEvidenceButtonClicked recieves the submit button clicked event
void submitEvidenceButtonClicked();
/// deleteEvidenceButtonClicked recieves the delete button clicked event
void deleteEvidenceButtonClicked();
/// submitEvidenceTriggered recieves the triggered event from the submit action
void submitEvidenceTriggered();
/// deleteEvidenceTriggered recieves the triggered event from the delete action
void deleteEvidenceTriggered();
/// applyFilterButtonClicked recieves the apply filter button clicked event
void applyFilterButtonClicked();
/// resetFilterButtonClicked recieves the reset filter button clicked event
@ -104,13 +107,16 @@ class EvidenceManager : public QDialog {
DatabaseConnection* db;
QNetworkReply* uploadAssetReply = nullptr;
qint64 evidenceIDForRequest;
qint64 evidenceIDForRequest = 0;
// Subwindows
EvidenceFilterForm* filterForm = nullptr;
QMenu* evidenceTableContextMenu = nullptr;
QAction* submitEvidenceAction = nullptr;
QAction* deleteEvidenceAction = nullptr;
// UI Elements
EvidenceEditor* evidenceEditor;
EvidenceFilterForm* filterForm;
LoadingButton* submitButton;
};
#endif // EVIDENCEMANAGER_H

View File

@ -39,16 +39,6 @@
</property>
</spacer>
</item>
<item row="5" column="1">
<widget class="QPushButton" name="deleteEvidenceButton">
<property name="text">
<string>Delete</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="1" colspan="5">
<widget class="QLabel" name="_evidenceEditorPlaceholder">
<property name="sizePolicy">
@ -177,16 +167,6 @@
</column>
</widget>
</item>
<item row="5" column="5">
<widget class="QPushButton" name="submitEvidenceButton">
<property name="text">
<string>Submit</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>