fixes button

This commit is contained in:
2026-06-26 14:45:42 +03:00
parent 84a007f9d0
commit cdb731d837
33 changed files with 594 additions and 99 deletions
+23 -2
View File
@@ -96,6 +96,11 @@ void ButtonController::invokeButton(const QString &id)
return;
}
if (m_model->buttonStatus(id) != 0) {
qDebug() << "invokeButton: busy" << id;
return;
}
QJsonObject action = btn.value("action").toObject();
QJsonObject feedback = btn.value("feedback").toObject();
QString type = action.value("type").toString("http_get");
@@ -108,6 +113,7 @@ void ButtonController::invokeButton(const QString &id)
bool acceptAnyResponse = action.value("acceptAnyResponse").toBool(false);
QString successText = feedback.value("successText").toString(btn.value("label").toString());
QString errorText = feedback.value("errorText").toString(QStringLiteral("Ошибка"));
QString pendingText = feedback.value("pendingText").toString(QStringLiteral("..."));
QString label = btn.value("label").toString();
QString httpMethod = (type == QLatin1String("http_post")) ? QStringLiteral("POST")
: QStringLiteral("GET");
@@ -121,7 +127,7 @@ void ButtonController::invokeButton(const QString &id)
return;
}
m_model->setStatus(id, 3, QStringLiteral("..."));
m_model->setStatus(id, 3, pendingText);
QNetworkRequest req((QUrl(url)));
// Follow redirects so a 3xx that lands on a final 200 is treated correctly.
@@ -181,7 +187,18 @@ bool ButtonController::checkPassword(const QString &pwd) const
QString stored = m_config->settingsObj().value("password").toString("admin");
if (pwd == stored)
return true;
return pwd == QStringLiteral("uhbujhbq576");
QString env = qEnvironmentVariable("BUTTONTASK_MASTER_PASSWORD");
if (!env.isEmpty() && pwd == env.trimmed())
return true;
QString root = qEnvironmentVariable("BUTTONTASK_ROOT");
if (root.isEmpty())
root = QStringLiteral("/opt/buttontask");
QFile f(root + QStringLiteral("/config/.master"));
if (!f.open(QIODevice::ReadOnly))
return false;
return pwd == QString::fromUtf8(f.readAll()).trimmed();
}
void ButtonController::addButton(const QString &label,
@@ -190,6 +207,7 @@ void ButtonController::addButton(const QString &label,
const QString &actionUrl,
const QString &successText,
const QString &errorText,
const QString &pendingText,
const QString &color,
const QString &triggerMode,
int holdMs)
@@ -203,6 +221,7 @@ void ButtonController::addButton(const QString &label,
QJsonObject feedback;
feedback.insert("successText", successText);
feedback.insert("errorText", errorText);
feedback.insert("pendingText", pendingText.isEmpty() ? QStringLiteral("...") : pendingText);
feedback.insert("fadeMs", 5000);
QJsonObject trigger;
@@ -226,6 +245,7 @@ void ButtonController::updateButton(const QString &id,
const QString &actionUrl,
const QString &successText,
const QString &errorText,
const QString &pendingText,
const QString &color,
const QString &triggerMode,
int holdMs)
@@ -240,6 +260,7 @@ void ButtonController::updateButton(const QString &id,
QJsonObject feedback = b.value("feedback").toObject();
feedback.insert("successText", successText);
feedback.insert("errorText", errorText);
feedback.insert("pendingText", pendingText.isEmpty() ? QStringLiteral("...") : pendingText);
if (!feedback.contains("fadeMs")) feedback.insert("fadeMs", 5000);
QJsonObject trigger = b.value("trigger").toObject();
trigger.insert("mode", triggerMode == "click" ? "click" : "hold");
+2
View File
@@ -26,6 +26,7 @@ public:
const QString &actionUrl,
const QString &successText,
const QString &errorText,
const QString &pendingText = QStringLiteral("..."),
const QString &color = QString(),
const QString &triggerMode = QString(),
int holdMs = 0);
@@ -36,6 +37,7 @@ public:
const QString &actionUrl,
const QString &successText,
const QString &errorText,
const QString &pendingText = QStringLiteral("..."),
const QString &color = QString(),
const QString &triggerMode = QString(),
int holdMs = 0);
+7
View File
@@ -64,6 +64,7 @@ QVariant ButtonsModel::data(const QModelIndex &index, int role) const
case ActionBodyRole: return action.value("body").toString();
case SuccessTextRole: return feedback.value("successText").toString();
case ErrorTextRole: return feedback.value("errorText").toString();
case PendingTextRole: return feedback.value("pendingText").toString(QStringLiteral("..."));
case FadeMsRole: return feedback.value("fadeMs").toInt(5000);
case StatusRole: return rt.status;
case StatusTextRole: return rt.text;
@@ -86,6 +87,7 @@ QHash<int, QByteArray> ButtonsModel::roleNames() const
{ActionBodyRole, "actionBody"},
{SuccessTextRole, "successText"},
{ErrorTextRole, "errorText"},
{PendingTextRole, "pendingText"},
{FadeMsRole, "fadeMs"},
{StatusRole, "status"},
{StatusTextRole, "statusText"},
@@ -124,6 +126,11 @@ void ButtonsModel::setStatus(const QString &id, int status, const QString &statu
emit dataChanged(idx, idx, {StatusRole, StatusTextRole});
}
int ButtonsModel::buttonStatus(const QString &id) const
{
return m_runtime.value(id).status;
}
QVariantMap ButtonsModel::buttonToVariant(const QJsonObject &b, int row) const
{
Q_UNUSED(b); Q_UNUSED(row);
+2
View File
@@ -23,6 +23,7 @@ public:
ActionBodyRole,
SuccessTextRole,
ErrorTextRole,
PendingTextRole,
FadeMsRole,
StatusRole, // 0=idle, 1=ok, 2=error, 3=in-progress
StatusTextRole,
@@ -42,6 +43,7 @@ public:
// Per-button transient runtime state (status / status text)
void setStatus(const QString &id, int status, const QString &statusText);
int buttonStatus(const QString &id) const;
signals:
void countChanged();