Update async methods! Now valid ip is detected
[vlc-remote] / accountdialog.cpp
1 #include "accountdialog.h"
2 #include "ui_accountdialog.h"
3 #include "newaccountdialog.h"
4 #include <QDebug>
5 #include <QInputDialog>
6 #include <QSettings>
7 #include <QTcpSocket>
8 #include <QFuture>
9 #include <QtConcurrentMap>
10
11
12
13 QListWidgetItem asyncTestItem(const QListWidgetItem &item)
14 {
15
16     QListWidgetItem item2= item;
17     item2.setText("boby");
18
19     return item;
20
21 }
22
23
24
25
26 AccountDialog::AccountDialog(QWidget *parent) :
27         QDialog(parent),
28         ui(new Ui::AccountDialog)
29 {
30     ui->setupUi(this);
31
32     mFuturWatcher = new QFutureWatcher<QListWidgetItem>(this);
33     connect(mFuturWatcher,SIGNAL(resultReadyAt(int)),this,SLOT(setAsyncItem(int)));
34
35     connect(ui->addButton,SIGNAL(clicked()),this,SLOT(add()));
36     connect(ui->editButton,SIGNAL(clicked()),this,SLOT(edit()));
37     connect(ui->remButton,SIGNAL(clicked()),this,SLOT(rem()));
38     connect(ui->useButton,SIGNAL(clicked()),this,SLOT(use()));
39     connect(ui->listWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(enableUi()));
40
41     load();
42
43 }
44
45 AccountDialog::~AccountDialog()
46 {
47     delete ui;
48 }
49
50 void AccountDialog::add()
51 {
52
53     NewAccountDialog *dialog = new NewAccountDialog(this);
54     dialog->exec();
55     load();
56 }
57 QString AccountDialog::currentIp()
58 {
59
60     QSettings settings;
61     QString useKey = settings.value("config/currentKey").toString();
62     QString useIp ;
63     if ( !useKey.isEmpty())
64         useIp = settings.value("account/"+useKey).toString();
65
66     else return QString();
67
68     return useIp;
69 }
70
71 void AccountDialog::load()
72 {
73     ui->editButton->setEnabled(false);
74     ui->remButton->setEnabled(false);
75     ui->useButton->setEnabled(false);
76     ui->listWidget->clear(); // tjr effacer , sinon on rajoute
77
78     QSettings settings;
79
80     QString useKey = settings.value("config/currentKey").toString();
81
82     QList <QListWidgetItem> asycItems;
83
84     settings.beginGroup("account");
85     foreach ( QString key, settings.allKeys())
86     {
87         QListWidgetItem * item = new QListWidgetItem;
88
89         item->setText(key);
90         item->setData(Qt::UserRole, settings.value(key));
91         if (useKey == key) {
92             QFont font = item->font();
93             font.setBold(true);
94             item->setFont(font);
95         }
96         ui->listWidget->addItem(item);
97         asycItems.append(*item);
98     }
99     settings.endGroup();    
100
101
102     // ... create and add in the list widget
103
104     //  QFuture<QListWidgetItem> itemFutur = QtConcurrent::mapped(asycItems, asyncTestItem);
105
106
107     mFuturWatcher->setFuture(QtConcurrent::mapped(asycItems, asyncTestItem));
108 }
109
110 QListWidgetItem AccountDialog::asyncTestItem(const QListWidgetItem& item)
111 {
112     QListWidgetItem newItem = item;
113
114     QTcpSocket * socket = new QTcpSocket;
115     QSettings settings;
116     QString host = settings.value("account/"+item.text()).toString();
117     QStringList hostSplit = host.split(":");
118     QString ip   = hostSplit.at(0);
119     QString port = hostSplit.at(1);
120
121
122     socket->connectToHost(ip,port.toInt());
123
124     if (socket->waitForConnected(1000))
125         newItem.setBackgroundColor(Qt::green);
126     else
127         newItem.setBackgroundColor(Qt::red);
128
129     return newItem;
130
131
132 }
133
134
135
136 void AccountDialog::setAsyncItem(int row)  // EDIT THE ROW AFTER ASYNC FUNCTION FINISHED
137 {
138     QListWidgetItem newItem = mFuturWatcher->resultAt(row);
139     QListWidgetItem * item = ui->listWidget->item(row);
140
141     item->setBackgroundColor(newItem.backgroundColor());
142
143
144
145 }
146
147
148
149 void AccountDialog::edit()
150 {
151     QString currentIp = ui->listWidget->currentItem()->data(Qt::UserRole).toString();
152     QString currentKey = ui->listWidget->currentItem()->text();
153
154     NewAccountDialog *dialog = new NewAccountDialog(this);
155     dialog->edit(currentKey, currentIp);
156     dialog->exec();
157
158     load();
159 }
160
161 void AccountDialog::rem()
162 {
163     QString key = ui->listWidget->currentItem()->text();
164
165     QSettings settings;
166     settings.beginGroup("account");
167     settings.remove(key);
168     settings.endGroup();
169
170     load(); // On recharge les compte
171 }
172
173 void AccountDialog::use()
174 {
175     QString currentKey = ui->listWidget->currentItem()->text();
176     QSettings settings;
177     settings.setValue("config/currentKey", currentKey);
178     load();
179 }
180
181 void AccountDialog::enableUi()
182 {
183     ui->editButton->setEnabled(true);
184     ui->remButton->setEnabled(true);
185     ui->useButton->setEnabled(true);
186 }