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