summaryrefslogtreecommitdiffstats
path: root/examples/assistant/remotecontrol/remotecontrol.cpp
blob: b4d1fe085c2e2a53995d10958d80dc61083a8830 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

#include "remotecontrol.h"

#include <QDir>
#include <QLibraryInfo>
#include <QMessageBox>
#include <QProcess>

using namespace Qt::StringLiterals;

RemoteControl::RemoteControl()
{
    ui.setupUi(this);
    connect(ui.launchButton, &QPushButton::clicked, this, &RemoteControl::onLaunchClicked);

    connect(ui.indexButton, &QPushButton::clicked, this, &RemoteControl::onIndexClicked);
    connect(ui.indexLineEdit, &QLineEdit::returnPressed, this, &RemoteControl::onIndexClicked);

    connect(ui.idButton, &QPushButton::clicked, this, &RemoteControl::onIdClicked);
    connect(ui.idLineEdit, &QLineEdit::returnPressed, this, &RemoteControl::onIdClicked);

    connect(ui.urlButton, &QPushButton::clicked, this, &RemoteControl::onUrlClicked);
    connect(ui.urlLineEdit, &QLineEdit::returnPressed, this, &RemoteControl::onUrlClicked);

    connect(ui.syncContentsButton, &QPushButton::clicked, this,
            [this] { sendCommand("SyncContents"_L1); });

    connect(ui.contentsCheckBox, &QCheckBox::toggled, this, [this](bool checked) {
        sendCommand(checked ? "Show Contents"_L1 : "Hide Contents"_L1);
    });
    connect(ui.indexCheckBox, &QCheckBox::toggled, this,
            [this](bool checked) { sendCommand(checked ? "Show Index"_L1 : "Hide Index"_L1); });
    connect(ui.bookmarksCheckBox, &QCheckBox::toggled, this, [this](bool checked) {
        sendCommand(checked ? "Show Bookmarks"_L1 : "Hide Bookmarks"_L1);
    });

    connect(ui.actionQuit, &QAction::triggered, this, &QMainWindow::close);

    const QString versionString = QString::number(QT_VERSION_MAJOR)
            + QString::number(QT_VERSION_MINOR) + QString::number(QT_VERSION_PATCH);
    ui.startUrlLineEdit->setText("qthelp://org.qt-project.qtdoc."_L1 + versionString
                                 + "/qdoc/qdoc-index.html"_L1);

    process = new QProcess(this);
    connect(process, &QProcess::finished, this, [this] {
        ui.launchButton->setEnabled(true);
        ui.startUrlLineEdit->setEnabled(true);
        ui.actionGroupBox->setEnabled(false);
    });
}

RemoteControl::~RemoteControl()
{
    if (process->state() == QProcess::Running) {
        process->terminate();
        process->waitForFinished(3000);
    }
}

void RemoteControl::onLaunchClicked()
{
    if (process->state() == QProcess::Running)
        return;

    QString app = QLibraryInfo::path(QLibraryInfo::BinariesPath);
#if !defined(Q_OS_MAC)
    app += "/assistant"_L1;
#else
    app += "/Assistant.app/Contents/MacOS/Assistant"_L1;
#endif

    process->start(app, {"-enableRemoteControl"_L1});
    if (!process->waitForStarted()) {
        QMessageBox::critical(this, tr("Remote Control"),
                tr("Could not start Qt Assistant from %1.").arg(QDir::toNativeSeparators(app)));
        return;
    }

    ui.contentsCheckBox->setChecked(true);
    ui.indexCheckBox->setChecked(true);
    ui.bookmarksCheckBox->setChecked(true);

    if (!ui.startUrlLineEdit->text().isEmpty())
        sendCommand("SetSource "_L1 + ui.startUrlLineEdit->text());

    ui.launchButton->setEnabled(false);
    ui.startUrlLineEdit->setEnabled(false);
    ui.actionGroupBox->setEnabled(true);
}

void RemoteControl::onIndexClicked()
{
    sendCommand("ActivateKeyword "_L1 + ui.indexLineEdit->text());
}

void RemoteControl::onIdClicked()
{
    sendCommand("ActivateIdentifier "_L1 + ui.idLineEdit->text());
}

void RemoteControl::onUrlClicked()
{
    sendCommand("SetSource "_L1 + ui.urlLineEdit->text());
}

void RemoteControl::sendCommand(const QString &cmd)
{
    if (process->state() != QProcess::Running)
        return;
    process->write(cmd.toLocal8Bit() + '\n');
}