diff options
Diffstat (limited to 'src-qt5/core-utils/lumina-config')
52 files changed, 3188 insertions, 4275 deletions
diff --git a/src-qt5/core-utils/lumina-config/KeyCatch.h b/src-qt5/core-utils/lumina-config/KeyCatch.h deleted file mode 100644 index 03193972..00000000 --- a/src-qt5/core-utils/lumina-config/KeyCatch.h +++ /dev/null @@ -1,106 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2014, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This is the dialog for catching keyboard events and converting them to X11 keycodes -//=========================================== -#ifndef _LUMINA_FILE_MANAGER_KEY_CATCH_DIALOG_H -#define _LUMINA_FILE_MANAGER_KEY_CATCH_DIALOG_H - -// Qt includes -#include <QDialog> -#include <QKeyEvent> -#include <QString> -#include <QDebug> - -#include "ui_KeyCatch.h" - -namespace Ui{ - class KeyCatch; -}; - -class KeyCatch : public QDialog{ - Q_OBJECT - -private: - Ui::KeyCatch *ui; - QList<int> mods; -public: - QString xkeys, qkeys; - bool cancelled; - - KeyCatch(QWidget *parent = 0) : QDialog(parent), ui(new Ui::KeyCatch){ - ui->setupUi(this); - mods << Qt::Key_Escape << Qt::Key_Tab << Qt::Key_Enter << Qt::Key_Return << Qt::Key_Shift << Qt::Key_Control << Qt::Key_Meta << Qt::Key_Alt; - cancelled=true; //assume cancelled in case the user closes the window - this->show(); - this->grabKeyboard(); //will automatically release when the window closes - } - ~KeyCatch(){} - -private slots: - void on_buttonBox_rejected(){ - cancelled=true; - this->close(); - } - -protected: - void keyPressEvent(QKeyEvent *event){ - //Don't catch if the main key is a modifier (shift,ctrl,alt,other..) - if(event->key()==0 && event->nativeVirtualKey()==0){ return; } //invalid "special" key - else if( !mods.contains(event->key()) ){ - //Get the modifiers first (if any) - if(!QKeySequence(event->modifiers()).toString().isEmpty()){// && event->nativeModifiers()!=16){ - if(event->modifiers()!=Qt::KeypadModifier){ - qkeys = QKeySequence(event->modifiers()).toString(); - } - - /*//Ignore modifiers that result in a different keycode entirely (shift+a != (shift) + (a) ) - if(event->modifiers()!=Qt::ShiftModifier && event->modifiers()!=Qt::KeypadModifier){ - //Convert the modifier to the fluxbox equivilent - QStringList mod = qkeys.split("+"); - for(int i=0; i<mod.length(); i++){ - QString key = mod[i].toLower(); - if(key=="shift"){} //this is also a valid fluxbox code - else if(key=="meta"){ key = "Mod4"; } - else if(key=="ctrl"){ key = "control"; } - else if(key=="alt"){ key = "Mod1"; } - else{ key.clear(); } //unknown fluxbox modifier - if(!key.isEmpty()){ xkeys.append(key+" "); } - } - }*/ - - } - //Now get the main key - qkeys.replace("+"," "); - if(event->key()==0){ - if(qkeys.isEmpty()){ qkeys="None "; } //For Fluxbox, need "None <X Key number>" - qkeys.append( QString::number(event->nativeVirtualKey()) ); - }else{ - qkeys.append( QKeySequence(event->key()).toString() ); //also save the text version (for display) - } - //Remove the modifier if it is only "shift", and the main key is not a symbol - xkeys = qkeys; - qkeys.remove("None "); //The display/Qt keycode does not need to show this - if(!xkeys.section(" ",-1).isEmpty() && xkeys.contains("Shift ")){ - if(!xkeys.section(" ",-1).at(0).isLetter()){ - xkeys.remove("Shift "); //The symbol/keycode is already different - qkeys.remove("Shift "); - } - } - qDebug() << "Found Key Press:"; - qDebug() << " - Native Virtual Key:" << event->nativeVirtualKey(); - qDebug() << " - Qt Key Sequence:" << QKeySequence(event->key()).toString(); - qDebug() << " - Full Detected Sequence (Display):" << qkeys; - qDebug() << " - Full Detected Sequence (backend):" << xkeys; - //Now close the dialog - cancelled=false; - this->close(); - } - } - -}; - -#endif diff --git a/src-qt5/core-utils/lumina-config/KeyCatch.ui b/src-qt5/core-utils/lumina-config/KeyCatch.ui deleted file mode 100644 index 99f4095d..00000000 --- a/src-qt5/core-utils/lumina-config/KeyCatch.ui +++ /dev/null @@ -1,88 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>KeyCatch</class> - <widget class="QDialog" name="KeyCatch"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>439</width> - <height>147</height> - </rect> - </property> - <property name="windowTitle"> - <string>Key Press Detection</string> - </property> - <property name="modal"> - <bool>false</bool> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QLabel" name="label"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Press the keys you wish to assign.</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string>Notes: -Special keys can only be detected if the proper keyboard driver is in use. -Current keyboard bindings will also be ignored.</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel</set> - </property> - </widget> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src-qt5/core-utils/lumina-config/PanelWidget.cpp b/src-qt5/core-utils/lumina-config/PanelWidget.cpp index 49b3d797..10e12cbb 100644 --- a/src-qt5/core-utils/lumina-config/PanelWidget.cpp +++ b/src-qt5/core-utils/lumina-config/PanelWidget.cpp @@ -7,13 +7,8 @@ #include "PanelWidget.h" #include "ui_PanelWidget.h" -#include "LPlugins.h" #include "GetPluginDialog.h" -#include "mainUI.h" -#include <LuminaXDG.h> - -#include <QSettings> -#include <QStringList> +#include "AppDialog.h" PanelWidget::PanelWidget(QWidget *parent, QWidget *Main, LPlugins *Pinfo) : QWidget(parent), ui(new Ui::PanelWidget){ @@ -126,6 +121,39 @@ void PanelWidget::reloadColorSample(){ ui->label_color_sample->setStyleSheet("background: "+ui->label_color_sample->whatsThis()); } +XDGDesktop PanelWidget::getSysApp(bool allowreset){ + AppDialog dlg(this, LXDG::sortDesktopNames( LXDG::systemDesktopFiles() ) ); + dlg.allowReset(allowreset); + dlg.exec(); + XDGDesktop desk; + if(dlg.appreset && allowreset){ + desk.filePath = "reset"; //special internal flag + }else{ + desk = dlg.appselected; + } + return desk; +} + +QString PanelWidget::getColorStyle(QString current, bool allowTransparency){ + 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; + if(allowTransparency){ ncol= QColorDialog::getColor(ccol, this, tr("Select Color"), QColorDialog::ShowAlphaChannel); } + else{ ncol= QColorDialog::getColor(ccol, this, tr("Select Color")); } + //Now convert the new color into a usable string and return + if(ncol.isValid()){ //if the dialog was not cancelled + if(allowTransparency){ + out = "rgba("+QString::number(ncol.red())+","+QString::number(ncol.green())+","+QString::number(ncol.blue())+","+QString::number(ncol.alpha())+")"; + }else{ + out = "rgb("+QString::number(ncol.red())+","+QString::number(ncol.green())+","+QString::number(ncol.blue())+")"; + } + } + return out; +} + void PanelWidget::on_tool_rm_clicked(){ emit PanelRemoved(pnum); } @@ -140,7 +168,7 @@ void PanelWidget::UseColorChanged(){ } void PanelWidget::on_tool_selectcolor_clicked(){ - QString color = static_cast<MainUI*>(mainui)->getColorStyle(ui->label_color_sample->whatsThis()); + QString color = getColorStyle(ui->label_color_sample->whatsThis()); if( color.isEmpty()){ return; } ui->label_color_sample->setWhatsThis(color); reloadColorSample(); @@ -155,7 +183,7 @@ void PanelWidget::on_tool_addplugin_clicked(){ QString pan = dlg.plugID; //getNewPanelPlugin(); if(pan == "applauncher"){ //Prompt for the application to add - XDGDesktop app = static_cast<MainUI*>(mainui)->getSysApp(); + XDGDesktop app =getSysApp(); if(app.filePath.isEmpty()){ return; } //cancelled pan.append("::"+app.filePath); QListWidgetItem *it = new QListWidgetItem( LXDG::findIcon(app.icon,""), app.name); diff --git a/src-qt5/core-utils/lumina-config/PanelWidget.h b/src-qt5/core-utils/lumina-config/PanelWidget.h index e407391e..3f3cb360 100644 --- a/src-qt5/core-utils/lumina-config/PanelWidget.h +++ b/src-qt5/core-utils/lumina-config/PanelWidget.h @@ -7,11 +7,8 @@ #ifndef _LUMINA_CONFIG_PANEL_WIDGET_H #define _LUMINA_CONFIG_PANEL_WIDGET_H -#include <QWidget> -#include <QObject> -#include <QSettings> +#include "globals.h" -//#include "mainUI.h" #include "LPlugins.h" //namespace for using the *.ui file @@ -42,7 +39,8 @@ private: int dnum, pnum; void reloadColorSample(); - + XDGDesktop getSysApp(bool allowreset = false); + QString getColorStyle(QString current, bool allowTransparency = true); private slots: void on_tool_rm_clicked(); void ItemChanged(); @@ -60,4 +58,3 @@ signals: }; #endif - diff --git a/src-qt5/core-utils/lumina-config/globals.h b/src-qt5/core-utils/lumina-config/globals.h index 11bfaeb3..c96aaaa3 100644 --- a/src-qt5/core-utils/lumina-config/globals.h +++ b/src-qt5/core-utils/lumina-config/globals.h @@ -12,12 +12,22 @@ #include <QList> #include <QWidget> #include <QDesktopWidget> +#include <QScreen> #include <QMainWindow> +#include <QTreeWidgetItem> +#include <QToolButton> +#include <QSettings> +#include <QFileDialog> +#include <QColorDialog> +#include <QMessageBox> +#include <QShortcut> +#include <QImageReader> //Now the Lumina Library classes #include <LuminaXDG.h> #include <LuminaUtils.h> #include <LuminaX11.h> #include <LuminaOS.h> +#include <LuminaThemes.h> #endif diff --git a/src-qt5/core-utils/lumina-config/lumina-config.pro b/src-qt5/core-utils/lumina-config/lumina-config.pro index 4560036c..2e950fe1 100644 --- a/src-qt5/core-utils/lumina-config/lumina-config.pro +++ b/src-qt5/core-utils/lumina-config/lumina-config.pro @@ -11,7 +11,6 @@ target.path = $${L_BINDIR} TEMPLATE = app SOURCES += main.cpp \ - mainUI.cpp \ mainWindow.cpp \ LPlugins.cpp \ ColorDialog.cpp \ @@ -19,19 +18,15 @@ SOURCES += main.cpp \ GetPluginDialog.cpp \ PanelWidget.cpp -HEADERS += mainUI.h \ - mainWindow.h \ +HEADERS += mainWindow.h \ LPlugins.h \ - KeyCatch.h \ AppDialog.h \ ColorDialog.h \ ThemeDialog.h \ GetPluginDialog.h \ PanelWidget.h -FORMS += mainUI.ui \ - mainWindow.ui \ - KeyCatch.ui \ +FORMS += mainWindow.ui \ AppDialog.ui \ ColorDialog.ui \ ThemeDialog.ui \ @@ -45,7 +40,7 @@ include("pages/pages.pri") LIBS += -lLuminaUtils -DEPENDPATH += ../libLumina +DEPENDPATH += ../../core/libLumina TRANSLATIONS = i18n/lumina-config_af.ts \ i18n/lumina-config_ar.ts \ diff --git a/src-qt5/core-utils/lumina-config/main.cpp b/src-qt5/core-utils/lumina-config/main.cpp index a63e0fbe..856570c0 100644 --- a/src-qt5/core-utils/lumina-config/main.cpp +++ b/src-qt5/core-utils/lumina-config/main.cpp @@ -4,7 +4,7 @@ #include <QDebug> #include <QFile> -#include "mainUI.h" + #include "mainWindow.h" #include <LuminaOS.h> #include <LuminaUtils.h> @@ -19,8 +19,7 @@ int main(int argc, char ** argv) LuminaThemeEngine theme(&a); - MainUI w; - //mainWindow w; + mainWindow w; QObject::connect(&a, SIGNAL(InputsAvailable(QStringList)), &w, SLOT(slotSingleInstance()) ); QObject::connect(&theme, SIGNAL(updateIcons()), &w, SLOT(setupIcons()) ); w.show(); diff --git a/src-qt5/core-utils/lumina-config/mainUI.cpp b/src-qt5/core-utils/lumina-config/mainUI.cpp deleted file mode 100644 index 36e45a9e..00000000 --- a/src-qt5/core-utils/lumina-config/mainUI.cpp +++ /dev/null @@ -1,1932 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2014-2015, 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 - -#include <LuminaOS.h> -#include <QImageReader> -#include <QTime> -#include <QDate> -//#include <QTimeZone> -#include <QScrollBar> - -#include <unistd.h> - -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 - panadjust = false; - DEFAULTBG = LOS::LuminaShare()+"desktop-background.jpg"; - //Be careful about the QSettings setup, it must match the lumina-desktop setup - settings = new QSettings( QSettings::UserScope, "lumina-desktop", "desktopsettings", this); - appsettings = new QSettings( QSettings::UserScope, "lumina-desktop", "lumina-open", this); - sessionsettings = new QSettings( QSettings::UserScope, "lumina-desktop","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->screenNumber(this->mapToGlobal(this->geometry().center()))+1); //have the current screen auto-selected - //qDebug() << "Number of Screens:" << desktop->screenCount(); - sysApps = LXDG::sortDesktopNames( LXDG::systemDesktopFiles() ); - //Add a couple spacers to center the toolbar items - QWidget *tmp = new QWidget(this); - tmp->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - ui->toolBar->insertWidget(ui->actionDesktop, tmp); - tmp = new QWidget(this); - tmp->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - ui->toolBar->addWidget(tmp); - //Now finish setting up the UI - setupIcons(); - setupMenus(); - setupConnections(); - - //Start on the Desktop page (and first tab for all tab widgets) - ui->stackedWidget->setCurrentWidget(ui->page_desktop); - ui->tabWidget_desktop->setCurrentWidget(ui->tab_wallpaper); - ui->tabWidget_session->setCurrentIndex(0); - ui->tabWidget_apps->setCurrentIndex(0); - ui->tabWidget_panels->setCurrentIndex(0); - - slotChangePage(false); - - QTimer::singleShot(10, this, SLOT(loadCurrentSettings()) ); - - //Disable the incomplete pages/items at the moment - -} - -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-display","") ); - ui->actionPanels->setIcon( LXDG::findIcon("preferences-desktop-icons","") ); - //ui->actionMenu->setIcon( LXDG::findIcon("preferences-desktop-icons","") ); - ui->actionShortcuts->setIcon( LXDG::findIcon("configure-shortcuts","") ); - ui->actionDefaults->setIcon( LXDG::findIcon("preferences-system-windows","") ); - 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->tabWidget_desktop->setTabIcon( ui->tabWidget_desktop->indexOf(ui->tab_wallpaper), LXDG::findIcon("preferences-desktop-wallpaper","") ); - ui->tabWidget_desktop->setTabIcon( ui->tabWidget_desktop->indexOf(ui->tab_themes), LXDG::findIcon("preferences-desktop-theme","") ); - ui->tool_desktop_addplugin->setIcon( LXDG::findIcon("list-add","") ); - ui->tool_desktop_rmplugin->setIcon( LXDG::findIcon("list-remove","") ); - - //Panels Page - ui->tool_panels_add->setIcon( LXDG::findIcon("list-add","") ); - - //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","") ); - - //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","") ); - ui->tool_defaults_setbin->setIcon( LXDG::findIcon("application-x-executable","") ); - ui->tabWidget_apps->setTabIcon( ui->tabWidget_apps->indexOf(ui->tab_auto), LXDG::findIcon("system-run", "") ); - ui->tabWidget_apps->setTabIcon( ui->tabWidget_apps->indexOf(ui->tab_defaults), LXDG::findIcon("preferences-desktop-filetype-association", "") ); - - //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","") ); - ui->tool_session_newtheme->setIcon( LXDG::findIcon("preferences-desktop-theme","") ); - ui->tool_session_newcolor->setIcon( LXDG::findIcon("preferences-desktop-color","") ); - ui->push_session_resetSysDefaults->setIcon( LXDG::findIcon("pcbsd","view-refresh") ); - ui->push_session_resetLuminaDefaults->setIcon( LXDG::findIcon("Lumina-DE","") ); - ui->tool_help_time->setIcon( LXDG::findIcon("help-about","") ); - ui->tool_help_date->setIcon( LXDG::findIcon("help-about","") ); -} - -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_desktop_addplugin, SIGNAL(clicked()), this, SLOT(deskplugadded()) ); - connect(ui->tool_desktop_rmplugin, SIGNAL(clicked()), this, SLOT(deskplugremoved()) ); - 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()) ); - connect(ui->check_desktop_autolaunchers, SIGNAL(clicked()), this, SLOT(desktimechanged()) ); //just need to poke the save routines - connect(ui->combo_desk_layout, SIGNAL(currentIndexChanged(int)), this, SLOT(desktimechanged()) ); //just need to poke the save routines - - //Panels Page - connect(ui->tool_panels_add, SIGNAL(clicked()), this, SLOT(newPanel()) ); - - //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->list_menu, SIGNAL(currentRowChanged(int)), this, SLOT(checkmenuicons()) ); - - //Shortcuts Page - connect(ui->tool_shortcut_clear, SIGNAL(clicked()), this, SLOT(clearKeyBinding()) ); - connect(ui->tool_shortcut_set, SIGNAL(clicked()), this, SLOT(applyKeyBinding()) ); - connect(ui->tree_shortcut, SIGNAL(itemSelectionChanged()), this, SLOT(updateKeyConfig()) ); - - //Defaults Page - connect(ui->tool_default_filemanager, SIGNAL(clicked()), this, SLOT(changeDefaultFileManager()) ); - connect(ui->tool_default_terminal, SIGNAL(clicked()), this, SLOT(changeDefaultTerminal()) ); - connect(ui->tool_default_webbrowser, SIGNAL(clicked()), this, SLOT(changeDefaultBrowser()) ); - connect(ui->tool_default_email, SIGNAL(clicked()), this, SLOT(changeDefaultEmail()) ); - connect(ui->tool_defaults_clear, SIGNAL(clicked()), this, SLOT(cleardefaultitem()) ); - connect(ui->tool_defaults_set, SIGNAL(clicked()), this, SLOT(setdefaultitem()) ); - connect(ui->tool_defaults_setbin, SIGNAL(clicked()), this, SLOT(setdefaultbinary()) ); - 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->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(sessionthemechanged()) ); - connect(ui->combo_session_cursortheme, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionCursorChanged()) ); - 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()) ); - connect(ui->list_session_start, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(sessionoptchanged()) ); - connect(ui->spin_session_fontsize, SIGNAL(valueChanged(int)), this, SLOT(sessionoptchanged()) ); - connect(ui->combo_session_themefile, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionoptchanged()) ); - connect(ui->combo_session_colorfile, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionoptchanged()) ); - connect(ui->combo_session_icontheme, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionoptchanged()) ); - connect(ui->font_session_theme, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionoptchanged()) ); - connect(ui->tool_session_newcolor, SIGNAL(clicked()), this, SLOT(sessionEditColor()) ); - connect(ui->tool_session_newtheme, SIGNAL(clicked()), this, SLOT(sessionEditTheme()) ); - connect(ui->push_session_setUserIcon, SIGNAL(clicked()), this, SLOT(sessionChangeUserIcon()) ); - connect(ui->push_session_resetSysDefaults, SIGNAL(clicked()), this, SLOT(sessionResetSys()) ); - connect(ui->push_session_resetLuminaDefaults, SIGNAL(clicked()), this, SLOT(sessionResetLumina()) ); - connect(ui->tool_help_time, SIGNAL(clicked()), this, SLOT(sessionShowTimeCodes()) ); - connect(ui->tool_help_date, SIGNAL(clicked()), this, SLOT(sessionShowDateCodes()) ); - connect(ui->line_session_time, SIGNAL(textChanged(QString)), this, SLOT(sessionLoadTimeSample()) ); - connect(ui->line_session_date, SIGNAL(textChanged(QString)), this, SLOT(sessionLoadDateSample()) ); - connect(ui->combo_session_datetimeorder, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionoptchanged()) ); - connect(ui->combo_locale_lang, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionoptchanged()) ); - connect(ui->combo_locale_collate, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionoptchanged()) ); - connect(ui->combo_locale_ctype, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionoptchanged()) ); - connect(ui->combo_locale_message, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionoptchanged()) ); - connect(ui->combo_locale_monetary, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionoptchanged()) ); - connect(ui->combo_locale_numeric, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionoptchanged()) ); - connect(ui->combo_locale_time, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionoptchanged()) ); -} - -void MainUI::setupMenus(){ - //Background file menu (different ways of loading files) - if(ui->tool_desk_addbg->menu()==0){ ui->tool_desk_addbg->setMenu(new QMenu(this)); } - ui->tool_desk_addbg->menu()->clear(); - ui->tool_desk_addbg->menu()->addAction(LXDG::findIcon("document-new",""), tr("File(s)"), this, SLOT(deskbgadded()) ); - ui->tool_desk_addbg->menu()->addAction(LXDG::findIcon("folder-new",""), tr("Directory (Single)"), this, SLOT(deskbgdiradded()) ); - ui->tool_desk_addbg->menu()->addAction(LXDG::findIcon("document-open-folder",""), tr("Directory (Recursive)"), this, SLOT(deskbgdirradded()) ); - ui->tool_desk_addbg->menu()->addAction(LXDG::findIcon("format-fill-color",""), tr("Solid Color"), this, SLOT(deskbgcoloradded()) ); - - //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(); - QStringList dirs; dirs << LOS::AppPrefix()+"share/fluxbox/styles" << QDir::homePath()+"/.fluxbox/styles"; - QFileInfoList fbstyles; - for(int i=0; i<dirs.length(); i++){ - QDir fbdir(dirs[i]); - fbstyles << fbdir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name | QDir::IgnoreCase); - } - QString lastdir; - for(int i=0; i<fbstyles.length(); i++){ - if(lastdir!=fbstyles[i].absolutePath()){ - lastdir = fbstyles[i].absolutePath(); //save for checking later - if(ui->combo_session_wtheme->count()>0){ ui->combo_session_wtheme->insertSeparator(ui->combo_session_wtheme->count()); } - } - ui->combo_session_wtheme->addItem(fbstyles[i].fileName(), fbstyles[i].absoluteFilePath()); - } - //Display formats for panel clock - ui->combo_session_datetimeorder->clear(); - ui->combo_session_datetimeorder->addItem( tr("Time (Date as tooltip)"), "timeonly"); - ui->combo_session_datetimeorder->addItem( tr("Date (Time as tooltip)"), "dateonly"); - ui->combo_session_datetimeorder->addItem( tr("Time first then Date"), "timedate"); - ui->combo_session_datetimeorder->addItem( tr("Date first then Time"), "datetime"); - - //Available Cursor Themes - ui->combo_session_cursortheme->clear(); - ui->combo_session_cursortheme->addItems( LTHEME::availableSystemCursors() ); - //int cur = ui->combo_session_cursortheme->findText( LTHEME::currentCursor() ); - //if(cur>=0){ ui->combo_session_cursortheme->setCurrentIndex(cur); } - - //Available Wallpaper layout options - ui->combo_desk_layout->clear(); - ui->combo_desk_layout->addItem(tr("Automatic"), "stretch"); - ui->combo_desk_layout->addItem(tr("Fullscreen"), "full"); - ui->combo_desk_layout->addItem(tr("Fit screen"), "fit"); - ui->combo_desk_layout->addItem(tr("Tile"), "tile"); - ui->combo_desk_layout->addItem(tr("Center"), "center"); - ui->combo_desk_layout->addItem(tr("Top Left"), "topleft"); - ui->combo_desk_layout->addItem(tr("Top Right"), "topright"); - ui->combo_desk_layout->addItem(tr("Bottom Left"), "bottomleft"); - ui->combo_desk_layout->addItem(tr("Bottom Right"), "bottomright"); - - - - //Available localizations - QStringList langs = LUtils::knownLocales(); - langs.sort(); - QString def = tr("System Default"); - ui->combo_locale_lang->addItem(def,""); - ui->combo_locale_collate->addItem(def,""); - ui->combo_locale_ctype->addItem(def,""); - ui->combo_locale_message->addItem(def,""); - ui->combo_locale_monetary->addItem(def,""); - ui->combo_locale_numeric->addItem(def,""); - ui->combo_locale_time->addItem(def,""); - for(int i=0; i<langs.length(); i++){ - QString lan = QLocale(langs[i]).nativeLanguageName(); - ui->combo_locale_lang->addItem(lan,langs[i]); - ui->combo_locale_collate->addItem(lan,langs[i]); - ui->combo_locale_ctype->addItem(lan,langs[i]); - ui->combo_locale_message->addItem(lan,langs[i]); - ui->combo_locale_monetary->addItem(lan,langs[i]); - ui->combo_locale_numeric->addItem(lan,langs[i]); - ui->combo_locale_time->addItem(lan,langs[i]); - } -} - -int MainUI::currentDesktop(){ - return ui->spin_screen->value()-1; //backend starts at 0, not 1 -} - -QString MainUI::getColorStyle(QString current, bool allowTransparency){ - 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; - if(allowTransparency){ ncol= QColorDialog::getColor(ccol, this, tr("Select Color"), QColorDialog::ShowAlphaChannel); } - else{ ncol= QColorDialog::getColor(ccol, this, tr("Select Color")); } - //Now convert the new color into a usable string and return - if(ncol.isValid()){ //if the dialog was not cancelled - if(allowTransparency){ - out = "rgba("+QString::number(ncol.red())+","+QString::number(ncol.green())+","+QString::number(ncol.blue())+","+QString::number(ncol.alpha())+")"; - }else{ - out = "rgb("+QString::number(ncol.red())+","+QString::number(ncol.green())+","+QString::number(ncol.blue())+")"; - } - } - return out; -} - -XDGDesktop MainUI::getSysApp(bool allowreset){ - AppDialog dlg(this, sysApps); - dlg.allowReset(allowreset); - dlg.exec(); - XDGDesktop desk; - if(dlg.appreset && allowreset){ - desk.filePath = "reset"; //special internal flag - }else{ - desk = dlg.appselected; - } - return desk; -} - -//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 - in.replace("+"," "); - 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) ); - //Hide the save button for particular pages - //ui->push_save->setVisible(!ui->actionDefaults->isChecked() || moddesk || modpan || modmenu || modshort || moddef || modses); //hide on the default page if nothing waiting to be saved - //Special functions for particular pages - //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) ){ - ui->spin_screen->setValue(cscreen+1); //Make sure the old screen is selected for a moment - saveCurrentSettings(true); //only save current screen settings - ui->spin_screen->setValue(newscreen+1); //Now reset back to the new screen - } - } - 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 if(bgs[i].startsWith("rgb(")){ui->combo_desk_bg->addItem(QString(tr("Solid Color: %1")).arg(bgs[i]), bgs[i]); } - //else{ ui->combo_desk_bg->addItem( QIcon(QPixmap(bgs[i]).scaled(64,64)), bgs[i].section("/",-1), bgs[i] ); } - else{ ui->combo_desk_bg->addItem( bgs[i].section("/",-1), bgs[i] ); } //disable the thumbnail - takes a long time for large collections of files - } - ui->check_desktop_autolaunchers->setChecked(settings->value(DPrefix+"generateDesktopIcons", false).toBool()); - 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()) ); - int tmp = ui->combo_desk_layout->findData(settings->value(DPrefix+"background/format","stretch")); - if(tmp>=0){ ui->combo_desk_layout->setCurrentIndex(tmp); } - QStringList dplugs = settings->value(DPrefix+"pluginlist",QStringList()).toStringList(); - ui->list_desktop_plugins->clear(); - for(int i=0; i<dplugs.length(); i++){ - QListWidgetItem* it = new QListWidgetItem(); - it->setWhatsThis(dplugs[i]); //save the full thing instantly - //Now load the rest of the info about the plugin - QString num; - if(dplugs[i].contains("---")){ - num = dplugs[i].section("---",1,1).section(".",1,1).simplified(); //Skip the screen number - if(num=="1"){ num.clear(); } //don't bother showing the number - dplugs[i] = dplugs[i].section("---",0,0); - } - if(dplugs[i].startsWith("applauncher::")){ - bool ok = false; - XDGDesktop app = LXDG::loadDesktopFile(dplugs[i].section("::",1,50), ok); - if(!ok){ continue; } //invalid for some reason - //Now fill the item with the necessary info - it->setText(app.name); - it->setIcon(LXDG::findIcon(app.icon,"") ); - it->setToolTip(app.comment); - }else{ - //Load the info for this plugin - LPI info = PINFO->desktopPluginInfo(dplugs[i]); - if( info.ID.isEmpty() ){ continue; } //invalid plugin for some reason - it->setText(info.name); - it->setToolTip(info.description); - it->setIcon( LXDG::findIcon(info.icon,"") ); - } - if(!num.isEmpty()){ it->setText( it->text()+" ("+num+")"); } //append the number - ui->list_desktop_plugins->addItem(it); - } - - //Panels Page - int panels = settings->value(DPrefix+"panels",-1).toInt(); - if(panels==-1 && primary){ panels=1; } - panelnumber = panels; - loadPanels(); - - if(!screenonly){ - // Menu Page - //Default terminal and filemanager binary - //ui->line_menu_term->setText( settings->value("default-terminal","xterm").toString() ); - //ui->line_menu_fm->setText( settings->value("default-filemanager","lumina-fm").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())+"/"; - bool needreload = false; - // 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"); - } - if(bgs.isEmpty()){ bgs << "default"; } //Make sure to always fall back on the default - settings->setValue(DPrefix+"background/filelist", bgs); - settings->setValue(DPrefix+"background/minutesToChange", ui->spin_desk_min->value()); - settings->setValue(DPrefix+"generateDesktopIcons", ui->check_desktop_autolaunchers->isChecked()); - settings->setValue(DPrefix+"background/format", ui->combo_desk_layout->currentData().toString()); - QStringList plugs; - for(int i=0; i<ui->list_desktop_plugins->count(); i++){ - plugs << ui->list_desktop_plugins->item(i)->whatsThis(); - } - if(settings->value(DPrefix+"pluginlist",QStringList()).toStringList() != plugs){ - settings->setValue(DPrefix+"pluginlist", plugs); - needreload = true; - } - } - - // Panels Page - if(modpan){ - settings->setValue(DPrefix+"panels", PANELS.length()); - savePanels(); - } - - // Menu Page - if(modmenu && !screenonly){ - 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 - //ui->push_save->setVisible(!ui->actionDefaults->isChecked() || modmenu || modshort || moddef || modses); - if(needreload){ - //Wait 1 second - for(int i=0; i<10; i++){ QApplication::processEvents(); usleep(100000); } - loadCurrentSettings(screenonly); - } -} - - -//=============== -// DESKTOP PAGE -//=============== -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)")); - ui->label_desk_bgview->setStyleSheet(""); - }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()) ); - //Update the preview/thumbnail for this item - QPixmap pix(path); - ui->label_desk_bgview->setPixmap( pix.scaled(sz, Qt::KeepAspectRatio, Qt::SmoothTransformation) ); - ui->combo_desk_bg->setItemIcon(ui->combo_desk_bg->currentIndex(), pix.scaled(64,64) ); - ui->label_desk_bgview->setStyleSheet(""); - }else if(path.startsWith("rgb(")){ - ui->label_desk_bgview->setPixmap(QPixmap()); - ui->label_desk_bgview->setText(""); - ui->label_desk_bgview->setStyleSheet("background-color: "+path+";"); - }else{ - ui->label_desk_bgview->setPixmap(QPixmap()); - ui->label_desk_bgview->setText(tr("File does not exist")); - ui->label_desk_bgview->setStyleSheet(""); - } - } - //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 = LOS::LuminaShare().section("/lumina-desktop",0,0)+"/wallpapers/Lumina-DE"; - qDebug() << "Looking for wallpaper dir:" << dir; - if( !QFile::exists(dir) ){ dir = QDir::homePath(); } - QStringList imgs = LUtils::imageExtensions(); - for(int i=0; i<imgs.length(); i++){ imgs[i].prepend("*."); } - QStringList bgs = QFileDialog::getOpenFileNames(this, tr("Find Background Image(s)"), dir, "Images ("+imgs.join(" ")+");;All Files (*)"); - 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 ); - //If multiple items selected, automatically enable the background rotation option - if(bgs.length() > 1 && !ui->radio_desk_multi->isChecked()){ - ui->radio_desk_multi->setChecked(true); - } - ui->push_save->setEnabled(true); //this is definitely a change - moddesk = true; -} - -void MainUI::deskbgcoloradded(){ - //Prompt the user to select a color (no transparency allowed) - QString color = getColorStyle("",false); //no initial color - if(color.isEmpty()){ return; } - //Add it to the list - ui->combo_desk_bg->addItem( QString(tr("Solid Color: %1")).arg(color), color); - //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::deskbgdiradded(){ - //Add the files from a single directory - QString dir = LOS::LuminaShare().section("/lumina-desktop",0,0)+"/wallpapers/Lumina-DE"; - qDebug() << "Looking for wallpaper dir:" << dir; - if( !QFile::exists(dir) ){ dir = QDir::homePath(); } - dir = QFileDialog::getExistingDirectory(this, tr("Find Background Image Directory"), dir, QFileDialog::ReadOnly); - if(dir.isEmpty()){ return; } - //Got a directory - go ahead and find all the valid image files within it - QStringList imgs = LUtils::imageExtensions(); - for(int i=0; i<imgs.length(); i++){ imgs[i].prepend("*."); } - QDir qdir(dir); - QStringList bgs = qdir.entryList(imgs, QDir::Files | QDir::NoDotAndDotDot, QDir::Name); - if(bgs.isEmpty()){ return; } - for(int i=0; i<bgs.length(); i++){ - ui->combo_desk_bg->addItem( bgs[i], qdir.absoluteFilePath(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 ); - //If multiple items selected, automatically enable the background rotation option - if(bgs.length() > 1 && !ui->radio_desk_multi->isChecked()){ - ui->radio_desk_multi->setChecked(true); - } - ui->push_save->setEnabled(true); //this is definitely a change - moddesk = true; -} - -void MainUI::deskbgdirradded(){ - //Recursively add files from a directory - QString dir = LOS::LuminaShare().section("/lumina-desktop",0,0)+"/wallpapers/Lumina-DE"; - qDebug() << "Looking for wallpaper dir:" << dir; - if( !QFile::exists(dir) ){ dir = QDir::homePath(); } - dir = QFileDialog::getExistingDirectory(this, tr("Find Background Image Directory"), dir, QFileDialog::ReadOnly); - if(dir.isEmpty()){ return; } - //Got a directory - go ahead and get all the valid image file formats - QStringList imgs = LUtils::imageExtensions(); - for(int i=0; i<imgs.length(); i++){ imgs[i].prepend("*."); } - //Now load the directory and add all the valid files - QStringList dirs = LUtils::listSubDirectories(dir, true); //find/list all the dirs - dirs.prepend(dir); //make sure the main dir is also listed - QStringList bgs; - for(int d=0; d<dirs.length(); d++){ - QDir qdir(dirs[d]); - QStringList tmp = qdir.entryList(imgs, QDir::Files | QDir::NoDotAndDotDot, QDir::Name); - for(int j=0; j<tmp.length(); j++){ bgs << qdir.absoluteFilePath(tmp[j]); } - } - //Now add all the files into the widget - for(int i=0; i<bgs.length(); i++){ - ui->combo_desk_bg->addItem( 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 ); - //If multiple items selected, automatically enable the background rotation option - if(bgs.length() > 1 && !ui->radio_desk_multi->isChecked()){ - ui->radio_desk_multi->setChecked(true); - } - ui->push_save->setEnabled(true); //this is definitely a change - moddesk = true; -} - - -void MainUI::deskplugadded(){ - GetPluginDialog dlg(this); - dlg.LoadPlugins("desktop", PINFO); - dlg.exec(); - if( !dlg.selected ){ return; } //cancelled - QString newplug = dlg.plugID; - QListWidgetItem *it = new QListWidgetItem(); - if(newplug=="applauncher"){ - //Prompt for the application to add - XDGDesktop app = getSysApp(); - if(app.filePath.isEmpty()){ return; } //cancelled - newplug.append("::"+app.filePath); - //Now fill the item with the necessary info - it->setWhatsThis(newplug); - it->setText(app.name); - it->setIcon(LXDG::findIcon(app.icon,"") ); - it->setToolTip(app.comment); - }else{ - //Load the info for this plugin - LPI info = PINFO->desktopPluginInfo(newplug); - if( info.ID.isEmpty() ){ return; } //invalid plugin for some reason (should never happen) - it->setWhatsThis(newplug); - it->setText(info.name); - it->setToolTip(info.description); - it->setIcon( LXDG::findIcon(info.icon,"") ); - } - ui->list_desktop_plugins->addItem(it); - ui->list_desktop_plugins->scrollToItem(it); - ui->push_save->setEnabled(true); - moddesk = true; -} - -void MainUI::deskplugremoved(){ - QList<QListWidgetItem*> sel = ui->list_desktop_plugins->selectedItems(); - if(sel.isEmpty()){ return; } //nothing to do - for(int i=0; i<sel.length(); i++){ - delete sel[i]; - } - ui->push_save->setEnabled(true); - moddesk = true; -} - -//============= -// PANELS PAGE -//============= -void MainUI::panelValChanged(){ - ui->tool_panels_add->setEnabled(panelnumber < 12); - if(!loading){ ui->push_save->setEnabled(true); modpan = true; } -} - -void MainUI::newPanel(){ - - if(panelnumber<0){ panelnumber=0; } //just in case - panelnumber++; - //Now create a new Panel widget with this number - PanelWidget *tmp = new PanelWidget(ui->scroll_panels->widget(), this, PINFO); - tmp->LoadSettings(settings, currentDesktop(), panelnumber-1); - PANELS << tmp; - connect(tmp, SIGNAL(PanelChanged()), this, SLOT(panelValChanged()) ); - connect(tmp, SIGNAL(PanelRemoved(int)), this, SLOT(removePanel(int)) ); - static_cast<QBoxLayout*>(ui->scroll_panels->widget()->layout())->insertWidget(PANELS.length()-1, tmp); - //update the widget first (2 necessary for scroll below to work) - ui->scroll_panels->update(); - QApplication::processEvents(); - QApplication::processEvents(); - ui->scroll_panels->ensureWidgetVisible(tmp); - panelValChanged(); -} - -void MainUI::removePanel(int pan){ - //connected to a signal from the panel widget - bool changed = false; - for(int i=0; i<PANELS.length(); i++){ - int num = PANELS[i]->PanelNumber(); - if(num==pan){ - delete PANELS.takeAt(i); - i--; - changed = true; - }else if(num > pan){ - PANELS[i]->ChangePanelNumber(num-1); - changed = true; - } - } - if(!changed){ return; } //nothing done - panelnumber--; - panelValChanged(); -} - -void MainUI::loadPanels(){ - //First clean any current panels - for(int i=0; i<PANELS.length(); i++){ delete PANELS.takeAt(i); i--; } - //Now create new panels - int dnum = currentDesktop(); - if(ui->scroll_panels->widget()->layout()==0){ - ui->scroll_panels->widget()->setLayout( new QHBoxLayout() ); - ui->scroll_panels->widget()->layout()->setContentsMargins(0,0,0,0); - } - ui->scroll_panels->widget()->layout()->setAlignment(Qt::AlignLeft); - //Clear anything left over in the layout - for(int i=0; i<ui->scroll_panels->widget()->layout()->count(); i++){ - delete ui->scroll_panels->widget()->layout()->takeAt(i); - } - for(int i=0; i<panelnumber; i++){ - PanelWidget *tmp = new PanelWidget(ui->scroll_panels->widget(), this, PINFO); - tmp->LoadSettings(settings, dnum, i); - PANELS << tmp; - connect(tmp, SIGNAL(PanelChanged()), this, SLOT(panelValChanged()) ); - connect(tmp, SIGNAL(PanelRemoved(int)), this, SLOT(removePanel(int)) ); - ui->scroll_panels->widget()->layout()->addWidget(tmp); - } - static_cast<QHBoxLayout*>(ui->scroll_panels->widget()->layout())->addStretch(); -} - -void MainUI::savePanels(){ - for(int i=0; i<PANELS.length(); i++){ - PANELS[i]->SaveSettings(settings); - } -} - -//============ -// MENU PAGE -//============ -void MainUI::addmenuplugin(){ - GetPluginDialog dlg(this); - dlg.LoadPlugins("menu", PINFO); - dlg.exec(); - if(!dlg.selected){ return; } //cancelled - QString plug = dlg.plugID; - //Now add the item to the list - LPI info = PINFO->menuPluginInfo(plug); - 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::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 ); -} - -//=========== -// Shortcuts Page -//=========== -void MainUI::loadKeyboardShortcuts(){ - ui->tree_shortcut->clear(); - QStringList info = readFile(QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/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") \ - << "Exec xscreensaver-command -lock::::"+tr("Lock Screen"); - 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; } - QString exec = info[i].section(":",1,100); - QString showexec = exec; - if(showexec.startsWith("If {Matches")){ showexec = showexec.section("{",2,2).section("}",0,0); } - if(showexec.startsWith("Exec ")){ showexec.replace("Exec ","Run "); } - else{ showexec = showexec.section("(",0,0).section("{",0,0); } //built-in command - remove the extra commands on some of them - QTreeWidgetItem *it = new QTreeWidgetItem(); - it->setText(0, showexec.simplified() ); - it->setWhatsThis(0, exec); - 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(QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/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(QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/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::applyKeyBinding(){ - QKeySequence seq = ui->keyEdit_shortcut->keySequence(); - qDebug() << "New Key Sequence:" << seq.toString(QKeySequence::NativeText) << seq.toString(QKeySequence::PortableText); - if(seq.isEmpty()){ - //Verify removal of the action first - - //Now remove the action - delete ui->tree_shortcut->currentItem(); - }else{ - QTreeWidgetItem *it = ui->tree_shortcut->currentItem(); - it->setText(1,seq.toString(QKeySequence::NativeText)); - it->setWhatsThis(1,dispToFluxKeys(seq.toString(QKeySequence::PortableText))); - qDebug() << " - Flux Sequence:" << it->whatsThis(1); - } - ui->keyEdit_shortcut->clear(); - ui->push_save->setEnabled(true); - modshort=true; -} - -void MainUI::updateKeyConfig(){ - ui->group_shortcut_modify->setEnabled(ui->tree_shortcut->currentItem()!=0); - ui->keyEdit_shortcut->clear(); -} - -//=========== -// Defaults Page -//=========== -void MainUI::changeDefaultBrowser(){ - //Prompt for the new app - XDGDesktop desk = getSysApp(true); - if(desk.filePath.isEmpty()){ return; }//nothing selected - if(desk.filePath=="reset"){ - desk.filePath=""; - } - //save the new app setting and adjust the button appearance - appsettings->setValue("default/webbrowser", desk.filePath); - LXDG::setDefaultAppForMime("x-scheme-handler/http", desk.filePath.section("/",-1)); - LXDG::setDefaultAppForMime("x-scheme-handler/https", desk.filePath.section("/",-1)); - QString tmp = desk.filePath; - if(tmp.endsWith(".desktop")){ - bool ok = false; - XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); - if(!ok || file.filePath.isEmpty()){ - //Might be a binary - just print out the raw "path" - ui->tool_default_webbrowser->setText(tmp.section("/",-1)); - ui->tool_default_webbrowser->setIcon( LXDG::findIcon("application-x-executable","") ); - }else{ - ui->tool_default_webbrowser->setText(desk.name); - ui->tool_default_webbrowser->setIcon(LXDG::findIcon(desk.icon,"") ); - } - }else if(tmp.isEmpty()){ - ui->tool_default_webbrowser->setText(tr("Click to Set")); - ui->tool_default_webbrowser->setIcon( LXDG::findIcon("system-help","") ); - }else{ - //Might be a binary - just print out the raw "path" - ui->tool_default_webbrowser->setText(tmp.section("/",-1)); - ui->tool_default_webbrowser->setIcon( LXDG::findIcon("application-x-executable","") ); - } -} - -void MainUI::changeDefaultEmail(){ - //Prompt for the new app - XDGDesktop desk = getSysApp(true); //allow reset to default - if(desk.filePath.isEmpty()){ return; }//nothing selected - if(desk.filePath=="reset"){ - desk.filePath=""; - } - //save the new app setting and adjust the button appearance - LXDG::setDefaultAppForMime("application/email",desk.filePath); - // appsettings->setValue("default/email", desk.filePath); - QString tmp = desk.filePath; - if(tmp.endsWith(".desktop")){ - bool ok = false; - XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); - if(!ok || file.filePath.isEmpty()){ - //Might be a binary - just print out the raw "path" - ui->tool_default_email->setText(tmp.section("/",-1)); - ui->tool_default_email->setIcon( LXDG::findIcon("application-x-executable","") ); - }else{ - ui->tool_default_email->setText(file.name); - ui->tool_default_email->setIcon(LXDG::findIcon(file.icon,"") ); - } - }else if(tmp.isEmpty()){ - ui->tool_default_email->setText(tr("Click to Set")); - ui->tool_default_email->setIcon( LXDG::findIcon("system-help","") ); - }else{ - //Might be a binary - just print out the raw "path" - ui->tool_default_email->setText(tmp.section("/",-1)); - ui->tool_default_email->setIcon( LXDG::findIcon("application-x-executable","") ); - } -} - -void MainUI::changeDefaultFileManager(){ - //Prompt for the new app - XDGDesktop desk = getSysApp(true); - if(desk.filePath.isEmpty()){ return; }//nothing selected - if(desk.filePath=="reset"){ - desk.filePath="lumina-fm"; - } - //save the new app setting and adjust the button appearance - //appsettings->setValue("default/directory", desk.filePath); - //sessionsettings->setValue("default-filemanager", desk.filePath); - LXDG::setDefaultAppForMime("inode/directory", desk.filePath.section("/",-1)); - QString tmp = desk.filePath; - if(tmp.endsWith(".desktop")){ - bool ok = false; - XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); - if(!ok || file.filePath.isEmpty()){ - //Might be a binary - just print out the raw "path" - ui->tool_default_filemanager->setText(tmp.section("/",-1)); - ui->tool_default_filemanager->setIcon( LXDG::findIcon("application-x-executable","") ); - }else{ - ui->tool_default_filemanager->setText(file.name); - ui->tool_default_filemanager->setIcon(LXDG::findIcon(file.icon,"") ); - } - }else if(tmp.isEmpty()){ - ui->tool_default_filemanager->setText(tr("Click to Set")); - ui->tool_default_filemanager->setIcon( LXDG::findIcon("system-help","") ); - }else{ - //Might be a binary - just print out the raw "path" - ui->tool_default_filemanager->setText(tmp.section("/",-1)); - ui->tool_default_filemanager->setIcon( LXDG::findIcon("application-x-executable","") ); - } -} - -void MainUI::changeDefaultTerminal(){ - //Prompt for the new app - XDGDesktop desk = getSysApp(true); - if(desk.filePath.isEmpty()){ return; }//nothing selected - if(desk.filePath=="reset"){ - desk.filePath="xterm"; - } - //save the new app setting and adjust the button appearance - LXDG::setDefaultAppForMime("application/terminal",desk.filePath); - //sessionsettings->setValue("default-terminal", desk.filePath); - QString tmp = desk.filePath; - if(tmp.endsWith(".desktop")){ - bool ok = false; - XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); - if(!ok || file.filePath.isEmpty()){ - //Might be a binary - just print out the raw "path" - ui->tool_default_terminal->setText(tmp.section("/",-1)); - ui->tool_default_terminal->setIcon( LXDG::findIcon("application-x-executable","") ); - }else{ - ui->tool_default_terminal->setText(file.name); - ui->tool_default_terminal->setIcon(LXDG::findIcon(file.icon,"") ); - } - }else if(tmp.isEmpty()){ - ui->tool_default_terminal->setText(tr("Click to Set")); - ui->tool_default_terminal->setIcon( LXDG::findIcon("system-help","") ); - }else{ - //Might be a binary - just print out the raw "path" - ui->tool_default_terminal->setText(tmp.section("/",-1)); - ui->tool_default_terminal->setIcon( LXDG::findIcon("application-x-executable","") ); - } -} - -void MainUI::loadDefaultSettings(){ - //First load the lumina-open specific defaults - // - Default File Manager - QString tmp = LXDG::findDefaultAppForMime("inode/directory"); - if(tmp.isEmpty()){ tmp = "lumina-fm"; } - if( !QFile::exists(tmp) && !LUtils::isValidBinary(tmp) ){ qDebug() << "Invalid Settings:" << tmp; tmp.clear(); } //invalid settings - if(tmp.endsWith(".desktop")){ - bool ok = false; - XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); - if(!ok || file.filePath.isEmpty()){ - //Might be a binary - just print out the raw "path" - ui->tool_default_filemanager->setText(tmp.section("/",-1)); - ui->tool_default_filemanager->setIcon( LXDG::findIcon("application-x-executable","") ); - }else{ - ui->tool_default_filemanager->setText(file.name); - ui->tool_default_filemanager->setIcon(LXDG::findIcon(file.icon,"") ); - } - }else if(tmp.isEmpty()){ - ui->tool_default_filemanager->setText(tr("Click to Set")); - ui->tool_default_filemanager->setIcon( LXDG::findIcon("system-help","") ); - }else{ - //Might be a binary - just print out the raw "path" - ui->tool_default_filemanager->setText(tmp.section("/",-1)); - ui->tool_default_filemanager->setIcon( LXDG::findIcon("application-x-executable","") ); - } - // - Default Terminal - tmp =LXDG::findDefaultAppForMime("application/terminal"); //sessionsettings->value("default-terminal", "xterm").toString(); - if( !QFile::exists(tmp) && !LUtils::isValidBinary(tmp) ){ qDebug() << "Invalid Settings:" << tmp; tmp.clear(); } //invalid settings - if(tmp.endsWith(".desktop")){ - bool ok = false; - XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); - if(!ok || file.filePath.isEmpty()){ - //Might be a binary - just print out the raw "path" - ui->tool_default_terminal->setText(tmp.section("/",-1)); - ui->tool_default_terminal->setIcon( LXDG::findIcon("application-x-executable","") ); - }else{ - ui->tool_default_terminal->setText(file.name); - ui->tool_default_terminal->setIcon(LXDG::findIcon(file.icon,"") ); - } - }else if(tmp.isEmpty()){ - ui->tool_default_terminal->setText(tr("Click to Set")); - ui->tool_default_terminal->setIcon( LXDG::findIcon("system-help","") ); - }else{ - //Might be a binary - just print out the raw "path" - ui->tool_default_terminal->setText(tmp.section("/",-1)); - ui->tool_default_terminal->setIcon( LXDG::findIcon("application-x-executable","") ); - } - // - Default Web Browser - tmp = LXDG::findDefaultAppForMime("x-scheme-handler/http"); //appsettings->value("default/webbrowser", "").toString(); - if( !QFile::exists(tmp) && !LUtils::isValidBinary(tmp) ){ qDebug() << "Invalid Settings:" << tmp; tmp.clear(); } //invalid settings - if(tmp.endsWith(".desktop")){ - bool ok = false; - XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); - if(!ok || file.filePath.isEmpty()){ - //Might be a binary - just print out the raw "path" - ui->tool_default_webbrowser->setText(tmp.section("/",-1)); - ui->tool_default_webbrowser->setIcon( LXDG::findIcon("application-x-executable","") ); - }else{ - ui->tool_default_webbrowser->setText(file.name); - ui->tool_default_webbrowser->setIcon(LXDG::findIcon(file.icon,"") ); - } - }else if(tmp.isEmpty()){ - ui->tool_default_webbrowser->setText(tr("Click to Set")); - ui->tool_default_webbrowser->setIcon( LXDG::findIcon("system-help","") ); - }else{ - //Might be a binary - just print out the raw "path" - ui->tool_default_webbrowser->setText(tmp.section("/",-1)); - ui->tool_default_webbrowser->setIcon( LXDG::findIcon("application-x-executable","") ); - } - // - Default Email Client - tmp = LXDG::findDefaultAppForMime("application/email"); //appsettings->value("default/email", "").toString(); - if( !QFile::exists(tmp) && !LUtils::isValidBinary(tmp) ){ qDebug() << "Invalid Settings:" << tmp; tmp.clear(); } //invalid settings - if(tmp.endsWith(".desktop")){ - bool ok = false; - XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); - if(!ok || file.filePath.isEmpty()){ - //Might be a binary - just print out the raw "path" - ui->tool_default_email->setText(tmp.section("/",-1)); - ui->tool_default_email->setIcon( LXDG::findIcon("application-x-executable","") ); - }else{ - ui->tool_default_email->setText(file.name); - ui->tool_default_email->setIcon(LXDG::findIcon(file.icon,"") ); - } - }else if(tmp.isEmpty()){ - ui->tool_default_email->setText(tr("Click to Set")); - ui->tool_default_email->setIcon( LXDG::findIcon("system-help","") ); - }else{ - //Might be a binary - just print out the raw "path" - ui->tool_default_email->setText(tmp.section("/",-1)); - ui->tool_default_email->setIcon( LXDG::findIcon("application-x-executable","") ); - } - - //Now load the XDG mime defaults - ui->tree_defaults->clear(); - QStringList defMimeList = LXDG::listFileMimeDefaults(); - //qDebug() << "Mime List:\n" << defMimeList.join("\n"); - defMimeList.sort(); //sort by group/mime - //Now fill the tree by group/mime - QTreeWidgetItem *group = new QTreeWidgetItem(0); //nothing at the moment - QString ccat; - for(int i=0; i<defMimeList.length(); i++){ - //Get the info from this entry - QString mime = defMimeList[i].section("::::",0,0); - QString cat = mime.section("/",0,0); - QString extlist = defMimeList[i].section("::::",1,1); - QString def = defMimeList[i].section("::::",2,2); - QString comment = defMimeList[i].section("::::",3,50); - //Now check if this is a new category - if(ccat!=cat){ - //New group - group = new QTreeWidgetItem(0); - group->setText(0, cat); //add translations for known/common groups later - ui->tree_defaults->addTopLevelItem(group); - ccat = cat; - } - //Now create the entry - QTreeWidgetItem *it = new QTreeWidgetItem(); - it->setWhatsThis(0,mime); // full mimetype - it->setText(0, QString(tr("%1 (%2)")).arg(mime.section("/",-1), extlist) ); - it->setText(2,comment); - it->setToolTip(0, comment); it->setToolTip(1,comment); - //Now load the default (if there is one) - it->setWhatsThis(1,def); //save for later - if(def.endsWith(".desktop")){ - bool ok = false; - XDGDesktop file = LXDG::loadDesktopFile(def, ok); - if(!ok || file.filePath.isEmpty()){ - //Might be a binary - just print out the raw "path" - it->setText(1,def.section("/",-1)); - it->setIcon(1, LXDG::findIcon("application-x-executable","") ); - }else{ - it->setText(1, file.name); - it->setIcon(1, LXDG::findIcon(file.icon,"") ); - } - }else if(!def.isEmpty()){ - //Binary/Other default - it->setText(1, def.section("/",-1)); - it->setIcon(1, LXDG::findIcon("application-x-executable","") ); - } - group->addChild(it); - } - - ui->tree_defaults->sortItems(0,Qt::AscendingOrder); - - checkdefaulticons(); -} - -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++){ - //Clear it in the back end - LXDG::setDefaultAppForMime(list[i]->whatsThis(0), ""); - //Now clear it in the UI - 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++){ - //Set it in the back end - LXDG::setDefaultAppForMime(list[i]->whatsThis(0), desk.filePath); - //Set it in the UI - list[i]->setWhatsThis(1,desk.filePath); //app path - list[i]->setIcon(1,LXDG::findIcon(desk.icon,"")); //reset the icon - list[i]->setText(1,desk.name); //reset the name - } - //ui->push_save->setEnabled(true); - //moddef = true; -} - -void MainUI::setdefaultbinary(){ - 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 binary to use - QFileDialog dlg(this); - //dlg.setFilter(QDir::Executable | QDir::Files); //Does not work! Filters executable files as well as breaks browsing capabilities - dlg.setFileMode(QFileDialog::ExistingFile); - dlg.setDirectory( LOS::AppPrefix()+"bin" ); - dlg.setWindowTitle(tr("Select Binary")); - if( !dlg.exec() || dlg.selectedFiles().isEmpty() ){ - return; //cancelled - } - QString path = dlg.selectedFiles().first(); - //Make sure it is executable - if( !QFileInfo(path).isExecutable()){ - QMessageBox::warning(this, tr("Invalid Binary"), tr("The selected binary is not executable!")); - return; - } - //Now set the items - for(int i=0; i<list.length(); i++){ - //Set it in the back end - LXDG::setDefaultAppForMime(list[i]->whatsThis(0), path); - //Set it in the UI - list[i]->setWhatsThis(1,path); //app path - list[i]->setIcon(1,LXDG::findIcon("application-x-executable","")); //clear the icon - list[i]->setText(1,path.section("/",-1)); //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_setbin->setEnabled(it!=0); -} - -//=========== -// Session Page -//=========== -void MainUI::loadSessionSettings(){ - QStringList FB = readFile(QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/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 - STARTAPPS = LXDG::findAutoStartFiles(true); //also want invalid/disabled items - //qDebug() << "StartApps:"; - ui->list_session_start->clear(); - for(int i=0; i<STARTAPPS.length(); i++){ - //qDebug() << STARTAPPS[i].filePath +" -> " +STARTAPPS[i].name << STARTAPPS[i].isHidden; - if( !LXDG::checkValidity(STARTAPPS[i],false) || !QFile::exists(STARTAPPS[i].filePath) ){ continue; } - QListWidgetItem *it = new QListWidgetItem( LXDG::findIcon(STARTAPPS[i].icon,"application-x-executable"), STARTAPPS[i].name ); - it->setWhatsThis(STARTAPPS[i].filePath); //keep the file location - it->setToolTip(STARTAPPS[i].comment); - if(STARTAPPS[i].isHidden){ it->setCheckState( Qt::Unchecked); } - else{it->setCheckState( Qt::Checked); } - 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() ); - ui->push_session_setUserIcon->setIcon( LXDG::findIcon(QDir::homePath()+"/.loginIcon.png", "user-identity") ); - ui->line_session_time->setText( sessionsettings->value("TimeFormat","").toString() ); - ui->line_session_date->setText( sessionsettings->value("DateFormat","").toString() ); - index = ui->combo_session_datetimeorder->findData( sessionsettings->value("DateTimeOrder","timeonly").toString() ); - ui->combo_session_datetimeorder->setCurrentIndex(index); - - //Now do the localization settings - val = sessionsettings->value("InitLocale/LANG", "").toString(); - index = ui->combo_locale_lang->findData(val); - if(index<0){ index = 0; } //system default - ui->combo_locale_lang->setCurrentIndex(index); - val = sessionsettings->value("InitLocale/LC_MESSAGES", "").toString(); - index = ui->combo_locale_message->findData(val); - if(index<0){ index = 0; } //system default - ui->combo_locale_message->setCurrentIndex(index); - val = sessionsettings->value("InitLocale/LC_TIME", "").toString(); - index = ui->combo_locale_time->findData(val); - if(index<0){ index = 0; } //system default - ui->combo_locale_time->setCurrentIndex(index); - val = sessionsettings->value("InitLocale/NUMERIC", "").toString(); - index = ui->combo_locale_numeric->findData(val); - if(index<0){ index = 0; } //system default - ui->combo_locale_numeric->setCurrentIndex(index); - val = sessionsettings->value("InitLocale/MONETARY", "").toString(); - index = ui->combo_locale_monetary->findData(val); - if(index<0){ index = 0; } //system default - ui->combo_locale_monetary->setCurrentIndex(index); - val = sessionsettings->value("InitLocale/COLLATE", "").toString(); - index = ui->combo_locale_collate->findData(val); - if(index<0){ index = 0; } //system default - ui->combo_locale_collate->setCurrentIndex(index); - val = sessionsettings->value("InitLocale/CTYPE", "").toString(); - index = ui->combo_locale_ctype->findData(val); - if(index<0){ index = 0; } //system default - ui->combo_locale_ctype->setCurrentIndex(index); - - //Now do the session theme options - ui->combo_session_themefile->clear(); - ui->combo_session_colorfile->clear(); - ui->combo_session_icontheme->clear(); - QStringList current = LTHEME::currentSettings(); - // - local theme templates - QStringList tmp = LTHEME::availableLocalThemes(); - tmp.sort(); - for(int i=0; i<tmp.length(); i++){ - ui->combo_session_themefile->addItem(tmp[i].section("::::",0,0)+" ("+tr("Local")+")", tmp[i].section("::::",1,1)); - if(tmp[i].section("::::",1,1)==current[0]){ ui->combo_session_themefile->setCurrentIndex(ui->combo_session_themefile->count()-1); } - } - // - system theme templates - tmp = LTHEME::availableSystemThemes(); - tmp.sort(); - for(int i=0; i<tmp.length(); i++){ - ui->combo_session_themefile->addItem(tmp[i].section("::::",0,0)+" ("+tr("System")+")", tmp[i].section("::::",1,1)); - if(tmp[i].section("::::",1,1)==current[0]){ ui->combo_session_themefile->setCurrentIndex(ui->combo_session_themefile->count()-1); } - } - // - local color schemes - tmp = LTHEME::availableLocalColors(); - tmp.sort(); - for(int i=0; i<tmp.length(); i++){ - ui->combo_session_colorfile->addItem(tmp[i].section("::::",0,0)+" ("+tr("Local")+")", tmp[i].section("::::",1,1)); - if(tmp[i].section("::::",1,1)==current[1]){ ui->combo_session_colorfile->setCurrentIndex(ui->combo_session_colorfile->count()-1); } - } - // - system color schemes - tmp = LTHEME::availableSystemColors(); - tmp.sort(); - for(int i=0; i<tmp.length(); i++){ - ui->combo_session_colorfile->addItem(tmp[i].section("::::",0,0)+" ("+tr("System")+")", tmp[i].section("::::",1,1)); - if(tmp[i].section("::::",1,1)==current[1]){ ui->combo_session_colorfile->setCurrentIndex(ui->combo_session_colorfile->count()-1); } - } - // - icon themes - tmp = LTHEME::availableSystemIcons(); - tmp.sort(); - for(int i=0; i<tmp.length(); i++){ - ui->combo_session_icontheme->addItem(tmp[i]); - if(tmp[i]==current[2]){ ui->combo_session_icontheme->setCurrentIndex(i); } - } - // - Font - ui->font_session_theme->setCurrentFont( QFont(current[3]) ); - // - Font Size - ui->spin_session_fontsize->setValue( current[4].section("p",0,0).toInt() ); - - int cur = ui->combo_session_cursortheme->findText( LTHEME::currentCursor() ); - if(cur>=0){ ui->combo_session_cursortheme->setCurrentIndex(cur); } - - //sessionstartchanged(); //make sure to update buttons - sessionLoadTimeSample(); - sessionLoadDateSample(); - sessionCursorChanged(); -} - -void MainUI::saveSessionSettings(){ - //Do the fluxbox settings first - QStringList FB = readFile(QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/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(QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/fluxbox-init", FB); - if(!ok){ qDebug() << "Warning: Could not save ~/.lumina/fluxbox-init"; } - - //Now do the start apps - bool newstartapps = false; - for(int i=0; i<ui->list_session_start->count(); i++){ - QString file = ui->list_session_start->item(i)->whatsThis(); - bool enabled = ui->list_session_start->item(i)->checkState()==Qt::Checked; - bool found = false; - for(int i=0; i<STARTAPPS.length(); i++){ - if(STARTAPPS[i].filePath==file){ - found = true; - if(enabled != !STARTAPPS[i].isHidden){ - //value is different - qDebug() << "Setting Autostart:" << enabled << STARTAPPS[i].filePath; - LXDG::setAutoStarted(enabled, STARTAPPS[i]); - } - break; - } - } - if(!found && enabled){ - //New file/binary/app - qDebug() << "Adding new AutoStart File:" << file; - LXDG::setAutoStarted(enabled, file); - newstartapps = true; - } - } - - - - if( !ui->push_session_setUserIcon->whatsThis().isEmpty()){ - QString filepath = ui->push_session_setUserIcon->whatsThis(); - if(filepath.isEmpty()){ filepath = QDir::homePath()+"/.loginIcon.png"; } - if(filepath=="reset"){ - QFile::remove(QDir::homePath()+"/.loginIcon.png"); - }else{ - QPixmap pix(filepath); - //Now scale it down if necessary - if(pix.width() > 64 || pix.height()>64){ - pix = pix.scaled(64,64,Qt::KeepAspectRatio, Qt::SmoothTransformation); - } - //Now save that to the icon file (will automatically convert it to a PNG file format) - pix.save(QDir::homePath()+"/.loginIcon.png"); - } - ui->push_session_setUserIcon->setWhatsThis(""); //clear it for later - //Now touch the settings file so that it re-loads the panel - QProcess::startDetached("touch \""+settings->fileName()+"\""); - } - - //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()); - sessionsettings->setValue("TimeFormat", ui->line_session_time->text()); - sessionsettings->setValue("DateFormat", ui->line_session_date->text()); - sessionsettings->setValue("DateTimeOrder", ui->combo_session_datetimeorder->currentData().toString()); - - //Now do the locale settings - sessionsettings->setValue("InitLocale/LANG", ui->combo_locale_lang->currentData().toString() ); - sessionsettings->setValue("InitLocale/LC_MESSAGES", ui->combo_locale_message->currentData().toString() ); - sessionsettings->setValue("InitLocale/LC_TIME", ui->combo_locale_time->currentData().toString() ); - sessionsettings->setValue("InitLocale/LC_NUMERIC", ui->combo_locale_numeric->currentData().toString() ); - sessionsettings->setValue("InitLocale/LC_MONETARY", ui->combo_locale_monetary->currentData().toString() ); - sessionsettings->setValue("InitLocale/LC_COLLATE", ui->combo_locale_collate->currentData().toString() ); - sessionsettings->setValue("InitLocale/LC_CTYPE", ui->combo_locale_ctype->currentData().toString() ); - - - //Now do the theme options - QString themefile = ui->combo_session_themefile->itemData( ui->combo_session_themefile->currentIndex() ).toString(); - QString colorfile = ui->combo_session_colorfile->itemData( ui->combo_session_colorfile->currentIndex() ).toString(); - QString iconset = ui->combo_session_icontheme->currentText(); - QString font = ui->font_session_theme->currentFont().family(); - QString fontsize = QString::number(ui->spin_session_fontsize->value())+"pt"; - //qDebug() << "Saving theme options:" << themefile << colorfile << iconset << font << fontsize; - LTHEME::setCurrentSettings( themefile, colorfile, iconset, font, fontsize); - LTHEME::setCursorTheme(ui->combo_session_cursortheme->currentText()); - if(newstartapps){ loadSessionSettings(); } //make sure to re-load the session settings to catch the new files -} - -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(desk.filePath); - it->setToolTip(desk.comment); - it->setCheckState(Qt::Checked); - - ui->list_session_start->addItem(it); - ui->list_session_start->setCurrentItem(it); - sessionoptchanged(); -} - -void MainUI::addsessionstartbin(){ - QString chkpath = LOS::AppPrefix() + "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 - it->setToolTip(bin); - it->setCheckState(Qt::Checked); - 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::findMimeIcon(bin), bin.section("/",-1) ); - it->setWhatsThis(bin); //file to be saved/run - it->setToolTip(bin); - it->setCheckState(Qt::Checked); - 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::sessionthemechanged(){ - //Update the Fluxbox Theme preview - QString previewfile = ui->combo_session_wtheme->itemData( ui->combo_session_wtheme->currentIndex() ).toString(); - previewfile.append( (previewfile.endsWith("/") ? "preview.jpg": "/preview.jpg") ); - if(QFile::exists(previewfile)){ - ui->label_session_wpreview->setPixmap(QPixmap(previewfile)); - }else{ - ui->label_session_wpreview->setText(tr("No Preview Available")); - } - sessionoptchanged(); -} - -void MainUI::sessionCursorChanged(){ - //Update the Cursor Theme preview - QStringList info = LTHEME::cursorInformation(ui->combo_session_cursortheme->currentText()); - // - info format: [name, comment. sample file] - qDebug() << "Cursor Information:" << ui->combo_session_cursortheme->currentText() << info; - QPixmap img(info[2]); - //qDebug() << "Image Data:" << img.isNull() << img.size(); - if(!img.isNull()){ - ui->label_cursor_sample->setPixmap( img.scaledToHeight(ui->label_cursor_sample->height(), Qt::SmoothTransformation) ); - } - ui->label_cursor_sample->setToolTip(info[1]); - ui->combo_session_cursortheme->setToolTip(info[1]); - sessionoptchanged(); -} - -void MainUI::sessionEditColor(){ - //Get the current color file - QString file = ui->combo_session_colorfile->itemData( ui->combo_session_colorfile->currentIndex() ).toString(); - //Open the color edit dialog - ColorDialog dlg(this, PINFO, file); - dlg.exec(); - //Check whether the file got saved/changed - if(dlg.colorname.isEmpty() || dlg.colorpath.isEmpty() ){ return; } //cancelled - //Reload the color list and activate the new color - // - local color schemes - ui->combo_session_colorfile->clear(); - QStringList tmp = LTHEME::availableLocalColors(); - tmp.sort(); - for(int i=0; i<tmp.length(); i++){ - ui->combo_session_colorfile->addItem(tmp[i].section("::::",0,0)+" ("+tr("Local")+")", tmp[i].section("::::",1,1)); - if(tmp[i].section("::::",1,1)==dlg.colorpath){ ui->combo_session_colorfile->setCurrentIndex(ui->combo_session_colorfile->count()-1); } - } - // - system color schemes - tmp = LTHEME::availableSystemColors(); - tmp.sort(); - for(int i=0; i<tmp.length(); i++){ - ui->combo_session_colorfile->addItem(tmp[i].section("::::",0,0)+" ("+tr("System")+")", tmp[i].section("::::",1,1)); - if(tmp[i].section("::::",1,1)==dlg.colorpath){ ui->combo_session_colorfile->setCurrentIndex(ui->combo_session_colorfile->count()-1); } - } - -} - -void MainUI::sessionEditTheme(){ - QString file = ui->combo_session_themefile->itemData( ui->combo_session_themefile->currentIndex() ).toString(); - //Open the theme editor dialog - ThemeDialog dlg(this, PINFO, file); - dlg.exec(); - //Check for file change/save - if(dlg.themename.isEmpty() || dlg.themepath.isEmpty()){ return; } //cancelled - //Reload the theme list and activate the new theme - ui->combo_session_themefile->clear(); - // - local theme templates - QStringList tmp = LTHEME::availableLocalThemes(); - tmp.sort(); - for(int i=0; i<tmp.length(); i++){ - ui->combo_session_themefile->addItem(tmp[i].section("::::",0,0)+" ("+tr("Local")+")", tmp[i].section("::::",1,1)); - if(tmp[i].section("::::",1,1)==dlg.themepath){ ui->combo_session_themefile->setCurrentIndex(ui->combo_session_themefile->count()-1); } - } - // - system theme templates - tmp = LTHEME::availableSystemThemes(); - tmp.sort(); - for(int i=0; i<tmp.length(); i++){ - ui->combo_session_themefile->addItem(tmp[i].section("::::",0,0)+" ("+tr("System")+")", tmp[i].section("::::",1,1)); - if(tmp[i].section("::::",1,1)==dlg.themepath){ ui->combo_session_themefile->setCurrentIndex(ui->combo_session_themefile->count()-1); } - } -} - -void MainUI::sessionChangeUserIcon(){ - //Prompt for a new image file - QStringList imgformats; - QList<QByteArray> fmts = QImageReader::supportedImageFormats(); - for(int i=0; i<fmts.length(); i++){ - imgformats << "*."+QString(fmts[i]); - } - QString filepath = QFileDialog::getOpenFileName(this, tr("Select an image"), QDir::homePath(), \ - tr("Images")+" ("+imgformats.join(" ")+")"); - if(filepath.isEmpty()){ - //User cancelled the operation - if(QFile::exists(QDir::homePath()+"/.loginIcon.png")){ - if(QMessageBox::Yes == QMessageBox::question(this,tr("Reset User Image"), tr("Would you like to reset the user image to the system default?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ){ - //QFile::remove(QDir::homePath()+"/.loginIcon.png"); - ui->push_session_setUserIcon->setWhatsThis("reset"); - }else{ - return; - } - } - }else{ - ui->push_session_setUserIcon->setWhatsThis(filepath); - } - //Now re-load the icon in the UI - QString path = ui->push_session_setUserIcon->whatsThis(); - if(path.isEmpty()){ path = QDir::homePath()+"/.loginIcon.png"; } - if(path=="reset"){ path.clear(); } - ui->push_session_setUserIcon->setIcon( LXDG::findIcon(path, "user-identity") ); - sessionoptchanged(); -} - -void MainUI::sessionResetSys(){ - LUtils::LoadSystemDefaults(); - QTimer::singleShot(500,this, SLOT(loadCurrentSettings()) ); -} - -void MainUI::sessionResetLumina(){ - LUtils::LoadSystemDefaults(true); //skip OS customizations - QTimer::singleShot(500,this, SLOT(loadCurrentSettings()) ); -} - -void MainUI::sessionLoadTimeSample(){ - if(ui->line_session_time->text().simplified().isEmpty()){ - ui->label_session_timesample->setText( QTime::currentTime().toString(Qt::DefaultLocaleShortDate) ); - }else{ - ui->label_session_timesample->setText( QTime::currentTime().toString( ui->line_session_time->text() ) ); - } - sessionoptchanged(); -} - -void MainUI::sessionShowTimeCodes(){ - QStringList msg; - msg << tr("Valid Time Codes:") << "\n"; - msg << QString(tr("%1: Hour without leading zero (1)")).arg("h"); - msg << QString(tr("%1: Hour with leading zero (01)")).arg("hh"); - msg << QString(tr("%1: Minutes without leading zero (2)")).arg("m"); - msg << QString(tr("%1: Minutes with leading zero (02)")).arg("mm"); - msg << QString(tr("%1: Seconds without leading zero (3)")).arg("s"); - msg << QString(tr("%1: Seconds with leading zero (03)")).arg("ss"); - msg << QString(tr("%1: AM/PM (12-hour) clock (upper or lower case)")).arg("A or a"); - msg << QString(tr("%1: Timezone")).arg("t"); - QMessageBox::information(this, tr("Time Codes"), msg.join("\n") ); -} - -void MainUI::sessionLoadDateSample(){ - if(ui->line_session_date->text().simplified().isEmpty()){ - ui->label_session_datesample->setText( QDate::currentDate().toString(Qt::DefaultLocaleShortDate) ); - }else{ - ui->label_session_datesample->setText( QDate::currentDate().toString( ui->line_session_date->text() ) ); - } - sessionoptchanged(); -} - -void MainUI::sessionShowDateCodes(){ - QStringList msg; - msg << tr("Valid Date Codes:") << "\n"; - msg << QString(tr("%1: Numeric day without a leading zero (1)")).arg("d"); - msg << QString(tr("%1: Numeric day with leading zero (01)")).arg("dd"); - msg << QString(tr("%1: Day as abbreviation (localized)")).arg("ddd"); - msg << QString(tr("%1: Day as full name (localized)")).arg("dddd"); - msg << QString(tr("%1: Numeric month without leading zero (2)")).arg("M"); - msg << QString(tr("%1: Numeric month with leading zero (02)")).arg("MM"); - msg << QString(tr("%1: Month as abbreviation (localized)")).arg("MMM"); - msg << QString(tr("%1: Month as full name (localized)")).arg("MMMM"); - msg << QString(tr("%1: Year as 2-digit number (15)")).arg("yy"); - msg << QString(tr("%1: Year as 4-digit number (2015)")).arg("yyyy"); - msg << tr("Text may be contained within single-quotes to ignore replacements"); - QMessageBox::information(this, tr("Date Codes"), msg.join("\n") ); -} diff --git a/src-qt5/core-utils/lumina-config/mainUI.h b/src-qt5/core-utils/lumina-config/mainUI.h deleted file mode 100644 index da267948..00000000 --- a/src-qt5/core-utils/lumina-config/mainUI.h +++ /dev/null @@ -1,171 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2014-2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_CONFIG_MAIN_UI_H -#define _LUMINA_CONFIG_MAIN_UI_H - -// Qt includes -#include <QMainWindow> -#include <QDir> -#include <QDesktopWidget> -#include <QSettings> -#include <QStringList> -#include <QString> -#include <QIcon> -#include <QTimer> -#include <QFileDialog> -#include <QFile> -#include <QTextStream> -#include <QMessageBox> -#include <QColorDialog> -#include <QColor> -#include <QInputDialog> -#include <QListWidgetItem> - -// libLumina includes -#include <LuminaXDG.h> -#include <LuminaThemes.h> - -// local includes -#include "LPlugins.h" -//#include "KeyCatch.h" -#include "AppDialog.h" -#include "ColorDialog.h" -#include "ThemeDialog.h" -#include "GetPluginDialog.h" -#include "PanelWidget.h" - -//namespace for using the *.ui file -namespace Ui{ - class MainUI; -}; - -class MainUI : public QMainWindow{ - Q_OBJECT -public: - MainUI(); - ~MainUI(); - - //Panels Page simplifications - QString getColorStyle(QString current, bool allowTransparency = true); - - //Get an application on the system - XDGDesktop getSysApp(bool allowreset = false); - -private: - Ui::MainUI *ui; //the *.ui file access - QSettings *settings, *appsettings, *sessionsettings; - QDesktopWidget *desktop; - LPlugins *PINFO; - QMenu *ppmenu, *mpmenu; - QString panelcolor; - QString DEFAULTBG; - QList<XDGDesktop> sysApps; - QList<XDGDesktop> STARTAPPS; - bool loading, panadjust; - bool moddesk, modpan, modmenu, modshort, moddef, modses; //page modified flags - int panelnumber; - QList<PanelWidget*> PANELS; - - //General purpose functions (not connected to buttons) - void setupMenus(); //called during initialization - void setupConnections(); //called during intialization - - int currentDesktop(); //the number for the current desktop - - //Convert to/from fluxbox keyboard shortcuts - QString dispToFluxKeys(QString); - QString fluxToDispKeys(QString); - - //Read/overwrite a text file - QStringList readFile(QString path); - bool overwriteFile(QString path, QStringList contents); - -public slots: - void setupIcons(); //called during initialization - -private slots: - void slotSingleInstance(); - - //General UI Behavior - void slotChangePage(bool enabled); - void slotChangeScreen(); - void saveAndQuit(); - - //General Utility Functions - void loadCurrentSettings(bool screenonly = false); - void saveCurrentSettings(bool screenonly = false); - - //Desktop Page - //void deskplugchanged(); - void deskbgchanged(); - void desktimechanged(); - void deskbgremoved(); - void deskbgadded(); - void deskbgcoloradded(); - void deskbgdiradded(); - void deskbgdirradded(); - void deskplugadded(); - void deskplugremoved(); - - - //Panels Page - void panelValChanged(); - void newPanel(); - void removePanel(int); //connected to a signal from the panel widget - void loadPanels(); - void savePanels(); - - //Menu Page/Tab - void addmenuplugin(); - void rmmenuplugin(); - void upmenuplugin(); - void downmenuplugin(); - void checkmenuicons(); - - //Shortcuts Page - void loadKeyboardShortcuts(); - void saveKeyboardShortcuts(); - void clearKeyBinding(); - void applyKeyBinding(); - void updateKeyConfig(); - //void getKeyPress(); - - //Defaults Page - void changeDefaultBrowser(); - void changeDefaultEmail(); - void changeDefaultFileManager(); - void changeDefaultTerminal(); - void loadDefaultSettings(); - //void saveDefaultSettings(); - void cleardefaultitem(); - void setdefaultitem(); - void setdefaultbinary(); - void checkdefaulticons(); - - //Session Page - void loadSessionSettings(); - void saveSessionSettings(); - void rmsessionstartitem(); - void addsessionstartapp(); - void addsessionstartbin(); - void addsessionstartfile(); - void sessionoptchanged(); - void sessionthemechanged(); - void sessionCursorChanged(); - //void sessionstartchanged(); - void sessionEditColor(); - void sessionEditTheme(); - void sessionChangeUserIcon(); - void sessionResetSys(); - void sessionResetLumina(); - void sessionLoadTimeSample(); - void sessionShowTimeCodes(); - void sessionLoadDateSample(); - void sessionShowDateCodes(); -}; - -#endif diff --git a/src-qt5/core-utils/lumina-config/mainUI.ui b/src-qt5/core-utils/lumina-config/mainUI.ui deleted file mode 100644 index 9edff2e7..00000000 --- a/src-qt5/core-utils/lumina-config/mainUI.ui +++ /dev/null @@ -1,1792 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>MainUI</class> - <widget class="QMainWindow" name="MainUI"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>660</width> - <height>448</height> - </rect> - </property> - <property name="windowTitle"> - <string>Lumina Settings</string> - </property> - <property name="animated"> - <bool>true</bool> - </property> - <property name="documentMode"> - <bool>false</bool> - </property> - <property name="unifiedTitleAndToolBarOnMac"> - <bool>false</bool> - </property> - <widget class="QWidget" name="centralwidget"> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="spacing"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <item> - <widget class="QFrame" name="group_screen"> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <layout class="QHBoxLayout" name="horizontalLayout_18"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>1</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>1</number> - </property> - <item> - <spacer name="horizontalSpacer_3"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>195</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QLabel" name="label_screen"> - <property name="text"> - <string>Screen Number:</string> - </property> - </widget> - </item> - <item> - <widget class="QSpinBox" name="spin_screen"> - <property name="minimum"> - <number>1</number> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_4"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QStackedWidget" name="stackedWidget"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="frameShape"> - <enum>QFrame::StyledPanel</enum> - </property> - <property name="currentIndex"> - <number>4</number> - </property> - <widget class="QWidget" name="page_desktop"> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <property name="leftMargin"> - <number>3</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>2</number> - </property> - <item> - <widget class="QTabWidget" name="tabWidget_desktop"> - <property name="currentIndex"> - <number>0</number> - </property> - <widget class="QWidget" name="tab_wallpaper"> - <attribute name="title"> - <string>Wallpaper</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_16"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_4"> - <item> - <widget class="QToolButton" name="tool_desk_addbg"> - <property name="text"> - <string notr="true"/> - </property> - <property name="popupMode"> - <enum>QToolButton::InstantPopup</enum> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_desk_rmbg"> - <property name="text"> - <string notr="true">rm</string> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="combo_desk_bg"/> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_5"> - <item> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <widget class="Line" name="line_4"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_desk_res"> - <property name="text"> - <string notr="true">(Resolution)</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - <property name="wordWrap"> - <bool>false</bool> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QRadioButton" name="radio_desk_single"> - <property name="text"> - <string>Single Background</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QRadioButton" name="radio_desk_multi"> - <property name="text"> - <string>Rotate Background</string> - </property> - </widget> - </item> - <item> - <widget class="QSpinBox" name="spin_desk_min"> - <property name="suffix"> - <string> Minutes</string> - </property> - <property name="prefix"> - <string>Every </string> - </property> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>120</number> - </property> - <property name="value"> - <number>5</number> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line_3"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_26"> - <property name="text"> - <string>Layout:</string> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="combo_desk_layout"/> - </item> - <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item> - <widget class="QLabel" name="label_desk_bgview"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="frameShape"> - <enum>QFrame::StyledPanel</enum> - </property> - <property name="text"> - <string notr="true">BG-sample</string> - </property> - <property name="scaledContents"> - <bool>false</bool> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - <widget class="QWidget" name="tab_themes"> - <attribute name="title"> - <string>Theme</string> - </attribute> - <layout class="QFormLayout" name="formLayout_5"> - <item row="0" column="0"> - <widget class="QLabel" name="label_12"> - <property name="text"> - <string>Font:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QFontComboBox" name="font_session_theme"> - <property name="editable"> - <bool>false</bool> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_14"> - <property name="text"> - <string>Font Size:</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QSpinBox" name="spin_session_fontsize"> - <property name="suffix"> - <string> point</string> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_16"> - <property name="text"> - <string>Theme Template:</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <layout class="QHBoxLayout" name="horizontalLayout_12"> - <item> - <widget class="QComboBox" name="combo_session_themefile"> - <property name="sizeAdjustPolicy"> - <enum>QComboBox::AdjustToContents</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_session_newtheme"> - <property name="toolTip"> - <string>Create/Edit a theme template (Advanced)</string> - </property> - <property name="statusTip"> - <string/> - </property> - <property name="text"> - <string>Edit</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - </layout> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="label_17"> - <property name="text"> - <string>Color Scheme:</string> - </property> - </widget> - </item> - <item row="3" column="1"> - <layout class="QHBoxLayout" name="horizontalLayout_19"> - <item> - <widget class="QComboBox" name="combo_session_colorfile"> - <property name="sizeAdjustPolicy"> - <enum>QComboBox::AdjustToContents</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_session_newcolor"> - <property name="toolTip"> - <string>Create/Edit a color scheme</string> - </property> - <property name="statusTip"> - <string/> - </property> - <property name="text"> - <string>Edit</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - </layout> - </item> - <item row="4" column="0"> - <widget class="QLabel" name="label_18"> - <property name="text"> - <string>Icon Pack:</string> - </property> - </widget> - </item> - <item row="4" column="1"> - <widget class="QComboBox" name="combo_session_icontheme"/> - </item> - <item row="5" column="0"> - <widget class="QLabel" name="label_31"> - <property name="text"> - <string>Mouse Cursors:</string> - </property> - </widget> - </item> - <item row="5" column="1"> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QComboBox" name="combo_session_cursortheme"> - <property name="sizePolicy"> - <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_cursor_sample"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="toolTip"> - <string notr="true"/> - </property> - <property name="text"> - <string notr="true"/> - </property> - <property name="scaledContents"> - <bool>true</bool> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_panels"> - <layout class="QVBoxLayout" name="verticalLayout_17"> - <property name="leftMargin"> - <number>3</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="rightMargin"> - <number>3</number> - </property> - <property name="bottomMargin"> - <number>2</number> - </property> - <item> - <widget class="QTabWidget" name="tabWidget_panels"> - <property name="currentIndex"> - <number>1</number> - </property> - <widget class="QWidget" name="tab_desktopInterface"> - <attribute name="title"> - <string>Desktop</string> - </attribute> - <layout class="QGridLayout" name="gridLayout_3"> - <item row="0" column="0"> - <widget class="QLabel" name="label_10"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Quick-Access Menu</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item row="0" column="1" rowspan="5"> - <widget class="Line" name="line"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - </widget> - </item> - <item row="0" column="2" colspan="2"> - <widget class="QLabel" name="label_15"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Embedded Utilities</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item row="1" column="0" rowspan="2"> - <widget class="QListWidget" name="list_menu"/> - </item> - <item row="1" column="2" colspan="2"> - <widget class="QListWidget" name="list_desktop_plugins"> - <property name="selectionMode"> - <enum>QAbstractItemView::ExtendedSelection</enum> - </property> - <property name="sortingEnabled"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="2" column="3"> - <layout class="QHBoxLayout" name="horizontalLayout_6"> - <item> - <widget class="QToolButton" name="tool_desktop_addplugin"> - <property name="text"> - <string notr="true">add</string> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_desktop_rmplugin"> - <property name="text"> - <string notr="true">rem</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_5"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>10</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item row="3" column="0" rowspan="2"> - <layout class="QHBoxLayout" name="horizontalLayout_13"> - <item> - <widget class="QToolButton" name="tool_menu_add"> - <property name="text"> - <string notr="true">add</string> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_menu_rm"> - <property name="text"> - <string notr="true">rem</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_9"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QToolButton" name="tool_menu_up"> - <property name="text"> - <string notr="true">up</string> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_menu_dn"> - <property name="text"> - <string notr="true">dn</string> - </property> - </widget> - </item> - </layout> - </item> - <item row="4" column="3"> - <widget class="QCheckBox" name="check_desktop_autolaunchers"> - <property name="text"> - <string>Display Desktop Folder Contents</string> - </property> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="tab_panels"> - <attribute name="title"> - <string>Panels</string> - </attribute> - <layout class="QGridLayout" name="gridLayout_panels" rowstretch="0" columnstretch="0,0"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <property name="horizontalSpacing"> - <number>2</number> - </property> - <item row="0" column="0"> - <layout class="QVBoxLayout" name="verticalLayout_5"> - <item> - <widget class="QToolButton" name="tool_panels_add"> - <property name="text"> - <string notr="true">add</string> - </property> - </widget> - </item> - <item> - <spacer name="verticalSpacer_3"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item row="0" column="1"> - <widget class="QScrollArea" name="scroll_panels"> - <property name="sizeAdjustPolicy"> - <enum>QAbstractScrollArea::AdjustToContents</enum> - </property> - <property name="widgetResizable"> - <bool>true</bool> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> - </property> - <widget class="QWidget" name="scrollAreaWidgetContents_2"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>98</width> - <height>28</height> - </rect> - </property> - </widget> - </widget> - </item> - </layout> - </widget> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_shortcuts"> - <layout class="QVBoxLayout" name="verticalLayout_8"> - <property name="leftMargin"> - <number>3</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>2</number> - </property> - <item> - <widget class="QTreeWidget" name="tree_shortcut"> - <property name="indentation"> - <number>0</number> - </property> - <property name="rootIsDecorated"> - <bool>false</bool> - </property> - <property name="itemsExpandable"> - <bool>false</bool> - </property> - <property name="sortingEnabled"> - <bool>true</bool> - </property> - <property name="expandsOnDoubleClick"> - <bool>false</bool> - </property> - <attribute name="headerDefaultSectionSize"> - <number>200</number> - </attribute> - <attribute name="headerHighlightSections"> - <bool>true</bool> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>200</number> - </attribute> - <attribute name="headerShowSortIndicator" stdset="0"> - <bool>true</bool> - </attribute> - <column> - <property name="text"> - <string>Action</string> - </property> - </column> - <column> - <property name="text"> - <string>Keyboard Shortcut</string> - </property> - </column> - </widget> - </item> - <item> - <widget class="QGroupBox" name="group_shortcut_modify"> - <property name="title"> - <string>Modify Shortcut</string> - </property> - <layout class="QGridLayout" name="gridLayout_4"> - <property name="leftMargin"> - <number>3</number> - </property> - <property name="topMargin"> - <number>3</number> - </property> - <property name="rightMargin"> - <number>3</number> - </property> - <property name="bottomMargin"> - <number>3</number> - </property> - <item row="0" column="3"> - <widget class="QKeySequenceEdit" name="keyEdit_shortcut"/> - </item> - <item row="0" column="0"> - <widget class="QToolButton" name="tool_shortcut_clear"> - <property name="text"> - <string>Clear Shortcut</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item row="0" column="4"> - <widget class="QToolButton" name="tool_shortcut_set"> - <property name="text"> - <string>Apply Change</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item row="0" column="2"> - <widget class="QLabel" name="label_32"> - <property name="text"> - <string>Change Key Binding:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <spacer name="horizontalSpacer_10"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QLabel" name="label_11"> - <property name="text"> - <string>Note: Current key bindings need to be cleared and saved before they can be re-used.</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_defaults"> - <layout class="QVBoxLayout" name="verticalLayout_9"> - <property name="leftMargin"> - <number>3</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>2</number> - </property> - <item> - <widget class="QTabWidget" name="tabWidget_apps"> - <property name="currentIndex"> - <number>0</number> - </property> - <widget class="QWidget" name="tab_auto"> - <attribute name="title"> - <string>Auto-Started</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_19"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_17"> - <item> - <spacer name="horizontalSpacer_14"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QToolButton" name="tool_session_addapp"> - <property name="text"> - <string>Application</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_session_addbin"> - <property name="text"> - <string>Binary</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_session_addfile"> - <property name="text"> - <string>File</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QListWidget" name="list_session_start"> - <property name="sortingEnabled"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="tab_defaults"> - <attribute name="title"> - <string>File Defaults</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_6"> - <property name="leftMargin"> - <number>3</number> - </property> - <property name="topMargin"> - <number>3</number> - </property> - <property name="rightMargin"> - <number>3</number> - </property> - <property name="bottomMargin"> - <number>3</number> - </property> - <item> - <widget class="QGroupBox" name="group_default_filetypes"> - <property name="font"> - <font> - <italic>false</italic> - </font> - </property> - <property name="title"> - <string>Specific File Types</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout_15"> - <property name="leftMargin"> - <number>2</number> - </property> - <property name="rightMargin"> - <number>2</number> - </property> - <item> - <widget class="QTreeWidget" name="tree_defaults"> - <property name="iconSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="indentation"> - <number>20</number> - </property> - <property name="sortingEnabled"> - <bool>true</bool> - </property> - <property name="animated"> - <bool>true</bool> - </property> - <property name="allColumnsShowFocus"> - <bool>true</bool> - </property> - <attribute name="headerDefaultSectionSize"> - <number>200</number> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>150</number> - </attribute> - <column> - <property name="text"> - <string>Type/Group</string> - </property> - </column> - <column> - <property name="text"> - <string>Default Application</string> - </property> - </column> - <column> - <property name="text"> - <string>Description</string> - </property> - </column> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_16"> - <item> - <widget class="QToolButton" name="tool_defaults_clear"> - <property name="text"> - <string>Clear</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_13"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QToolButton" name="tool_defaults_set"> - <property name="text"> - <string>Set App</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_defaults_setbin"> - <property name="text"> - <string>Set Binary</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="tab_2"> - <attribute name="title"> - <string>Common Applications</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_7"> - <item> - <layout class="QGridLayout" name="gridLayout_6"> - <item row="0" column="0"> - <layout class="QFormLayout" name="formLayout_10"> - <property name="fieldGrowthPolicy"> - <enum>QFormLayout::ExpandingFieldsGrow</enum> - </property> - <item row="0" column="0"> - <widget class="QLabel" name="label_37"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Web Browser:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QToolButton" name="tool_default_webbrowser"> - <property name="text"> - <string notr="true">...</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_38"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>E-Mail Client:</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QToolButton" name="tool_default_email"> - <property name="text"> - <string notr="true">...</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - </layout> - </item> - <item row="0" column="1"> - <layout class="QFormLayout" name="formLayout_11"> - <item row="0" column="0"> - <widget class="QLabel" name="label_39"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>File Manager:</string> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_40"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Virtual Terminal:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QToolButton" name="tool_default_filemanager"> - <property name="text"> - <string>...</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QToolButton" name="tool_default_terminal"> - <property name="text"> - <string>...</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </item> - <item> - <spacer name="verticalSpacer_4"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_session"> - <layout class="QVBoxLayout" name="verticalLayout_10"> - <property name="leftMargin"> - <number>3</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>2</number> - </property> - <item> - <widget class="QTabWidget" name="tabWidget_session"> - <property name="toolTip"> - <string/> - </property> - <property name="currentIndex"> - <number>2</number> - </property> - <widget class="QWidget" name="tab"> - <attribute name="title"> - <string>General Options</string> - </attribute> - <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0"> - <layout class="QVBoxLayout" name="verticalLayout_4"> - <item> - <widget class="QCheckBox" name="check_session_numlock"> - <property name="text"> - <string>Enable numlock on startup</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="check_session_playloginaudio"> - <property name="text"> - <string>Play chimes on startup</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="check_session_playlogoutaudio"> - <property name="text"> - <string>Play chimes on exit</string> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_14"> - <item> - <widget class="QPushButton" name="push_session_setUserIcon"> - <property name="text"> - <string>Change User Icon</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_16"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - </layout> - </item> - <item row="6" column="0" colspan="2"> - <widget class="QGroupBox" name="groupBox_2"> - <property name="font"> - <font> - <weight>50</weight> - <bold>false</bold> - </font> - </property> - <property name="title"> - <string>Reset Desktop Settings</string> - </property> - <layout class="QHBoxLayout" name="horizontalLayout_20"> - <item> - <spacer name="horizontalSpacer_18"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="push_session_resetSysDefaults"> - <property name="text"> - <string>Return to system defaults</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="push_session_resetLuminaDefaults"> - <property name="text"> - <string>Return to Lumina defaults</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_17"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - </item> - <item row="0" column="1" rowspan="2"> - <layout class="QFormLayout" name="formLayout_3"> - <property name="fieldGrowthPolicy"> - <enum>QFormLayout::AllNonFixedFieldsGrow</enum> - </property> - <property name="labelAlignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - <item row="0" column="0"> - <widget class="QLabel" name="label_24"> - <property name="text"> - <string>Time Format:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <item> - <widget class="QLineEdit" name="line_session_time"/> - </item> - <item> - <widget class="QToolButton" name="tool_help_time"> - <property name="toolTip"> - <string>View format codes</string> - </property> - <property name="text"> - <string notr="true">...</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_28"> - <property name="text"> - <string>Sample:</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLabel" name="label_session_timesample"> - <property name="text"> - <string notr="true"/> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_25"> - <property name="text"> - <string>Date Format:</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <layout class="QHBoxLayout" name="horizontalLayout_21"> - <item> - <widget class="QLineEdit" name="line_session_date"/> - </item> - <item> - <widget class="QToolButton" name="tool_help_date"> - <property name="toolTip"> - <string>View format codes</string> - </property> - <property name="text"> - <string notr="true">...</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="label_29"> - <property name="text"> - <string>Sample:</string> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="3" column="1"> - <widget class="QLabel" name="label_session_datesample"> - <property name="text"> - <string notr="true"/> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item row="4" column="0"> - <widget class="QLabel" name="label_27"> - <property name="text"> - <string>Display Format</string> - </property> - </widget> - </item> - <item row="4" column="1"> - <widget class="QComboBox" name="combo_session_datetimeorder"/> - </item> - </layout> - </item> - <item row="1" column="0"> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>128</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - <widget class="QWidget" name="tab_locale"> - <attribute name="title"> - <string>Locale</string> - </attribute> - <layout class="QFormLayout" name="formLayout"> - <item row="1" column="0"> - <widget class="QLabel" name="label_3"> - <property name="text"> - <string>Language</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QComboBox" name="combo_locale_lang"/> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_4"> - <property name="text"> - <string>Messages</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QComboBox" name="combo_locale_message"/> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="label_5"> - <property name="text"> - <string>Time</string> - </property> - </widget> - </item> - <item row="3" column="1"> - <widget class="QComboBox" name="combo_locale_time"/> - </item> - <item row="4" column="0"> - <widget class="QLabel" name="label_7"> - <property name="text"> - <string>Numeric</string> - </property> - </widget> - </item> - <item row="4" column="1"> - <widget class="QComboBox" name="combo_locale_numeric"/> - </item> - <item row="5" column="0"> - <widget class="QLabel" name="label_8"> - <property name="text"> - <string>Monetary</string> - </property> - </widget> - </item> - <item row="5" column="1"> - <widget class="QComboBox" name="combo_locale_monetary"/> - </item> - <item row="6" column="0"> - <widget class="QLabel" name="label_9"> - <property name="text"> - <string>Collate</string> - </property> - </widget> - </item> - <item row="6" column="1"> - <widget class="QComboBox" name="combo_locale_collate"/> - </item> - <item row="7" column="0"> - <widget class="QLabel" name="label_23"> - <property name="text"> - <string>CType</string> - </property> - </widget> - </item> - <item row="7" column="1"> - <widget class="QComboBox" name="combo_locale_ctype"/> - </item> - <item row="0" column="0" colspan="2"> - <widget class="QLabel" name="label_30"> - <property name="text"> - <string>System localization settings (restart required)</string> - </property> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="tab_fluxbox"> - <attribute name="title"> - <string>Window System</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_14"> - <item> - <layout class="QFormLayout" name="formLayout_4"> - <item row="0" column="0"> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string>Number of Workspaces</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QSpinBox" name="spin_session_wkspaces"> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>10</number> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>New Window Placement</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QComboBox" name="combo_session_wloc"/> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_6"> - <property name="text"> - <string>Focus Policy</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QComboBox" name="combo_session_wfocus"/> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="label_13"> - <property name="text"> - <string>Window Theme</string> - </property> - </widget> - </item> - <item row="3" column="1"> - <widget class="QComboBox" name="combo_session_wtheme"/> - </item> - </layout> - </item> - <item> - <widget class="QGroupBox" name="group_session_preview"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title"> - <string>Window Theme Preview</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout_12"> - <item> - <widget class="QScrollArea" name="scrollArea"> - <property name="widgetResizable"> - <bool>true</bool> - </property> - <widget class="QWidget" name="scrollAreaWidgetContents"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>573</width> - <height>97</height> - </rect> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <layout class="QVBoxLayout" name="verticalLayout_13"> - <property name="leftMargin"> - <number>1</number> - </property> - <property name="topMargin"> - <number>1</number> - </property> - <property name="rightMargin"> - <number>1</number> - </property> - <property name="bottomMargin"> - <number>1</number> - </property> - <item> - <widget class="QLabel" name="label_session_wpreview"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="styleSheet"> - <string notr="true"/> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Sunken</enum> - </property> - <property name="text"> - <string>No Preview Available</string> - </property> - <property name="scaledContents"> - <bool>false</bool> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - </layout> - </widget> - </widget> - </item> - </layout> - </widget> - </item> - </layout> - </widget> - </widget> - </item> - </layout> - </widget> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="topMargin"> - <number>4</number> - </property> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="push_save"> - <property name="text"> - <string>Save Changes</string> - </property> - <property name="shortcut"> - <string>Ctrl+S</string> - </property> - <property name="flat"> - <bool>false</bool> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - </layout> - </widget> - <widget class="QToolBar" name="toolBar"> - <property name="minimumSize"> - <size> - <width>120</width> - <height>0</height> - </size> - </property> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> - </property> - <property name="windowTitle"> - <string>toolBar</string> - </property> - <property name="movable"> - <bool>false</bool> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextUnderIcon</enum> - </property> - <property name="floatable"> - <bool>false</bool> - </property> - <attribute name="toolBarArea"> - <enum>TopToolBarArea</enum> - </attribute> - <attribute name="toolBarBreak"> - <bool>false</bool> - </attribute> - <addaction name="actionDesktop"/> - <addaction name="actionPanels"/> - <addaction name="actionDefaults"/> - <addaction name="actionShortcuts"/> - <addaction name="actionSession"/> - </widget> - <action name="actionDesktop"> - <property name="checkable"> - <bool>true</bool> - </property> - <property name="text"> - <string>Appearance</string> - </property> - <property name="iconText"> - <string> Appearance </string> - </property> - <property name="toolTip"> - <string>Desktop Appearance</string> - </property> - </action> - <action name="actionPanels"> - <property name="checkable"> - <bool>true</bool> - </property> - <property name="text"> - <string> Interface </string> - </property> - <property name="iconText"> - <string> Interface </string> - </property> - <property name="toolTip"> - <string>Interface Configuration</string> - </property> - </action> - <action name="actionSession"> - <property name="checkable"> - <bool>true</bool> - </property> - <property name="text"> - <string> Session </string> - </property> - <property name="iconText"> - <string> Session </string> - </property> - <property name="toolTip"> - <string>Session Options</string> - </property> - </action> - <action name="actionDefaults"> - <property name="checkable"> - <bool>true</bool> - </property> - <property name="text"> - <string>Applications</string> - </property> - <property name="iconText"> - <string> Applications </string> - </property> - <property name="toolTip"> - <string>Application Management</string> - </property> - </action> - <action name="actionShortcuts"> - <property name="checkable"> - <bool>true</bool> - </property> - <property name="text"> - <string>Shortcuts</string> - </property> - <property name="iconText"> - <string> Shortcuts </string> - </property> - <property name="toolTip"> - <string>Keyboard Shortcuts</string> - </property> - </action> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src-qt5/core-utils/lumina-config/mainWindow.cpp b/src-qt5/core-utils/lumina-config/mainWindow.cpp index 45008b07..0bb3cbf0 100644 --- a/src-qt5/core-utils/lumina-config/mainWindow.cpp +++ b/src-qt5/core-utils/lumina-config/mainWindow.cpp @@ -15,6 +15,15 @@ //============= mainWindow::mainWindow() : QMainWindow(), ui(new Ui::mainWindow()){ ui->setupUi(this); + cpage = "somerandomjunktostartwith"; + //Need to insert a spacer action in the toolbar + QWidget *tmp = new QWidget(this); + tmp->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + ui->toolBar->insertWidget(ui->actionSave, tmp); //after the save button + backShortcut = new QShortcut(Qt::Key_Escape, this); + connect(backShortcut, SIGNAL(activated()), this, SLOT(on_actionBack_triggered()) ); + setupIcons(); + loadMonitors(); changePage(""); //load the default main page } @@ -30,29 +39,63 @@ void mainWindow::slotSingleInstance(){ } void mainWindow::setupIcons(){ + this->setWindowIcon( LXDG::findIcon("preferences-desktop") ); ui->actionSave->setIcon( LXDG::findIcon("document-save","") ); + ui->actionBack->setIcon( LXDG::findIcon("go-previous-view","") ); + ui->actionMonitor->setIcon(LXDG::findIcon("preferences-desktop-display","") ); +} + +void mainWindow::loadMonitors(){ + if(ui->actionMonitor->menu()==0){ + ui->actionMonitor->setMenu( new QMenu(this) ); + ui->actionMonitor->setWhatsThis("0"); + connect( ui->actionMonitor->menu(), SIGNAL(triggered(QAction*)), this, SLOT(changeMonitor(QAction*)) ); + QToolButton *b = static_cast<QToolButton*>(ui->toolBar->widgetForAction(ui->actionMonitor)); + b->setPopupMode(QToolButton::InstantPopup); + } + int cnum = ui->actionMonitor->whatsThis().toInt(); + ui->actionMonitor->menu()->clear(); + QList<QScreen*> SL = QApplication::screens(); + for(int i=0; i<SL.length(); i++){ + QAction *tmp = ui->actionMonitor->menu()->addAction( QString("%1: %2").arg(QString::number(i), SL[i]->name()) ); + tmp->setWhatsThis(QString::number(i)); + if(i==cnum || (i==0 && cnum>= SL.length()) ){ + ui->actionMonitor->setText( tmp->text() ); + ui->actionMonitor->setWhatsThis(tmp->whatsThis() ); + } + } + } //============= // PRIVATE //============= void mainWindow::changePage(QString id){ - PageWidget *page = GetNewPage(id, this); - if(page==0){ return; } - qDebug() << "Changing page:" << id; - cpage = id; - QWidget *old = this->centralWidget(); - this->setCentralWidget(page); - if(old!=0 && old!=ui->centralwidget){ old->disconnect(); old->deleteLater(); } - //Connect the new page - connect(page, SIGNAL(HasPendingChanges(bool)), this, SLOT(pageCanSave(bool)) ); - connect(page, SIGNAL(ChangePageTitle(QString)), this, SLOT(pageSetTitle(QString)) ); - connect(page, SIGNAL(ChangePage(QString)), this, SLOT(page_change(QString)) ); + PageWidget *page = 0; + if(id!=cpage){ + page = GetNewPage(id, this); + if(page==0){ return; } + qDebug() << "Changing page:" << id; + cpage = id; + QWidget *old = this->centralWidget(); + this->setCentralWidget(page); + if(old!=0 && old!=ui->centralwidget){ old->disconnect(); old->deleteLater(); } + //Connect the new page + connect(page, SIGNAL(HasPendingChanges(bool)), this, SLOT(pageCanSave(bool)) ); + connect(page, SIGNAL(ChangePageTitle(QString)), this, SLOT(pageSetTitle(QString)) ); + connect(page, SIGNAL(ChangePage(QString)), this, SLOT(page_change(QString)) ); + page->setFocus(); + ui->toolBar->setVisible( !cpage.isEmpty() ); + }else{ + //No change in page (some other refresh) + // just re-use the current widget + page = static_cast<PageWidget*>(this->centralWidget()); + } //Now load the new page - page->LoadSettings(0); //need to make this show the current screen as needed + page->LoadSettings(ui->actionMonitor->whatsThis().toInt()); //need to make this show the current screen as needed //Now update this UI a bit based on page settings - bool needscreen = page->needsScreenSelector(); - + ui->actionMonitor->setVisible( page->needsScreenSelector() && ui->actionMonitor->menu()->actions().length()>1 ); + this->showNormal(); } //================ @@ -68,10 +111,33 @@ void mainWindow::pageSetTitle(QString title){ this->setWindowTitle(title); } -void mainWindow::page_change(QString id){ +bool mainWindow::page_change(QString id){ if(ui->actionSave->isEnabled()){ //unsaved changed available - prompt to save first - // TO-DO + QMessageBox::StandardButton result = QMessageBox::question(this, tr("Unsaved Changes"), tr("This page currently has unsaved changes, do you wish to save them now?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::No); + if(result == QMessageBox::Yes){ on_actionSave_triggered(); } + else if(result == QMessageBox::Cancel){ return false; } //stop now } changePage(id); + return true; +} + +void mainWindow::on_actionSave_triggered(){ + pageCanSave(false); //disable for the moment (page might re-enable later) + static_cast<PageWidget*>(this->centralWidget())->SaveSettings(); + +} + +void mainWindow::on_actionBack_triggered(){ + if(cpage.isEmpty()){ this->close(); } //main menu - go ahead and close it + else{ page_change(""); } //Use the interactive wrapper (check for save state, etc). +} + +void mainWindow::changeMonitor(QAction *act){ + QString oldWT = ui->actionMonitor->whatsThis(); + //Update the current selection shown on the button + ui->actionMonitor->setWhatsThis( act->whatsThis() ); + //Now prompt the current page to re-load settings + if( page_change(cpage) ){ ui->actionMonitor->setText(act->text()); } + else{ ui->actionMonitor->setWhatsThis(oldWT); } //cancelled - go back to old setting } diff --git a/src-qt5/core-utils/lumina-config/mainWindow.h b/src-qt5/core-utils/lumina-config/mainWindow.h index 3a6e0161..14969473 100644 --- a/src-qt5/core-utils/lumina-config/mainWindow.h +++ b/src-qt5/core-utils/lumina-config/mainWindow.h @@ -21,18 +21,25 @@ public: public slots: void slotSingleInstance(); void setupIcons(); + void loadMonitors(); private: Ui::mainWindow *ui; + QShortcut *backShortcut; QString cpage; //current page + void changePage(QString id); private slots: //Page signals void pageCanSave(bool); void pageSetTitle(QString); - void page_change(QString); + bool page_change(QString); + //Toolbar actions + void on_actionSave_triggered(); + void on_actionBack_triggered(); + void changeMonitor(QAction*); }; #endif diff --git a/src-qt5/core-utils/lumina-config/mainWindow.ui b/src-qt5/core-utils/lumina-config/mainWindow.ui index 55e39233..0a9f6896 100644 --- a/src-qt5/core-utils/lumina-config/mainWindow.ui +++ b/src-qt5/core-utils/lumina-config/mainWindow.ui @@ -6,7 +6,7 @@ <rect> <x>0</x> <y>0</y> - <width>486</width> + <width>504</width> <height>388</height> </rect> </property> @@ -28,6 +28,12 @@ <property name="allowedAreas"> <set>Qt::TopToolBarArea</set> </property> + <property name="toolButtonStyle"> + <enum>Qt::ToolButtonTextBesideIcon</enum> + </property> + <property name="floatable"> + <bool>false</bool> + </property> <attribute name="toolBarArea"> <enum>TopToolBarArea</enum> </attribute> @@ -37,6 +43,7 @@ <addaction name="actionBack"/> <addaction name="separator"/> <addaction name="actionSave"/> + <addaction name="actionMonitor"/> </widget> <action name="actionSave"> <property name="text"> @@ -59,8 +66,22 @@ <property name="statusTip"> <string>Back to overall settings</string> </property> - <property name="shortcut"> - <string>Esc</string> + <property name="shortcutContext"> + <enum>Qt::ApplicationShortcut</enum> + </property> + </action> + <action name="actionMonitor"> + <property name="text"> + <string notr="true">Monitor</string> + </property> + <property name="toolTip"> + <string>Select monitor/desktop to configure</string> + </property> + <property name="statusTip"> + <string>Select monitor/desktop to configure</string> + </property> + <property name="menuRole"> + <enum>QAction::ApplicationSpecificRole</enum> </property> </action> </widget> diff --git a/src-qt5/core-utils/lumina-config/pages/PageWidget.h b/src-qt5/core-utils/lumina-config/pages/PageWidget.h index 937e6692..66fce36a 100644 --- a/src-qt5/core-utils/lumina-config/pages/PageWidget.h +++ b/src-qt5/core-utils/lumina-config/pages/PageWidget.h @@ -28,7 +28,9 @@ class PageWidget : public QWidget{ public: //Main constructor/destructor (create/destroy any interface items) - PageWidget(QWidget *parent) : QWidget(parent){} + PageWidget(QWidget *parent) : QWidget(parent){ + //this->setFocusPolicy(Qt::NoFocus); + } ~PageWidget(){} virtual bool needsScreenSelector(){ return false; } //change this to true for pages which load/set options on a per-screen basis @@ -48,7 +50,7 @@ public slots: virtual void updateIcons(){} //Simplification function for widget connections - void settingChanged(){ + virtual void settingChanged(){ emit HasPendingChanges(true); } }; diff --git a/src-qt5/core-utils/lumina-config/pages/getPage.h b/src-qt5/core-utils/lumina-config/pages/getPage.h index 96e22985..b38e614f 100644 --- a/src-qt5/core-utils/lumina-config/pages/getPage.h +++ b/src-qt5/core-utils/lumina-config/pages/getPage.h @@ -23,19 +23,50 @@ static PAGEINFO PageInfo(QString ID, QString i_name, QString i_title, QString i_ //List all the known pages // **** Add new page entries here **** static QList<PAGEINFO> KnownPages(){ - // Valid Groups: ["appearance", "interface", "session", "apps"] + // Valid Groups: ["appearance", "interface", "session", "user"] QList<PAGEINFO> list; //Reminder: <ID>, <name>, <title>, <icon>, <comment>, <category>, <server subsytem list>, <search tags> - - return list; + list << PageInfo("wallpaper", QObject::tr("Change Wallpaper"), QObject::tr("Wallpaper Settings"), "preferences-desktop-wallpaper",QObject::tr("Change background image(s)"), "appearance", QStringList(), QStringList() << "background" << "wallpaper" << "color" << "image"); + list << PageInfo("theme", QObject::tr("Change Desktop Theme"), QObject::tr("Theme Settings"), "preferences-desktop-theme",QObject::tr("Change interface fonts and colors"), "appearance", QStringList(), QStringList() << "background" << "interface" << "color" << "theme" << "plugins"); + list << PageInfo("autostart", QObject::tr("Startup Services and Applications"), QObject::tr("Startup Settings"), "preferences-system-session-services",QObject::tr("Automatically start applications or services"), "session", QStringList(), QStringList() << "apps" << "autostart" << "services" << "xdg" << "startup" << "session"); + list << PageInfo("defaultapps", QObject::tr("Default Applications for File Type"), QObject::tr("Mimetype Settings"), "preferences-desktop-default-applications",QObject::tr("Change default applications"), "session", QStringList(), QStringList() << "apps" << "default" << "services" << "xdg" << "session"); + list << PageInfo("fluxbox-keys", QObject::tr("Keyboard Shortcuts"), QObject::tr("Keyboard Shortcuts"), "preferences-desktop-keyboard",QObject::tr("Change keyboard shortcuts"), "session", QStringList(), QStringList() << "apps" << "fluxbox" << "keys" << "keyboard" << "session" << "launch"); + list << PageInfo("fluxbox-settings", QObject::tr("Window Manager"), QObject::tr("Window Settings"), "preferences-system-windows",QObject::tr("Change window settings and appearances"), "appearance", QStringList(), QStringList() << "window" << "frame" << "border" << "workspace" << "theme" << "fluxbox" << "session"); + list << PageInfo("interface-desktop", QObject::tr("Desktop Icons and Plugins"), QObject::tr("Desktop Plugins"), "preferences-desktop-icons",QObject::tr("Change what icons or tools are embedded on the desktop"), "interface", QStringList(), QStringList() << "desktop" << "plugins" << "embed" << "icons" << "utilities"); + list << PageInfo("interface-panel", QObject::tr("Floating Panels and Plugins"), QObject::tr("Panels and Plugins"), "configure-toolbars",QObject::tr("Change any floating panels and what they show"), "interface", QStringList(), QStringList() << "desktop" << "toolbar" << "panel" << "floating" << "plugins"); + list << PageInfo("interface-menu", QObject::tr("Context Menu and Plugins"), QObject::tr("Menu Plugins"), "preferences-plugin",QObject::tr("Change what options are shown on the desktop context menu"), "interface", QStringList(), QStringList() << "desktop" << "menu" << "plugins" << "shortcuts"); + list << PageInfo("session-locale", QObject::tr("Localization Options"), QObject::tr("Locale Settings"), "preferences-desktop-locale",QObject::tr("Change the default locale settings for this user"), "user", QStringList(), QStringList() << "user"<<"locale"<<"language"<<"translations"); + list << PageInfo("session-options", QObject::tr("General Options"), QObject::tr("User Settings"), "configure",QObject::tr("Change basic user settings such as time/date formats"), "user", QStringList(), QStringList() << "user"<<"settings"<<"time"<<"date"<<"icon"<<"reset"<<"numlock"<<"clock"); + return list; } //Add any sub-pages here #include "page_main.h" +#include "page_wallpaper.h" +#include "page_theme.h" +#include "page_autostart.h" +#include "page_defaultapps.h" +#include "page_fluxbox_keys.h" +#include "page_fluxbox_settings.h" +#include "page_interface_desktop.h" +#include "page_interface_panels.h" +#include "page_interface_menu.h" +#include "page_session_locale.h" +#include "page_session_options.h" static PageWidget* GetNewPage(QString id, QWidget *parent){ //Find the page that matches this "id" - //if(id=="page_beadm"){ return new beadm_page(parent, core); } + if(id=="wallpaper"){ return new page_wallpaper(parent); } + else if(id=="theme"){ return new page_theme(parent); } + else if(id=="autostart"){ return new page_autostart(parent); } + else if(id=="defaultapps"){ return new page_defaultapps(parent); } + else if(id=="fluxbox-keys"){ return new page_fluxbox_keys(parent); } + else if(id=="fluxbox-settings"){ return new page_fluxbox_settings(parent); } + else if(id=="interface-desktop"){ return new page_interface_desktop(parent); } + else if(id=="interface-panel"){ return new page_interface_panels(parent); } + else if(id=="interface-menu"){ return new page_interface_menu(parent); } + else if(id=="session-locale"){ return new page_session_locale(parent); } + else if(id=="session-options"){ return new page_session_options(parent); } //Return the main control_panel page as the fallback/default return new page_main(parent); } diff --git a/src-qt5/core-utils/lumina-config/pages/page_autostart.cpp b/src-qt5/core-utils/lumina-config/pages/page_autostart.cpp new file mode 100644 index 00000000..b7c52fb7 --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_autostart.cpp @@ -0,0 +1,153 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "page_autostart.h" +#include "ui_page_autostart.h" +#include "getPage.h" + +#include "../AppDialog.h" +//========== +// PUBLIC +//========== +page_autostart::page_autostart(QWidget *parent) : PageWidget(parent), ui(new Ui::page_autostart()){ + ui->setupUi(this); + ui->list_session_start->setMouseTracking(true); + updateIcons(); + 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->list_session_start, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(settingChanged()) ); +} + +page_autostart::~page_autostart(){ + +} + + + +//================ +// PUBLIC SLOTS +//================ +void page_autostart::SaveSettings(){ + QList<XDGDesktop> STARTAPPS = LXDG::findAutoStartFiles(true); //also want invalid/disabled items + //bool newstartapps = false; + for(int i=0; i<ui->list_session_start->count(); i++){ + QString file = ui->list_session_start->item(i)->whatsThis(); + bool enabled = ui->list_session_start->item(i)->checkState()==Qt::Checked; + bool found = false; + for(int i=0; i<STARTAPPS.length(); i++){ + if(STARTAPPS[i].filePath==file){ + found = true; + if(enabled != !STARTAPPS[i].isHidden){ + //value is different + qDebug() << "Setting Autostart:" << enabled << STARTAPPS[i].filePath; + LXDG::setAutoStarted(enabled, STARTAPPS[i]); + } + break; + } + } + if(!found && enabled){ + //New file/binary/app + qDebug() << "Adding new AutoStart File:" << file; + LXDG::setAutoStarted(enabled, file); + //newstartapps = true; + } + } +} + +void page_autostart::LoadSettings(int){ + emit HasPendingChanges(false); + emit ChangePageTitle( tr("Startup Services") ); + QList<XDGDesktop> STARTAPPS = LXDG::findAutoStartFiles(true); //also want invalid/disabled items + //qDebug() << "StartApps:"; + ui->list_session_start->clear(); + for(int i=0; i<STARTAPPS.length(); i++){ + //qDebug() << STARTAPPS[i].filePath +" -> " +STARTAPPS[i].name << STARTAPPS[i].isHidden; + if( !LXDG::checkValidity(STARTAPPS[i],false) || !QFile::exists(STARTAPPS[i].filePath) ){ continue; } + QListWidgetItem *it = new QListWidgetItem( LXDG::findIcon(STARTAPPS[i].icon,"application-x-executable"), STARTAPPS[i].name ); + it->setWhatsThis(STARTAPPS[i].filePath); //keep the file location + it->setToolTip(STARTAPPS[i].comment); + if(STARTAPPS[i].isHidden){ it->setCheckState( Qt::Unchecked); } + else{it->setCheckState( Qt::Checked); } + ui->list_session_start->addItem(it); + } +} + +void page_autostart::updateIcons(){ + 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","") ); +} + +//================= +// PRIVATE +//================= +XDGDesktop page_autostart::getSysApp(bool allowreset){ + AppDialog dlg(this, LXDG::sortDesktopNames( LXDG::systemDesktopFiles() ) ); + dlg.allowReset(allowreset); + dlg.exec(); + XDGDesktop desk; + if(dlg.appreset && allowreset){ + desk.filePath = "reset"; //special internal flag + }else{ + desk = dlg.appselected; + } + return desk; +} + +//================= +// PRIVATE SLOTS +//================= +void page_autostart::rmsessionstartitem(){ + if(ui->list_session_start->currentRow() < 0){ return; } //no item selected + delete ui->list_session_start->takeItem(ui->list_session_start->currentRow()); + settingChanged(); +} + +void page_autostart::addsessionstartapp(){ + //Prompt for the application to start + XDGDesktop desk = getSysApp(false); //no reset + if(desk.filePath.isEmpty()){ return; } //cancelled + QListWidgetItem *it = new QListWidgetItem( LXDG::findIcon(desk.icon,""), desk.name ); + it->setWhatsThis(desk.filePath); + it->setToolTip(desk.comment); + it->setCheckState(Qt::Checked); + + ui->list_session_start->addItem(it); + ui->list_session_start->setCurrentItem(it); + settingChanged(); +} + +void page_autostart::addsessionstartbin(){ + QString chkpath = LOS::AppPrefix() + "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 + it->setToolTip(bin); + it->setCheckState(Qt::Checked); + ui->list_session_start->addItem(it); + ui->list_session_start->setCurrentItem(it); + settingChanged(); +} + +void page_autostart::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::findMimeIcon(bin), bin.section("/",-1) ); + it->setWhatsThis(bin); //file to be saved/run + it->setToolTip(bin); + it->setCheckState(Qt::Checked); + ui->list_session_start->addItem(it); + ui->list_session_start->setCurrentItem(it); + settingChanged(); +} diff --git a/src-qt5/core-utils/lumina-config/pages/page_autostart.h b/src-qt5/core-utils/lumina-config/pages/page_autostart.h new file mode 100644 index 00000000..88f1ef94 --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_autostart.h @@ -0,0 +1,38 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_CONFIG_PAGE_AUTOSTART_H +#define _LUMINA_CONFIG_PAGE_AUTOSTART_H +#include "../globals.h" +#include "PageWidget.h" + +namespace Ui{ + class page_autostart; +}; + +class page_autostart : public PageWidget{ + Q_OBJECT +public: + page_autostart(QWidget *parent); + ~page_autostart(); + +public slots: + void SaveSettings(); + void LoadSettings(int screennum); + void updateIcons(); + +private: + Ui::page_autostart *ui; + + XDGDesktop getSysApp(bool allowreset); + +private slots: + void rmsessionstartitem(); + void addsessionstartapp(); + void addsessionstartbin(); + void addsessionstartfile(); +}; +#endif diff --git a/src-qt5/core-utils/lumina-config/pages/page_autostart.ui b/src-qt5/core-utils/lumina-config/pages/page_autostart.ui index 0d49005d..b286b4a5 100644 --- a/src-qt5/core-utils/lumina-config/pages/page_autostart.ui +++ b/src-qt5/core-utils/lumina-config/pages/page_autostart.ui @@ -15,71 +15,95 @@ </property> <layout class="QVBoxLayout" name="verticalLayout"> <property name="leftMargin"> - <number>0</number> + <number>9</number> </property> <property name="topMargin"> - <number>0</number> + <number>6</number> </property> <property name="rightMargin"> - <number>0</number> + <number>9</number> </property> <property name="bottomMargin"> - <number>0</number> + <number>9</number> </property> <item> - <layout class="QHBoxLayout" name="horizontalLayout_18"> - <item> - <spacer name="horizontalSpacer_15"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QToolButton" name="tool_session_addapp_2"> - <property name="text"> - <string>Application</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_session_addbin_2"> - <property name="text"> - <string>Binary</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_session_addfile_2"> - <property name="text"> - <string>File</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QListWidget" name="list_session_start_2"> + <widget class="QListWidget" name="list_session_start"> <property name="sortingEnabled"> <bool>true</bool> </property> </widget> </item> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Add New Startup Service</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_18"> + <item> + <spacer name="horizontalSpacer_15"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QToolButton" name="tool_session_addapp"> + <property name="text"> + <string>Application</string> + </property> + <property name="toolButtonStyle"> + <enum>Qt::ToolButtonTextBesideIcon</enum> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_session_addbin"> + <property name="text"> + <string>Binary</string> + </property> + <property name="toolButtonStyle"> + <enum>Qt::ToolButtonTextBesideIcon</enum> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_session_addfile"> + <property name="text"> + <string>File</string> + </property> + <property name="toolButtonStyle"> + <enum>Qt::ToolButtonTextBesideIcon</enum> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> </layout> </widget> <resources/> diff --git a/src-qt5/core-utils/lumina-config/pages/page_defaultapps.cpp b/src-qt5/core-utils/lumina-config/pages/page_defaultapps.cpp new file mode 100644 index 00000000..e55beba6 --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_defaultapps.cpp @@ -0,0 +1,430 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "page_defaultapps.h" +#include "ui_page_defaultapps.h" +#include "getPage.h" +#include "../AppDialog.h" + +//========== +// PUBLIC +//========== +page_defaultapps::page_defaultapps(QWidget *parent) : PageWidget(parent), ui(new Ui::page_defaultapps()){ + ui->setupUi(this); + + connect(ui->tool_default_filemanager, SIGNAL(clicked()), this, SLOT(changeDefaultFileManager()) ); + connect(ui->tool_default_terminal, SIGNAL(clicked()), this, SLOT(changeDefaultTerminal()) ); + connect(ui->tool_default_webbrowser, SIGNAL(clicked()), this, SLOT(changeDefaultBrowser()) ); + connect(ui->tool_default_email, SIGNAL(clicked()), this, SLOT(changeDefaultEmail()) ); + connect(ui->tool_defaults_clear, SIGNAL(clicked()), this, SLOT(cleardefaultitem()) ); + connect(ui->tool_defaults_set, SIGNAL(clicked()), this, SLOT(setdefaultitem()) ); + connect(ui->tool_defaults_setbin, SIGNAL(clicked()), this, SLOT(setdefaultbinary()) ); + connect(ui->tree_defaults, SIGNAL(itemSelectionChanged()), this, SLOT(checkdefaulticons()) ); + updateIcons(); + ui->tabWidget_apps->setCurrentWidget(ui->tab_auto); +} + +page_defaultapps::~page_defaultapps(){ + +} + +//================ +// PUBLIC SLOTS +//================ +void page_defaultapps::SaveSettings(){ + +} + +void page_defaultapps::LoadSettings(int){ + emit HasPendingChanges(false); + emit ChangePageTitle( tr("Default Applications") ); + +//First load the lumina-open specific defaults + // - Default File Manager + QString tmp = LXDG::findDefaultAppForMime("inode/directory"); + if(tmp.isEmpty()){ tmp = "lumina-fm"; } + if( !QFile::exists(tmp) && !LUtils::isValidBinary(tmp) ){ qDebug() << "Invalid Settings:" << tmp; tmp.clear(); } //invalid settings + if(tmp.endsWith(".desktop")){ + bool ok = false; + XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); + if(!ok || file.filePath.isEmpty()){ + //Might be a binary - just print out the raw "path" + ui->tool_default_filemanager->setText(tmp.section("/",-1)); + ui->tool_default_filemanager->setIcon( LXDG::findIcon("application-x-executable","") ); + }else{ + ui->tool_default_filemanager->setText(file.name); + ui->tool_default_filemanager->setIcon(LXDG::findIcon(file.icon,"") ); + } + }else if(tmp.isEmpty()){ + ui->tool_default_filemanager->setText(tr("Click to Set")); + ui->tool_default_filemanager->setIcon( LXDG::findIcon("system-help","") ); + }else{ + //Might be a binary - just print out the raw "path" + ui->tool_default_filemanager->setText(tmp.section("/",-1)); + ui->tool_default_filemanager->setIcon( LXDG::findIcon("application-x-executable","") ); + } + // - Default Terminal + tmp =LXDG::findDefaultAppForMime("application/terminal"); //sessionsettings->value("default-terminal", "xterm").toString(); + if( !QFile::exists(tmp) && !LUtils::isValidBinary(tmp) ){ qDebug() << "Invalid Settings:" << tmp; tmp.clear(); } //invalid settings + if(tmp.endsWith(".desktop")){ + bool ok = false; + XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); + if(!ok || file.filePath.isEmpty()){ + //Might be a binary - just print out the raw "path" + ui->tool_default_terminal->setText(tmp.section("/",-1)); + ui->tool_default_terminal->setIcon( LXDG::findIcon("application-x-executable","") ); + }else{ + ui->tool_default_terminal->setText(file.name); + ui->tool_default_terminal->setIcon(LXDG::findIcon(file.icon,"") ); + } + }else if(tmp.isEmpty()){ + ui->tool_default_terminal->setText(tr("Click to Set")); + ui->tool_default_terminal->setIcon( LXDG::findIcon("system-help","") ); + }else{ + //Might be a binary - just print out the raw "path" + ui->tool_default_terminal->setText(tmp.section("/",-1)); + ui->tool_default_terminal->setIcon( LXDG::findIcon("application-x-executable","") ); + } + // - Default Web Browser + tmp = LXDG::findDefaultAppForMime("x-scheme-handler/http"); //appsettings->value("default/webbrowser", "").toString(); + if( !QFile::exists(tmp) && !LUtils::isValidBinary(tmp) ){ qDebug() << "Invalid Settings:" << tmp; tmp.clear(); } //invalid settings + if(tmp.endsWith(".desktop")){ + bool ok = false; + XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); + if(!ok || file.filePath.isEmpty()){ + //Might be a binary - just print out the raw "path" + ui->tool_default_webbrowser->setText(tmp.section("/",-1)); + ui->tool_default_webbrowser->setIcon( LXDG::findIcon("application-x-executable","") ); + }else{ + ui->tool_default_webbrowser->setText(file.name); + ui->tool_default_webbrowser->setIcon(LXDG::findIcon(file.icon,"") ); + } + }else if(tmp.isEmpty()){ + ui->tool_default_webbrowser->setText(tr("Click to Set")); + ui->tool_default_webbrowser->setIcon( LXDG::findIcon("system-help","") ); + }else{ + //Might be a binary - just print out the raw "path" + ui->tool_default_webbrowser->setText(tmp.section("/",-1)); + ui->tool_default_webbrowser->setIcon( LXDG::findIcon("application-x-executable","") ); + } + // - Default Email Client + tmp = LXDG::findDefaultAppForMime("application/email"); //appsettings->value("default/email", "").toString(); + if( !QFile::exists(tmp) && !LUtils::isValidBinary(tmp) ){ qDebug() << "Invalid Settings:" << tmp; tmp.clear(); } //invalid settings + if(tmp.endsWith(".desktop")){ + bool ok = false; + XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); + if(!ok || file.filePath.isEmpty()){ + //Might be a binary - just print out the raw "path" + ui->tool_default_email->setText(tmp.section("/",-1)); + ui->tool_default_email->setIcon( LXDG::findIcon("application-x-executable","") ); + }else{ + ui->tool_default_email->setText(file.name); + ui->tool_default_email->setIcon(LXDG::findIcon(file.icon,"") ); + } + }else if(tmp.isEmpty()){ + ui->tool_default_email->setText(tr("Click to Set")); + ui->tool_default_email->setIcon( LXDG::findIcon("system-help","") ); + }else{ + //Might be a binary - just print out the raw "path" + ui->tool_default_email->setText(tmp.section("/",-1)); + ui->tool_default_email->setIcon( LXDG::findIcon("application-x-executable","") ); + } + + //Now load the XDG mime defaults + ui->tree_defaults->clear(); + QStringList defMimeList = LXDG::listFileMimeDefaults(); + //qDebug() << "Mime List:\n" << defMimeList.join("\n"); + defMimeList.sort(); //sort by group/mime + //Now fill the tree by group/mime + QTreeWidgetItem *group = new QTreeWidgetItem(0); //nothing at the moment + QString ccat; + for(int i=0; i<defMimeList.length(); i++){ + //Get the info from this entry + QString mime = defMimeList[i].section("::::",0,0); + QString cat = mime.section("/",0,0); + QString extlist = defMimeList[i].section("::::",1,1); + QString def = defMimeList[i].section("::::",2,2); + QString comment = defMimeList[i].section("::::",3,50); + //Now check if this is a new category + if(ccat!=cat){ + //New group + group = new QTreeWidgetItem(0); + group->setText(0, cat); //add translations for known/common groups later + ui->tree_defaults->addTopLevelItem(group); + ccat = cat; + } + //Now create the entry + QTreeWidgetItem *it = new QTreeWidgetItem(); + it->setWhatsThis(0,mime); // full mimetype + it->setText(0, QString(tr("%1 (%2)")).arg(mime.section("/",-1), extlist) ); + it->setText(2,comment); + it->setToolTip(0, comment); it->setToolTip(1,comment); + //Now load the default (if there is one) + it->setWhatsThis(1,def); //save for later + if(def.endsWith(".desktop")){ + bool ok = false; + XDGDesktop file = LXDG::loadDesktopFile(def, ok); + if(!ok || file.filePath.isEmpty()){ + //Might be a binary - just print out the raw "path" + it->setText(1,def.section("/",-1)); + it->setIcon(1, LXDG::findIcon("application-x-executable","") ); + }else{ + it->setText(1, file.name); + it->setIcon(1, LXDG::findIcon(file.icon,"") ); + } + }else if(!def.isEmpty()){ + //Binary/Other default + it->setText(1, def.section("/",-1)); + it->setIcon(1, LXDG::findIcon("application-x-executable","") ); + } + group->addChild(it); + } + + ui->tree_defaults->sortItems(0,Qt::AscendingOrder); + + checkdefaulticons(); +} + +void page_defaultapps::updateIcons(){ + ui->tool_defaults_clear->setIcon( LXDG::findIcon("edit-clear","") ); + ui->tool_defaults_set->setIcon( LXDG::findIcon("system-run","") ); + ui->tool_defaults_setbin->setIcon( LXDG::findIcon("application-x-executable","") ); + ui->tabWidget_apps->setTabIcon( ui->tabWidget_apps->indexOf(ui->tab_auto), LXDG::findIcon("system-run", "") ); + ui->tabWidget_apps->setTabIcon( ui->tabWidget_apps->indexOf(ui->tab_defaults), LXDG::findIcon("preferences-desktop-filetype-association", "") ); +} + +//================= +// PRIVATE +//================= +XDGDesktop page_defaultapps::getSysApp(bool allowreset){ + AppDialog dlg(this, LXDG::sortDesktopNames( LXDG::systemDesktopFiles() ) ); + dlg.allowReset(allowreset); + dlg.exec(); + XDGDesktop desk; + if(dlg.appreset && allowreset){ + desk.filePath = "reset"; //special internal flag + }else{ + desk = dlg.appselected; + } + return desk; +} + +//================= +// PRIVATE SLOTS +//================= +void page_defaultapps::changeDefaultBrowser(){ + //Prompt for the new app + XDGDesktop desk = getSysApp(true); + if(desk.filePath.isEmpty()){ return; }//nothing selected + if(desk.filePath=="reset"){ + desk.filePath=""; + } + //save the new app setting and adjust the button appearance + //appsettings->setValue("default/webbrowser", desk.filePath); + LXDG::setDefaultAppForMime("x-scheme-handler/http", desk.filePath.section("/",-1)); + LXDG::setDefaultAppForMime("x-scheme-handler/https", desk.filePath.section("/",-1)); + QString tmp = desk.filePath; + if(tmp.endsWith(".desktop")){ + bool ok = false; + XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); + if(!ok || file.filePath.isEmpty()){ + //Might be a binary - just print out the raw "path" + ui->tool_default_webbrowser->setText(tmp.section("/",-1)); + ui->tool_default_webbrowser->setIcon( LXDG::findIcon("application-x-executable","") ); + }else{ + ui->tool_default_webbrowser->setText(desk.name); + ui->tool_default_webbrowser->setIcon(LXDG::findIcon(desk.icon,"") ); + } + }else if(tmp.isEmpty()){ + ui->tool_default_webbrowser->setText(tr("Click to Set")); + ui->tool_default_webbrowser->setIcon( LXDG::findIcon("system-help","") ); + }else{ + //Might be a binary - just print out the raw "path" + ui->tool_default_webbrowser->setText(tmp.section("/",-1)); + ui->tool_default_webbrowser->setIcon( LXDG::findIcon("application-x-executable","") ); + } +} + +void page_defaultapps::changeDefaultEmail(){ + //Prompt for the new app + XDGDesktop desk = getSysApp(true); //allow reset to default + if(desk.filePath.isEmpty()){ return; }//nothing selected + if(desk.filePath=="reset"){ + desk.filePath=""; + } + //save the new app setting and adjust the button appearance + LXDG::setDefaultAppForMime("application/email",desk.filePath); + // appsettings->setValue("default/email", desk.filePath); + QString tmp = desk.filePath; + if(tmp.endsWith(".desktop")){ + bool ok = false; + XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); + if(!ok || file.filePath.isEmpty()){ + //Might be a binary - just print out the raw "path" + ui->tool_default_email->setText(tmp.section("/",-1)); + ui->tool_default_email->setIcon( LXDG::findIcon("application-x-executable","") ); + }else{ + ui->tool_default_email->setText(file.name); + ui->tool_default_email->setIcon(LXDG::findIcon(file.icon,"") ); + } + }else if(tmp.isEmpty()){ + ui->tool_default_email->setText(tr("Click to Set")); + ui->tool_default_email->setIcon( LXDG::findIcon("system-help","") ); + }else{ + //Might be a binary - just print out the raw "path" + ui->tool_default_email->setText(tmp.section("/",-1)); + ui->tool_default_email->setIcon( LXDG::findIcon("application-x-executable","") ); + } +} + +void page_defaultapps::changeDefaultFileManager(){ + //Prompt for the new app + XDGDesktop desk = getSysApp(true); + if(desk.filePath.isEmpty()){ return; }//nothing selected + if(desk.filePath=="reset"){ + desk.filePath="lumina-fm"; + } + //save the new app setting and adjust the button appearance + //appsettings->setValue("default/directory", desk.filePath); + //sessionsettings->setValue("default-filemanager", desk.filePath); + LXDG::setDefaultAppForMime("inode/directory", desk.filePath.section("/",-1)); + QString tmp = desk.filePath; + if(tmp.endsWith(".desktop")){ + bool ok = false; + XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); + if(!ok || file.filePath.isEmpty()){ + //Might be a binary - just print out the raw "path" + ui->tool_default_filemanager->setText(tmp.section("/",-1)); + ui->tool_default_filemanager->setIcon( LXDG::findIcon("application-x-executable","") ); + }else{ + ui->tool_default_filemanager->setText(file.name); + ui->tool_default_filemanager->setIcon(LXDG::findIcon(file.icon,"") ); + } + }else if(tmp.isEmpty()){ + ui->tool_default_filemanager->setText(tr("Click to Set")); + ui->tool_default_filemanager->setIcon( LXDG::findIcon("system-help","") ); + }else{ + //Might be a binary - just print out the raw "path" + ui->tool_default_filemanager->setText(tmp.section("/",-1)); + ui->tool_default_filemanager->setIcon( LXDG::findIcon("application-x-executable","") ); + } +} + +void page_defaultapps::changeDefaultTerminal(){ + //Prompt for the new app + XDGDesktop desk = getSysApp(true); + if(desk.filePath.isEmpty()){ return; }//nothing selected + if(desk.filePath=="reset"){ + desk.filePath="xterm"; + } + //save the new app setting and adjust the button appearance + LXDG::setDefaultAppForMime("application/terminal",desk.filePath); + //sessionsettings->setValue("default-terminal", desk.filePath); + QString tmp = desk.filePath; + if(tmp.endsWith(".desktop")){ + bool ok = false; + XDGDesktop file = LXDG::loadDesktopFile(tmp, ok); + if(!ok || file.filePath.isEmpty()){ + //Might be a binary - just print out the raw "path" + ui->tool_default_terminal->setText(tmp.section("/",-1)); + ui->tool_default_terminal->setIcon( LXDG::findIcon("application-x-executable","") ); + }else{ + ui->tool_default_terminal->setText(file.name); + ui->tool_default_terminal->setIcon(LXDG::findIcon(file.icon,"") ); + } + }else if(tmp.isEmpty()){ + ui->tool_default_terminal->setText(tr("Click to Set")); + ui->tool_default_terminal->setIcon( LXDG::findIcon("system-help","") ); + }else{ + //Might be a binary - just print out the raw "path" + ui->tool_default_terminal->setText(tmp.section("/",-1)); + ui->tool_default_terminal->setIcon( LXDG::findIcon("application-x-executable","") ); + } +} + +void page_defaultapps::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++){ + //Clear it in the back end + LXDG::setDefaultAppForMime(list[i]->whatsThis(0), ""); + //Now clear it in the UI + list[i]->setWhatsThis(1,""); //clear the app path + list[i]->setIcon(1,QIcon()); //clear the icon + list[i]->setText(1,""); //clear the name + } + +} + +void page_defaultapps::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(false); //no "reset" option + if(desk.filePath.isEmpty()){ return; }//nothing selected + //Now set the items + for(int i=0; i<list.length(); i++){ + //Set it in the back end + LXDG::setDefaultAppForMime(list[i]->whatsThis(0), desk.filePath); + //Set it in the UI + list[i]->setWhatsThis(1,desk.filePath); //app path + list[i]->setIcon(1,LXDG::findIcon(desk.icon,"")); //reset the icon + list[i]->setText(1,desk.name); //reset the name + } + +} + +void page_defaultapps::setdefaultbinary(){ + 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 binary to use + QFileDialog dlg(this); + //dlg.setFilter(QDir::Executable | QDir::Files); //Does not work! Filters executable files as well as breaks browsing capabilities + dlg.setFileMode(QFileDialog::ExistingFile); + dlg.setDirectory( LOS::AppPrefix()+"bin" ); + dlg.setWindowTitle(tr("Select Binary")); + if( !dlg.exec() || dlg.selectedFiles().isEmpty() ){ + return; //cancelled + } + QString path = dlg.selectedFiles().first(); + //Make sure it is executable + if( !QFileInfo(path).isExecutable()){ + QMessageBox::warning(this, tr("Invalid Binary"), tr("The selected binary is not executable!")); + return; + } + //Now set the items + for(int i=0; i<list.length(); i++){ + //Set it in the back end + LXDG::setDefaultAppForMime(list[i]->whatsThis(0), path); + //Set it in the UI + list[i]->setWhatsThis(1,path); //app path + list[i]->setIcon(1,LXDG::findIcon("application-x-executable","")); //clear the icon + list[i]->setText(1,path.section("/",-1)); //clear the name + } +} + +void page_defaultapps::checkdefaulticons(){ + QTreeWidgetItem *it = ui->tree_defaults->currentItem(); + ui->tool_defaults_set->setEnabled(it!=0); + ui->tool_defaults_clear->setEnabled(it!=0); + ui->tool_defaults_setbin->setEnabled(it!=0); +} diff --git a/src-qt5/core-utils/lumina-config/pages/page_defaultapps.h b/src-qt5/core-utils/lumina-config/pages/page_defaultapps.h new file mode 100644 index 00000000..afe99d4b --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_defaultapps.h @@ -0,0 +1,45 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_CONFIG_PAGE_DEFAULTAPPS_H +#define _LUMINA_CONFIG_PAGE_DEFAULTAPPS_H +#include "../globals.h" +#include "PageWidget.h" + +namespace Ui{ + class page_defaultapps; +}; + +class page_defaultapps : public PageWidget{ + Q_OBJECT +public: + page_defaultapps(QWidget *parent); + ~page_defaultapps(); + +public slots: + void SaveSettings(); + void LoadSettings(int screennum); + void updateIcons(); + +private: + Ui::page_defaultapps *ui; + + XDGDesktop getSysApp(bool allowreset); + +private slots: + //Simple defaults tab + void changeDefaultBrowser(); + void changeDefaultEmail(); + void changeDefaultFileManager(); + void changeDefaultTerminal(); + //Advanced defaults tab + void cleardefaultitem(); + void setdefaultitem(); + void setdefaultbinary(); + void checkdefaulticons(); + +}; +#endif diff --git a/src-qt5/core-utils/lumina-config/pages/page_defaultapps.ui b/src-qt5/core-utils/lumina-config/pages/page_defaultapps.ui index 16e65bdf..ef72c4f1 100644 --- a/src-qt5/core-utils/lumina-config/pages/page_defaultapps.ui +++ b/src-qt5/core-utils/lumina-config/pages/page_defaultapps.ui @@ -15,25 +15,28 @@ </property> <layout class="QVBoxLayout" name="verticalLayout"> <property name="leftMargin"> - <number>0</number> + <number>6</number> </property> <property name="topMargin"> - <number>0</number> + <number>6</number> </property> <property name="rightMargin"> - <number>0</number> + <number>6</number> </property> <property name="bottomMargin"> - <number>0</number> + <number>6</number> </property> <item> <widget class="QTabWidget" name="tabWidget_apps"> <property name="currentIndex"> - <number>0</number> + <number>1</number> + </property> + <property name="movable"> + <bool>false</bool> </property> <widget class="QWidget" name="tab_defaults"> <attribute name="title"> - <string>File Defaults</string> + <string>Advanced</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_6"> <property name="leftMargin"> @@ -160,9 +163,9 @@ </item> </layout> </widget> - <widget class="QWidget" name="tab_2"> + <widget class="QWidget" name="tab_auto"> <attribute name="title"> - <string>Common Applications</string> + <string>Basic Settings</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_7"> <item> diff --git a/src-qt5/core-utils/lumina-config/pages/page_fluxbox_keys.cpp b/src-qt5/core-utils/lumina-config/pages/page_fluxbox_keys.cpp new file mode 100644 index 00000000..ed382bb8 --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_fluxbox_keys.cpp @@ -0,0 +1,200 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "page_fluxbox_keys.h" +#include "ui_page_fluxbox_keys.h" +#include "getPage.h" + +//========== +// PUBLIC +//========== +page_fluxbox_keys::page_fluxbox_keys(QWidget *parent) : PageWidget(parent), ui(new Ui::page_fluxbox_keys()){ + ui->setupUi(this); + + connect(ui->tool_shortcut_clear, SIGNAL(clicked()), this, SLOT(clearKeyBinding()) ); + connect(ui->tool_shortcut_set, SIGNAL(clicked()), this, SLOT(applyKeyBinding()) ); + connect(ui->tree_shortcut, SIGNAL(itemSelectionChanged()), this, SLOT(updateKeyConfig()) ); + updateIcons(); +} + +page_fluxbox_keys::~page_fluxbox_keys(){ + +} + +//================ +// PUBLIC SLOTS +//================ +void page_fluxbox_keys::SaveSettings(){ +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(QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/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,-1)).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(QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/fluxbox-keys", info); + if(!ok){ qDebug() << "Warning: Could not save fluxbox-keys"; } + emit HasPendingChanges(false); +} + +void page_fluxbox_keys::LoadSettings(int){ + emit HasPendingChanges(false); + emit ChangePageTitle( tr("Keyboard Shortcuts") ); + +ui->tree_shortcut->clear(); + QStringList info = readFile(QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/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") \ + << "Exec xscreensaver-command -lock::::"+tr("Lock Screen"); + 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; } + QString exec = info[i].section(":",1,100); + QString showexec = exec; + if(showexec.startsWith("If {Matches")){ showexec = showexec.section("{",2,2).section("}",0,0); } + if(showexec.startsWith("Exec ")){ showexec.replace("Exec ","Run "); } + else{ showexec = showexec.section("(",0,0).section("{",0,0); } //built-in command - remove the extra commands on some of them + QTreeWidgetItem *it = new QTreeWidgetItem(); + it->setText(0, showexec.simplified() ); + it->setWhatsThis(0, exec); + 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 page_fluxbox_keys::updateIcons(){ + ui->tool_shortcut_set->setIcon( LXDG::findIcon("input-keyboard","") ); + ui->tool_shortcut_clear->setIcon( LXDG::findIcon("edit-clear","") ); +} + +//================= +// PRIVATE +//================= +//Convert to/from fluxbox key codes +QString page_fluxbox_keys::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 + in.replace("+"," "); + return in; +} + +QString page_fluxbox_keys::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 page_fluxbox_keys::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 page_fluxbox_keys::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 page_fluxbox_keys::clearKeyBinding(){ + if(ui->tree_shortcut->currentItem()==0){ return; } + ui->tree_shortcut->currentItem()->setText(1,""); + ui->tree_shortcut->currentItem()->setWhatsThis(1,""); + settingChanged(); +} + +void page_fluxbox_keys::applyKeyBinding(){ + QKeySequence seq = ui->keyEdit_shortcut->keySequence(); + qDebug() << "New Key Sequence:" << seq.toString(QKeySequence::NativeText) << seq.toString(QKeySequence::PortableText); + if(seq.isEmpty()){ + //Verify removal of the action first + + //Now remove the action + delete ui->tree_shortcut->currentItem(); + }else{ + QTreeWidgetItem *it = ui->tree_shortcut->currentItem(); + it->setText(1,seq.toString(QKeySequence::NativeText)); + it->setWhatsThis(1,dispToFluxKeys(seq.toString(QKeySequence::PortableText))); + qDebug() << " - Flux Sequence:" << it->whatsThis(1); + } + ui->keyEdit_shortcut->clear(); + settingChanged(); +} + +void page_fluxbox_keys::updateKeyConfig(){ + ui->group_shortcut_modify->setEnabled(ui->tree_shortcut->currentItem()!=0); + ui->keyEdit_shortcut->clear(); +} diff --git a/src-qt5/core-utils/lumina-config/pages/page_fluxbox_keys.h b/src-qt5/core-utils/lumina-config/pages/page_fluxbox_keys.h new file mode 100644 index 00000000..7fc143ff --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_fluxbox_keys.h @@ -0,0 +1,44 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_CONFIG_PAGE_FLUXBOX_KEYS_H +#define _LUMINA_CONFIG_PAGE_FLUXBOX_KEYS_H +#include "../globals.h" +#include "PageWidget.h" + +namespace Ui{ + class page_fluxbox_keys; +}; + +class page_fluxbox_keys : public PageWidget{ + Q_OBJECT +public: + page_fluxbox_keys(QWidget *parent); + ~page_fluxbox_keys(); + +public slots: + void SaveSettings(); + void LoadSettings(int screennum); + void updateIcons(); + +private: + Ui::page_fluxbox_keys *ui; + + //Convert to/from fluxbox keyboard shortcuts + QString dispToFluxKeys(QString); + QString fluxToDispKeys(QString); + + //Read/overwrite a text file + QStringList readFile(QString path); + bool overwriteFile(QString path, QStringList contents); + +private slots: + void clearKeyBinding(); + void applyKeyBinding(); + void updateKeyConfig(); + +}; +#endif diff --git a/src-qt5/core-utils/lumina-config/pages/page_fluxbox_keys.ui b/src-qt5/core-utils/lumina-config/pages/page_fluxbox_keys.ui index 0c950672..2ded896e 100644 --- a/src-qt5/core-utils/lumina-config/pages/page_fluxbox_keys.ui +++ b/src-qt5/core-utils/lumina-config/pages/page_fluxbox_keys.ui @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> - <class>Form</class> - <widget class="QWidget" name="Form"> + <class>page_fluxbox_keys</class> + <widget class="QWidget" name="page_fluxbox_keys"> <property name="geometry"> <rect> <x>0</x> @@ -15,16 +15,16 @@ </property> <layout class="QVBoxLayout" name="verticalLayout"> <property name="leftMargin"> - <number>0</number> + <number>6</number> </property> <property name="topMargin"> - <number>0</number> + <number>6</number> </property> <property name="rightMargin"> - <number>0</number> + <number>6</number> </property> <property name="bottomMargin"> - <number>0</number> + <number>6</number> </property> <item> <widget class="QTreeWidget" name="tree_shortcut"> diff --git a/src-qt5/core-utils/lumina-config/pages/page_fluxbox_settings.cpp b/src-qt5/core-utils/lumina-config/pages/page_fluxbox_settings.cpp new file mode 100644 index 00000000..8f075488 --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_fluxbox_settings.cpp @@ -0,0 +1,170 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "page_fluxbox_settings.h" +#include "ui_page_fluxbox_settings.h" +#include "getPage.h" + +//========== +// PUBLIC +//========== +page_fluxbox_settings::page_fluxbox_settings(QWidget *parent) : PageWidget(parent), ui(new Ui::page_fluxbox_settings()){ + ui->setupUi(this); + loading= false; + connect(ui->combo_session_wfocus, SIGNAL(currentIndexChanged(int)), this, SLOT(settingChanged()) ); + connect(ui->combo_session_wloc, SIGNAL(currentIndexChanged(int)), this, SLOT(settingChanged()) ); + connect(ui->combo_session_wtheme, SIGNAL(currentIndexChanged(int)), this, SLOT(sessionthemechanged()) ); + connect(ui->spin_session_wkspaces, SIGNAL(valueChanged(int)), this, SLOT(settingChanged()) ); + updateIcons(); +} + +page_fluxbox_settings::~page_fluxbox_settings(){ + +} + +//================ +// PUBLIC SLOTS +//================ +void page_fluxbox_settings::SaveSettings(){ + QStringList FB = readFile(QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/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(QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/fluxbox-init", FB); + if(!ok){ qDebug() << "Warning: Could not save fluxbox-init"; } + emit HasPendingChanges(false); +} + +void page_fluxbox_settings::LoadSettings(int){ + emit HasPendingChanges(false); + emit ChangePageTitle( tr("Window Manager Settings") ); + loading = true; + 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(); + QStringList dirs; dirs << LOS::AppPrefix()+"share/fluxbox/styles" << QDir::homePath()+"/.fluxbox/styles"; + QFileInfoList fbstyles; + for(int i=0; i<dirs.length(); i++){ + QDir fbdir(dirs[i]); + fbstyles << fbdir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name | QDir::IgnoreCase); + } + QString lastdir; + for(int i=0; i<fbstyles.length(); i++){ + if(lastdir!=fbstyles[i].absolutePath()){ + lastdir = fbstyles[i].absolutePath(); //save for checking later + if(ui->combo_session_wtheme->count()>0){ ui->combo_session_wtheme->insertSeparator(ui->combo_session_wtheme->count()); } + } + ui->combo_session_wtheme->addItem(fbstyles[i].fileName(), fbstyles[i].absoluteFilePath()); + } + + QStringList FB = readFile(QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/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()); } + + QApplication::processEvents(); + loading = false; +} + +void page_fluxbox_settings::updateIcons(){ + +} + +//================= +// PRIVATE +//================= +//Read/overwrite a text file +QStringList page_fluxbox_settings::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 page_fluxbox_settings::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 page_fluxbox_settings::sessionthemechanged(){ + //Update the Fluxbox Theme preview + QString previewfile = ui->combo_session_wtheme->itemData( ui->combo_session_wtheme->currentIndex() ).toString(); + previewfile.append( (previewfile.endsWith("/") ? "preview.jpg": "/preview.jpg") ); + if(QFile::exists(previewfile)){ + ui->label_session_wpreview->setPixmap(QPixmap(previewfile)); + }else{ + ui->label_session_wpreview->setText(tr("No Preview Available")); + } + settingChanged(); +} diff --git a/src-qt5/core-utils/lumina-config/pages/page_fluxbox_settings.h b/src-qt5/core-utils/lumina-config/pages/page_fluxbox_settings.h new file mode 100644 index 00000000..b78b204b --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_fluxbox_settings.h @@ -0,0 +1,43 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_CONFIG_PAGE_FLUXBOX_SETTINGS_H +#define _LUMINA_CONFIG_PAGE_FLUXBOX_SETTINGS_H +#include "../globals.h" +#include "PageWidget.h" + +namespace Ui{ + class page_fluxbox_settings; +}; + +class page_fluxbox_settings : public PageWidget{ + Q_OBJECT +public: + page_fluxbox_settings(QWidget *parent); + ~page_fluxbox_settings(); + +public slots: + void SaveSettings(); + void LoadSettings(int screennum); + void updateIcons(); + +private: + Ui::page_fluxbox_settings *ui; + bool loading; + + //Read/overwrite a text file + QStringList readFile(QString path); + bool overwriteFile(QString path, QStringList contents); + +private slots: + //Simplification function for widget connections + void settingChanged(){ + if(!loading){ emit HasPendingChanges(true); } + } + + void sessionthemechanged(); +}; +#endif diff --git a/src-qt5/core-utils/lumina-config/pages/page_fluxbox_settings.ui b/src-qt5/core-utils/lumina-config/pages/page_fluxbox_settings.ui index e15f1dd9..677eac62 100644 --- a/src-qt5/core-utils/lumina-config/pages/page_fluxbox_settings.ui +++ b/src-qt5/core-utils/lumina-config/pages/page_fluxbox_settings.ui @@ -14,6 +14,18 @@ <string>Form</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> + <property name="leftMargin"> + <number>6</number> + </property> + <property name="topMargin"> + <number>6</number> + </property> + <property name="rightMargin"> + <number>6</number> + </property> + <property name="bottomMargin"> + <number>6</number> + </property> <item> <layout class="QFormLayout" name="formLayout_4"> <item row="0" column="0"> @@ -87,8 +99,8 @@ <rect> <x>0</x> <y>0</y> - <width>356</width> - <height>109</height> + <width>362</width> + <height>115</height> </rect> </property> <property name="sizePolicy"> diff --git a/src-qt5/core-utils/lumina-config/pages/page_interface_desktop.cpp b/src-qt5/core-utils/lumina-config/pages/page_interface_desktop.cpp new file mode 100644 index 00000000..9c319780 --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_interface_desktop.cpp @@ -0,0 +1,152 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "page_interface_desktop.h" +#include "ui_page_interface_desktop.h" +#include "getPage.h" +#include "../GetPluginDialog.h" +#include "../AppDialog.h" + +//========== +// PUBLIC +//========== +page_interface_desktop::page_interface_desktop(QWidget *parent) : PageWidget(parent), ui(new Ui::page_interface_desktop()){ + ui->setupUi(this); + PINFO = new LPlugins(); + connect(ui->tool_desktop_addplugin, SIGNAL(clicked()), this, SLOT(deskplugadded()) ); + connect(ui->tool_desktop_rmplugin, SIGNAL(clicked()), this, SLOT(deskplugremoved()) ); + connect(ui->check_desktop_autolaunchers, SIGNAL(clicked()), this, SLOT(settingChanged()) ); + updateIcons(); +} + +page_interface_desktop::~page_interface_desktop(){ + delete PINFO; +} + +//================ +// PUBLIC SLOTS +//================ +void page_interface_desktop::SaveSettings(){ + QSettings settings("lumina-desktop","desktopsettings"); + QString DPrefix = "desktop-"+QString::number(cscreen)+"/"; + + QStringList plugs; + for(int i=0; i<ui->list_desktop_plugins->count(); i++){ + plugs << ui->list_desktop_plugins->item(i)->whatsThis(); + } + if(settings.value(DPrefix+"pluginlist",QStringList()).toStringList() != plugs){ + settings.setValue(DPrefix+"pluginlist", plugs); + } + //The plugin ID's will be changed to unique ID's by the desktop - reload in a moment + emit HasPendingChanges(false); + QTimer::singleShot(1000, this, SLOT(LoadSettings()) ); +} + +void page_interface_desktop::LoadSettings(int screennum){ + if(screennum>=0){ + cscreen = screennum; + } + emit HasPendingChanges(false); + emit ChangePageTitle( tr("Desktop Settings") ); + QSettings settings("lumina-desktop","desktopsettings"); + QString DPrefix = "desktop-"+QString::number(cscreen)+"/"; + + QStringList dplugs = settings.value(DPrefix+"pluginlist",QStringList()).toStringList(); + ui->list_desktop_plugins->clear(); + for(int i=0; i<dplugs.length(); i++){ + QListWidgetItem* it = new QListWidgetItem(); + it->setWhatsThis(dplugs[i]); //save the full thing instantly + //Now load the rest of the info about the plugin + QString num; + if(dplugs[i].contains("---")){ + num = dplugs[i].section("---",1,1).section(".",1,1).simplified(); //Skip the screen number + if(num=="1"){ num.clear(); } //don't bother showing the number + dplugs[i] = dplugs[i].section("---",0,0); + } + if(dplugs[i].startsWith("applauncher::")){ + bool ok = false; + XDGDesktop app = LXDG::loadDesktopFile(dplugs[i].section("::",1,50), ok); + if(!ok){ continue; } //invalid for some reason + //Now fill the item with the necessary info + it->setText(app.name); + it->setIcon(LXDG::findIcon(app.icon,"") ); + it->setToolTip(app.comment); + }else{ + //Load the info for this plugin + LPI info = PINFO->desktopPluginInfo(dplugs[i]); + if( info.ID.isEmpty() ){ continue; } //invalid plugin for some reason + it->setText(info.name); + it->setToolTip(info.description); + it->setIcon( LXDG::findIcon(info.icon,"") ); + } + if(!num.isEmpty()){ it->setText( it->text()+" ("+num+")"); } //append the number + ui->list_desktop_plugins->addItem(it); + } +} + +void page_interface_desktop::updateIcons(){ + ui->tool_desktop_addplugin->setIcon( LXDG::findIcon("list-add","") ); + ui->tool_desktop_rmplugin->setIcon( LXDG::findIcon("list-remove","") ); +} + +//================= +// PRIVATE +//================= +XDGDesktop page_interface_desktop::getSysApp(bool allowreset){ + AppDialog dlg(this, LXDG::sortDesktopNames( LXDG::systemDesktopFiles() ) ); + dlg.allowReset(allowreset); + dlg.exec(); + XDGDesktop desk; + if(dlg.appreset && allowreset){ + desk.filePath = "reset"; //special internal flag + }else{ + desk = dlg.appselected; + } + return desk; +} + +//================= +// PRIVATE SLOTS +//================= +void page_interface_desktop::deskplugadded(){ + GetPluginDialog dlg(this); + dlg.LoadPlugins("desktop", PINFO); + dlg.exec(); + if( !dlg.selected ){ return; } //cancelled + QString newplug = dlg.plugID; + QListWidgetItem *it = new QListWidgetItem(); + if(newplug=="applauncher"){ + //Prompt for the application to add + XDGDesktop app = getSysApp(); + if(app.filePath.isEmpty()){ return; } //cancelled + newplug.append("::"+app.filePath); + //Now fill the item with the necessary info + it->setWhatsThis(newplug); + it->setText(app.name); + it->setIcon(LXDG::findIcon(app.icon,"") ); + it->setToolTip(app.comment); + }else{ + //Load the info for this plugin + LPI info = PINFO->desktopPluginInfo(newplug); + if( info.ID.isEmpty() ){ return; } //invalid plugin for some reason (should never happen) + it->setWhatsThis(newplug); + it->setText(info.name); + it->setToolTip(info.description); + it->setIcon( LXDG::findIcon(info.icon,"") ); + } + ui->list_desktop_plugins->addItem(it); + ui->list_desktop_plugins->scrollToItem(it); + settingChanged(); +} + +void page_interface_desktop::deskplugremoved(){ + QList<QListWidgetItem*> sel = ui->list_desktop_plugins->selectedItems(); + if(sel.isEmpty()){ return; } //nothing to do + for(int i=0; i<sel.length(); i++){ + delete sel[i]; + } + settingChanged(); +} diff --git a/src-qt5/core-utils/lumina-config/pages/page_interface_desktop.h b/src-qt5/core-utils/lumina-config/pages/page_interface_desktop.h new file mode 100644 index 00000000..e212182a --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_interface_desktop.h @@ -0,0 +1,42 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_CONFIG_PAGE_INTERFACE_DESKTOP_H +#define _LUMINA_CONFIG_PAGE_INTERFACE_DESKTOP_H +#include "../globals.h" +#include "PageWidget.h" +#include "../LPlugins.h" + +namespace Ui{ + class page_interface_desktop; +}; + +class page_interface_desktop : public PageWidget{ + Q_OBJECT +public: + page_interface_desktop(QWidget *parent); + ~page_interface_desktop(); + + bool needsScreenSelector(){ return true; } + +public slots: + void SaveSettings(); + void LoadSettings(int screennum = -1); + void updateIcons(); + +private: + Ui::page_interface_desktop *ui; + int cscreen; //current monitor/screen number + LPlugins *PINFO; + + //Get an application on the system + XDGDesktop getSysApp(bool allowreset = false); + +private slots: + void deskplugadded(); + void deskplugremoved(); +}; +#endif diff --git a/src-qt5/core-utils/lumina-config/pages/page_interface_menu.cpp b/src-qt5/core-utils/lumina-config/pages/page_interface_menu.cpp new file mode 100644 index 00000000..742c5728 --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_interface_menu.cpp @@ -0,0 +1,164 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "page_interface_menu.h" +#include "ui_page_interface_menu.h" +#include "getPage.h" +#include "../AppDialog.h" +#include "../GetPluginDialog.h" + +//========== +// PUBLIC +//========== +page_interface_menu::page_interface_menu(QWidget *parent) : PageWidget(parent), ui(new Ui::page_interface_menu()){ + ui->setupUi(this); + PINFO = new LPlugins(); + 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->list_menu, SIGNAL(currentRowChanged(int)), this, SLOT(checkmenuicons()) ); + + updateIcons(); +} + +page_interface_menu::~page_interface_menu(){ + delete PINFO; +} + +//================ +// PUBLIC SLOTS +//================ +void page_interface_menu::SaveSettings(){ + QSettings settings("lumina-desktop","desktopsettings"); + QStringList items; + for(int i=0; i<ui->list_menu->count(); i++){ + items << ui->list_menu->item(i)->whatsThis(); + } + settings.setValue("menu/itemlist", items); + emit HasPendingChanges(false); +} + +void page_interface_menu::LoadSettings(int){ + emit HasPendingChanges(false); + emit ChangePageTitle( tr("Desktop Settings") ); + QSettings settings("lumina-desktop","desktopsettings"); + +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 +} + +void page_interface_menu::updateIcons(){ + 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","") ); +} + +//================= +// PRIVATE +//================= +XDGDesktop page_interface_menu::getSysApp(bool allowreset){ + AppDialog dlg(this, LXDG::sortDesktopNames( LXDG::systemDesktopFiles() ) ); + dlg.allowReset(allowreset); + dlg.exec(); + XDGDesktop desk; + if(dlg.appreset && allowreset){ + desk.filePath = "reset"; //special internal flag + }else{ + desk = dlg.appselected; + } + return desk; +} + +//================= +// PRIVATE SLOTS +//================= +void page_interface_menu::addmenuplugin(){ + GetPluginDialog dlg(this); + dlg.LoadPlugins("menu", PINFO); + dlg.exec(); + if(!dlg.selected){ return; } //cancelled + QString plug = dlg.plugID; + //Now add the item to the list + LPI info = PINFO->menuPluginInfo(plug); + 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 + settingChanged(); +} + +void page_interface_menu::rmmenuplugin(){ + if(ui->list_menu->currentRow() < 0){ return; } //no selection + delete ui->list_menu->takeItem( ui->list_menu->currentRow() ); + settingChanged(); +} + +void page_interface_menu::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); + + checkmenuicons(); + settingChanged(); +} + +void page_interface_menu::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); + + checkmenuicons(); + settingChanged(); +} + +void page_interface_menu::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 ); +} diff --git a/src-qt5/core-utils/lumina-config/pages/page_interface_menu.h b/src-qt5/core-utils/lumina-config/pages/page_interface_menu.h new file mode 100644 index 00000000..f2a53007 --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_interface_menu.h @@ -0,0 +1,41 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_CONFIG_PAGE_INTERFACE_MENU_H +#define _LUMINA_CONFIG_PAGE_INTERFACE_MENU_H +#include "../globals.h" +#include "PageWidget.h" +#include "../LPlugins.h" + +namespace Ui{ + class page_interface_menu; +}; + +class page_interface_menu : public PageWidget{ + Q_OBJECT +public: + page_interface_menu(QWidget *parent); + ~page_interface_menu(); + +public slots: + void SaveSettings(); + void LoadSettings(int screennum); + void updateIcons(); + +private: + Ui::page_interface_menu *ui; + LPlugins *PINFO; + //Get an application on the system + XDGDesktop getSysApp(bool allowreset = false); + +private slots: + void addmenuplugin(); + void rmmenuplugin(); + void upmenuplugin(); + void downmenuplugin(); + void checkmenuicons(); +}; +#endif diff --git a/src-qt5/core-utils/lumina-config/pages/page_interface_menu.ui b/src-qt5/core-utils/lumina-config/pages/page_interface_menu.ui index 1d230494..4579ef54 100644 --- a/src-qt5/core-utils/lumina-config/pages/page_interface_menu.ui +++ b/src-qt5/core-utils/lumina-config/pages/page_interface_menu.ui @@ -15,16 +15,16 @@ </property> <layout class="QVBoxLayout" name="verticalLayout"> <property name="leftMargin"> - <number>0</number> + <number>6</number> </property> <property name="topMargin"> - <number>0</number> + <number>6</number> </property> <property name="rightMargin"> - <number>0</number> + <number>6</number> </property> <property name="bottomMargin"> - <number>0</number> + <number>6</number> </property> <item> <widget class="QLabel" name="label_10"> diff --git a/src-qt5/core-utils/lumina-config/pages/page_interface_panels.cpp b/src-qt5/core-utils/lumina-config/pages/page_interface_panels.cpp new file mode 100644 index 00000000..9d940033 --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_interface_panels.cpp @@ -0,0 +1,143 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "page_interface_panels.h" +#include "ui_page_interface_panels.h" +#include "getPage.h" +#include "../GetPluginDialog.h" +#include "../AppDialog.h" + +//========== +// PUBLIC +//========== +page_interface_panels::page_interface_panels(QWidget *parent) : PageWidget(parent), ui(new Ui::page_interface_panels()){ + ui->setupUi(this); + loading = false; + PINFO = new LPlugins(); + settings = new QSettings("lumina-desktop","desktopsettings"); + connect(ui->tool_panels_add, SIGNAL(clicked()), this, SLOT(newPanel()) ); + updateIcons(); +} + +page_interface_panels::~page_interface_panels(){ + delete PINFO; +} + +//================ +// PUBLIC SLOTS +//================ +void page_interface_panels::SaveSettings(){ + QString DPrefix = "desktop-"+QString::number(cscreen)+"/"; + settings->setValue(DPrefix+"panels", PANELS.length()); + for(int i=0; i<PANELS.length(); i++){ + PANELS[i]->SaveSettings(settings); + } + //The plugin ID's will be changed to unique ID's by the desktop - reload in a moment + emit HasPendingChanges(false); + settings->sync(); //save to disk right now + QTimer::singleShot(1000, this, SLOT(LoadSettings()) ); +} + +void page_interface_panels::LoadSettings(int screennum){ + if(screennum>=0){ + cscreen = screennum; + } + loading = true; + emit HasPendingChanges(false); + emit ChangePageTitle( tr("Desktop Settings") ); + QString DPrefix = "desktop-"+QString::number(cscreen)+"/"; + int panelnumber = settings->value(DPrefix+"panels",-1).toInt(); + +//First clean any current panels + for(int i=0; i<PANELS.length(); i++){ delete PANELS.takeAt(i); i--; } + //Now create new panels + if(ui->scroll_panels->widget()->layout()==0){ + ui->scroll_panels->widget()->setLayout( new QHBoxLayout() ); + ui->scroll_panels->widget()->layout()->setContentsMargins(0,0,0,0); + } + ui->scroll_panels->widget()->layout()->setAlignment(Qt::AlignLeft); + //Clear anything left over in the layout + for(int i=0; i<ui->scroll_panels->widget()->layout()->count(); i++){ + delete ui->scroll_panels->widget()->layout()->takeAt(i); + } + for(int i=0; i<panelnumber; i++){ + PanelWidget *tmp = new PanelWidget(ui->scroll_panels->widget(), this, PINFO); + tmp->LoadSettings(settings, cscreen, i); + PANELS << tmp; + connect(tmp, SIGNAL(PanelChanged()), this, SLOT(panelValChanged()) ); + connect(tmp, SIGNAL(PanelRemoved(int)), this, SLOT(removePanel(int)) ); + ui->scroll_panels->widget()->layout()->addWidget(tmp); + } + static_cast<QHBoxLayout*>(ui->scroll_panels->widget()->layout())->addStretch(); + + QApplication::processEvents(); + loading = false; +} + +void page_interface_panels::updateIcons(){ + ui->tool_panels_add->setIcon( LXDG::findIcon("list-add","") ); +} + +//================= +// PRIVATE +//================= +/*XDGDesktop page_interface_panels::getSysApp(bool allowreset){ + AppDialog dlg(this, LXDG::sortDesktopNames( LXDG::systemDesktopFiles() ) ); + dlg.allowReset(allowreset); + dlg.exec(); + XDGDesktop desk; + if(dlg.appreset && allowreset){ + desk.filePath = "reset"; //special internal flag + }else{ + desk = dlg.appselected; + } + return desk; +}*/ + +//================= +// PRIVATE SLOTS +//================= +void page_interface_panels::panelValChanged(){ + ui->tool_panels_add->setEnabled(panelnumber < 12); + if(!loading){ settingChanged(); } +} + +void page_interface_panels::newPanel(){ + if(panelnumber<0){ panelnumber=0; } //just in case + panelnumber++; + //Now create a new Panel widget with this number + PanelWidget *tmp = new PanelWidget(ui->scroll_panels->widget(), this, PINFO); + tmp->LoadSettings(settings, cscreen, panelnumber-1); + PANELS << tmp; + connect(tmp, SIGNAL(PanelChanged()), this, SLOT(panelValChanged()) ); + connect(tmp, SIGNAL(PanelRemoved(int)), this, SLOT(removePanel(int)) ); + static_cast<QBoxLayout*>(ui->scroll_panels->widget()->layout())->insertWidget(PANELS.length()-1, tmp); + //update the widget first (2 necessary for scroll below to work) + ui->scroll_panels->update(); + QApplication::processEvents(); + QApplication::processEvents(); + ui->scroll_panels->ensureWidgetVisible(tmp); + panelValChanged(); +} + +void page_interface_panels::removePanel(int pan){ + //connected to a signal from the panel widget + bool changed = false; + for(int i=0; i<PANELS.length(); i++){ + int num = PANELS[i]->PanelNumber(); + if(num==pan){ + delete PANELS.takeAt(i); + i--; + changed = true; + }else if(num > pan){ + PANELS[i]->ChangePanelNumber(num-1); + changed = true; + } + } + if(!changed){ return; } //nothing done + panelnumber--; + panelValChanged(); +} diff --git a/src-qt5/core-utils/lumina-config/pages/page_interface_panels.h b/src-qt5/core-utils/lumina-config/pages/page_interface_panels.h new file mode 100644 index 00000000..308bbd9a --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_interface_panels.h @@ -0,0 +1,48 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_CONFIG_PAGE_INTERFACE_PANELS_H +#define _LUMINA_CONFIG_PAGE_INTERFACE_PANELS_H +#include "../globals.h" +#include "PageWidget.h" +#include "../LPlugins.h" +#include "../PanelWidget.h" + +namespace Ui{ + class page_interface_panels; +}; + +class page_interface_panels : public PageWidget{ + Q_OBJECT +public: + page_interface_panels(QWidget *parent); + ~page_interface_panels(); + + bool needsScreenSelector(){ return true; } + +public slots: + void SaveSettings(); + void LoadSettings(int screennum = -1); + void updateIcons(); + +private: + Ui::page_interface_panels *ui; + bool loading; + int cscreen; //current monitor/screen number + int panelnumber; //current number of panels + QSettings *settings; + LPlugins *PINFO; + QList<PanelWidget*> PANELS; + + //Get an application on the system + //XDGDesktop getSysApp(bool allowreset = false); + +private slots: + void panelValChanged(); + void newPanel(); + void removePanel(int); //connected to a signal from the panel widget +}; +#endif diff --git a/src-qt5/core-utils/lumina-config/pages/page_main.cpp b/src-qt5/core-utils/lumina-config/pages/page_main.cpp index a45c0477..976e7c69 100644 --- a/src-qt5/core-utils/lumina-config/pages/page_main.cpp +++ b/src-qt5/core-utils/lumina-config/pages/page_main.cpp @@ -6,20 +6,72 @@ //=========================================== #include "page_main.h" #include "ui_page_main.h" +#include "getPage.h" //========== // PUBLIC //========== page_main::page_main(QWidget *parent) : PageWidget(parent), ui(new Ui::page_main()){ ui->setupUi(this); - + ui->treeWidget->setMouseTracking(true); + ui->treeWidget->setSortingEnabled(false); //the QTreeView sort flag always puts them in backwards (reverse-alphabetical) + connect(ui->treeWidget, SIGNAL(itemActivated(QTreeWidgetItem*,int)), this, SLOT(itemTriggered(QTreeWidgetItem*)) ); + connect(ui->treeWidget, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(itemTriggered(QTreeWidgetItem*)) ); + connect(ui->lineEdit, SIGNAL(textChanged(QString)), this, SLOT(searchChanged(QString)) ); } page_main::~page_main(){ } - +void page_main::UpdateItems(QString search){ + ui->treeWidget->clear(); + //First create the categories + QTreeWidgetItem *interface = new QTreeWidgetItem(); + interface->setIcon(0, LXDG::findIcon("preferences-desktop","")); + interface->setText(0, tr("Interface Configuration")); + QTreeWidgetItem *appearance = new QTreeWidgetItem(); + appearance->setIcon(0, LXDG::findIcon("preferences-desktop-color","")); + appearance->setText(0, tr("Appearance")); + QTreeWidgetItem *session = new QTreeWidgetItem(); + session->setIcon(0, LXDG::findIcon("preferences-system-session-services","")); + session->setText(0, tr("Desktop Session Options")); + QTreeWidgetItem *user = new QTreeWidgetItem(); + user->setIcon(0, LXDG::findIcon("preferences-desktop-user","")); + user->setText(0, tr("User Settings")); + //Now go through and add in the known pages for each category + QStringList SL = search.split(" "); //search list + for(int i=0; i<INFO.length(); i++){ + if(!search.isEmpty() ){ + //See if this item needs to be included or not + QStringList info; info << INFO[i].name.split(" ") << INFO[i].title.split(" ") << INFO[i].comment.split(" ") << INFO[i].search_tags; + info.removeDuplicates(); //remove any duplicate terms/info first + bool ok = true; + for(int s=0; s<SL.length() && ok; s++){ + ok = !info.filter(SL[s]).isEmpty(); + } + if(!ok){ continue; } //no duplicates between search terms and available info + } + //qDebug() << "Item Found:" << INFO[i].id << INFO[i].title; + QTreeWidgetItem *it = new QTreeWidgetItem(); + it->setIcon(0, LXDG::findIcon(INFO[i].icon,"") ); + it->setText(0, INFO[i].name); + it->setStatusTip(0, INFO[i].comment); + it->setToolTip(0, INFO[i].comment); + it->setWhatsThis(0, INFO[i].id); + if(INFO[i].category=="interface"){ interface->addChild(it); } + else if(INFO[i].category=="appearance"){ appearance->addChild(it); } + else if(INFO[i].category=="session"){ session->addChild(it); } + else if(INFO[i].category=="user"){ user->addChild(it); } + else{ ui->treeWidget->addTopLevelItem(it); } + } + //Now add the categories to the tree widget if they are non-empty + if(interface->childCount()>0){ ui->treeWidget->addTopLevelItem(interface); interface->setExpanded(!search.isEmpty()); } + if(appearance->childCount()>0){ ui->treeWidget->addTopLevelItem(appearance); appearance->setExpanded(!search.isEmpty()); } + if(session->childCount()>0){ ui->treeWidget->addTopLevelItem(session); session->setExpanded(!search.isEmpty()); } + if(user->childCount()>0){ ui->treeWidget->addTopLevelItem(user); user->setExpanded(!search.isEmpty()); } + ui->treeWidget->sortItems(0, Qt::AscendingOrder); +} //================ // PUBLIC SLOTS @@ -28,14 +80,30 @@ void page_main::SaveSettings(){ } -void page_main::LoadSettings(int screennum){ - +void page_main::LoadSettings(int){ + emit HasPendingChanges(false); + emit ChangePageTitle( tr("Desktop Settings") ); + INFO.clear(); + INFO = KnownPages(); + UpdateItems(""); + ui->lineEdit->setFocus(); } void page_main::updateIcons(){ + UpdateItems(""); +} +//================= +// PRIVATE SLOTS +//================= +void page_main::itemTriggered(QTreeWidgetItem *it){ + if(it->childCount()>0){ + it->setExpanded( !it->isExpanded() ); + }else if(!it->whatsThis(0).isEmpty()){ + emit ChangePage(it->whatsThis(0)); + } } -//=========== -// PRIVATE -//=========== +void page_main::searchChanged(QString txt){ + UpdateItems(txt.simplified()); +} diff --git a/src-qt5/core-utils/lumina-config/pages/page_main.h b/src-qt5/core-utils/lumina-config/pages/page_main.h index d5c5c8be..2e38eb64 100644 --- a/src-qt5/core-utils/lumina-config/pages/page_main.h +++ b/src-qt5/core-utils/lumina-config/pages/page_main.h @@ -26,8 +26,12 @@ public slots: private: Ui::page_main *ui; + QList<PAGEINFO> INFO; + + void UpdateItems(QString search); private slots: - + void itemTriggered(QTreeWidgetItem*); + void searchChanged(QString); }; #endif diff --git a/src-qt5/core-utils/lumina-config/pages/page_main.ui b/src-qt5/core-utils/lumina-config/pages/page_main.ui index 31cb372f..2331152b 100644 --- a/src-qt5/core-utils/lumina-config/pages/page_main.ui +++ b/src-qt5/core-utils/lumina-config/pages/page_main.ui @@ -15,25 +15,62 @@ </property> <layout class="QVBoxLayout" name="verticalLayout"> <property name="leftMargin"> - <number>0</number> + <number>2</number> </property> <property name="topMargin"> <number>0</number> </property> <property name="rightMargin"> - <number>0</number> + <number>2</number> </property> <property name="bottomMargin"> <number>0</number> </property> <item> + <widget class="QLineEdit" name="lineEdit"> + <property name="placeholderText"> + <string>Search for....</string> + </property> + </widget> + </item> + <item> <widget class="QTreeWidget" name="treeWidget"> + <property name="focusPolicy"> + <enum>Qt::NoFocus</enum> + </property> <property name="styleSheet"> <string notr="true">QTreeWidget{background: transparent; }</string> </property> + <property name="editTriggers"> + <set>QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked</set> + </property> + <property name="iconSize"> + <size> + <width>32</width> + <height>32</height> + </size> + </property> + <property name="indentation"> + <number>20</number> + </property> + <property name="uniformRowHeights"> + <bool>true</bool> + </property> <property name="sortingEnabled"> <bool>true</bool> </property> + <property name="animated"> + <bool>true</bool> + </property> + <property name="allColumnsShowFocus"> + <bool>false</bool> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + <property name="expandsOnDoubleClick"> + <bool>false</bool> + </property> <attribute name="headerVisible"> <bool>false</bool> </attribute> diff --git a/src-qt5/core-utils/lumina-config/pages/page_sample.cpp b/src-qt5/core-utils/lumina-config/pages/page_sample.cpp new file mode 100644 index 00000000..0256df8d --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_sample.cpp @@ -0,0 +1,48 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "page_sample.h" +#include "ui_page_sample.h" +#include "getPage.h" + +//========== +// PUBLIC +//========== +page_sample::page_sample(QWidget *parent) : PageWidget(parent), ui(new Ui::page_sample()){ + ui->setupUi(this); + + updateIcons(); +} + +page_sample::~page_sample(){ + +} + +//================ +// PUBLIC SLOTS +//================ +void page_sample::SaveSettings(){ + + emit HasPendingChanged(false); +} + +void page_sample::LoadSettings(int){ + emit HasPendingChanges(false); + emit ChangePageTitle( tr("Desktop Settings") ); + +} + +void page_sample::updateIcons(){ + +} + +//================= +// PRIVATE +//================= + +//================= +// PRIVATE SLOTS +//================= diff --git a/src-qt5/core-utils/lumina-config/pages/page_sample.h b/src-qt5/core-utils/lumina-config/pages/page_sample.h new file mode 100644 index 00000000..f31e981d --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_sample.h @@ -0,0 +1,33 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_CONFIG_PAGE_SAMPLE_H +#define _LUMINA_CONFIG_PAGE_SAMPLE_H +#include "../globals.h" +#include "PageWidget.h" + +namespace Ui{ + class page_sample; +}; + +class page_sample : public PageWidget{ + Q_OBJECT +public: + page_sample(QWidget *parent); + ~page_sample(); + +public slots: + void SaveSettings(); + void LoadSettings(int screennum); + void updateIcons(); + +private: + Ui::page_sample *ui; + +private slots: + +}; +#endif diff --git a/src-qt5/core-utils/lumina-config/pages/page_session_locale.cpp b/src-qt5/core-utils/lumina-config/pages/page_session_locale.cpp new file mode 100644 index 00000000..ad5aa7f7 --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_session_locale.cpp @@ -0,0 +1,113 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "page_session_locale.h" +#include "ui_page_session_locale.h" +#include "getPage.h" + +//========== +// PUBLIC +//========== +page_session_locale::page_session_locale(QWidget *parent) : PageWidget(parent), ui(new Ui::page_session_locale()){ + ui->setupUi(this); + setupLocales(); + connect(ui->combo_locale_lang, SIGNAL(currentIndexChanged(int)), this, SLOT(settingChanged()) ); + connect(ui->combo_locale_collate, SIGNAL(currentIndexChanged(int)), this, SLOT(settingChanged()) ); + connect(ui->combo_locale_ctype, SIGNAL(currentIndexChanged(int)), this, SLOT(settingChanged()) ); + connect(ui->combo_locale_message, SIGNAL(currentIndexChanged(int)), this, SLOT(settingChanged()) ); + connect(ui->combo_locale_monetary, SIGNAL(currentIndexChanged(int)), this, SLOT(settingChanged()) ); + connect(ui->combo_locale_numeric, SIGNAL(currentIndexChanged(int)), this, SLOT(settingChanged()) ); + connect(ui->combo_locale_time, SIGNAL(currentIndexChanged(int)), this, SLOT(settingChanged()) ); + updateIcons(); +} + +page_session_locale::~page_session_locale(){ + +} + +//================ +// PUBLIC SLOTS +//================ +void page_session_locale::SaveSettings(){ + QSettings sessionsettings("lumina-desktop","sessionsettings"); + sessionsettings.setValue("InitLocale/LANG", ui->combo_locale_lang->currentData().toString() ); + sessionsettings.setValue("InitLocale/LC_MESSAGES", ui->combo_locale_message->currentData().toString() ); + sessionsettings.setValue("InitLocale/LC_TIME", ui->combo_locale_time->currentData().toString() ); + sessionsettings.setValue("InitLocale/LC_NUMERIC", ui->combo_locale_numeric->currentData().toString() ); + sessionsettings.setValue("InitLocale/LC_MONETARY", ui->combo_locale_monetary->currentData().toString() ); + sessionsettings.setValue("InitLocale/LC_COLLATE", ui->combo_locale_collate->currentData().toString() ); + sessionsettings.setValue("InitLocale/LC_CTYPE", ui->combo_locale_ctype->currentData().toString() ); + emit HasPendingChanges(false); +} + +void page_session_locale::LoadSettings(int){ + emit HasPendingChanges(false); + emit ChangePageTitle( tr("Desktop Settings") ); + QSettings sessionsettings("lumina-desktop","sessionsettings"); + + QString val = sessionsettings.value("InitLocale/LANG", "").toString(); + int index = ui->combo_locale_lang->findData(val); + if(index<0){ index = 0; } //system default + ui->combo_locale_lang->setCurrentIndex(index); + val = sessionsettings.value("InitLocale/LC_MESSAGES", "").toString(); + index = ui->combo_locale_message->findData(val); + if(index<0){ index = 0; } //system default + ui->combo_locale_message->setCurrentIndex(index); + val = sessionsettings.value("InitLocale/LC_TIME", "").toString(); + index = ui->combo_locale_time->findData(val); + if(index<0){ index = 0; } //system default + ui->combo_locale_time->setCurrentIndex(index); + val = sessionsettings.value("InitLocale/NUMERIC", "").toString(); + index = ui->combo_locale_numeric->findData(val); + if(index<0){ index = 0; } //system default + ui->combo_locale_numeric->setCurrentIndex(index); + val = sessionsettings.value("InitLocale/MONETARY", "").toString(); + index = ui->combo_locale_monetary->findData(val); + if(index<0){ index = 0; } //system default + ui->combo_locale_monetary->setCurrentIndex(index); + val = sessionsettings.value("InitLocale/COLLATE", "").toString(); + index = ui->combo_locale_collate->findData(val); + if(index<0){ index = 0; } //system default + ui->combo_locale_collate->setCurrentIndex(index); + val = sessionsettings.value("InitLocale/CTYPE", "").toString(); + index = ui->combo_locale_ctype->findData(val); + if(index<0){ index = 0; } //system default + ui->combo_locale_ctype->setCurrentIndex(index); +} + +void page_session_locale::updateIcons(){ + +} + +//================= +// PRIVATE +//================= +void page_session_locale::setupLocales(){ +//Available localizations + QStringList langs = LUtils::knownLocales(); + langs.sort(); + QString def = tr("System Default"); + ui->combo_locale_lang->addItem(def,""); + ui->combo_locale_collate->addItem(def,""); + ui->combo_locale_ctype->addItem(def,""); + ui->combo_locale_message->addItem(def,""); + ui->combo_locale_monetary->addItem(def,""); + ui->combo_locale_numeric->addItem(def,""); + ui->combo_locale_time->addItem(def,""); + for(int i=0; i<langs.length(); i++){ + QString lan = QLocale(langs[i]).nativeLanguageName(); + ui->combo_locale_lang->addItem(lan,langs[i]); + ui->combo_locale_collate->addItem(lan,langs[i]); + ui->combo_locale_ctype->addItem(lan,langs[i]); + ui->combo_locale_message->addItem(lan,langs[i]); + ui->combo_locale_monetary->addItem(lan,langs[i]); + ui->combo_locale_numeric->addItem(lan,langs[i]); + ui->combo_locale_time->addItem(lan,langs[i]); + } +} +//================= +// PRIVATE SLOTS +//================= diff --git a/src-qt5/core-utils/lumina-config/pages/page_session_locale.h b/src-qt5/core-utils/lumina-config/pages/page_session_locale.h new file mode 100644 index 00000000..57b06081 --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_session_locale.h @@ -0,0 +1,35 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_CONFIG_PAGE_SESSION_LOCALE_H +#define _LUMINA_CONFIG_PAGE_SESSION_LOCALE_H +#include "../globals.h" +#include "PageWidget.h" + +namespace Ui{ + class page_session_locale; +}; + +class page_session_locale : public PageWidget{ + Q_OBJECT +public: + page_session_locale(QWidget *parent); + ~page_session_locale(); + +public slots: + void SaveSettings(); + void LoadSettings(int screennum); + void updateIcons(); + +private: + Ui::page_session_locale *ui; + + void setupLocales(); + +private slots: + +}; +#endif diff --git a/src-qt5/core-utils/lumina-config/pages/page_session_locale.ui b/src-qt5/core-utils/lumina-config/pages/page_session_locale.ui index 90cd4ca1..d514e5f2 100644 --- a/src-qt5/core-utils/lumina-config/pages/page_session_locale.ui +++ b/src-qt5/core-utils/lumina-config/pages/page_session_locale.ui @@ -15,16 +15,16 @@ </property> <layout class="QFormLayout" name="formLayout"> <property name="leftMargin"> - <number>0</number> + <number>6</number> </property> <property name="topMargin"> - <number>0</number> + <number>6</number> </property> <property name="rightMargin"> - <number>0</number> + <number>6</number> </property> <property name="bottomMargin"> - <number>0</number> + <number>6</number> </property> <item row="0" column="0" colspan="2"> <widget class="QLabel" name="label_30"> diff --git a/src-qt5/core-utils/lumina-config/pages/page_session_options.cpp b/src-qt5/core-utils/lumina-config/pages/page_session_options.cpp new file mode 100644 index 00000000..4f678ab3 --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_session_options.cpp @@ -0,0 +1,172 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "page_session_options.h" +#include "ui_page_session_options.h" +#include "getPage.h" + +//========== +// PUBLIC +//========== +page_session_options::page_session_options(QWidget *parent) : PageWidget(parent), ui(new Ui::page_session_options()){ + ui->setupUi(this); + + //Display formats for panel clock + ui->combo_session_datetimeorder->clear(); + ui->combo_session_datetimeorder->addItem( tr("Time (Date as tooltip)"), "timeonly"); + ui->combo_session_datetimeorder->addItem( tr("Date (Time as tooltip)"), "dateonly"); + ui->combo_session_datetimeorder->addItem( tr("Time first then Date"), "timedate"); + ui->combo_session_datetimeorder->addItem( tr("Date first then Time"), "datetime"); + + connect(ui->push_session_setUserIcon, SIGNAL(clicked()), this, SLOT(sessionChangeUserIcon()) ); + connect(ui->push_session_resetSysDefaults, SIGNAL(clicked()), this, SLOT(sessionResetSys()) ); + connect(ui->push_session_resetLuminaDefaults, SIGNAL(clicked()), this, SLOT(sessionResetLumina()) ); + connect(ui->tool_help_time, SIGNAL(clicked()), this, SLOT(sessionShowTimeCodes()) ); + connect(ui->tool_help_date, SIGNAL(clicked()), this, SLOT(sessionShowDateCodes()) ); + connect(ui->line_session_time, SIGNAL(textChanged(QString)), this, SLOT(sessionLoadTimeSample()) ); + connect(ui->line_session_date, SIGNAL(textChanged(QString)), this, SLOT(sessionLoadDateSample()) ); + connect(ui->combo_session_datetimeorder, SIGNAL(currentIndexChanged(int)), this, SLOT(settingChanged()) ); + updateIcons(); + +} + +page_session_options::~page_session_options(){ + +} + +//================ +// PUBLIC SLOTS +//================ +void page_session_options::SaveSettings(){ + QSettings sessionsettings("lumina-desktop","sessionsettings"); + sessionsettings.setValue("EnableNumlock", ui->check_session_numlock->isChecked()); + sessionsettings.setValue("PlayStartupAudio", ui->check_session_playloginaudio->isChecked()); + sessionsettings.setValue("PlayLogoutAudio", ui->check_session_playlogoutaudio->isChecked()); + sessionsettings.setValue("TimeFormat", ui->line_session_time->text()); + sessionsettings.setValue("DateFormat", ui->line_session_date->text()); + sessionsettings.setValue("DateTimeOrder", ui->combo_session_datetimeorder->currentData().toString()); + emit HasPendingChanges(false); +} + +void page_session_options::LoadSettings(int){ + emit HasPendingChanges(false); + emit ChangePageTitle( tr("Desktop Settings") ); + QSettings sessionsettings("lumina-desktop","sessionsettings"); + 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() ); + ui->push_session_setUserIcon->setIcon( LXDG::findIcon(QDir::homePath()+"/.loginIcon.png", "user-identity") ); + ui->line_session_time->setText( sessionsettings.value("TimeFormat","").toString() ); + ui->line_session_date->setText( sessionsettings.value("DateFormat","").toString() ); + int index = ui->combo_session_datetimeorder->findData( sessionsettings.value("DateTimeOrder","timeonly").toString() ); + ui->combo_session_datetimeorder->setCurrentIndex(index); + + sessionLoadTimeSample(); + sessionLoadDateSample(); +} + +void page_session_options::updateIcons(){ + ui->push_session_resetSysDefaults->setIcon( LXDG::findIcon("start-here-lumina","view-refresh") ); + ui->push_session_resetLuminaDefaults->setIcon( LXDG::findIcon("Lumina-DE","") ); + ui->tool_help_time->setIcon( LXDG::findIcon("help-about","") ); + ui->tool_help_date->setIcon( LXDG::findIcon("help-about","") ); +} + +//================= +// PRIVATE +//================= + +//================= +// PRIVATE SLOTS +//================= +void page_session_options::sessionChangeUserIcon(){ + //Prompt for a new image file + QStringList imgformats; + QList<QByteArray> fmts = QImageReader::supportedImageFormats(); + for(int i=0; i<fmts.length(); i++){ + imgformats << "*."+QString(fmts[i]); + } + QString filepath = QFileDialog::getOpenFileName(this, tr("Select an image"), QDir::homePath(), \ + tr("Images")+" ("+imgformats.join(" ")+")"); + if(filepath.isEmpty()){ + //User cancelled the operation + if(QFile::exists(QDir::homePath()+"/.loginIcon.png")){ + if(QMessageBox::Yes == QMessageBox::question(this,tr("Reset User Image"), tr("Would you like to reset the user image to the system default?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ){ + //QFile::remove(QDir::homePath()+"/.loginIcon.png"); + ui->push_session_setUserIcon->setWhatsThis("reset"); + }else{ + return; + } + } + }else{ + ui->push_session_setUserIcon->setWhatsThis(filepath); + } + //Now re-load the icon in the UI + QString path = ui->push_session_setUserIcon->whatsThis(); + if(path.isEmpty()){ path = QDir::homePath()+"/.loginIcon.png"; } + if(path=="reset"){ path.clear(); } + ui->push_session_setUserIcon->setIcon( LXDG::findIcon(path, "user-identity") ); + settingChanged(); +} + +void page_session_options::sessionResetSys(){ + LUtils::LoadSystemDefaults(); + QTimer::singleShot(500,this, SLOT(LoadSettings()) ); +} + +void page_session_options::sessionResetLumina(){ + LUtils::LoadSystemDefaults(true); //skip OS customizations + QTimer::singleShot(500,this, SLOT(LoadSettings()) ); +} + +void page_session_options::sessionLoadTimeSample(){ + if(ui->line_session_time->text().simplified().isEmpty()){ + ui->label_session_timesample->setText( QTime::currentTime().toString(Qt::DefaultLocaleShortDate) ); + }else{ + ui->label_session_timesample->setText( QTime::currentTime().toString( ui->line_session_time->text() ) ); + } + settingChanged(); +} + +void page_session_options::sessionShowTimeCodes(){ + QStringList msg; + msg << tr("Valid Time Codes:") << "\n"; + msg << QString(tr("%1: Hour without leading zero (1)")).arg("h"); + msg << QString(tr("%1: Hour with leading zero (01)")).arg("hh"); + msg << QString(tr("%1: Minutes without leading zero (2)")).arg("m"); + msg << QString(tr("%1: Minutes with leading zero (02)")).arg("mm"); + msg << QString(tr("%1: Seconds without leading zero (3)")).arg("s"); + msg << QString(tr("%1: Seconds with leading zero (03)")).arg("ss"); + msg << QString(tr("%1: AM/PM (12-hour) clock (upper or lower case)")).arg("A or a"); + msg << QString(tr("%1: Timezone")).arg("t"); + QMessageBox::information(this, tr("Time Codes"), msg.join("\n") ); +} + +void page_session_options::sessionLoadDateSample(){ + if(ui->line_session_date->text().simplified().isEmpty()){ + ui->label_session_datesample->setText( QDate::currentDate().toString(Qt::DefaultLocaleShortDate) ); + }else{ + ui->label_session_datesample->setText( QDate::currentDate().toString( ui->line_session_date->text() ) ); + } + settingChanged(); +} + +void page_session_options::sessionShowDateCodes(){ + QStringList msg; + msg << tr("Valid Date Codes:") << "\n"; + msg << QString(tr("%1: Numeric day without a leading zero (1)")).arg("d"); + msg << QString(tr("%1: Numeric day with leading zero (01)")).arg("dd"); + msg << QString(tr("%1: Day as abbreviation (localized)")).arg("ddd"); + msg << QString(tr("%1: Day as full name (localized)")).arg("dddd"); + msg << QString(tr("%1: Numeric month without leading zero (2)")).arg("M"); + msg << QString(tr("%1: Numeric month with leading zero (02)")).arg("MM"); + msg << QString(tr("%1: Month as abbreviation (localized)")).arg("MMM"); + msg << QString(tr("%1: Month as full name (localized)")).arg("MMMM"); + msg << QString(tr("%1: Year as 2-digit number (15)")).arg("yy"); + msg << QString(tr("%1: Year as 4-digit number (2015)")).arg("yyyy"); + msg << tr("Text may be contained within single-quotes to ignore replacements"); + QMessageBox::information(this, tr("Date Codes"), msg.join("\n") ); +} diff --git a/src-qt5/core-utils/lumina-config/pages/page_session_options.h b/src-qt5/core-utils/lumina-config/pages/page_session_options.h new file mode 100644 index 00000000..bd293972 --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_session_options.h @@ -0,0 +1,39 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_CONFIG_PAGE_SESSION_OPTIONS_H +#define _LUMINA_CONFIG_PAGE_SESSION_OPTIONS_H +#include "../globals.h" +#include "PageWidget.h" + +namespace Ui{ + class page_session_options; +}; + +class page_session_options : public PageWidget{ + Q_OBJECT +public: + page_session_options(QWidget *parent); + ~page_session_options(); + +public slots: + void SaveSettings(); + void LoadSettings(int screennum = -1); + void updateIcons(); + +private: + Ui::page_session_options *ui; + +private slots: + void sessionChangeUserIcon(); + void sessionResetSys(); + void sessionResetLumina(); + void sessionLoadTimeSample(); + void sessionShowTimeCodes(); + void sessionLoadDateSample(); + void sessionShowDateCodes(); +}; +#endif diff --git a/src-qt5/core-utils/lumina-config/pages/page_session_options.ui b/src-qt5/core-utils/lumina-config/pages/page_session_options.ui index 03453d6d..b0e5fb91 100644 --- a/src-qt5/core-utils/lumina-config/pages/page_session_options.ui +++ b/src-qt5/core-utils/lumina-config/pages/page_session_options.ui @@ -15,16 +15,16 @@ </property> <layout class="QGridLayout" name="gridLayout"> <property name="leftMargin"> - <number>0</number> + <number>6</number> </property> <property name="topMargin"> - <number>0</number> + <number>6</number> </property> <property name="rightMargin"> - <number>0</number> + <number>6</number> </property> <property name="bottomMargin"> - <number>0</number> + <number>6</number> </property> <item row="0" column="0"> <layout class="QVBoxLayout" name="verticalLayout_4"> diff --git a/src-qt5/core-utils/lumina-config/pages/page_theme.cpp b/src-qt5/core-utils/lumina-config/pages/page_theme.cpp new file mode 100644 index 00000000..781e650d --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_theme.cpp @@ -0,0 +1,168 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "page_theme.h" +#include "ui_page_theme.h" + +#include "../ColorDialog.h" +#include "../ThemeDialog.h" +//========== +// PUBLIC +//========== +page_theme::page_theme(QWidget *parent) : PageWidget(parent), ui(new Ui::page_theme()){ + ui->setupUi(this); + loading = false; + PINFO = new LPlugins(); //load the info class + connect(ui->spin_session_fontsize, SIGNAL(valueChanged(int)), this, SLOT(settingsChanged()) ); + connect(ui->combo_session_themefile, SIGNAL(currentIndexChanged(int)), this, SLOT(settingsChanged()) ); + connect(ui->combo_session_colorfile, SIGNAL(currentIndexChanged(int)), this, SLOT(settingsChanged()) ); + connect(ui->combo_session_icontheme, SIGNAL(currentIndexChanged(int)), this, SLOT(settingsChanged()) ); + connect(ui->font_session_theme, SIGNAL(currentIndexChanged(int)), this, SLOT(settingsChanged()) ); + connect(ui->tool_session_newcolor, SIGNAL(clicked()), this, SLOT(sessionEditColor()) ); + connect(ui->tool_session_newtheme, SIGNAL(clicked()), this, SLOT(sessionEditTheme()) ); + + updateIcons(); +} + +page_theme::~page_theme(){ + +} + +//================ +// PUBLIC SLOTS +//================ +void page_theme::SaveSettings(){ + QString themefile = ui->combo_session_themefile->itemData( ui->combo_session_themefile->currentIndex() ).toString(); + QString colorfile = ui->combo_session_colorfile->itemData( ui->combo_session_colorfile->currentIndex() ).toString(); + QString iconset = ui->combo_session_icontheme->currentText(); + QString font = ui->font_session_theme->currentFont().family(); + QString fontsize = QString::number(ui->spin_session_fontsize->value())+"pt"; + //qDebug() << "Saving theme options:" << themefile << colorfile << iconset << font << fontsize; + LTHEME::setCurrentSettings( themefile, colorfile, iconset, font, fontsize); + LTHEME::setCursorTheme(ui->combo_session_cursortheme->currentText()); + emit HasPendingChanges(false); +} + +void page_theme::LoadSettings(int){ + emit HasPendingChanges(false); + emit ChangePageTitle( tr("Theme Settings") ); + + loading = true; + //Load the available settings + ui->combo_session_cursortheme->clear(); + ui->combo_session_cursortheme->addItems( LTHEME::availableSystemCursors() ); + +ui->combo_session_themefile->clear(); + ui->combo_session_colorfile->clear(); + ui->combo_session_icontheme->clear(); + QStringList current = LTHEME::currentSettings(); + // - local theme templates + QStringList tmp = LTHEME::availableLocalThemes(); + tmp.sort(); + for(int i=0; i<tmp.length(); i++){ + ui->combo_session_themefile->addItem(tmp[i].section("::::",0,0)+" ("+tr("Local")+")", tmp[i].section("::::",1,1)); + if(tmp[i].section("::::",1,1)==current[0]){ ui->combo_session_themefile->setCurrentIndex(ui->combo_session_themefile->count()-1); } + } + // - system theme templates + tmp = LTHEME::availableSystemThemes(); + tmp.sort(); + for(int i=0; i<tmp.length(); i++){ + ui->combo_session_themefile->addItem(tmp[i].section("::::",0,0)+" ("+tr("System")+")", tmp[i].section("::::",1,1)); + if(tmp[i].section("::::",1,1)==current[0]){ ui->combo_session_themefile->setCurrentIndex(ui->combo_session_themefile->count()-1); } + } + // - local color schemes + tmp = LTHEME::availableLocalColors(); + tmp.sort(); + for(int i=0; i<tmp.length(); i++){ + ui->combo_session_colorfile->addItem(tmp[i].section("::::",0,0)+" ("+tr("Local")+")", tmp[i].section("::::",1,1)); + if(tmp[i].section("::::",1,1)==current[1]){ ui->combo_session_colorfile->setCurrentIndex(ui->combo_session_colorfile->count()-1); } + } + // - system color schemes + tmp = LTHEME::availableSystemColors(); + tmp.sort(); + for(int i=0; i<tmp.length(); i++){ + ui->combo_session_colorfile->addItem(tmp[i].section("::::",0,0)+" ("+tr("System")+")", tmp[i].section("::::",1,1)); + if(tmp[i].section("::::",1,1)==current[1]){ ui->combo_session_colorfile->setCurrentIndex(ui->combo_session_colorfile->count()-1); } + } + // - icon themes + tmp = LTHEME::availableSystemIcons(); + tmp.sort(); + for(int i=0; i<tmp.length(); i++){ + ui->combo_session_icontheme->addItem(tmp[i]); + if(tmp[i]==current[2]){ ui->combo_session_icontheme->setCurrentIndex(i); } + } + // - Font + ui->font_session_theme->setCurrentFont( QFont(current[3]) ); + // - Font Size + ui->spin_session_fontsize->setValue( current[4].section("p",0,0).toInt() ); + + int cur = ui->combo_session_cursortheme->findText( LTHEME::currentCursor() ); + if(cur>=0){ ui->combo_session_cursortheme->setCurrentIndex(cur); } + + QApplication::processEvents(); + loading = false; +} + +void page_theme::updateIcons(){ + ui->tool_session_newtheme->setIcon( LXDG::findIcon("preferences-desktop-theme","") ); + ui->tool_session_newcolor->setIcon( LXDG::findIcon("preferences-desktop-color","") ); +} + +//================= +// PRIVATE SLOTS +//================= +void page_theme::sessionEditColor(){ + //Get the current color file + QString file = ui->combo_session_colorfile->itemData( ui->combo_session_colorfile->currentIndex() ).toString(); + //Open the color edit dialog + ColorDialog dlg(this, PINFO, file); + dlg.exec(); + //Check whether the file got saved/changed + if(dlg.colorname.isEmpty() || dlg.colorpath.isEmpty() ){ return; } //cancelled + //Reload the color list and activate the new color + // - local color schemes + ui->combo_session_colorfile->clear(); + QStringList tmp = LTHEME::availableLocalColors(); + tmp.sort(); + for(int i=0; i<tmp.length(); i++){ + ui->combo_session_colorfile->addItem(tmp[i].section("::::",0,0)+" ("+tr("Local")+")", tmp[i].section("::::",1,1)); + if(tmp[i].section("::::",1,1)==dlg.colorpath){ ui->combo_session_colorfile->setCurrentIndex(ui->combo_session_colorfile->count()-1); } + } + // - system color schemes + tmp = LTHEME::availableSystemColors(); + tmp.sort(); + for(int i=0; i<tmp.length(); i++){ + ui->combo_session_colorfile->addItem(tmp[i].section("::::",0,0)+" ("+tr("System")+")", tmp[i].section("::::",1,1)); + if(tmp[i].section("::::",1,1)==dlg.colorpath){ ui->combo_session_colorfile->setCurrentIndex(ui->combo_session_colorfile->count()-1); } + } + emit HasPendingChanges(true); +} + +void page_theme::sessionEditTheme(){ + QString file = ui->combo_session_themefile->itemData( ui->combo_session_themefile->currentIndex() ).toString(); + //Open the theme editor dialog + ThemeDialog dlg(this, PINFO, file); + dlg.exec(); + //Check for file change/save + if(dlg.themename.isEmpty() || dlg.themepath.isEmpty()){ return; } //cancelled + //Reload the theme list and activate the new theme + ui->combo_session_themefile->clear(); + // - local theme templates + QStringList tmp = LTHEME::availableLocalThemes(); + tmp.sort(); + for(int i=0; i<tmp.length(); i++){ + ui->combo_session_themefile->addItem(tmp[i].section("::::",0,0)+" ("+tr("Local")+")", tmp[i].section("::::",1,1)); + if(tmp[i].section("::::",1,1)==dlg.themepath){ ui->combo_session_themefile->setCurrentIndex(ui->combo_session_themefile->count()-1); } + } + // - system theme templates + tmp = LTHEME::availableSystemThemes(); + tmp.sort(); + for(int i=0; i<tmp.length(); i++){ + ui->combo_session_themefile->addItem(tmp[i].section("::::",0,0)+" ("+tr("System")+")", tmp[i].section("::::",1,1)); + if(tmp[i].section("::::",1,1)==dlg.themepath){ ui->combo_session_themefile->setCurrentIndex(ui->combo_session_themefile->count()-1); } + } + emit HasPendingChanges(true); +} diff --git a/src-qt5/core-utils/lumina-config/pages/page_theme.h b/src-qt5/core-utils/lumina-config/pages/page_theme.h new file mode 100644 index 00000000..a56fba7b --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_theme.h @@ -0,0 +1,42 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_CONFIG_PAGE_THEME_H +#define _LUMINA_CONFIG_PAGE_THEME_H +#include "../globals.h" +#include "PageWidget.h" + +#include "../LPlugins.h" + +namespace Ui{ + class page_theme; +}; + +class page_theme : public PageWidget{ + Q_OBJECT +public: + page_theme(QWidget *parent); + ~page_theme(); + +public slots: + void SaveSettings(); + void LoadSettings(int screennum); + void updateIcons(); + +private: + Ui::page_theme *ui; + LPlugins *PINFO; + bool loading; + +private slots: + void settingsChanged(){ + //qDebug() << "Setting Changed:" << !loading; + if(!loading){ emit HasPendingChanges(true); } + } + void sessionEditColor(); + void sessionEditTheme(); +}; +#endif diff --git a/src-qt5/core-utils/lumina-config/pages/page_theme.ui b/src-qt5/core-utils/lumina-config/pages/page_theme.ui index 9c5e2064..decd543f 100644 --- a/src-qt5/core-utils/lumina-config/pages/page_theme.ui +++ b/src-qt5/core-utils/lumina-config/pages/page_theme.ui @@ -15,16 +15,16 @@ </property> <layout class="QFormLayout" name="formLayout"> <property name="leftMargin"> - <number>0</number> + <number>9</number> </property> <property name="topMargin"> - <number>0</number> + <number>9</number> </property> <property name="rightMargin"> - <number>0</number> + <number>9</number> </property> <property name="bottomMargin"> - <number>0</number> + <number>9</number> </property> <item row="0" column="0"> <widget class="QLabel" name="label_12"> diff --git a/src-qt5/core-utils/lumina-config/pages/page_wallpaper.cpp b/src-qt5/core-utils/lumina-config/pages/page_wallpaper.cpp new file mode 100644 index 00000000..b54e07bd --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_wallpaper.cpp @@ -0,0 +1,282 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "page_wallpaper.h" +#include "ui_page_wallpaper.h" +#include "getPage.h" + +//========== +// PUBLIC +//========== +page_wallpaper::page_wallpaper(QWidget *parent) : PageWidget(parent), ui(new Ui::page_wallpaper()){ + ui->setupUi(this); + DEFAULTBG = LOS::LuminaShare()+"/desktop-background.jpg"; + updateIcons(); + 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_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()) ); + connect(ui->combo_desk_layout, SIGNAL(currentIndexChanged(int)), this, SLOT(desktimechanged()) ); //just need to poke the save routines +} + +page_wallpaper::~page_wallpaper(){ + +} + +//================ +// PUBLIC SLOTS +//================ +void page_wallpaper::SaveSettings(){ + QSettings settings("lumina-desktop","desktopsettings"); + QString DPrefix = "desktop-"+QString::number(cScreen)+"/"; + 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"); + } + if(bgs.isEmpty()){ bgs << "default"; } //Make sure to always fall back on the default + settings.setValue(DPrefix+"background/filelist", bgs); + settings.setValue(DPrefix+"background/minutesToChange", ui->spin_desk_min->value()); + settings.setValue(DPrefix+"background/format", ui->combo_desk_layout->currentData().toString()); + + emit HasPendingChanges(false); +} + +void page_wallpaper::LoadSettings(int screennum){ + emit HasPendingChanges(false); + emit ChangePageTitle( tr("Wallpaper Settings") ); + cScreen = screennum; //save for later + loading = true; + QSettings settings("lumina-desktop","desktopsettings"); + QString DPrefix = "desktop-"+QString::number(cScreen)+"/"; + + 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 if(bgs[i].startsWith("rgb(")){ui->combo_desk_bg->addItem(QString(tr("Solid Color: %1")).arg(bgs[i]), bgs[i]); } + //else{ ui->combo_desk_bg->addItem( QIcon(QPixmap(bgs[i]).scaled(64,64)), bgs[i].section("/",-1), bgs[i] ); } + else{ ui->combo_desk_bg->addItem( bgs[i].section("/",-1), bgs[i] ); } //disable the thumbnail - takes a long time for large collections of files + } + + 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); + QRect geom = QApplication::desktop()->screenGeometry(cScreen); + ui->label_desk_res->setText( tr("Screen Resolution:")+"\n"+QString::number(geom.width())+"x"+QString::number(geom.height()) ); + int tmp = ui->combo_desk_layout->findData(settings.value(DPrefix+"background/format","stretch")); + if(tmp>=0){ ui->combo_desk_layout->setCurrentIndex(tmp); } + loading = false; +} + +void page_wallpaper::updateIcons(){ + ui->tool_desk_addbg->setIcon( LXDG::findIcon("list-add","") ); + ui->tool_desk_rmbg->setIcon( LXDG::findIcon("list-remove","") ); + updateMenus(); +} + +//================= +// PRIVATE +//================= +QString page_wallpaper::getColorStyle(QString current, bool allowTransparency){ + 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; + if(allowTransparency){ ncol= QColorDialog::getColor(ccol, this, tr("Select Color"), QColorDialog::ShowAlphaChannel); } + else{ ncol= QColorDialog::getColor(ccol, this, tr("Select Color")); } + //Now convert the new color into a usable string and return + if(ncol.isValid()){ //if the dialog was not cancelled + if(allowTransparency){ + out = "rgba("+QString::number(ncol.red())+","+QString::number(ncol.green())+","+QString::number(ncol.blue())+","+QString::number(ncol.alpha())+")"; + }else{ + out = "rgb("+QString::number(ncol.red())+","+QString::number(ncol.green())+","+QString::number(ncol.blue())+")"; + } + } + return out; +} + +//================= +// PRIVATE SLOTS +//================= +void page_wallpaper::updateMenus(){ + //Background file menu (different ways of loading files) + if(ui->tool_desk_addbg->menu()==0){ ui->tool_desk_addbg->setMenu(new QMenu(this)); } + ui->tool_desk_addbg->menu()->clear(); + ui->tool_desk_addbg->menu()->addAction(LXDG::findIcon("document-new",""), tr("File(s)"), this, SLOT(deskbgadded()) ); + ui->tool_desk_addbg->menu()->addAction(LXDG::findIcon("folder-new",""), tr("Directory (Single)"), this, SLOT(deskbgdiradded()) ); + ui->tool_desk_addbg->menu()->addAction(LXDG::findIcon("document-open-folder",""), tr("Directory (Recursive)"), this, SLOT(deskbgdirradded()) ); + ui->tool_desk_addbg->menu()->addAction(LXDG::findIcon("format-fill-color",""), tr("Solid Color"), this, SLOT(deskbgcoloradded()) ); + + //Available Wallpaper layout options + ui->combo_desk_layout->clear(); + ui->combo_desk_layout->addItem(tr("Automatic"), "stretch"); + ui->combo_desk_layout->addItem(tr("Fullscreen"), "full"); + ui->combo_desk_layout->addItem(tr("Fit screen"), "fit"); + ui->combo_desk_layout->addItem(tr("Tile"), "tile"); + ui->combo_desk_layout->addItem(tr("Center"), "center"); + ui->combo_desk_layout->addItem(tr("Top Left"), "topleft"); + ui->combo_desk_layout->addItem(tr("Top Right"), "topright"); + ui->combo_desk_layout->addItem(tr("Bottom Left"), "bottomleft"); + ui->combo_desk_layout->addItem(tr("Bottom Right"), "bottomright"); + +} + +void page_wallpaper::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)")); + ui->label_desk_bgview->setStyleSheet(""); + }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()) ); + //Update the preview/thumbnail for this item + QPixmap pix(path); + ui->label_desk_bgview->setPixmap( pix.scaled(sz, Qt::KeepAspectRatio, Qt::SmoothTransformation) ); + ui->combo_desk_bg->setItemIcon(ui->combo_desk_bg->currentIndex(), pix.scaled(64,64) ); + ui->label_desk_bgview->setStyleSheet(""); + }else if(path.startsWith("rgb(")){ + ui->label_desk_bgview->setPixmap(QPixmap()); + ui->label_desk_bgview->setText(""); + ui->label_desk_bgview->setStyleSheet("background-color: "+path+";"); + }else{ + ui->label_desk_bgview->setPixmap(QPixmap()); + ui->label_desk_bgview->setText(tr("File does not exist")); + ui->label_desk_bgview->setStyleSheet(""); + } + } + //See if this constitues a change to the current settings and enable the save button + if(!loading && ui->radio_desk_single->isChecked() && cBG!=ui->combo_desk_bg->currentIndex()){ emit HasPendingChanges(true); } + cBG = ui->combo_desk_bg->currentIndex(); //keep track of this for later + //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); + ui->label_desk_bgview->setMinimumSize(10,10); +} + +void page_wallpaper::desktimechanged(){ + ui->spin_desk_min->setEnabled(ui->radio_desk_multi->isChecked()); + if(!loading){ emit HasPendingChanges(true); } +} + +void page_wallpaper::deskbgremoved(){ + if(ui->combo_desk_bg->count()<1){ return; } //nothing to remove + ui->combo_desk_bg->removeItem( ui->combo_desk_bg->currentIndex() ); + emit HasPendingChanges(true); +} + +void page_wallpaper::deskbgadded(){ + //Prompt the user to find an image file to use for a background + QString dir = LOS::LuminaShare().section("/lumina-desktop",0,0)+"/wallpapers/Lumina-DE"; + qDebug() << "Looking for wallpaper dir:" << dir; + if( !QFile::exists(dir) ){ dir = QDir::homePath(); } + QStringList imgs = LUtils::imageExtensions(); + for(int i=0; i<imgs.length(); i++){ imgs[i].prepend("*."); } + QStringList bgs = QFileDialog::getOpenFileNames(this, tr("Find Background Image(s)"), dir, "Images ("+imgs.join(" ")+");;All Files (*)"); + 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 ); + //If multiple items selected, automatically enable the background rotation option + if(bgs.length() > 1 && !ui->radio_desk_multi->isChecked()){ + ui->radio_desk_multi->setChecked(true); + } + emit HasPendingChanges(true); +} + +void page_wallpaper::deskbgcoloradded(){ + //Prompt the user to select a color (no transparency allowed) + QString color = getColorStyle("",false); //no initial color + if(color.isEmpty()){ return; } + //Add it to the list + ui->combo_desk_bg->addItem( QString(tr("Solid Color: %1")).arg(color), color); + //Now move to the last item in the list (the new image(s)); + ui->combo_desk_bg->setCurrentIndex( ui->combo_desk_bg->count()-1 ); + + emit HasPendingChanges(true); +} + +void page_wallpaper::deskbgdiradded(){ + //Add the files from a single directory + QString dir = LOS::LuminaShare().section("/lumina-desktop",0,0)+"/wallpapers/Lumina-DE"; + qDebug() << "Looking for wallpaper dir:" << dir; + if( !QFile::exists(dir) ){ dir = QDir::homePath(); } + dir = QFileDialog::getExistingDirectory(this, tr("Find Background Image Directory"), dir, QFileDialog::ReadOnly); + if(dir.isEmpty()){ return; } + //Got a directory - go ahead and find all the valid image files within it + QStringList imgs = LUtils::imageExtensions(); + for(int i=0; i<imgs.length(); i++){ imgs[i].prepend("*."); } + QDir qdir(dir); + QStringList bgs = qdir.entryList(imgs, QDir::Files | QDir::NoDotAndDotDot, QDir::Name); + if(bgs.isEmpty()){ return; } + for(int i=0; i<bgs.length(); i++){ + ui->combo_desk_bg->addItem( bgs[i], qdir.absoluteFilePath(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 ); + //If multiple items selected, automatically enable the background rotation option + if(bgs.length() > 1 && !ui->radio_desk_multi->isChecked()){ + ui->radio_desk_multi->setChecked(true); + } + emit HasPendingChanges(true); +} + +void page_wallpaper::deskbgdirradded(){ + //Recursively add files from a directory + QString dir = LOS::LuminaShare().section("/lumina-desktop",0,0)+"/wallpapers/Lumina-DE"; + qDebug() << "Looking for wallpaper dir:" << dir; + if( !QFile::exists(dir) ){ dir = QDir::homePath(); } + dir = QFileDialog::getExistingDirectory(this, tr("Find Background Image Directory"), dir, QFileDialog::ReadOnly); + if(dir.isEmpty()){ return; } + //Got a directory - go ahead and get all the valid image file formats + QStringList imgs = LUtils::imageExtensions(); + for(int i=0; i<imgs.length(); i++){ imgs[i].prepend("*."); } + //Now load the directory and add all the valid files + QStringList dirs = LUtils::listSubDirectories(dir, true); //find/list all the dirs + dirs.prepend(dir); //make sure the main dir is also listed + QStringList bgs; + for(int d=0; d<dirs.length(); d++){ + QDir qdir(dirs[d]); + QStringList tmp = qdir.entryList(imgs, QDir::Files | QDir::NoDotAndDotDot, QDir::Name); + for(int j=0; j<tmp.length(); j++){ bgs << qdir.absoluteFilePath(tmp[j]); } + } + //Now add all the files into the widget + for(int i=0; i<bgs.length(); i++){ + ui->combo_desk_bg->addItem( 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 ); + //If multiple items selected, automatically enable the background rotation option + if(bgs.length() > 1 && !ui->radio_desk_multi->isChecked()){ + ui->radio_desk_multi->setChecked(true); + } + emit HasPendingChanges(true); +} diff --git a/src-qt5/core-utils/lumina-config/pages/page_wallpaper.h b/src-qt5/core-utils/lumina-config/pages/page_wallpaper.h new file mode 100644 index 00000000..ece613f9 --- /dev/null +++ b/src-qt5/core-utils/lumina-config/pages/page_wallpaper.h @@ -0,0 +1,52 @@ +//=========================================== +// Lumina Desktop Source Code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_CONFIG_PAGE_WALLPAPER_H +#define _LUMINA_CONFIG_PAGE_WALLPAPER_H +#include "../globals.h" +#include "PageWidget.h" + +namespace Ui{ + class page_wallpaper; +}; + +class page_wallpaper : public PageWidget{ + Q_OBJECT +public: + page_wallpaper(QWidget *parent); + ~page_wallpaper(); + + bool needsScreenSelector(){ return true; } + +public slots: + void SaveSettings(); + void LoadSettings(int screennum); + void updateIcons(); + +private: + Ui::page_wallpaper *ui; + int cScreen, cBG; //current screen number/background + QString DEFAULTBG; + bool loading; + + QString getColorStyle(QString current, bool allowTransparency); + +private slots: + void updateMenus(); + void deskbgchanged(); + void desktimechanged(); + void deskbgremoved(); + void deskbgadded(); + void deskbgcoloradded(); + void deskbgdiradded(); + void deskbgdirradded(); + +protected: + void resizeEvent(QResizeEvent*){ + deskbgchanged(); //update the wallpaper preview + } +}; +#endif diff --git a/src-qt5/core-utils/lumina-config/pages/page_wallpaper.ui b/src-qt5/core-utils/lumina-config/pages/page_wallpaper.ui index 9dfbef2c..ca927c69 100644 --- a/src-qt5/core-utils/lumina-config/pages/page_wallpaper.ui +++ b/src-qt5/core-utils/lumina-config/pages/page_wallpaper.ui @@ -15,16 +15,16 @@ </property> <layout class="QVBoxLayout" name="verticalLayout"> <property name="leftMargin"> - <number>0</number> + <number>9</number> </property> <property name="topMargin"> - <number>0</number> + <number>9</number> </property> <property name="rightMargin"> - <number>0</number> + <number>9</number> </property> <property name="bottomMargin"> - <number>0</number> + <number>9</number> </property> <item> <layout class="QHBoxLayout" name="horizontalLayout_4"> diff --git a/src-qt5/core-utils/lumina-config/pages/pages.pri b/src-qt5/core-utils/lumina-config/pages/pages.pri index 2ebf2c46..5e4ffca9 100644 --- a/src-qt5/core-utils/lumina-config/pages/pages.pri +++ b/src-qt5/core-utils/lumina-config/pages/pages.pri @@ -1,42 +1,43 @@ HEADERS += $${PWD}/getPage.h \ $${PWD}/PageWidget.h \ - $${PWD}/page_main.h -# $${PWD}/page_autostart.h \ -# $${PWD}/page_defaultapps.h \ -# $${PWD}/page_fluxbox_keys.h \ -# $${PWD}/page_fluxbox_settings.h \ -# $${PWD}/page_interface_desktop.h \ -# $${PWD}/page_interface_menu.h \ -# $${PWD}/page_interface_panels.h \ -# $${PWD}/page_session_locale.h \ -# $${PWD}/page_session_options.h \ -# $${PWD}/page_theme.h \ -# $${PWD}/page_wallpaper.h - + $${PWD}/page_main.h \ + $${PWD}/page_wallpaper.h \ + $${PWD}/page_theme.h \ + $${PWD}/page_autostart.h \ + $${PWD}/page_defaultapps.h \ + $${PWD}/page_fluxbox_keys.h \ + $${PWD}/page_fluxbox_settings.h \ + $${PWD}/page_interface_desktop.h \ + $${PWD}/page_interface_menu.h \ + $${PWD}/page_interface_panels.h \ + $${PWD}/page_session_locale.h \ + $${PWD}/page_session_options.h + + +SOURCES += $${PWD}/page_main.cpp \ + $${PWD}/page_wallpaper.cpp \ + $${PWD}/page_theme.cpp \ + $${PWD}/page_autostart.cpp \ + $${PWD}/page_defaultapps.cpp \ + $${PWD}/page_fluxbox_keys.cpp \ + $${PWD}/page_fluxbox_settings.cpp \ + $${PWD}/page_interface_desktop.cpp \ + $${PWD}/page_interface_menu.cpp \ + $${PWD}/page_interface_panels.cpp \ + $${PWD}/page_session_locale.cpp \ + $${PWD}/page_session_options.cpp -SOURCES += $${PWD}/page_main.cpp -# $${PWD}/page_autostart.cpp \ -# $${PWD}/page_defaultapps.cpp \ -# $${PWD}/page_fluxbox_keys.cpp \ -# $${PWD}/page_fluxbox_settings.cpp \ -# $${PWD}/page_interface_desktop.cpp \ -# $${PWD}/page_interface_menu.cpp \ -# $${PWD}/page_interface_panels.cpp \ -# $${PWD}/page_session_locale.cpp \ -# $${PWD}/page_session_options.cpp \ -# $${PWD}/page_theme.cpp \ -# $${PWD}/page_wallpaper.cpp -FORMS += $${PWD}/page_main.ui -# $${PWD}/page_autostart.ui \ -# $${PWD}/page_defaultapps.ui \ -# $${PWD}/page_fluxbox_keys.ui \ -# $${PWD}/page_fluxbox_settings.ui \ -# $${PWD}/page_interface_desktop.ui \ -# $${PWD}/page_interface_menu.ui \ -# $${PWD}/page_interface_panels.ui \ -# $${PWD}/page_session_locale.ui \ -# $${PWD}/page_session_options.ui \ -# $${PWD}/page_theme.ui \ -# $${PWD}/page_wallpaper.ui +FORMS += $${PWD}/page_main.ui \ + $${PWD}/page_wallpaper.ui \ + $${PWD}/page_theme.ui \ + $${PWD}/page_autostart.ui \ + $${PWD}/page_defaultapps.ui \ + $${PWD}/page_fluxbox_keys.ui \ + $${PWD}/page_fluxbox_settings.ui \ + $${PWD}/page_interface_desktop.ui \ + $${PWD}/page_interface_menu.ui \ + $${PWD}/page_interface_panels.ui \ + $${PWD}/page_session_locale.ui \ + $${PWD}/page_session_options.ui |