source: src-qt4/pc-controlpanel/mainwnd.cpp @ 7cc177e

9.2-releasereleng/10.0releng/10.0.1releng/10.0.2releng/10.0.3releng/10.1
Last change on this file since 7cc177e was 7cc177e, checked in by Kris Moore <kris@…>, 15 months ago

Fix up all the last bits of clang / HEAD fussiness

  • Property mode set to 100644
File size: 14.5 KB
Line 
1/**************************************************************************
2*   Copyright (C) 2011 by Yuri Momotyuk                                   *
3*   yurkis@gmail.com                                                      *
4*                                                                         *
5*   Permission is hereby granted, free of charge, to any person obtaining *
6*   a copy of this software and associated documentation files (the       *
7*   "Software"), to deal in the Software without restriction, including   *
8*   without limitation the rights to use, copy, modify, merge, publish,   *
9*   distribute, sublicense, and/or sell copies of the Software, and to    *
10*   permit persons to whom the Software is furnished to do so, subject to *
11*   the following conditions:                                             *
12*                                                                         *
13*   The above copyright notice and this permission notice shall be        *
14*   included in all copies or substantial portions of the Software.       *
15*                                                                         *
16*   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       *
17*   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    *
18*   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*
19*   IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR     *
20*   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
21*   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
22*   OTHER DEALINGS IN THE SOFTWARE.                                       *
23***************************************************************************/
24
25#include <QDebug>
26#include "mainwnd.h"
27#include "ui_mainwnd.h"
28#include "deinfo.h"
29#include "../config.h"
30#include <unistd.h>
31
32#include <QFile>
33#include <iostream>
34
35
36#define ITEMS_PREFIX   PREFIX + "/share/pcbsd/pc-controlpanel/items/"
37#define SOFTWARE_DIR   ITEMS_PREFIX + "software"
38#define SYSTEM_DIR     ITEMS_PREFIX + "system"
39#define HARDWARE_DIR   ITEMS_PREFIX + "hardware"
40#define NETWORKING_DIR ITEMS_PREFIX + "network"
41#define TOOLS_DIR      ITEMS_PREFIX + "tools"
42#define DE_DIR         ITEMS_PREFIX + "de"
43
44#define PBI_INSTALLED_DIRECTORY "/var/db/pbi/installed"
45
46static QString DETEXT;
47
48///////////////////////////////////////////////////////////////////////////////
49MainWnd::MainWnd(QWidget *parent) :
50    QMainWindow(parent),
51    ui(new Ui::MainWnd)
52{
53    ui->setupUi(this);
54
55    misWheelGroup= checkUserGroup("wheel");
56    misOperatorGroup = checkUserGroup("operator");
57
58    setupGroups();
59
60    InstalledDEList.refresh();
61    if (InstalledDEList.active())
62    {
63        mCurrentDE = *InstalledDEList.active();
64        mvEnabledDE.push_back(mCurrentDE.mName);
65    }   
66
67    DETEXT = tr("Desktop environment");
68
69    DEChoiseMenu = new QMenu("", this);
70    setupDEChooser();
71    fillGroups();
72
73}
74
75///////////////////////////////////////////////////////////////////////////////
76MainWnd::~MainWnd()
77{
78    delete ui;
79}
80
81///////////////////////////////////////////////////////////////////////////////
82void MainWnd::changeEvent(QEvent *e)
83{
84    QMainWindow::changeEvent(e);
85    switch (e->type()) {
86    case QEvent::LanguageChange:
87        ui->retranslateUi(this);
88        break;
89    default:
90        break;
91    }
92}
93
94///////////////////////////////////////////////////////////////////////////////
95void MainWnd::setupGroups()
96{
97
98    //qDebug() << "Running setup groups";
99    setupGroup(&SoftwareList, ui->SoftwareGBox);
100    setupGroup(&SystemList, ui->SystemGBox);
101    setupGroup(&HardwareList, ui->HardwareGBox);
102    setupGroup(&NetworkingList, ui->NetworkingGBox);
103    setupGroup(&ToolsList, ui->ToolsGBox);
104    setupGroup(&DEList, ui->DEGBox);
105}
106
107///////////////////////////////////////////////////////////////////////////////
108void MainWnd::setupGroup(QGroupList** List, QWidget* Parrent)
109{
110        QGridLayout *layout = new QGridLayout(Parrent);
111        (*List)=new QGroupList(Parrent);
112        layout->addWidget(*List);
113        Parrent->setLayout(layout); 
114        //qDebug() << "SetupGroup";
115        QObject::connect(*List, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(on_itemActivated(QListWidgetItem*)));
116}
117
118///////////////////////////////////////////////////////////////////////////////
119void MainWnd::fillGroups()
120{
121        //qDebug() << "Running fillGroups";
122        mRefreshMutex.lock();
123
124        bool isVisible;
125
126        ui->centralWidget->setEnabled(false);
127        ui->statusBar->showMessage(tr("Reading items..."));
128        QApplication::processEvents();
129
130        bool isSu = misWheelGroup || misOperatorGroup;
131        bool isSudo = misWheelGroup || misOperatorGroup;
132
133        InstalledPBIs.refresh();       
134
135        isVisible = (bool)SoftwareList->read(SOFTWARE_DIR, mvEnabledDE, isSudo, isSu);
136        ui->SoftwareGBox->setVisible(isVisible);
137        ui->SoftwareLine->setVisible(isVisible);
138
139        isVisible = (bool)SystemList->read(SYSTEM_DIR, mvEnabledDE, isSudo, isSu);
140        ui->SystemGBox->setVisible(isVisible);
141        ui->SystemLine->setVisible(isVisible);
142
143        isVisible = (bool)HardwareList->read(HARDWARE_DIR, mvEnabledDE, isSudo, isSu);
144        ui->HardwareGBox->setVisible(isVisible);
145        ui->HardwareLine->setVisible(isVisible);
146
147        isVisible = (bool)NetworkingList->read(NETWORKING_DIR, mvEnabledDE, isSudo, isSu);
148        ui->NetworkingGBox->setVisible(isVisible);
149        ui->NetworkingLine->setVisible(isVisible);
150
151        isVisible = (bool)ToolsList->read(TOOLS_DIR, mvEnabledDE, isSudo, isSu);
152        ui->ToolsGBox->setVisible(isVisible);
153        ui->ToolsLine->setVisible(isVisible);
154
155        isVisible = (bool)DEList->read(DE_DIR, mvEnabledDE, isSudo, isSu);
156        ui->DEGBox->setVisible(isVisible);
157        ui->DELine->setVisible(isVisible);
158
159        ui->statusBar->clearMessage();
160        ui->centralWidget->setEnabled(true);
161
162        if( NetworkingList->sizeHintForRow(0) > 0 ) {
163          SystemList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
164          SoftwareList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
165          HardwareList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
166          ToolsList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
167          DEList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
168          NetworkingList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
169          SystemList->update();
170          SoftwareList->update();
171          HardwareList->update();
172          ToolsList->update();
173          DEList->update();
174          NetworkingList->update();
175          //qDebug() << NetworkingList->sizeHintForRow(0);
176          //qDebug() << NetworkingList->sizeHintForColumn(0);
177        } 
178
179        mRefreshMutex.unlock();
180}
181
182///////////////////////////////////////////////////////////////////////////////
183void MainWnd::on_itemActivated ( QListWidgetItem* item )
184{
185    if( item )
186    {
187        ((QCPItem*)item)->launch();
188    }
189}
190
191///////////////////////////////////////////////////////////////////////////////
192void MainWnd::on_lineEdit_textChanged(QString Text)
193{
194        bool isVisible;
195
196    Text=Text.trimmed();
197
198        isVisible = SoftwareList->setFilter(Text);
199        ui->SoftwareGBox->setVisible(isVisible);
200        ui->SoftwareLine->setVisible(isVisible);
201                SoftwareList->setDisplayDEName(misDisplayDEName);
202
203        isVisible = SystemList->setFilter(Text);
204        ui->SystemGBox->setVisible(isVisible);
205        ui->SystemLine->setVisible(isVisible);
206        SystemList->setDisplayDEName(misDisplayDEName);
207
208        isVisible = NetworkingList->setFilter(Text);
209        ui->NetworkingGBox->setVisible(isVisible);
210        ui->NetworkingLine->setVisible(isVisible);
211        NetworkingList->setDisplayDEName(misDisplayDEName);
212
213        isVisible = ToolsList->setFilter(Text);
214        ui->ToolsGBox->setVisible(isVisible);
215        ui->ToolsLine->setVisible(isVisible);
216        ToolsList->setDisplayDEName(misDisplayDEName);
217
218        isVisible = HardwareList->setFilter(Text);
219        ui->HardwareGBox->setVisible(isVisible);
220        ui->HardwareLine->setVisible(isVisible);
221        HardwareList->setDisplayDEName(misDisplayDEName);
222
223        isVisible = DEList->setFilter(Text);
224        ui->DEGBox->setVisible(isVisible);
225        ui->DELine->setVisible(isVisible);
226        DEList->setDisplayDEName(misDisplayDEName);
227
228}
229
230///////////////////////////////////////////////////////////////////////////////
231void MainWnd::on_toolButton_2_clicked()
232{
233        fillGroups();
234        on_lineEdit_textChanged(ui->lineEdit->text());
235}
236
237///////////////////////////////////////////////////////////////////////////////
238void MainWnd::setupDEChooser()
239{
240    DEChoiseMenu->addAction(ui->actionAll);
241    DEChoiseMenu->addAction(ui->actionKDE);
242    DEChoiseMenu->addAction(ui->actionGnome);
243    DEChoiseMenu->addAction(ui->actionXFCE);
244    DEChoiseMenu->addAction(ui->actionLXDE);
245    DEChoiseMenu->addAction(ui->actionEnlightenment);
246    DEChoiseMenu->addAction(ui->actionUnsupported);
247
248    ui->DEChooserButton->setMenu(DEChoiseMenu);
249
250    QString Current =  tr("(current)");
251    QString Unsupported= tr("Unsupported DE");
252
253#define SETUP_ACTION(action_name, DEName)\
254    if (InstalledDEList.byName(DEName))\
255    {\
256        ui->action_name->setVisible(true);\
257        if (InstalledDEList.byName(DEName)->misActive){\
258            ui->action_name->setText(QString(DEName) + Current);\
259            ui->DEChooserButton->setIcon(ui->action_name->icon());}\
260        else\
261            ui->action_name->setText(QString(DEName));\
262        }else{ui->action_name->setVisible(false);}
263
264SETUP_ACTION( actionKDE, "KDE" );
265SETUP_ACTION( actionGnome, "Gnome" );
266SETUP_ACTION( actionXFCE, "XFCE" );
267SETUP_ACTION( actionLXDE, "LXDE" );
268SETUP_ACTION( actionEnlightenment, "Enlightenment" );
269
270#undef SETUP_ACTION
271
272        if (!InstalledDEList.active())
273        {
274                ui->actionUnsupported->setText(Unsupported + Current);
275                ui->DEChooserButton->setIcon(ui->actionUnsupported->icon());
276                ui->actionUnsupported->setVisible(true);
277        }
278        else
279                ui->actionUnsupported->setVisible(false);
280
281        ui->DEChooserButton->setVisible(InstalledDEList.size()>1);
282
283}
284
285///////////////////////////////////////////////////////////////////////////////
286void MainWnd::on_actionAll_triggered()
287{
288    ui->DEChooserButton->setIcon(ui->actionAll->icon());
289
290    mvEnabledDE.clear();
291    for (int i=0; i<InstalledDEList.size(); i++)
292    {
293        mvEnabledDE.push_back(InstalledDEList[i].mName);
294    }
295
296    ui->DEGBox->setTitle(DETEXT + " " + tr ("(All installed)"));
297
298    misDisplayDEName = true;
299
300    //refresh
301    on_toolButton_2_clicked();
302}
303
304///////////////////////////////////////////////////////////////////////////////
305void MainWnd::on_actionKDE_triggered()
306{
307    ui->DEChooserButton->setIcon(ui->actionKDE->icon());
308    if (mCurrentDE.mName.trimmed().compare("KDE", Qt::CaseInsensitive))
309        ui->DEGBox->setTitle(DETEXT + " " + tr ("(KDE)"));
310    else
311        ui->DEGBox->setTitle(DETEXT);
312
313     mvEnabledDE.clear();
314     mvEnabledDE.push_back("KDE");
315
316    misDisplayDEName = false;
317
318    //refresh
319    on_toolButton_2_clicked();
320}
321
322///////////////////////////////////////////////////////////////////////////////
323void MainWnd::on_actionLXDE_triggered()
324{
325    ui->DEChooserButton->setIcon(ui->actionLXDE->icon());
326    if (mCurrentDE.mName.trimmed().compare("LXDE", Qt::CaseInsensitive))
327        ui->DEGBox->setTitle(DETEXT + " " + tr ("(LXDE)"));
328    else
329        ui->DEGBox->setTitle(DETEXT);
330
331    mvEnabledDE.clear();
332    mvEnabledDE.push_back("LXDE");
333
334    misDisplayDEName = false;
335
336    //refresh
337    on_toolButton_2_clicked();
338}
339
340///////////////////////////////////////////////////////////////////////////////
341void MainWnd::on_actionGnome_triggered()
342{
343    ui->DEChooserButton->setIcon(ui->actionGnome->icon());
344    if (mCurrentDE.mName.trimmed().compare("gnome", Qt::CaseInsensitive))
345        ui->DEGBox->setTitle(DETEXT + " " + tr ("(Gnome)"));
346    else
347        ui->DEGBox->setTitle(DETEXT);
348
349    mvEnabledDE.clear();
350    mvEnabledDE.push_back("Gnome");
351
352    misDisplayDEName = false;
353
354    //refresh
355    on_toolButton_2_clicked();
356}
357
358///////////////////////////////////////////////////////////////////////////////
359void MainWnd::on_actionEnlightenment_triggered()
360{
361    ui->DEChooserButton->setIcon(ui->actionEnlightenment->icon());
362    if (mCurrentDE.mName.trimmed().compare("Enlightenment", Qt::CaseInsensitive))
363        ui->DEGBox->setTitle(DETEXT + " " + tr ("(Enlightenment)"));
364    else
365        ui->DEGBox->setTitle(DETEXT);
366
367    mvEnabledDE.clear();
368    mvEnabledDE.push_back("Enlightenment");
369    mvEnabledDE.push_back("E16");
370
371    misDisplayDEName = false;
372
373    //refresh
374    on_toolButton_2_clicked();
375}
376
377///////////////////////////////////////////////////////////////////////////////
378void MainWnd::on_actionXFCE_triggered()
379{
380    ui->DEChooserButton->setIcon(ui->actionXFCE->icon());
381    if (mCurrentDE.mName.trimmed().compare("XFCE", Qt::CaseInsensitive))
382        ui->DEGBox->setTitle(DETEXT + " " + tr ("(XFCE)"));
383    else
384        ui->DEGBox->setTitle(DETEXT);
385
386    mvEnabledDE.clear();
387    mvEnabledDE.push_back("XFCE");
388
389    misDisplayDEName = false;
390    //refresh
391    on_toolButton_2_clicked();
392}
393
394///////////////////////////////////////////////////////////////////////////////
395void MainWnd::on_actionUnsupported_triggered()
396{
397        mvEnabledDE.clear();
398
399        misDisplayDEName = false;
400        //refresh
401        on_toolButton_2_clicked();
402}
403
404///////////////////////////////////////////////////////////////////////////////
405void MainWnd::slotSingleInstance()
406{
407   this->hide();
408   this->showNormal();
409   this->activateWindow();
410   this->raise();
411}
412
413///////////////////////////////////////////////////////////////////////////////
414void MainWnd::onDirectoryChanged(const QString& path)
415{
416    //Refresh if items or installed pbis dir was changed
417    QObject::disconnect(&mDirWatcher,0,0,0);
418    //qDebug() << "onDirectoryChanged";
419    on_toolButton_2_clicked();
420    QObject::connect(&mDirWatcher, SIGNAL(directoryChanged(const QString &)),
421                     this, SLOT(onDirectoryChanged(const QString &)));
422}
423
424///////////////////////////////////////////////////////////////////////////////
425bool MainWnd::checkUserGroup(QString groupName)
426{
427   QString loginName = getlogin();
428   QStringList gNames;
429   if ( loginName == "root" )
430     return true;
431
432   QString tmp;
433   QFile iFile("/etc/group");
434   if ( ! iFile.open(QIODevice::ReadOnly | QIODevice::Text))
435     return true; //or FALSE?
436               
437   while ( !iFile.atEnd() ) {
438     tmp = iFile.readLine().simplified();
439     if ( tmp.indexOf(groupName) == 0 ) {
440        gNames = tmp.section(":", 3, 3).split(",");
441        break;
442     }
443   }
444   iFile.close();
445       
446   for ( int i = 0; i < gNames.size(); ++i )
447      if ( gNames.at(i).indexOf(loginName) == 0 )
448            return true;
449
450   return false;
451}
Note: See TracBrowser for help on using the repository browser.