File indexing completed on 2024-04-28 09:36:10

0001 /*
0002     SPDX-FileCopyrightText: 2011 Vishesh Yadav <vishesh3y@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "servedialog.h"
0008 #include "servewrapper.h"
0009 #include "fileviewhgpluginsettings.h"
0010 #include "hgwrapper.h"
0011 
0012 #include <QSpinBox>
0013 #include <QTextEdit>
0014 #include <QLabel>
0015 #include <QDesktopServices>
0016 #include <KLocalizedString>
0017 #include <KMessageBox>
0018 
0019 HgServeDialog::HgServeDialog(QWidget *parent) :
0020     DialogBase(QDialogButtonBox::NoButton)
0021 {
0022     Q_UNUSED(parent)
0023     // dialog properties
0024     this->setWindowTitle(xi18nc("@title:window",
0025                 "<application>Hg</application> Serve"));
0026 
0027     //
0028     m_serverWrapper = HgServeWrapper::instance();
0029 
0030     //
0031     setupUI();
0032     loadConfig();
0033 
0034     // Load saved settings
0035     FileViewHgPluginSettings *settings = FileViewHgPluginSettings::self();
0036     this->resize(QSize(settings->serveDialogWidth(),
0037                                settings->serveDialogHeight()));
0038 
0039     // connections
0040     connect(this, SIGNAL(finished(int)), this, SLOT(saveGeometry()));
0041     connect(m_startButton, &QAbstractButton::clicked, this, &HgServeDialog::slotStart);
0042     connect(m_stopButton, &QAbstractButton::clicked, this, &HgServeDialog::slotStop);
0043     connect(m_browseButton, &QAbstractButton::clicked, this, &HgServeDialog::slotBrowse);
0044     connect(m_serverWrapper, &HgServeWrapper::finished,
0045             this, &HgServeDialog::slotUpdateButtons);
0046     connect(m_serverWrapper, &HgServeWrapper::started,
0047             this, &HgServeDialog::slotUpdateButtons);
0048     connect(m_serverWrapper, &HgServeWrapper::error,
0049             this, &HgServeDialog::slotUpdateButtons);
0050     connect(m_serverWrapper, &HgServeWrapper::error,
0051             this, &HgServeDialog::slotServerError);
0052     connect(m_serverWrapper, &HgServeWrapper::readyReadLine,
0053             this, &HgServeDialog::appendServerOutput);
0054 }
0055 
0056 void HgServeDialog::setupUI()
0057 {
0058     m_portNumber = new QSpinBox;
0059     m_portNumber->setMinimum(0);
0060     m_portNumber->setMaximum(65535);
0061     m_portNumber->setValue(8000);
0062 
0063     m_startButton = new QPushButton(xi18nc("@label:button", "Start Server"));
0064     m_stopButton = new QPushButton(xi18nc("@label:button", "Stop Server"));
0065     m_browseButton = new QPushButton(xi18nc("@label:button", "Open in browser"));
0066     m_browseButton->setDisabled(true);
0067 
0068     m_logEdit = new QTextEdit;
0069     m_repoPathLabel = new QLabel;
0070     m_logEdit->setReadOnly(true);
0071     m_logEdit->setFontFamily(QLatin1String("Monospace"));
0072 
0073     QVBoxLayout *buttonLayout = new QVBoxLayout;
0074     buttonLayout->addWidget(m_startButton);
0075     buttonLayout->addWidget(m_stopButton);
0076     buttonLayout->addStretch(1);
0077     buttonLayout->addWidget(m_browseButton);
0078     buttonLayout->addStretch(2);
0079 
0080     QHBoxLayout *portLayout = new QHBoxLayout;
0081     portLayout->addWidget(new QLabel(xi18nc("@label", "Port")));
0082     portLayout->addWidget(m_portNumber);
0083     portLayout->addStretch();
0084 
0085     QHBoxLayout *midLayout = new QHBoxLayout;
0086     midLayout->addWidget(m_logEdit);
0087     midLayout->addLayout(buttonLayout);
0088 
0089     QVBoxLayout *lay = new QVBoxLayout;
0090     lay->addWidget(m_repoPathLabel);
0091     lay->addLayout(portLayout);
0092     lay->addLayout(midLayout);
0093 
0094     layout()->insertLayout(0, lay);
0095 }
0096 
0097 void HgServeDialog::loadConfig()
0098 {
0099     HgWrapper *hgw = HgWrapper::instance();
0100     m_repoPathLabel->setText(QLatin1String("<b>") + hgw->getBaseDir() + QLatin1String("</b>"));
0101 
0102     slotUpdateButtons();
0103 }
0104 
0105 void HgServeDialog::slotUpdateButtons()
0106 {
0107     if (m_serverWrapper->running(HgWrapper::instance()->getBaseDir())) {
0108         m_startButton->setEnabled(false);
0109         m_stopButton->setEnabled(true);
0110         m_portNumber->setEnabled(false);
0111     }
0112     else {
0113         m_startButton->setEnabled(true);
0114         m_stopButton->setEnabled(false);
0115         m_portNumber->setEnabled(true);
0116         m_serverWrapper->cleanUnused();
0117     }
0118 }
0119 
0120 void HgServeDialog::slotStart()
0121 {
0122     m_serverWrapper->startServer(HgWrapper::instance()->getBaseDir(),
0123                                  m_portNumber->value());
0124     m_browseButton->setDisabled(false);
0125 }
0126 
0127 void HgServeDialog::slotStop()
0128 {
0129     m_serverWrapper->stopServer(HgWrapper::instance()->getBaseDir());
0130     m_browseButton->setDisabled(true);
0131 }
0132 
0133 void HgServeDialog::slotBrowse()
0134 {
0135     QDesktopServices::openUrl(QUrl(QStringLiteral("http://localhost:%1").
0136         arg(m_portNumber->value())));
0137 }
0138 
0139 
0140 void HgServeDialog::slotServerError()
0141 {
0142     m_serverWrapper->cleanUnused();
0143 }
0144 
0145 void HgServeDialog::appendServerOutput(const QString &repoLocation, const QString &line) 
0146 {
0147     if (HgWrapper::instance()->getBaseDir() == repoLocation) {
0148         m_logEdit->append(line);
0149     }
0150 }
0151 
0152 void HgServeDialog::saveGeometry()
0153 {
0154     FileViewHgPluginSettings *settings = FileViewHgPluginSettings::self();
0155     settings->setServeDialogHeight(this->height());
0156     settings->setServeDialogWidth(this->width());
0157     settings->save();
0158 }
0159 
0160 
0161 
0162 
0163 #include "moc_servedialog.cpp"