d13fb9207c69531aec4aeb7ac8a4813141902884
[irwi] / src / selectremotedlg.cpp
1 #include "selectremotedlg.h"
2
3 #include "remote.h"
4 #include "remotelistwidgetitem.h"
5 #include "onlinepollerthread.h"
6 #include "remotetable.h"
7
8 #include <QHBoxLayout>
9 #include <QLabel>
10 #include <QString>
11 #include <QListWidget>
12 #include <QListWidgetItem>
13 #include <QSettings>
14 #include <QMap>
15 #include <QList>
16 #include <QMessageBox>
17 #include <QPushButton>
18
19 SelectRemoteDlg::SelectRemoteDlg(QWidget *parent)
20     : QDialog(parent)
21 {
22     onlinePollerThread = NULL;
23     this->setWindowTitle(tr("Select remote"));
24     this->setMinimumHeight(320);
25
26     layout = new QHBoxLayout(this);
27
28     alphabetList = new QListWidget(this);
29     alphabetList->setMaximumWidth(64);
30     layout->addWidget(alphabetList);
31     connect(alphabetList,
32             SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
33             this,
34             SLOT(alphabetItemChanged(QListWidgetItem*, QListWidgetItem*)));
35     
36     mfgList = new QListWidget(this);
37     mfgList->setMaximumWidth(192);
38     layout->addWidget(mfgList);
39     connect(mfgList,
40             SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
41             this,
42             SLOT(mfgItemChanged(QListWidgetItem*, QListWidgetItem*)));
43
44     modelList = new RemoteTable(this);
45     layout->addWidget(modelList);
46
47     downloadBtn = new QPushButton(tr("Download"), this);
48     layout->addWidget(downloadBtn);
49     connect(downloadBtn, SIGNAL(clicked()), 
50             this, SLOT(downloadRemote()));
51
52     this->setLayout(layout);
53     connect(&remoteDBMgr, SIGNAL(dbReady(RemoteDB*)),
54             this, SLOT(setDB(RemoteDB*)));
55     connect(&remoteDBMgr, SIGNAL(downloadFailed(int)),
56             this, SLOT(onDBError(int)));
57 }
58
59 SelectRemoteDlg::~SelectRemoteDlg()
60 {
61     delete layout;
62     if (onlinePollerThread != NULL) {
63         delete onlinePollerThread;
64         onlinePollerThread = NULL;
65     }
66 }
67
68 void SelectRemoteDlg::setDB(RemoteDB *db)
69 {
70     remoteDB = db;
71     alphabetList->addItems(remoteDB->keys());
72     setBusy(false);
73 }
74
75 void SelectRemoteDlg::setBusy(bool busy)
76 {
77     setAttribute(Qt::WA_Maemo5ShowProgressIndicator, busy);
78     setEnabled(!busy);
79 }
80
81 void SelectRemoteDlg::alphabetItemChanged(QListWidgetItem *current,
82                                       QListWidgetItem * /*previous*/)
83 {
84     mfgList->clear();
85     modelList->removeAllRows();
86     if (current) {
87         mfgList->addItems((*remoteDB)[current->text()].keys());
88     }
89 }
90
91 void SelectRemoteDlg::mfgItemChanged(QListWidgetItem *current,
92                                      QListWidgetItem * /*previous*/)
93 {
94     modelList->removeAllRows();
95     if (current) {
96         RemoteList remotes =
97             (*remoteDB)[alphabetList->currentItem()->text()][current->text()];
98         foreach(Remote *remote, remotes) {
99             modelList->addItem(remote);
100         }
101     }
102 }
103
104 void SelectRemoteDlg::downloadRemote()
105 {
106     Remote *currentModel = modelList->selected();
107     if (currentModel) {
108         setResult(QDialog::Accepted);
109         setBusy();
110         connect(currentModel, SIGNAL(saveFinished()),
111                 this, SLOT(close()));
112         currentModel->saveToFile();
113
114         emit remoteChanged(*currentModel);
115     }
116 }
117
118 void SelectRemoteDlg::getDB()
119 {
120     if (onlinePollerThread != NULL) {
121         delete onlinePollerThread;
122         onlinePollerThread = NULL;
123     }
124     remoteDBMgr.getDBAsync();
125 }
126
127 void SelectRemoteDlg::refreshDB()
128 {
129     setBusy(true);
130     if (onlinePollerThread != NULL) {
131         delete onlinePollerThread;
132         onlinePollerThread = NULL;
133     }
134     onlinePollerThread = new OnlinePollerThread();
135     connect(onlinePollerThread, SIGNAL(online()),
136             this, SLOT(getDB()));
137     onlinePollerThread->start();
138 }
139
140 void SelectRemoteDlg::showEvent(QShowEvent *event)
141 {
142     refreshDB();
143     QDialog::showEvent(event);
144 }
145
146 void SelectRemoteDlg::onDBError(int error)
147 {
148     this->setWindowTitle(tr("Network error") + " " + QString::number(error));
149     setBusy(false);
150     downloadBtn->setVisible(false);
151 }
152