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_interface_menu.h"
8 #include "ui_page_interface_menu.h"
9 #include "../AppDialog.h"
10 #include "../GetPluginDialog.h"
11 #include "../ScriptDialog.h"
12 //==========
13 //    PUBLIC
14 //==========
page_interface_menu(QWidget * parent)15 page_interface_menu::page_interface_menu(QWidget *parent) : PageWidget(parent), ui(new Ui::page_interface_menu()){
16   ui->setupUi(this);
17   PINFO = new LPlugins();
18   connect(ui->tool_menu_add, SIGNAL(clicked()), this, SLOT(addmenuplugin()) );
19   connect(ui->tool_menu_rm, SIGNAL(clicked()), this, SLOT(rmmenuplugin()) );
20   connect(ui->tool_menu_up, SIGNAL(clicked()), this, SLOT(upmenuplugin()) );
21   connect(ui->tool_menu_dn, SIGNAL(clicked()), this, SLOT(downmenuplugin()) );
22   connect(ui->list_menu, SIGNAL(currentRowChanged(int)), this, SLOT(checkmenuicons()) );
23 
24  updateIcons();
25 }
26 
~page_interface_menu()27 page_interface_menu::~page_interface_menu(){
28   delete PINFO;
29 }
30 
31 //================
32 //    PUBLIC SLOTS
33 //================
SaveSettings()34 void page_interface_menu::SaveSettings(){
35   QSettings settings("lumina-desktop","desktopsettings");
36   QStringList items;
37   for(int i=0; i<ui->list_menu->count(); i++){
38     items << ui->list_menu->item(i)->whatsThis();
39   }
40   settings.setValue("menu/itemlist", items);
41   emit HasPendingChanges(false);
42 }
43 
LoadSettings(int)44 void page_interface_menu::LoadSettings(int){
45   emit HasPendingChanges(false);
46   emit ChangePageTitle( tr("Desktop Settings") );
47   QSettings settings("lumina-desktop","desktopsettings");
48 
49 QStringList items = settings.value("menu/itemlist", QStringList() ).toStringList();
50   if(items.isEmpty()){ items << "terminal" << "filemanager" << "applications" << "line" << "settings"; }
51   //qDebug() << "Menu Items:" << items;
52    ui->list_menu->clear();
53    for(int i=0; i<items.length(); i++){
54     if(items[i].startsWith("app::::")){
55       XDGDesktop desk(items[i].section("::::",1,1));
56       if(desk.type == XDGDesktop::BAD){ continue; } //invalid application file (no longer installed?)
57       QListWidgetItem *item = new QListWidgetItem();
58         item->setWhatsThis( items[i] );
59         item->setIcon( LXDG::findIcon(desk.icon) );
60         item->setText( desk.name );
61         item->setToolTip( desk.comment );
62       ui->list_menu->addItem(item);
63       continue; //now go to the next item
64     }else if(items[i].startsWith("jsonmenu::::")){
65       LPI info = PINFO->menuPluginInfo( items[i].section("::::",0,0) );
66       if(info.ID.isEmpty()){ continue; } //invalid plugin type (no longer available?)
67       QString exec = items[i].section("::::",1,1);
68 
69       QListWidgetItem *item = new QListWidgetItem();
70         item->setWhatsThis( items[i] );
71         item->setIcon( LXDG::findIcon(items[i].section("::::",3,3),info.icon) );
72         item->setText( items[i].section("::::",2,2) +" ("+info.name+")" );
73         item->setToolTip( info.description );
74       ui->list_menu->addItem(item);
75       continue; //now go to the next item
76     }
77     LPI info = PINFO->menuPluginInfo(items[i]);
78     if(info.ID.isEmpty()){ continue; } //invalid plugin
79     //qDebug() << "Add Menu Item:" << info.ID;
80     QListWidgetItem *item = new QListWidgetItem();
81       item->setWhatsThis( info.ID );
82       item->setIcon( LXDG::findIcon(info.icon,"") );
83       item->setText( info.name );
84       item->setToolTip( info.description );
85     ui->list_menu->addItem(item);
86    }
87   checkmenuicons(); //update buttons
88 }
89 
updateIcons()90 void page_interface_menu::updateIcons(){
91   ui->tool_menu_add->setIcon( LXDG::findIcon("list-add","") );
92   ui->tool_menu_rm->setIcon( LXDG::findIcon("list-remove","") );
93   ui->tool_menu_up->setIcon( LXDG::findIcon("go-up","") );
94   ui->tool_menu_dn->setIcon( LXDG::findIcon("go-down","") );
95 }
96 
97 //=================
98 //         PRIVATE
99 //=================
getSysApp(bool allowreset)100 QString page_interface_menu::getSysApp(bool allowreset){
101   AppDialog dlg(this);
102     dlg.allowReset(allowreset);
103     dlg.exec();
104   if(dlg.appreset && allowreset){
105     return "reset";
106   }else{
107     return dlg.appselected;
108   }
109 }
110 
111 //=================
112 //    PRIVATE SLOTS
113 //=================
addmenuplugin()114 void page_interface_menu::addmenuplugin(){
115   GetPluginDialog dlg(this);
116 	dlg.LoadPlugins("menu", PINFO);
117 	dlg.exec();
118   if(!dlg.selected){ return; } //cancelled
119   QString plug = dlg.plugID;
120   //Now add the item to the list
121   LPI info = PINFO->menuPluginInfo(plug);
122   QListWidgetItem *it;
123   if(info.ID=="app"){
124     //Need to prompt for the exact application to add to the menu
125     // Note: whatsThis() format: "app::::< *.desktop file path >"
126     QString app = getSysApp();
127     if(app.isEmpty()){ return; }//nothing selected
128     //Create the item for the list
129     XDGDesktop desk(app);
130     it = new QListWidgetItem(LXDG::findIcon(desk.icon,""), desk.name );
131       it->setWhatsThis(info.ID+"::::"+desk.filePath);
132       it->setToolTip( desk.comment );
133   }else if(info.ID=="jsonmenu"){
134     //Need to prompt for the script file, name, and icon to use
135     //new ID format: "jsonmenu"::::<exec to run>::::<name>::::<icon>
136     ScriptDialog SD(this);
137     SD.exec();
138     if(!SD.isValid()){ return; }
139     it = new QListWidgetItem( LXDG::findIcon(SD.icon(),"text-x-script"), SD.name()+" ("+info.ID+")" );
140     it->setWhatsThis(info.ID+"::::"+SD.command()+"::::"+SD.name()+"::::"+SD.icon());
141     it->setToolTip( info.description );
142   }else{
143     it = new QListWidgetItem( LXDG::findIcon(info.icon,""), info.name );
144     it->setWhatsThis(info.ID);
145     it->setToolTip( info.description );
146   }
147   ui->list_menu->addItem(it);
148   ui->list_menu->setCurrentRow(ui->list_menu->count()-1); //make sure it is auto-selected
149   settingChanged();
150 }
151 
rmmenuplugin()152 void page_interface_menu::rmmenuplugin(){
153   if(ui->list_menu->currentRow() < 0){ return; } //no selection
154   delete ui->list_menu->takeItem( ui->list_menu->currentRow() );
155   settingChanged();
156 }
157 
upmenuplugin()158 void page_interface_menu::upmenuplugin(){
159   int row = ui->list_menu->currentRow();
160   if(row <= 0){ return; }
161   ui->list_menu->insertItem(row-1, ui->list_menu->takeItem(row));
162   ui->list_menu->setCurrentRow(row-1);
163 
164   checkmenuicons();
165   settingChanged();
166 }
167 
downmenuplugin()168 void page_interface_menu::downmenuplugin(){
169   int row = ui->list_menu->currentRow();
170   if(row < 0 || row >= (ui->list_menu->count()-1) ){ return; }
171   ui->list_menu->insertItem(row+1, ui->list_menu->takeItem(row));
172   ui->list_menu->setCurrentRow(row+1);
173 
174   checkmenuicons();
175   settingChanged();
176 }
177 
checkmenuicons()178 void page_interface_menu::checkmenuicons(){
179   ui->tool_menu_up->setEnabled( ui->list_menu->currentRow() > 0 );
180   ui->tool_menu_dn->setEnabled( ui->list_menu->currentRow() < (ui->list_menu->count()-1) );
181   ui->tool_menu_rm->setEnabled( ui->list_menu->currentRow() >=0 );
182 }
183