diff options
-rw-r--r-- | main.cpp | 9 | ||||
-rw-r--r-- | mainwindow.cpp | 148 | ||||
-rw-r--r-- | mainwindow.h | 12 | ||||
-rw-r--r-- | mainwindow.ui | 139 | ||||
-rw-r--r-- | qspaceapi.pro (renamed from qtapp.pro) | 3 |
5 files changed, 261 insertions, 50 deletions
@@ -1,10 +1,19 @@ | |||
1 | #include "mainwindow.h" | 1 | #include "mainwindow.h" |
2 | |||
2 | #include <QApplication> | 3 | #include <QApplication> |
4 | #include <QMetaObject> | ||
5 | |||
3 | 6 | ||
4 | int main(int argc, char *argv[]) | 7 | int main(int argc, char *argv[]) |
5 | { | 8 | { |
6 | QApplication a(argc, argv); | 9 | QApplication a(argc, argv); |
10 | a.setOrganizationName("CoderOnline"); | ||
7 | a.setQuitOnLastWindowClosed(false); | 11 | a.setQuitOnLastWindowClosed(false); |
8 | MainWindow w; | 12 | MainWindow w; |
13 | |||
14 | |||
15 | |||
9 | return a.exec(); | 16 | return a.exec(); |
10 | } | 17 | } |
18 | |||
19 | |||
diff --git a/mainwindow.cpp b/mainwindow.cpp index 0dd8a3e..2590d4f 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp | |||
@@ -5,81 +5,152 @@ | |||
5 | MainWindow::MainWindow(QWidget *parent) : | 5 | MainWindow::MainWindow(QWidget *parent) : |
6 | QMainWindow(parent), | 6 | QMainWindow(parent), |
7 | ui(new Ui::MainWindow) | 7 | ui(new Ui::MainWindow) |
8 | |||
9 | { | 8 | { |
10 | ui->setupUi(this); | 9 | ui->setupUi(this); |
10 | ui->menuBar->setVisible(false); | ||
11 | 11 | ||
12 | QIcon* icon = new QIcon("folder.png"); | 12 | qDebug() << "Using: " << this->qsettings.fileName(); |
13 | this->qsystemtrayicon = new QSystemTrayIcon(*icon, this); | ||
14 | this->setWindowIcon(*icon); | ||
15 | 13 | ||
14 | this->qsystemtrayicon = new QSystemTrayIcon(this->windowIcon(), 0); | ||
16 | this->qsystemtrayicon->show(); | 15 | this->qsystemtrayicon->show(); |
17 | this->qsystemtrayicon->setContextMenu(ui->menuMenu1); | 16 | this->qsystemtrayicon->setContextMenu(ui->menuMenu1); |
18 | //this->connect(this, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(systray_clicked(QSystemTrayIcon::ActivationReason))); | 17 | this->qsystemtrayicon->setToolTip(this->windowTitle()); |
19 | this->connect(qsystemtrayicon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(slotActivated(QSystemTrayIcon::ActivationReason))); | 18 | this->connect(this->qsystemtrayicon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(slotActivated(QSystemTrayIcon::ActivationReason))); |
19 | this->updateStatus(); | ||
20 | this->updateSpaceList(this->qsettings.value("hackerspace").toString()); | ||
20 | 21 | ||
21 | //this->qsystemtrayicon->installEventFilter(this); | ||
22 | 22 | ||
23 | //this->qsystemtrayicon->setIcon(this->windowIcon()); | ||
24 | this->qsystemtrayicon->setToolTip(this->windowTitle()); | ||
25 | 23 | ||
26 | QUrl url("http://hackerspace-bielefeld.de/spacestatus/status.json"); | 24 | this->timer = new QTimer(); |
25 | this->connect(this->timer, SIGNAL(timeout()), this, SLOT(updateStatus())); | ||
26 | // update every five minutes... | ||
27 | this->timer->start(60000 * 5); | ||
28 | |||
29 | } | ||
30 | |||
31 | MainWindow::~MainWindow() | ||
32 | { | ||
33 | delete ui; | ||
34 | } | ||
35 | |||
36 | void MainWindow::updateSpaceList(QString defaultSpace) | ||
37 | { | ||
38 | QUrl url("http://spaceapi.net/directory.json"); | ||
39 | QJsonObject json = QJsonDocument::fromJson(this->download(url)).object(); | ||
40 | |||
41 | QJsonObject::Iterator it; | ||
42 | for(it=json.begin(); it!=json.end(); it++) | ||
43 | { | ||
44 | //qDebug() << it.key() << "\t" << it.value().toString(); | ||
45 | ui->comboBox->addItem(it.key(), it.value().toString()); | ||
46 | if(it.key() == defaultSpace) | ||
47 | ui->comboBox->setCurrentIndex(ui->comboBox->count()-1); | ||
48 | } | ||
49 | |||
50 | } | ||
51 | |||
52 | // lets not talk about memory leaks. yes, they are there. but it works somehow. | ||
53 | void MainWindow::updateStatus() | ||
54 | { | ||
55 | //QUrl url("http://hackerspace-bielefeld.de/spacestatus/status.json"); | ||
56 | qDebug() << ui->comboBox->currentData().toString(); | ||
57 | ui->label_url_json->setText(ui->comboBox->currentData().toString()); | ||
58 | |||
59 | QUrl url(ui->comboBox->currentData().toString()); | ||
27 | QByteArray rawData = this->download(url); | 60 | QByteArray rawData = this->download(url); |
28 | QJsonDocument doc = QJsonDocument::fromJson(rawData); | ||
29 | //qDebug() << rawData; | 61 | //qDebug() << rawData; |
30 | //qDebug() << doc.toJson(QJsonDocument::Compact); | 62 | QJsonDocument doc = QJsonDocument::fromJson(rawData); |
63 | ui->plainTextEdit->setPlainText(doc.toJson(QJsonDocument::Indented)); | ||
31 | 64 | ||
65 | //qDebug() << doc.toJson(QJsonDocument::Indented); | ||
32 | QJsonObject json = doc.object(); | 66 | QJsonObject json = doc.object(); |
33 | |||
34 | QString strUrl; | 67 | QString strUrl; |
35 | if(json["state/open"].toBool()) | 68 | strUrl = json["state"].toObject() |
36 | { | 69 | ["icon"].toObject() |
37 | strUrl = json["state"].toObject()["icon"].toObject()["open"].toString(); | 70 | [json["state"].toObject()["open"].toBool() ? "open" : "closed"].toString(); |
38 | this->qsystemtrayicon->showMessage("Hackerspace Bielefeld", "Der Space ist nun geƶffnet!"); | 71 | if(strUrl == "") |
39 | } | 72 | strUrl = json["icon"].toObject() |
40 | else | 73 | [json["state"].toObject()["open"].toBool() ? "open" : "closed"].toString(); |
41 | { | 74 | |
42 | strUrl = json["state"].toObject()["icon"].toObject()["closed"].toString(); | 75 | |
43 | this->qsystemtrayicon->showMessage("Hackerspace Bielefeld", "Der Space ist nun geschlossen!"); | ||
44 | } | ||
45 | 76 | ||
46 | qDebug() << "downloading: " << strUrl; | 77 | qDebug() << "downloading: " << strUrl; |
47 | QByteArray imageArray = this->download(QUrl(strUrl)); | 78 | this->imageArray = this->download(QUrl(strUrl)); |
48 | //qDebug("test: " + imageArray.size()); | 79 | //qDebug("test: " + imageArray.size()); |
49 | QImage image = QImage::fromData(imageArray); | 80 | QImage image = QImage::fromData(imageArray); |
50 | 81 | ||
51 | this->currentIcon = new QIcon(QPixmap::fromImage(image)); | 82 | this->currentIcon = new QIcon(QPixmap::fromImage(image)); |
52 | this->setWindowIcon(*currentIcon); | ||
53 | this->qsystemtrayicon->setIcon(*currentIcon); | 83 | this->qsystemtrayicon->setIcon(*currentIcon); |
54 | this->setWindowTitle("closed"); | ||
55 | 84 | ||
56 | qDebug() << json["state", "open"]; | 85 | //QPixmap* pixmap = new QPixmap("/home/max/folder.png"); |
86 | QUrl logoURL(json["logo"].toString()); | ||
87 | //qDebug() << "logo: " << logoURL.toString(); | ||
88 | QPixmap pixmap = QPixmap::fromImage(QImage::fromData(this->download(logoURL))); | ||
89 | ui->label_icon->setPixmap(pixmap.scaled(120, 120, Qt::KeepAspectRatio)); | ||
57 | } | 90 | } |
58 | 91 | ||
59 | MainWindow::~MainWindow() | 92 | void MainWindow::saveSettings() |
60 | { | 93 | { |
61 | delete ui; | 94 | this->qsettings.setValue("hackerspace", ui->comboBox->currentText()); |
62 | } | 95 | } |
63 | 96 | ||
97 | |||
98 | |||
64 | QByteArray MainWindow::download(QUrl url) | 99 | QByteArray MainWindow::download(QUrl url) |
65 | { | 100 | { |
101 | qDebug() << "downloading: " << url.toString(); | ||
66 | QNetworkAccessManager manager; | 102 | QNetworkAccessManager manager; |
67 | QNetworkReply *response = manager.get(QNetworkRequest(QUrl(url))); | 103 | QNetworkReply *response = manager.get(QNetworkRequest(QUrl(url))); |
68 | QEventLoop event; | 104 | QEventLoop event; |
69 | connect(response,SIGNAL(finished()),&event,SLOT(quit())); | 105 | connect(response, SIGNAL(finished()), &event, SLOT(quit())); |
106 | connect(response, &QNetworkReply::sslErrors, | ||
107 | [=](const QList<QSslError>& errors) { | ||
108 | qDebug() << errors[0].errorString(); | ||
109 | // many of us use self-signed certificates or they have expired. | ||
110 | // this should not matter here, therefore ignore... | ||
111 | response->ignoreSslErrors(); | ||
112 | } | ||
113 | ); | ||
114 | connect(response, static_cast<void(QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error), | ||
115 | [=](QNetworkReply::NetworkError) | ||
116 | { | ||
117 | qDebug() << "NetworkError!"; // code.errorString(); | ||
118 | //qDebug() << ; | ||
119 | qDebug() << response->errorString(); | ||
120 | |||
121 | } | ||
122 | ); | ||
70 | event.exec(); | 123 | event.exec(); |
71 | 124 | if (response->error() == QNetworkReply::NoError) | |
125 | { | ||
126 | int statusCode = response->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); | ||
127 | |||
128 | qDebug() << "Status: " << statusCode; | ||
129 | switch(statusCode) | ||
130 | { | ||
131 | case 301: | ||
132 | case 302: | ||
133 | case 303: | ||
134 | return this->download(response->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl()); | ||
135 | break; | ||
136 | } | ||
137 | } | ||
72 | return response->readAll(); | 138 | return response->readAll(); |
73 | } | 139 | } |
74 | 140 | ||
75 | void MainWindow::slotActivated(QSystemTrayIcon::ActivationReason reason) | 141 | void MainWindow::slotActivated(QSystemTrayIcon::ActivationReason reason) |
76 | { | 142 | { |
143 | qDebug() << "trigger"; | ||
77 | if(reason == QSystemTrayIcon::Trigger) | 144 | if(reason == QSystemTrayIcon::Trigger) |
78 | { | 145 | { |
79 | qDebug() << "trigger"; | 146 | if(this->isVisible()) |
80 | this->setWindowState(Qt::WindowNoState); | 147 | this->hide(); |
81 | this->show(); | 148 | else |
82 | this->activateWindow(); | 149 | { |
150 | this->setWindowState(Qt::WindowNoState); | ||
151 | this->show(); | ||
152 | this->activateWindow(); | ||
153 | } | ||
83 | 154 | ||
84 | } | 155 | } |
85 | else | 156 | else |
@@ -93,3 +164,10 @@ void MainWindow::exitApplication() | |||
93 | qDebug() << "exit now!"; | 164 | qDebug() << "exit now!"; |
94 | exit(0); | 165 | exit(0); |
95 | } | 166 | } |
167 | |||
168 | void MainWindow::on_comboBox_currentIndexChanged(const QString &arg1) | ||
169 | { | ||
170 | qDebug() << arg1; | ||
171 | this->updateStatus(); | ||
172 | this->saveSettings(); | ||
173 | } | ||
diff --git a/mainwindow.h b/mainwindow.h index 11c1616..9656734 100644 --- a/mainwindow.h +++ b/mainwindow.h | |||
@@ -6,6 +6,7 @@ | |||
6 | 6 | ||
7 | #include <QJsonDocument> | 7 | #include <QJsonDocument> |
8 | #include <QJsonObject> | 8 | #include <QJsonObject> |
9 | #include <QJsonArray> | ||
9 | #include <QByteArray> | 10 | #include <QByteArray> |
10 | 11 | ||
11 | 12 | ||
@@ -16,6 +17,8 @@ | |||
16 | #include <QtNetwork/QNetworkRequest> | 17 | #include <QtNetwork/QNetworkRequest> |
17 | #include <QtNetwork/QNetworkReply> | 18 | #include <QtNetwork/QNetworkReply> |
18 | 19 | ||
20 | #include <QSettings> | ||
21 | #include <QTimer> | ||
19 | 22 | ||
20 | namespace Ui { | 23 | namespace Ui { |
21 | class MainWindow; | 24 | class MainWindow; |
@@ -28,15 +31,22 @@ class MainWindow : public QMainWindow | |||
28 | public: | 31 | public: |
29 | explicit MainWindow(QWidget *parent = 0); | 32 | explicit MainWindow(QWidget *parent = 0); |
30 | ~MainWindow(); | 33 | ~MainWindow(); |
34 | void updateSpaceList(QString defaultSpace); | ||
31 | 35 | ||
32 | private: | 36 | private: |
33 | Ui::MainWindow *ui; | 37 | Ui::MainWindow *ui; |
34 | QSystemTrayIcon* qsystemtrayicon; | 38 | QSystemTrayIcon* qsystemtrayicon; |
35 | QByteArray download(QUrl url); | 39 | QByteArray download(QUrl url); |
36 | QIcon* currentIcon; | 40 | QIcon* currentIcon; |
41 | QByteArray imageArray; | ||
42 | void saveSettings(); | ||
43 | QSettings qsettings;\ | ||
44 | QTimer* timer; | ||
37 | 45 | ||
38 | private slots: | 46 | private slots: |
39 | void slotActivated(QSystemTrayIcon::ActivationReason); | 47 | void slotActivated(QSystemTrayIcon::ActivationReason); |
48 | void on_comboBox_currentIndexChanged(const QString &arg1); | ||
49 | void updateStatus(); | ||
40 | void exitApplication(); | 50 | void exitApplication(); |
41 | 51 | ||
42 | }; | 52 | }; |
diff --git a/mainwindow.ui b/mainwindow.ui index 812bddc..27a41ad 100644 --- a/mainwindow.ui +++ b/mainwindow.ui | |||
@@ -6,10 +6,22 @@ | |||
6 | <rect> | 6 | <rect> |
7 | <x>0</x> | 7 | <x>0</x> |
8 | <y>0</y> | 8 | <y>0</y> |
9 | <width>646</width> | 9 | <width>670</width> |
10 | <height>486</height> | 10 | <height>442</height> |
11 | </rect> | 11 | </rect> |
12 | </property> | 12 | </property> |
13 | <property name="sizePolicy"> | ||
14 | <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> | ||
15 | <horstretch>0</horstretch> | ||
16 | <verstretch>0</verstretch> | ||
17 | </sizepolicy> | ||
18 | </property> | ||
19 | <property name="maximumSize"> | ||
20 | <size> | ||
21 | <width>670</width> | ||
22 | <height>442</height> | ||
23 | </size> | ||
24 | </property> | ||
13 | <property name="windowTitle"> | 25 | <property name="windowTitle"> |
14 | <string>MainWindow</string> | 26 | <string>MainWindow</string> |
15 | </property> | 27 | </property> |
@@ -17,36 +29,118 @@ | |||
17 | <iconset> | 29 | <iconset> |
18 | <normaloff>folder.png</normaloff>folder.png</iconset> | 30 | <normaloff>folder.png</normaloff>folder.png</iconset> |
19 | </property> | 31 | </property> |
20 | <widget class="QWidget" name="centralWidget"/> | 32 | <widget class="QWidget" name="centralWidget"> |
33 | <layout class="QVBoxLayout" name="verticalLayout"> | ||
34 | <item> | ||
35 | <widget class="QComboBox" name="comboBox"> | ||
36 | <property name="insertPolicy"> | ||
37 | <enum>QComboBox::InsertAlphabetically</enum> | ||
38 | </property> | ||
39 | <property name="sizeAdjustPolicy"> | ||
40 | <enum>QComboBox::AdjustToMinimumContentsLength</enum> | ||
41 | </property> | ||
42 | </widget> | ||
43 | </item> | ||
44 | <item> | ||
45 | <widget class="QLabel" name="label_url_json"> | ||
46 | <property name="text"> | ||
47 | <string>TextLabel</string> | ||
48 | </property> | ||
49 | </widget> | ||
50 | </item> | ||
51 | <item> | ||
52 | <widget class="QScrollArea" name="scrollArea"> | ||
53 | <property name="widgetResizable"> | ||
54 | <bool>true</bool> | ||
55 | </property> | ||
56 | <widget class="QWidget" name="scrollAreaWidgetContents"> | ||
57 | <property name="geometry"> | ||
58 | <rect> | ||
59 | <x>0</x> | ||
60 | <y>0</y> | ||
61 | <width>648</width> | ||
62 | <height>305</height> | ||
63 | </rect> | ||
64 | </property> | ||
65 | <widget class="QLabel" name="label_icon"> | ||
66 | <property name="geometry"> | ||
67 | <rect> | ||
68 | <x>10</x> | ||
69 | <y>10</y> | ||
70 | <width>120</width> | ||
71 | <height>120</height> | ||
72 | </rect> | ||
73 | </property> | ||
74 | <property name="text"> | ||
75 | <string>TextLabel</string> | ||
76 | </property> | ||
77 | <property name="alignment"> | ||
78 | <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> | ||
79 | </property> | ||
80 | </widget> | ||
81 | <widget class="QPlainTextEdit" name="plainTextEdit"> | ||
82 | <property name="geometry"> | ||
83 | <rect> | ||
84 | <x>140</x> | ||
85 | <y>10</y> | ||
86 | <width>501</width> | ||
87 | <height>311</height> | ||
88 | </rect> | ||
89 | </property> | ||
90 | <property name="acceptDrops"> | ||
91 | <bool>false</bool> | ||
92 | </property> | ||
93 | <property name="readOnly"> | ||
94 | <bool>true</bool> | ||
95 | </property> | ||
96 | </widget> | ||
97 | </widget> | ||
98 | </widget> | ||
99 | </item> | ||
100 | </layout> | ||
101 | </widget> | ||
21 | <widget class="QMenuBar" name="menuBar"> | 102 | <widget class="QMenuBar" name="menuBar"> |
103 | <property name="enabled"> | ||
104 | <bool>true</bool> | ||
105 | </property> | ||
22 | <property name="geometry"> | 106 | <property name="geometry"> |
23 | <rect> | 107 | <rect> |
24 | <x>0</x> | 108 | <x>0</x> |
25 | <y>0</y> | 109 | <y>0</y> |
26 | <width>646</width> | 110 | <width>670</width> |
27 | <height>29</height> | 111 | <height>29</height> |
28 | </rect> | 112 | </rect> |
29 | </property> | 113 | </property> |
114 | <property name="defaultUp"> | ||
115 | <bool>false</bool> | ||
116 | </property> | ||
117 | <property name="nativeMenuBar"> | ||
118 | <bool>false</bool> | ||
119 | </property> | ||
30 | <widget class="QMenu" name="menuMenu1"> | 120 | <widget class="QMenu" name="menuMenu1"> |
31 | <property name="title"> | 121 | <property name="title"> |
32 | <string>menu1</string> | 122 | <string>File</string> |
33 | </property> | 123 | </property> |
124 | <addaction name="actionUpdate_Status"/> | ||
125 | <addaction name="separator"/> | ||
34 | <addaction name="actionExit"/> | 126 | <addaction name="actionExit"/> |
35 | </widget> | 127 | </widget> |
36 | <addaction name="menuMenu1"/> | 128 | <addaction name="menuMenu1"/> |
37 | </widget> | 129 | </widget> |
38 | <widget class="QToolBar" name="mainToolBar"> | ||
39 | <attribute name="toolBarArea"> | ||
40 | <enum>TopToolBarArea</enum> | ||
41 | </attribute> | ||
42 | <attribute name="toolBarBreak"> | ||
43 | <bool>false</bool> | ||
44 | </attribute> | ||
45 | </widget> | ||
46 | <widget class="QStatusBar" name="statusBar"/> | 130 | <widget class="QStatusBar" name="statusBar"/> |
47 | <action name="actionExit"> | 131 | <action name="actionExit"> |
48 | <property name="text"> | 132 | <property name="text"> |
49 | <string>exit</string> | 133 | <string>Quit</string> |
134 | </property> | ||
135 | </action> | ||
136 | <action name="actionSpaces"> | ||
137 | <property name="text"> | ||
138 | <string>Spaces</string> | ||
139 | </property> | ||
140 | </action> | ||
141 | <action name="actionUpdate_Status"> | ||
142 | <property name="text"> | ||
143 | <string>Update Status</string> | ||
50 | </property> | 144 | </property> |
51 | </action> | 145 | </action> |
52 | </widget> | 146 | </widget> |
@@ -69,8 +163,25 @@ | |||
69 | </hint> | 163 | </hint> |
70 | </hints> | 164 | </hints> |
71 | </connection> | 165 | </connection> |
166 | <connection> | ||
167 | <sender>actionUpdate_Status</sender> | ||
168 | <signal>triggered()</signal> | ||
169 | <receiver>MainWindow</receiver> | ||
170 | <slot>updateStatus()</slot> | ||
171 | <hints> | ||
172 | <hint type="sourcelabel"> | ||
173 | <x>-1</x> | ||
174 | <y>-1</y> | ||
175 | </hint> | ||
176 | <hint type="destinationlabel"> | ||
177 | <x>334</x> | ||
178 | <y>220</y> | ||
179 | </hint> | ||
180 | </hints> | ||
181 | </connection> | ||
72 | </connections> | 182 | </connections> |
73 | <slots> | 183 | <slots> |
74 | <slot>exitApplication()</slot> | 184 | <slot>exitApplication()</slot> |
185 | <slot>updateStatus()</slot> | ||
75 | </slots> | 186 | </slots> |
76 | </ui> | 187 | </ui> |
diff --git a/qtapp.pro b/qspaceapi.pro index db84b23..4384e98 100644 --- a/qtapp.pro +++ b/qspaceapi.pro | |||
@@ -3,6 +3,7 @@ | |||
3 | # Project created by QtCreator 2015-11-17T21:16:22 | 3 | # Project created by QtCreator 2015-11-17T21:16:22 |
4 | # | 4 | # |
5 | #------------------------------------------------- | 5 | #------------------------------------------------- |
6 | CONFIG += c++11 | ||
6 | 7 | ||
7 | QT += core gui network | 8 | QT += core gui network |
8 | 9 | ||
@@ -21,3 +22,5 @@ FORMS += mainwindow.ui | |||
21 | 22 | ||
22 | DISTFILES += \ | 23 | DISTFILES += \ |
23 | folder.png | 24 | folder.png |
25 | |||
26 | RESOURCES += | ||