diff options
Diffstat (limited to 'src/dialog.cpp')
-rw-r--r-- | src/dialog.cpp | 103 |
1 files changed, 86 insertions, 17 deletions
diff --git a/src/dialog.cpp b/src/dialog.cpp index aea2d6e..9dfff00 100644 --- a/src/dialog.cpp +++ b/src/dialog.cpp @@ -12,9 +12,9 @@ #include <QTemporaryFile> #include <QUrlQuery> -#include "unistd.h" -#include "stdio.h" -#include "sys/wait.h" +#include <unistd.h> +#include <stdio.h> +#include <sys/wait.h> #include "ui_dialog.h" #include "sessiontreeitem.h" @@ -95,8 +95,10 @@ Dialog::Dialog(QWidget *parent) this->onTabButtonChanged(TAB_NATIVE); } - ui->chkAdminMode->setVisible(Config::isSet(Config::ALLOW_VM_EDIT)); - ui->chkAdminMode->setEnabled(false); + ui->chkAdminEdit->setVisible(Config::isSet(Config::ALLOW_VM_EDIT)); + ui->chkAdminEdit->setEnabled(false); + ui->chkAdminCopy->setVisible(Config::isSet(Config::ALLOW_VM_EDIT)); + ui->chkAdminCopy->setEnabled(false); ui->btnScreenSetup->setVisible(isProcessRunning("beamergui")); if (QApplication::screens().size() > 1) { @@ -110,6 +112,16 @@ Dialog::Dialog(QWidget *parent) QObject::connect(SessionsIconHolder::get(), &SessionsIconHolder::iconDownloaded, this, &Dialog::iconDownloaded); + QObject::connect(ui->chkAdminCopy, &QCheckBox::toggled, [this](bool checked) { + if (checked) { + ui->chkAdminEdit->setChecked(false); + } + }); + QObject::connect(ui->chkAdminEdit, &QCheckBox::toggled, [this](bool checked) { + if (checked) { + ui->chkAdminCopy->setChecked(false); + } + }); } Dialog::~Dialog() { @@ -143,6 +155,21 @@ void Dialog::on_treeView_doubleClicked(const QModelIndex& index) if (!s->prepareRun()) return; + bool adminMode = false; + + if (anyEditModeRequested() && s->canEdit()) { + auto mode = s->editModeTypes(); + adminMode = true; + if (ui->chkAdminEdit->isChecked() && ui->chkAdminEdit->isEnabled()) { + setenv("VMCHOOSER_ADMIN_TYPE", "EDIT", 1); + } else { + setenv("VMCHOOSER_ADMIN_TYPE", "COPY", 1); + } + if (Config::isSet(Config::COW_TOKEN)) { + setenv("VMCHOOSER_ADMIN_TOKEN", Config::get(Config::COW_TOKEN).toLocal8Bit().constData(), 1); + } + } + WindowManager::stopOwnInstance(true); // These two are up here in case run-virt cares... @@ -153,7 +180,12 @@ void Dialog::on_treeView_doubleClicked(const QModelIndex& index) setenv("PVS_AUTO_CONNECT", "FALSE", 1); } } - if (ui->chkAdminMode->isEnabled() && ui->chkAdminMode->isChecked()) { + + if (anyEditModeRequested() && Config::isSet(Config::ALLOW_VM_EDIT)) { + adminMode = true; + } + + if (adminMode) { setenv("VMCHOOSER_ADMIN_MODE", "TRUE", 1); } else { setenv("VMCHOOSER_ADMIN_MODE", "FALSE", 1); @@ -198,6 +230,12 @@ void Dialog::on_treeView_doubleClicked(const QModelIndex& index) QApplication::instance()->quit(); } +bool Dialog::anyEditModeRequested() const +{ + return (ui->chkAdminEdit->isEnabled() && ui->chkAdminEdit->isChecked()) + || (ui->chkAdminCopy->isEnabled() && ui->chkAdminCopy->isChecked()); +} + void Dialog::on_treeView_expanded(const QModelIndex& index) { if (activeTab_ != TAB_ALL_VMS) return; @@ -457,26 +495,42 @@ void Dialog::onCenterTimer() { /** * Download lecture list, news and help */ -void Dialog::downloadData(const QString& locationIds) { +void Dialog::downloadData() { QUrl listUrl(Config::isSet(Config::URL_LIST) ? Config::get(Config::URL_LIST) : Config::get(Config::URL_BASE).append("/list")); QUrlQuery listQuery(listUrl); + bool cache = true; + const QString& locationIds = Config::get(Config::LOCATIONS); + const QString& cowToken = Config::get(Config::COW_TOKEN); if (!locationIds.isEmpty()) { listQuery.addQueryItem("locations", locationIds); } + if (!cowToken.isEmpty()) { + // Don't cache lecture list containing edit mode annotations + listQuery.addQueryItem("cow-user", cowToken); + cache = false; + } if (Config::isSet(Config::EXAM_MODE)) { listQuery.addQueryItem("exams", "exam-mode"); } listUrl.setQuery(listQuery); // // Download lecture XML - FileDownloader::download(listUrl, [this](QNetworkReply::NetworkError err, const QByteArray& data) { + FileDownloader::download(listUrl, [cache, this](QNetworkReply::NetworkError err, const QByteArray& data) { QList<Session*> sessions; - QDomDocument doc = toDomDocument(QStringLiteral("lecture list"), data, TEMP_PATH_XML_LIST, QStringLiteral("settings")); + QDomDocument doc = toDomDocument(QStringLiteral("lecture list"), data, cache ? TEMP_PATH_XML_LIST : QString(), + QStringLiteral("settings")); sessions = VSession::loadFromXmlDocument(doc); + QString errMsg = doc.firstChildElement(QStringLiteral("settings")) + .firstChildElement(QStringLiteral("error")).text(); + + if (!errMsg.isEmpty()) { + ui->filterEdit->setText(errMsg); + } + this->removeStatusString(STR_LOADING); if (sessions.isEmpty()) { if (err == QNetworkReply::NoError) { @@ -489,13 +543,14 @@ void Dialog::downloadData(const QString& locationIds) { this->addItems(sessions, TAB_ALL_VMS); bool showEdit = false; // Only show edit button if at least one lecture is editable for (QList<Session*>::const_iterator it = sessions.begin(); it != sessions.end(); ++it) { - if (reinterpret_cast<VSession*>(*it)->canEdit()) { + if ((**it).canEdit()) { showEdit = true; break; } } if (showEdit) { - ui->chkAdminMode->setVisible(true); + ui->chkAdminEdit->setVisible(true); + ui->chkAdminCopy->setVisible(true); } } @@ -559,11 +614,16 @@ void Dialog::mousePressEvent(QMouseEvent * event) { userInteracted_ = true; } +void Dialog::setAdminChecks(int mode) +{ + ui->chkAdminEdit->setEnabled((mode & Session::EDIT_TYPE_EDIT) != 0); + ui->chkAdminCopy->setEnabled((mode & Session::EDIT_TYPE_COPY) != 0); +} + void Dialog::treeView_selectionChanged(const QModelIndex& current, const QModelIndex&) { - SessionTreeItem* item = - static_cast<SessionTreeItem*>(current.internalPointer()); + SessionTreeItem* item = static_cast<SessionTreeItem*>(current.internalPointer()); if (item == nullptr) { - ui->chkAdminMode->setEnabled(false); + setAdminChecks(0); return; } @@ -571,7 +631,7 @@ void Dialog::treeView_selectionChanged(const QModelIndex& current, const QModelI if (!s) { qDebug() << "invalid selection"; // no valid session has been selected, do nothing - ui->chkAdminMode->setEnabled(false); + setAdminChecks(0); return; } @@ -588,8 +648,12 @@ void Dialog::treeView_selectionChanged(const QModelIndex& current, const QModelI ui->label_platform->setText(vs->getAttribute("virtualizer_name", "param")); ui->label_platform->setToolTip(vs->getAttribute("virtualizer_name", "param")); - // TODO: This is a bug? vs->canEdit() seems completely pointless right now... - ui->chkAdminMode->setEnabled(vs->canEdit() || Config::isSet(Config::ALLOW_VM_EDIT)); + // If ALLOW_EDIT is false, we still might have editable sessions if the list meta data says so + if (Config::isSet(Config::ALLOW_VM_EDIT)) { + setAdminChecks(255); + } else { + setAdminChecks(s->editModeTypes()); + } if (vs->keywords().length() > 0) { description = "\n\nKeywords: "; @@ -603,6 +667,7 @@ void Dialog::treeView_selectionChanged(const QModelIndex& current, const QModelI ui->label_os->setText(QCoreApplication::instance()->translate("Dialog", "Native Linux")); ui->label_platform->setText("Linux"); ui->label_platform->setToolTip(""); + setAdminChecks(0); } ui->label_name->setText(s->shortDescription()); ui->label_name->setToolTip(s->shortDescription()); @@ -877,6 +942,10 @@ static QDomDocument toDomDocument(const QString& what, const QByteArray& data, c } else { qDebug() << "No content downloaded for" << what; } + // No backup file given, just return what we got + if (backupFile.isEmpty()) + return doc; + QFile backup(backupFile); if (doc.isNull() || !doc.hasChildNodes()) { if (backup.open(QFile::ReadOnly)) { |