source: src-qt4/pc-pkgmanager/mainWin.cpp @ e013d8d2

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

Get the program compilable, and merge in the meta-pkg manager stuff

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