source: src-qt4/pc-installgui/dialogDesktopSelection.cpp @ b7d9fad

9.2-releasereleng/10.0releng/10.0.1releng/10.0.2releng/10.0.3releng/10.1
Last change on this file since b7d9fad was b7d9fad, checked in by Ken Moore <ken@…>, 12 months ago

Fix compilation of pc-installgui on 10.x

  • 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                        }
127                }
128                if (aItem->checkState(0) == Qt::Unchecked && aItem->parent() ){
129                        if ( ! allChildrenPkgsUnchecked(aItem->parent()->text(0)))
130                                aItem->parent()->setCheckState(0, Qt::PartiallyChecked);       
131                }
132
133        } else {
134                if (aItem->checkState(0) == Qt::Checked ){
135                        checkAllChildrenPkgs(aItem->text(0));
136                }else{
137                        uncheckAllChildrenPkgs(aItem->text(0));
138                }
139        }
140       
141
142    connect(treeWidgetDesktopPackages, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotDeskPkgsChanged(QTreeWidgetItem *, int)));
143}
144
145// Check if we have any desktop packages selected
146bool desktopSelection::haveMetaDesktopChecked()
147{
148        QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
149        while (*it) {
150         if ((*it)->checkState(0) == Qt::Checked || (*it)->checkState(0) == Qt::PartiallyChecked )
151           for (int z=0; z < listDeskPkgs.count(); ++z)
152             if ( (*it)->text(0) == listDeskPkgs.at(z).at(0) && listDeskPkgs.at(z).at(4) == "YES" )
153                return true;
154         ++it;
155        }
156
157        QMessageBox::warning(this, tr("No Desktop"),
158          tr("No desktops have been selected! Please choose at least one desktop to continue."),
159          QMessageBox::Ok,
160          QMessageBox::Ok);
161
162        return false;
163}
164
165// Check the "parent" app to see if all its children are checked or not
166bool desktopSelection::allChildrenPkgsChecked(QString parent)
167{
168        QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
169        while (*it) {
170         if ((*it)->text(0) == parent ) {
171           if ( (*it)->childCount() <= 0)
172             return true;
173
174           for ( int i = 0; i < (*it)->childCount() ; ++i) {
175             if ( ! allChildrenPkgsChecked((*it)->child(i)->text(0)))
176               return false;
177
178             if ((*it)->child(i)->checkState(0) != Qt::Checked ) 
179               return false;
180           }
181         }
182         ++it;
183        }
184        return true;
185}
186
187// Check the "parent" app to see if all its children are unchecked or not
188bool desktopSelection::allChildrenPkgsUnchecked(QString parent)
189{
190        QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
191        while (*it) {
192         if ((*it)->text(0) == parent ) {
193           if ( (*it)->childCount() <= 0)
194             return true;
195
196           for ( int i = 0; i < (*it)->childCount() ; ++i) {
197             if ( ! allChildrenPkgsUnchecked((*it)->child(i)->text(0)))
198               return false;
199
200             if ((*it)->child(i)->checkState(0) != Qt::Unchecked ) 
201               return false;
202           }
203         }
204         ++it;
205        }
206        return true;
207}
208
209// Check all children of parent
210void desktopSelection::checkAllChildrenPkgs(QString parent)
211{
212        QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
213        while (*it) {
214         if (! (*it)->parent()) {
215           ++it;
216           continue;
217         } 
218
219         // Lets walk the tree see what pops up
220         bool pFound=false;
221         QTreeWidgetItem *itP = (*it)->parent();
222         do {
223           pFound=false;
224           if (itP->text(0) == parent) {
225             (*it)->setCheckState(0, Qt::Checked);
226             break;
227           }
228           if ( itP->parent() ) {
229             itP = itP->parent();
230             pFound=true;
231           }
232         } while (pFound);
233
234         ++it;
235       }
236}
237
238// UnCheck all children of parent
239void desktopSelection::uncheckAllChildrenPkgs(QString parent)
240{
241        QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
242        while (*it) {
243         if (! (*it)->parent()) {
244           ++it;
245           continue;
246         } 
247
248         // Lets walk the tree see what pops up
249         bool pFound=false;
250         QTreeWidgetItem *itP = (*it)->parent();
251         do {
252           pFound=false;
253           if (itP->text(0) == parent) {
254             (*it)->setCheckState(0, Qt::Unchecked);
255             break;
256           }
257           if ( itP->parent() ) {
258             itP = itP->parent();
259             pFound=true;
260           }
261         } while (pFound);
262
263         ++it;
264       }
265}
266
267// Return the configuration for desktop packages
268QStringList desktopSelection::getDeskPkgList()
269{
270   QStringList cfgList;
271   bool skipCat;
272
273   // For neatness sake, get the parents first
274   QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
275   while (*it) {
276     if ( !(*it)->parent() && ( (*it)->checkState(0) == Qt::Checked || (*it)->checkState(0) == Qt::PartiallyChecked ) ) {
277
278        // Make sure this isn't just a placeholder category
279        skipCat = false;
280        for (int z=0; z < listDeskPkgs.count(); ++z)
281                if ( (*it)->text(0) == listDeskPkgs.at(z).at(0) && \
282                         listDeskPkgs.at(z).at(5) == "CATEGORY" )
283                        skipCat=true;
284        if ( ! skipCat )
285                // Add it
286                cfgList << (*it)->text(0);
287      }
288      ++it;
289   }
290
291   // Now get the children
292   QTreeWidgetItemIterator itC(treeWidgetDesktopPackages);
293   while (*itC) {
294     if ((*itC)->parent() && ( (*itC)->checkState(0) == Qt::Checked || (*itC)->checkState(0) == Qt::PartiallyChecked ) ) {
295
296        // Make sure this isn't just a placeholder category
297        skipCat = false;
298        for (int z=0; z < listDeskPkgs.count(); ++z)
299                if ( (*itC)->text(0) == listDeskPkgs.at(z).at(0) && \
300                         listDeskPkgs.at(z).at(5) == "CATEGORY" )
301                        skipCat=true;
302
303        if ( ! skipCat )
304                cfgList << (*itC)->text(0);
305      }
306      ++itC;
307   }
308
309   return cfgList;
310}
311
312void desktopSelection::slotMetaRightClick()
313{
314        QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
315        while (*it) {
316          for (int z=0; z < listDeskPkgs.count(); ++z) {
317            if ( (*it)->isSelected() && (*it)->text(0) == listDeskPkgs.at(z).at(0) ) {
318              if (listDeskPkgs.at(z).at(5) == "CATEGORY")
319                return;
320              popup = new QMenu;
321              popup->setTitle((*it)->text(0));
322              popup->addAction(tr("View Packages"), this, SLOT(slotMetaViewPkgs()));
323              popup->exec( QCursor::pos() );
324            }
325          }
326         ++it;
327        }
328}
329
330void desktopSelection::slotMetaViewPkgs()
331{
332        QStringList packageList;
333        QTreeWidgetItemIterator it(treeWidgetDesktopPackages);
334        while (*it) {
335          for (int z=0; z < listDeskPkgs.count(); ++z) {
336            if ( (*it)->isSelected() && (*it)->text(0) == listDeskPkgs.at(z).at(0) ) {
337       
338                QFile pList(listDeskPkgs.at(z).at(6));
339                if ( ! pList.exists() )
340                  return;
341               
342                if ( ! pList.open(QIODevice::ReadOnly | QIODevice::Text))
343                  return;
344             
345                while ( !pList.atEnd() )
346                  packageList << pList.readLine().simplified();
347           
348                pList.close();
349                packageList.sort();
350 
351                dIB = new dialogInfoBox();
352                dIB->programInit(tr("Package Listing for:") + " " + (*it)->text(0));
353                dIB->setInfoText(packageList.join("\n"));
354                dIB->show();
355            }
356          }
357         ++it;
358        }
359}
Note: See TracBrowser for help on using the repository browser.