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