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

9.1-release9.2-releasereleng/10.0releng/10.0.1releng/10.0.2releng/10.0.3releng/10.1
Last change on this file since f01aaaf was f9fc934, checked in by Kris Moore <kris@…>, 20 months ago

Add new menu bar, not yet functional

Display messages from pkgng as they happen

Offer to save file if something goes bad

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