1 //===========================================
2 //  Lumina Desktop Source Code
3 //  Copyright (c) 2016, Ken Moore
4 //  Available under the 3-clause BSD license
5 //  See the LICENSE file for full details
6 //===========================================
7 #include "page_main.h"
8 #include "ui_page_main.h"
9 #include "getPage.h"
10 
11 extern XDGDesktopList* APPSLIST;
12 
13 //==========
14 //    PUBLIC
15 //==========
page_main(QWidget * parent)16 page_main::page_main(QWidget *parent) : PageWidget(parent), ui(new Ui::page_main()){
17   ui->setupUi(this);
18   findShort = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F), this, SLOT(showFind()));
19   ui->treeWidget->setMouseTracking(true);
20   ui->treeWidget->setSortingEnabled(false); //the QTreeView sort flag always puts them in backwards (reverse-alphabetical)
21   connect(ui->treeWidget, SIGNAL(itemActivated(QTreeWidgetItem*,int)), this, SLOT(itemTriggered(QTreeWidgetItem*, int)) );
22   connect(ui->treeWidget, SIGNAL(itemPressed(QTreeWidgetItem*,int)), this, SLOT(itemTriggered(QTreeWidgetItem*, int)) );
23 
24   connect(ui->lineEdit, SIGNAL(textChanged(QString)), this, SLOT(searchChanged(QString)) );
25   connect(APPSLIST, SIGNAL(appsUpdated()), this, SLOT(LoadSettings()) );
26 }
27 
~page_main()28 page_main::~page_main(){
29 
30 }
31 
setPreviousPage(QString id)32 void page_main::setPreviousPage(QString id){
33   if(id.isEmpty()){ return; }
34   for(int i=0; i<ui->treeWidget->topLevelItemCount(); i++){
35     for(int j=0; j<ui->treeWidget->topLevelItem(i)->childCount(); j++){
36       if(ui->treeWidget->topLevelItem(i)->child(j)->whatsThis(0)==id){
37         ui->treeWidget->setCurrentItem(ui->treeWidget->topLevelItem(i)->child(j), 0);
38         ui->treeWidget->scrollToItem(ui->treeWidget->topLevelItem(i)->child(j));
39         return; //found item - done
40       }else if(ui->treeWidget->topLevelItem(i)->child(j)->whatsThis(1)==id){
41         ui->treeWidget->setCurrentItem(ui->treeWidget->topLevelItem(i)->child(j), 1);
42         ui->treeWidget->scrollToItem(ui->treeWidget->topLevelItem(i)->child(j));
43         return; //found item - done
44       }
45     }
46   }
47 
48 }
49 
UpdateItems(QString search)50 void page_main::UpdateItems(QString search){
51   ui->treeWidget->clear();
52   ui->treeWidget->setColumnCount(2);
53   //First create the categories
54   QTreeWidgetItem *interface = new QTreeWidgetItem();
55     interface->setIcon(0, LXDG::findIcon("preferences-desktop",""));
56     interface->setText(0, tr("Interface Configuration"));
57     interface->setFirstColumnSpanned(true);
58   QTreeWidgetItem *appearance = new QTreeWidgetItem();
59     appearance->setIcon(0, LXDG::findIcon("preferences-desktop-color",""));
60     appearance->setText(0, tr("Appearance"));
61     appearance->setFirstColumnSpanned(true);
62   QTreeWidgetItem *session = new QTreeWidgetItem();
63     session->setIcon(0, LXDG::findIcon("preferences-system-session-services",""));
64     session->setText(0, tr("Desktop Defaults"));
65     session->setFirstColumnSpanned(true);
66   QTreeWidgetItem *user = new QTreeWidgetItem();
67     user->setIcon(0, LXDG::findIcon("preferences-desktop-user",""));
68     user->setText(0, tr("User Settings"));
69     user->setFirstColumnSpanned(true);
70     QTreeWidgetItem *system = new QTreeWidgetItem();
71     system->setIcon(0, LXDG::findIcon("preferences-system",""));
72     system->setText(0, tr("System Settings"));
73     system->setFirstColumnSpanned(true);
74   //Now go through and add in the known pages for each category
75   QStringList SL = search.split(" "); //search list
76   for(int i=0; i<INFO.length(); i++){
77     if(!search.isEmpty() ){
78       //See if this item needs to be included or not
79       QStringList info; info << INFO[i].name.split(" ") << INFO[i].title.split(" ") << INFO[i].comment.split(" ") << INFO[i].search_tags;
80       info.removeDuplicates(); //remove any duplicate terms/info first
81       bool ok = true;
82       for(int s=0; s<SL.length() && ok; s++){
83 	ok = !info.filter(SL[s]).isEmpty();
84       }
85       if(!ok){ continue; } //no duplicates between search terms and available info
86     }
87     //qDebug() << "Item Found:" << INFO[i].id << INFO[i].title;
88     int col = 0;
89     QTreeWidgetItem *lastIt = 0;
90     if(INFO[i].category=="interface" && interface->childCount()>0 ){
91       if( interface->child( interface->childCount()-1)->text(1).isEmpty() ){ lastIt = interface->child(interface->childCount()-1); }
92    }else if(INFO[i].category=="appearance"  && appearance->childCount()>0 ){
93       if( appearance->child(appearance->childCount()-1)->text(1).isEmpty() ){ lastIt = appearance->child(appearance->childCount()-1); }
94     }else if(INFO[i].category=="session"  && session->childCount()>0 ){
95       if( session->child( session->childCount()-1)->text(1).isEmpty() ){ lastIt = session->child(session->childCount()-1); }
96     }else if(INFO[i].category=="user"  && user->childCount()>0 ){
97       if( user->child( user->childCount()-1)->text(1).isEmpty() ){ lastIt = user->child(user->childCount()-1); }
98     }else if(INFO[i].category=="system"  && system->childCount()>0 ){
99       if( system->child( system->childCount()-1)->text(1).isEmpty() ){ lastIt = system->child(system->childCount()-1); }
100     }
101     if(lastIt==0){ lastIt = new QTreeWidgetItem();  col = 0;}
102     else{ col = 1; }
103     lastIt->setIcon(col, LXDG::findIcon(INFO[i].icon,"") );
104     lastIt->setText(col, INFO[i].name);
105     lastIt->setStatusTip(col, INFO[i].comment);
106     lastIt->setToolTip(col, INFO[i].comment);
107     lastIt->setWhatsThis(col, INFO[i].id);
108     if(col==0){
109       if(INFO[i].category=="interface"){ interface->addChild(lastIt); }
110       else if(INFO[i].category=="appearance"){ appearance->addChild(lastIt); }
111       else if(INFO[i].category=="session"){ session->addChild(lastIt); }
112       else if(INFO[i].category=="user"){ user->addChild(lastIt); }
113       else if(INFO[i].category=="system"){ system->addChild(lastIt); }
114       else{ ui->treeWidget->addTopLevelItem(lastIt); }
115     }
116   }
117   //Now add the categories to the tree widget if they are non-empty
118   if(interface->childCount()>0){ ui->treeWidget->addTopLevelItem(interface); interface->setExpanded(true); }
119   if(appearance->childCount()>0){ ui->treeWidget->addTopLevelItem(appearance); appearance->setExpanded(true); }
120   if(session->childCount()>0){ ui->treeWidget->addTopLevelItem(session); session->setExpanded(true); }
121   if(user->childCount()>0){ ui->treeWidget->addTopLevelItem(user); user->setExpanded(true); }
122   if(system->childCount()>0){ ui->treeWidget->addTopLevelItem(system); system->setExpanded(true); }
123   ui->treeWidget->sortItems(0, Qt::AscendingOrder);
124   ui->treeWidget->resizeColumnToContents(0);
125   ui->treeWidget->resizeColumnToContents(1);
126 
127   //Now make sure the width of the tree widget is greater/equal to the recommended size
128   int wid = ui->treeWidget->indentation() + 10;
129   for(int i=0; i<ui->treeWidget->columnCount(); i++){
130     wid += ui->treeWidget->columnWidth(i);
131   }
132   if(wid < ui->treeWidget->header()->width() ){ wid = ui->treeWidget->header()->width(); }
133   //qDebug() << "Current size:" << ui->treeWidget->size() << ui->treeWidget->header()->width() << wid;
134   if(ui->treeWidget->size().width() < wid ){
135     // ENABLE LATER  WITH LUMINA 2.0 - Fluxbox does not like it when a window gets resized near the init routine
136     //   and moves the window slightly-offscreen (titlebar hidden)
137     //ui->treeWidget->setMinimumWidth( wid );
138   }
139 }
140 
141 //================
142 //    PUBLIC SLOTS
143 //================
SaveSettings()144 void page_main::SaveSettings(){
145 
146 }
147 
clearlineEdit()148 void page_main::clearlineEdit(){
149   ui->lineEdit->clear();
150   ui->treeWidget->sortItems(0, Qt::AscendingOrder);
151   ui->treeWidget->resizeColumnToContents(0);
152   ui->treeWidget->resizeColumnToContents(1);
153 }
154 
155 
LoadSettings(int)156 void page_main::LoadSettings(int){
157   emit HasPendingChanges(false);
158   emit ChangePageTitle( tr("Desktop Settings") );
159   INFO.clear();
160   INFO = Pages::KnownPages();
161   //Also add known system setting applications to the INFO list
162   QList<XDGDesktop*> apps = APPSLIST->apps(false,false); //only valid, non-hidden files
163   qDebug() << "Found Apps:" << apps.length();
164   for(int i=0; i<apps.length(); i++){
165     if( !apps[i]->catList.contains("Settings") || apps[i]->filePath.endsWith("lumina-config.desktop") ){ continue; }
166     INFO << Pages::PageInfo(apps[i]->filePath, apps[i]->name, apps[i]->genericName, apps[i]->icon, apps[i]->comment, "system", QStringList(), apps[i]->keyList);
167   }
168   //Now sort the items according to the translated name
169   QStringList names;
170   for(int i=0; i<INFO.length(); i++){ names << INFO[i].name; }
171   names.sort(Qt::CaseInsensitive);
172   QList<PAGEINFO> sorted;
173   for(int i=0; i<names.length(); i++){
174     for(int j=0; j<INFO.length(); j++){
175       if(INFO[j].name==names[i]){ sorted << INFO.takeAt(j); break; }
176     }
177   }
178   INFO = sorted; //replace the internal list with the sorted version
179   UpdateItems(ui->lineEdit->text());
180   ui->lineEdit->setFocus();
181 }
182 
updateIcons()183 void page_main::updateIcons(){
184   UpdateItems("");
185 }
186 
187 //=================
188 //    PRIVATE SLOTS
189 //=================
showFind()190 void page_main::showFind(){
191   ui->lineEdit->setFocus();
192   ui->treeWidget->setCurrentItem(0);
193 }
194 
itemTriggered(QTreeWidgetItem * it,int col)195 void page_main::itemTriggered(QTreeWidgetItem *it, int col){
196   if(it->childCount()>0){
197     it->setExpanded( !it->isExpanded() );
198     it->setSelected(false);
199   }else if(!it->whatsThis(col).isEmpty()){
200     QString id = it->whatsThis(col);
201     if(id.endsWith(".desktop")){ QProcess::startDetached("lumina-open \""+id+"\""); } //external setting utility
202     else{ emit ChangePage(it->whatsThis(col)); } //internal page
203   }else{
204    it->setSelected(false);
205   }
206 }
207 
searchChanged(QString txt)208 void page_main::searchChanged(QString txt){
209   UpdateItems(txt.simplified());
210 }
211