source: src-qt4/pc-installgui/wizardDisk.cpp

releng/10.1
Last change on this file was 3981f9c, checked in by Kris Moore <kris@…>, 2 days ago

Update installer GUI to be EFI aware and reserve some space for
the 100MiB FAT partition that EFI uses

  • Property mode set to 100644
File size: 38.9 KB
Line 
1/****************************************************************************
2** ui.h extension file, included from the uic-generated form implementation.
3**
4** If you want to add, delete, or rename functions or slots, use
5** Qt Designer to update this file, preserving your code.
6**
7** You should not define a constructor or destructor in this file.
8** Instead, write your code in functions called init() and destroy().
9** These will automatically be called by the form's constructor and
10** destructor.
11*****************************************************************************/
12#include <QDebug>
13#include <QInputDialog>
14#include <QMessageBox>
15#include "wizardDisk.h"
16#include "ui_wizardDisk.h"
17
18void wizardDisk::programInit()
19{
20  prevID = 0;
21  restoreMode=false;
22
23  populateDiskInfo();
24
25  //connect(pushClose, SIGNAL(clicked()), this, SLOT(slotClose()));
26  connect(checkGPT, SIGNAL(clicked()), this, SLOT(slotGPTClicked()));
27  connect(pushSwapSize, SIGNAL(clicked()), this, SLOT(slotSwapSize()));
28  connect(pushRemoveMount, SIGNAL(clicked()), this, SLOT(slotRemoveFS()));
29  connect(pushAddMount, SIGNAL(clicked()), this, SLOT(slotAddFS()));
30  connect(this,SIGNAL(currentIdChanged(int)),this,SLOT(slotCheckComplete()));
31  connect(lineZpoolName,SIGNAL(textChanged ( const QString & )),this,SLOT(slotCheckComplete()));
32  connect(groupZFSPool,SIGNAL( clicked(bool)),this,SLOT(slotCheckComplete()));
33  connect(comboDisk,SIGNAL(currentIndexChanged(int)),this,SLOT(slotCheckComplete()));
34  connect(comboDisk,SIGNAL(currentIndexChanged(int)),this,SLOT(slotChangedDisk()));
35  connect(comboPartition,SIGNAL(currentIndexChanged(int)),this,SLOT(slotCheckComplete()));
36  connect(treeMounts,SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),this,SLOT(slotTreeDiskChanged()));
37  treeMounts->setContextMenuPolicy(Qt::CustomContextMenu);
38  connect(treeMounts,SIGNAL(customContextMenuRequested(const QPoint &)),this,SLOT(slotTreeMountsRightClick()));
39  connect(pushTerminal, SIGNAL(clicked()), this, SLOT(slotTerminal()));
40
41  // ZFS Mode Page
42  connect(comboZFSMode,SIGNAL(currentIndexChanged(int)),this,SLOT(slotCheckComplete()));
43  connect(groupZFSOpts,SIGNAL(clicked(bool)),this,SLOT(slotCheckComplete()));
44  connect(listZFSDisks,SIGNAL(itemClicked(QListWidgetItem *)),this,SLOT(slotCheckComplete()));
45  connect(listZFSDisks,SIGNAL(itemActivated(QListWidgetItem *)),this,SLOT(slotCheckComplete()));
46  connect(listZFSDisks,SIGNAL(itemChanged(QListWidgetItem *)),this,SLOT(slotCheckComplete()));
47  connect(groupZFSCache,SIGNAL(clicked(bool)),this,SLOT(slotCheckComplete()));
48  connect(listZFSCache,SIGNAL(itemClicked(QListWidgetItem *)),this,SLOT(slotCheckComplete()));
49  connect(listZFSCache,SIGNAL(itemActivated(QListWidgetItem *)),this,SLOT(slotCheckComplete()));
50  connect(listZFSCache,SIGNAL(itemChanged(QListWidgetItem *)),this,SLOT(slotCheckComplete()));
51  connect(groupZFSLog,SIGNAL(clicked(bool)),this,SLOT(slotCheckComplete()));
52  connect(listZFSLog,SIGNAL(itemClicked(QListWidgetItem *)),this,SLOT(slotCheckComplete()));
53  connect(listZFSLog,SIGNAL(itemActivated(QListWidgetItem *)),this,SLOT(slotCheckComplete()));
54  connect(listZFSLog,SIGNAL(itemChanged(QListWidgetItem *)),this,SLOT(slotCheckComplete()));
55  connect(groupEncrypt,SIGNAL(clicked(bool)),this,SLOT(slotCheckComplete()));
56  connect(lineEncPass,SIGNAL(textChanged(const QString &)),this,SLOT(slotCheckComplete()));
57  connect(lineEncPass2,SIGNAL(textChanged(const QString &)),this,SLOT(slotCheckComplete()));
58
59  // Check if we are running in EFI mode
60  if ( system("kenv grub.platform | grep -q 'efi'") == 0 )
61     efiMode=true;
62  else
63     efiMode=false;
64}
65
66void wizardDisk::populateDiskInfo()
67{
68  qDebug() << "Loading Disk Info";
69  sysDisks = Scripts::Backend::hardDrives();
70
71  // load drives
72  comboDisk->clear();
73  for (int i=0; i < sysDisks.count(); ++i) {
74    // Make sure to only add the drives to the comboDisk
75    if ( sysDisks.at(i).at(0) == "DRIVE" )
76      comboDisk->addItem(sysDisks.at(i).at(1) + " - " + sysDisks.at(i).at(2) + "MB " + sysDisks.at(i).at(3));
77  }
78
79  // Reload the slice list box
80  slotChangedDisk();
81}
82
83void wizardDisk::slotChangedDisk()
84{
85  QString ptag;
86
87  if ( comboDisk->currentText().isEmpty())
88    return;
89
90  comboPartition->clear();
91  comboPartition->addItem(tr("Use entire disk"));
92       
93  QString disk = comboDisk->currentText();
94  disk.truncate(disk.indexOf(" -"));
95  for (int i=0; i < sysDisks.count(); ++i) {
96    // Make sure to only add the slices to the listDiskSlices
97    if ( sysDisks.at(i).at(0) == "SLICE" && disk == sysDisks.at(i).at(1) && sysDisks.at(i).at(4) != "Unused Space") {
98      ptag = sysDisks.at(i).at(4).section(",", 0, 0);
99      ptag = ptag.section("/", 0, 0);
100      ptag.truncate(15);
101      if ( ptag.indexOf(")") == -1 )
102        ptag += ")";
103      comboPartition->addItem(sysDisks.at(i).at(2) + ": " +  sysDisks.at(i).at(3) + "MB " + ptag );
104    }
105  }
106
107}
108
109void wizardDisk::slotClose()
110{
111  close();
112}
113
114void wizardDisk::accept()
115{
116  QString bootLoader;
117  bool useGPT = false;
118  bool force4K = false;
119  QString zpoolName;
120  if (comboPartition->currentIndex() == 0 )
121    useGPT = checkGPT->isChecked();
122
123  // Get the boot-loader
124  bootLoader = comboBootLoader->currentText();
125  if ( radioBasic->isChecked() )
126     bootLoader="GRUB";
127
128  if ( comboPartition->currentIndex() != 0 && bootLoader == "NONE"  ) {
129     QMessageBox::warning(this, tr("No boot-loader!"),
130     tr("You have chosen not to install a boot-loader. You will need to manually setup your own loader."),
131     QMessageBox::Ok,
132     QMessageBox::Ok);
133  }
134     
135  // When doing advanced ZFS setups, make sure to use GPT
136  if ( radioAdvanced->isChecked() && groupZFSOpts->isChecked() )
137    useGPT = true;
138
139  // When doing advanced ZFS setups, check if 4K is enabled
140  if ( radioAdvanced->isChecked() && checkForce4K->isChecked() )
141    force4K = true;
142
143  if ( radioAdvanced->isChecked() && groupZFSPool->isChecked() )
144     zpoolName = lineZpoolName->text();
145
146  if ( radioExpert->isChecked() )
147    emit saved(sysFinalDiskLayout, QString("NONE"), false, zpoolName, force4K);
148  else
149    emit saved(sysFinalDiskLayout, bootLoader, useGPT, zpoolName, force4K);
150  close();
151}
152
153int wizardDisk::nextId() const
154{
155  switch (currentId()) {
156     case Page_Intro:
157       if (radioExpert->isChecked())
158         return Page_Expert;
159       if (radioBasic->isChecked()) {
160         checkGPT->setVisible(false);
161         comboBootLoader->setVisible(false);
162         textBootLoader->setVisible(false);
163         checkForce4K->setVisible(false);
164         groupZFSPool->setVisible(false);
165       }
166       if (radioAdvanced->isChecked()) {
167         checkGPT->setVisible(true);
168         comboBootLoader->setVisible(true);
169         textBootLoader->setVisible(true);
170         checkForce4K->setVisible(true);
171         groupZFSPool->setVisible(true);
172       }
173        break;
174     case Page_BasicDisk:
175       pushSwapSize->setVisible(true);
176
177       if (radioBasic->isChecked())
178         return Page_Confirmation;
179       if (comboPartition->currentIndex() != 0 ) {
180         groupZFSOpts->setEnabled(false);
181         return Page_Mounts;
182       } else {
183         if ( checkGPT->isChecked() )
184           groupEncrypt->setEnabled(true);
185         else
186           groupEncrypt->setEnabled(false);
187         groupZFSOpts->setEnabled(true);
188         return Page_ZFS;
189       }
190       break;
191     case Page_ZFS:
192       return Page_ZFS2;
193       break;
194     case Page_ZFS2:
195       return Page_Enc;
196       break;
197     case Page_Enc:
198       return Page_Mounts;
199       break;
200     case Page_Mounts:
201       return Page_Confirmation;
202       break;
203     case Page_Confirmation:
204       return -1;
205       break;
206     default:
207        return currentId() + 1;
208  }
209  return currentId() + 1;
210}
211
212// Logic checks to see if we are ready to move onto next page
213bool wizardDisk::validatePage()
214{
215
216  bool found;
217
218  // Generate suggested disk layout and show disk tree
219  if ( prevID == Page_BasicDisk && currentId() == Page_Mounts) {
220    generateDiskLayout();
221    populateDiskTree();
222  }
223
224  // Generate suggested disk layout and show disk tree
225  if ( prevID == Page_Enc && currentId() == Page_Mounts) {
226    generateDiskLayout();
227    populateDiskTree();
228  } 
229
230  // Show the other disks available
231  if ( prevID == Page_BasicDisk && currentId() == Page_ZFS)
232     populateZFSDisks();
233
234  // Show the other disks available
235  if ( prevID == Page_ZFS && currentId() == Page_ZFS2)
236     populateZFSDisks2();
237
238  // Basic mode, generate a disk layout and show summary
239  if ( prevID == Page_BasicDisk && currentId() == Page_Confirmation) {
240    generateDiskLayout();
241    generateConfirmationText();
242  }
243
244  // Create the final disk layout from user options
245  if ( prevID == Page_Mounts && currentId() == Page_Confirmation) {
246    generateCustomDiskLayout();
247    generateConfirmationText();
248  }
249
250  // Create the final disk layout from user options
251  if ( prevID == Page_Expert && currentId() == Page_Confirmation) {
252    generateConfirmationText();
253  }
254 
255 
256  // Reset the prevID
257  prevID = currentId();
258
259  switch (currentId()) {
260     case Page_Intro:
261         button(QWizard::NextButton)->setEnabled(true);
262         return true;
263     case Page_BasicDisk:
264       
265         if ( ! radioAdvanced->isChecked() ) {
266           checkGPT->setChecked(false);
267           checkGPT->setVisible(false);
268           checkForce4K->setVisible(false);
269           checkForce4K->setChecked(false);
270         } else {
271           checkGPT->setVisible(true);
272           checkForce4K->setVisible(true);
273         } 
274
275         // Doing a Advanced install
276         if ( radioAdvanced->isChecked() && groupZFSPool->isChecked() )
277         {
278            if ( lineZpoolName->text().isEmpty() ) {
279              button(QWizard::NextButton)->setEnabled(false);
280              return false;
281            }
282            if ( lineZpoolName->text() == "root" ) {
283              button(QWizard::NextButton)->setEnabled(false);
284              return false;
285            }
286            if ( lineZpoolName->text().contains(" ") ) {
287              button(QWizard::NextButton)->setEnabled(false);
288              return false;
289            }
290            QRegExp *re = new QRegExp("^[-'a-zA-Z][a-zA-Z0-9]*$"); 
291            if (! re->exactMatch(lineZpoolName->text()) ) {
292              button(QWizard::NextButton)->setEnabled(false);
293              return false;
294            }
295
296         }
297
298         // If the select partition is just too small, we can stop here
299         if ( ! checkDiskSpace() ) {
300           button(QWizard::NextButton)->setEnabled(false);
301           return false;
302         }
303       
304         // if we get this far, all the fields are filled in
305         button(QWizard::NextButton)->setEnabled(true);
306         return true;
307     case Page_ZFS:
308         // Check if we have valid ZFS disk options specified
309         if ( ! groupZFSOpts->isChecked() ) {
310           button(QWizard::NextButton)->setEnabled(true);
311           return true;
312         }
313         // Need at least one other disk for mirroring
314         if ( comboZFSMode->currentText() == "mirror" ) {
315            labelZFSMsg->setText(tr("Please select at least 1 other drive for mirroring"));
316            for ( int i = 0; i < listZFSDisks->count(); ++i )
317            {
318                if ( listZFSDisks->item(i)->checkState() == Qt::Checked ) {
319                   button(QWizard::NextButton)->setEnabled(true);
320                   return true;
321                }
322            }
323         }
324         if ( comboZFSMode->currentText() == "raidz1" ) {
325            labelZFSMsg->setText(tr("Please select 2 or 4 additional drives for raidz1"));
326            int numChecked = 0;
327            for ( int i = 0; i < listZFSDisks->count(); ++i )
328                if ( listZFSDisks->item(i)->checkState() == Qt::Checked )
329                   numChecked++;
330            if ( numChecked == 2 || numChecked == 4 ) {
331              button(QWizard::NextButton)->setEnabled(true);
332              return true;
333            }
334         }
335         if ( comboZFSMode->currentText() == "raidz2" ) {
336            labelZFSMsg->setText(tr("Please select 3, 5, or 9 additional drives for raidz2"));
337            int numChecked = 0;
338            for ( int i = 0; i < listZFSDisks->count(); ++i )
339                if ( listZFSDisks->item(i)->checkState() == Qt::Checked )
340                   numChecked++;
341            if ( numChecked == 3 || numChecked == 5 || numChecked == 9 ) {
342              button(QWizard::NextButton)->setEnabled(true);
343              return true;
344            }
345         }
346         if ( comboZFSMode->currentText() == "raidz3" ) {
347            labelZFSMsg->setText(tr("Please select 4, 6, or 10 additional drives for raidz3"));
348            int numChecked = 0;
349            for ( int i = 0; i < listZFSDisks->count(); ++i )
350                if ( listZFSDisks->item(i)->checkState() == Qt::Checked )
351                   numChecked++;
352            if ( numChecked == 4 || numChecked == 6 || numChecked == 10 ) {
353              button(QWizard::NextButton)->setEnabled(true);
354              return true;
355            }
356         }
357
358         // Disable the next button until we get a working config
359         button(QWizard::NextButton)->setEnabled(false);
360         return false;
361     case Page_ZFS2:
362         // Not using log / cache?
363         if ( !groupZFSCache->isChecked() && ! groupZFSLog->isChecked() )
364         {
365           button(QWizard::NextButton)->setEnabled(true);
366           return true;
367         }
368         // Using both? See if we have any duplicates
369         if ( groupZFSCache->isChecked() && groupZFSLog->isChecked() )
370         {
371            // Check for any matches
372            for ( int i = 0; i < listZFSCache->count(); ++i ) {
373                if ( listZFSCache->item(i)->checkState() == Qt::Checked )
374                  for ( int z = 0; z < listZFSLog->count(); ++z ) {
375                    if ( listZFSLog->item(z)->checkState() == Qt::Checked )
376                       if ( listZFSLog->item(z)->text() == listZFSCache->item(i)->text() ) {
377                          button(QWizard::NextButton)->setEnabled(false);
378                          return false;
379                       }
380                  }
381            }
382         }
383
384         // Check that we have at least one item checked
385         found = false;
386         if ( groupZFSCache->isChecked() )
387         {
388            for ( int i = 0; i < listZFSCache->count(); ++i )
389                if ( listZFSCache->item(i)->checkState() == Qt::Checked )
390                   found = true;
391            if ( found == false) {
392              button(QWizard::NextButton)->setEnabled(false);
393              return false;
394            }
395         }
396         if ( groupZFSLog->isChecked() )
397         {
398            for ( int i = 0; i < listZFSLog->count(); ++i )
399                if ( listZFSLog->item(i)->checkState() == Qt::Checked )
400                   found = true;
401            if ( found == false) {
402              button(QWizard::NextButton)->setEnabled(false);
403              return false;
404            }
405         }
406
407         button(QWizard::NextButton)->setEnabled(true);
408         return true;
409     case Page_Enc:
410         if ( ! groupEncrypt->isChecked() ) {
411           button(QWizard::NextButton)->setEnabled(true);
412           return true;
413         }
414         if ( lineEncPass->text().isEmpty() || lineEncPass->text() != lineEncPass2->text() ) {
415           button(QWizard::NextButton)->setEnabled(false);
416           return false;
417         }
418
419         button(QWizard::NextButton)->setEnabled(true);
420         return true;
421     case Page_Confirmation:
422         button(QWizard::FinishButton)->setEnabled(true);
423         return true;
424     default:
425         button(QWizard::NextButton)->setEnabled(true);
426         return true;
427  }
428
429  return true;
430}
431
432void wizardDisk::populateZFSDisks()
433{
434   qDebug() << "Adding ZFS disks...";
435   listZFSDisks->clear();
436
437   QString curDisk = comboDisk->currentText();
438   curDisk.truncate(curDisk.indexOf(" -"));
439
440   for (int z=0; z < sysDisks.count(); ++z)
441     if ( sysDisks.at(z).at(0) == "DRIVE" && sysDisks.at(z).at(1) != curDisk  )
442     {
443        QListWidgetItem *dItem = new QListWidgetItem(sysDisks.at(z).at(1) + " - " + sysDisks.at(z).at(2) + "MB " + sysDisks.at(z).at(3));
444        dItem->setCheckState(Qt::Unchecked);
445        listZFSDisks->addItem(dItem);
446     }
447}
448
449void wizardDisk::populateZFSDisks2()
450{
451   qDebug() << "Adding ZFS2 disks...";
452   listZFSCache->clear();
453   listZFSLog->clear();
454
455   // What is the primary target disk
456   QString curDisk = comboDisk->currentText();
457   curDisk.truncate(curDisk.indexOf(" -"));
458
459   // Get a list of other disks being used
460   QStringList usedDisks;
461   if ( groupZFSOpts->isChecked() ) {
462     for ( int i = 0; i < listZFSDisks->count(); ++i )
463        if ( listZFSDisks->item(i)->checkState() == Qt::Checked ) {
464           QString zDisk = listZFSDisks->item(i)->text();
465           zDisk.truncate(zDisk.indexOf(" -"));
466           usedDisks << zDisk;
467        }
468   }
469
470   // Now add any available disks to the combo boxes
471   for (int z=0; z < sysDisks.count(); ++z)
472     if ( sysDisks.at(z).at(0) == "DRIVE" && sysDisks.at(z).at(1) != curDisk && ! usedDisks.contains(sysDisks.at(z).at(1))  )
473     {
474        QListWidgetItem *dItem = new QListWidgetItem(sysDisks.at(z).at(1) + " - " + sysDisks.at(z).at(2) + "MB " + sysDisks.at(z).at(3));
475        dItem->setCheckState(Qt::Unchecked);
476        listZFSCache->addItem(dItem);
477        QListWidgetItem *dItem2 = new QListWidgetItem(sysDisks.at(z).at(1) + " - " + sysDisks.at(z).at(2) + "MB " + sysDisks.at(z).at(3));
478        dItem2->setCheckState(Qt::Unchecked);
479        listZFSLog->addItem(dItem2);
480     }
481}
482
483bool wizardDisk::checkDiskSpace()
484{
485  if ( getDiskSliceSize() < 4000 )
486    return false;
487
488  return true;
489}
490
491void wizardDisk::slotCheckComplete()
492{
493   // Validate this page
494   validatePage();
495}
496
497
498void wizardDisk::generateDiskLayout()
499{
500  QString targetType, tmp;
501  int targetLoc, totalSize = 0;
502  QString targetDisk, targetSlice, tmpPass, fsType, target;
503
504  // Clear out the original disk layout
505  sysFinalDiskLayout.clear();
506  QStringList fileSystem;
507  qDebug() << "Generating disk layout";
508
509  if ( comboPartition->currentIndex() == 0) {
510    targetType = "DRIVE";
511    targetSlice = "ALL";
512    targetDisk = comboDisk->currentText();
513    targetDisk.truncate(targetDisk.indexOf(" -"));
514    target = targetDisk;
515    targetLoc = 1;
516  } else {
517    targetType = "SLICE";
518    targetDisk = comboDisk->currentText();
519    targetDisk.truncate(targetDisk.indexOf(" -"));
520    targetSlice = comboPartition->currentText();
521    targetSlice.truncate(targetSlice.indexOf(":"));
522    targetSlice = targetSlice.remove(0, targetSlice.size() -2);
523    target = targetDisk + targetSlice;
524    targetLoc = 2;
525  }
526
527  // Get the size of the slice we are working on
528  totalSize = getDiskSliceSize();
529
530  // Setup some swap space
531  if ( totalSize > 30000 ) {
532    // 2GB if over 30GB of disk space, 512MB otherwise
533    swapsize = 2000;
534  } else {
535    swapsize = 512;
536  }
537  totalSize = totalSize - swapsize;
538
539
540  if ( totalSize != -1 )
541  {
542     fsType= "ZFS";
543     if ( groupEncrypt->isChecked() ) {
544        fsType="ZFS.eli";
545        tmpPass=lineEncPass->text();
546     }
547
548    QString rootOpts="";
549    rootOpts="(compress=lz4|atime=off)";
550
551     // This lets the user do nifty stuff like a mirror/raid post-install with a single zpool command
552    fileSystem << targetDisk << targetSlice << "/" + rootOpts + ",/tmp(compress=lz4|setuid=off|exec=off),/usr(canmount=off),/usr/home(compress=lz4),/usr/jails(compress=lz4),/usr/obj(compress=lz4),/usr/pbi(compress=lz4),/usr/ports(compress=lz4),/usr/ports/distfiles(compress=lz4),/usr/src(compress=lz4),/var(canmount=off|atime=on),/var/audit(compress=lz4),/var/log(compress=lz4|exec=off|setuid=off),/var/tmp(compress=lz4|exec=off|setuid=off)" << fsType << tmp.setNum(totalSize) << "" << tmpPass;
553    sysFinalDiskLayout << fileSystem;
554    fileSystem.clear();
555
556    // Now add swap space
557    fileSystem << targetDisk << targetSlice << "SWAP.eli" << "SWAP.eli" << tmp.setNum(swapsize) << "" << "";
558    sysFinalDiskLayout << fileSystem;
559    fileSystem.clear();
560
561    //qDebug() << "Auto-Gen FS:" <<  fileSystem;
562  }
563 
564  qDebug() << "AutoLayout:" <<  sysFinalDiskLayout;
565}
566
567void wizardDisk::populateDiskTree()
568{
569  QStringList tmpList, zMnts;
570  QString tmp, opts;
571
572  treeMounts->clear();
573  treeMounts->setHeaderLabels(QStringList() << "ID" << tr("ZFS Mounts") << tr("ZFS Options") );
574  treeMounts->setColumnCount(3);
575  labelFreeSpace->setVisible(false);
576  lineFreeMB->setVisible(false);
577
578  treeMounts->header()->setSectionHidden(0, true);
579  treeMounts->header()->setDefaultSectionSize(150);
580
581
582  zMnts = sysFinalDiskLayout.at(0).at(2).split(",");
583
584  // Now loop through ZFS mounts
585  for (int i=0; i < zMnts.count(); ++i) {
586    tmpList.clear();
587    opts = zMnts.at(i).section("(", 1, 1).section(")", 0, 0); 
588    tmpList << tmp.setNum(i+1) << zMnts.at(i).split("(").at(0) << opts ;
589    QTreeWidgetItem *mItem = new QTreeWidgetItem(treeMounts, tmpList);
590    mItem->setToolTip(2, opts);
591  }
592
593  treeMounts->setCurrentItem(treeMounts->findItems("0", Qt::MatchFixedString).at(0));
594  slotTreeDiskChanged(); 
595
596  if ( restoreMode ) {
597     treeMounts->setEnabled(false);
598     pushRemoveMount->setEnabled(false);
599     pushAddMount->setEnabled(false);
600     labelMounts->setText(tr("The original system datasets / mount-points will be automatically restored."));
601  }
602
603}
604
605int wizardDisk::getDiskSliceSize()
606{
607  bool ok;
608  QString disk = comboDisk->currentText();
609  disk.truncate(disk.indexOf(" -"));
610
611  int safeBuf = 10;
612
613  // If on EFI we subtract 100MiB to save for a FAT16/EFI partition
614  if ( efiMode )
615    safeBuf = 110;
616
617
618  // Check the full disk
619  if ( comboPartition->currentIndex() == 0) {
620    for (int i=0; i < sysDisks.count(); ++i) {
621      // Make sure to only add the drives to the comboDiskList
622      if ( sysDisks.at(i).at(0) == "DRIVE" && sysDisks.at(i).at(1) == disk ) {
623        //qDebug() << "Selected Disk Size: " +  sysDisks.at(i).at(2);
624        sysDisks.at(i).at(2).toInt(&ok);
625        if( ok )
626          return sysDisks.at(i).at(2).toInt(&ok) - safeBuf;
627        else
628          return -1;
629      }
630    }
631  } else {
632    // Check the selected partition
633    QString slice = comboPartition->currentText();
634    slice.truncate(slice.indexOf(":"));
635    for (int i=0; i < sysDisks.count(); ++i) {
636      // Make sure to only add the slices to the listDiskSlices
637      if ( sysDisks.at(i).at(0) == "SLICE" && slice == sysDisks.at(i).at(2)) {
638        //qDebug() << "Selected Slice Size: " +  sysDisks.at(i).at(3);
639        sysDisks.at(i).at(3).toInt(&ok);
640        if( ok )
641          return sysDisks.at(i).at(3).toInt(&ok) - safeBuf;
642        else
643          return -1;
644      }
645    }
646  }
647
648  return -1;
649}
650
651void wizardDisk::slotTreeDiskChanged()
652{
653   if ( ! treeMounts->currentItem() )
654     return;
655
656   pushRemoveMount->setEnabled(true);
657   pushAddMount->setEnabled(true);
658
659   if ( treeMounts->currentItem()->text(1) == "/boot" || treeMounts->currentItem()->text(1) == "/")
660     pushRemoveMount->setEnabled(false);
661
662   if ( lineFreeMB->text() == "0" )
663     pushAddMount->setEnabled(false);
664}
665
666void wizardDisk::slotResizeFS()
667{
668  if ( ! treeMounts->currentItem() )
669  return;
670
671  QString mnt = treeMounts->currentItem()->text(1);
672  bool ok;
673  int curSize, availSize, minSize; 
674  curSize =  treeMounts->currentItem()->text(2).toInt(&ok);
675  availSize = curSize + lineFreeMB->text().toInt(&ok);
676
677  minSize = 100;
678
679  // See if we need some other sanity check on sizes
680  if ( mnt == "SWAP.eli" )
681    minSize = 256;
682  if ( mnt == "/" )
683    minSize = 2000;
684  if ( mnt == "/boot" )
685    minSize = 1000;
686
687  addingMount="";
688  rFS = new dialogFSSize();
689  rFS->programInit(QString(tr("Resizing") + " " + mnt), curSize, availSize, minSize);
690  rFS->setWindowModality(Qt::ApplicationModal);
691  connect(rFS, SIGNAL(saved(int)), this, SLOT(slotSaveFSResize(int)));
692  rFS->show();
693  rFS->raise();
694}
695
696void wizardDisk::slotRemoveFS()
697{
698  if ( ! treeMounts->currentItem() )
699  return;
700
701  int ret = QMessageBox::question(this, tr("Remove mount-point"),
702              tr("Are you sure you want to remove this mount point?"),
703              QMessageBox::Yes | QMessageBox::No,
704              QMessageBox::No);
705
706  if ( ret != QMessageBox::Yes )
707    return;
708 
709  QTreeWidgetItem *rmItem = treeMounts->currentItem();
710  treeMounts->setCurrentItem(treeMounts->findItems("0", Qt::MatchFixedString).at(0));
711
712  delete rmItem;
713}
714
715void wizardDisk::slotAddFS()
716{
717  bool ok;
718  QString tmp;
719  QString nMount = QInputDialog::getText(this, tr("Enter mount-point"),
720                                          tr("Please enter the new mount-point:"), QLineEdit::Normal,
721                                          "/", &ok);
722  if (!ok || nMount.isEmpty())
723    return;
724
725  // Sanity checks
726  ////////////////////////////////////////
727  if ( nMount.indexOf("/") != 0 ) {
728      QMessageBox::critical(this, tr("Invalid Mount"),
729              tr("Mount point should start with '/'"),
730              QMessageBox::Ok,
731              QMessageBox::Ok);
732      return;
733  }
734  // End sanity checks
735  ////////////////////////////////////////
736
737  // Make sure this mount doesn't already exist
738  QList<QTreeWidgetItem *> mItems = treeMounts->findItems("*", Qt::MatchWildcard);
739  for ( int i = 0; i < mItems.size(); ++i) {
740    if ( mItems.at(i)->text(1) == nMount )
741      return;
742  }
743
744  new QTreeWidgetItem(treeMounts, QStringList() << tmp.setNum(mItems.size() + 1) << nMount );
745}
746
747void wizardDisk::slotSaveFSResize(int newSize)
748{
749
750  QString tmp, tmp2;
751  bool ok;
752  int oSize, availSize, tSize, newAvailSize;
753
754  // If adding a new mount point
755  if ( ! addingMount.isEmpty() ) {
756    QList<QTreeWidgetItem *> mItems = treeMounts->findItems("*", Qt::MatchWildcard);
757    new QTreeWidgetItem(treeMounts, QStringList() << tmp.setNum(mItems.size() + 1) << addingMount << tmp2.setNum(newSize) << "UFS+SUJ" );
758    addingMount="";
759    availSize = lineFreeMB->text().toInt(&ok); 
760    newAvailSize = availSize - newSize;
761    lineFreeMB->setText(tmp.setNum(newAvailSize));
762    return;
763  } 
764
765  if ( ! treeMounts->currentItem() )
766    return;
767
768  // Just resizing an existing partition
769  oSize = treeMounts->currentItem()->text(2).toInt(&ok); 
770  treeMounts->currentItem()->setText(2, tmp.setNum(newSize));
771
772  // Set the available size
773  if ( oSize > newSize ) {
774    tSize = oSize - newSize;
775    availSize = lineFreeMB->text().toInt(&ok); 
776    newAvailSize = availSize + tSize;
777  } else {
778    tSize = newSize - oSize;
779    availSize = lineFreeMB->text().toInt(&ok); 
780    newAvailSize = availSize - tSize;
781  }
782  lineFreeMB->setText(tmp.setNum(newAvailSize));
783
784  // Check if we need to enable the add button
785  if ( newAvailSize >= 100 )
786    pushAddMount->setEnabled(true);
787  else
788    pushAddMount->setEnabled(false);
789}
790
791void wizardDisk::slotTreeMountsRightClick()
792{
793  if ( ! treeMounts->currentItem() )
794    return;
795
796  popup = new QMenu();
797  popup->setTitle(tr("Editing:") + " " + treeMounts->currentItem()->text(1));
798  popup->addSeparator();
799
800  // Create atime sub-menu
801  popupAT = popup->addMenu("atime");
802  popupAT->addAction( "on", this, SLOT(slotZATON()));
803  popupAT->addAction( "off", this, SLOT(slotZATOFF()));
804
805  // Create canmount sub-menu
806  popupCM = popup->addMenu("canmount");
807  popupCM->addAction( "on", this, SLOT(slotZCMON()));
808  popupCM->addAction( "off", this, SLOT(slotZCMOFF()));
809  popupCM->addAction( "noauto", this, SLOT(slotZCMNOAUTO()));
810
811  // Create Checksum sub-menu
812  popupCH = popup->addMenu("checksum");
813  popupCH->addAction( "on", this, SLOT(slotZChkON()));
814  popupCH->addAction( "off", this, SLOT(slotZChkOFF()));
815
816  // Create compression sub-menu
817  popupCmp = popup->addMenu("compression");
818  popupCmp->addAction( "off", this, SLOT(slotZCmpOFF()));
819  popupCmp->addAction( "on", this, SLOT(slotZCmpON()));
820  popupCmp->addAction( "lz4", this, SLOT(slotZCmpLZ4()));
821  popupCmp->addAction( "lzjb", this, SLOT(slotZCmpLZJB()));
822  popupCmp->addAction( "gzip", this, SLOT(slotZCmpGZIP()));
823  popupCmp->addAction( "zle", this, SLOT(slotZCmpZLE()));
824
825  // Create dedup sub-menu
826  // dedup is disabled for now, until such time as it is safe in all cases
827  //popupDD = popup->addMenu("dedup");
828  //popupDD->addAction( "off", this, SLOT(slotZDDOFF()));
829  //popupDD->addAction( "on", this, SLOT(slotZDDON()));
830  //popupDD->addAction( "verify", this, SLOT(slotZDDVERIFY()));
831
832  // Create exec sub-menu
833  popupNE = popup->addMenu("exec");
834  popupNE->addAction( "on", this, SLOT(slotZEXON()));
835  popupNE->addAction( "off", this, SLOT(slotZEXOFF()));
836
837  // Add setuid sub-menu
838  popupNE = popup->addMenu("setuid");
839  popupNE->addAction( "on", this, SLOT(slotZSUIDON()));
840  popupNE->addAction( "off", this, SLOT(slotZSUIDOFF()));
841
842  popup->exec( QCursor::pos() );
843
844}
845
846void wizardDisk::slotZCMNOAUTO()
847{
848  toggleZFSOpt(QString("canmount=noauto"));
849}
850
851void wizardDisk::slotZCMOFF()
852{
853  toggleZFSOpt(QString("canmount=off"));
854}
855
856void wizardDisk::slotZCMON()
857{
858  toggleZFSOpt(QString("canmount=on"));
859}
860
861void wizardDisk::slotZDDVERIFY()
862{
863  toggleZFSOpt(QString("dedup=verify"));
864}
865
866void wizardDisk::slotZDDON()
867{
868  toggleZFSOpt(QString("dedup=on"));
869}
870
871void wizardDisk::slotZDDOFF()
872{
873  toggleZFSOpt(QString("dedup=off"));
874}
875
876void wizardDisk::slotZCmpZLE()
877{
878  toggleZFSOpt(QString("compress=zle"));
879}
880
881void wizardDisk::slotZCmpGZIP()
882{
883  toggleZFSOpt(QString("compress=gzip"));
884}
885
886void wizardDisk::slotZCmpLZ4()
887{
888  toggleZFSOpt(QString("compress=lz4"));
889}
890
891void wizardDisk::slotZCmpLZJB()
892{
893  toggleZFSOpt(QString("compress=lzjb"));
894}
895
896void wizardDisk::slotZCmpOFF()
897{
898  toggleZFSOpt(QString("compress=off"));
899}
900
901void wizardDisk::slotZCmpON()
902{
903  toggleZFSOpt(QString("compress=on"));
904}
905
906void wizardDisk::slotZChkOFF()
907{
908  toggleZFSOpt(QString("checksum=off"));
909}
910
911void wizardDisk::slotZChkON()
912{
913  toggleZFSOpt(QString("checksum=on"));
914}
915
916void wizardDisk::slotZATON()
917{
918  toggleZFSOpt(QString("atime=on"));
919}
920
921void wizardDisk::slotSwapSize()
922{
923  bool ok;
924  QString tmp;
925  int size = QInputDialog::getInt(this, tr("Enter SWAP size"),
926                                  tr("Size (MB)"), swapsize, 0, 1000000, 1, &ok);
927  if ( ok )
928    swapsize = size;
929}
930
931void wizardDisk::slotZATOFF()
932{
933  toggleZFSOpt(QString("atime=off"));
934}
935
936void wizardDisk::slotZEXOFF()
937{
938  toggleZFSOpt(QString("exec=off"));
939}
940
941void wizardDisk::slotZEXON()
942{
943  toggleZFSOpt(QString("exec=on"));
944}
945
946void wizardDisk::slotZSUIDOFF()
947{
948  toggleZFSOpt(QString("setuid=off"));
949}
950
951void wizardDisk::slotZSUIDON()
952{
953  toggleZFSOpt(QString("setuid=on"));
954}
955
956// Toggle an option being on / off for ZFS
957void wizardDisk::toggleZFSOpt(QString option)
958{
959  if ( ! treeMounts->currentItem() )
960    return;
961
962  bool found = false;
963  QString optTag = option.section("=", 0, 0);
964  QString tmpTag;
965  QStringList newOpts;
966  QStringList curOpts = treeMounts->currentItem()->text(2).split("|");
967  for (int i=0; i < curOpts.count(); ++i) {
968    tmpTag=curOpts.at(i).section("=", 0, 0);
969    if ( optTag == tmpTag ) {
970      found = true;
971      // Only save option if setting to new value
972      if ( option != curOpts.at(i) )
973        newOpts << option;
974    } else {
975      if ( !curOpts.at(i).isEmpty() )
976        newOpts << curOpts.at(i);
977    }
978  }
979
980  if ( ! found )
981      newOpts << option;
982
983  QString optString;
984  if ( newOpts.count() <= 1)
985    optString = newOpts.join("");
986  else
987    optString = newOpts.join("|");
988
989  treeMounts->currentItem()->setText(2, optString);
990  treeMounts->currentItem()->setToolTip(2, optString);
991}
992
993void wizardDisk::generateCustomDiskLayout()
994{
995  QString targetType, tmp;
996  int targetLoc;
997  QString targetDisk, targetSlice, tmpPass, fsType, target;
998
999  // Clear out the original disk layout
1000  sysFinalDiskLayout.clear();
1001  QStringList fileSystem;
1002  qDebug() << "Generating custom disk layout";
1003       
1004  if ( comboPartition->currentIndex() == 0) {
1005    targetType = "DRIVE";
1006    targetSlice = "ALL";
1007    targetDisk = comboDisk->currentText();
1008    targetDisk.truncate(targetDisk.indexOf(" -"));
1009    target = targetDisk;
1010    targetLoc = 1;
1011  } else {
1012    targetType = "SLICE";
1013    targetDisk = comboDisk->currentText();
1014    targetDisk.truncate(targetDisk.indexOf(" -"));
1015    targetSlice = comboPartition->currentText();
1016    targetSlice.truncate(targetSlice.indexOf(":"));
1017    targetSlice = targetSlice.remove(0, targetSlice.size() -2);
1018    target = targetDisk + targetSlice;
1019    targetLoc = 2;
1020  }
1021
1022  // Start building the ZFS file-systems
1023  QStringList zMnts;
1024  fsType = "ZFS";
1025  if ( groupEncrypt->isChecked() ) {
1026    fsType="ZFS.eli";
1027    tmpPass=lineEncPass->text();
1028  }
1029  int zpoolSize = getDiskSliceSize();
1030
1031  // Deduct any swap space
1032  zpoolSize = zpoolSize - swapsize;
1033
1034  // Get the zfs mounts
1035  QList<QTreeWidgetItem *> mItems = treeMounts->findItems("*", Qt::MatchWildcard);
1036  for ( int i = 0; i < mItems.size(); ++i) {
1037    if ( mItems.at(i)->text(2).isEmpty() )
1038      zMnts << mItems.at(i)->text(1);
1039    else
1040      zMnts << mItems.at(i)->text(1) + "(" + mItems.at(i)->text(2) + ")";
1041  }
1042
1043  // If we have any additional ZFS mirror / raidz devices set it up now
1044  QString zOpts, zDisk;
1045  if ( groupZFSOpts->isChecked() && comboPartition->currentIndex() == 0 ) {
1046     zOpts = comboZFSMode->currentText() + ":";
1047     for ( int i = 0; i < listZFSDisks->count(); ++i )
1048        if ( listZFSDisks->item(i)->checkState() == Qt::Checked ) {
1049           zDisk = listZFSDisks->item(i)->text();
1050           zDisk.truncate(zDisk.indexOf(" -"));
1051           zOpts = zOpts + " " + zDisk;
1052        }
1053  }
1054  // Any additional ZFS cache devices?
1055  if ( groupZFSCache->isChecked() ) {
1056     zOpts+=" cache";
1057     for ( int i = 0; i < listZFSCache->count(); ++i )
1058        if ( listZFSCache->item(i)->checkState() == Qt::Checked ) {
1059           zDisk = listZFSCache->item(i)->text();
1060           zDisk.truncate(zDisk.indexOf(" -"));
1061           zOpts = zOpts + " " + zDisk;
1062        }
1063  }
1064  // Any additional ZFS log devices?
1065  if ( groupZFSLog->isChecked() ) {
1066     zOpts+=" log";
1067     for ( int i = 0; i < listZFSLog->count(); ++i )
1068        if ( listZFSLog->item(i)->checkState() == Qt::Checked ) {
1069           zDisk = listZFSLog->item(i)->text();
1070           zDisk.truncate(zDisk.indexOf(" -"));
1071           zOpts = zOpts + " " + zDisk;
1072        }
1073  }
1074
1075  // Save the final disk layout
1076  fileSystem.clear();
1077  fileSystem << targetDisk << targetSlice << zMnts.join(",") << fsType << tmp.setNum(zpoolSize) << zOpts << tmpPass;
1078  sysFinalDiskLayout << fileSystem;
1079
1080  // Now add swap space
1081  fileSystem.clear();
1082  fileSystem << targetDisk << targetSlice << "SWAP.eli" << "SWAP.eli" << tmp.setNum(swapsize) << "" << "";
1083  sysFinalDiskLayout << fileSystem;
1084
1085  qDebug() <<"AutoLayout:" << sysFinalDiskLayout;
1086}
1087
1088void wizardDisk::generateConfirmationText()
1089{
1090  // If running in expert mode, we just create a simple config / confirmation
1091  if ( radioExpert->isChecked() ) {
1092    QStringList filesystem;
1093    filesystem << "MANUAL" << "/mnt" ;
1094    sysFinalDiskLayout << filesystem;
1095    textConfirmation->setText(tr("Installing to file-system mounted at /mnt"));
1096    return;
1097  }
1098
1099  QList<QStringList> copyList;
1100  QStringList summaryList;
1101  QString tmp, workingDisk, workingSlice, tmpSlice, XtraTmp, startPart, sliceSize;
1102  int disk = 0;
1103
1104  // Copy over the list to a new variable we can mangle without modifying the original
1105  copyList = sysFinalDiskLayout;
1106
1107  // Start our summary
1108  summaryList << "";
1109  summaryList << "<b>" + tr("The disk will be setup with the following configuration:") + "</b>";
1110
1111  while ( ! copyList.empty() )
1112  {
1113    workingDisk = copyList.at(0).at(0);
1114    workingSlice = copyList.at(0).at(1);
1115    tmpSlice = workingSlice;
1116
1117    // Check if this is an install to "Unused Space"
1118    for (int z=0; z < sysDisks.count(); ++z)
1119      if ( sysDisks.at(z).at(0) == "SLICE" \
1120        && sysDisks.at(z).at(2) == workingDisk + workingSlice \
1121        && sysDisks.at(z).at(4) == "Unused Space" )
1122          tmpSlice = "free";
1123
1124    // Check for any mirror for this device
1125    for (int i=0; i < copyList.count(); ++i) {
1126       if ( copyList.at(i).at(2).indexOf("MIRROR(" + workingDisk + ")") != -1 )
1127       {
1128         summaryList << tr("Disk:") + copyList.at(i).at(0) + " " + tr("Mirroring:") + workingDisk;
1129         copyList.removeAt(i);
1130         break;
1131       }
1132    }
1133
1134    // If after doing the mirror, our list is empty, break out
1135    if ( copyList.empty() )
1136      break;
1137   
1138    // If there is a dedicated /boot partition, need to list that first, see what is found
1139    for (int i=0; i < copyList.count(); ++i) {
1140      QStringList mounts = copyList.at(i).at(2).split(",");
1141      for (int z = 0; z < mounts.size(); ++z) {
1142        if ( copyList.at(i).at(0) == workingDisk \
1143          && copyList.at(i).at(1) == workingSlice \
1144          && mounts.at(z) == "/boot" )
1145                startPart="/boot";
1146      }
1147    }
1148
1149    // If no dedicated /boot partition, then lets list "/" first
1150    if(startPart.isEmpty())
1151        startPart="/";
1152
1153    // Start by looking for the root partition
1154    for (int i=0; i < copyList.count(); ++i) {
1155      QStringList mounts = copyList.at(i).at(2).split(",");
1156      for (int z = 0; z < mounts.size(); ++z) {
1157        if ( copyList.at(i).at(0) == workingDisk \
1158          && copyList.at(i).at(1) == workingSlice \
1159          && mounts.at(z) == startPart ) {
1160
1161          // Check if we have any extra arguments to throw on the end
1162          XtraTmp="";
1163          if ( ! copyList.at(i).at(5).isEmpty() )
1164            XtraTmp=" (" + copyList.at(i).at(5) + ")" ;
1165
1166          // Write the user summary
1167          summaryList << "";
1168          summaryList << tr("Partition:") + " " + workingDisk + "(" + workingSlice + "):";
1169          summaryList << tr("FileSystem:") + " " + copyList.at(i).at(3);
1170          summaryList << tr("Size:") + " " + copyList.at(i).at(4) + "MB ";
1171
1172          if ( copyList.at(i).at(3) == "ZFS" || copyList.at(i).at(3) == "ZFS.eli" ) {
1173            QStringList zDS = copyList.at(i).at(2).split(",/");
1174            QString zTMP;
1175            for (int ds = 0; ds < zDS.size(); ++ds) {
1176              if ( zDS.at(ds) != "/" )
1177                zDS.replace(ds, "/" + zDS.at(ds));
1178              if ( zDS.at(ds).indexOf("(") != -1 ) {
1179                zTMP = zDS.at(ds);
1180                zTMP.replace("(", " (");
1181                zDS.replace(ds, zTMP );
1182              }
1183            }
1184            summaryList << tr("ZFS Datasets:<br>") + " " + zDS.join("<br>");
1185          } else {
1186            summaryList << tr("Mount:") + " " + copyList.at(i).at(2);
1187          }
1188          if ( ! XtraTmp.isEmpty() ) {
1189            summaryList << tr("Options:") + " " + copyList.at(i).at(5);
1190          }
1191
1192          // Done with this item, remove it now
1193          copyList.removeAt(i);
1194          break;
1195        }
1196      }
1197    }
1198
1199
1200    // Now look for SWAP
1201    for (int i=0; i < copyList.count(); ++i) {
1202      if ( copyList.at(i).at(0) == workingDisk \
1203        && copyList.at(i).at(1) == workingSlice \
1204        && copyList.at(i).at(2) == "SWAP.eli" ) {
1205
1206        // Write the user summary
1207        summaryList << "";
1208        summaryList << tr("Partition:") + " " + workingDisk + "(" + workingSlice + "):";
1209        summaryList << tr("FileSystem:") + " " + copyList.at(i).at(3);
1210        summaryList << tr("Size:") + " " + copyList.at(i).at(4) + "MB ";
1211
1212        // Done with this item, remove it now
1213        copyList.removeAt(i);
1214        break;
1215      }
1216    }
1217
1218 
1219    // Now look for any other partitions
1220    int count = copyList.count();
1221    for (int i=0; i < count; ++i) {
1222      if ( copyList.at(i).at(0) == workingDisk \
1223        && copyList.at(i).at(1) == workingSlice ) {
1224
1225        // Check if we have any extra arguments to throw on the end
1226        XtraTmp="";
1227        if ( ! copyList.at(i).at(5).isEmpty() )
1228          XtraTmp=" (" + copyList.at(i).at(5) + ")" ;
1229
1230        // If we are working on the last partition, set the size to 0 to use remaining disk
1231        if ( i == (count - 1) ) 
1232                sliceSize = "0";
1233        else
1234                sliceSize=copyList.at(i).at(4);
1235
1236        // Write the user summary
1237        summaryList << "";
1238        summaryList << tr("Partition:") + " " + workingDisk + "(" + workingSlice + "):";
1239        summaryList << tr("FileSystem:") + " " + copyList.at(i).at(3);
1240        summaryList << tr("Size:") + " " + copyList.at(i).at(4) + "MB ";
1241        summaryList << tr("Mount:") + " " + copyList.at(i).at(2);
1242        if ( ! XtraTmp.isEmpty() ) {
1243          summaryList << tr("Options:") + " " + copyList.at(i).at(5);
1244        }
1245
1246        // Done with this item, remove it now
1247        copyList.removeAt(i);
1248        i--;
1249        count--;
1250      }
1251    }
1252
1253    // Increment our disk counter
1254    disk++;
1255  }
1256
1257  textConfirmation->setText(summaryList.join("<br>"));
1258}
1259
1260void wizardDisk::slotTerminal()
1261{
1262  system("xterm &");
1263}
1264
1265void wizardDisk::setRestoreMode()
1266{
1267  restoreMode=true;
1268}
1269
1270void wizardDisk::slotGPTClicked()
1271{
1272   // Right now we can't do the dirty "gnop" trick on GPT
1273   // Mangles the partitions and fails to boot
1274   if ( checkGPT->isChecked() )
1275   {
1276     checkForce4K->setChecked(false);
1277     checkForce4K->setEnabled(false);
1278   } else {
1279     checkForce4K->setEnabled(true);
1280   }
1281}
Note: See TracBrowser for help on using the repository browser.