Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Context menu to evidence table #16

Merged
merged 1 commit into from
Jul 2, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 27 additions & 33 deletions src/forms/evidence/evidencemanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,30 +34,32 @@ 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();
}

EvidenceManager::~EvidenceManager() {
delete ui;
delete evidenceEditor;
delete filterForm;
delete submitButton;
delete submitEvidenceAction;
delete deleteEvidenceAction;
delete evidenceTableContextMenu;
stopReply(&uploadAssetReply);
}

Expand All @@ -72,25 +74,27 @@ 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);
connect(ui->filterTextBox, &QLineEdit::returnPressed, this,
&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 {
Expand All @@ -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.",
Expand All @@ -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() {
Expand All @@ -146,7 +154,6 @@ void EvidenceManager::applyFilterForm(const EvidenceFilters& filter) {
}

void EvidenceManager::loadEvidence() {
enableEvidenceButtons(false);
ui->evidenceTable->clearContents();

try {
Expand Down Expand Up @@ -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) {
Expand All @@ -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);
}

Expand Down Expand Up @@ -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);
}

Expand Down
30 changes: 18 additions & 12 deletions src/forms/evidence/evidencemanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
Expand All @@ -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
Expand All @@ -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
20 changes: 0 additions & 20 deletions src/forms/evidence/evidencemanager.ui
Original file line number Diff line number Diff line change
Expand Up @@ -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">
Expand Down Expand Up @@ -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>
Expand Down