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

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

Initial import of PC-BSD /current/ SVN repo

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