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

releng/10.0
Last change on this file since 4db4427 was 4db4427, checked in by Kris Moore <kris@…>, 16 months ago

Adjust the tooltip colors to black on white, make them readable

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