#include "mainwindow.h" #include "ui_mainwindow.h" #include /* void MainWindow::onNetworkConfigurationChanged() { } */ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->menuBar->setVisible(false); qDebug() << "Using: " << this->qsettings.fileName(); this->qsystemtrayicon = new QSystemTrayIcon(this->windowIcon(), 0); this->qsystemtrayicon->show(); this->qsystemtrayicon->setContextMenu(ui->menuMenu1); this->qsystemtrayicon->setToolTip(this->windowTitle()); this->connect(this->qsystemtrayicon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(slotActivated(QSystemTrayIcon::ActivationReason))); this->updateSpaceList(); this->updateStatus(); this->timer = new QTimer(); this->connect(this->timer, SIGNAL(timeout()), this, SLOT(updateStatus())); // update every five minutes... this->timer->start(60000 * 5); //this->pixmap = new QPixmap(120, 120); //this->currentIcon = new QIcon(this->pixmap); this->mgr = new QNetworkConfigurationManager(); /* connect(this->mgr, SIGNAL(configurationChanged(const QNetworkConfiguration &)), this, SLOT(onNetworkConfigurationChanged())); */ /* connect(this->mgr, SIGNAL(configurationChanged(const QNetworkConfiguration &)), this, SLOT(onNetworkConfigurationChanged())); */ connect(this->mgr, &QNetworkConfigurationManager::configurationChanged, [=] { qDebug() << "configuration changed" << endl; if(this->mgr->isOnline()) { if(this->ui->comboBox->count() == 0) { this->updateSpaceList(); this->updateStatus(); } else this->updateStatus(); } }); connect(this->mgr, &QNetworkConfigurationManager::onlineStateChanged, [=] (bool b) { qDebug() << "QNetworkConfigurationManager::onlineStateChanged\n" << endl; if(!b) { this->qsystemtrayicon->setIcon(QIcon::fromTheme("network-error")); this->qsystemtrayicon->showMessage("Offline", "The network connection was lost :("); } }); } MainWindow::~MainWindow() { qDebug() << "unloading application"; delete this->qsystemtrayicon; delete this->timer; delete ui; } void MainWindow::updateSpaceList() { qDebug() << "updateSpaceList()"; QString defaultSpace = this->qsettings.value("hackerspace").toString(); QString defaultDirectoryURL = this->qsettings.value("directory").toString(); if(defaultDirectoryURL == "") { defaultDirectoryURL = "https://raw.githubusercontent.com/SpaceApi/OpenSpaceDirectory/master/directory.json" ; } QUrl url(defaultDirectoryURL); QJsonObject json = QJsonDocument::fromJson(this->download(url)).object(); ui->comboBox->setDisabled(true); QJsonObject::Iterator it; for(it=json.begin(); it!=json.end(); it++) { //qDebug() << it.key() << "\t" << it.value().toString(); ui->comboBox->addItem(it.key(), it.value().toString()); if(it.key() == defaultSpace) ui->comboBox->setCurrentIndex(ui->comboBox->count()-1); } ui->comboBox->setDisabled(false); } QJsonObject json_find(QJsonObject json, QStringList list) { QJsonObject retval = json; foreach(const QString str, list) if(retval.contains(str)) retval = retval[str].toObject(); else return QJsonObject(); return retval; } // lets not talk about memory leaks. yes, they are there. but it works somehow. void MainWindow::updateStatus() { //QUrl url("http://hackerspace-bielefeld.de/spacestatus/status.json"); qDebug() << ui->comboBox->currentData().toString(); ui->label_url_json->setText(ui->comboBox->currentData().toString()); QUrl url(ui->comboBox->currentData().toString()); QJsonDocument doc = QJsonDocument::fromJson(this->download(url)); //ui->plainTextEdit->setPlainText(doc.toJson(QJsonDocument::Indented)); //qDebug() << doc.toJson(QJsonDocument::Indented); QJsonObject json = doc.object(); foreach (QLabel *label, this->findChildren()) { if(label->statusTip().isEmpty()) continue; label->clear(); //label->setText(""); QStringList list = label->statusTip().split("/"); QString name = list.takeLast(); QJsonObject obj = json_find(json, list); if(!obj.isEmpty()) { if(obj.value(name).isString()) { QString result = obj.value(name).toString(); if(name == "logo" || result.endsWith(".png") || result.endsWith(".jpg")) { label->setPixmap( QPixmap::fromImage( QImage::fromData( this->download( QUrl(result)))).scaled(120, 120, Qt::KeepAspectRatio)); } else if(result.contains("http")) { label->setText("" + name + ":
" + result + " "); label->setOpenExternalLinks(true); } else label->setText("" + name + ":
" + result); } else { if(obj.value(name).isBool()) label->setText("" + name + ":
" + (obj.value(name).toBool() ? "true" : "false")); else if(name == "lastchange") label->setText("" + name + ":
" + QDateTime::fromTime_t(obj.value(name).toInt()).toLocalTime().toString()); } } qDebug() << "NAME: " << name; } QString strUrl; strUrl = json["state"].toObject() ["icon"].toObject() [json["state"].toObject()["open"].toBool() ? "open" : "closed"].toString(); if(strUrl == "") strUrl = json["icon"].toObject() [json["state"].toObject()["open"].toBool() ? "open" : "closed"].toString(); qDebug() << "downloading: " << strUrl; this->qsystemtrayicon->setIcon(QIcon( QPixmap::fromImage( QImage::fromData( this->download( QUrl(strUrl)))).scaled(120, 120, Qt::KeepAspectRatio))); if(this->qsystemtrayicon->icon().isNull()) { if(json["state"].toObject().contains("open")) if(json["state"].toObject()["open"].toBool()) this->qsystemtrayicon->setIcon(QIcon::fromTheme("face-smile")); else this->qsystemtrayicon->setIcon(QIcon::fromTheme("face-sad")); else this->qsystemtrayicon->setIcon(QIcon::fromTheme("face-sick")); } } void MainWindow::saveSettings() { this->qsettings.setValue("hackerspace", ui->comboBox->currentText()); } QByteArray MainWindow::download(QUrl url) { qDebug() << "downloading: " << url.toString(); QNetworkAccessManager manager; QNetworkReply *response = manager.get(QNetworkRequest(QUrl(url))); QEventLoop event; connect(response, SIGNAL(finished()), &event, SLOT(quit())); connect(response, &QNetworkReply::sslErrors, [=](const QList& errors) { qDebug() << errors[0].errorString(); // many of us use self-signed certificates or they have expired. // this should not matter here, therefore ignore... response->ignoreSslErrors(); } ); connect(response, static_cast(&QNetworkReply::error), [=](QNetworkReply::NetworkError) { qDebug() << "NetworkError!"; // code.errorString(); //qDebug() << ; qDebug() << response->errorString(); } ); event.exec(); if (response->error() == QNetworkReply::NoError) { int statusCode = response->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); qDebug() << "Status: " << statusCode; switch(statusCode) { case 301: case 302: case 303: return this->download(response->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl()); break; } } return response->readAll(); } void MainWindow::slotActivated(QSystemTrayIcon::ActivationReason reason) { qDebug() << "trigger"; if(reason == QSystemTrayIcon::Trigger) { if(this->isVisible()) this->hide(); else { this->setWindowState(Qt::WindowNoState); this->show(); this->activateWindow(); } } else { qDebug() << "activate(reason): " << reason; } } void MainWindow::exitApplication() { qDebug() << "exit now!"; QApplication::quit(); } void MainWindow::on_comboBox_currentIndexChanged(const QString &arg1) { qDebug() << arg1; if(ui->comboBox->isEnabled()) { this->updateStatus(); this->saveSettings(); } }