source: src-qt4/pc-zmanager/dialognewpool.cpp @ 125dbc9

9.2-releasereleng/10.0releng/10.0.1
Last change on this file since 125dbc9 was 125dbc9, checked in by Kris Moore <kris@…>, 6 months ago

Welcome the new 'pc-zmanager' for ZFS & Disk Management

A HUGE Thank You to: Claudio L <claudio@…>

Update pkg-plist and add it to the control panel

  • Property mode set to 100644
File size: 10.7 KB
Line 
1#include "dialognewpool.h"
2#include "ui_dialognewpool.h"
3#include <QTreeWidget>
4#include <QTreeWidgetItem>
5#include <QTreeWidgetItemIterator>
6
7
8DialogNewPool::DialogNewPool(QWidget *parent) :
9    QDialog(parent),
10    ui(new Ui::DialogNewPool)
11{
12    ui->setupUi(this);
13
14    ui->vdevList->setIconSize(QSize(48,48));
15    ui->vdevList->header()->setStretchLastSection(false);
16    ui->vdevList->header()->setResizeMode(0,QHeaderView::Stretch);
17    ui->vdevList->header()->setResizeMode(1,QHeaderView::ResizeToContents);
18
19    ui->vdevList->clear();
20
21    ui->striped->setEnabled(false);
22    ui->mirror->setEnabled(false);
23    ui->raidz->setEnabled(false);
24    ui->raidz2->setEnabled(false);
25    ui->raidz3->setEnabled(false);
26
27    ui->cache->setEnabled(false);
28    ui->cache->setVisible(false);
29    ui->log->setEnabled(false);
30    ui->log->setVisible(false);
31    ui->spare->setEnabled(false);
32    ui->spare->setVisible(false);
33
34    ui->frameErrors->setVisible(false);
35
36    Vdevcount=0;
37    Fixednumdisks=0;
38    Fixedtype=false;
39    ui->striped->setChecked(true);
40
41    ui->poolName->setFocus();
42
43}
44
45DialogNewPool::~DialogNewPool()
46{
47    delete ui;
48}
49
50
51// INITIALIZE THE DEVICE LIST WITH THE DISKS AVAILABLE FOR USE
52void DialogNewPool::setDevices(QList<vdev_t> *disks)
53{
54
55    QList<vdev_t>::const_iterator it=disks->constBegin();
56
57
58    while(it!=disks->constEnd()) {
59
60        // DETERMINE IF THE DEVICE IS AVAILABLE
61        if((*it).Partitions.count()!=0) {
62            // DISK IS NOT AVAILABLE, CHECK PARTITIONS RECURSIVELY
63            setDevices((QList<vdev_t> *)&((*it).Partitions));
64        }
65        else {
66        if((*it).PartType=="freebsd-zfs" && (*it).InPool.isEmpty()) {
67            // THIS IS AN EMPTY ZFS PARTITION
68            QTreeWidgetItem *item=new QTreeWidgetItem(ui->vdevList);
69            QString sz;
70            sz=" ("+printBytes((*it).Size)+")";
71
72            item->setText(0,(*it).Name+sz+"\n[freebsd-zfs]");
73            item->setText(1," ");
74            item->setData(0,Qt::UserRole,(*it).Name);
75            item->setIcon(0,QIcon(":/icons/kdf.png"));
76            item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
77            item->setCheckState(1,Qt::Unchecked);
78
79        }
80        else {
81            if((*it).PartType.isEmpty()  && (*it).InPool.isEmpty() && (*it).Size!=0) {
82            // THIS IS AN EMPTY DISK
83            QTreeWidgetItem *item=new QTreeWidgetItem(ui->vdevList);
84
85            QString sz;
86            sz=" ("+printBytes((*it).Size)+")";
87            if(!(*it).PartType.isEmpty()) { sz+=" [" + (*it).PartType + "]"; }
88            sz+="\n";
89            item->setText(0,(*it).Name + sz + (*it).Description);
90            item->setText(1," ");
91            item->setData(0,Qt::UserRole,(*it).Name);
92            item->setIcon(0,QIcon(":/icons/drive-harddisk.png"));
93            item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
94            item->setCheckState(1,Qt::Unchecked);
95
96        }
97        }
98        }
99
100        ++it;
101    }
102
103
104    Vdevcount=0;
105
106}
107
108
109void DialogNewPool::on_vdevList_itemClicked(QTreeWidgetItem *item, int column)
110{
111    if(column==0) {
112    if(item->checkState(1)==Qt::Checked) {
113        item->setCheckState(1,Qt::Unchecked);
114    }
115    else {
116        item->setCheckState(1,Qt::Checked);
117    }
118    }
119
120}
121
122void DialogNewPool::on_vdevList_itemChanged(QTreeWidgetItem *item, int column)
123{
124    if(column==1) {
125    if(item->checkState(1)==Qt::Checked) {
126        ++Vdevcount;
127    }
128    else {
129        --Vdevcount;
130    }
131
132
133    if(!Fixedtype) {
134
135
136    if(Vdevcount>4) ui->raidz3->setEnabled(true);
137    else {
138        ui->raidz3->setEnabled(false);
139        if(ui->raidz3->isChecked()) ui->raidz2->setChecked(true);
140    }
141    if(Vdevcount>3) ui->raidz2->setEnabled(true);
142    else {
143        ui->raidz2->setEnabled(false);
144        if(ui->raidz2->isChecked()) ui->raidz->setChecked(true);
145    }
146    if(Vdevcount>2) ui->raidz->setEnabled(true);
147    else {
148        ui->raidz->setEnabled(false);
149        if(ui->raidz->isChecked()) ui->mirror->setChecked(true);
150    }
151
152
153    if(Vdevcount>1) {
154        ui->striped->setEnabled(true);
155        ui->mirror->setEnabled(true);
156    }
157    else {
158        ui->striped->setEnabled(false);
159        ui->mirror->setEnabled(false);
160        if(ui->mirror->isChecked()) ui->striped->setChecked(true);
161    }
162
163    }
164
165    }
166}
167
168
169QStringList DialogNewPool::getVdevList()
170{
171    QStringList result;
172
173    QTreeWidgetItemIterator it(ui->vdevList);
174
175    while(*it)
176    {
177        if( (*it)->checkState(1)==Qt::Checked ) result.append((*it)->data(0,Qt::UserRole).toString());
178        ++it;
179    }
180
181    return result;
182}
183
184QString DialogNewPool::getRaidType()
185{
186    if(ui->raidz3->isChecked()) return "raidz3";
187    if(ui->raidz2->isChecked()) return "raidz2";
188    if(ui->raidz->isChecked()) return "raidz";
189    if(ui->mirror->isChecked()) return "mirror";
190    if(ui->cache->isChecked()) return "cache";
191    if(ui->log->isChecked()) return "log";
192    if(ui->spare->isChecked()) return "spare";
193
194    return "";
195
196}
197
198QString DialogNewPool::getName()
199{
200    return ui->poolName->text();
201}
202
203
204void DialogNewPool::setName(QString name)
205{
206    ui->poolName->setText(name);
207    ui->poolName->setReadOnly(true);
208}
209
210void DialogNewPool::setTitle(QString name)
211{
212
213    this->setWindowTitle(name);
214}
215
216
217
218
219void DialogNewPool::setType(int disktype)
220{
221
222    switch(disktype)
223    {
224        case DISK_STRIPE:
225            Fixedtype=true;
226            ui->striped->setChecked(true);
227
228            ui->striped->setEnabled(true);
229            ui->mirror->setEnabled(false);
230            ui->raidz->setEnabled(false);
231            ui->raidz2->setEnabled(false);
232            ui->raidz3->setEnabled(false);
233            ui->cache->setEnabled(false);
234            ui->log->setEnabled(false);
235            ui->spare->setEnabled(false);
236            ui->cache->setVisible(false);
237            ui->log->setVisible(false);
238            ui->spare->setVisible(false);
239            break;
240        case DISK_MIRROR:
241            Fixedtype=true;
242            ui->mirror->setChecked(true);
243
244            ui->striped->setEnabled(false);
245            ui->mirror->setEnabled(true);
246            ui->raidz->setEnabled(false);
247            ui->raidz2->setEnabled(false);
248            ui->raidz3->setEnabled(false);
249            ui->cache->setEnabled(false);
250            ui->log->setEnabled(false);
251            ui->spare->setEnabled(false);
252            ui->cache->setVisible(false);
253            ui->log->setVisible(false);
254            ui->spare->setVisible(false);
255            break;
256        case DISK_RAIDZ:
257            Fixedtype=true;
258            ui->raidz->setChecked(true);
259
260            ui->striped->setEnabled(false);
261            ui->mirror->setEnabled(false);
262            ui->raidz->setEnabled(true);
263            ui->raidz2->setEnabled(false);
264            ui->raidz3->setEnabled(false);
265            ui->cache->setEnabled(false);
266            ui->log->setEnabled(false);
267            ui->spare->setEnabled(false);
268            ui->cache->setVisible(false);
269            ui->log->setVisible(false);
270            ui->spare->setVisible(false);
271            break;
272        case DISK_RAIDZ2:
273            Fixedtype=true;
274            ui->raidz2->setChecked(true);
275
276            ui->striped->setEnabled(false);
277            ui->mirror->setEnabled(false);
278            ui->raidz->setEnabled(false);
279            ui->raidz2->setEnabled(true);
280            ui->raidz3->setEnabled(false);
281            ui->cache->setEnabled(false);
282            ui->log->setEnabled(false);
283            ui->spare->setEnabled(false);
284            ui->cache->setVisible(false);
285            ui->log->setVisible(false);
286            ui->spare->setVisible(false);
287            break;
288        case DISK_RAIDZ3:
289            Fixedtype=true;
290            ui->raidz3->setChecked(true);
291
292            ui->striped->setEnabled(false);
293            ui->mirror->setEnabled(false);
294            ui->raidz->setEnabled(false);
295            ui->raidz2->setEnabled(false);
296            ui->raidz3->setEnabled(true);
297            ui->cache->setEnabled(false);
298            ui->log->setEnabled(false);
299            ui->spare->setEnabled(false);
300            ui->cache->setVisible(false);
301            ui->log->setVisible(false);
302            ui->spare->setVisible(false);
303            break;
304
305        case DISK_CACHE:
306            Fixedtype=true;
307            ui->cache->setVisible(true);
308            ui->log->setVisible(true);
309            ui->spare->setVisible(true);
310
311            ui->cache->setChecked(true);
312
313            ui->striped->setEnabled(false);
314            ui->mirror->setEnabled(false);
315            ui->raidz->setEnabled(false);
316            ui->raidz2->setEnabled(false);
317            ui->raidz3->setEnabled(false);
318            ui->cache->setEnabled(true);
319            ui->log->setEnabled(false);
320            ui->spare->setEnabled(false);
321            break;
322        case DISK_LOG:
323            Fixedtype=true;
324            ui->cache->setVisible(true);
325            ui->log->setVisible(true);
326            ui->spare->setVisible(true);
327
328            ui->log->setChecked(true);
329
330            ui->striped->setEnabled(false);
331            ui->mirror->setEnabled(false);
332            ui->raidz->setEnabled(false);
333            ui->raidz2->setEnabled(false);
334            ui->raidz3->setEnabled(false);
335            ui->cache->setEnabled(false);
336            ui->log->setEnabled(true);
337            ui->spare->setEnabled(false);
338            break;
339        case DISK_SPARE:
340            Fixedtype=true;
341            ui->cache->setVisible(true);
342            ui->log->setVisible(true);
343            ui->spare->setVisible(true);
344
345            ui->spare->setChecked(true);
346
347            ui->striped->setEnabled(false);
348            ui->mirror->setEnabled(false);
349            ui->raidz->setEnabled(false);
350            ui->raidz2->setEnabled(false);
351            ui->raidz3->setEnabled(false);
352            ui->cache->setEnabled(false);
353            ui->log->setEnabled(false);
354            ui->spare->setEnabled(true);
355            break;
356    }
357}
358
359void DialogNewPool::setNumDisks(int ndisks)
360{
361    Fixednumdisks=ndisks;
362}
363
364void DialogNewPool::done(int r)
365{
366    // VALIDATE DATA, SHOW ERRORS AND/OR EXIT
367
368    if(r==QDialog::Accepted) {
369        // CHECK FOR EMPTY POOL NAME
370    if(ui->poolName->text().isEmpty()) {
371        ui->labelError->setText(tr("Must provide a valid pool name"));
372        ui->frameErrors->setVisible(true);
373        return;
374    }
375
376        // CHECK FOR BAD DISK COUNT
377
378        QStringList list=getVdevList();
379
380        if(Fixednumdisks) {
381            if(list.count()!=Fixednumdisks) {
382            ui->labelError->setText(tr("Must select exactly %1 devices").arg(Fixednumdisks));
383            ui->frameErrors->setVisible(true);
384            return;
385            }
386        }
387        else {
388            if(list.count()==0) {
389                ui->labelError->setText(tr("Must select at least one device"));
390                ui->frameErrors->setVisible(true);
391                return;
392            }
393
394        }
395
396
397    }
398
399
400    QDialog::done(r);
401}
Note: See TracBrowser for help on using the repository browser.