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