SettingDlg is now able to fetch remotefilenames
[irwi] / src / settingsdlg.cpp
1 #include "settingsdlg.h"
2
3 #include <QDebug>
4 #include <QHBoxLayout>
5 #include <QLabel>
6 #include <QString>
7 #include <QListWidget>
8 #include <QListWidgetItem>
9 #include <QSettings>
10 #include <QtNetwork/QNetworkAccessManager>
11 #include <QtNetwork/QNetworkReply>
12 #include <QBuffer>
13 #include <QByteArray>
14
15 SettingsDlg::SettingsDlg(QWidget *parent)
16     : QDialog(parent)
17 {
18     this->setWindowTitle(tr("Settings"));
19
20     //TODO caching?
21     mfgNetAM = new QNetworkAccessManager(this);
22     connect(mfgNetAM, SIGNAL(finished(QNetworkReply*)), 
23             this,  SLOT(mfgListDownloadFinished(QNetworkReply*)));
24
25     modelNetAM = new QNetworkAccessManager(this);
26     connect(modelNetAM, SIGNAL(finished(QNetworkReply*)), 
27             this,  SLOT(modelListDownloadFinished(QNetworkReply*)));
28     
29     settings = new QSettings(this);
30
31     layout = new QHBoxLayout(this);
32
33     alphabetList = new QListWidget(this);
34     for (char c = 'a'; c <= 'z'; ++c)
35     {
36         alphabetList->addItem(QString(c));
37     }
38     layout->addWidget(alphabetList);
39     connect(alphabetList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
40                 this, SLOT(alphabetItemChanged(QListWidgetItem*, QListWidgetItem*)));
41     
42     mfgList = new QListWidget(this);
43     layout->addWidget(mfgList);
44     connect(mfgList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
45                 this, SLOT(mfgItemChanged(QListWidgetItem*, QListWidgetItem*)));
46
47     modelList = new QListWidget(this);
48     layout->addWidget(modelList);
49     connect(modelList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
50                 this, SLOT(modelItemChanged(QListWidgetItem*, QListWidgetItem*)));
51
52     this->setLayout(layout);
53 }
54
55 SettingsDlg::~SettingsDlg()
56 {
57     delete layout;
58     delete settings;
59     delete mfgNetAM;
60     delete modelNetAM;
61 }
62
63 void SettingsDlg::alphabetItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
64 {
65     QNetworkReply* reply = mfgNetAM->get(
66         QNetworkRequest(
67             QUrl(
68                 settings->value(
69                     "remoteUrl",
70                     "http://mercury.wipsl.com/irwi/remotes/"
71                 ).toString() + current->text() + ".txt"
72             )
73         )
74     );
75 }
76
77 void SettingsDlg::mfgListDownloadFinished(QNetworkReply *reply)
78 {
79     mfgList->clear();
80     if (reply->error() == QNetworkReply::NoError) {
81         QByteArray ba = reply->readAll();
82         QBuffer buf(&ba, this);
83         buf.open(QIODevice::ReadOnly);
84         buf.seek(0);
85         while (buf.canReadLine())
86         {
87             QString str(buf.readLine());
88             str.chop(1);
89             mfgList->addItem(str);
90         }
91     } else {
92         //qDebug() << (int)reply->error();
93     }
94     reply->close();
95     reply->deleteLater();
96 }
97
98 void SettingsDlg::mfgItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
99 {
100     if (mfgList->currentItem() != NULL) {
101     QNetworkReply* reply = modelNetAM->get(
102         QNetworkRequest(
103             QUrl(
104                 settings->value(
105                     "remoteUrl",
106                     "http://mercury.wipsl.com/irwi/remotes/"
107                 ).toString() + alphabetList->currentItem()->text()
108                 + "/" + current->text() + ".txt"
109             )
110         )
111     );
112     }
113 }
114
115 void SettingsDlg::modelListDownloadFinished(QNetworkReply *reply)
116 {
117     modelList->clear();
118     if (reply->error() == QNetworkReply::NoError) {
119         QByteArray ba = reply->readAll();
120         QBuffer buf(&ba, this);
121         buf.open(QIODevice::ReadOnly);
122         buf.seek(0);
123         while (buf.canReadLine())
124         {
125             QString str(buf.readLine());
126             modelList->addItem(str);
127         }
128     } else {
129         //qDebug() << (int)reply->error();
130     }
131     reply->close();
132     reply->deleteLater();
133 }
134
135 void SettingsDlg::modelItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
136 {
137     if (current)
138     {
139         settings->setValue("remoteName", current->text());
140         //TODO save remote from server to /etc/lircd.conf
141         //maybe lirc needs restart after that?
142     }
143 }
144