Add Qt6 support (does not switch to Qt6) (#73)

Prepares us to move to qt6 when it is widely available for osx.
* use Qt6 constant for DataLocation
* append using QString.arg
* remove unncessary includes
* use setContentMargins over deprecated setMargin
* Use Qt constant over dep. QString version
* include missing QFile include
* return an actual orientation instead of 0
* use OR to reflect that the keys are flags
* write settings tags as QVariantList instead of vec
* Only register tag streams if pre-Qt6
* fix double #if
* no need to register TagVector -- not used anymore
* update UGlobalHotkeys submod ule
* add in missing header
main
Joel Smith 2021-02-24 16:48:07 -08:00 committed by GitHub
parent 6726afe3d1
commit 9f1e863881
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 58 additions and 65 deletions

View File

@ -4,6 +4,7 @@
#ifndef APPSETTINGS_H #ifndef APPSETTINGS_H
#define APPSETTINGS_H #define APPSETTINGS_H
#include <QSequentialIterable>
#include <QSettings> #include <QSettings>
#include <QString> #include <QString>
@ -56,11 +57,28 @@ class AppSettings : public QObject {
QString operationName() { return settings.value(opNameSetting).toString(); } QString operationName() { return settings.value(opNameSetting).toString(); }
void setLastUsedTags(std::vector<model::Tag> lastTags) { void setLastUsedTags(std::vector<model::Tag> lastTags) {
settings.setValue(lastUsedTagsSetting, QVariant::fromValue(lastTags)); QVariantList writeTags;
for (auto tag : lastTags) {
writeTags << QVariant::fromValue(tag);
}
settings.setValue(lastUsedTagsSetting, QVariant::fromValue(writeTags));
} }
std::vector<model::Tag> getLastUsedTags() { std::vector<model::Tag> getLastUsedTags() {
std::vector<model::Tag> rtn;
auto val = settings.value(lastUsedTagsSetting); auto val = settings.value(lastUsedTagsSetting);
return qvariant_cast<std::vector<model::Tag>>(val);
if (val.canConvert<QVariantList>()) {
QSequentialIterable iter = val.value<QSequentialIterable>();
for (const QVariant& item : iter) {
rtn.push_back(qvariant_cast<model::Tag>(item));
}
}
return rtn;
} }
}; };
#endif // APPSETTINGS_H #endif // APPSETTINGS_H

View File

@ -15,7 +15,7 @@ ImageView::~ImageView() {
void ImageView::buildUi() { void ImageView::buildUi() {
gridLayout = new QGridLayout(this); gridLayout = new QGridLayout(this);
gridLayout->setMargin(0); gridLayout->setContentsMargins(0, 0, 0, 0);
previewImage = new AspectRatioPixmapLabel(this); previewImage = new AspectRatioPixmapLabel(this);
previewImage->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); previewImage->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));

View File

@ -19,7 +19,7 @@ CodeBlockView::~CodeBlockView() {
void CodeBlockView::buildUi() { void CodeBlockView::buildUi() {
gridLayout = new QGridLayout(this); gridLayout = new QGridLayout(this);
gridLayout->setMargin(0); gridLayout->setContentsMargins(0, 0, 0, 0);
_languageLabel = new QLabel("Language", this); _languageLabel = new QLabel("Language", this);
_sourceLabel = new QLabel("Source", this); _sourceLabel = new QLabel("Source", this);

View File

@ -13,7 +13,7 @@ ErrorView::~ErrorView() {
void ErrorView::buildUi() { void ErrorView::buildUi() {
gridLayout = new QGridLayout(this); gridLayout = new QGridLayout(this);
gridLayout->setMargin(0); gridLayout->setContentsMargins(0, 0, 0, 0);
errorLabel = new QLabel(errorText, this); errorLabel = new QLabel(errorText, this);

View File

@ -3,6 +3,7 @@
#include "evidenceeditor.h" #include "evidenceeditor.h"
#include <QFile>
#include <vector> #include <vector>
#include "components/aspectratio_pixmap_label/imageview.h" #include "components/aspectratio_pixmap_label/imageview.h"
@ -41,7 +42,7 @@ EvidenceEditor::~EvidenceEditor() {
void EvidenceEditor::buildUi() { void EvidenceEditor::buildUi() {
gridLayout = new QGridLayout(this); gridLayout = new QGridLayout(this);
gridLayout->setMargin(0); gridLayout->setContentsMargins(0, 0, 0, 0);
splitter = new QSplitter(this); splitter = new QSplitter(this);
splitter->setOrientation(Qt::Vertical); splitter->setOrientation(Qt::Vertical);
@ -56,7 +57,7 @@ void EvidenceEditor::buildUi() {
descriptionArea->setLayout(descriptionAreaLayout); descriptionArea->setLayout(descriptionAreaLayout);
descriptionAreaLayout->addWidget(_descriptionLabel); descriptionAreaLayout->addWidget(_descriptionLabel);
descriptionAreaLayout->addWidget(descriptionTextBox); descriptionAreaLayout->addWidget(descriptionTextBox);
descriptionAreaLayout->setMargin(0); descriptionAreaLayout->setContentsMargins(0, 0, 0, 0);
// Layout // Layout
/* 0 /* 0

View File

@ -100,7 +100,7 @@ QLayoutItem *FlowLayout::takeAt(int index) {
return nullptr; return nullptr;
} }
Qt::Orientations FlowLayout::expandingDirections() const { return 0; } Qt::Orientations FlowLayout::expandingDirections() const { return {}; }
bool FlowLayout::hasHeightForWidth() const { return true; } bool FlowLayout::hasHeightForWidth() const { return true; }

View File

@ -33,7 +33,7 @@ TagEditor::~TagEditor() {
void TagEditor::buildUi() { void TagEditor::buildUi() {
gridLayout = new QGridLayout(this); gridLayout = new QGridLayout(this);
gridLayout->setMargin(0); gridLayout->setContentsMargins(0, 0, 0, 0);
couldNotCreateTagMsg = new QErrorMessage(this); couldNotCreateTagMsg = new QErrorMessage(this);

View File

@ -41,7 +41,7 @@ class TaggingLineEditEventFilter : public QObject {
if (event->type() == QEvent::KeyPress) { if (event->type() == QEvent::KeyPress) {
QKeyEvent *ke = static_cast<QKeyEvent *>(event); QKeyEvent *ke = static_cast<QKeyEvent *>(event);
if (matchesKey(ke, QKeySequence(Qt::CTRL + Qt::Key_Space))) { if (matchesKey(ke, QKeySequence(Qt::CTRL | Qt::Key_Space))) {
emit completePressed(); emit completePressed();
return true; return true;
} }

View File

@ -16,7 +16,7 @@ TagView::~TagView() {
void TagView::buildUi() { void TagView::buildUi() {
mainLayout = new QHBoxLayout(this); mainLayout = new QHBoxLayout(this);
mainLayout->setMargin(0); mainLayout->setContentsMargins(0, 0, 0, 0);
tagGroupBox = new QGroupBox("Tags", this); tagGroupBox = new QGroupBox("Tags", this);
layout = new FlowLayout(); layout = new FlowLayout();

View File

@ -133,14 +133,14 @@ Tri EvidenceFilters::parseTriFilterValue(const QString& text, bool strict) {
} }
std::vector<std::pair<QString, QString>> EvidenceFilters::tokenizeFilterText(const QString& text) { std::vector<std::pair<QString, QString>> EvidenceFilters::tokenizeFilterText(const QString& text) {
QStringList list = text.split(":", QString::SplitBehavior::SkipEmptyParts); QStringList list = text.split(":", Qt::SkipEmptyParts);
// now in: [Key][value key]...[value] format // now in: [Key][value key]...[value] format
QStringList keys; QStringList keys;
QStringList values; QStringList values;
keys.append(list.first()); keys.append(list.first());
for (int i = 1; i < list.size() - 1; i++) { for (int i = 1; i < list.size() - 1; i++) {
auto valueKeyPair = list.at(i).split(" ", QString::SplitBehavior::SkipEmptyParts); auto valueKeyPair = list.at(i).split(" ", Qt::SkipEmptyParts);
keys.append(valueKeyPair.last()); keys.append(valueKeyPair.last());
valueKeyPair.removeLast(); valueKeyPair.removeLast();
values.append(valueKeyPair.join(" ")); values.append(valueKeyPair.join(" "));

View File

@ -8,6 +8,7 @@
#include <QString> #include <QString>
#include <utility> #include <utility>
#include <vector> #include <vector>
#include <QStringList>
enum Tri { Any, Yes, No }; enum Tri { Any, Yes, No };

View File

@ -292,10 +292,8 @@ void Settings::onTestRequestComplete() {
connStatusLabel->setText("Could not connect: Not Found (check URL)"); connStatusLabel->setText("Could not connect: Not Found (check URL)");
break; break;
default: default:
QString msg = "Could not connect: Unexpected Error (code: "; QString msg = "Could not connect: Unexpected Error (code: %1)";
msg.append(statusCode); connStatusLabel->setText(msg.arg(statusCode));
msg.append(")");
connStatusLabel->setText(msg);
} }
} }
else { else {

View File

@ -18,18 +18,18 @@ class Constants {
static QString configLocation() { static QString configLocation() {
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
return QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/config.json"; return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/config.json";
#else #else
return QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/ashirt/config.json"; return QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/ashirt/config.json";
#endif #endif
} }
static QString dbLocation() { static QString dbLocation() {
return QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/evidence.sqlite"; return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/evidence.sqlite";
} }
static QString defaultEvidenceRepo() { static QString defaultEvidenceRepo() {
return QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/evidence"; return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/evidence";
} }
static QString releaseOwner() { static QString releaseOwner() {

View File

@ -11,6 +11,7 @@ void handleCLI(std::vector<std::string> args);
#ifndef QT_NO_SYSTEMTRAYICON #ifndef QT_NO_SYSTEMTRAYICON
#include <QApplication> #include <QApplication>
#include <QMessageBox> #include <QMessageBox>
#include <QMetaType>
#include "appconfig.h" #include "appconfig.h"
#include "appsettings.h" #include "appsettings.h"
@ -19,38 +20,6 @@ void handleCLI(std::vector<std::string> args);
#include "exceptions/fileerror.h" #include "exceptions/fileerror.h"
#include "traymanager.h" #include "traymanager.h"
QDataStream& operator<<(QDataStream& out, const model::Tag& v) {
out << v.tagName << v.id << v.serverTagId;
return out;
}
QDataStream& operator>>(QDataStream& in, model::Tag& v) {
in >> v.tagName;
in >> v.id;
in >> v.serverTagId;
return in;
}
QDataStream& operator<<(QDataStream& out, const std::vector<model::Tag>& v) {
out << int(v.size());
for (const auto& tag : v) {
out << tag;
}
return out;
}
QDataStream& operator>>(QDataStream& in, std::vector<model::Tag>& v) {
int qty;
in >> qty;
v.reserve(qty);
for(int i = 0; i < qty; i++) {
model::Tag t;
in >> t;
v.push_back(t);
}
return in;
}
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
Q_INIT_RESOURCE(res_icons); Q_INIT_RESOURCE(res_icons);
Q_INIT_RESOURCE(res_migrations); Q_INIT_RESOURCE(res_migrations);
@ -88,9 +57,11 @@ int main(int argc, char* argv[]) {
int rtn; int rtn;
try { try {
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
qRegisterMetaTypeStreamOperators<model::Tag>("Tag"); qRegisterMetaTypeStreamOperators<model::Tag>("Tag");
qRegisterMetaTypeStreamOperators<std::vector<model::Tag>>("TagVector"); #endif
QApplication app(argc, argv); QApplication app(argc, argv);
qRegisterMetaType<model::Tag>();
if (!QSystemTrayIcon::isSystemTrayAvailable()) { if (!QSystemTrayIcon::isSystemTrayAvailable()) {
handleCLI(std::vector<std::string>(argv, argv + argc)); handleCLI(std::vector<std::string>(argv, argv + argc));

View File

@ -14,6 +14,7 @@ class Tag {
Tag() = default; Tag() = default;
~Tag() = default; ~Tag() = default;
Tag(const Tag &) = default; Tag(const Tag &) = default;
Tag& operator=(const Tag&) = default;
Tag(qint64 id, qint64 evidenceID, qint64 tagId, QString name) : Tag(id, tagId, name) { this->evidenceId = evidenceID; } Tag(qint64 id, qint64 evidenceID, qint64 tagId, QString name) : Tag(id, tagId, name) { this->evidenceId = evidenceID; }
Tag(qint64 id, qint64 tagId, QString name) : Tag(tagId, name) { this->id = id; } Tag(qint64 id, qint64 tagId, QString name) : Tag(tagId, name) { this->id = id; }
@ -22,6 +23,19 @@ class Tag {
this->tagName = name; this->tagName = name;
} }
public:
friend QDataStream& operator<<(QDataStream& out, const model::Tag& v) {
out << v.tagName << v.id << v.serverTagId;
return out;
}
friend QDataStream& operator>>(QDataStream& in, model::Tag& v) {
in >> v.tagName;
in >> v.id;
in >> v.serverTagId;
return in;
}
public: public:
qint64 id; qint64 id;
qint64 serverTagId; qint64 serverTagId;

View File

@ -7,23 +7,13 @@
#include <QAction> #include <QAction>
#include <QApplication> #include <QApplication>
#include <QCheckBox>
#include <QCloseEvent> #include <QCloseEvent>
#include <QComboBox>
#include <QCoreApplication> #include <QCoreApplication>
#include <QDesktopWidget>
#include <QGroupBox>
#include <QLabel>
#include <QLineEdit>
#include <QMenu> #include <QMenu>
#include <QMessageBox> #include <QMessageBox>
#include <QPushButton>
#include <QSpinBox>
#include <QTextEdit>
#include <QVBoxLayout>
#include <iostream>
#include <QTimer> #include <QTimer>
#include <QDesktopServices> #include <QDesktopServices>
#include <iostream>
#include "appconfig.h" #include "appconfig.h"
#include "appsettings.h" #include "appsettings.h"

@ -1 +1 @@
Subproject commit 4b1049f8e5248ac816b6b90dfa0e70c54b9b8306 Subproject commit 2f17fe1ec8dbbb00418d55343b9529dcfa93f264