#include "./otherdialogs.h" #include #include #include // use meta-data of syncthingtray application here #include "resources/../../tray/resources/config.h" #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace Data; namespace QtGui { static void setupOwnDeviceIdDialog(Data::SyncthingConnection &connection, int size, QWidget *dlg) { dlg->setWindowTitle(QCoreApplication::translate("QtGui::OtherDialogs", "Own device ID") + QStringLiteral(" - " APP_NAME)); dlg->setWindowIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/app/syncthingtray.svg"))); dlg->setAttribute(Qt::WA_DeleteOnClose); dlg->setBackgroundRole(QPalette::Window); auto *layout = new QVBoxLayout(dlg); layout->setAlignment(Qt::AlignCenter); auto *pixmapLabel = new QLabel(dlg); pixmapLabel->setAlignment(Qt::AlignCenter); layout->addWidget(pixmapLabel); auto *textLabel = new QLabel(dlg); textLabel->setText(connection.myId().isEmpty() ? QCoreApplication::translate("QtGui::OtherDialogs", "device ID is unknown") : connection.myId()); QFont defaultFont = textLabel->font(); defaultFont.setBold(true); defaultFont.setPointSize(defaultFont.pointSize() + 2); textLabel->setFont(defaultFont); textLabel->setAlignment(Qt::AlignCenter); layout->addWidget(textLabel); auto *copyPushButton = new QPushButton(dlg); copyPushButton->setText(QCoreApplication::translate("QtGui::OtherDialogs", "Copy to clipboard")); QObject::connect( copyPushButton, &QPushButton::clicked, bind(&QClipboard::setText, QGuiApplication::clipboard(), connection.myId(), QClipboard::Clipboard)); layout->addWidget(copyPushButton); connection.requestQrCode(connection.myId()); QObject::connect(&connection, &SyncthingConnection::qrCodeAvailable, pixmapLabel, [pixmapLabel, devId = connection.myId(), size](const QString &text, const QByteArray &data) { if (text != devId) { return; } auto pixmap = QPixmap(); pixmap.loadFromData(data); if (size) { pixmap = pixmap.scaledToHeight(size, Qt::SmoothTransformation); } pixmapLabel->setPixmap(pixmap); }); dlg->setLayout(layout); } QDialog *ownDeviceIdDialog(Data::SyncthingConnection &connection) { auto *dlg = new QDialog(nullptr, Qt::Window); setupOwnDeviceIdDialog(connection, 0, dlg); return dlg; } QWidget *ownDeviceIdWidget(Data::SyncthingConnection &connection, int size, QWidget *parent) { auto *widget = new QWidget(parent); setupOwnDeviceIdDialog(connection, size, widget); return widget; } QDialog *browseRemoteFilesDialog(Data::SyncthingConnection &connection, const Data::SyncthingDir &dir, QWidget *parent) { auto dlg = new QDialog(parent); dlg->setWindowTitle(QCoreApplication::translate("QtGui::OtherDialogs", "Remote/global tree of folder \"%1\"").arg(dir.displayName()) + QStringLiteral(" - " APP_NAME)); dlg->setWindowIcon(QIcon(QStringLiteral(":/icons/hicolor/scalable/app/syncthingtray.svg"))); dlg->setAttribute(Qt::WA_DeleteOnClose); // setup model/view auto model = new Data::SyncthingFileModel(connection, dir.id, &connection); auto view = new QTreeView(dlg); view->setModel(model); view->setContextMenuPolicy(Qt::CustomContextMenu); QObject::connect(view, &QTreeView::customContextMenuRequested, view, [view, model](const QPoint &pos) { const auto index = view->indexAt(pos); if (!index.isValid()) { return; } const auto actions = model->data(index, SyncthingFileModel::Actions).toStringList(); if (actions.isEmpty()) { return; } const auto actionNames = model->data(index, SyncthingFileModel::ActionNames).toStringList(); const auto actionIcons = model->data(index, SyncthingFileModel::ActionIcons).toStringList(); auto menu = QMenu(view); auto actionIndex = qsizetype(); for (const auto &action : actions) { QObject::connect(menu.addAction(actionIndex < actionIcons.size() ? QIcon::fromTheme(actionIcons.at(actionIndex)) : QIcon(), actionIndex < actionNames.size() ? actionNames.at(actionIndex) : action), &QAction::triggered, model, [model, action, index]() { model->triggerAction(action, index); }); ++actionIndex; } menu.exec(pos); }); // setup layout auto layout = new QVBoxLayout; layout->setAlignment(Qt::AlignCenter); layout->setSpacing(0); layout->setContentsMargins(QMargins()); layout->addWidget(view); dlg->setLayout(layout); return dlg; } } // namespace QtGui