source: src-qt4/libpcbsd/ui/metaWidget.cpp @ 1620346

9.1-release9.2-releasereleng/10.0releng/10.0.1
Last change on this file since 1620346 was 1620346, checked in by Kris Moore <kris@…>, 12 months ago

Initial import of PC-BSD /current/ SVN repo

  • Property mode set to 100644
File size: 22.6 KB
Line 
1#include <QRegExp>
2#include <QString>
3#include <QStringList>
4#include <QFile>
5#include <QTextStream>
6#include <QProcess>
7#include <QApplication>
8#include <QDebug>
9
10#include <QObject>
11#include <QDialog>
12#include <QFormLayout>
13#include <QLabel>
14#include <QLineEdit>
15#include <QPushButton>
16#include <QSettings>
17
18//#include "pcbsd-utils.h"
19#include "pcbsd-ui.h"
20#include "dialogInfoBox.h"
21#include "dialogMetaProgress.h"
22
23#include "../../config.h"
24
25////////////////////////////////////////////////////////////////////////////
26// Code for the meta-pkg widget
27///////////////////////////////////////////////////////////////////////////
28void metaWidget::init(QString chroot)
29{
30  stopped = false;
31  qDebug() << "Starting metaWidget...";
32  treeMetaPkgs = new QTreeWidget();
33  if ( chroot.isEmpty() ) {
34    treeMetaPkgs->setHeaderLabel("System Meta Pkgs");
35  } else {
36    treeMetaPkgs->setHeaderLabel(QString("Meta Pkgs for") + QString(" ") + chroot);
37    chrootArg1="--chroot";
38    chrootArg2=chroot;
39  }
40 
41  QVBoxLayout *verticalLayout = new QVBoxLayout(this);
42  verticalLayout->addWidget(treeMetaPkgs);
43  pushApplyMeta = new QPushButton(tr("Apply"));
44  verticalLayout->addWidget(pushApplyMeta);
45  QHBoxLayout *hLayout = new QHBoxLayout();
46  QSpacerItem *dSpace = new QSpacerItem(10,30, QSizePolicy::MinimumExpanding, QSizePolicy::Maximum);
47  hLayout->insertSpacerItem(0, dSpace);
48  hLayout->addWidget(pushApplyMeta);
49  hLayout->insertSpacerItem(-1, dSpace);
50  verticalLayout->insertLayout(-1, hLayout);
51  qDebug() << "Done metaWidget...";
52  PkgSet = "pcbsd";
53
54  Arch = getLineFromCommandOutput("uname -m");
55
56  populateMetaPkgs();
57
58  // Connect our slots
59  treeMetaPkgs->setContextMenuPolicy(Qt::CustomContextMenu);
60  connect(treeMetaPkgs, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(slotMetaRightClick()) );
61  connect(pushApplyMeta, SIGNAL( clicked() ), this, SLOT( slotApplyMetaChanges() ) );
62
63
64}
65
66
67// Display found meta-pkg data
68void metaWidget::populateMetaPkgs()
69{
70  pushApplyMeta->setEnabled(false);
71  treeMetaPkgs->clear();
72  tmpMetaPkgList.clear();
73  new QTreeWidgetItem(treeMetaPkgs, QStringList() << tr("Loading... Please wait...") );
74
75  if ( ! metaPkgList.isEmpty() )
76        disconnect(treeMetaPkgs, SIGNAL(itemChanged(QTreeWidgetItem *, int)), 0, 0);
77  metaPkgList.clear();
78
79  // Start the process to get meta-pkg info
80  getMetaProc = new QProcess();
81  qDebug() << "Searching for meta-pkgs...";
82  connect( getMetaProc, SIGNAL(readyReadStandardOutput()), this, SLOT(slotGetPackageDataOutput()) );
83  connect( getMetaProc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotFinishLoadingMetaPkgs()) );
84  getMetaProc->setProcessChannelMode(QProcess::MergedChannels);
85  getMetaProc->start(QString("pc-metapkgmanager"), QStringList() << chrootArg1 << chrootArg2 << "list");
86
87}
88
89// Display found meta-pkg data
90void metaWidget::slotFinishLoadingMetaPkgs()
91{
92
93  // Populate the metaPkgList
94  parseTmpMetaList();
95
96  treeMetaPkgs->clear();
97
98  addTreeItems(QString()); 
99
100  connect(treeMetaPkgs, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotDeskPkgsChanged(QTreeWidgetItem *, int)));
101}
102
103void metaWidget::addTreeItems(QString parent)
104{
105  for (int z=0; z < metaPkgList.count(); ++z) {
106    if ( metaPkgList.at(z).at(3) != parent )
107      continue;
108
109    // Hide the "base-system" package, since we are installing it anyway
110    if (metaPkgList.at(z).at(0) == "base-system" )
111      return;
112
113    QTreeWidgetItem *deskItem = new QTreeWidgetItem(QStringList() << metaPkgList.at(z).at(0) );
114    deskItem->setIcon(0, QIcon(metaPkgList.at(z).at(2)));
115    deskItem->setToolTip(0, metaPkgList.at(z).at(1));
116    deskItem->setCheckState(0, Qt::Unchecked);
117
118    if ( metaPkgList.at(z).at(5) == "YES" )
119      deskItem->setCheckState(0, Qt::Checked);
120
121    if ( parent.isEmpty() ) {
122      treeMetaPkgs->addTopLevelItem(deskItem);
123    } else {
124      // Locate the parent to attach to
125      QTreeWidgetItemIterator it(treeMetaPkgs);
126      while (*it) {
127        if ((*it)->text(0) == parent ) {
128          (*it)->addChild(deskItem);
129          if ( metaPkgList.at(z).at(5) == "YES" && (*it)->checkState(0) == Qt::Unchecked)
130            (*it)->setCheckState(0, Qt::PartiallyChecked);
131          if ( metaPkgList.at(z).at(5) == "NO" && (*it)->checkState(0) == Qt::Checked)
132            (*it)->setCheckState(0, Qt::PartiallyChecked);
133          break;
134        }
135        it++;
136      }
137    }
138
139    // Now look for any possible children
140    addTreeItems(metaPkgList.at(z).at(0));   
141  }
142}
143
144// Check if a meta-pkg is installed
145bool metaWidget::isMetaPkgInstalled(QString mPkg)
146{
147  QString tmp;
148  QProcess pcmp;
149  pcmp.start(QString("pc-metapkgmanager"), QStringList() << chrootArg1 << chrootArg2 << "status" << mPkg);
150  while ( pcmp.state() != QProcess::NotRunning ) {
151     pcmp.waitForFinished(50);
152     QCoreApplication::processEvents();
153  }
154
155  while (pcmp.canReadLine()) {
156     tmp = pcmp.readLine().simplified();
157     if ( tmp.indexOf("is installed") != -1 )
158     return true;
159  }
160
161  return false;
162}
163
164// Function which checks for our GUI package schema data
165void metaWidget::slotGetPackageDataOutput()
166{
167  while (getMetaProc->canReadLine())
168        tmpMetaPkgList << getMetaProc->readLine().simplified();
169}
170
171// Parse the pc-metapkg saved output
172void metaWidget::parseTmpMetaList()
173{
174  QString tmp, mName, mDesc, mIcon, mParent, mDesktop, mInstalled, mPkgFileList;
175  QStringList package;
176
177  for ( int i = 0 ; i < tmpMetaPkgList.size(); i++ )
178  {
179        QApplication::processEvents();
180
181        // If we've requested to stop this widget, we can safely quit here
182        if ( stopped )
183          return;
184
185        tmp = tmpMetaPkgList.at(i);
186
187        if ( tmp.indexOf("Meta Package: ") == 0) {
188                mName = tmp.replace("Meta Package: ", "");
189                continue;
190        }
191        if ( tmp.indexOf("Description: ") == 0) {
192                mDesc = tmp.replace("Description: ", "");
193                continue;
194        }
195        if ( tmp.indexOf("Icon: ") == 0) {
196                mIcon = tmp.replace("Icon: ", "");
197                mPkgFileList = mIcon;
198                mPkgFileList.replace("pkg-icon.png", "pkg-list");
199                continue;
200        }
201        if ( tmp.indexOf("Parent: ") == 0) {
202                mParent = tmp.replace("Parent: ", "");
203                continue;
204        }
205        if ( tmp.indexOf("Desktop: ") == 0) {
206                mDesktop = tmp.replace("Desktop: ", "");
207                continue;
208        }
209
210        // This is an empty category
211        if ( tmp.indexOf("Category Entry") == 0) {
212                // Now add this category to the string list
213                package.clear();
214                qDebug() << "Found Package" << mName << mDesc << mIcon << mParent << mDesktop;
215                mInstalled = "CATEGORY";
216                package << mName << mDesc << mIcon << mParent << mDesktop << mInstalled;
217                metaPkgList.append(package);
218                mName=""; mDesc=""; mIcon=""; mParent=""; mDesktop=""; mInstalled=""; mPkgFileList="";
219        }
220
221        // We have a Meta-Pkg
222        if ( tmp.indexOf("Required Packages:") == 0) {
223                // Now add this meta-pkg to the string list
224                package.clear();
225                qDebug() << "Found Package" << mName << mDesc << mIcon << mParent << mDesktop << mPkgFileList;
226
227                if ( isMetaPkgInstalled(mName) )
228                        mInstalled = "YES";
229                else
230                        mInstalled = "NO";
231
232                package << mName << mDesc << mIcon << mParent << mDesktop << mInstalled << mPkgFileList;
233                metaPkgList.append(package);
234                mName=""; mDesc=""; mIcon=""; mParent=""; mDesktop=""; mInstalled=""; mPkgFileList="";
235        }
236
237    }
238
239}
240
241void metaWidget::saveMetaPkgs()
242{
243        if ( ! haveMetaPkgChanges() )
244                return;
245
246        addPkgs = getAddPkgs();
247        delPkgs = getDelPkgs(); 
248
249        startMetaChanges();
250
251}
252
253void metaWidget::slotMetaDelCanceled()
254{
255  canceled=true;
256  qDebug() << "Stopping pc-metapkgmanager";
257  delMetaProc->terminate();
258  delMetaProc->waitForFinished(500);
259  while ( delMetaProc->state() != QProcess::NotRunning ) {
260     QCoreApplication::processEvents();
261     delMetaProc->waitForFinished(100);
262     delMetaProc->kill();
263  }
264  qDebug() << "Done stopping pc-metapkgmanager";
265}
266
267void metaWidget::startMetaChanges()
268{
269
270        canceled=false;
271        qDebug() << "Starting meta deletion";
272        // We've gotten this far, now time to do the actual meta pkg changes
273        if ( ! delPkgs.isEmpty() ) {
274
275                metaProgressDel = new metaProgressDialog();
276                metaProgressDel->programInit(tr("Performing system-package changes."));
277                // Connect canceled slot
278                connect( (QObject*)metaProgressDel, SIGNAL(canceled()), (QObject*)this, SLOT(slotMetaDelCanceled()) );
279                metaProgressDel->show();
280
281                delMetaProc = new QProcess();
282                delMetaProc->setProcessChannelMode(QProcess::MergedChannels);
283                connect( delMetaProc, SIGNAL(readyReadStandardOutput()), this, SLOT(slotMetaDelRead()) );
284                connect( delMetaProc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotMetaDelDone()) );
285                delMetaProc->start("pc-metapkgmanager", QStringList() << chrootArg1 << chrootArg2 << "del" << delPkgs);
286        } else
287                slotMetaDelDone();
288
289
290}
291
292void metaWidget::slotMetaDelRead()
293{
294        bool ok;
295
296        while ( delMetaProc->canReadLine() ) {
297                QString line = delMetaProc->readLine();
298                if ( line.indexOf("Pending Meta-Package changes: ") != -1 ) {
299                        line = line.replace("Pending Meta-Package changes: ", "");
300                        line.toInt(&ok);
301                        if ( ok ) {
302                                metaProgressDel->setTotalRange(0, line.toInt(&ok) + 1);
303                                metaProgressDel->setTotalVal(0);
304                        }
305                        continue;
306                }
307
308                if ( line.indexOf("Removing Meta-Package: ") != -1 ) { 
309                        metaProgressDel->setTotalVal(metaProgressDel->getTotalVal() + 1);
310                        metaProgressDel->setTotalDesc(line);
311                        continue;
312                }
313
314                if ( line.indexOf("Pending package changes: ") != -1 ) {
315                        line = line.replace("Pending package changes: ", "");
316                        line.toInt(&ok);
317                        if ( ok ) {
318                                metaProgressDel->setSubRange(0, line.toInt(&ok) + 1);
319                                metaProgressDel->setSubVal(0);
320                        }
321                        continue;
322                       
323                } else {
324                        metaProgressDel->setSubVal(metaProgressDel->getSubVal() + 1);
325                        metaProgressDel->setSubDesc(line);
326                }
327        }
328}
329
330void metaWidget::slotMetaAddCanceled()
331{
332  canceled=true;
333  qDebug() << "Stopping pc-metapkgmanager";
334  addMetaProc->terminate();
335  addMetaProc->waitForFinished(500);
336  while ( addMetaProc->state() != QProcess::NotRunning ) {
337     QCoreApplication::processEvents();
338     addMetaProc->waitForFinished(100);
339     addMetaProc->kill();
340  }
341  qDebug() << "Done stopping pc-metapkgmanager";
342}
343
344void metaWidget::slotMetaDelDone()
345{
346        if ( ! delPkgs.isEmpty() ) {
347                metaProgressDel->hide();
348                delete metaProgressDel;
349        }
350
351        // If the user canceled the process, we can stop here
352        if ( canceled )
353              return;
354
355        // We've gotten this far, now time to do the actual meta pkg changes
356        if ( ! addPkgs.isEmpty() ) {
357       
358                metaProgressAdd = new metaProgressDialog();
359                metaProgressAdd->programInit(tr("Performing system-package changes."));
360                // Connect canceled slot
361                connect( (QObject*)metaProgressAdd, SIGNAL(canceled()), (QObject*)this, SLOT(slotMetaAddCanceled()) );
362                metaProgressAdd->show();
363
364                addMetaProc = new QProcess();
365                addMetaProc->setProcessChannelMode(QProcess::MergedChannels);
366                // Set the process environment flag for parsing download status
367                QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
368                env.insert("GUI_FETCH_PARSING", "YES");
369                addMetaProc->setProcessEnvironment(env);
370
371                connect( addMetaProc, SIGNAL(readyReadStandardOutput()), this, SLOT(slotMetaAddRead()) );
372                connect( addMetaProc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotMetaAddDone()) );
373                addMetaProc->start("pc-metapkgmanager", QStringList() << chrootArg1 << chrootArg2 <<"add" << addPkgs);
374                qDebug() << "pc-metapkgmanager" << chrootArg1 << chrootArg2 << "add" << addPkgs;
375        } else {
376                        populateMetaPkgs();
377        }
378}
379
380void metaWidget::slotMetaAddRead()
381{
382        bool ok, ok2;
383
384        // This functionality needs to be re-written to not loop, uses to much CPU
385        while ( addMetaProc->canReadLine() ) {
386                QString line = addMetaProc->readLine();
387
388                // Read the number of meta-pkgs we will be adding
389                if ( line.indexOf("Pending Meta-Package changes: ") != -1 ) {
390                        line = line.replace("Pending Meta-Package changes: ", "");
391                        line.toInt(&ok);
392                        if ( ok ) {
393                                metaProgressAdd->setTotalRange(0, line.toInt(&ok) + 1);
394                                metaProgressAdd->setTotalVal(0);
395                        }
396                        continue;
397                }
398
399                // Check if on a new meta-pkg now
400                if ( line.indexOf("Installing Meta-Package: ") != -1 ) { 
401                        metaProgressAdd->setTotalVal(metaProgressAdd->getTotalVal() + 1);
402                        metaProgressAdd->setTotalDesc(line);
403                        continue;
404                }
405
406                if ( line.indexOf("Pending package changes: ") != -1 ) {
407                        line = line.replace("Pending package changes: ", "");
408                        line.toInt(&ok);
409                        if ( ok ) {
410                                metaProgressAdd->setSubRange(0, (line.toInt(&ok) * 2) + 1 );
411                                metaProgressAdd->setSubVal(0);
412                        }
413                        continue;       
414                }
415
416                if ( line.indexOf("Downloading package: ") != -1 ) {
417                        line = line.replace("Downloading package: ", "");
418                        metaProgressAdd->setDLVisible(true);
419                        metaProgressAdd->setDLRange(0, 10);
420                        metaProgressAdd->setDLVal(0);
421                        metaProgressAdd->setDLDesc("");
422
423                        // Increment the sub-bar
424                        metaProgressAdd->setSubVal(metaProgressAdd->getSubVal() + 1);
425                        metaProgressAdd->setSubDesc(tr("Downloading: %1").arg(line) );
426                        continue;       
427                }
428
429                if ( line.indexOf("SIZE: ") == 0 ) {
430                        line.replace("SIZE: ", "");
431                        line.replace("DOWNLOADED: ", "");
432                        line.replace("SPEED: ", "");
433                        line.section(" ", 0, 0).toInt(&ok);
434                        line.section(" ", 1, 1).toInt(&ok2);
435   
436                        qDebug() << line;
437                        if ( ok && ok2 ) {
438                           QString unit;
439                           int tot = line.section(" ", 0, 0).toInt(&ok);
440                           int cur = line.section(" ", 1, 1).toInt(&ok2);
441                           QString percent = QString::number( (float)(cur * 100)/tot );
442                           QString speed = line.section(" ", 2, 3);
443
444                           // Get the MB downloaded / total
445                           if ( tot > 2048 ) {
446                              unit="MB";
447                              tot = tot / 1024;
448                              cur = cur / 1024;
449                           } else {
450                              unit="KB";
451                           }
452
453                           QString ProgressString=QString("%1" + unit + " of %2" + unit + " at %3").arg(cur).arg(tot).arg(speed);
454                           metaProgressAdd->setDLDesc(ProgressString);
455                           metaProgressAdd->setDLRange(0, tot);
456                           metaProgressAdd->setDLVal(cur);
457                           QCoreApplication::processEvents();
458                        }
459                        continue;
460                }
461
462                if ( line.indexOf("Installing package: ") != -1 ) {
463                        metaProgressAdd->setDLVisible(false);
464                        metaProgressAdd->setSubVal(metaProgressAdd->getSubVal() + 1);
465                        metaProgressAdd->setSubDesc(line);
466                }
467        }
468
469}
470
471void metaWidget::slotMetaAddDone()
472{
473        //if ( ! addPkgs.isEmpty() )
474        metaProgressAdd->hide();
475        delete metaProgressAdd;
476
477 
478        populateMetaPkgs();
479
480        // If the user canceled the process, we can stop here
481        if ( canceled )
482              return;
483
484        if ( addMetaProc->exitCode() != 0 || addMetaProc->exitStatus() != QProcess::NormalExit ) {
485                QMessageBox::critical(this, tr("System Packages"),
486                tr("The meta-pkg manager returned an error. For more details please look at the log file:") + " /tmp/.pc-metapkgmanager.log",
487                QMessageBox::Ok,
488                QMessageBox::Ok);
489        } else {
490                QMessageBox::information(this, tr("System Packages"),
491                tr("System packages updated successfully."),
492                QMessageBox::Ok,
493                QMessageBox::Ok);
494        }
495}
496
497bool metaWidget::haveAMetaDesktop()
498{
499        // If running in a chroot we can skip this check
500        if ( ! chrootArg1.isEmpty() )
501          return true;
502       
503        QTreeWidgetItemIterator it(treeMetaPkgs);
504        while (*it) {
505         if ( ((*it)->checkState(0) == Qt::Checked) || ((*it)->checkState(0) == Qt::PartiallyChecked) )
506           for (int z=0; z < metaPkgList.count(); ++z)
507             if ( (*it)->text(0) == metaPkgList.at(z).at(0) && metaPkgList.at(z).at(4) == "YES" )
508                return true;
509         ++it;
510        }
511
512        QMessageBox::warning(this, tr("No Desktop"),
513          tr("No desktops have been selected! Please choose at least one desktop before saving."),
514          QMessageBox::Ok,
515          QMessageBox::Ok);
516
517        return false;
518}
519
520bool metaWidget::haveMetaPkgChanges()
521{
522        QTreeWidgetItemIterator it(treeMetaPkgs);
523        while (*it) {
524          for (int z=0; z < metaPkgList.count(); ++z)
525            // See if any packages status have changed
526            if ( ( (*it)->text(0) == metaPkgList.at(z).at(0) && metaPkgList.at(z).at(5) == "YES" && (*it)->checkState(0) == Qt::Unchecked ) \
527              || ( (*it)->text(0) == metaPkgList.at(z).at(0) && metaPkgList.at(z).at(5) == "YES" && (*it)->checkState(0) == Qt::PartiallyChecked ) \
528              || ( (*it)->text(0) == metaPkgList.at(z).at(0) && metaPkgList.at(z).at(5) == "NO" && (*it)->checkState(0) == Qt::Checked ) )
529                return true;
530         ++it;
531        }
532
533        return false;
534}
535
536QString metaWidget::getAddPkgs()
537{
538        QString tmp;
539        QTreeWidgetItemIterator it(treeMetaPkgs);
540        while (*it) {
541          for (int z=0; z < metaPkgList.count(); ++z)
542            // See if any packages status have changed
543            if ( ( (*it)->text(0) == metaPkgList.at(z).at(0) && metaPkgList.at(z).at(5) == "NO" && (*it)->checkState(0) == Qt::Checked ) || \
544                 ( (*it)->text(0) == metaPkgList.at(z).at(0) && metaPkgList.at(z).at(5) == "NO" && (*it)->checkState(0) == Qt::PartiallyChecked ) )
545                if ( tmp.isEmpty() )
546                        tmp = (*it)->text(0);
547                else
548                        tmp = tmp + "," + (*it)->text(0);
549         ++it;
550        }
551
552        return tmp;
553}
554
555QString metaWidget::getDelPkgs()
556{
557        QString tmp;
558        QTreeWidgetItemIterator it(treeMetaPkgs);
559        while (*it) {
560          for (int z=0; z < metaPkgList.count(); ++z)
561            // See if any packages status have changed
562            if ( (*it)->text(0) == metaPkgList.at(z).at(0) && metaPkgList.at(z).at(5) == "YES" && (*it)->checkState(0) == Qt::Unchecked )
563                if ( tmp.isEmpty() )
564                        tmp = (*it)->text(0);
565                else
566                        tmp = tmp + "," + (*it)->text(0);
567         ++it;
568        }
569
570        return tmp;
571}
572
573
574// Time to save meta-pkgs
575void metaWidget::slotApplyMetaChanges() {
576    saveMetaPkgs();
577}
578
579
580
581// The User changed the tree widget checked / unchecked stuff sanity check
582void metaWidget::slotDeskPkgsChanged(QTreeWidgetItem *aItem, int __unused)
583{
584        if (!aItem)
585          return;
586
587        disconnect(treeMetaPkgs, SIGNAL(itemChanged(QTreeWidgetItem *, int)), 0, 0);
588
589        if (aItem->childCount() == 0) {
590                if (aItem->checkState(0) == Qt::Checked && aItem->parent() )
591                        if ( allChildrenPkgsChecked(aItem->parent()->text(0)))
592                                aItem->parent()->setCheckState(0, Qt::Checked); 
593                        else
594                                aItem->parent()->setCheckState(0, Qt::PartiallyChecked);       
595                if (aItem->checkState(0) == Qt::Unchecked && aItem->parent() )
596                        if ( ! allChildrenPkgsUnchecked(aItem->parent()->text(0)))
597                                aItem->parent()->setCheckState(0, Qt::PartiallyChecked);       
598
599
600        } else {
601                if (aItem->checkState(0) == Qt::Checked )
602                        checkAllChildrenPkgs(aItem->text(0));
603                else
604                        uncheckAllChildrenPkgs(aItem->text(0));
605        }
606       
607
608    connect(treeMetaPkgs, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotDeskPkgsChanged(QTreeWidgetItem *, int)));
609
610        if ( haveMetaPkgChanges() )
611                pushApplyMeta->setEnabled(true);
612        else
613                pushApplyMeta->setEnabled(false);
614}
615
616// Check the "parent" app to see if all its children are checked or not
617bool metaWidget::allChildrenPkgsChecked(QString parent)
618{
619        QTreeWidgetItemIterator it(treeMetaPkgs);
620        while (*it) {
621         if ((*it)->text(0) == parent ) {
622           if ( (*it)->childCount() <= 0)
623             return true;
624
625           for ( int i = 0; i < (*it)->childCount() ; ++i) {
626             if ( ! allChildrenPkgsChecked((*it)->child(i)->text(0)))
627               return false;
628
629             if ((*it)->child(i)->checkState(0) != Qt::Checked ) 
630               return false;
631           }
632         }
633         ++it;
634        }
635        return true;
636}
637
638// Check the "parent" app to see if all its children are unchecked or not
639bool metaWidget::allChildrenPkgsUnchecked(QString parent)
640{
641        QTreeWidgetItemIterator it(treeMetaPkgs);
642        while (*it) {
643         if ((*it)->text(0) == parent ) {
644           if ( (*it)->childCount() <= 0)
645             return true;
646
647           for ( int i = 0; i < (*it)->childCount() ; ++i) {
648             if ( ! allChildrenPkgsUnchecked((*it)->child(i)->text(0)))
649               return false;
650
651             if ((*it)->child(i)->checkState(0) != Qt::Unchecked ) 
652               return false;
653           }
654         }
655         ++it;
656        }
657        return true;
658}
659
660// Check all children of parent
661void metaWidget::checkAllChildrenPkgs(QString parent)
662{
663        QTreeWidgetItemIterator it(treeMetaPkgs);
664        while (*it) {
665         if (! (*it)->parent()) {
666           ++it;
667           continue;
668         } 
669
670         // Lets walk the tree see what pops up
671         bool pFound=false;
672         QTreeWidgetItem *itP = (*it)->parent();
673         do {
674           pFound=false;
675           if (itP->text(0) == parent) {
676             (*it)->setCheckState(0, Qt::Checked);
677             break;
678           }
679           if ( itP->parent() ) {
680             itP = itP->parent();
681             pFound=true;
682           }
683         } while (pFound);
684
685         ++it;
686       }
687}
688
689// UnCheck all children of parent
690void metaWidget::uncheckAllChildrenPkgs(QString parent)
691{
692        QTreeWidgetItemIterator it(treeMetaPkgs);
693        while (*it) {
694         if (! (*it)->parent()) {
695           ++it;
696           continue;
697         } 
698
699         // Lets walk the tree see what pops up
700         bool pFound=false;
701         QTreeWidgetItem *itP = (*it)->parent();
702         do {
703           pFound=false;
704           if (itP->text(0) == parent) {
705             (*it)->setCheckState(0, Qt::Unchecked);
706             break;
707           }
708           if ( itP->parent() ) {
709             itP = itP->parent();
710             pFound=true;
711           }
712         } while (pFound);
713
714         ++it;
715       }
716}
717
718void metaWidget::slotMetaRightClick()
719{
720        QTreeWidgetItemIterator it(treeMetaPkgs);
721        while (*it) {
722          for (int z=0; z < metaPkgList.count(); ++z) {
723            if ( (*it)->isSelected() && (*it)->text(0) == metaPkgList.at(z).at(0) ) {
724              if (metaPkgList.at(z).at(5) == "CATEGORY")
725                return;
726              popup = new QMenu;
727              popup->setTitle((*it)->text(0));
728              popup->addAction(tr("View Packages"), this, SLOT(slotMetaViewPkgs()));
729              popup->exec( QCursor::pos() );
730            }
731          }
732         ++it;
733        }
734}
735
736void metaWidget::slotMetaViewPkgs()
737{
738        QStringList packageList;
739        QTreeWidgetItemIterator it(treeMetaPkgs);
740        while (*it) {
741          for (int z=0; z < metaPkgList.count(); ++z) {
742            if ( (*it)->isSelected() && (*it)->text(0) == metaPkgList.at(z).at(0) ) {
743 
744                QFile pList(metaPkgList.at(z).at(6));
745                if ( ! pList.exists() )
746                  return;
747               
748                if ( ! pList.open(QIODevice::ReadOnly | QIODevice::Text))
749                  return;
750
751                while ( !pList.atEnd() )
752                  packageList << pList.readLine().simplified();
753
754                pList.close();
755                packageList.sort();
756                       
757                dIB = new dialogInfo();
758                dIB->programInit(tr("Package Listing for:") + " " + (*it)->text(0));
759                dIB->setInfoText(packageList.join("\n"));
760                dIB->show();
761            }
762          }
763         ++it;
764        }
765}
766
767QString metaWidget::getLineFromCommandOutput( QString cmd )
768{
769        FILE *file = popen(cmd.toLatin1(),"r");
770 
771        char buffer[100];
772 
773        QString line = "";
774        char firstChar;
775
776        if ((firstChar = fgetc(file)) != -1){
777                line += firstChar;
778                line += fgets(buffer,100,file);
779        }
780        pclose(file);
781        return line.simplified();
782}
783
784
785void metaWidget::stop()
786{
787   if ( getMetaProc->state() != QProcess::NotRunning ) {
788      getMetaProc->kill();
789      getMetaProc->waitForFinished(2000);
790   }
791   stopped=true;
792   setHidden(true);
793}
794
795void metaWidget::setPackageSet(QString set)
796{
797   PkgSet=set;
798}
Note: See TracBrowser for help on using the repository browser.