Skip to content

Instantly share code, notes, and snippets.

@slide
Created April 14, 2020 22:58
Show Gist options
  • Save slide/b31f5122855e1b4ba144ebd888d72b4c to your computer and use it in GitHub Desktop.
Save slide/b31f5122855e1b4ba144ebd888d72b4c to your computer and use it in GitHub Desktop.
#include "testgroupwidget.h"
#include "testgroup.h"
#include <QFileDialog>
#include <QInputDialog>
#include <QMessageBox>
#include <QMenu>
TestGroupWidget::TestGroupWidget(QWidget *parent) : QTreeWidget(parent)
{
}
void TestGroupWidget::contextMenuEvent(QContextMenuEvent *event)
{
QTreeWidgetItem *item = itemAt(event->pos());
if(item != nullptr)
{
QMenu contextMenu(this);
QAction* action = nullptr;
QTreeWidgetItem* parent = item->parent();
if(item->type() == RootType) // "Test Groups" item
{
contextMenu.setTitle("Test Groups");
QAction newGroup("New Test Group...", &contextMenu);
connect(&newGroup, &QAction::triggered, [=]() {
bool ok;
QString text = QInputDialog::getText(this, tr("New Test Group"), tr("Enter the new group's name"), QLineEdit::Normal, QString(), &ok);
if(ok)
{
QTreeWidgetItem *newItem = new QTreeWidgetItem(QStringList() << text);
newItem->setIcon(0, QIcon(":/resources/images/mainwindow/test-group.png"));
topLevelItem(0)->addChild(newItem);
TestGroup *group = new TestGroup(text);
QVariant v;
v.setValue(group);
newItem->setData(0, Qt::UserRole, v);
}
});
contextMenu.addAction(&newGroup);
QAction loadGroup("Load Test Group...", &contextMenu);
connect(&loadGroup, &QAction::triggered, [=]() {
QString fileName = QFileDialog::getOpenFileName(this, tr("Load Test Group"), QString(), "Test Group Files (*.xml, *.json)");
QFile file(fileName);
if(file.exists())
{
TestGroup *group = TestGroup::read("", fileName, QUuid::createUuid());
if(group != nullptr)
{
}
}
});
contextMenu.addAction(&loadGroup);
action = &newGroup;
}
else if(item->type() == TestGroupType && item->text(0) != tr("Ungrouped")) // Ungrouped
{
contextMenu.setTitle(item->text(0));
QAction copyGroup("Copy Group...", &contextMenu);
connect(&copyGroup, &QAction::triggered, [=]() {
bool ok;
QString text = QInputDialog::getText(this, tr("Copy Group"), tr("Enter the name for the new group"), QLineEdit::Normal, QString(), &ok);
if(ok)
{
}
});
// save group as...
// unload group
// reload group
// clear group
action = &copyGroup;
}
else if(item->type() == TestType) // a single test
{
contextMenu.setTitle(item->text(0));
QAction deleteAction("Delete...", &contextMenu);
connect(&deleteAction, &QAction::triggered, [=]()
{
if(QMessageBox::question(this, tr("Are you sure?"), QString(tr("Are you sure you want to delete the test named `%1`")).arg(item->text(0))) == QMessageBox::Yes)
{
parent->removeChild(item);
delete item;
}
});
contextMenu.addAction(&deleteAction);
if(topLevelItem(0)->childCount() > 1)
{
QMenu moveTo("Move To", &contextMenu);
for(int i = 0; i < topLevelItem(0)->childCount(); i++)
{
QTreeWidgetItem* curr = topLevelItem(0)->child(i);
if(curr->text(0) != item->parent()->text(0))
{
QAction groupNameAction(curr->text(0), &moveTo);
connect(&groupNameAction, &QAction::triggered, [=]() {
parent->removeChild(item);
curr->addChild(item);
});
contextMenu.addAction(&groupNameAction);
}
}
contextMenu.addMenu(&moveTo);
}
action = &deleteAction;
}
contextMenu.exec(mapToGlobal(event->pos()), action);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment