Skip to content

Commit

Permalink
Merge pull request #780 from Quick-Event/centralized-settings
Browse files Browse the repository at this point in the history
Editable reports, Centralized settings
  • Loading branch information
fvacek committed Sep 10, 2022
2 parents e83bb7a + 5ab3683 commit 08baf71
Show file tree
Hide file tree
Showing 128 changed files with 2,137 additions and 1,146 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Expand Up @@ -14,6 +14,8 @@
*.qmlc
*.jsc

CMakeLists.txt.user

/.qmake.cache
/.qmake.stash
*.pro.user
Expand Down
2 changes: 1 addition & 1 deletion 3rdparty/necrolog
Submodule necrolog updated 1 files
+0 −1 CMakeLists.txt
6 changes: 4 additions & 2 deletions libqf/libqfcore/src/utils/fileutils.cpp
Expand Up @@ -35,15 +35,17 @@ QString FileUtils::path(const QString &file_name)
{
QString fn = FileUtils::unixSeparators(file_name);
int ix = fn.lastIndexOf('/');
if(ix < 0) return QString();
if(ix < 0)
return QString();
return fn.mid(0, ix+1);
}

QString FileUtils::file(const QString &file_name)
{
QString fn = FileUtils::unixSeparators(file_name);
int ix = fn.lastIndexOf('/');
if(ix < 0) return fn;
if(ix < 0)
return fn;
return fn.mid(ix + 1);
}

Expand Down
6 changes: 3 additions & 3 deletions libqf/libqfqmlwidgets/src/framework/mainwindow.h
Expand Up @@ -43,7 +43,6 @@ class QFQMLWIDGETS_DECL_EXPORT MainWindow : public QMainWindow, public IPersiste
Q_PROPERTY(qf::qmlwidgets::StatusBar* statusBar READ statusBar)
Q_PROPERTY(QString persistentSettingsId READ persistentSettingsId WRITE setPersistentSettingsId)
Q_PROPERTY(QString uiLanguageName READ uiLanguageName WRITE setUiLanguageName NOTIFY uiLanguageNameChanged)
PluginList m_loadedPlugins;
private:
typedef QMainWindow Super;
public:
Expand All @@ -57,6 +56,8 @@ class QFQMLWIDGETS_DECL_EXPORT MainWindow : public QMainWindow, public IPersiste
public:
void registerPlugin(qf::qmlwidgets::framework::Plugin *plugin);
virtual void loadPlugins();
QList<qf::qmlwidgets::framework::Plugin*> installedPlugins();

/// framework API
Q_INVOKABLE void setPersistentSettingDomains(const QString &organization_domain, const QString &organization_name, const QString &application_name = QString());

Expand Down Expand Up @@ -101,11 +102,10 @@ class QFQMLWIDGETS_DECL_EXPORT MainWindow : public QMainWindow, public IPersiste
private:
Q_SLOT void savePersistentSettings();
private:
PluginList m_loadedPlugins;
PluginLoader *m_pluginLoader = nullptr;
QMap<QString, qf::qmlwidgets::ToolBar*> m_toolBars;
static MainWindow *self;
public:
QList<qf::qmlwidgets::framework::Plugin*> installedPlugins();
};

template<typename T>
Expand Down
46 changes: 46 additions & 0 deletions libqf/libqfqmlwidgets/src/framework/plugin.cpp
Expand Up @@ -8,9 +8,13 @@

#include <QQmlEngine>
#include <QTranslator>
#include <QFile>
#include <QDirIterator>

using namespace qf::qmlwidgets::framework;

QString Plugin::m_customReportsDir;

Plugin::Plugin(const QString &feature_id, QObject *parent)
: QObject(parent)
{
Expand All @@ -29,6 +33,48 @@ Plugin::~Plugin()
qfLogFuncFrame() << this;
}

