source: src-qt4/pc-installgui/dialogDesktopSelection.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: 10.5 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 "dialogDesktopSelection.h"
13#include "ui_dialogDesktopSelection.h"
14#include <QTreeWidget>
15#include <QtGui>
16
17void desktopSelection::programInit(QList<QStringList> pkgList, QStringList sPkgs)
18{
19  listDeskPkgs = pkgList;
20  selectedPkgs = sPkgs;
21  connect(pushClose, SIGNAL(clicked()), this, SLOT(slotClose()));
22  connect(pushSave, SIGNAL(clicked()), this, SLOT(slotSave()));
23  initDesktopPkgs();
24}
25
26void desktopSelection::slotClose()
27{
28  close();
29}
30
31void desktopSelection::slotSave()
32{
33  emit saved(getDeskPkgList());
34  close();
35}
36
37// Connect all the disk-related slots
38void desktopSelection::initDesktopPkgs()
39{
40  // Start by reading our list of desktop pkgs, and populate the GUI
41  addTreeItems(QString());
42
43  treeWidgetDesktopPackages->setMouseTracking(TRUE);
44  connect(treeWidgetDesktopPackages, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotDeskPkgsChanged(QTreeWidgetItem *, int)));
45  connect(treeWidgetDesktopPackages, SIGNAL(itemEntered(QTreeWidgetItem *, int)), this, SLOT(slotShowLabelDesc(QTreeWidgetItem *, int)));
46
47  treeWidgetDesktopPackages->setContextMenuPolicy(Qt::CustomContextMenu);
48  connect(treeWidgetDesktopPackages, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(slotMetaRightClick()) );
49
50}
51
52void desktopSelection::addTreeItems(QString parent)
53{
54  for (int z=0; z < listDeskPkgs.count(); ++z) {
55
56    if ( listDeskPkgs.at(z).at(3) != parent )
57      continue;
58
59    // Hide the "base-system" package, since we are installing it anyway
60    if (listDeskPkgs.at(z).at(0) == "base-system" )
61      continue;
62
63    QTreeWidgetItem *deskItem = new QTreeWidgetItem(QStringList() << listDeskPkgs.at(z).at(0) );
64    deskItem->setIcon(0, QIcon(listDeskPkgs.at(z).at(2)));
65    deskItem->setToolTip(0, listDeskPkgs.at(z).at(1));
66    deskItem->setCheckState(0, Qt::Unchecked);
67
68    // Check if this is a selected meta-pkg
69    for ( int s=0; s < selectedPkgs.count(); ++s)
70      if ( listDeskPkgs.at(z).at(0) == selectedPkgs.at(s) )
71        deskItem->setCheckState(0, Qt::Checked);
72
73    if ( parent.isEmpty() ) {
74      treeWidgetDesktopPackages->addTopLevelItem(deskItem);
75    } else {
76      // Locate the parent to attach to
77      QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
78      while (*it) {
79        if ((*it)->text(0) == parent ) {
80          (*it)->addChild(deskItem);
81          if ( deskItem->checkState(0) == Qt::Checked && (*it)->checkState(0) == Qt::Unchecked)
82            (*it)->setCheckState(0, Qt::PartiallyChecked);
83          break;
84        }
85        it++;
86      }
87    }
88
89    // Now look for any possible children
90    addTreeItems(listDeskPkgs.at(z).at(0));
91  }
92}
93
94// Slot to show meta-pkg description on mouseover
95void desktopSelection::slotShowLabelDesc(QTreeWidgetItem *aItem, int aCol)
96{
97        Q_UNUSED(aCol);
98        labelPkgDesc->setText("");
99
100        if (!aItem)
101          return;
102
103        for (int z=0; z < listDeskPkgs.count(); ++z) {
104                if ( aItem->text(0) == listDeskPkgs.at(z).at(0) ) {
105                        labelPkgDesc->setText(listDeskPkgs.at(z).at(1));
106                        break;
107                }
108        }
109}
110
111// The User changed the tree widget checked / unchecked stuff sanity check
112void desktopSelection::slotDeskPkgsChanged(QTreeWidgetItem *aItem, int aCol)
113{
114        Q_UNUSED(aCol);
115        if (!aItem)
116          return;
117
118        disconnect(treeWidgetDesktopPackages, SIGNAL(itemChanged(QTreeWidgetItem *, int)), 0, 0);
119
120        if (aItem->childCount() == 0) {
121                if (aItem->checkState(0) == Qt::Checked && aItem->parent() )
122                        if ( allChildrenPkgsChecked(aItem->parent()->text(0)))
123                                aItem->parent()->setCheckState(0, Qt::Checked); 
124                        else
125                                aItem->parent()->setCheckState(0, Qt::PartiallyChecked);       
126                if (aItem->checkState(0) == Qt::Unchecked && aItem->parent() )
127                        if ( ! allChildrenPkgsUnchecked(aItem->parent()->text(0)))
128                                aItem->parent()->setCheckState(0, Qt::PartiallyChecked);       
129
130
131        } else {
132                if (aItem->checkState(0) == Qt::Checked )
133                        checkAllChildrenPkgs(aItem->text(0));
134                else
135                        uncheckAllChildrenPkgs(aItem->text(0));
136        }
137       
138
139    connect(treeWidgetDesktopPackages, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotDeskPkgsChanged(QTreeWidgetItem *, int)));
140}
141
142// Check if we have any desktop packages selected
143bool desktopSelection::haveMetaDesktopChecked()
144{
145        QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
146        while (*it) {
147         if ((*it)->checkState(0) == Qt::Checked || (*it)->checkState(0) == Qt::PartiallyChecked )
148           for (int z=0; z < listDeskPkgs.count(); ++z)
149             if ( (*it)->text(0) == listDeskPkgs.at(z).at(0) && listDeskPkgs.at(z).at(4) == "YES" )
150                return true;
151         ++it;
152        }
153
154        QMessageBox::warning(this, tr("No Desktop"),
155          tr("No desktops have been selected! Please choose at least one desktop to continue."),
156          QMessageBox::Ok,
157          QMessageBox::Ok);
158
159        return false;
160}
161
162// Check the "parent" app to see if all its children are checked or not
163bool desktopSelection::allChildrenPkgsChecked(QString parent)
164{
165        QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
166        while (*it) {
167         if ((*it)->text(0) == parent ) {
168           if ( (*it)->childCount() <= 0)
169             return true;
170
171           for ( int i = 0; i < (*it)->childCount() ; ++i) {
172             if ( ! allChildrenPkgsChecked((*it)->child(i)->text(0)))
173               return false;
174
175             if ((*it)->child(i)->checkState(0) != Qt::Checked ) 
176               return false;
177           }
178         }
179         ++it;
180        }
181        return true;
182}
183
184// Check the "parent" app to see if all its children are unchecked or not
185bool desktopSelection::allChildrenPkgsUnchecked(QString parent)
186{
187        QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
188        while (*it) {
189         if ((*it)->text(0) == parent ) {
190           if ( (*it)->childCount() <= 0)
191             return true;
192
193           for ( int i = 0; i < (*it)->childCount() ; ++i) {
194             if ( ! allChildrenPkgsUnchecked((*it)->child(i)->text(0)))
195               return false;
196
197             if ((*it)->child(i)->checkState(0) != Qt::Unchecked ) 
198               return false;
199           }
200         }
201         ++it;
202        }
203        return true;
204}
205
206// Check all children of parent
207void desktopSelection::checkAllChildrenPkgs(QString parent)
208{
209        QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
210        while (*it) {
211         if (! (*it)->parent()) {
212           ++it;
213           continue;
214         } 
215
216         // Lets walk the tree see what pops up
217         bool pFound=false;
218         QTreeWidgetItem *itP = (*it)->parent();
219         do {
220           pFound=false;
221           if (itP->text(0) == parent) {
222             (*it)->setCheckState(0, Qt::Checked);
223             break;
224           }
225           if ( itP->parent() ) {
226             itP = itP->parent();
227             pFound=true;
228           }
229         } while (pFound);
230
231         ++it;
232       }
233}
234
235// UnCheck all children of parent
236void desktopSelection::uncheckAllChildrenPkgs(QString parent)
237{
238        QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
239        while (*it) {
240         if (! (*it)->parent()) {
241           ++it;
242           continue;
243         } 
244
245         // Lets walk the tree see what pops up
246         bool pFound=false;
247         QTreeWidgetItem *itP = (*it)->parent();
248         do {
249           pFound=false;
250           if (itP->text(0) == parent) {
251             (*it)->setCheckState(0, Qt::Unchecked);
252             break;
253           }
254           if ( itP->parent() ) {
255             itP = itP->parent();
256             pFound=true;
257           }
258         } while (pFound);
259
260         ++it;
261       }
262}
263
264// Return the configuration for desktop packages
265QStringList desktopSelection::getDeskPkgList()
266{
267   QStringList cfgList;
268   bool skipCat;
269
270   // For neatness sake, get the parents first
271   QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
272   while (*it) {
273     if ( !(*it)->parent() && ( (*it)->checkState(0) == Qt::Checked || (*it)->checkState(0) == Qt::PartiallyChecked ) ) {
274
275        // Make sure this isn't just a placeholder category
276        skipCat = false;
277        for (int z=0; z < listDeskPkgs.count(); ++z)
278                if ( (*it)->text(0) == listDeskPkgs.at(z).at(0) && \
279                         listDeskPkgs.at(z).at(5) == "CATEGORY" )
280                        skipCat=true;
281        if ( ! skipCat )
282                // Add it
283                cfgList << (*it)->text(0);
284      }
285      ++it;
286   }
287
288   // Now get the children
289   QTreeWidgetItemIterator itC(treeWidgetDesktopPackages);
290   while (*itC) {
291     if ((*itC)->parent() && ( (*itC)->checkState(0) == Qt::Checked || (*itC)->checkState(0) == Qt::PartiallyChecked ) ) {
292
293        // Make sure this isn't just a placeholder category
294        skipCat = false;
295        for (int z=0; z < listDeskPkgs.count(); ++z)
296                if ( (*itC)->text(0) == listDeskPkgs.at(z).at(0) && \
297                         listDeskPkgs.at(z).at(5) == "CATEGORY" )
298                        skipCat=true;
299
300        if ( ! skipCat )
301                cfgList << (*itC)->text(0);
302      }
303      ++itC;
304   }
305
306   return cfgList;
307}
308
309void desktopSelection::slotMetaRightClick()
310{
311        QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
312        while (*it) {
313          for (int z=0; z < listDeskPkgs.count(); ++z) {
314            if ( (*it)->isSelected() && (*it)->text(0) == listDeskPkgs.at(z).at(0) ) {
315              if (listDeskPkgs.at(z).at(5) == "CATEGORY")
316                return;
317              popup = new QMenu;
318              popup->setTitle((*it)->text(0));
319              popup->addAction(tr("View Packages"), this, SLOT(slotMetaViewPkgs()));
320              popup->exec( QCursor::pos() );
321            }
322          }
323         ++it;
324        }
325}
326
327void desktopSelection::slotMetaViewPkgs()
328{
329        QStringList packageList;
330        QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
331        while (*it) {
332          for (int z=0; z < listDeskPkgs.count(); ++z) {
333            if ( (*it)->isSelected() && (*it)->text(0) == listDeskPkgs.at(z).at(0) ) {
334       
335                QFile pList(listDeskPkgs.at(z).at(6));
336                if ( ! pList.exists() )
337                  return;
338               
339                if ( ! pList.open(QIODevice::ReadOnly | QIODevice::Text))
340                  return;
341             
342                while ( !pList.atEnd() )
343                  packageList << pList.readLine().simplified();
344           
345                pList.close();
346                packageList.sort();
347 
348                dIB = new dialogInfoBox();
349                dIB->programInit(tr("Package Listing for:") + " " + (*it)->text(0));
350                dIB->setInfoText(packageList.join("\n"));
351                dIB->show();
352            }
353          }
354         ++it;
355        }
356}
Note: See TracBrowser for help on using the repository browser.