diff options
Diffstat (limited to 'lumina-config/mainUI.cpp')
-rw-r--r-- | lumina-config/mainUI.cpp | 1436 |
1 files changed, 1436 insertions, 0 deletions
diff --git a/lumina-config/mainUI.cpp b/lumina-config/mainUI.cpp new file mode 100644 index 00000000..52361ae5 --- /dev/null +++ b/lumina-config/mainUI.cpp @@ -0,0 +1,1436 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2014, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "mainUI.h" +#include "ui_mainUI.h" //the designer *.ui file + +MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI()){ + ui->setupUi(this); //load the designer file + this->setWindowIcon( LXDG::findIcon("preferences-desktop-display","") ); + PINFO = new LPlugins(); //load the info class + + //Be careful about the QSettings setup, it must match the lumina-desktop setup + QSettings::setPath(QSettings::NativeFormat, QSettings::UserScope, QDir::homePath()+"/.lumina"); + settings = new QSettings( QSettings::UserScope, "LuminaDE", "desktopsettings", this); + appsettings = new QSettings( QSettings::UserScope, "LuminaDE", "lumina-open", this); + sessionsettings = new QSettings( QSettings::UserScope, "LuminaDE","sessionsettings", this); + qDebug() << "Settings File:" << settings->fileName(); + desktop = new QDesktopWidget(); + ui->spin_screen->setMinimum(1); + //Make sure this is only allows the current number of screens + ui->spin_screen->setMaximum(desktop->screenCount()); + ui->spin_screen->setValue(desktop->primaryScreen()+1); //have the current screen auto-selected + //qDebug() << "Number of Screens:" << desktop->screenCount(); + sysApps = LXDG::sortDesktopNames( LXDG::systemDesktopFiles() ); + + //Now finish setting up the UI + setupIcons(); + setupMenus(); + setupConnections(); + + //Start on the Desktop page + ui->stackedWidget->setCurrentWidget(ui->page_desktop); + slotChangePage(false); + QTimer::singleShot(10, this, SLOT(loadCurrentSettings()) ); + + //Disable the incomplete pages/items at the moment + ui->check_session_playloginaudio->setVisible(false); + ui->check_session_playlogoutaudio->setVisible(false); +} + +MainUI::~MainUI(){ + +} + +void MainUI::slotSingleInstance(){ + //Make sure this window is visible + this->showNormal(); + this->activateWindow(); + this->raise(); +} + +//================ +// PRIVATE FUNCTIONS +//================ +void MainUI::setupIcons(){ + //Pull all the icons from the current theme using libLumina (LXDG) + + //General UI + ui->actionDesktop->setIcon( LXDG::findIcon("preferences-desktop-wallpaper","") ); + ui->actionPanels->setIcon( LXDG::findIcon("configure-toolbars","") ); + ui->actionMenu->setIcon( LXDG::findIcon("preferences-desktop-icons","") ); + ui->actionShortcuts->setIcon( LXDG::findIcon("configure-shortcuts","") ); + ui->actionDefaults->setIcon( LXDG::findIcon("preferences-desktop-filetype-association","") ); + ui->actionSession->setIcon( LXDG::findIcon("preferences-system-session-services","") ); + ui->push_save->setIcon( LXDG::findIcon("document-save","") ); + + + //Desktop Page + ui->tool_desk_addbg->setIcon( LXDG::findIcon("list-add","") ); + ui->tool_desk_rmbg->setIcon( LXDG::findIcon("list-remove","") ); + ui->tool_desk_addplug->setIcon( LXDG::findIcon("list-add","") ); + + //Panels Page + ui->tool_panel1_add->setIcon( LXDG::findIcon("list-add","") ); + ui->tool_panel1_rm->setIcon( LXDG::findIcon("list-remove","") ); + ui->tool_panel1_addplugin->setIcon( LXDG::findIcon("list-add","") ); + ui->tool_panel1_rmplugin->setIcon( LXDG::findIcon("list-remove","") ); + ui->tool_panel1_upplug->setIcon( LXDG::findIcon("go-up","") ); + ui->tool_panel1_dnplug->setIcon( LXDG::findIcon("go-down","") ); + ui->tool_panel1_getcolor->setIcon( LXDG::findIcon("preferences-desktop-color","") ); + ui->toolBox_panel1->setItemIcon(0,LXDG::findIcon("preferences-desktop-display","")); + ui->toolBox_panel1->setItemIcon(1,LXDG::findIcon("preferences-plugin","")); + ui->tool_panel2_add->setIcon( LXDG::findIcon("list-add","") ); + ui->tool_panel2_rm->setIcon( LXDG::findIcon("list-remove","") ); + ui->tool_panel2_addplugin->setIcon( LXDG::findIcon("list-add","") ); + ui->tool_panel2_rmplugin->setIcon( LXDG::findIcon("list-remove","") ); + ui->tool_panel2_upplug->setIcon( LXDG::findIcon("go-up","") ); + ui->tool_panel2_dnplug->setIcon( LXDG::findIcon("go-down","") ); + ui->tool_panel2_getcolor->setIcon( LXDG::findIcon("preferences-desktop-color","") ); + ui->toolBox_panel2->setItemIcon(0,LXDG::findIcon("preferences-desktop-display","")); + ui->toolBox_panel2->setItemIcon(1,LXDG::findIcon("preferences-plugin","")); + + //Menu Page + ui->tool_menu_add->setIcon( LXDG::findIcon("list-add","") ); + ui->tool_menu_rm->setIcon( LXDG::findIcon("list-remove","") ); + ui->tool_menu_up->setIcon( LXDG::findIcon("go-up","") ); + ui->tool_menu_dn->setIcon( LXDG::findIcon("go-down","") ); + ui->tool_menu_findterm->setIcon( LXDG::findIcon("system-search","") ); + + //Shortcuts Page + ui->tool_shortcut_set->setIcon( LXDG::findIcon("input-keyboard","") ); + ui->tool_shortcut_clear->setIcon( LXDG::findIcon("edit-clear","") ); + + //Defaults Page + ui->tool_defaults_addextension->setIcon( LXDG::findIcon("list-add","") ); + ui->tool_defaults_addgroup->setIcon( LXDG::findIcon("list-add","") ); + ui->tool_defaults_clear->setIcon( LXDG::findIcon("edit-clear","") ); + ui->tool_defaults_set->setIcon( LXDG::findIcon("system-run","") ); + + //Session Page + ui->tool_session_rmapp->setIcon( LXDG::findIcon("list-remove","") ); + ui->tool_session_addapp->setIcon( LXDG::findIcon("system-run","") ); + ui->tool_session_addbin->setIcon( LXDG::findIcon("system-search","") ); + ui->tool_session_addfile->setIcon( LXDG::findIcon("run-build-file","") ); + +} + +void MainUI::setupConnections(){ + //General UI + connect(ui->actionDesktop, SIGNAL(triggered(bool)), this, SLOT( slotChangePage(bool)) ); + connect(ui->actionPanels, SIGNAL(triggered(bool)), this, SLOT( slotChangePage(bool)) ); + connect(ui->actionMenu, SIGNAL(triggered(bool)), this, SLOT( slotChangePage(bool)) ); + connect(ui->actionShortcuts, SIGNAL(triggered(bool)), this, SLOT( slotChangePage(bool)) ); + connect(ui->actionDefaults, SIGNAL(triggered(bool)), this, SLOT( slotChangePage(bool)) ); + connect(ui->actionSession, SIGNAL(triggered(bool)), this, SLOT( slotChangePage(bool)) ); + connect(ui->push_save, SIGNAL(clicked()), this, SLOT(saveCurrentSettings()) ); + connect(ui->spin_screen, SIGNAL(valueChanged(int)), this, SLOT(slotChangeScreen()) ); + + //Desktop Page + connect(ui->combo_desk_plugs, SIGNAL(currentIndexChanged(int)), this, SLOT(deskplugchanged()) ); + connect(ui->combo_desk_bg, SIGNAL(currentIndexChanged(int)), this, SLOT(deskbgchanged()) ); + connect(ui->radio_desk_multi, SIGNAL(toggled(bool)), this, SLOT(desktimechanged()) ); + connect(ui->tool_desk_addplug, SIGNAL(clicked()), this, SLOT(deskplugadded()) ); + connect(ui->tool_desk_addbg, SIGNAL(clicked()), this, SLOT(deskbgadded()) ); + connect(ui->tool_desk_rmbg, SIGNAL(clicked()), this, SLOT(deskbgremoved()) ); + connect(ui->spin_desk_min, SIGNAL(valueChanged(int)), this, SLOT(desktimechanged()) ); + + //Panels Page + connect(ui->tool_panel1_add,SIGNAL(clicked()), this, SLOT(addpanel1()) ); + connect(ui->tool_panel2_add,SIGNAL(clicked()), this, SLOT(addpanel2()) ); + connect(ui->tool_panel1_rm,SIGNAL(clicked()), this, SLOT(rmpanel1()) ); + connect(ui->tool_panel2_rm,SIGNAL(clicked()), this, SLOT(rmpanel2()) ); + connect(ui->tool_panel1_getcolor,SIGNAL(clicked()), this, SLOT(getpanel1color()) ); + connect(ui->tool_panel2_getcolor,SIGNAL(clicked()), this, SLOT(getpanel2color()) ); + connect(ui->toolBox_panel1, SIGNAL(currentChanged(int)), this, SLOT(adjustpanel2()) ); + connect(ui->toolBox_panel2, SIGNAL(currentChanged(int)), this, SLOT(adjustpanel1()) ); + connect(ui->combo_panel1_loc, SIGNAL(currentIndexChanged(int)), this, SLOT(adjustpanel2()) ); + connect(ui->combo_panel2_loc, SIGNAL(currentIndexChanged(int)), this, SLOT(adjustpanel1()) ); + connect(ui->spin_panel1_size, SIGNAL(valueChanged(int)), this, SLOT(adjustpanel2()) ); + connect(ui->spin_panel2_size, SIGNAL(valueChanged(int)), this, SLOT(adjustpanel1()) ); + connect(ui->tool_panel1_addplugin, SIGNAL(clicked()), this, SLOT(addpanel1plugin()) ); + connect(ui->tool_panel1_rmplugin, SIGNAL(clicked()), this, SLOT(rmpanel1plugin()) ); + connect(ui->tool_panel1_upplug, SIGNAL(clicked()), this, SLOT(uppanel1plugin()) ); + connect(ui->tool_panel1_dnplug, SIGNAL(clicked()), this, SLOT(dnpanel1plugin()) ); + connect(ui->tool_panel2_addplugin, SIGNAL(clicked()), this, SLOT(addpanel2plugin()) ); + connect(ui->tool_panel2_rmplugin, SIGNAL(clicked()), this, SLOT(rmpanel2plugin()) ); + connect(ui->tool_panel2_upplug, SIGNAL(clicked()), this, SLOT(uppanel2plugin()) ); + connect(ui->tool_panel2_dnplug, SIGNAL(clicked()), this, SLOT(dnpanel2plugin()) ); + + //Menu Page + connect(ui->tool_menu_add, SIGNAL(clicked()), this, SLOT(addmenuplugin()) ); + connect(ui->tool_menu_rm, SIGNAL(clicked()), this, SLOT(rmmenuplugin()) ); + connect(ui->tool_menu_up, SIGNAL(clicked()), this, SLOT(upmenuplugin()) ); + connect(ui->tool_menu_dn, SIGNAL(clicked()), this, SLOT(downmenuplugin()) ); + connect(ui->tool_menu_findterm, SIGNAL(clicked()), this, SLOT(findmenuterminal()) ); + connect(ui->list_menu, SIGNAL(currentRowChanged(int)), this, SLOT(checkmenuicons()) ); + connect(ui->line_menu_term, SIGNAL(textChanged(QString)), this, SLOT(checkmenuicons()) ); + + //Shortcuts Page + connect(ui->tool_shortcut_clear, SIGNAL(clicked()), this, SLOT(clearKeyBinding()) ); + connect(ui->tool_shortcut_set, SIGNAL(clicked()), this, SLOT(getKeyPress()) ); + + //Defaults Page + connect(ui->tool_defaults_addextension, SIGNAL(clicked()), this, SLOT(adddefaultextension()) ); + connect(ui->tool_defaults_addgroup, SIGNAL(clicked()), this, SLOT(adddefaultgroup()) ); + connect(ui->tool_defaults_clear, SIGNAL(clicked()), this, SLOT(cleardefaultitem()) ); + connect(ui->tool_defaults_set, SIGNAL(clicked()), this, SLOT(setdefaultitem()) ); + connect(ui->tree_defaults, SIGNAL(itemSelectionChanged()), this, SLOT(checkdefaulticons()) ); + + //Session Page + connect(ui->tool_session_addapp, SIGNAL(clicked()), this, SLOT(addsessionstartapp()) ); + connect(ui->tool_session_addbin, SIGNAL(clicked()), this, SLOT(addsessionstartbin()) ); + connect(ui->tool_session_addfile, SIGNAL(clicked()), this, SLOT(addsessionstartfile()) ); + connect(ui->tool_session_rmapp, SIGNAL(clicked()), this, SLOT(rmsessionstartitem()) ); + connect(ui->combo_session_wfocus, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionoptchanged()) ); + connect(ui->combo_session_wloc, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionoptchanged()) ); + connect(ui->combo_session_wtheme, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionoptchanged()) ); + connect(ui->check_session_numlock, SIGNAL(stateChanged(int)), this, SLOT(sessionoptchanged()) ); + connect(ui->check_session_playloginaudio, SIGNAL(stateChanged(int)), this, SLOT(sessionoptchanged()) ); + connect(ui->check_session_playlogoutaudio, SIGNAL(stateChanged(int)), this, SLOT(sessionoptchanged()) ); + connect(ui->spin_session_wkspaces, SIGNAL(valueChanged(int)), this, SLOT(sessionoptchanged()) ); + connect(ui->list_session_start, SIGNAL(currentRowChanged(int)), this, SLOT(sessionstartchanged()) ); +} + +void MainUI::setupMenus(){ + //Desktop Plugin Menu + ui->combo_desk_plugs->clear(); + QStringList plugs = PINFO->desktopPlugins(); + for(int i=0; i<plugs.length(); i++){ + LPI info = PINFO->desktopPluginInfo(plugs[i]); + ui->combo_desk_plugs->addItem( LXDG::findIcon(info.icon,""), info.name, plugs[i]); + } + ui->tool_desk_addplug->setEnabled(!plugs.isEmpty()); + deskplugchanged(); //make sure it loads the right info + + //Panel locations + ui->combo_panel1_loc->clear(); + ui->combo_panel2_loc->clear(); + QStringList loc; loc << tr("Top") << tr("Bottom") << tr("Left") << tr("Right"); + ui->combo_panel1_loc->addItems(loc); + ui->combo_panel2_loc->addItems(loc); + + //Session window manager settings + ui->combo_session_wfocus->clear(); + ui->combo_session_wfocus->addItem( tr("Click To Focus"), "ClickToFocus"); + ui->combo_session_wfocus->addItem( tr("Active Mouse Focus"), "MouseFocus"); + ui->combo_session_wfocus->addItem( tr("Strict Mouse Focus"), "StrictMouseFocus"); + ui->combo_session_wloc->clear(); + ui->combo_session_wloc->addItem( tr("Align in a Row"), "RowSmartPlacement"); + ui->combo_session_wloc->addItem( tr("Align in a Column"), "ColSmartPlacement"); + ui->combo_session_wloc->addItem( tr("Cascade"), "CascadePlacement"); + ui->combo_session_wloc->addItem( tr("Underneath Mouse"), "UnderMousePlacement"); + ui->combo_session_wtheme->clear(); + #ifdef __FreeBSD__ + QDir fbdir("/usr/local/share/fluxbox/styles"); + #endif + #ifdef __linux__ + QDir fbdir("/usr/share/fluxbox/styles"); + #endif + QStringList fbstyles = fbdir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); + for(int i=0; i<fbstyles.length(); i++){ + ui->combo_session_wtheme->addItem(fbstyles[i], fbdir.absoluteFilePath(fbstyles[i])); + } + + +} + +int MainUI::currentDesktop(){ + return ui->spin_screen->value()-1; //backend starts at 0, not 1 +} + +QString MainUI::getColorStyle(QString current){ + QString out; + //Convert the current color string into a QColor + QStringList col = current.section(")",0,0).section("(",1,1).split(","); + if(col.length()!=4){ col.clear(); col << "255" << "255" << "255" << "255"; } + QColor ccol = QColor(col[0].toInt(), col[1].toInt(), col[2].toInt(), col[3].toInt()); //RGBA + QColor ncol = QColorDialog::getColor(ccol, this, tr("Select Panel Color"), QColorDialog::ShowAlphaChannel); + //Now convert the new color into a usable string and return + if(ncol.isValid()){ //if the dialog was not cancelled + out = "rgba("+QString::number(ncol.red())+","+QString::number(ncol.green())+","+QString::number(ncol.blue())+","+QString::number(ncol.alpha())+")"; + } + return out; +} + +QString MainUI::getNewPanelPlugin(){ + QString out; + //Now let the user select a new panel plugin + QStringList plugs = PINFO->panelPlugins(); + QStringList names; + for(int i=0; i<plugs.length(); i++){ + names << PINFO->panelPluginInfo(plugs[i]).name; + } + bool ok = false; + QString sel = QInputDialog::getItem(this, tr("New Panel Plugin"), tr("Add Plugin:"), names, 0, false, &ok); + if(ok && !sel.isEmpty()){ + out = plugs[ names.indexOf(sel) ]; + } + return out; +} + +XDGDesktop MainUI::getSysApp(){ + //Prompt the user to select an application on the system + QStringList apps; + for(int i=0; i<sysApps.length(); i++){ + apps << sysApps[i].name; + } + bool ok = false; + QString app = QInputDialog::getItem(this, tr("Select Application"), tr("App Name:"), apps, 0, false, &ok); + int index = apps.indexOf(app); + if(app.isEmpty() || index < 0 || !ok){ return XDGDesktop(); } //nothing selected + else{ return sysApps[index]; } +} + +//Convert to/from fluxbox key codes +QString MainUI::dispToFluxKeys(QString in){ + in.replace("Ctrl", "Control"); + in.replace("Shift", "Shift"); + in.replace("Alt", "Mod1"); + in.replace("Meta", "Mod4"); + in.replace("PgUp", "Prior"); + in.replace("PgDown", "Next"); + in.replace("Del", "Delete"); + in.replace("Backspace", "BackSpace"); + in.replace("Ins","Insert"); + in.replace("Volume Up", "XF86AudioRaiseVolume"); //multimedia key + in.replace("Volume Down", "XF86AudioLowerVolume"); //multimedia key + return in; +} + +QString MainUI::fluxToDispKeys(QString in){ + in.replace("Control", "Ctrl"); + in.replace("Shift", "Shift"); + in.replace("Mod1", "Alt"); + in.replace("Mod4", "Meta"); + in.replace("Prior", "PgUp"); + in.replace("Next", "PgDown"); + //in.replace("Delete", "Del"); //the "Delete" is better looking + in.replace("BackSpace", "Backspace"); + //in.replace("Insert", "Ins"); //the "Insert" is better looking + in.replace("XF86AudioRaiseVolume", "Volume Up"); //multimedia key + in.replace("XF86AudioLowerVolume", "Volume Down"); //multimedia key + return in; +} + +//Read/overwrite a text file +QStringList MainUI::readFile(QString path){ + QStringList out; + QFile file(path); + if(file.open(QIODevice::ReadOnly | QIODevice::Text)){ + QTextStream txt(&file); + while(!txt.atEnd()){ + out << txt.readLine(); + } + file.close(); + } + return out; +} + +bool MainUI::overwriteFile(QString path, QStringList contents){ + QFile file(path); + if(file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)){ + QTextStream txt(&file); + for(int i=0; i<contents.length(); i++){ + txt << contents[i]+"\n"; + } + file.close(); + return true; + } + return false; +} + +//================ +// PRIVATE SLOTS +//================ +void MainUI::slotChangePage(bool enabled){ + //Do not allow the user to de-select a button (make them act like radio buttons) + //qDebug() << "Page Change:" << enabled; + bool showScreen = false; //set this for pages that have per-screen settings + if(!enabled){ + //Re-enable the current button + ui->actionDesktop->setChecked(ui->stackedWidget->currentWidget()==ui->page_desktop); + ui->actionPanels->setChecked(ui->stackedWidget->currentWidget()==ui->page_panels); + ui->actionMenu->setChecked(ui->stackedWidget->currentWidget()==ui->page_menu); + ui->actionShortcuts->setChecked(ui->stackedWidget->currentWidget()==ui->page_shortcuts); + ui->actionDefaults->setChecked(ui->stackedWidget->currentWidget()==ui->page_defaults); + ui->actionSession->setChecked(ui->stackedWidget->currentWidget()==ui->page_session); + showScreen = (ui->actionDesktop->isChecked() || ui->actionPanels->isChecked()); + //Ask if they want to reset any changes on the current page + + }else{ + //uncheck the button associated with the currently open page + if(ui->stackedWidget->currentWidget()==ui->page_desktop){ ui->actionDesktop->setChecked(false); } + if(ui->stackedWidget->currentWidget()==ui->page_panels){ ui->actionPanels->setChecked(false); } + if(ui->stackedWidget->currentWidget()==ui->page_menu){ ui->actionMenu->setChecked(false); } + if(ui->stackedWidget->currentWidget()==ui->page_shortcuts){ ui->actionShortcuts->setChecked(false); } + if(ui->stackedWidget->currentWidget()==ui->page_defaults){ ui->actionDefaults->setChecked(false); } + if(ui->stackedWidget->currentWidget()==ui->page_session){ ui->actionSession->setChecked(false); } + //switch to the new page + if(ui->actionDesktop->isChecked()){ ui->stackedWidget->setCurrentWidget(ui->page_desktop); showScreen=true;} + else if(ui->actionPanels->isChecked()){ ui->stackedWidget->setCurrentWidget(ui->page_panels); showScreen=true; } + else if(ui->actionMenu->isChecked()){ ui->stackedWidget->setCurrentWidget(ui->page_menu); } + else if(ui->actionShortcuts->isChecked()){ ui->stackedWidget->setCurrentWidget(ui->page_shortcuts); } + else if(ui->actionDefaults->isChecked()){ ui->stackedWidget->setCurrentWidget(ui->page_defaults); } + else if(ui->actionSession->isChecked()){ ui->stackedWidget->setCurrentWidget(ui->page_session); } + } + ui->group_screen->setVisible(showScreen && (ui->spin_screen->maximum()>1) ); + if(ui->page_panels->isVisible()){ checkpanels(); } + +} + +void MainUI::slotChangeScreen(){ + static int cscreen = 0; //current screen + int newscreen = currentDesktop(); + if(cscreen!=newscreen){ + if(moddesk || modpan){ + if(QMessageBox::Yes == QMessageBox::question(this, tr("Save Changes?"), tr("You currently have unsaved changes for this screen. Do you want to save them first?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) ){ + saveCurrentSettings(true); //only save current screen settings + } + } + loadCurrentSettings(true); + cscreen = newscreen; //save that this screen is current now + } +} + +void MainUI::saveAndQuit(){ + saveCurrentSettings(); + this->close(); +} + +//General Utility Functions +void MainUI::loadCurrentSettings(bool screenonly){ + loading = true; + settings->sync(); + appsettings->sync(); + int cdesk = currentDesktop(); + QString DPrefix = "desktop-"+QString::number(cdesk)+"/"; + bool primary = (desktop->screenGeometry(cdesk).x()==0); + + //Desktop Page + QStringList bgs = settings->value(DPrefix+"background/filelist", QStringList()<<"default").toStringList(); + ui->combo_desk_bg->clear(); + for(int i=0; i<bgs.length(); i++){ + if(bgs[i]=="default"){ ui->combo_desk_bg->addItem( QIcon(DEFAULTBG), tr("System Default"), bgs[i] ); } + else{ ui->combo_desk_bg->addItem( QIcon(bgs[i]), bgs[i].section("/",-1), bgs[i] ); } + } + ui->radio_desk_multi->setEnabled(bgs.length()>1); + if(bgs.length()>1){ ui->radio_desk_multi->setChecked(true);} + else{ ui->radio_desk_single->setChecked(true); } + ui->spin_desk_min->setValue( settings->value(DPrefix+"background/minutesToChange", 5).toInt() ); + desktimechanged(); //ensure the display gets updated (in case the radio selection did not change); + ui->label_desk_res->setText( tr("Screen Resolution:")+"\n"+QString::number(desktop->screenGeometry(cdesk).width())+"x"+QString::number(desktop->screenGeometry(cdesk).height()) ); + + //Panels Page + int panels = settings->value(DPrefix+"panels",-1).toInt(); + if(panels==-1 && primary){ panels=1; } + panelnumber = 0; + if(panels >= 1){ + //Load the panel 1 information + QString PPrefix = "panel"+QString::number(cdesk)+".0/"; + ui->toolBox_panel1->setVisible(true); + ui->spin_panel1_size->setValue( settings->value( PPrefix+"height",30).toInt() ); + QString loc = settings->value(PPrefix+"location","top").toString().toLower(); + if(loc=="top"){ ui->combo_panel1_loc->setCurrentIndex(0); } + else if(loc=="bottom"){ ui->combo_panel1_loc->setCurrentIndex(1); } + else if(loc=="left"){ ui->combo_panel1_loc->setCurrentIndex(2); } + else{ ui->combo_panel1_loc->setCurrentIndex(3); } //right + QStringList plugs = settings->value(PPrefix+"pluginlist", QStringList()).toStringList(); + if(plugs.isEmpty() && primary){ plugs << "userbutton" << "taskmanager" << "systemtray" << "clock" << "systemdashboard"; } + ui->list_panel1_plugins->clear(); + for(int i=0; i<plugs.length(); i++){ + QString pid = plugs[i].section("---",0,0); + LPI info = PINFO->panelPluginInfo(pid); + if(!info.ID.isEmpty()){ + QListWidgetItem *it = new QListWidgetItem( LXDG::findIcon(info.icon,""), info.name ); + it->setWhatsThis(plugs[i]); //make sure to preserve the entire plugin ID (is the unique version) + ui->list_panel1_plugins->addItem(it); + } + } + QString color = settings->value(PPrefix+"color","rgba(255,255,255,160)").toString(); + ui->label_panel1_sample->setWhatsThis(color); + ui->label_panel1_sample->setStyleSheet("background: "+color); + panelnumber++; + }else{ + //Panel 1 defaults + ui->toolBox_panel1->setVisible(false); //not initially visible + ui->spin_panel1_size->setValue(30); + ui->combo_panel1_loc->setCurrentIndex(0); //Top + ui->list_panel1_plugins->clear(); + ui->label_panel1_sample->setWhatsThis("rgba(255,255,255,160)"); + ui->label_panel1_sample->setStyleSheet("background: rgba(255,255,255,160)"); + } + if(panels >= 2){ + //Load the panel 2 information + ui->toolBox_panel2->setVisible(true); + QString PPrefix = "panel"+QString::number(cdesk)+".1/"; + ui->spin_panel2_size->setValue( settings->value( PPrefix+"height",30).toInt() ); + QString loc = settings->value(PPrefix+"location","top").toString().toLower(); + if(loc=="top"){ ui->combo_panel2_loc->setCurrentIndex(0); } + else if(loc=="bottom"){ ui->combo_panel2_loc->setCurrentIndex(1); } + else if(loc=="left"){ ui->combo_panel2_loc->setCurrentIndex(2); } + else{ ui->combo_panel2_loc->setCurrentIndex(3); } //right + QStringList plugs = settings->value(PPrefix+"pluginlist", QStringList()).toStringList(); + ui->list_panel2_plugins->clear(); + for(int i=0; i<plugs.length(); i++){ + QString pid = plugs[i].section("---",0,0); + LPI info = PINFO->panelPluginInfo(pid); + if(!info.ID.isEmpty()){ + QListWidgetItem *it = new QListWidgetItem( LXDG::findIcon(info.icon,""), info.name ); + it->setWhatsThis(plugs[i]); //make sure to preserve the entire plugin ID (is the unique version) + ui->list_panel2_plugins->addItem(it); + } + } + QString color = settings->value(PPrefix+"color","rgba(255,255,255,160)").toString(); + ui->label_panel2_sample->setWhatsThis(color); + ui->label_panel2_sample->setStyleSheet("background: "+color); + panelnumber++; + }else{ + //Panel 2 defaults + ui->toolBox_panel2->setVisible(false); //not initially visible + ui->spin_panel2_size->setValue(30); + ui->combo_panel2_loc->setCurrentIndex(1); //Bottom + ui->list_panel2_plugins->clear(); + ui->label_panel2_sample->setWhatsThis("rgba(255,255,255,160)"); + ui->label_panel2_sample->setStyleSheet("background: rgba(255,255,255,160)"); + } + checkpanels(); //make sure buttons are updated + + + if(!screenonly){ + // Menu Page + //Default terminal binary + ui->line_menu_term->setText( settings->value("default-terminal","xterm").toString() ); + //Menu Items + QStringList items = settings->value("menu/itemlist", QStringList() ).toStringList(); + if(items.isEmpty()){ items << "terminal" << "filemanager" << "applications" << "line" << "settings"; } + //qDebug() << "Menu Items:" << items; + ui->list_menu->clear(); + for(int i=0; i<items.length(); i++){ + LPI info = PINFO->menuPluginInfo(items[i]); + if(items[i].startsWith("app::::")){ + bool ok = false; + XDGDesktop desk = LXDG::loadDesktopFile(items[i].section("::::",1,1), ok); + if(!ok){ continue; } //invalid application file (no longer installed?) + QListWidgetItem *item = new QListWidgetItem(); + item->setWhatsThis( items[i] ); + item->setIcon( LXDG::findIcon(desk.icon) ); + item->setText( desk.name ); + item->setToolTip( desk.comment ); + ui->list_menu->addItem(item); + continue; //now go to the next item + } + if(info.ID.isEmpty()){ continue; } //invalid plugin + //qDebug() << "Add Menu Item:" << info.ID; + QListWidgetItem *item = new QListWidgetItem(); + item->setWhatsThis( info.ID ); + item->setIcon( LXDG::findIcon(info.icon,"") ); + item->setText( info.name ); + item->setToolTip( info.description ); + ui->list_menu->addItem(item); + } + checkmenuicons(); //update buttons + } + //Shortcuts Page + if(!screenonly){ loadKeyboardShortcuts(); } + + //Defaults Page + if(!screenonly){ loadDefaultSettings(); } + + //Session Page + if(!screenonly){ loadSessionSettings(); } + + //Now disable the save button since nothing has changed yet + loading = false; + moddesk = modpan =false; + if(!screenonly){ modmenu = modshort = moddef = modses = false; }//all setup back to original + ui->push_save->setEnabled(modmenu || modshort || moddef || modses); +} + +void MainUI::saveCurrentSettings(bool screenonly){ + QString DPrefix = "desktop-"+QString::number(currentDesktop())+"/"; + + // Desktop Page + if(moddesk){ + QStringList bgs; //get the list of backgrounds to use + if(ui->radio_desk_multi->isChecked()){ + for(int i=0; i<ui->combo_desk_bg->count(); i++){ + bgs << ui->combo_desk_bg->itemData(i).toString(); + } + }else if(ui->combo_desk_bg->count() > 0){ + bgs << ui->combo_desk_bg->itemData( ui->combo_desk_bg->currentIndex() ).toString(); + bgs.removeAll("default"); + } + settings->setValue(DPrefix+"background/filelist", bgs); + settings->setValue(DPrefix+"background/minutesToChange", ui->spin_desk_min->value()); + } + + // Panels Page + if(modpan){ + settings->setValue(DPrefix+"panels", panelnumber); + if(panelnumber>=1){ + QString PPrefix = "panel"+QString::number(currentDesktop())+".0/"; + settings->setValue(PPrefix+"color", ui->label_panel1_sample->whatsThis()); + settings->setValue(PPrefix+"height", ui->spin_panel1_size->value()); + int loc = ui->combo_panel1_loc->currentIndex(); + if(loc==0){ settings->setValue(PPrefix+"location", "top"); } + else if(loc==1){ settings->setValue(PPrefix+"location", "bottom"); } + else if(loc==2){ settings->setValue(PPrefix+"location", "left"); } + else{ settings->setValue(PPrefix+"location", "right"); } + QStringList plugs; + for(int i=0; i<ui->list_panel1_plugins->count(); i++){ + plugs << ui->list_panel1_plugins->item(i)->whatsThis(); + } + settings->setValue(PPrefix+"pluginlist",plugs); + + }else{ + //Clear that panel's saved settings + QStringList keys = settings->allKeys().filter("panel"+QString::number(currentDesktop())+".0/"); + for(int i=0; i<keys.length(); i++){ settings->remove(keys[i]); } + } + if(panelnumber>=2){ + QString PPrefix = "panel"+QString::number(currentDesktop())+".1/"; + settings->setValue(PPrefix+"color", ui->label_panel2_sample->whatsThis()); + settings->setValue(PPrefix+"height", ui->spin_panel2_size->value()); + int loc = ui->combo_panel2_loc->currentIndex(); + if(loc==0){ settings->setValue(PPrefix+"location", "top"); } + else if(loc==1){ settings->setValue(PPrefix+"location", "bottom"); } + else if(loc==2){ settings->setValue(PPrefix+"location", "left"); } + else{ settings->setValue(PPrefix+"location", "right"); } + QStringList plugs; + for(int i=0; i<ui->list_panel2_plugins->count(); i++){ + plugs << ui->list_panel2_plugins->item(i)->whatsThis(); + } + settings->setValue(PPrefix+"pluginlist",plugs); + }else{ + //Clear that panel's saved settings + QStringList keys = settings->allKeys().filter("panel"+QString::number(currentDesktop())+".1/"); + for(int i=0; i<keys.length(); i++){ settings->remove(keys[i]); } + } + } + + // Menu Page + if(modmenu && !screenonly){ + settings->setValue("default-terminal", ui->line_menu_term->text() ); + QStringList items; + for(int i=0; i<ui->list_menu->count(); i++){ + items << ui->list_menu->item(i)->whatsThis(); + } + settings->setValue("menu/itemlist", items); + } + + //Shortcuts page + if(modshort && !screenonly){ + saveKeyboardShortcuts(); + } + + //Defaults page + if(moddef && !screenonly){ + saveDefaultSettings(); + } + + //Session Page + if(modses && !screenonly){ + saveSessionSettings(); + } + + //All done - make sure the changes get saved to file right now + settings->sync(); + appsettings->sync(); + moddesk = modpan = false; + if(!screenonly){ modmenu = modshort = moddef = modses = false; } + ui->push_save->setEnabled(modmenu || modshort || moddef || modses); //wait for new changes +} + + +//=============== +// DESKTOP PAGE +//=============== +void MainUI::deskplugchanged(){ + //NOTE: This is not a major change and will not enable the save button + if(ui->combo_desk_plugs->count()==0){ + //No plugins available + ui->label_desk_pluginfo->setText(""); + return; + } + //Load the new plugin summary + QString plug = ui->combo_desk_plugs->itemData( ui->combo_desk_plugs->currentIndex() ).toString(); + LPI info = PINFO->desktopPluginInfo(plug); + ui->label_desk_pluginfo->setText( info.description ); +} + +void MainUI::deskbgchanged(){ + //Load the new image preview + if(ui->combo_desk_bg->count()==0){ + ui->label_desk_bgview->setPixmap(QPixmap()); + ui->label_desk_bgview->setText(tr("No Background")+"\n"+tr("(use system default)")); + }else{ + QString path = ui->combo_desk_bg->itemData( ui->combo_desk_bg->currentIndex() ).toString(); + if(path=="default"){ path = DEFAULTBG; } + if(QFile::exists(path)){ + QSize sz = ui->label_desk_bgview->size(); + sz.setWidth( sz.width() - (2*ui->label_desk_bgview->frameWidth()) ); + sz.setHeight( sz.height() - (2*ui->label_desk_bgview->frameWidth()) ); + ui->label_desk_bgview->setPixmap( QPixmap(path).scaled(sz, Qt::KeepAspectRatio, Qt::SmoothTransformation) ); + }else{ + ui->label_desk_bgview->setPixmap(QPixmap()); + ui->label_desk_bgview->setText(tr("File does not exist")); + } + } + //See if this constitues a change to the current settings and enable the save button + if(!loading && ui->radio_desk_single->isChecked()){ ui->push_save->setEnabled(true); moddesk=true;} + //Disable the background rotation option if only one background selected + if(ui->combo_desk_bg->count()<2){ + ui->radio_desk_single->setChecked(true); + ui->radio_desk_multi->setEnabled(false); + ui->spin_desk_min->setEnabled(false); + }else{ + ui->radio_desk_multi->setEnabled(true); + ui->spin_desk_min->setEnabled(ui->radio_desk_multi->isChecked()); + } + + //Disable the bg remove button if no backgrounds loaded + ui->tool_desk_rmbg->setEnabled(ui->combo_desk_bg->count()>0); +} + +void MainUI::desktimechanged(){ + ui->spin_desk_min->setEnabled(ui->radio_desk_multi->isChecked()); + if(!loading){ ui->push_save->setEnabled(true); moddesk = true; } +} + +void MainUI::deskbgremoved(){ + if(ui->combo_desk_bg->count()<1){ return; } //nothing to remove + ui->combo_desk_bg->removeItem( ui->combo_desk_bg->currentIndex() ); + ui->push_save->setEnabled(true); + moddesk = true; +} + +void MainUI::deskbgadded(){ + //Prompt the user to find an image file to use for a background + QString dir = "/usr/local/share/wallpapers/Lumina-DE"; + if( !QFile::exists(dir) ){ dir = QDir::homePath(); } + QStringList bgs = QFileDialog::getOpenFileNames(this, tr("Find Background Image(s)"), dir, "Images (*.png *.xpm *.jpg)"); + if(bgs.isEmpty()){ return; } + for(int i=0; i<bgs.length(); i++){ + ui->combo_desk_bg->addItem( QIcon(bgs[i]), bgs[i].section("/",-1), bgs[i]); + } + //Now move to the last item in the list (the new image(s)); + ui->combo_desk_bg->setCurrentIndex( ui->combo_desk_bg->count()-1 ); + ui->push_save->setEnabled(true); //this is definitely a change + moddesk = true; +} + +void MainUI::deskplugadded(){ + settings->sync(); //make sure we have the newly-modified list from the desktop (unique IDs for new plugins) + QString DPrefix = "desktop-"+QString::number(currentDesktop())+"/"; + QStringList plugins = settings->value(DPrefix+"pluginlist").toStringList(); + //qDebug() << "Current Plugins:" << plugins; + plugins << ui->combo_desk_plugs->itemData( ui->combo_desk_plugs->currentIndex() ).toString(); + //qDebug() << "New Plugins:" << plugins; + settings->setValue(DPrefix+"pluginlist", plugins); + settings->sync(); +} + + +//============= +// PANELS PAGE +//============= +void MainUI::addpanel1(){ + ui->toolBox_panel1->setVisible(true); + checkpanels(); + ui->push_save->setEnabled(true); + modpan = true; + panelnumber = 1; +} + +void MainUI::addpanel2(){ + ui->toolBox_panel2->setVisible(true); + checkpanels(); + ui->push_save->setEnabled(true); + modpan = true; + panelnumber = 2; +} + +void MainUI::rmpanel1(){ + ui->toolBox_panel1->setVisible(false); + checkpanels(); + ui->push_save->setEnabled(true); + modpan = true; + panelnumber = 0; +} + +void MainUI::rmpanel2(){ + ui->toolBox_panel2->setVisible(false); + checkpanels(); + ui->push_save->setEnabled(true); + modpan = true; + panelnumber = 1; +} + +void MainUI::checkpanels(){ + //This checks the primary panel buttons/visibility + ui->tool_panel1_add->setVisible(!ui->toolBox_panel1->isVisible()); + ui->tool_panel1_rm->setVisible(ui->toolBox_panel1->isVisible()); + if(ui->tool_panel1_add->isVisible()){ + //No panels at all yet - disable the 2nd panel options + ui->tool_panel2_add->setVisible(false); + ui->tool_panel2_rm->setVisible(false); + ui->toolBox_panel2->setVisible(false); + ui->label_panel2->setVisible(false); + ui->gridLayout_panels->setColumnStretch(2,1); + panelnumber = 0; //no panels at the moment + }else{ + //Panel 1 is visible - also show options for panel 2 appropriately + ui->tool_panel2_add->setVisible(!ui->toolBox_panel2->isVisible()); + ui->tool_panel2_rm->setVisible(ui->toolBox_panel2->isVisible()); + ui->label_panel2->setVisible(true); + ui->tool_panel1_rm->setVisible(!ui->toolBox_panel2->isVisible()); + ui->gridLayout_panels->setColumnStretch(2,0); + if(ui->tool_panel2_add->isVisible()){ panelnumber = 1; } + else{panelnumber = 2; } + } + +} + +void MainUI::adjustpanel1(){ + //Adjust panel 1 to complement a panel 2 change + if(loading){ return; } + qDebug() << "Adjust Panel 1:"; + ui->toolBox_panel1->setCurrentIndex( ui->toolBox_panel2->currentIndex() ); + switch(ui->combo_panel2_loc->currentIndex()){ + case 0: + ui->combo_panel1_loc->setCurrentIndex(1); break; + case 1: + ui->combo_panel1_loc->setCurrentIndex(0); break; + case 2: + ui->combo_panel1_loc->setCurrentIndex(3); break; + case 3: + ui->combo_panel1_loc->setCurrentIndex(2); break; + } + if(!loading){ ui->push_save->setEnabled(true); modpan = true; } +} + +void MainUI::adjustpanel2(){ + if(loading){ return; } + //Adjust panel 2 to complement a panel 1 change + qDebug() << "Adjust Panel 2:"; + ui->toolBox_panel2->setCurrentIndex( ui->toolBox_panel1->currentIndex() ); + switch(ui->combo_panel1_loc->currentIndex()){ + case 0: + ui->combo_panel2_loc->setCurrentIndex(1); break; + case 1: + ui->combo_panel2_loc->setCurrentIndex(0); break; + case 2: + ui->combo_panel2_loc->setCurrentIndex(3); break; + case 3: + ui->combo_panel2_loc->setCurrentIndex(2); break; + } + if(!loading){ ui->push_save->setEnabled(true); modpan = true; } +} + + +void MainUI::getpanel1color(){ + QString color = getColorStyle(ui->label_panel1_sample->whatsThis()); + if(color.isEmpty()){ return; } //nothing selected + ui->label_panel1_sample->setStyleSheet("background: "+color); + ui->label_panel1_sample->setWhatsThis(color); + ui->push_save->setEnabled(true); + modpan = true; +} + +void MainUI::getpanel2color(){ + QString color = getColorStyle(ui->label_panel2_sample->whatsThis()); + if(color.isEmpty()){ return; } //nothing selected + ui->label_panel2_sample->setStyleSheet("background: "+color); + ui->label_panel2_sample->setWhatsThis(color); + ui->push_save->setEnabled(true); + modpan = true; +} + +void MainUI::addpanel1plugin(){ + QString pan = getNewPanelPlugin(); + if(pan.isEmpty()){ return; } //nothing selected + //Add the new plugin to the list + LPI info = PINFO->panelPluginInfo(pan); + QListWidgetItem *it = new QListWidgetItem( LXDG::findIcon(info.icon,""), info.name); + it->setWhatsThis(info.ID); + ui->list_panel1_plugins->addItem(it); + ui->list_panel1_plugins->setCurrentItem(it); + ui->list_panel1_plugins->scrollToItem(it); + checkpanels(); //update buttons + if(!loading){ ui->push_save->setEnabled(true); modpan = true; } +} + +void MainUI::addpanel2plugin(){ + QString pan = getNewPanelPlugin(); + if(pan.isEmpty()){ return; } //nothing selected + //Add the new plugin to the list + LPI info = PINFO->panelPluginInfo(pan); + QListWidgetItem *it = new QListWidgetItem( LXDG::findIcon(info.icon,""), info.name); + it->setWhatsThis(info.ID); + ui->list_panel2_plugins->addItem(it); + ui->list_panel2_plugins->setCurrentItem(it); + ui->list_panel2_plugins->scrollToItem(it); + checkpanels(); //update buttons + if(!loading){ ui->push_save->setEnabled(true); modpan = true; } +} + +void MainUI::rmpanel1plugin(){ + if(ui->list_panel1_plugins->currentRow() < 0){ return; } + delete ui->list_panel1_plugins->takeItem( ui->list_panel1_plugins->currentRow() ); + if(!loading){ ui->push_save->setEnabled(true); modpan = true; } +} + +void MainUI::rmpanel2plugin(){ + if(ui->list_panel2_plugins->currentRow() < 0){ return; } + delete ui->list_panel2_plugins->takeItem( ui->list_panel2_plugins->currentRow() ); + if(!loading){ ui->push_save->setEnabled(true); modpan = true; } +} + +void MainUI::uppanel1plugin(){ + int row = ui->list_panel1_plugins->currentRow(); + if( row <= 0){ return; } + ui->list_panel1_plugins->insertItem(row-1, ui->list_panel1_plugins->takeItem(row)); + ui->list_panel1_plugins->setCurrentRow(row-1); + if(!loading){ ui->push_save->setEnabled(true); modpan = true; } +} + +void MainUI::uppanel2plugin(){ + int row = ui->list_panel2_plugins->currentRow(); + if( row <= 0){ return; } + ui->list_panel2_plugins->insertItem(row-1, ui->list_panel2_plugins->takeItem(row)); + ui->list_panel2_plugins->setCurrentRow(row-1); + if(!loading){ ui->push_save->setEnabled(true); modpan = true; } +} + +void MainUI::dnpanel1plugin(){ + int row = ui->list_panel1_plugins->currentRow(); + if( row < 0 || row >= (ui->list_panel1_plugins->count()-1) ){ return; } + ui->list_panel1_plugins->insertItem(row+1, ui->list_panel1_plugins->takeItem(row)); + ui->list_panel1_plugins->setCurrentRow(row+1); + if(!loading){ ui->push_save->setEnabled(true); modpan = true; } +} + +void MainUI::dnpanel2plugin(){ + int row = ui->list_panel2_plugins->currentRow(); + if( row < 0 || row >= (ui->list_panel2_plugins->count()-1) ){ return; } + ui->list_panel2_plugins->insertItem(row+1, ui->list_panel2_plugins->takeItem(row)); + ui->list_panel2_plugins->setCurrentRow(row+1); + if(!loading){ ui->push_save->setEnabled(true); modpan = true; } +} + + +//============ +// MENU PAGE +//============ +void MainUI::addmenuplugin(){ + QStringList names; + QStringList plugs = PINFO->menuPlugins(); + for(int i=0; i<plugs.length(); i++){ names << PINFO->menuPluginInfo(plugs[i]).name; } + bool ok = false; + QString sel = QInputDialog::getItem(this,tr("New Menu Plugin"),tr("Plugin:"), names,0,false,&ok); + if(sel.isEmpty() || names.indexOf(sel) < 0 || !ok){ return; } + //Now add the item to the list + LPI info = PINFO->menuPluginInfo( plugs[ names.indexOf(sel) ] ); + QListWidgetItem *it; + if(info.ID=="app"){ + //Need to prompt for the exact application to add to the menu + // Note: whatsThis() format: "app::::< *.desktop file path >" + XDGDesktop desk = getSysApp(); + if(desk.filePath.isEmpty()){ return; }//nothing selected + //Create the item for the list + it = new QListWidgetItem(LXDG::findIcon(desk.icon,""), desk.name ); + it->setWhatsThis(info.ID+"::::"+desk.filePath); + it->setToolTip( desk.comment ); + }else{ + it = new QListWidgetItem( LXDG::findIcon(info.icon,""), info.name ); + it->setWhatsThis(info.ID); + it->setToolTip( info.description ); + } + ui->list_menu->addItem(it); + ui->list_menu->setCurrentRow(ui->list_menu->count()-1); //make sure it is auto-selected + ui->push_save->setEnabled(true); + modmenu = true; +} + +void MainUI::rmmenuplugin(){ + if(ui->list_menu->currentRow() < 0){ return; } //no selection + delete ui->list_menu->takeItem( ui->list_menu->currentRow() ); + ui->push_save->setEnabled(true); + modmenu = true; +} + +void MainUI::upmenuplugin(){ + int row = ui->list_menu->currentRow(); + if(row <= 0){ return; } + ui->list_menu->insertItem(row-1, ui->list_menu->takeItem(row)); + ui->list_menu->setCurrentRow(row-1); + ui->push_save->setEnabled(true); + checkmenuicons(); + modmenu = true; +} + +void MainUI::downmenuplugin(){ + int row = ui->list_menu->currentRow(); + if(row < 0 || row >= (ui->list_menu->count()-1) ){ return; } + ui->list_menu->insertItem(row+1, ui->list_menu->takeItem(row)); + ui->list_menu->setCurrentRow(row+1); + ui->push_save->setEnabled(true); + checkmenuicons(); + modmenu = true; +} + +void MainUI::findmenuterminal(){ + QString chkpath = "/usr/local/bin"; + if(!QFile::exists(chkpath)){ chkpath = QDir::homePath(); } + QString bin = QFileDialog::getOpenFileName(this, tr("Set Default Terminal Application"), chkpath, tr("Application Binaries (*)") ); + if( bin.isEmpty() || !QFile::exists(bin) ){ return; } //cancelled + if( !QFileInfo(bin).isExecutable() ){ + QMessageBox::warning(this, tr("Invalid Binary"), tr("The selected file is not executable!")); + return; + } + ui->line_menu_term->setText(bin); + ui->push_save->setEnabled(true); + modmenu = true; +} + +void MainUI::checkmenuicons(){ + ui->tool_menu_up->setEnabled( ui->list_menu->currentRow() > 0 ); + ui->tool_menu_dn->setEnabled( ui->list_menu->currentRow() < (ui->list_menu->count()-1) ); + ui->tool_menu_rm->setEnabled( ui->list_menu->currentRow() >=0 ); + if(settings->value("default-terminal","").toString()!=ui->line_menu_term->text()){ + ui->push_save->setEnabled(true); + modmenu = true; + } +} + +//=========== +// Shortcuts Page +//=========== +void MainUI::loadKeyboardShortcuts(){ + ui->tree_shortcut->clear(); + QStringList info = readFile(QDir::homePath()+"/.lumina/fluxbox-keys"); + //First take care of the special Lumina options + QStringList special; + special << "Exec lumina-open -volumeup::::"+tr("Audio Volume Up") \ + << "Exec lumina-open -volumedown::::"+tr("Audio Volume Down") \ + << "Exec lumina-open -brightnessup::::"+tr("Screen Brightness Up") \ + << "Exec lumina-open -brightnessdown::::"+tr("Screen Brightness Down") \ + << "Exec lumina-screenshot::::"+tr("Take Screenshot"); + for(int i=0; i<special.length(); i++){ + QString spec = info.filter(":"+special[i].section("::::",0,0)).join("").simplified(); + QTreeWidgetItem *it = new QTreeWidgetItem(); + it->setText(0, special[i].section("::::",1,1)); + it->setWhatsThis(0, special[i].section("::::",0,0)); + if(!spec.isEmpty()){ + info.removeAll(spec); //this line has been dealt with - remove it + it->setText(1, fluxToDispKeys(spec.section(":",0,0)) ); //need to make this easier to read later + it->setWhatsThis(1, spec.section(":",0,0) ); + } + ui->tree_shortcut->addTopLevelItem(it); + } + //Now add support for all the other fluxbox shortcuts + for(int i=0; i<info.length(); i++){ + //skip empty/invalid lines, as well as non-global shortcuts (OnMenu, OnWindow, etc..) + if(info[i].isEmpty() || info[i].startsWith("#") || info[i].startsWith("!") || info[i].startsWith("On")){ continue; } + QTreeWidgetItem *it = new QTreeWidgetItem(); + it->setText(0, info[i].section(":",1,10).replace("Exec ","Run ").section("{",0,0).simplified()); + it->setWhatsThis(0, info[i].section(":",1,10)); + it->setText(1, fluxToDispKeys(info[i].section(":",0,0)) ); //need to make this easier to read later + it->setWhatsThis(1, info[i].section(":",0,0) ); + ui->tree_shortcut->addTopLevelItem(it); + } +} + +void MainUI::saveKeyboardShortcuts(){ + //First get all the current listings + QStringList current; + for(int i=0; i<ui->tree_shortcut->topLevelItemCount(); i++){ + QTreeWidgetItem *it = ui->tree_shortcut->topLevelItem(i); + current << it->whatsThis(1)+" :"+it->whatsThis(0); //Full Fluxbox command line + } + + QStringList info = readFile(QDir::homePath()+"/.lumina/fluxbox-keys"); + for(int i=0; i<info.length(); i++){ + if(info[i].isEmpty() || info[i].startsWith("#") || info[i].startsWith("!")){ continue; } + if(current.filter(info[i].section(":",1,10)).length() > 0){ + //Found Item to be replaced/removed + QString it = current.filter(info[i].section(":",1,10)).join("\n").section("\n",0,0); //ensure only the first match + if(it.section(" :",0,0).isEmpty()){ info.removeAt(i); i--; } //remove this entry + else{ info[i] = it; } //replace this entry + current.removeAll(it); //already taken care of - remove it from the current list + } + } + //Now save the new contents + for(int i=0; i<current.length(); i++){ + if(!current[i].section(" :",0,0).isEmpty()){ info << current[i]; } + } + bool ok = overwriteFile(QDir::homePath()+"/.lumina/fluxbox-keys", info); + if(!ok){ qDebug() << "Warning: Could not save ~/.lumina/fluxbox-keys"; } +} + +void MainUI::clearKeyBinding(){ + if(ui->tree_shortcut->currentItem()==0){ return; } + ui->tree_shortcut->currentItem()->setText(1,""); + ui->tree_shortcut->currentItem()->setWhatsThis(1,""); + ui->push_save->setEnabled(true); + modshort=true; +} + +void MainUI::getKeyPress(){ + if(ui->tree_shortcut->currentItem()==0){ return; } //nothing selected + KeyCatch dlg(this); + dlg.exec(); + if(dlg.cancelled){ return; } + qDebug() << "Key Press:" << dlg.xkeys << dlg.qkeys; + QTreeWidgetItem *it = ui->tree_shortcut->currentItem(); + //if(dlg.qkeys.endsWith("+")){ dlg.qkeys.replace("+"," "); dlg.qkeys = dlg.qkeys.append("+").simplified(); } + //else{ dlg.qkeys.replace("+"," "); } + it->setText(1,dlg.qkeys); + it->setWhatsThis(1,dispToFluxKeys(dlg.xkeys)); + ui->push_save->setEnabled(true); + modshort=true; +} + +//=========== +// Defaults Page +//=========== +void MainUI::loadDefaultSettings(){ + ui->tree_defaults->clear(); + QStringList keys = appsettings->allKeys(); + QStringList groups = keys.filter("Groups/"); + if(groups.isEmpty()){ + //setup default groups + appsettings->setValue("Groups/Web", QStringList() << "http" << "https" << "ftp"); + appsettings->setValue("Groups/Email", QStringList() << "eml" << "msg"); + appsettings->setValue("Groups/Development-C",QStringList() << "c" << "cpp" << "h" << "hpp"); + appsettings->setValue("Groups/Development-Ruby",QStringList() << "rb" << "rbw"); + appsettings->setValue("Groups/Development-Python",QStringList() << "py" << "pyw"); + appsettings->setValue("Groups/Development-Fortran",QStringList() <<"f"<<"for"<<"f90"<<"f95"<<"f03"<<"f15"); + appsettings->setValue("Groups/Images",QStringList() <<"jpg"<<"png"<<"tif"<<"gif"<<"bmp"<<"raw"<<"svg"<<"jpeg"); + //Add more default groups later + + appsettings->sync(); + groups = appsettings->allKeys().filter("Groups/"); + } + groups << "Uncategorized"; + QStringList defaults = keys.filter("default/"); + for(int g=0; g<groups.length(); g++){ + //Create the group entry + QTreeWidgetItem *group = new QTreeWidgetItem( QStringList() << groups[g].section("/",-1) << "" ); + ui->tree_defaults->addTopLevelItem(group); + //Now populate the group + if(g == groups.length()-1){ + //uncategorized - everything leftover + for(int i=0; i<defaults.length(); i++){ + QString path = appsettings->value(defaults[i],"").toString(); + if(path.isEmpty()){ continue; } //ignore empty/uncategoried defaults + bool ok = false; + XDGDesktop file = LXDG::loadDesktopFile(path, ok); + QTreeWidgetItem *it = new QTreeWidgetItem(QStringList() << defaults[i].section("/",-1) << ""); + it->setWhatsThis(1,path); + if(!ok || file.filePath.isEmpty()){ + //Might be a binary - just print out the raw "path" + it->setText(1,path); + }else{ + it->setText(1, file.name); + it->setIcon(1, LXDG::findIcon(file.icon,"") ); + } + group->addChild(it); + } + }else{ + QStringList ch = appsettings->value(groups[g],QStringList()).toStringList(); + for(int i=0; i<ch.length(); i++){ + int index = defaults.indexOf("default/"+ch[i]); + if(index>=0){ defaults.removeAt(index); } //remove this item from the list + QString path = appsettings->value("default/"+ch[i],"").toString(); + QTreeWidgetItem *it = new QTreeWidgetItem(QStringList() << ch[i] << ""); + if( !path.isEmpty() ){ + //has something saved + bool ok = false; + XDGDesktop file = LXDG::loadDesktopFile(path, ok); + it->setWhatsThis(1,path); + if(!ok || file.filePath.isEmpty()){ + //Might be a binary - just print out the raw "path" + it->setText(1,path); + }else{ + it->setText(1, file.name); + it->setIcon(1, LXDG::findIcon(file.icon,"") ); + } + } + group->addChild(it); + } + } + } + checkdefaulticons(); +} + +void MainUI::saveDefaultSettings(){ + for(int i=0; i<ui->tree_defaults->topLevelItemCount(); i++){ + //Groups + QTreeWidgetItem *group = ui->tree_defaults->topLevelItem(i); + QStringList items; + for(int c=0; c<group->childCount(); c++){ + //Save this individual default value (and remember it later) + QTreeWidgetItem *it = group->child(c); + items << it->text(0); + if( !it->whatsThis(1).isEmpty()){ + appsettings->setValue("default/"+it->text(0), it->whatsThis(1)); + } + } + //Do not save the uncategorized group header (internal only) + if(group->text(0).toLower()!="uncategorized" && !items.isEmpty()){ + appsettings->setValue("Groups/"+group->text(0), items); + } + } +} + +void MainUI::adddefaultgroup(){ + //Prompt for the group name + bool ok = false; + QString name = QInputDialog::getText(this, tr("New Application Group"), tr("Name:"), QLineEdit::Normal, "", &ok); + if(name.isEmpty() || !ok){ return; } //cancelled + //Make sure that name is not already taken + + //Add it as a new top-level item + ui->tree_defaults->addTopLevelItem( new QTreeWidgetItem( QStringList() << name << "" ) ); + ui->push_save->setEnabled(true); + moddef = true; +} + +void MainUI::adddefaultextension(){ + //Verify which group is selected + QTreeWidgetItem *it = ui->tree_defaults->currentItem(); + if(it==0){ return; } //no selection + if(it->parent()!=0){ it = it->parent(); } //make sure to get the group item + //Prompt for the extension name + bool ok = false; + QString name = QInputDialog::getText(this, tr("New File Extension"), tr("Extension:"), QLineEdit::Normal, "", &ok); + if(name.isEmpty() || !ok){ return; } //cancelled + //Make sure that name is not already taken + + //Add it as a new child of this group item + it->addChild( new QTreeWidgetItem( QStringList() << name << "" ) ); + ui->push_save->setEnabled(true); + moddef = true; +} + +void MainUI::cleardefaultitem(){ + QTreeWidgetItem *it = ui->tree_defaults->currentItem(); + if(it==0){ return; } //no item selected + QList<QTreeWidgetItem*> list; + for(int i=0; i<it->childCount(); i++){ + list << it->child(i); + } + if(list.isEmpty()){ list << it; } //just do the current item + //Now clear the items + for(int i=0; i<list.length(); i++){ + list[i]->setWhatsThis(1,""); //clear the app path + list[i]->setIcon(1,QIcon()); //clear the icon + list[i]->setText(1,""); //clear the name + } + ui->push_save->setEnabled(true); + moddef = true; +} + +void MainUI::setdefaultitem(){ + QTreeWidgetItem *it = ui->tree_defaults->currentItem(); + if(it==0){ return; } //no item selected + QList<QTreeWidgetItem*> list; + for(int i=0; i<it->childCount(); i++){ + list << it->child(i); + } + if(list.isEmpty()){ list << it; } //just do the current item + //Prompt for which application to use + XDGDesktop desk = getSysApp(); + if(desk.filePath.isEmpty()){ return; }//nothing selected + //Now set the items + for(int i=0; i<list.length(); i++){ + list[i]->setWhatsThis(1,desk.filePath); //app path + list[i]->setIcon(1,LXDG::findIcon(desk.icon,"")); //clear the icon + list[i]->setText(1,desk.name); //clear the name + } + ui->push_save->setEnabled(true); + moddef = true; +} + +void MainUI::checkdefaulticons(){ + QTreeWidgetItem *it = ui->tree_defaults->currentItem(); + ui->tool_defaults_set->setEnabled(it!=0); + ui->tool_defaults_clear->setEnabled(it!=0); + ui->tool_defaults_addextension->setEnabled( it!=0); + if(it!=0){ + if(it->text(0)=="Uncategorized"){ + ui->tool_defaults_set->setEnabled(false); + ui->tool_defaults_clear->setEnabled(false); + } + } +} + +//=========== +// Session Page +//=========== +void MainUI::loadSessionSettings(){ + QStringList FB = readFile(QDir::homePath()+"/.lumina/fluxbox-init"); + QString val; + //Do the window placement + val = FB.filter("session.screen0.windowPlacement:").join("").section(":",1,1).simplified(); + //qDebug() << "Window Placement:" << val; + int index = ui->combo_session_wloc->findData(val); + if(index<0){ index = 0;} //use the default + ui->combo_session_wloc->setCurrentIndex(index); + + //Do the window focus + val = FB.filter("session.screen0.focusModel:").join("").section(":",1,1).simplified(); + //qDebug() << "Window Focus:" << val; + index = ui->combo_session_wfocus->findData(val); + if(index<0){ index = 0;} //use the default + ui->combo_session_wfocus->setCurrentIndex(index); + + //Do the window theme + val = FB.filter("session.styleFile:").join("").section(":",1,1).simplified(); + //qDebug() << "Window Theme:" << val; + index = ui->combo_session_wtheme->findData(val); + if(index<0){ index = 0;} //use the default + ui->combo_session_wtheme->setCurrentIndex(index); + + //Now the number of workspaces + val = FB.filter("session.screen0.workspaces:").join("").section(":",1,1).simplified(); + //qDebug() << "Number of Workspaces:" << val; + if(!val.isEmpty()){ ui->spin_session_wkspaces->setValue(val.toInt()); } + + //Now do the startup applications + QStringList STARTUP = readFile(QDir::homePath()+"/.lumina/startapps"); + ui->list_session_start->clear(); + for(int i=0; i<STARTUP.length(); i++){ + if(STARTUP[i].startsWith("#")){ continue; } + else if(STARTUP[i].startsWith("lumina-open ")){ + //Application or file + QString file = STARTUP[i].section("lumina-open ",0,0,QString::SectionSkipEmpty).simplified(); + bool ok = false; + XDGDesktop desk = LXDG::loadDesktopFile(file, ok); + if(!desk.filePath.isEmpty() && ok && desk.filePath.endsWith(".desktop") ){ + //Application + QListWidgetItem *it = new QListWidgetItem( LXDG::findIcon(desk.icon,""), desk.name); + it->setWhatsThis(STARTUP[i]); //keep the raw line + ui->list_session_start->addItem(it); + }else{ + //Some other file + QListWidgetItem *it = new QListWidgetItem( LXDG::findIcon("unknown",""), file.section("/",-1)); + it->setWhatsThis(STARTUP[i]); //keep the raw line + ui->list_session_start->addItem(it); + } + }else{ + //Some other utility (binary?) + QListWidgetItem *it = new QListWidgetItem( LXDG::findIcon("application-x-executable",""), STARTUP[i].section(" ",0,0) ); + it->setWhatsThis(STARTUP[i]); //keep the raw line + ui->list_session_start->addItem(it); + } + } + + //Now do the general session options + ui->check_session_numlock->setChecked( sessionsettings->value("EnableNumlock", true).toBool() ); + ui->check_session_playloginaudio->setChecked( sessionsettings->value("PlayStartupAudio",true).toBool() ); + ui->check_session_playlogoutaudio->setChecked( sessionsettings->value("PlayLogoutAudio",true).toBool() ); + + sessionstartchanged(); //make sure to update buttons +} + +void MainUI::saveSessionSettings(){ + //Do the fluxbox settings first + QStringList FB = readFile(QDir::homePath()+"/.lumina/fluxbox-init"); + // - window placement + int index = FB.indexOf( FB.filter("session.screen0.windowPlacement:").join("") ); + QString line = "session.screen0.windowPlacement:\t"+ui->combo_session_wloc->itemData( ui->combo_session_wloc->currentIndex() ).toString(); + if(index < 0){ FB << line; } //add line to the end of the file + else{ FB[index] = line; } //replace the current setting with the new one + // - window focus + index = FB.indexOf( FB.filter("session.screen0.focusModel:").join("") ); + line = "session.screen0.focusModel:\t"+ui->combo_session_wfocus->itemData( ui->combo_session_wfocus->currentIndex() ).toString(); + if(index < 0){ FB << line; } //add line to the end of the file + else{ FB[index] = line; } //replace the current setting with the new one + // - window theme + index = FB.indexOf( FB.filter("session.styleFile:").join("") ); + line = "session.styleFile:\t"+ui->combo_session_wtheme->itemData( ui->combo_session_wtheme->currentIndex() ).toString(); + if(index < 0){ FB << line; } //add line to the end of the file + else{ FB[index] = line; } //replace the current setting with the new one + // - workspace number + index = FB.indexOf( FB.filter("session.screen0.workspaces:").join("") ); + line = "session.screen0.workspaces:\t"+QString::number(ui->spin_session_wkspaces->value()); + if(index < 0){ FB << line; } //add line to the end of the file + else{ FB[index] = line; } //replace the current setting with the new one + + //Save the fluxbox settings + bool ok = overwriteFile(QDir::homePath()+"/.lumina/fluxbox-init", FB); + if(!ok){ qDebug() << "Warning: Could not save ~/.lumina/startapps"; } + //Now do the start apps + QStringList STARTUP; + for(int i=0; i<ui->list_session_start->count(); i++){ + STARTUP << ui->list_session_start->item(i)->whatsThis(); + } + ok = overwriteFile(QDir::homePath()+"/.lumina/startapps", STARTUP); + if(!ok){ qDebug() << "Warning: Could not save ~/.lumina/startapps"; } + + //Now do the general session options + sessionsettings->setValue("EnableNumlock", ui->check_session_numlock->isChecked()); + sessionsettings->setValue("PlayStartupAudio", ui->check_session_playloginaudio->isChecked()); + sessionsettings->setValue("PlayLogoutAudio", ui->check_session_playlogoutaudio->isChecked()); +} + +void MainUI::rmsessionstartitem(){ + if(ui->list_session_start->currentRow() < 0){ return; } //no item selected + delete ui->list_session_start->takeItem(ui->list_session_start->currentRow()); + sessionoptchanged(); +} + +void MainUI::addsessionstartapp(){ + //Prompt for the application to start + XDGDesktop desk = getSysApp(); + if(desk.filePath.isEmpty()){ return; } //cancelled + QListWidgetItem *it = new QListWidgetItem( LXDG::findIcon(desk.icon,""), desk.name ); + it->setWhatsThis("lumina-open "+desk.filePath); //command to be saved/run + ui->list_session_start->addItem(it); + ui->list_session_start->setCurrentItem(it); + sessionoptchanged(); +} + +void MainUI::addsessionstartbin(){ + QString chkpath = "/usr/local/bin"; + if(!QFile::exists(chkpath)){ chkpath = QDir::homePath(); } + QString bin = QFileDialog::getOpenFileName(this, tr("Select Binary"), chkpath, tr("Application Binaries (*)") ); + if( bin.isEmpty() || !QFile::exists(bin) ){ return; } //cancelled + if( !QFileInfo(bin).isExecutable() ){ + QMessageBox::warning(this, tr("Invalid Binary"), tr("The selected file is not executable!")); + return; + } + QListWidgetItem *it = new QListWidgetItem( LXDG::findIcon("application-x-executable",""), bin.section("/",-1) ); + it->setWhatsThis(bin); //command to be saved/run + ui->list_session_start->addItem(it); + ui->list_session_start->setCurrentItem(it); + sessionoptchanged(); +} + +void MainUI::addsessionstartfile(){ + QString chkpath = QDir::homePath(); + QString bin = QFileDialog::getOpenFileName(this, tr("Select File"), chkpath, tr("All Files (*)") ); + if( bin.isEmpty() || !QFile::exists(bin) ){ return; } //cancelled + QListWidgetItem *it = new QListWidgetItem( LXDG::findIcon("unknown",""), bin.section("/",-1) ); + it->setWhatsThis("lumina-open "+bin); //command to be saved/run + ui->list_session_start->addItem(it); + ui->list_session_start->setCurrentItem(it); + sessionoptchanged(); +} + +void MainUI::sessionoptchanged(){ + if(!loading){ + ui->push_save->setEnabled(true); + modses = true; + } +} + +void MainUI::sessionstartchanged(){ + ui->tool_session_rmapp->setEnabled( ui->list_session_start->currentRow()>=0 ); +} |