QString Plugin::findReportFile(const QString &report_file_path) const
{
QStringList search_paths;
if(!m_customReportsDir.isEmpty())
search_paths << m_customReportsDir + '/' + m_featureId + "/qml/reports";
search_paths << qmlReportsDir();
for(const QString &dir : search_paths) {
auto fn = dir + '/' + report_file_path;
QFileInfo fi(fn);
if(fi.isFile())
return fn;
}
qfError() << "Cannot find report file for feature id:" << m_featureId << "and file path:" << report_file_path;
return {};
}

QList<Plugin::ReportFileInfo> Plugin::listReportFiles(const QString &report_dir) const
{
QList<ReportFileInfo> report_files;
QStringList search_paths;
if(!m_customReportsDir.isEmpty())
search_paths << m_customReportsDir + '/' + m_featureId + "/qml/reports";
search_paths << qmlReportsDir();
for(const QString &dir : search_paths) {
QDirIterator it(dir + '/' + report_dir, QDirIterator::NoIteratorFlags);
while (it.hasNext()) {
it.next();
QFileInfo fi = it.fileInfo();
if(fi.isFile() && fi.suffix() == "qml") {
ReportFileInfo i {
.reportName = fi.baseName(),
.reportFilePath = report_dir + '/' + fi.fileName()
};
if(!report_files.contains(i))
report_files << i;
}
}
}
std::sort(report_files.begin(), report_files.end(), [](const ReportFileInfo &a, const ReportFileInfo &b) { return a.reportName < b.reportName; });
return report_files;
}

