#include #include "renamedialog.h" #include "../db/db_manager.h" #include "../transport/member_edit.h" #include "debug_config.h" #include #include #include #include RenameDialog::RenameDialog(DbManager* db, const QString& channelId, quint64 nodeId, const QString& displayName, QWidget* parent) : QDialog(parent) , m_db(db) , m_channelId(channelId) , m_nodeId(nodeId) { setWindowTitle(QCoreApplication::translate("ChatGui", "Rename")); setMinimumWidth(300); setModal(true); QString curNick; bool loaded = false; if (m_db && m_db->m_db) { QString tbl = m_db->peersTableName(channelId); QByteArray sql = QString( "SELECT local_nick FROM \"%1\" WHERE node_id=?" ).arg(tbl).toUtf8(); sqlite3_stmt* st = nullptr; int rc = sqlite3_prepare_v2(m_db->m_db, sql.constData(), -1, &st, nullptr); if (rc == SQLITE_OK) rc = sqlite3_bind_int64(st, 1, (sqlite3_int64)nodeId); if (rc == SQLITE_OK) rc = sqlite3_step(st); if (rc == SQLITE_ROW) curNick = DbManager::colText(st, 0); int finish = sqlite3_finalize(st); loaded = rc == SQLITE_ROW && finish == SQLITE_OK; if (!loaded) DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "rename: read ch=%s node=%016llx rc=%d finalize=%d: %s", qPrintable(channelId), (unsigned long long)nodeId, rc, finish, sqlite3_errmsg(m_db->m_db)); } else { DEBUG_WARN(DEBUG_CATEGORY_CHAT_SYNC, "rename: database unavailable at open"); } auto* layout = new QVBoxLayout(this); layout->setSpacing(12); layout->setContentsMargins(20, 16, 20, 16); auto* title = new QLabel(displayName, this); title->setStyleSheet("font-weight: bold; font-size: 13px;"); layout->addWidget(title); m_edit = new QLineEdit(this); m_edit->setText(curNick); m_edit->setPlaceholderText(displayName); layout->addWidget(m_edit); m_errorLabel = new QLabel(this); m_errorLabel->setObjectName("memberSaveError"); m_errorLabel->setWordWrap(true); if (!loaded) m_errorLabel->setText(QCoreApplication::translate("ChatGui", "Could not load member details.")); layout->addWidget(m_errorLabel); layout->addStretch(); auto* btnLayout = new QHBoxLayout(); btnLayout->addStretch(); auto* cancelBtn = new QPushButton(QCoreApplication::translate("ChatGui", "Cancel"), this); cancelBtn->setMinimumWidth(90); cancelBtn->setStyleSheet( "QPushButton { border: 1px solid palette(mid); border-radius: 4px;" " padding: 6px 16px; font-size: 13px; background: palette(button); }" "QPushButton:hover { background: palette(light); }"); connect(cancelBtn, &QPushButton::clicked, this, &QDialog::reject); btnLayout->addWidget(cancelBtn); auto* saveBtn = new QPushButton(QCoreApplication::translate("ChatGui", "Save"), this); m_saveBtn = saveBtn; m_loaded = loaded; m_saveBtn->setEnabled(m_loaded); saveBtn->setMinimumWidth(90); saveBtn->setDefault(true); saveBtn->setStyleSheet( "QPushButton { border: none; border-radius: 4px;" " padding: 6px 16px; font-size: 13px; font-weight: bold;" " background: #3390EC; color: white; }" "QPushButton:hover { background: #2B7ED4; }"); connect(saveBtn, &QPushButton::clicked, this, &RenameDialog::onSave); btnLayout->addWidget(saveBtn); layout->addLayout(btnLayout); connect(this, &QDialog::finished, this, [this] { delete m_saveContext; m_saveContext = nullptr; m_edit->setEnabled(true); m_saveBtn->setEnabled(m_loaded); }); } /* Результат адресован context запроса; после закрытия/удаления формы мост его не вызовет. */ void RenameDialog::finishSave(int result) { delete m_saveContext; m_saveContext = nullptr; m_edit->setEnabled(true); m_saveBtn->setEnabled(m_loaded); if (!result) { accept(); return; } m_errorLabel->setText(QCoreApplication::translate("ChatGui", "Could not save member changes. Please try again.")); DEBUG_WARN(DEBUG_CATEGORY_CHAT_SYNC, "rename: save refused ch=%s node=%016llx result=%d", qPrintable(m_channelId), (unsigned long long)m_nodeId, result); } void RenameDialog::onSave() { if (m_saveContext) return; if (!m_loaded) { finishSave(-1); return; } m_errorLabel->clear(); m_edit->setEnabled(false); m_saveBtn->setEnabled(false); m_saveContext = new QObject(this); if (!gui_bridge_save_member(m_db ? m_db->m_db : nullptr, m_channelId, m_nodeId, m_edit->text().trimmed(), {}, m_saveContext, [this](int result) { finishSave(result); })) finishSave(-1); }