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

releng/10.0.1releng/10.0.2releng/10.0.3
Last change on this file since e845994 was e845994, checked in by Ken Moore <ken@…>, 9 months ago

Merge branch 'master' of github.com:pcbsd/pcbsd

  • Property mode set to 100644
File size: 16.0 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 <QToolTip>
27#include "mainwnd.h"
28#include "ui_mainwnd.h"
29#include "deinfo.h"
30#include "../config.h"
31#include <unistd.h>
32
33#include <QFile>
34#include <iostream>
35
36
37#define ITEMS_PREFIX   PREFIX + "/share/pcbsd/pc-controlpanel/items/"
38#define SOFTWARE_DIR   ITEMS_PREFIX + "software"
39#define SYSTEM_DIR     ITEMS_PREFIX + "system"
40#define HARDWARE_DIR   ITEMS_PREFIX + "hardware"
41#define NETWORKING_DIR ITEMS_PREFIX + "network"
42#define TOOLS_DIR      ITEMS_PREFIX + "tools"
43#define DE_DIR         ITEMS_PREFIX + "de"
44
45#define PBI_INSTALLED_DIRECTORY "/var/db/pbi/installed"
46
47static QString DETEXT;
48
49///////////////////////////////////////////////////////////////////////////////
50MainWnd::MainWnd(QWidget *parent) :
51    QMainWindow(parent),
52    ui(new Ui::MainWnd)
53{
54    ui->setupUi(this);
55
56    misWheelGroup= checkUserGroup("wheel");
57    misOperatorGroup = checkUserGroup("operator");
58
59    setupGroups();
60
61    InstalledDEList.refresh();
62    if (InstalledDEList.active())
63    {
64        mCurrentDE = *InstalledDEList.active();
65        mvEnabledDE.push_back(mCurrentDE.mName);
66        qDebug() << "Current DE: " << mCurrentDE.mName;
67    }   
68
69    DETEXT = tr("Desktop environment");
70
71    DEChoiseMenu = new QMenu("", this);
72    setupDEChooser();
73    fillGroups();
74
75    QPalette tP;
76    tP.setColor(QPalette::Inactive, QPalette::ToolTipBase, QColor("white"));
77    tP.setColor(QPalette::Inactive, QPalette::ToolTipText, QColor("black"));
78    QToolTip::setPalette(tP);
79}
80
81///////////////////////////////////////////////////////////////////////////////
82MainWnd::~MainWnd()
83{
84    delete ui;
85}
86
87///////////////////////////////////////////////////////////////////////////////
88void MainWnd::changeEvent(QEvent *e)
89{
90    QMainWindow::changeEvent(e);
91    switch (e->type()) {
92    case QEvent::LanguageChange:
93        ui->retranslateUi(this);
94        break;
95    default:
96        break;
97    }
98}
99
100///////////////////////////////////////////////////////////////////////////////
101void MainWnd::setupGroups()
102{
103
104    //qDebug() << "Running setup groups";
105    setupGroup(&SoftwareList, ui->SoftwareGBox);
106    setupGroup(&SystemList, ui->SystemGBox);
107    setupGroup(&HardwareList, ui->HardwareGBox);
108    setupGroup(&NetworkingList, ui->NetworkingGBox);
109    setupGroup(&ToolsList, ui->ToolsGBox);
110    setupGroup(&DEList, ui->DEGBox);
111}
112
113///////////////////////////////////////////////////////////////////////////////
114void MainWnd::setupGroup(QGroupList** List, QWidget* Parrent)
115{
116        QGridLayout *layout = new QGridLayout(Parrent);
117        (*List)=new QGroupList(Parrent);
118        layout->addWidget(*List);
119        Parrent->setLayout(layout); 
120        //qDebug() << "SetupGroup";
121    QObject::connect(*List, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(on_itemActivated(QListWidgetItem*)));
122}
123
124///////////////////////////////////////////////////////////////////////////////
125void MainWnd::fillGroups()
126{
127        //qDebug() << "Running fillGroups";
128    mRefreshMutex.lock();
129
130    bool isVisible;
131
132    ui->centralWidget->setEnabled(false);
133    ui->statusBar->showMessage(tr("Reading items..."));
134    QApplication::processEvents();
135
136    bool isSu = misWheelGroup || misOperatorGroup;
137    bool isSudo = misWheelGroup || misOperatorGroup;
138
139    InstalledPBIs.refresh();
140
141    isVisible = (bool)SoftwareList->read(SOFTWARE_DIR, mvEnabledDE, isSudo, isSu);
142        ui->SoftwareGBox->setVisible(isVisible);
143        ui->SoftwareLine->setVisible(isVisible);
144
145    isVisible = (bool)SystemList->read(SYSTEM_DIR, mvEnabledDE, isSudo, isSu);
146        ui->SystemGBox->setVisible(isVisible);
147        ui->SystemLine->setVisible(isVisible);
148
149    isVisible = (bool)HardwareList->read(HARDWARE_DIR, mvEnabledDE, isSudo, isSu);
150        ui->HardwareGBox->setVisible(isVisible);
151        ui->HardwareLine->setVisible(isVisible);
152
153    isVisible = (bool)NetworkingList->read(NETWORKING_DIR, mvEnabledDE, isSudo, isSu);
154        ui->NetworkingGBox->setVisible(isVisible);
155        ui->NetworkingLine->setVisible(isVisible);
156
157    isVisible = (bool)ToolsList->read(TOOLS_DIR, mvEnabledDE, isSudo, isSu);
158        ui->ToolsGBox->setVisible(isVisible);
159        ui->ToolsLine->setVisible(isVisible);
160
161    isVisible = (bool)DEList->read(DE_DIR, mvEnabledDE, isSudo, isSu);
162    ui->DEGBox->setVisible(isVisible);
163    ui->DELine->setVisible(isVisible);
164
165    ui->statusBar->clearMessage();
166    ui->centralWidget->setEnabled(true);
167
168    if( NetworkingList->sizeHintForRow(0) > 0 ) {
169          SystemList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
170          SoftwareList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
171          HardwareList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
172          ToolsList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
173          DEList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
174          NetworkingList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
175          SystemList->update();
176          SoftwareList->update();
177          HardwareList->update();
178          ToolsList->update();
179          DEList->update();
180          NetworkingList->update();
181          //qDebug() << NetworkingList->sizeHintForRow(0);
182          //qDebug() << NetworkingList->sizeHintForColumn(0);
183    }
184
185    mRefreshMutex.unlock();
186}
187
188///////////////////////////////////////////////////////////////////////////////
189void MainWnd::on_itemActivated ( QListWidgetItem* item )
190{
191    if( item )
192    {
193        ((QCPItem*)item)->launch();
194    }
195}
196
197///////////////////////////////////////////////////////////////////////////////
198void MainWnd::on_lineEdit_textChanged(QString Text)
199{
200        bool isVisible;
201
202    Text=Text.trimmed();
203
204        isVisible = SoftwareList->setFilter(Text);
205        ui->SoftwareGBox->setVisible(isVisible);
206        ui->SoftwareLine->setVisible(isVisible);
207    SoftwareList->setDisplayDEName(misDisplayDEName);
208
209        isVisible = SystemList->setFilter(Text);
210        ui->SystemGBox->setVisible(isVisible);
211        ui->SystemLine->setVisible(isVisible);
212    SystemList->setDisplayDEName(misDisplayDEName);
213
214        isVisible = NetworkingList->setFilter(Text);
215        ui->NetworkingGBox->setVisible(isVisible);
216        ui->NetworkingLine->setVisible(isVisible);
217    NetworkingList->setDisplayDEName(misDisplayDEName);
218
219        isVisible = ToolsList->setFilter(Text);
220        ui->ToolsGBox->setVisible(isVisible);
221        ui->ToolsLine->setVisible(isVisible);
222    ToolsList->setDisplayDEName(misDisplayDEName);
223
224        isVisible = HardwareList->setFilter(Text);
225        ui->HardwareGBox->setVisible(isVisible);
226        ui->HardwareLine->setVisible(isVisible);
227    HardwareList->setDisplayDEName(misDisplayDEName);
228
229    isVisible = DEList->setFilter(Text);
230    ui->DEGBox->setVisible(isVisible);
231    ui->DELine->setVisible(isVisible);
232    DEList->setDisplayDEName(misDisplayDEName);
233
234}
235
236///////////////////////////////////////////////////////////////////////////////
237void MainWnd::on_toolButton_2_clicked()
238{
239        fillGroups();
240        on_lineEdit_textChanged(ui->lineEdit->text());
241}
242
243///////////////////////////////////////////////////////////////////////////////
244void MainWnd::setupDEChooser()
245{
246    DEChoiseMenu->addAction(ui->actionAll);
247    DEChoiseMenu->addAction(ui->actionKDE);
248    DEChoiseMenu->addAction(ui->actionGnome);
249    DEChoiseMenu->addAction(ui->actionMate);
250    DEChoiseMenu->addAction(ui->actionCinnamon);
251    DEChoiseMenu->addAction(ui->actionXFCE);
252    DEChoiseMenu->addAction(ui->actionLXDE);
253    DEChoiseMenu->addAction(ui->actionEnlightenment);
254    DEChoiseMenu->addAction(ui->actionUnsupported);
255
256    ui->DEChooserButton->setMenu(DEChoiseMenu);
257
258    QString Current =  tr("(current)");
259    QString Unsupported= tr("Unsupported DE");
260
261#define SETUP_ACTION(action_name, DEName)\
262    if (InstalledDEList.byName(DEName))\
263    {\
264        ui->action_name->setVisible(true);\
265        if (InstalledDEList.byName(DEName)->misActive){\
266            ui->action_name->setText(QString(DEName) + Current);\
267            ui->DEChooserButton->setIcon(ui->action_name->icon());}\
268        else\
269            ui->action_name->setText(QString(DEName));\
270        }else{ui->action_name->setVisible(false);}
271
272SETUP_ACTION( actionKDE, "KDE" );
273SETUP_ACTION( actionGnome, "Gnome" );
274SETUP_ACTION( actionXFCE, "XFCE" );
275SETUP_ACTION( actionLXDE, "LXDE" );
276SETUP_ACTION( actionEnlightenment, "Enlightenment" );
277SETUP_ACTION( actionMate, "Mate" );
278SETUP_ACTION( actionCinnamon, "Cinnamon" );
279
280#undef SETUP_ACTION
281
282        if (!InstalledDEList.active())
283        {
284                qDebug() << "Unsupported DE";
285                ui->actionUnsupported->setText(Unsupported + Current);
286                ui->DEChooserButton->setIcon(ui->actionUnsupported->icon());
287                ui->actionUnsupported->setVisible(true);
288        }else{
289                qDebug() << "Supported DE";
290                ui->actionUnsupported->setVisible(false);
291        }
292
293        ui->DEChooserButton->setVisible(InstalledDEList.size()>1);
294
295}
296
297///////////////////////////////////////////////////////////////////////////////
298void MainWnd::on_actionAll_triggered()
299{
300    ui->DEChooserButton->setIcon(ui->actionAll->icon());
301
302    mvEnabledDE.clear();
303    for (int i=0; i<InstalledDEList.size(); i++)
304    {
305        mvEnabledDE.push_back(InstalledDEList[i].mName);
306    }
307
308    ui->DEGBox->setTitle(DETEXT + " " + tr ("(All installed)"));
309
310    misDisplayDEName = true;
311
312    //refresh
313    on_toolButton_2_clicked();
314}
315
316///////////////////////////////////////////////////////////////////////////////
317void MainWnd::on_actionKDE_triggered()
318{
319    ui->DEChooserButton->setIcon(ui->actionKDE->icon());
320    if (mCurrentDE.mName.trimmed().compare("KDE", Qt::CaseInsensitive))
321        ui->DEGBox->setTitle(DETEXT + " " + tr ("(KDE)"));
322    else
323        ui->DEGBox->setTitle(DETEXT);
324
325     mvEnabledDE.clear();
326     mvEnabledDE.push_back("KDE");
327
328    misDisplayDEName = false;
329
330    //refresh
331    on_toolButton_2_clicked();
332}
333
334///////////////////////////////////////////////////////////////////////////////
335void MainWnd::on_actionLXDE_triggered()
336{
337    ui->DEChooserButton->setIcon(ui->actionLXDE->icon());
338    if (mCurrentDE.mName.trimmed().compare("LXDE", Qt::CaseInsensitive))
339        ui->DEGBox->setTitle(DETEXT + " " + tr ("(LXDE)"));
340    else
341        ui->DEGBox->setTitle(DETEXT);
342
343    mvEnabledDE.clear();
344    mvEnabledDE.push_back("LXDE");
345
346    misDisplayDEName = false;
347
348    //refresh
349    on_toolButton_2_clicked();
350}
351
352///////////////////////////////////////////////////////////////////////////////
353void MainWnd::on_actionGnome_triggered()
354{
355    ui->DEChooserButton->setIcon(ui->actionGnome->icon());
356    if (mCurrentDE.mName.trimmed().compare("gnome", Qt::CaseInsensitive))
357        ui->DEGBox->setTitle(DETEXT + " " + tr ("(Gnome)"));
358    else
359        ui->DEGBox->setTitle(DETEXT);
360
361    mvEnabledDE.clear();
362    mvEnabledDE.push_back("Gnome");
363
364    misDisplayDEName = false;
365
366    //refresh
367    on_toolButton_2_clicked();
368}
369
370///////////////////////////////////////////////////////////////////////////////
371void MainWnd::on_actionEnlightenment_triggered()
372{
373    ui->DEChooserButton->setIcon(ui->actionEnlightenment->icon());
374    if (mCurrentDE.mName.trimmed().compare("Enlightenment", Qt::CaseInsensitive))
375        ui->DEGBox->setTitle(DETEXT + " " + tr ("(Enlightenment)"));
376    else
377        ui->DEGBox->setTitle(DETEXT);
378
379    mvEnabledDE.clear();
380    mvEnabledDE.push_back("Enlightenment");
381    mvEnabledDE.push_back("E16");
382
383    misDisplayDEName = false;
384
385    //refresh
386    on_toolButton_2_clicked();
387}
388
389///////////////////////////////////////////////////////////////////////////////
390void MainWnd::on_actionMate_triggered()
391{
392    ui->DEChooserButton->setIcon(ui->actionMate->icon());
393    if (mCurrentDE.mName.trimmed().compare("Mate", Qt::CaseInsensitive))
394        ui->DEGBox->setTitle(DETEXT + " " + tr ("(Mate)"));
395    else
396        ui->DEGBox->setTitle(DETEXT);
397
398    mvEnabledDE.clear();
399    mvEnabledDE.push_back("Mate");
400
401    misDisplayDEName = false;
402
403    //refresh
404    on_toolButton_2_clicked();
405}
406
407///////////////////////////////////////////////////////////////////////////////
408void MainWnd::on_actionCinnamon_triggered()
409{
410    ui->DEChooserButton->setIcon(ui->actionCinnamon->icon());
411    if (mCurrentDE.mName.trimmed().compare("Cinnamon", Qt::CaseInsensitive))
412        ui->DEGBox->setTitle(DETEXT + " " + tr ("(Cinnamon)"));
413    else
414        ui->DEGBox->setTitle(DETEXT);
415
416    mvEnabledDE.clear();
417    mvEnabledDE.push_back("Cinnamon");
418
419    misDisplayDEName = false;
420
421    //refresh
422    on_toolButton_2_clicked();
423}
424
425///////////////////////////////////////////////////////////////////////////////
426void MainWnd::on_actionXFCE_triggered()
427{
428    ui->DEChooserButton->setIcon(ui->actionXFCE->icon());
429    if (mCurrentDE.mName.trimmed().compare("XFCE", Qt::CaseInsensitive))
430        ui->DEGBox->setTitle(DETEXT + " " + tr ("(XFCE)"));
431    else
432        ui->DEGBox->setTitle(DETEXT);
433
434    mvEnabledDE.clear();
435    mvEnabledDE.push_back("XFCE");
436
437    misDisplayDEName = false;
438    //refresh
439    on_toolButton_2_clicked();
440}
441
442///////////////////////////////////////////////////////////////////////////////
443void MainWnd::on_actionUnsupported_triggered()
444{
445        mvEnabledDE.clear();
446
447        misDisplayDEName = false;
448        //refresh
449        on_toolButton_2_clicked();
450}
451
452///////////////////////////////////////////////////////////////////////////////
453void MainWnd::slotSingleInstance()
454{
455   this->hide();
456   this->showNormal();
457   this->activateWindow();
458   this->raise();
459}
460
461///////////////////////////////////////////////////////////////////////////////
462void MainWnd::onDirectoryChanged(const QString& path)
463{
464    //Refresh if items or installed pbis dir was changed
465    QObject::disconnect(&mDirWatcher,0,0,0);
466    //qDebug() << "onDirectoryChanged";
467    on_toolButton_2_clicked();
468    QObject::connect(&mDirWatcher, SIGNAL(directoryChanged(const QString &)),
469                     this, SLOT(onDirectoryChanged(const QString &)));
470    QString junk = path; //to get rid of compilation warning about unused variable
471}
472
473///////////////////////////////////////////////////////////////////////////////
474bool MainWnd::checkUserGroup(QString groupName)
475{
476   QString loginName = getlogin();
477   QStringList gNames;
478   if ( loginName == "root" )
479     return true;
480
481   QString tmp;
482   QFile iFile("/etc/group");
483   if ( ! iFile.open(QIODevice::ReadOnly | QIODevice::Text))
484     return true; //or FALSE?
485               
486   while ( !iFile.atEnd() ) {
487     tmp = iFile.readLine().simplified();
488     if ( tmp.indexOf(groupName) == 0 ) {
489        gNames = tmp.section(":", 3, 3).split(",");
490        break;
491     }
492   }
493   iFile.close();
494       
495   for ( int i = 0; i < gNames.size(); ++i )
496      if ( gNames.at(i).indexOf(loginName) == 0 )
497            return true;
498
499   return false;
500}
Note: See TracBrowser for help on using the repository browser.