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

releng/10.0.1releng/10.0.2releng/10.0.3releng/10.1
Last change on this file since 1c61936 was 1c61936, checked in by yurkis <yurkis@…>, 10 months ago

Control panel - separate button for launch DE related config application

  • Property mode set to 100644
File size: 17.8 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 <QPainter>
28
29#include "mainwnd.h"
30#include "ui_mainwnd.h"
31#include "deinfo.h"
32#include "../config.h"
33#include <unistd.h>
34
35#include <QFile>
36#include <iostream>
37
38
39#define ITEMS_PREFIX   PREFIX + "/share/pcbsd/pc-controlpanel/items/"
40#define SOFTWARE_DIR   ITEMS_PREFIX + "software"
41#define SYSTEM_DIR     ITEMS_PREFIX + "system"
42#define HARDWARE_DIR   ITEMS_PREFIX + "hardware"
43#define NETWORKING_DIR ITEMS_PREFIX + "network"
44#define TOOLS_DIR      ITEMS_PREFIX + "tools"
45#define DE_DIR         ITEMS_PREFIX + "de"
46
47#define PBI_INSTALLED_DIRECTORY "/var/db/pbi/installed"
48
49#define DE_CONFIG_APP_MARK ":/images/images/config.png"
50
51static QString DETEXT;
52
53///////////////////////////////////////////////////////////////////////////////
54MainWnd::MainWnd(QWidget *parent) :
55    QMainWindow(parent),
56    ui(new Ui::MainWnd)
57{
58    ui->setupUi(this);
59
60    misWheelGroup= checkUserGroup("wheel");
61    misOperatorGroup = checkUserGroup("operator");
62
63    setupGroups();
64
65    InstalledDEList.refresh();
66    if (InstalledDEList.active())
67    {
68        mCurrentDE = *InstalledDEList.active();
69        mvEnabledDE.push_back(mCurrentDE.Name);
70    }   
71
72    DETEXT = tr("Desktop environment");
73
74    DEChoiseMenu = new QMenu("", this);
75    setupDEChooser();
76    fillGroups();
77
78    refreshDEConfigureApp();
79
80    QPalette tP;
81    tP.setColor(QPalette::Inactive, QPalette::ToolTipBase, QColor("white"));
82    tP.setColor(QPalette::Inactive, QPalette::ToolTipText, QColor("black"));
83    QToolTip::setPalette(tP);
84}
85
86///////////////////////////////////////////////////////////////////////////////
87MainWnd::~MainWnd()
88{
89    delete ui;
90}
91
92///////////////////////////////////////////////////////////////////////////////
93void MainWnd::changeEvent(QEvent *e)
94{
95    QMainWindow::changeEvent(e);
96    switch (e->type()) {
97    case QEvent::LanguageChange:
98        ui->retranslateUi(this);
99        break;
100    default:
101        break;
102    }
103}
104
105///////////////////////////////////////////////////////////////////////////////
106void MainWnd::setupGroups()
107{
108    setupGroup(&SoftwareList, ui->SoftwareGBox);
109    setupGroup(&SystemList, ui->SystemGBox);
110    setupGroup(&HardwareList, ui->HardwareGBox);
111    setupGroup(&NetworkingList, ui->NetworkingGBox);
112    setupGroup(&ToolsList, ui->ToolsGBox);
113    setupGroup(&DEList, ui->DEGBox);
114}
115
116///////////////////////////////////////////////////////////////////////////////
117void MainWnd::setupGroup(QGroupList** List, QWidget* Parrent)
118{
119        QGridLayout *layout = new QGridLayout(Parrent);
120        (*List)=new QGroupList(Parrent);
121        layout->addWidget(*List);
122        Parrent->setLayout(layout); 
123    QObject::connect(*List, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(on_itemActivated(QListWidgetItem*)));
124}
125
126///////////////////////////////////////////////////////////////////////////////
127void MainWnd::fillGroups()
128{
129    mRefreshMutex.lock();
130
131    bool isVisible;
132
133    ui->centralWidget->setEnabled(false);
134    ui->statusBar->showMessage(tr("Reading items..."));
135    QApplication::processEvents();
136
137    bool isSu = misWheelGroup || misOperatorGroup;
138    bool isSudo = misWheelGroup || misOperatorGroup;
139
140    InstalledPBIs.refresh();
141
142    isVisible = (bool)SoftwareList->read(SOFTWARE_DIR, mvEnabledDE, isSudo, isSu);
143        ui->SoftwareGBox->setVisible(isVisible);
144        ui->SoftwareLine->setVisible(isVisible);
145
146    isVisible = (bool)SystemList->read(SYSTEM_DIR, mvEnabledDE, isSudo, isSu);
147        ui->SystemGBox->setVisible(isVisible);
148        ui->SystemLine->setVisible(isVisible);
149
150    isVisible = (bool)HardwareList->read(HARDWARE_DIR, mvEnabledDE, isSudo, isSu);
151        ui->HardwareGBox->setVisible(isVisible);
152        ui->HardwareLine->setVisible(isVisible);
153
154    isVisible = (bool)NetworkingList->read(NETWORKING_DIR, mvEnabledDE, isSudo, isSu);
155        ui->NetworkingGBox->setVisible(isVisible);
156        ui->NetworkingLine->setVisible(isVisible);
157
158    isVisible = (bool)ToolsList->read(TOOLS_DIR, mvEnabledDE, isSudo, isSu);
159        ui->ToolsGBox->setVisible(isVisible);
160        ui->ToolsLine->setVisible(isVisible);
161
162    isVisible = (bool)DEList->read(DE_DIR, mvEnabledDE, isSudo, isSu);
163    ui->DEGBox->setVisible(isVisible);
164    ui->DELine->setVisible(isVisible);
165
166    ui->statusBar->clearMessage();
167    ui->centralWidget->setEnabled(true);
168
169    if( NetworkingList->sizeHintForRow(0) > 0 ) {
170          SystemList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
171          SoftwareList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
172          HardwareList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
173          ToolsList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
174          DEList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
175          NetworkingList->setGridSize(QSize(NetworkingList->sizeHintForColumn(0), NetworkingList->sizeHintForRow(0)));
176          SystemList->update();
177          SoftwareList->update();
178          HardwareList->update();
179          ToolsList->update();
180          DEList->update();
181          NetworkingList->update();
182    }
183
184    mRefreshMutex.unlock();
185}
186
187///////////////////////////////////////////////////////////////////////////////
188void MainWnd::on_itemActivated ( QListWidgetItem* item )
189{
190    if( item )
191    {
192        ((QCPItem*)item)->launch();
193    }
194}
195
196///////////////////////////////////////////////////////////////////////////////
197void MainWnd::on_lineEdit_textChanged(QString Text)
198{
199        bool isVisible;
200
201    Text=Text.trimmed();
202
203        isVisible = SoftwareList->setFilter(Text);
204        ui->SoftwareGBox->setVisible(isVisible);
205        ui->SoftwareLine->setVisible(isVisible);
206    SoftwareList->setDisplayDEName(misDisplayDEName);
207
208        isVisible = SystemList->setFilter(Text);
209        ui->SystemGBox->setVisible(isVisible);
210        ui->SystemLine->setVisible(isVisible);
211    SystemList->setDisplayDEName(misDisplayDEName);
212
213        isVisible = NetworkingList->setFilter(Text);
214        ui->NetworkingGBox->setVisible(isVisible);
215        ui->NetworkingLine->setVisible(isVisible);
216    NetworkingList->setDisplayDEName(misDisplayDEName);
217
218        isVisible = ToolsList->setFilter(Text);
219        ui->ToolsGBox->setVisible(isVisible);
220        ui->ToolsLine->setVisible(isVisible);
221    ToolsList->setDisplayDEName(misDisplayDEName);
222
223        isVisible = HardwareList->setFilter(Text);
224        ui->HardwareGBox->setVisible(isVisible);
225        ui->HardwareLine->setVisible(isVisible);
226    HardwareList->setDisplayDEName(misDisplayDEName);
227
228    isVisible = DEList->setFilter(Text);
229    ui->DEGBox->setVisible(isVisible);
230    ui->DELine->setVisible(isVisible);
231    DEList->setDisplayDEName(misDisplayDEName);
232
233}
234
235///////////////////////////////////////////////////////////////////////////////
236void MainWnd::on_toolButton_2_clicked()
237{
238        fillGroups();
239    //InstalledDEList.active()->
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)->isActive){\
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
272    SETUP_ACTION( actionKDE, "KDE" );
273    SETUP_ACTION( actionGnome, "Gnome" );
274    SETUP_ACTION( actionXFCE, "XFCE" );
275    SETUP_ACTION( actionLXDE, "LXDE" );
276    SETUP_ACTION( actionEnlightenment, "Enlightenment" );
277    SETUP_ACTION( actionMate, "Mate" );
278    SETUP_ACTION( actionCinnamon, "Cinnamon" );
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    }else{
288        ui->actionUnsupported->setVisible(false);
289        }
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].Name);
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.Name.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
329    //refresh
330    on_toolButton_2_clicked();
331}
332
333///////////////////////////////////////////////////////////////////////////////
334void MainWnd::on_actionLXDE_triggered()
335{
336    ui->DEChooserButton->setIcon(ui->actionLXDE->icon());
337    if (mCurrentDE.Name.trimmed().compare("LXDE", Qt::CaseInsensitive))
338        ui->DEGBox->setTitle(DETEXT + " " + tr ("(LXDE)"));
339    else
340        ui->DEGBox->setTitle(DETEXT);
341
342    mvEnabledDE.clear();
343    mvEnabledDE.push_back("LXDE");
344
345    misDisplayDEName = false;
346
347    //refresh
348    on_toolButton_2_clicked();
349}
350
351///////////////////////////////////////////////////////////////////////////////
352void MainWnd::on_actionGnome_triggered()
353{
354    ui->DEChooserButton->setIcon(ui->actionGnome->icon());
355    if (mCurrentDE.Name.trimmed().compare("gnome", Qt::CaseInsensitive))
356        ui->DEGBox->setTitle(DETEXT + " " + tr ("(Gnome)"));
357    else
358        ui->DEGBox->setTitle(DETEXT);
359
360    mvEnabledDE.clear();
361    mvEnabledDE.push_back("Gnome");
362
363    misDisplayDEName = false;
364
365    //refresh
366    on_toolButton_2_clicked();
367}
368
369///////////////////////////////////////////////////////////////////////////////
370void MainWnd::on_actionEnlightenment_triggered()
371{
372    ui->DEChooserButton->setIcon(ui->actionEnlightenment->icon());
373    if (mCurrentDE.Name.trimmed().compare("Enlightenment", Qt::CaseInsensitive))
374        ui->DEGBox->setTitle(DETEXT + " " + tr ("(Enlightenment)"));
375    else
376        ui->DEGBox->setTitle(DETEXT);
377
378    mvEnabledDE.clear();
379    mvEnabledDE.push_back("Enlightenment");
380    mvEnabledDE.push_back("E16");
381
382    misDisplayDEName = false;
383
384    //refresh
385    on_toolButton_2_clicked();
386}
387
388///////////////////////////////////////////////////////////////////////////////
389void MainWnd::on_actionMate_triggered()
390{
391    ui->DEChooserButton->setIcon(ui->actionMate->icon());
392    if (mCurrentDE.Name.trimmed().compare("Mate", Qt::CaseInsensitive))
393        ui->DEGBox->setTitle(DETEXT + " " + tr ("(Mate)"));
394    else
395        ui->DEGBox->setTitle(DETEXT);
396
397    mvEnabledDE.clear();
398    mvEnabledDE.push_back("Mate");
399
400    misDisplayDEName = false;
401
402    //refresh
403    on_toolButton_2_clicked();
404}
405
406///////////////////////////////////////////////////////////////////////////////
407void MainWnd::on_actionCinnamon_triggered()
408{
409    ui->DEChooserButton->setIcon(ui->actionCinnamon->icon());
410    if (mCurrentDE.Name.trimmed().compare("Cinnamon", Qt::CaseInsensitive))
411        ui->DEGBox->setTitle(DETEXT + " " + tr ("(Cinnamon)"));
412    else
413        ui->DEGBox->setTitle(DETEXT);
414
415    mvEnabledDE.clear();
416    mvEnabledDE.push_back("Cinnamon");
417
418    misDisplayDEName = false;
419
420    //refresh
421    on_toolButton_2_clicked();
422}
423
424///////////////////////////////////////////////////////////////////////////////
425void MainWnd::on_actionXFCE_triggered()
426{
427    ui->DEChooserButton->setIcon(ui->actionXFCE->icon());
428    if (mCurrentDE.Name.trimmed().compare("XFCE", Qt::CaseInsensitive))
429        ui->DEGBox->setTitle(DETEXT + " " + tr ("(XFCE)"));
430    else
431        ui->DEGBox->setTitle(DETEXT);
432
433    mvEnabledDE.clear();
434    mvEnabledDE.push_back("XFCE");
435
436    misDisplayDEName = false;
437    //refresh
438    on_toolButton_2_clicked();
439}
440
441///////////////////////////////////////////////////////////////////////////////
442void MainWnd::on_actionUnsupported_triggered()
443{
444        mvEnabledDE.clear();
445
446        misDisplayDEName = false;
447        //refresh
448        on_toolButton_2_clicked();   
449}
450
451///////////////////////////////////////////////////////////////////////////////
452void MainWnd::slotSingleInstance()
453{
454   this->hide();
455   this->showNormal();
456   this->activateWindow();
457   this->raise();
458}
459
460///////////////////////////////////////////////////////////////////////////////
461void MainWnd::onDirectoryChanged(const QString& path)
462{
463    //Refresh if items or installed pbis dir was changed
464    QObject::disconnect(&mDirWatcher,0,0,0);
465    //qDebug() << "onDirectoryChanged";
466    on_toolButton_2_clicked();
467    QObject::connect(&mDirWatcher, SIGNAL(directoryChanged(const QString &)),
468                     this, SLOT(onDirectoryChanged(const QString &)));
469    QString junk = path; //to get rid of compilation warning about unused variable
470}
471
472///////////////////////////////////////////////////////////////////////////////
473bool MainWnd::checkUserGroup(QString groupName)
474{
475   QString loginName = getlogin();
476   QStringList gNames;
477   if ( loginName == "root" )
478     return true;
479
480   QString tmp;
481   QFile iFile("/etc/group");
482   if ( ! iFile.open(QIODevice::ReadOnly | QIODevice::Text))
483     return true; //or FALSE?
484               
485   while ( !iFile.atEnd() ) {
486     tmp = iFile.readLine().simplified();
487     if ( tmp.indexOf(groupName) == 0 ) {
488        gNames = tmp.section(":", 3, 3).split(",");
489        break;
490     }
491   }
492   iFile.close();
493       
494   for ( int i = 0; i < gNames.size(); ++i )
495      if ( gNames.at(i).indexOf(loginName) == 0 )
496            return true;
497
498   return false;
499}
500
501///////////////////////////////////////////////////////////////////////////////
502void MainWnd::refreshDEConfigureApp()
503{
504    //ui->deLaunchConfigApp->setIcon( ui->DEChooserButton->icon() );
505    if (mvEnabledDE.size() != 1)
506    {
507        ui->deLaunchConfigApp->setVisible(false);
508        return;
509    }
510
511    pcbsd::DesktopEnvironmentInfo* de = InstalledDEList.byName(mvEnabledDE[0]);
512    if (!de)
513    {
514        ui->deLaunchConfigApp->setVisible(false);
515        return;
516    }
517
518
519
520    if (!de->ConfigurationApplication.length())
521    {
522        ui->deLaunchConfigApp->setVisible(false);
523        return;
524    }
525
526    //make icon
527    QPixmap orig(ui->deLaunchConfigApp->iconSize());
528
529    int sx = ui->deLaunchConfigApp->iconSize().width();
530    int sy = ui->deLaunchConfigApp->iconSize().height();
531
532    QPixmap pix;
533    orig.fill(Qt::transparent);
534    QPainter painter(&orig);
535    painter.drawPixmap(0, 0, sx, sy, ui->DEChooserButton->icon().pixmap(sx, sy));
536    pix.load(DE_CONFIG_APP_MARK);
537    painter.drawPixmap(orig.width() - pix.width(), orig.height() - pix.height() , pix);
538    ui->deLaunchConfigApp->setIcon(QIcon(orig));
539
540    ui->deLaunchConfigApp->setVisible(true);
541}
542
543///////////////////////////////////////////////////////////////////////////////
544void MainWnd::on_DEChooserButton_triggered(QAction *arg1)
545{
546    Q_UNUSED(arg1);
547    refreshDEConfigureApp();
548}
549
550///////////////////////////////////////////////////////////////////////////////
551void MainWnd::on_deLaunchConfigApp_clicked()
552{
553    if (mvEnabledDE.size() != 1)
554    {
555        ui->deLaunchConfigApp->setVisible(false);
556        return;
557    }
558
559    pcbsd::DesktopEnvironmentInfo* de = InstalledDEList.byName(mvEnabledDE[0]);
560    if (!de)
561    {
562        return;
563    }
564
565    if (!de->ConfigurationApplication.length())
566    {
567        return;
568    }
569
570    QProcess process;
571
572    //TODO: smarter args parsing (including quotes)
573    QStringList proc_args = de->ConfigurationApplication.split(" ",QString::SkipEmptyParts);
574
575    QString proc = proc_args[0];
576    proc_args.pop_front();
577    process.startDetached(proc, proc_args);
578}
Note: See TracBrowser for help on using the repository browser.