QQmlEngine *Plugin::qmlEngine()
{
QQmlEngine *qe = Application::instance()->qmlEngine();
Expand Down
19 changes: 18 additions & 1 deletion libqf/libqfqmlwidgets/src/framework/plugin.h
Expand Up @@ -17,19 +17,36 @@ namespace framework {
class QFQMLWIDGETS_DECL_EXPORT Plugin : public QObject
{
Q_OBJECT
QString m_featureId;
public:
explicit Plugin(const QString &feature_id, QObject *parent = nullptr);
explicit Plugin(QObject *parent = nullptr);
~Plugin() Q_DECL_OVERRIDE;

static void setCustomReportsDir(const QString &dir) { m_customReportsDir = dir; }

QString homeDir() const { return qf::qmlwidgets::framework::Application::instance()->pluginDataDir() + '/' + featureId(); }
QString qmlDir() const { return homeDir() + "/qml"; }
QString qmlReportsDir() const { return qmlDir() + "/reports"; }
QString featureId() const { return m_featureId; }
//QString settingsDir() const { return "plugin/" + featureId(); }
QString findReportFile(const QString &report_file_path) const;
struct QFQMLWIDGETS_DECL_EXPORT ReportFileInfo
{
QString reportName;
QString reportFilePath;

bool operator==(const ReportFileInfo &o) const {
return reportName == o.reportName && reportFilePath == o.reportFilePath;
}
};
QList<ReportFileInfo> listReportFiles(const QString &report_dir) const;

QQmlEngine* qmlEngine();

Q_SIGNAL void installed();
private:
QString m_featureId;
static QString m_customReportsDir;
};

}}}
Expand Down
Expand Up @@ -138,6 +138,11 @@ void ReportItemImage::updateResolvedDataSource()
if(!m_resolvedDataSource.isEmpty()) {
if(m_resolvedDataSource.startsWith("./") || m_resolvedDataSource.startsWith("../")) {
m_resolvedDataSource = qfu::FileUtils::joinPath(qfu::FileUtils::path(processor()->reportUrl().toString()), m_resolvedDataSource);
static const auto FILE_SCHEME = QStringLiteral("file:");
if(m_resolvedDataSource.startsWith(FILE_SCHEME)) {
// path like file:/path/to/file.svg is not recognized by QSvgRenderer
m_resolvedDataSource = m_resolvedDataSource.mid(FILE_SCHEME.length());
}
}
/*--
m_resolvedDataSource = processor()->searchDirs()->findFile(m_resolvedDataSource);
Expand Down
Expand Up @@ -65,7 +65,7 @@ class QFQMLWIDGETS_DECL_EXPORT ReportItemImage : public ReportItemFrame
QF_PROPERTY_BOOL_IMPL(s, S, uppressPrintout)

private:
void updateResolvedDataSource();
void updateResolvedDataSource();
protected:
//--virtual bool childrenSynced();
//--virtual void syncChildren();
Expand Down
Expand Up @@ -20,9 +20,6 @@ void HtmlFileExporter::generateHtml()
{
prepareExport();

QVariantList html_body = QVariantList() << QStringLiteral("body");
html_body.insert(html_body.length(), QVariantList() << QStringLiteral("body"));

exportClasses();
}

Expand Down
30 changes: 30 additions & 0 deletions libsiut/src/device/commport.cpp
Expand Up @@ -82,6 +82,36 @@ void CommPort::sendData(const QByteArray &data)
qfError() << "send data error!";
}

QString CommPort::errorToUserHint() const
{
QSerialPort::SerialPortError error_type = error();
QString error_msg = errorString();
if(error_type == QSerialPort::PermissionError) {
error_msg.append("\n\n")
.append(tr(""
"possible solution:\n"
"Wait at least 10 seconds and then try again."
""));
}
if(error_type == QSerialPort::DeviceNotFoundError) {
error_msg.append("\n\n");
QList<QSerialPortInfo> port_list = QSerialPortInfo::availablePorts();
if(port_list.isEmpty()) {
error_msg.append(tr("There are no ports available."));
}
else {
error_msg.append(tr(""
"Selected port %1 is not available.\n"
"List of accessible ports:\n\n"
"").arg(portName()));
for(auto port : port_list) {
error_msg.append(QChar(0x2022)).append(" ").append(port.systemLocation()).append("\n");
}
}
}
return error_msg;
}

void CommPort::emitCommInfo ( NecroLog::Level level, const QString& msg )
{
//qfLog(level) << msg;
Expand Down
2 changes: 2 additions & 0 deletions libsiut/src/device/commport.h
Expand Up @@ -35,6 +35,8 @@ class SIUT_DECL_EXPORT CommPort : public QSerialPort
void sendData(const QByteArray &data);

Q_SIGNAL void commInfo(NecroLog::Level level, const QString &msg);

QString errorToUserHint() const;
protected:
virtual void emitCommInfo(NecroLog::Level level, const QString &msg);

Expand Down
19 changes: 19 additions & 0 deletions libsiut/src/device/sitask.cpp
Expand Up @@ -93,6 +93,25 @@ void SiTaskSetDirectRemoteMode::onSiMessageReceived(const SIMessageData &msg)
//===============================================================
// CmdStationInfo
//===============================================================
QString SiStationConfig::toString() const
{
QString msg = tr(""
"Station number: {{StationNumber}}\n"
"Extended mode: {{ExtendedMode}}\n"
"Auto send: {{AutoSend}}\n"
"Handshake: {{HandShake}}\n"
"Password access: {{PasswordAccess}}\n"
"Read out after punch: {{ReadOutAfterPunch}}\n"
"");
msg.replace("{{StationNumber}}", QString::number(stationNumber()));
msg.replace("{{ExtendedMode}}", (flags() & (unsigned)siut::SiStationConfig::Flag::ExtendedMode)? tr("True"): tr("False"));
msg.replace("{{AutoSend}}", (flags() & (unsigned)siut::SiStationConfig::Flag::AutoSend)? tr("True"): tr("False"));
msg.replace("{{HandShake}}", (flags() & (unsigned)siut::SiStationConfig::Flag::HandShake)? tr("True"): tr("False"));
msg.replace("{{PasswordAccess}}", (flags() & (unsigned)siut::SiStationConfig::Flag::PasswordAccess)? tr("True"): tr("False"));
msg.replace("{{ReadOutAfterPunch}}", (flags() & (unsigned)siut::SiStationConfig::Flag::ReadOutAfterPunch)? tr("True"): tr("False"));
return msg;
}

void SiTaskStationConfig::start()
{
QByteArray ba;
Expand Down
5 changes: 4 additions & 1 deletion libsiut/src/device/sitask.h
Expand Up @@ -60,8 +60,10 @@ class SIUT_DECL_EXPORT SiTaskSetDirectRemoteMode : public SiTask
Mode m_mode;
};

class QFCORE_DECL_EXPORT SiStationConfig : public QVariantMap
class SIUT_DECL_EXPORT SiStationConfig : public QVariantMap
{
Q_DECLARE_TR_FUNCTIONS(SiStationConfig)

QF_VARIANTMAP_FIELD2(int, s, setS, tationNumber, 0)
QF_VARIANTMAP_FIELD2(unsigned, f, setF, lags, 0)

Expand All @@ -74,6 +76,7 @@ class QFCORE_DECL_EXPORT SiStationConfig : public QVariantMap
ReadOutAfterPunch = 1 << 7,
};
SiStationConfig(const QVariantMap &m = QVariantMap()) : QVariantMap(m) {}
QString toString() const;
};

class SIUT_DECL_EXPORT SiTaskStationConfig : public SiTask
Expand Down
4 changes: 3 additions & 1 deletion quickevent/app/quickevent/CMakeLists.txt
Expand Up @@ -58,9 +58,11 @@ add_executable(quickevent
plugins/Oris/src/txtimporter.cpp
plugins/Receipts/src/receiptsplugin.cpp
plugins/Receipts/src/receiptsprinter.cpp
plugins/Receipts/src/receiptsprinteroptions.cpp
#plugins/Receipts/src/receiptsprinteroptions.cpp
plugins/Receipts/src/receiptsprinteroptionsdialog.cpp
plugins/Receipts/src/receiptswidget.cpp
plugins/Receipts/src/receiptssettings.cpp
plugins/Receipts/src/receiptssettingspage.cpp
plugins/Relays/src/addlegdialogwidget.cpp
plugins/Relays/src/relaydocument.cpp
plugins/Relays/src/relaysplugin.cpp
Expand Down
8 changes: 8 additions & 0 deletions quickevent/app/quickevent/datafiles/style/default.css
Expand Up @@ -67,6 +67,14 @@ qf--qmlwidgets--dialogs--internal--CaptionFrame {
/* background: lightsteelblue; */
background: darkorange;
}
QWidget#CaptionFrame {
/*background: #FDE364; yellow */
/*background: #FFA842; orange */
/* background: lightsteelblue; */
background: darkorange;
color:black;
font-weight: bold;
}
qf--qmlwidgets--dialogs--internal--CaptionFrame[alert="true"] {
background: salmon;
/*background: #FFA842;*/
Expand Down
@@ -1,7 +1,8 @@
#include "cardchecker.h"
#include "cardreaderplugin.h"

//#include <Classes/classesplugin.h>
#include "../../Event/src/eventplugin.h"
#include "../../Runs/src/runsplugin.h"

#include <quickevent/core/og/timems.h>
#include <quickevent/core/codedef.h>
Expand All @@ -11,8 +12,6 @@

#include <qf/qmlwidgets/framework/mainwindow.h>

#include <plugins/Event/src/eventplugin.h>
#include <plugins/Runs/src/runsplugin.h>
#include <qf/core/assert.h>
#include <qf/core/log.h>
#include <qf/core/sql/query.h>
Expand Down
Expand Up @@ -23,6 +23,8 @@ class CardChecker : public QObject
public:
explicit CardChecker(QObject *parent = nullptr);

QString nameId() const { return objectName(); }

QF_PROPERTY_IMPL(QString, c, C, aption)

Q_INVOKABLE int fixTimeWrapAM(int time1_msec, int time2_msec);
Expand Down
Expand Up @@ -12,6 +12,7 @@ namespace CardReader {
CardCheckerClassicCpp::CardCheckerClassicCpp(QObject *parent)
: Super(parent)
{
setObjectName("Classic");
setCaption(tr("Classic race"));
}

Expand Down
Expand Up @@ -12,6 +12,7 @@ namespace CardReader {
CardCheckerFreeOrderCpp::CardCheckerFreeOrderCpp(QObject *parent)
: Super(parent)
{
setObjectName("FreeOrder");
setCaption(tr("Free order race"));
}

Expand Down

0 comments on commit 08baf71

Please sign in to comment.