#include "dialog.h"
#include <QMessageBox>
#include <QDebug>
#include <QRegExp>
#include <QFile>
#include <QProcess>
#include <QTimer>
#include <QDesktopWidget>
#include "ui_dialog.h"
#include "save_restore_session.h"
#include "sessiontreeitem.h"
#include "globals.h"
#include "vsession.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent), ui(new Ui::Dialog) {
model_ = new SessionTreeModel(parent);
ui->setupUi(this);
pvsSettings_ = NULL;
ui->PVSOptionsGroupBox->hide();
// Re-center dialog every second to account for resolution changes
QRect desktopRect = QApplication::desktop()->availableGeometry(this);
oldCenter_ = desktopRect.center();
centerTimer_ = new QTimer(this);
connect(centerTimer_, SIGNAL(timeout()), this, SLOT(on_centerTimer()));
centerTimer_->start(1000);
}
Dialog::~Dialog() {
delete ui;
delete model_;
}
void Dialog::changeEvent(QEvent *e) {
QDialog::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void Dialog::on_treeView_activated(QModelIndex index) {
// this method gets called when a Session has been activated
SessionTreeItem* item =
static_cast<SessionTreeItem*>(index.internalPointer());
const Session* s(item->session());
if (!s) {
// no valid session has been selected, do nothing
return;
}
// Run session start script
if (QFile::exists(sessionStartScript)) {
QProcess scriptProcess;
scriptProcess.start(sessionStartScript, QIODevice::ReadOnly);
scriptProcess.waitForFinished();
scriptProcess.close();
}
if (s->run()) {
writePVSSettings();
writeSessionName(s->shortDescription());
setVisible(false);
} else {
QMessageBox::warning(
this, trUtf8("vmchooser"),
trUtf8("Vmchooser failed to run the selected session!"));
}
}
void Dialog::addItems(const QList<Session*>& entries, const QString& section) {
this->model_->addItems(entries, section);
ui->treeView->setModel(model_);
ui->treeView->expandAll();
}
void Dialog::on_pushButtonAbort_clicked() {
close();
}
void Dialog::on_pushButtonStart_clicked() {
this->on_treeView_activated(ui->treeView->selectionModel()->currentIndex());
}
void Dialog::readPVSSettings() {
if (!pvsSettings_) return;
QString value;
value = pvsSettings_->value("Permissions/vnc_lecturer").toString();
if (value == "rw") {
ui->comboBoxLecturer->setCurrentIndex(2);
} else if (value == "ro") {
ui->comboBoxLecturer->setCurrentIndex(1);
} else {
ui->comboBoxLecturer->setCurrentIndex(0);
}
value = pvsSettings_->value("Permissions/vnc_other").toString();
if (value == "rw") {
ui->comboBoxOthers->setCurrentIndex(2);
} else if (value == "ro") {
ui->comboBoxOthers->setCurrentIndex(1);
} else {
ui->comboBoxOthers->setCurrentIndex(0);
}
}
void Dialog::writePVSSettings() {
if (!pvsSettings_) return;
int accessLecturer = ui->comboBoxLecturer->currentIndex();
if (accessLecturer == 2) {
pvsSettings_->setValue("Permissions/vnc_lecturer", "rw");
} else if (accessLecturer == 1) {
pvsSettings_->setValue("Permissions/vnc_lecturer", "ro");
} else {
pvsSettings_->setValue("Permissions/vnc_lecturer", "no");
}
int accessOthers = ui->comboBoxOthers->currentIndex();
if (accessOthers == 2) {
pvsSettings_->setValue("Permissions/vnc_other", "rw");
} else if (accessOthers == 1) {
pvsSettings_->setValue("Permissions/vnc_other", "ro");
} else {
pvsSettings_->setValue("Permissions/vnc_other", "no");
}
pvsSettings_->sync();
}
void Dialog::on_comboBoxLecturer_currentIndexChanged(int index) {
// TODO (Jan): may others have more access than lecturer?
if (index < ui->comboBoxOthers->currentIndex()) {
ui->comboBoxOthers->setCurrentIndex(index);
}
}
void Dialog::on_comboBoxOthers_currentIndexChanged(int index) {
// TODO (Jan): may others have more access than lecturer?
if (index > ui->comboBoxLecturer->currentIndex()) {
ui->comboBoxLecturer->setCurrentIndex(index);
}
}
bool Dialog::selectSession(const QString& name) {
QModelIndex root(ui->treeView->rootIndex());
for (int i = 0; i < model_->rowCount(root); ++i) {
QModelIndex section = model_->index(i, 0, root);
if (!section.isValid()) break;
for (int row = 0; row < model_->rowCount(section); ++row) {
QModelIndex index = model_->index(row, 0, section);
if (!index.isValid()) break;
SessionTreeItem* item =
static_cast<SessionTreeItem*>(index.internalPointer());
const Session* s(item->session());
if (!s) continue;
if (s->shortDescription() == name) {
ui->treeView->selectionModel()
->setCurrentIndex(index, QItemSelectionModel::Select);
return true;
}
}
}
return false;
}
void Dialog::selectPreviousSession() {
selectSession(readSessionName());
}
void Dialog::startSession(const QString& name) {
autoStartEntry_ = name;
}
void Dialog::showSettingsPVS() {
pvsSettings_ = new QSettings("openslx", "pvs", this);
QStringList accessOptions;
accessOptions <<trUtf8("None") << trUtf8("View Only") << trUtf8("Full");
ui->comboBoxLecturer->insertItems(0, accessOptions);
ui->comboBoxOthers->insertItems(0, accessOptions);
readPVSSettings();
ui->PVSOptionsGroupBox->show();
}
void Dialog::setTheme() {
QString label_l_style, label_r_style;
QString backgroundColor, imageLeft, imageRight;
QString themePathBase, themePathIni, themePathImgLeft, themePathImgRight;
if (theme.isEmpty()) return;
themePathBase = QString("%1/%2/").arg(VMCHOOSER_THEME_BASE).arg(theme);
themePathIni = QString("%1%2.ini").arg(themePathBase).arg(theme);
if (!QFile::exists(themePathIni)) return;
QSettings themeSettings(themePathIni, QSettings::IniFormat);
backgroundColor = themeSettings.value("background-color").toString();
imageLeft = themeSettings.value("image-left").toString();
imageRight = themeSettings.value("image-right").toString();
themePathImgLeft = QString("%1%2").arg(themePathBase).arg(imageLeft);
themePathImgRight = QString("%1%2").arg(themePathBase).arg(imageRight);
QRegExp re;
ui->label_l->setPixmap(QPixmap(themePathImgLeft));
ui->label_r->setPixmap(QPixmap(themePathImgRight));
label_l_style = ui->label_l->styleSheet();
label_r_style = ui->label_r->styleSheet();
backgroundColor.prepend("\\1").append("\\2");
label_l_style.replace(QRegExp("(.*background-color:)#[^;]*(;.*)"), backgroundColor);
label_r_style.replace(QRegExp("(.*background-color:)#[^;]*(;.*)"), backgroundColor);
//qDebug() << label_r_style << label_l_style;
ui->label_l->setStyleSheet(label_l_style);
ui->label_r->setStyleSheet(label_r_style);
}
void Dialog::on_centerTimer() {
if (!autoStartEntry_.isEmpty()) {
if (this->selectSession(autoStartEntry_)) {
this->on_treeView_activated(ui->treeView->selectionModel()->currentIndex());
} else {
QMessageBox::critical(this, "Autostart", QString::fromUtf8("Konnte %1 nicht starten.").arg(autoStartEntry_));
}
autoStartEntry_.clear();
return;
}
// center dialog on primary screen
QRect desktopRect = QApplication::desktop()->availableGeometry(this);
QPoint center = desktopRect.center();
if (center != oldCenter_) {
this->move(center.x() - this->width() / 2, center.y() - this->height() / 2);
oldCenter_ = center;
}
}
void Dialog::addSessionsAfterDownload(QNetworkReply* reply) {
if (reply->error() != QNetworkReply::NoError) {
qDebug() << "Error reading from URL: " << reply->error();
return;
}
QString xml_doc(reply->readAll());
QFile file("/tmp/vmchooser2.xml");
if (!file.open(QIODevice::WriteOnly)) {
if (debugMode) {
qDebug() << "Could not write XML to /tmp";
}
return;
}
QByteArray data = xml_doc.toUtf8();
if (file.write(data) != data.length()) {
return;
}
file.close();
this->addItems(VSession::readXmlFile(file.fileName()), QCoreApplication::instance()->translate("Dialog", "Virtual Sessions"));
}