diff options
author | Weblate <noreply@weblate.org> | 2017-09-20 13:42:32 +0000 |
---|---|---|
committer | Weblate <noreply@weblate.org> | 2017-09-20 13:42:32 +0000 |
commit | a4fd58c9aae62207b131a13cc13187970495bdb5 (patch) | |
tree | cdabc3a0816c41f6f2a6f5191f3e38f698595c13 /src-qt5/core/lumina-desktop-unified | |
parent | Translated using Weblate (Lithuanian) (diff) | |
parent | Streamline a bit more of the new Lumina2 window embed functionality. (diff) | |
download | lumina-a4fd58c9aae62207b131a13cc13187970495bdb5.tar.gz lumina-a4fd58c9aae62207b131a13cc13187970495bdb5.tar.bz2 lumina-a4fd58c9aae62207b131a13cc13187970495bdb5.zip |
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'src-qt5/core/lumina-desktop-unified')
130 files changed, 385 insertions, 16469 deletions
diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/JsonMenu.h b/src-qt5/core/lumina-desktop-unified/JsonMenu.h index 5a6b2237..2624153d 100644 --- a/src-qt5/core/lumina-desktop-unified/src-DE/JsonMenu.h +++ b/src-qt5/core/lumina-desktop-unified/JsonMenu.h @@ -4,21 +4,13 @@ // Available under the 3-clause BSD license // See the LICENSE file for full details //=========================================== -// This menu is used to automatically generate menu contents +// This menu is used to automatically generate menu contents // based on the JSON output of an external script/utility //=========================================== #ifndef _LUMINA_DESKTOP_JSON_MENU_H #define _LUMINA_DESKTOP_JSON_MENU_H -#include <QMenu> -#include <QString> -#include <QJsonDocument> -#include <QJsonObject> -#include <QJsonArray> - -#include <LUtils.h> -#include <LuminaXDG.h> -#include "LSession.h" +#include <global-objects.h> class JsonMenu : public QMenu{ Q_OBJECT @@ -38,7 +30,7 @@ private slots: QString type = obj.value("type").toString(); if(type.toLower()=="item"){ QAction *act = this->addAction(label); - if(obj.contains("icon")){ act->setIcon( LXDG::findIcon(obj.value("icon").toString(),"") ); } + if(obj.contains("icon")){ LIconCache::instance()->loadIcon(act, obj.value("icon").toString()); } if(obj.contains("action")){ act->setWhatsThis( obj.value("action").toString() ); } else{ act->setEnabled(false); } //not interactive }else if(type.toLower()=="menu"){ @@ -48,7 +40,7 @@ private slots: if(!obj.contains("exec")){ return; } JsonMenu *menu = new JsonMenu(obj.value("exec").toString(), this); menu->setTitle(label); - if(obj.contains("icon")){ menu->setIcon(LXDG::findIcon(obj.value("icon").toString(),"") ); } + if(obj.contains("icon")){ LIconCache::instance()->loadIcon(menu, obj.value("icon").toString()); } this->addMenu(menu); } } @@ -73,7 +65,7 @@ private slots: QString cmd = act->whatsThis(); QString bin = cmd.section(" ",0,0); if( !LUtils::isValidBinary(bin) ){ cmd.prepend("lumina-open "); } - LSession::handle()->LaunchApplication(cmd); + LSession::instance()->LaunchApplication(cmd); } }; #endif diff --git a/src-qt5/core/lumina-desktop-unified/LSession.cpp b/src-qt5/core/lumina-desktop-unified/LSession.cpp index c6f79584..d70ff973 100644 --- a/src-qt5/core/lumina-desktop-unified/LSession.cpp +++ b/src-qt5/core/lumina-desktop-unified/LSession.cpp @@ -11,7 +11,7 @@ #include "BootSplash.h" #ifndef DEBUG -#define DEBUG 0 +#define DEBUG 1 #endif //Initialize all the global objects to null pointers @@ -28,6 +28,7 @@ LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lu qRegisterMetaType< Qt::Key >("Qt::Key"); qRegisterMetaType< NativeWindow::Property >("NativeWindow::Property"); qRegisterMetaType< QList< NativeWindow::Property > >("QList<NativeWindow::Property>"); + qRegisterMetaType< NativeWindowSystem::MouseButton >("NativeWindowSystem::MouseButton"); mediaObj = 0; //private object used for playing login/logout chimes if(this->isPrimaryProcess()){ @@ -50,10 +51,10 @@ LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lu Lumina::SS = new LScreenSaver(); //Now put the Native Window System into it's own thread to keep things snappy Lumina::EVThread = new QThread(); - Lumina::NWS->moveToThread(Lumina::EVThread); - Lumina::EVThread->start(); + //Lumina::NWS->moveToThread(Lumina::EVThread); + //Lumina::EVThread->start(); + Lumina::APPLIST = XDGDesktopList::instance(); Lumina::ROOTWIN = new RootWindow(); - Lumina::APPLIST = new XDGDesktopList(0, true); //keep this list up to date Lumina::SHORTCUTS = new LShortcutEvents(); //this can be moved to it's own thread eventually as well setupGlobalConnections(); @@ -133,7 +134,7 @@ void LSession::setupSession(){ Lumina::ROOTWIN->start(); Lumina::NWS->setRoot_numberOfWorkspaces(QStringList() << "one" << "two"); Lumina::NWS->setRoot_currentWorkspace(0); - + if(DEBUG){ qDebug() << " - Create Desktop Context Menu"; } DesktopContextMenu *cmenu = new DesktopContextMenu(Lumina::ROOTWIN); connect(cmenu, SIGNAL(showLeaveDialog()), this, SLOT(StartLogout()) ); cmenu->start(); @@ -165,6 +166,7 @@ void LSession::setupSession(){ if(DEBUG){ qDebug() << " - Init Finished:" << timer->elapsed(); delete timer;} Lumina::SHORTCUTS->start(); //Startup the shortcut handler now + //for(int i=0; i<4; i++){ LSession::processEvents(); } //Again, just a few event loops here so thing can settle before we close the splash screen //launchStartupApps(); QTimer::singleShot(500, this, SLOT(launchStartupApps()) ); @@ -226,11 +228,13 @@ void LSession::setupGlobalConnections(){ //Root window connections connect(Lumina::ROOTWIN, SIGNAL(RegisterVirtualRoot(WId)), Lumina::NWS, SLOT(RegisterVirtualRoot(WId)) ); connect(Lumina::ROOTWIN, SIGNAL(RootResized(QRect)), Lumina::NWS, SLOT(setRoot_desktopGeometry(QRect)) ); + connect(Lumina::ROOTWIN, SIGNAL(MouseMoved()), Lumina::SS, SLOT(newInputEvent()) ); //Native Window Class connections connect(Lumina::NEF, SIGNAL(WindowCreated(WId)), Lumina::NWS, SLOT(NewWindowDetected(WId))); connect(Lumina::NEF, SIGNAL(WindowDestroyed(WId)), Lumina::NWS, SLOT(WindowCloseDetected(WId))); connect(Lumina::NEF, SIGNAL(WindowPropertyChanged(WId, NativeWindow::Property)), Lumina::NWS, SLOT(WindowPropertyChanged(WId, NativeWindow::Property))); + connect(Lumina::NEF, SIGNAL(WindowPropertiesChanged(WId, QList<NativeWindow::Property>)), Lumina::NWS, SLOT(WindowPropertiesChanged(WId, QList<NativeWindow::Property>)) ); connect(Lumina::NEF, SIGNAL(WindowPropertyChanged(WId, NativeWindow::Property, QVariant)), Lumina::NWS, SLOT(WindowPropertyChanged(WId, NativeWindow::Property, QVariant))); connect(Lumina::NEF, SIGNAL(WindowPropertiesChanged(WId, QList<NativeWindow::Property>, QList<QVariant>)), Lumina::NWS, SLOT(WindowPropertiesChanged(WId, QList<NativeWindow::Property>, QList<QVariant>)) ); connect(Lumina::NEF, SIGNAL(RequestWindowPropertyChange(WId, NativeWindow::Property, QVariant)), Lumina::NWS, SLOT(RequestPropertyChange(WId, NativeWindow::Property, QVariant))); @@ -288,7 +292,7 @@ void LSession::playAudioFile(QString filepath){ if( !QFile::exists(filepath) ){ return; } //Setup the audio output systems for the desktop if(DEBUG){ qDebug() << "Play Audio File"; } - if(mediaObj==0){ qDebug() << " - Initialize media player"; mediaObj = new QMediaPlayer(); } + if(mediaObj==0){ qDebug() << " - Initialize media player"; mediaObj = new QMediaPlayer(0,QMediaPlayer::LowLatency); } if(mediaObj !=0 ){ if(DEBUG){ qDebug() << " - starting playback:" << filepath; } mediaObj->setVolume(100); @@ -382,10 +386,28 @@ void LSession::StartReboot(bool skipupdates){ } void LSession::LaunchApplication(QString exec){ + qDebug() << "Launch Application:" << exec; ExternalProcess::launch(exec); } +void LSession::LaunchDesktopApplication(QString app, QString action){ + qDebug() << "Launch Desktop Application:" << app << action; + XDGDesktop *xdg = Lumina::APPLIST->findAppFile(app); + bool cleanup = false; + if(xdg==0){ + xdg = new XDGDesktop(app); + cleanup = true; + } + if(xdg->isValid()){ + QString exec = xdg->generateExec(QStringList(), action); + ExternalProcess::launch(exec, QStringList(), xdg->startupNotify); + } + + if(cleanup && xdg!=0){ xdg->deleteLater(); } +} + void LSession::LaunchStandardApplication(QString app, QStringList args){ + qDebug() << "Launch Standard Application:" << app << args; //Find/replace standardized apps with thier mimetypes if(app.startsWith("--")){ app = "application/"+app.section("--",-1).simplified(); } //First see if this is a mimetype with a default application @@ -393,24 +415,18 @@ void LSession::LaunchStandardApplication(QString app, QStringList args){ QString mimeapp = XDGMime::findDefaultAppForMime(app); if(!mimeapp.isEmpty()){ app = mimeapp; } } - if(app.endsWith(".desktop")){ + if(!app.endsWith(".desktop")){ + //actual command/binary - just launch it + ExternalProcess::launch(app, args, false); // do not use startup notify cursor + }else{ //Get the XDGDesktop structure XDGDesktop *desk = 0; bool cleanup = false; if(app.startsWith("/") && QFile::exists(app)){ desk = new XDGDesktop(app); cleanup = true; } - if(!desk->isValid()){ + if(desk==0 || !desk->isValid()){ //Need to find the app within the current list - QHash<QString, XDGDesktop*>applist = Lumina::APPLIST->files; if(cleanup){ desk->deleteLater(); desk = 0; cleanup = false; } app = app.section("/",-1); //make sure this is a relative path - QStringList list = applist.keys().filter("/"+app); - if(!list.filter(QDir::homePath()).isEmpty()){ desk = applist[list.filter(QDir::homePath()).first()]; } //prefer user-override files - if(desk==0 || !desk->isValid()){ - desk = 0; - for(int i=0; i<list.length() && desk==0; i++){ - XDGDesktop *tmp = applist[list[i]]; - if(tmp->isValid()){ desk = tmp; } - } - } + desk = Lumina::APPLIST->findAppFile(app); } if(desk!=0 && desk->isValid()){ //Got the application - go ahead and assemble the startup command @@ -418,8 +434,6 @@ void LSession::LaunchStandardApplication(QString app, QStringList args){ ExternalProcess::launch(exec, QStringList(), desk->startupNotify); } if(cleanup){ desk->deleteLater(); } - }else{ - ExternalProcess::launch(app, args, false); // do not use startup notify cursor } } diff --git a/src-qt5/core/lumina-desktop-unified/LSession.h b/src-qt5/core/lumina-desktop-unified/LSession.h index 85cc050c..61da559b 100644 --- a/src-qt5/core/lumina-desktop-unified/LSession.h +++ b/src-qt5/core/lumina-desktop-unified/LSession.h @@ -15,6 +15,9 @@ public: LSession(int &argc, char **argv); ~LSession(); + static LSession* instance(){ + return ( static_cast<LSession*>(QApplication::instance()) ); + } private: void CleanupSession(); void setupGlobalConnections(); @@ -33,6 +36,7 @@ public slots: void StartShutdown(bool skipupdates = false); void StartReboot(bool skipupdates = false); void LaunchApplication(QString exec); + void LaunchDesktopApplication(QString app, QString action = ""); void LaunchStandardApplication(QString app, QStringList args = QStringList()); void reloadIconTheme(); //will emit the IconThemeChanged signal when ready diff --git a/src-qt5/core/lumina-desktop-unified/defaults/compton.conf b/src-qt5/core/lumina-desktop-unified/defaults/compton.conf deleted file mode 100644 index a14fee29..00000000 --- a/src-qt5/core/lumina-desktop-unified/defaults/compton.conf +++ /dev/null @@ -1,89 +0,0 @@ -# Shadow -shadow = true; -no-dnd-shadow = true; -no-dock-shadow = true; -clear-shadow = true; -shadow-radius = 5; -shadow-offset-x = -5; -shadow-offset-y = -5; -# shadow-opacity = 0.7; -# shadow-red = 0.0; -# shadow-green = 0.0; -# shadow-blue = 0.0; -shadow-exclude = [ - "name = 'Notification'", - "class_g = 'Conky'", - "class_g ?= 'Notify-osd'", - "class_g = 'Cairo-clock'", - "_GTK_FRAME_EXTENTS@:c" -]; -# shadow-exclude = "n:e:Notification"; -# shadow-exclude-reg = "x10+0+0"; -# xinerama-shadow-crop = true; - -# Opacity -menu-opacity = 0.9; -inactive-opacity = 0.9; -# active-opacity = 0.8; -frame-opacity = 1.0; -inactive-opacity-override = false; -alpha-step = 0.06; -# inactive-dim = 0.2; -# inactive-dim-fixed = true; -# blur-background = true; -# blur-background-frame = true; -blur-kern = "3x3box" -# blur-kern = "5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" -# blur-background-fixed = true; -blur-background-exclude = [ - "window_type = 'dock'", - "window_type = 'desktop'", - "_GTK_FRAME_EXTENTS@:c" -]; -# opacity-rule = [ "80:class_g = 'URxvt'" ]; - -# Fading -fading = true; -# fade-delta = 30; -fade-in-step = 0.2; -fade-out-step = 0.2; -# no-fading-openclose = true; -# no-fading-destroyed-argb = true; -fade-exclude = [ ]; - -# Other -backend = "xrender" -mark-wmwin-focused = true; -mark-ovredir-focused = true; -# use-ewmh-active-win = true; -detect-rounded-corners = true; -detect-client-opacity = true; -refresh-rate = 0; -vsync = "none"; -dbe = false; -paint-on-overlay = true; -# sw-opti = true; -# unredir-if-possible = true; -# unredir-if-possible-delay = 5000; -# unredir-if-possible-exclude = [ ]; -focus-exclude = [ "class_g = 'Cairo-clock'" ]; -detect-transient = true; -detect-client-leader = true; -invert-color-include = [ ]; -# resize-damage = 1; - -# GLX backend -# glx-no-stencil = true; -glx-copy-from-front = false; -# glx-use-copysubbuffermesa = true; -# glx-no-rebind-pixmap = true; -glx-swap-method = "undefined"; -# glx-use-gpushader4 = true; -# xrender-sync = true; -# xrender-sync-fence = true; - -# Window type settings -wintypes: -{ - tooltip = { fade = true; shadow = true; opacity = 0.85; focus = true; }; -}; diff --git a/src-qt5/core/lumina-desktop-unified/defaults/desktop/keys.conf b/src-qt5/core/lumina-desktop-unified/defaults/desktop/keys.conf index 59959194..1a993ca3 100644 --- a/src-qt5/core/lumina-desktop-unified/defaults/desktop/keys.conf +++ b/src-qt5/core/lumina-desktop-unified/defaults/desktop/keys.conf @@ -2,7 +2,5 @@ Ctrl+Alt+Backspace=Logout Pause=Lockscreen Alt+L=Lockscreen - -[desktop] Alt+F1=Launch: --terminal Print=Launch: --screenshot diff --git a/src-qt5/core/lumina-desktop-unified/defaults/desktop/screensaver.conf b/src-qt5/core/lumina-desktop-unified/defaults/desktop/screensaver.conf new file mode 100644 index 00000000..89f4e488 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/defaults/desktop/screensaver.conf @@ -0,0 +1,3 @@ +[General] +default_plugin="fireflies" +plugin_VGA-0="fireflies" diff --git a/src-qt5/core/lumina-desktop-unified/global-includes.h b/src-qt5/core/lumina-desktop-unified/global-includes.h index 8b8cd16c..184f5b8d 100644 --- a/src-qt5/core/lumina-desktop-unified/global-includes.h +++ b/src-qt5/core/lumina-desktop-unified/global-includes.h @@ -50,6 +50,10 @@ #include <QMediaPlayer> #include <QVideoWidget> #include <QMediaPlaylist> +#include <QJsonObject> +#include <QJsonArray> +#include <QJsonDocument> + // libLumina includes #include <LuminaX11.h> @@ -66,6 +70,7 @@ #include <NativeWindowSystem.h> #include <NativeEventFilter.h> #include <XDGMime.h> +#include <LIconCache.h> // Standard C includes #include <unistd.h> diff --git a/src-qt5/core/lumina-desktop-unified/global-objects.h b/src-qt5/core/lumina-desktop-unified/global-objects.h index 474412eb..0c990dc6 100644 --- a/src-qt5/core/lumina-desktop-unified/global-objects.h +++ b/src-qt5/core/lumina-desktop-unified/global-objects.h @@ -25,6 +25,7 @@ #include "src-screensaver/LScreenSaver.h" //#include "src-WM/LWindowManager.h" +#include "LSession.h" //Any special defines for settings/testing #define ANIMTIME 80 //animation time in milliseconds diff --git a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro index 04d5b602..e8cf2f28 100644 --- a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro +++ b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro @@ -20,6 +20,7 @@ include(../libLumina/RootWindow.pri) include(../libLumina/ExternalProcess.pri) include(../libLumina/NativeWindow.pri) include(../libLumina/XDGMime.pri) +include(../libLumina/LIconCache.pri) #include all the main individual source groups include(src-screensaver/screensaver.pri) @@ -35,7 +36,8 @@ SOURCES += main.cpp \ HEADERS += global-includes.h \ global-objects.h \ LSession.h \ - BootSplash.h + BootSplash.h \ + JsonMenu.h FORMS += BootSplash.ui diff --git a/src-qt5/core/lumina-desktop-unified/main.cpp b/src-qt5/core/lumina-desktop-unified/main.cpp index ef15cfcd..ed2b9b4c 100644 --- a/src-qt5/core/lumina-desktop-unified/main.cpp +++ b/src-qt5/core/lumina-desktop-unified/main.cpp @@ -29,7 +29,7 @@ int main(int argc, char ** argv) setenv("DESKTOP_SESSION","Lumina",1); setenv("XDG_CURRENT_DESKTOP","Lumina",1); setenv("QT_NO_GLIB", "1", 1); //Disable the glib event loop within Qt at runtime (performance hit + bugs) - //unsetenv("QT_QPA_PLATFORMTHEME"); //causes issues with Lumina themes - not many people have this by default... + setenv("QT_QPA_PLATFORMTHEME", "lthemeengine",1); //causes issues with Lumina themes - not many people have this by default... unsetenv("QT_AUTO_SCREEN_SCALE_FACTOR"); //need exact-pixel measurements (no fake scaling) //Startup the session diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/AppMenu.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/AppMenu.cpp deleted file mode 100644 index 798d8b6d..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/AppMenu.cpp +++ /dev/null @@ -1,183 +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 -//=========================================== -#include "AppMenu.h" -#include "LSession.h" -#include <LuminaOS.h> - -AppMenu::AppMenu(QWidget* parent) : QMenu(parent){ - appstorelink = LOS::AppStoreShortcut(); //Default application "store" to display (AppCafe in TrueOS) - controlpanellink = LOS::ControlPanelShortcut(); //Default control panel - sysApps = new XDGDesktopList(this, true); //have this one automatically keep in sync - APPS.clear(); - //watcher = new QFileSystemWatcher(this); - //connect(watcher, SIGNAL(directoryChanged(QString)), this, SLOT(watcherUpdate()) ); - //QTimer::singleShot(200, this, SLOT(start()) ); //Now start filling the menu - start(); //do the initial run during session init so things are responsive immediately. - connect(QApplication::instance(), SIGNAL(LocaleChanged()), this, SLOT(watcherUpdate()) ); - connect(QApplication::instance(), SIGNAL(IconThemeChanged()), this, SLOT(watcherUpdate()) ); -} - -AppMenu::~AppMenu(){ - -} - -QHash<QString, QList<XDGDesktop*> >* AppMenu::currentAppHash(){ - return &APPS; -} - -//=========== -// PRIVATE -//=========== -void AppMenu::updateAppList(){ - //watcher->removePaths(watcher->directories()); - //Make sure the title/icon are updated as well (in case of locale/icon change) - this->setTitle(tr("Applications")); - this->setIcon( LXDG::findIcon("system-run","") ); - //Now update the lists - this->clear(); - APPS.clear(); //NOTE: Don't delete these pointers - the pointers are managed by the sysApps class and these are just references to them - //qDebug() << "New Apps List:"; - if(LSession::handle()->sessionSettings()->value("AutomaticDesktopAppLinks",true).toBool() && !lastHashUpdate.isNull() ){ - QString desktop = QDir::homePath()+"/"+tr("Desktop")+"/"; //translated desktop folder - if(!QFile::exists(desktop)){ - desktop = QDir::homePath()+"/Desktop/"; //desktop folder - if(!QFile::exists(desktop)){ - desktop = QDir::homePath()+"/desktop/"; //lowercase desktop folder - if(!QFile::exists(desktop)){ desktop.clear(); } - } - } - //qDebug() << "Update Desktop Folder:" << desktop << sysApps->removedApps << sysApps->newApps; - QStringList tmp = sysApps->removedApps; - for(int i=0; i<tmp.length() && !desktop.isEmpty(); i++){ - //Remove any old symlinks first - QString filename = tmp[i].section("/",-1); - //qDebug() << "Check for symlink:" << filename; - if( QFileInfo(desktop+filename).isSymLink() ){ QFile::remove(desktop+filename); } - } - tmp = sysApps->newApps; - for(int i=0; i<tmp.length() && !desktop.isEmpty(); i++){ - XDGDesktop *desk = sysApps->files.value(tmp[i]); - if(desk->isHidden || !desk->isValid(false) ){ continue; } //skip this one - //qDebug() << "New App: " << tmp[i] << desk.filePath << "Hidden:" << desk.isHidden; - //Create a new symlink for this file if one does not exist - QString filename = tmp[i].section("/",-1); - //qDebug() << "Check for symlink:" << filename; - if(!QFile::exists(desktop+filename) ){ QFile::link(tmp[i], desktop+filename); } - } - } - QList<XDGDesktop*> allfiles = sysApps->apps(false,false); //only valid, non-hidden apps - APPS = LXDG::sortDesktopCats(allfiles); - APPS.insert("All", LXDG::sortDesktopNames(allfiles)); - lastHashUpdate = QDateTime::currentDateTime(); - //Now fill the menu - //Add link to the file manager - //this->addAction( LXDG::findIcon("user-home", ""), tr("Browse Files"), this, SLOT(launchFileManager()) ); - //--Look for the app store - XDGDesktop store(appstorelink); - if(store.isValid()){ - this->addAction( LXDG::findIcon(store.icon, ""), tr("Manage Applications"), this, SLOT(launchStore()) ); - } - //--Look for the control panel - XDGDesktop controlp(controlpanellink); - if(controlp.isValid()){ - this->addAction( LXDG::findIcon(controlp.icon, ""), tr("Control Panel"), this, SLOT(launchControlPanel()) ); - } - this->addSeparator(); - //--Now create the sub-menus - QStringList cats = APPS.keys(); - cats.sort(); //make sure they are alphabetical - for(int i=0; i<cats.length(); i++){ - //Make sure they are translated and have the right icons - QString name, icon; - if(cats[i]=="All"){continue; } //skip this listing for the menu - else if(cats[i] == "Multimedia"){ name = tr("Multimedia"); icon = "applications-multimedia"; } - else if(cats[i] == "Development"){ name = tr("Development"); icon = "applications-development"; } - else if(cats[i] == "Education"){ name = tr("Education"); icon = "applications-education"; } - else if(cats[i] == "Game"){ name = tr("Games"); icon = "applications-games"; } - else if(cats[i] == "Graphics"){ name = tr("Graphics"); icon = "applications-graphics"; } - else if(cats[i] == "Network"){ name = tr("Network"); icon = "applications-internet"; } - else if(cats[i] == "Office"){ name = tr("Office"); icon = "applications-office"; } - else if(cats[i] == "Science"){ name = tr("Science"); icon = "applications-science"; } - else if(cats[i] == "Settings"){ name = tr("Settings"); icon = "preferences-system"; } - else if(cats[i] == "System"){ name = tr("System"); icon = "applications-system"; } - else if(cats[i] == "Utility"){ name = tr("Utility"); icon = "applications-utilities"; } - else if(cats[i] == "Wine"){ name = tr("Wine"); icon = "wine"; } - else{ name = tr("Unsorted"); icon = "applications-other"; } - - QMenu *menu = new QMenu(name, this); - menu->setIcon(LXDG::findIcon(icon,"")); - connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(launchApp(QAction*)) ); - QList<XDGDesktop*> appL = APPS.value(cats[i]); - for( int a=0; a<appL.length(); a++){ - if(appL[a]->actions.isEmpty()){ - //Just a single entry point - no extra actions - QAction *act = new QAction(LXDG::findIcon(appL[a]->icon, ""), appL[a]->name, this); - act->setToolTip(appL[a]->comment); - act->setWhatsThis(appL[a]->filePath); - menu->addAction(act); - }else{ - //This app has additional actions - make this a sub menu - // - first the main menu/action - QMenu *submenu = new QMenu(appL[a]->name, this); - submenu->setIcon( LXDG::findIcon(appL[a]->icon,"") ); - //This is the normal behavior - not a special sub-action (although it needs to be at the top of the new menu) - QAction *act = new QAction(LXDG::findIcon(appL[a]->icon, ""), appL[a]->name, this); - act->setToolTip(appL[a]->comment); - act->setWhatsThis(appL[a]->filePath); - submenu->addAction(act); - //Now add entries for every sub-action listed - for(int sa=0; sa<appL[a]->actions.length(); sa++){ - QAction *sact = new QAction(LXDG::findIcon(appL[a]->actions[sa].icon, appL[a]->icon), appL[a]->actions[sa].name, this); - sact->setToolTip(appL[a]->comment); - sact->setWhatsThis("-action \""+appL[a]->actions[sa].ID+"\" \""+appL[a]->filePath+"\""); - submenu->addAction(sact); - } - menu->addMenu(submenu); - } - } - this->addMenu(menu); - } - // watcher->addPaths(LXDG::systemApplicationDirs()); - emit AppMenuUpdated(); -} - -//================= -// PRIVATE SLOTS -//================= -void AppMenu::start(){ - //Setup the watcher - connect(sysApps, SIGNAL(appsUpdated()), this, SLOT(watcherUpdate()) ); - sysApps->updateList(); - //Now fill the menu the first time - updateAppList(); -} - -void AppMenu::watcherUpdate(){ - updateAppList(); //Update the menu listings -} - -void AppMenu::launchStore(){ - LSession::LaunchApplication("lumina-open \""+appstorelink+"\""); -} - -void AppMenu::launchControlPanel(){ - LSession::LaunchApplication("lumina-open \""+controlpanellink+"\""); -} - -void AppMenu::launchFileManager(){ - QString fm = "lumina-open \""+QDir::homePath()+"\""; - LSession::LaunchApplication(fm); -} - -void AppMenu::launchApp(QAction *act){ - QString appFile = act->whatsThis(); - if(appFile.startsWith("-action")){ - LSession::LaunchApplication("lumina-open "+appFile); //already has quotes put in place properly - }else{ - LSession::LaunchApplication("lumina-open \""+appFile+"\""); - } -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/AppMenu.h b/src-qt5/core/lumina-desktop-unified/src-DE/AppMenu.h deleted file mode 100644 index 5baaab7a..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/AppMenu.h +++ /dev/null @@ -1,58 +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 menu auto-updates to keep the list of available applications -// current at all times - and can launch them as necessary -//=========================================== -#ifndef _LUMINA_DESKTOP_APP_MENU_H -#define _LUMINA_DESKTOP_APP_MENU_H - -// Qt includes -#include <QMenu> -#include <QFileSystemWatcher> -#include <QString> -#include <QList> -#include <QTimer> -#include <QDateTime> -#include <QHash> -#include <QAction> -#include <QSettings> -//#include <QProcess> - -// libLumina includes -#include <LuminaXDG.h> - -class AppMenu : public QMenu{ - Q_OBJECT -public: - AppMenu(QWidget *parent = 0); - ~AppMenu(); - - QHash<QString, QList<XDGDesktop*> > *currentAppHash(); - QDateTime lastHashUpdate; - -private: - //QFileSystemWatcher *watcher; - QString appstorelink, controlpanellink; - QList<QMenu> MLIST; - XDGDesktopList *sysApps; - QHash<QString, QList<XDGDesktop*> > APPS; - - void updateAppList(); //completely update the menu lists - -private slots: - void start(); //This is called in a new thread after initialization - void watcherUpdate(); - void launchStore(); - void launchControlPanel(); - void launchFileManager(); - void launchApp(QAction *act); - -signals: - void AppMenuUpdated(); -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/LDesktop.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/LDesktop.cpp deleted file mode 100644 index de7d086e..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/LDesktop.cpp +++ /dev/null @@ -1,553 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2012-2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "LDesktop.h" -#include "LSession.h" - -#include <LuminaOS.h> -#include <LuminaX11.h> -#include "LWinInfo.h" -#include "JsonMenu.h" - -#include <QScreen> - -#define DEBUG 0 - -LDesktop::LDesktop(int deskNum, bool setdefault) : QObject(){ - screenID = QApplication::screens().at(deskNum)->name(); - DPREFIX = "desktop-"+screenID+"/"; - //desktopnumber = deskNum; - //desktop = QApplication::desktop(); - defaultdesktop = setdefault; //(desktop->screenGeometry(desktopnumber).x()==0); - //desktoplocked = true; - issyncing = bgupdating = false; - usewinmenu=false; - - //Setup the internal variables - settings = new QSettings(QSettings::UserScope, "lumina-desktop","desktopsettings", this); - //qDebug() << " - Desktop Settings File:" << settings->fileName(); - if(!QFile::exists(settings->fileName())){ settings->setValue(DPREFIX+"background/filelist",QStringList()<<"default"); settings->sync(); } - //bgWindow = 0; - bgDesktop = 0; - QTimer::singleShot(1,this, SLOT(InitDesktop()) ); - -} - -LDesktop::~LDesktop(){ - delete deskMenu; - delete winMenu; - //delete bgWindow; - delete workspacelabel; - delete wkspaceact; -} - -int LDesktop::Screen(){ - QList<QScreen*> scrns = QApplication::screens(); - for(int i=0; i<scrns.length(); i++){ - if(scrns[i]->name()==screenID){ return i; } - } - return -1; -} - -void LDesktop::show(){ - //if(bgWindow!=0){ bgWindow->show(); } - if(bgDesktop!=0){ bgDesktop->show(); } - for(int i=0; i<PANELS.length(); i++){ PANELS[i]->show(); } -} - -void LDesktop::hide(){ - //if(bgWindow!=0){ bgWindow->hide(); } - if(bgDesktop!=0){ bgDesktop->hide(); } - for(int i=0; i<PANELS.length(); i++){ PANELS[i]->hide(); } -} - -void LDesktop::prepareToClose(){ - //Get any panels ready to close - issyncing = true; //Stop handling any watcher events - for(int i=0; i<PANELS.length(); i++){ PANELS[i]->prepareToClose(); PANELS.takeAt(i)->deleteLater(); i--; } - //Now close down any desktop plugins - //desktoplocked = true; //make sure that plugin settings are preserved during removal - //Remove all the current containers - bgDesktop->cleanup(); -} - -WId LDesktop::backgroundID(){ - if(bgDesktop!=0){ return bgDesktop->winId(); } - else{ return QX11Info::appRootWindow(); } -} - -QRect LDesktop::availableScreenGeom(){ - //Return a QRect containing the (global) screen area that is available (not under any panels) - if(bgDesktop!=0){ - return globalWorkRect; //saved from previous calculations - }else{ - return LSession::handle()->screenGeom( Screen() ); - } -} - -void LDesktop::UpdateGeometry(){ - //First make sure there is something different about the geometry - //if(desktop->screenGeometry(Screen())==bgWindow->geometry()){ return; } - //Now update the screen - // NOTE: This functionality is highly event-driven based on X changes - so we need to keep things in order (no signals/slots) - //qDebug() << "Changing Desktop Geom:" << Screen(); - //bgWindow->setGeometry(desktop->screenGeometry(Screen())); - /*for(int i=0; i<PANELS.length(); i++){ - PANELS[i]->UpdatePanel(true); //geom only updates - do this before adjusting the background - }*/ - //qDebug() << " - Update Desktop Plugin Area"; - UpdateDesktopPluginArea(); - //qDebug() << " - Done With Desktop Geom Updates"; - QTimer::singleShot(0, this, SLOT(UpdatePanels())); -} - -void LDesktop::SystemLock(){ - QProcess::startDetached("xscreensaver-command -lock"); -} - -void LDesktop::SystemLogout(){ - LSession::handle()->systemWindow(); -} - -void LDesktop::SystemTerminal(){ - LSession::handle()->sessionSettings()->sync(); //make sure it is up to date - QString term = LXDG::findDefaultAppForMime("application/terminal"); //LSession::handle()->sessionSettings()->value("default-terminal","xterm").toString(); - if(term.isEmpty() ||(!term.endsWith(".desktop") && !LUtils::isValidBinary(term)) ){ term = "xterm"; } - LSession::LaunchApplication("lumina-open \""+term+"\""); -} - -void LDesktop::SystemFileManager(){ - //Just open the home directory - QString fm = "lumina-open \""+QDir::homePath()+"\""; - LSession::LaunchApplication(fm); -} - -void LDesktop::SystemApplication(QAction* act){ - if(!act->whatsThis().isEmpty() && act->parent()==deskMenu){ - LSession::LaunchApplication("lumina-open \""+act->whatsThis()+"\""); - } -} - -void LDesktop::checkResolution(){ - //Compare the current screen resolution with the last one used/saved and adjust config values *only* - //NOTE: This is only run the first time this desktop is created (before loading all the interface) - not on each desktop change - int oldWidth = settings->value(DPREFIX+"screen/lastWidth",-1).toInt(); - int oldHeight = settings->value(DPREFIX+"screen/lastHeight",-1).toInt(); - QRect scrn = LSession::handle()->screenGeom( Screen() ); - if(scrn.isNull()){ return; } - issyncing = true; - settings->setValue(DPREFIX+"screen/lastWidth",scrn.width()); - settings->setValue(DPREFIX+"screen/lastHeight",scrn.height()); - - if(oldWidth<1 || oldHeight<1 || scrn.width()<1 || scrn.height()<1){ - //nothing to do - something invalid - }else if(scrn.width()==oldWidth && scrn.height()==oldHeight){ - //nothing to do - same as before - }else{ - //Calculate the scale factor between the old/new sizes in each dimension - // and forward that on to all the interface elements - double xscale = scrn.width()/((double) oldWidth); - double yscale = scrn.height()/((double) oldHeight); - if(DEBUG){ - qDebug() << "Screen Resolution Changed:" << screenID; - qDebug() << " - Old:" << QString::number(oldWidth)+"x"+QString::number(oldHeight); - qDebug() << " - New:" << QString::number(scrn.width())+"x"+QString::number(scrn.height()); - qDebug() << " - Scale Factors:" << xscale << yscale; - } - //Update any panels in the config file - for(int i=0; i<4; i++){ - QString PPREFIX = "panel"+QString::number(Screen())+"."+QString::number(i)+"/"; - int ht = settings->value(PPREFIX+"height",-1).toInt(); - if(ht<1){ continue; } //no panel height defined - QString loc = settings->value(PPREFIX+"location","top").toString().toLower(); - if(loc=="top" || loc=="bottom"){ - settings->setValue(PPREFIX+"height", (int) ht*yscale); //vertical dimension - }else{ - settings->setValue(PPREFIX+"height", (int) ht*xscale); //horizontal dimension - } - } - //Update any desktop plugins - QStringList plugs = settings->value(DPREFIX+"pluginlist").toStringList(); - QFileInfoList files = LSession::handle()->DesktopFiles(); - for(int i=0; i<files.length(); i++){ - plugs << "applauncher::"+files[i].absoluteFilePath()+"---"+DPREFIX; - } - //QString pspath = QDir::homePath()+"/.lumina/desktop-plugins/%1.conf"; - QSettings *DP = LSession::handle()->DesktopPluginSettings(); - QStringList keys = DP->allKeys(); - for(int i=0; i<plugs.length(); i++){ - QStringList filter = keys.filter(plugs[i]); - for(int j=0; j<filter.length(); j++){ - //Has existing settings - need to adjust it - if(filter[j].endsWith("location/height")){ DP->setValue( filter[j], qRound(DP->value(filter[j]).toInt()*yscale) ); } - if(filter[j].endsWith("location/width")){ DP->setValue( filter[j], qRound(DP->value(filter[j]).toInt()*xscale) ); } - if(filter[j].endsWith("location/x")){ DP->setValue( filter[j], qRound(DP->value(filter[j]).toInt()*xscale) ); } - if(filter[j].endsWith("location/y")){ DP->setValue( filter[j], qRound(DP->value(filter[j]).toInt()*yscale) ); } - if(filter[j].endsWith("IconSize")){ DP->setValue( filter[j], qRound(DP->value(filter[j]).toInt()*yscale) ); } - if(filter[j].endsWith("iconsize")){ DP->setValue( filter[j], qRound(DP->value(filter[j]).toInt()*yscale) ); } - } - } - DP->sync(); //make sure it gets saved to disk right away - - } - issyncing = false; -} - -// ===================== -// PRIVATE SLOTS -// ===================== -void LDesktop::InitDesktop(){ - //This is called *once* during the main initialization routines - checkResolution(); //Adjust the desktop config file first (if necessary) - if(DEBUG){ qDebug() << "Init Desktop:" << Screen(); } - //connect(desktop, SIGNAL(resized(int)), this, SLOT(UpdateGeometry(int))); - if(DEBUG){ qDebug() << "Desktop #"<<Screen()<<" -> "<< LSession::desktop()->screenGeometry(Screen()) << LSession::handle()->screenGeom(Screen()); } - deskMenu = new QMenu(0); - connect(deskMenu, SIGNAL(triggered(QAction*)), this, SLOT(SystemApplication(QAction*)) ); - winMenu = new QMenu(0); - winMenu->setTitle(tr("Window List")); - winMenu->setIcon( LXDG::findIcon("preferences-system-windows","") ); - connect(winMenu, SIGNAL(triggered(QAction*)), this, SLOT(winClicked(QAction*)) ); - workspacelabel = new QLabel(0); - workspacelabel->setAlignment(Qt::AlignCenter); - wkspaceact = new QWidgetAction(0); - wkspaceact->setDefaultWidget(workspacelabel); - bgtimer = new QTimer(this); - bgtimer->setSingleShot(true); - connect(bgtimer, SIGNAL(timeout()), this, SLOT(UpdateBackground()) ); - - connect(QApplication::instance(), SIGNAL(DesktopConfigChanged()), this, SLOT(SettingsChanged()) ); - connect(QApplication::instance(), SIGNAL(DesktopFilesChanged()), this, SLOT(UpdateDesktop()) ); - connect(QApplication::instance(), SIGNAL(LocaleChanged()), this, SLOT(LocaleChanged()) ); - connect(QApplication::instance(), SIGNAL(WorkspaceChanged()), this, SLOT(UpdateBackground()) ); - //if(DEBUG){ qDebug() << "Create bgWindow"; } - /*bgWindow = new QWidget(); //LDesktopBackground(); - bgWindow->setObjectName("bgWindow"); - bgWindow->setContextMenuPolicy(Qt::CustomContextMenu); - bgWindow->setFocusPolicy(Qt::StrongFocus); - bgWindow->setWindowFlags(Qt::WindowStaysOnBottomHint | Qt::CustomizeWindowHint | Qt::FramelessWindowHint); - LSession::handle()->XCB->SetAsDesktop(bgWindow->winId()); - bgWindow->setGeometry(LSession::handle()->screenGeom(Screen())); - bgWindow->setWindowOpacity(0.0); - connect(bgWindow, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(ShowMenu()) );*/ - if(DEBUG){ qDebug() << "Create bgDesktop"; } - bgDesktop = new LDesktopPluginSpace(); - int grid = settings->value(DPREFIX+"GridSize",-1).toInt(); - if(grid<0 && LSession::desktop()->screenGeometry(Screen()).height() > 2000){ grid = 200; } - else if(grid<0){ grid = 100; } - bgDesktop->SetIconSize( grid ); - bgDesktop->setContextMenuPolicy(Qt::CustomContextMenu); - //LSession::handle()->XCB->SetAsDesktop(bgDesktop->winId()); - connect(bgDesktop, SIGNAL(PluginRemovedByUser(QString)), this, SLOT(RemoveDeskPlugin(QString)) ); - connect(bgDesktop, SIGNAL(IncreaseIcons()), this, SLOT(IncreaseDesktopPluginIcons()) ); - connect(bgDesktop, SIGNAL(DecreaseIcons()), this, SLOT(DecreaseDesktopPluginIcons()) ); - connect(bgDesktop, SIGNAL(HideDesktopMenu()), deskMenu, SLOT(hide())); - connect(bgDesktop, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(ShowMenu()) ); - if(DEBUG){ qDebug() << " - Desktop Init Done:" << screenID; } - //Start the update processes - QTimer::singleShot(10,this, SLOT(UpdateMenu()) ); - QTimer::singleShot(0,this, SLOT(UpdateBackground()) ); - QTimer::singleShot(1,this, SLOT(UpdateDesktop()) ); - QTimer::singleShot(2,this, SLOT(UpdatePanels()) ); -} - -void LDesktop::SettingsChanged(){ - if(issyncing){ return; } //don't refresh for internal modifications to the - issyncing = true; - qDebug() << "Found Settings Change:" << screenID; - settings->sync(); //make sure to sync with external settings changes - UpdateBackground(); - UpdateDesktop(); - UpdatePanels(); - UpdateMenu(); - issyncing = false; - QTimer::singleShot(100, this, SLOT(UnlockSettings()) ); //give it a few moments to settle before performing another sync -} - -void LDesktop::LocaleChanged(){ - //Update any elements which require a re-translation - UpdateMenu(false); //do the full menu refresh -} - -void LDesktop::UpdateMenu(bool fast){ - if(DEBUG){ qDebug() << " - Update Menu:" << screenID; } - //Put a label at the top - int num = LSession::handle()->XCB->CurrentWorkspace(); //LX11::GetCurrentDesktop(); - if(DEBUG){ qDebug() << "Found workspace number:" << num; } - if(num < 0){ workspacelabel->setText( "<b>"+tr("Lumina Desktop")+"</b>"); } - else{ workspacelabel->setText( "<b>"+QString(tr("Workspace %1")).arg(QString::number(num+1))+"</b>"); } - if(fast && usewinmenu){ UpdateWinMenu(); } - if(fast){ return; } //already done - deskMenu->clear(); //clear it for refresh - deskMenu->addAction(wkspaceact); - deskMenu->addSeparator(); - //Now load the user's menu setup and fill the menu - QStringList items = settings->value("menu/itemlist", QStringList()<< "terminal" << "filemanager" <<"applications" << "line" << "settings" ).toStringList(); - usewinmenu=false; - for(int i=0; i<items.length(); i++){ - if(items[i]=="terminal"){ deskMenu->addAction(LXDG::findIcon("utilities-terminal",""), tr("Terminal"), this, SLOT(SystemTerminal()) ); } - else if(items[i]=="lockdesktop"){ deskMenu->addAction(LXDG::findIcon("system-lock-screen",""), tr("Lock Session"), this, SLOT(SystemLock()) ); } - else if(items[i]=="filemanager"){ deskMenu->addAction( LXDG::findIcon("user-home",""), tr("Browse Files"), this, SLOT(SystemFileManager()) ); } - else if(items[i]=="applications"){ deskMenu->addMenu( LSession::handle()->applicationMenu() ); } - else if(items[i]=="line"){ deskMenu->addSeparator(); } - else if(items[i]=="settings"){ deskMenu->addMenu( LSession::handle()->settingsMenu() ); } - else if(items[i]=="windowlist"){ deskMenu->addMenu( winMenu); usewinmenu=true;} - else if(items[i].startsWith("app::::") && items[i].endsWith(".desktop")){ - //Custom *.desktop application - QString file = items[i].section("::::",1,1).simplified(); - XDGDesktop xdgf(file);// = LXDG::loadDesktopFile(file, ok); - if(xdgf.type!=XDGDesktop::BAD){ - deskMenu->addAction( LXDG::findIcon(xdgf.icon,""), xdgf.name)->setWhatsThis(file); - }else{ - qDebug() << "Could not load application file:" << file; - } - }else if(items[i].startsWith("jsonmenu::::")){ - //Custom JSON menu system (populated on demand via external scripts/tools - QStringList info = items[i].split("::::"); //FORMAT:[ "jsonmenu",exec,name, icon(optional)] - if(info.length()>=3){ - qDebug() << "Custom JSON Menu Loaded:" << info; - JsonMenu *tmp = new JsonMenu(info[1], deskMenu); - tmp->setTitle(info[2]); - connect(tmp, SIGNAL(triggered(QAction*)), this, SLOT(SystemApplication(QAction*)) ); - if(info.length()>=4){ tmp->setIcon( LXDG::findIcon(info[3],"") ); } - deskMenu->addMenu(tmp); - } - } - } - //Now add the system quit options - deskMenu->addSeparator(); - deskMenu->addAction(LXDG::findIcon("system-log-out",""), tr("Leave"), this, SLOT(SystemLogout()) ); -} - -void LDesktop::UpdateWinMenu(){ - winMenu->clear(); - //Get the current list of windows - QList<WId> wins = LSession::handle()->XCB->WindowList(); - //Now add them to the menu - for(int i=0; i<wins.length(); i++){ - LWinInfo info(wins[i]); - bool junk; - QAction *act = winMenu->addAction( info.icon(junk), info.text() ); - act->setData( QString::number(wins[i]) ); - } -} - -void LDesktop::winClicked(QAction* act){ - LSession::handle()->XCB->ActivateWindow( act->data().toString().toULong() ); -} - -void LDesktop::UpdateDesktop(){ - if(DEBUG){ qDebug() << " - Update Desktop Plugins for screen:" << screenID; } - QStringList plugins = settings->value(DPREFIX+"pluginlist", QStringList()).toStringList(); - if(defaultdesktop && plugins.isEmpty()){ - //plugins << "sample" << "sample" << "sample"; - } - bool changed=false; //in case the plugin list needs to be changed - //First make sure all the plugin names are unique - for(int i=0; i<plugins.length(); i++){ - if(!plugins[i].contains("---") ){ - int num=1; - while( plugins.contains(plugins[i]+"---"+QString::number(Screen())+"."+QString::number(num)) ){ - num++; - } - plugins[i] = plugins[i]+"---"+screenID+"."+QString::number(num); - //plugins[i] = plugins[i]+"---"+QString::number(Screen())+"."+QString::number(num); - changed=true; - } - } - if(changed){ - //save the modified plugin list to file (so per-plugin settings are preserved) - issyncing=true; //don't let the change cause a refresh - settings->setValue(DPREFIX+"pluginlist", plugins); - settings->sync(); - QTimer::singleShot(200, this, SLOT(UnlockSettings()) ); - } - //If generating desktop file launchers, add those in - QStringList filelist; - if(settings->value(DPREFIX+"generateDesktopIcons",false).toBool()){ - QFileInfoList files = LSession::handle()->DesktopFiles(); - for(int i=0; i<files.length(); i++){ - filelist << files[i].absoluteFilePath(); - } - } - UpdateDesktopPluginArea(); - bgDesktop->LoadItems(plugins, filelist); -} - -void LDesktop::RemoveDeskPlugin(QString ID){ - //This is called after a plugin is manually removed by the user - // just need to ensure that the plugin is also removed from the settings file - QStringList plugs = settings->value(DPREFIX+"pluginlist", QStringList()).toStringList(); - if(plugs.contains(ID)){ - plugs.removeAll(ID); - issyncing=true; //don't let the change cause a refresh - settings->setValue(DPREFIX+"pluginlist", plugs); - settings->sync(); - QTimer::singleShot(200, this, SLOT(UnlockSettings()) ); - } -} - -void LDesktop::IncreaseDesktopPluginIcons(){ - int cur = settings->value(DPREFIX+"GridSize",-1).toInt(); - if(cur<0 &&LSession::desktop()->screenGeometry(Screen()).height() > 2000){ cur = 200; } - else if(cur<0){ cur = 100; } - cur+=16; - issyncing=true; //don't let the change cause a refresh - settings->setValue(DPREFIX+"GridSize",cur); - settings->sync(); - QTimer::singleShot(200, this, SLOT(UnlockSettings()) ); - bgDesktop->SetIconSize(cur); -} - -void LDesktop::DecreaseDesktopPluginIcons(){ - int cur = settings->value(DPREFIX+"GridSize",-1).toInt(); - if(cur<0 &&LSession::desktop()->screenGeometry(Screen()).height() > 2000){ cur = 200; } - else if(cur<0){ cur = 100; } - if(cur<32){ return; } //cannot get smaller than 16x16 - cur-=16; - issyncing=true; //don't let the change cause a refresh - settings->setValue(DPREFIX+"GridSize",cur); - settings->sync(); - QTimer::singleShot(200, this, SLOT(UnlockSettings()) ); - bgDesktop->SetIconSize(cur); -} - -void LDesktop::UpdatePanels(){ - if(DEBUG){ qDebug() << " - Update Panels For Screen:" << Screen(); } - int panels = settings->value(DPREFIX+"panels", -1).toInt(); - //if(panels==-1 && defaultdesktop){ panels=1; } //need at least 1 panel on the primary desktop - //Remove all extra panels - for(int i=0; i<PANELS.length(); i++){ - if(panels <= PANELS[i]->number()){ - if(DEBUG){ qDebug() << " -- Remove Panel:" << PANELS[i]->number(); } - PANELS[i]->prepareToClose(); - PANELS.takeAt(i)->deleteLater(); - i--; - } - } - for(int i=0; i<panels; i++){ - //Check for a panel with this number - bool found = false; - for(int p=0; p<PANELS.length() && !found; p++){ - if(PANELS[p]->number() == i){ - found = true; - if(DEBUG){ qDebug() << " -- Update panel "<< i; } - //panel already exists - just update it - QTimer::singleShot(0, PANELS[p], SLOT(UpdatePanel()) ); - } - } - if(!found){ - if(DEBUG){ qDebug() << " -- Create panel "<< i; } - //New panel - LPanel *pan = new LPanel(settings, screenID, i, bgDesktop); - PANELS << pan; - pan->show(); - } - } - //Give it a 1/2 second before ensuring that the visible desktop area is correct - QTimer::singleShot(500, this, SLOT(UpdateDesktopPluginArea()) ); -} - -void LDesktop::UpdateDesktopPluginArea(){ - QRegion visReg(LSession::desktop()->screenGeometry(Screen()) ); //visible region (not hidden behind a panel) - QRect rawRect = visReg.boundingRect(); //initial value (screen size) - //qDebug() << "Update Desktop Plugin Area:" << bgWindow->geometry(); - for(int i=0; i<PANELS.length(); i++){ - QRegion shifted = visReg; - QString loc = settings->value(PANELS[i]->prefix()+"location","top").toString().toLower(); - int vis = PANELS[i]->visibleWidth(); - if(loc=="top"){ - if(!shifted.contains(QRect(rawRect.x(), rawRect.y(), rawRect.width(), vis))){ continue; } - shifted.translate(0, (rawRect.top()+vis)-shifted.boundingRect().top() ); - }else if(loc=="bottom"){ - if(!shifted.contains(QRect(rawRect.x(), rawRect.bottom()-vis, rawRect.width(), vis))){ continue; } - shifted.translate(0, (rawRect.bottom()-vis)-shifted.boundingRect().bottom()); - }else if(loc=="left"){ - if( !shifted.contains(QRect(rawRect.x(), rawRect.y(), vis,rawRect.height())) ){ continue; } - shifted.translate((rawRect.left()+vis)-shifted.boundingRect().left() ,0); - }else{ //right - if(!shifted.contains(QRect(rawRect.right()-vis, rawRect.y(), vis,rawRect.height())) ){ continue; } - shifted.translate((rawRect.right()-vis)-shifted.boundingRect().right(),0); - } - visReg = visReg.intersected( shifted ); - } - //Now make sure the desktop plugin area is only the visible area - QRect rec = visReg.boundingRect(); - //qDebug() << " - DPArea: Panel-Adjusted rectangle:" << rec; - //LSession::handle()->XCB->SetScreenWorkArea((unsigned int) Screen(), rec); - //Now remove the X offset to place it on the current screen (needs widget-coords, not global) - globalWorkRect = rec; //save this for later - rec.moveTopLeft( QPoint( rec.x()-LSession::desktop()->screenGeometry(Screen()).x() , rec.y()-LSession::desktop()->screenGeometry(Screen()).y() ) ); - //qDebug() << "DPlug Area:" << rec << bgDesktop->geometry() << LSession::handle()->desktop()->availableGeometry(bgDesktop); - if(rec.size().isNull() || rec == bgDesktop->geometry()){return; } //nothing changed - bgDesktop->setGeometry( LSession::desktop()->screenGeometry(Screen())); - bgDesktop->setDesktopArea( rec ); - bgDesktop->UpdateGeom(); //just in case the plugin space itself needs to do anything - QTimer::singleShot(10, this, SLOT(UpdateBackground()) ); - //Re-paint the panels (just in case a plugin was underneath it and the panel is transparent) - //for(int i=0; i<PANELS.length(); i++){ PANELS[i]->update(); } - //Make sure to re-disable any WM control flags - LSession::handle()->XCB->SetDisableWMActions(bgDesktop->winId()); -} - -void LDesktop::UpdateBackground(){ - //Get the current Background - if(bgupdating || bgDesktop==0){ return; } //prevent multiple calls to this at the same time - bgupdating = true; - if(DEBUG){ qDebug() << " - Update Desktop Background for screen:" << Screen(); } - //Get the list of background(s) to show - QStringList bgL = settings->value(DPREFIX+"background/filelist-workspace-"+QString::number( LSession::handle()->XCB->CurrentWorkspace()), QStringList()).toStringList(); - if(bgL.isEmpty()){ bgL = settings->value(DPREFIX+"background/filelist", QStringList()).toStringList(); } - - //qDebug() << " - List:" << bgL << CBG; - //Remove any invalid files - for(int i=0; i<bgL.length(); i++){ - if( (!QFile::exists(bgL[i]) && bgL[i]!="default" && !bgL[i].startsWith("rgb(") ) || bgL[i].isEmpty()){ bgL.removeAt(i); i--; } - } - if(bgL.isEmpty()){ bgL << "default"; } //always fall back on the default - //Determine if the background needs to be changed - //qDebug() << "BG List:" << bgL << oldBGL << CBG << bgtimer->isActive(); - if(bgL==oldBGL && !CBG.isEmpty() && bgtimer->isActive()){ - //No background change scheduled - just update the widget - bgDesktop->update(); - bgupdating=false; - return; - } - oldBGL = bgL; //save this for later - //Determine which background to use next - int index ( qrand() % bgL.length() ); - if(index== bgL.indexOf(CBG)){ //if the current wallpaper was selected by the randomization again - //Go to the next in the list - if(index < 0 || index >= bgL.length()-1){ index = 0; } //if invalid or last item in the list - go to first - else{ index++; } //go to next - } - QString bgFile = bgL[index]; - //Save this file as the current background - CBG = bgFile; - //qDebug() << " - Set Background to:" << CBG << index << bgL; - if( (bgFile.toLower()=="default")){ bgFile = LOS::LuminaShare()+"desktop-background.jpg"; } - //Now set this file as the current background - QString format = settings->value(DPREFIX+"background/format","stretch").toString(); - //bgWindow->setBackground(bgFile, format); - QPixmap backPix = LDesktopBackground::setBackground(bgFile, format, LSession::handle()->screenGeom(Screen())); - bgDesktop->setBackground(backPix); - //Now reset the timer for the next change (if appropriate) - if(bgtimer->isActive()){ bgtimer->stop(); } - if(bgL.length() > 1){ - //get the length of the timer (in minutes) - int min = settings->value(DPREFIX+"background/minutesToChange",5).toInt(); - //restart the internal timer - if(min > 0){ - bgtimer->start(min*60000); //convert from minutes to milliseconds - } - } - //Now update the panel backgrounds - for(int i=0; i<PANELS.length(); i++){ - PANELS[i]->update(); - PANELS[i]->show(); - } - bgupdating=false; -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/LDesktop.h b/src-qt5/core/lumina-desktop-unified/src-DE/LDesktop.h deleted file mode 100644 index b6034c18..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/LDesktop.h +++ /dev/null @@ -1,107 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2012-2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_DESKTOP_LDESKTOP_H -#define _LUMINA_DESKTOP_LDESKTOP_H - -#include <QCoreApplication> - - -#include <QSettings> -#include <QFile> -#include <QList> -#include <QDebug> -#include <QTimer> -#include <QFileSystemWatcher> -#include <QLabel> -#include <QWidgetAction> -#include <QMdiArea> -#include <QMdiSubWindow> -#include <QRegion> - - -#include <LuminaXDG.h> - -#include "LPanel.h" -//#include "Globals.h" -#include "AppMenu.h" -#include "LDesktopPluginSpace.h" -#include "desktop-plugins/LDPlugin.h" -//#include "desktop-plugins/NewDP.h" -#include "LDesktopBackground.h" - -class LDesktop : public QObject{ - Q_OBJECT -public: - LDesktop(int deskNum=0, bool setdefault = false); - ~LDesktop(); - - int Screen(); //return the screen number this object is managing - void show(); - void hide(); - void prepareToClose(); - - WId backgroundID(); - QRect availableScreenGeom(); - - void UpdateGeometry(); - -public slots: - void SystemLock(); - void SystemLogout(); - void SystemTerminal(); - void SystemFileManager(); - void SystemApplication(QAction*); - - void checkResolution(); - -private: - QSettings *settings; - QTimer *bgtimer; - //QDesktopWidget *desktop; - QString DPREFIX, screenID; - //int desktopnumber; - QRegion availDPArea; - bool defaultdesktop, issyncing, usewinmenu, bgupdating; - QStringList oldBGL; - QList<LPanel*> PANELS; - LDesktopPluginSpace *bgDesktop; //desktop plugin area - //QWidget *bgWindow; //full screen background - QMenu *deskMenu, *winMenu; - QLabel *workspacelabel; - QWidgetAction *wkspaceact; - QList<LDPlugin*> PLUGINS; - QString CBG; //current background - QRect globalWorkRect; - -private slots: - void InitDesktop(); - void SettingsChanged(); - void UnlockSettings(){ issyncing=false; } - void LocaleChanged(); - - //Menu functions - void UpdateMenu(bool fast = false); - void ShowMenu(){ - UpdateMenu(true); //run the fast version - deskMenu->popup(QCursor::pos()); //} - } - void UpdateWinMenu(); - void winClicked(QAction*); - - //Desktop plugin system functions - void UpdateDesktop(); - void RemoveDeskPlugin(QString); - void IncreaseDesktopPluginIcons(); - void DecreaseDesktopPluginIcons(); - - void UpdatePanels(); - - void UpdateDesktopPluginArea(); //make sure the area is not underneath any panels - - void UpdateBackground(); -}; -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopBackground.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopBackground.cpp deleted file mode 100644 index 6b458c24..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopBackground.cpp +++ /dev/null @@ -1,90 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2016, Henry Hu -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "LDesktopBackground.h" - -#include <QPainter> -#include <QPaintEvent> -#include <QDebug> - -#include "LSession.h" - -void LDesktopBackground::paintEvent(QPaintEvent *ev) { - //return; //do nothing - always invisible - if (bgPixmap != NULL) { - //qDebug() << "Wallpaper paint Event:" << ev->rect(); - //QPainter painter(this); - //painter.setBrush(*bgPixmap); - //painter.drawRect(ev->rect().adjusted(-1,-1,2,2)); - }else{ - QWidget::paintEvent(ev); - } -} - -QPixmap LDesktopBackground::setBackground(const QString& bgFile, const QString& format, QRect geom) { - //if (bgPixmap != NULL) delete bgPixmap; - QPixmap bgPixmap(geom.size());// = new QPixmap(size()); - - if (bgFile.startsWith("rgb(")) { - QStringList colors = bgFile.section(")",0,0).section("(",1,1).split(","); - QColor color = QColor(colors[0].toInt(), colors[1].toInt(), colors[2].toInt()); - bgPixmap.fill(color); - } else { - bgPixmap.fill(Qt::black); - - // Load the background file and scale - QPixmap bgImage(bgFile); - if (format == "stretch" || format == "full" || format == "fit") { - Qt::AspectRatioMode mode; - if (format == "stretch") { - mode = Qt::IgnoreAspectRatio; - } else if (format == "full") { - mode = Qt::KeepAspectRatioByExpanding; - } else { - mode = Qt::KeepAspectRatio; - } - if(bgImage.height() != geom.height() && bgImage.width() != geom.width() ){ bgImage = bgImage.scaled(geom.size(), mode); } - //bgImage = bgImage.scaled(size(), mode); - } - - // Calculate the offset - int dx = 0, dy = 0; - int drawWidth = bgImage.width(), drawHeight = bgImage.height(); - if (format == "fit" || format == "center" || format == "full") { - dx = (geom.width() - bgImage.width()) / 2; - dy = (geom.height() - bgImage.height()) / 2; - } else if (format == "tile") { - drawWidth = geom.width(); - drawHeight = geom.height(); - } else { - if (format.endsWith("right")) { - dx = geom.width() - bgImage.width(); - } - if (format.startsWith("bottom")) { - dy = geom.height() - bgImage.height(); - } - } - - // Draw the background image - QPainter painter(&bgPixmap); - painter.setBrush(bgImage); - painter.setBrushOrigin(dx, dy); - painter.drawRect(dx, dy, drawWidth, drawHeight); - } - //this->repaint(); //make sure the entire thing gets repainted right away - //LSession::handle()->XCB->paintRoot(geom, &bgPixmap); - return bgPixmap; - //show(); -} - -LDesktopBackground::LDesktopBackground() : QWidget() { - bgPixmap = NULL; - this->setWindowOpacity(0); -} - -LDesktopBackground::~LDesktopBackground() { - if (bgPixmap != NULL) delete bgPixmap; -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopBackground.h b/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopBackground.h deleted file mode 100644 index a2e46748..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopBackground.h +++ /dev/null @@ -1,27 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2016, Henry Hu -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_DESKTOP_LDESKTOPBACKGROUND_H_ -#define _LUMINA_DESKTOP_LDESKTOPBACKGROUND_H_ - -#include <QString> -#include <QWidget> -#include <QPixmap> - -class LDesktopBackground: public QWidget { - Q_OBJECT -public: - LDesktopBackground(); - virtual ~LDesktopBackground(); - - virtual void paintEvent(QPaintEvent*); - static QPixmap setBackground(const QString&, const QString&, QRect geom); - -private: - QPixmap *bgPixmap; -}; - -#endif // _LUMINA_DESKTOP_LDESKTOPBACKGROUND_H_ diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopPluginSpace.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopPluginSpace.cpp deleted file mode 100644 index 18126dfa..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopPluginSpace.cpp +++ /dev/null @@ -1,333 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "LDesktopPluginSpace.h" -#include "LSession.h" -#include "desktop-plugins/NewDP.h" - -#include <LuminaXDG.h> -#include <QDesktopWidget> - -#define DEBUG 0 - -// =================== -// PUBLIC -// =================== -LDesktopPluginSpace::LDesktopPluginSpace() : QWidget(){ - this->setObjectName("LuminaDesktopPluginSpace"); - this->setAttribute(Qt::WA_TranslucentBackground); - //this->setAttribute(Qt::WA_NoSystemBackground); - this->setAutoFillBackground(false); - this->setStyleSheet("QWidget#LuminaDesktopPluginSpace{ border: none; background: transparent; }"); - this->setWindowFlags(Qt::WindowStaysOnBottomHint | Qt::CustomizeWindowHint | Qt::FramelessWindowHint); - this->setAcceptDrops(true); - this->setContextMenuPolicy(Qt::NoContextMenu); - this->setMouseTracking(true); - TopToBottom = true; - GRIDSIZE = 100.0; //default value if not set - plugsettings = LSession::handle()->DesktopPluginSettings(); - LSession::handle()->XCB->SetAsDesktop(this->winId()); - //this->setWindowOpacity(0.0); -} - -LDesktopPluginSpace::~LDesktopPluginSpace(){ - -} - -void LDesktopPluginSpace::LoadItems(QStringList plugs, QStringList files){ - if(DEBUG){ qDebug() << "Loading Desktop Items:" << plugs << files << "Area:" << this->size() << GRIDSIZE; } - bool changes = false; - if(plugs != plugins){ plugins = plugs; changes = true; } - if(files != deskitems){ deskitems = files; changes = true; } - if(changes){ QTimer::singleShot(0,this, SLOT(reloadPlugins())); } - this->show(); -} - -void LDesktopPluginSpace::SetIconSize(int size){ - if(DEBUG){ qDebug() << "Set Desktop Icon Size:" << size; } - //QSize newsize = calculateItemSize(size); - int oldsize = GRIDSIZE; - GRIDSIZE = size; //turn the int into a float; - //itemSize = QSize(1,1); //save this for all the later icons which are generated (grid size) - UpdateGeom(oldsize); - //Now re-set the item icon size - //reloadPlugins(true); -} - -void LDesktopPluginSpace::cleanup(){ - //Perform any final cleanup actions here - for(int i=0; i<ITEMS.length(); i++){ - ITEMS.takeAt(i)->deleteLater(); - i--; - } - plugins.clear(); - deskitems.clear(); - this->hide(); -} - -void LDesktopPluginSpace::setBackground(QPixmap pix){ - wallpaper = pix; - this->repaint(); -} - -void LDesktopPluginSpace::setDesktopArea(QRect area){ - desktopRect = area; -} - -// =================== -// PUBLIC SLOTS -// =================== -void LDesktopPluginSpace::UpdateGeom(int oldgrid){ - if(DEBUG){ qDebug() << "Updated Desktop Geom:" << desktopRect.size() << GRIDSIZE << desktopRect.size()/GRIDSIZE; } - //Go through and check the locations/sizes of all items (particularly the ones on the bottom/right edges) - //bool reload = false; - for(int i=0; i<ITEMS.length(); i++){ - QRect grid = geomToGrid(ITEMS[i]->geometry(), oldgrid); - if(DEBUG){ qDebug() << " - Check Plugin:" << ITEMS[i]->whatsThis() << grid; } - if( !ValidGrid(grid) ){ - //This plugin is too far out of the screen - find new location for it - if(DEBUG){ qDebug() << " -- Out of bounds - Find a new spot"; } - grid = findOpenSpot(grid, ITEMS[i]->whatsThis(), true); //Reverse lookup spot - } - if(!ValidGrid(grid)){ - qDebug() << "No Place for plugin:" << ITEMS[i]->whatsThis(); - qDebug() << " - Removing it for now..."; - ITEMS.takeAt(i)->deleteLater(); - i--; - }else{ - //NOTE: We are not doing the ValidGeometry() checks because we are only resizing existing plugin with pre-set & valid grid positions - grid = gridToGeom(grid); //convert to pixels before saving/sizing - MovePlugin(ITEMS[i], grid); - /*ITEMS[i]->setGeometry( grid ); - ITEMS[i]->setFixedSize(grid.size()); - ITEMS[i]->savePluginGeometry(grid);*/ - } - } - //if(reload){ QTimer::singleShot(0,this, SLOT(reloadPlugins())); } -} - -// =================== -// PRIVATE -// =================== -void LDesktopPluginSpace::addDesktopItem(QString filepath){ - addDesktopPlugin("applauncher::"+filepath+"---dlink"+QString::number(LSession::handle()->desktop()->screenNumber(this)) ); -} - -void LDesktopPluginSpace::addDesktopPlugin(QString plugID){ - //This is used for generic plugins (QWidget-based) - if(DEBUG){ qDebug() << "Adding Desktop Plugin:" << plugID; } - LDPlugin *plug = NewDP::createPlugin(plugID, this); - if(plug==0){ return; } //invalid plugin - //plug->setAttribute(Qt::WA_TranslucentBackground); - plug->setWhatsThis(plugID); - //Now get the geometry for the plugin - QRect geom = plug->loadPluginGeometry(); //in pixel coords - if(!geom.isNull()){ geom = geomToGrid(geom); } //convert to grid coordinates - if(geom.isNull()){ - //No previous location - need to calculate initial geom - QSize sz = plug->defaultPluginSize(); //in grid coordinates - geom.setSize(sz); - //if an applauncher - add from top-left, otherwise add in from bottom-right - if(plugID.startsWith("applauncher")){ geom = findOpenSpot(geom.width(), geom.height() ); } - else{ geom = findOpenSpot(geom.width(), geom.height(), RoundUp(this->height()/GRIDSIZE), RoundUp(this->width()/GRIDSIZE), true); } - }else if(!ValidGeometry(plugID, gridToGeom(geom)) ){ - //Find a new location for the plugin (saved location is invalid) - geom = findOpenSpot(geom.width(), geom.height(), geom.y(), geom.x(), false); //try to get it within the same general area first - } - if(geom.x() < 0 || geom.y() < 0){ - qDebug() << "No available space for desktop plugin:" << plugID << " - IGNORING"; - delete plug; - }else{ - if(DEBUG){ qDebug() << " - New Plugin Geometry (grid):" << geom; } - //Now place the item in the proper spot/size - MovePlugin(plug, gridToGeom(geom)); - //plug->setGeometry( gridToGeom(geom) ); - plug->show(); - if(DEBUG){ qDebug() << " - New Plugin Geometry (px):" << plug->geometry(); } - ITEMS << plug; - connect(plug, SIGNAL(StartMoving(QString)), this, SLOT(StartItemMove(QString)) ); - connect(plug, SIGNAL(StartResizing(QString)), this, SLOT(StartItemResize(QString)) ); - connect(plug, SIGNAL(RemovePlugin(QString)), this, SLOT(RemoveItem(QString)) ); - connect(plug, SIGNAL(IncreaseIconSize()), this, SIGNAL(IncreaseIcons()) ); - connect(plug, SIGNAL(DecreaseIconSize()), this, SIGNAL(DecreaseIcons()) ); - connect(plug, SIGNAL(CloseDesktopMenu()), this, SIGNAL(HideDesktopMenu()) ); - } -} - -QRect LDesktopPluginSpace::findOpenSpot(int gridwidth, int gridheight, int startRow, int startCol, bool reversed, QString plugID){ - //Note about the return QPoint: x() is the column number, y() is the row number - QPoint pt(0,0); - //qDebug() << "FIND OPEN SPOT:" << gridwidth << gridheight << startRow << startCol << reversed; - int row = startRow; int col = startCol; - if(row<0){ row = 0; } //just in case - since this can be recursively called - if(col<0){ col = 0; } //just in case - since this can be recursively called - bool found = false; - int rowCount, colCount; - rowCount = RoundUp(desktopRect.height()/GRIDSIZE); - colCount = RoundUp(desktopRect.width()/GRIDSIZE); - if( (row+gridheight)>rowCount){ row = rowCount-gridheight; startRow = row; } - if( (col+gridwidth)>colCount){ col = colCount-gridwidth; startCol = col; } - QRect geom(0, 0, gridwidth*GRIDSIZE, gridheight*GRIDSIZE); //origin point will be adjusted in a moment - if(DEBUG){ qDebug() << "Search for plugin space:" << rowCount << colCount << gridheight << gridwidth << this->size(); } - if(TopToBottom && reversed && (startRow>0 || startCol>0) ){ - //Arrange Top->Bottom (work backwards) - //qDebug() << "Search backwards for space:" << rowCount << colCount << startRow << startCol << gridheight << gridwidth; - while(col>=0 && !found){ - while(row>=0 && !found){ - bool ok = true; - geom.moveTo(col*GRIDSIZE, row*GRIDSIZE); - //qDebug() << " - Check Geom:" << geom << col << row; - //Check all the existing items to ensure no overlap - for(int i=0; i<ITEMS.length() && ok; i++){ - if(ITEMS[i]->whatsThis()==plugID){ continue; } //same plugin - this is not a conflict - if(geom.intersects(ITEMS[i]->geometry())){ - //Collision - move the next searchable row/column index - ok = false; - //qDebug() << "Collision:" << col << row; - row = ((ITEMS[i]->geometry().y()-GRIDSIZE/2)/GRIDSIZE) -gridheight; //use top edge for next search (minus item height) - //qDebug() << " - new row:" << row; - } - } - if(ok){ pt = QPoint(col,row); found = true; } //found an open spot - } - if(!found){ col--; row=rowCount-gridheight; } //go to the previous column - } - }else if(TopToBottom){ - //Arrange Top->Bottom - while(col<(colCount-gridwidth) && !found){ - while(row<(rowCount-gridheight) && !found){ - bool ok = true; - geom.moveTo(col*GRIDSIZE, row*GRIDSIZE); - //qDebug() << " - Check Geom:" << geom << col << row; - //Check all the existing items to ensure no overlap - for(int i=0; i<ITEMS.length() && ok; i++){ - if(ITEMS[i]->whatsThis()==plugID){ continue; } //same plugin - this is not a conflict - if(geom.intersects(ITEMS[i]->geometry())){ - //Collision - move the next searchable row/column index - ok = false; - row = posToGrid(ITEMS[i]->geometry().bottomLeft()).y(); //use bottom edge for next search - } - } - if(ok){ pt = QPoint(col,row); found = true; } //found an open spot - //else{ row++; } - } - if(!found){ col++; row=0; } //go to the next column - } - }else if(reversed && (startRow>0 || startCol>0) ){ - //Arrange Left->Right (work backwards) - while(row>=0 && !found){ - while(col>=0 && !found){ - bool ok = true; - geom.moveTo(col*GRIDSIZE, row*GRIDSIZE); - //Check all the existing items to ensure no overlap - for(int i=0; i<ITEMS.length() && ok; i++){ - if(ITEMS[i]->whatsThis()==plugID){ continue; } //same plugin - this is not a conflict - if(geom.intersects(ITEMS[i]->geometry())){ - //Collision - move the next searchable row/column index - ok = false; - col = (ITEMS[i]->geometry().x()-GRIDSIZE/2)/GRIDSIZE - gridwidth; // Fill according to row/column - } - } - if(ok){ pt = QPoint(col,row); found = true; } //found an open spot - //else{ col++; } - } - if(!found){ row--; col=colCount-gridwidth;} //go to the previous row - } - }else{ - //Arrange Left->Right - while(row<(rowCount-gridheight) && !found){ - while(col<(colCount-gridwidth) && !found){ - bool ok = true; - geom.moveTo(col*GRIDSIZE, row*GRIDSIZE); - //Check all the existing items to ensure no overlap - for(int i=0; i<ITEMS.length() && ok; i++){ - if(ITEMS[i]->whatsThis()==plugID){ continue; } //same plugin - this is not a conflict - if(geom.intersects(ITEMS[i]->geometry())){ - //Collision - move the next searchable row/column index - ok = false; - col = posToGrid(ITEMS[i]->geometry().topRight()).x(); // Fill according to row/column - } - } - if(ok){ pt = QPoint(col,row); found = true; } //found an open spot - //else{ col++; } - } - if(!found){ row++; col=0;} //go to the next row - } - } - if(!found){ - //qDebug() << "Could not find a spot:" << startRow << startCol << gridheight << gridwidth; - if( (startRow!=0 || startCol!=0) && !reversed){ - //Did not check the entire screen yet - gradually work it's way back to the top/left corner - //qDebug() << " - Start backwards search"; - return findOpenSpot(gridwidth, gridheight,startRow,startCol, true); //reverse the scan - }else if(gridwidth>1 && gridheight>1){ - //Decrease the size of the item by 1x1 grid points and try again - //qDebug() << " - Out of space: Decrease item size and try again..."; - return findOpenSpot(gridwidth-1, gridheight-1, 0, 0); - }else{ - //qDebug() << " - Could not find an open spot for a desktop plugin:" << gridwidth << gridheight << startRow << startCol; - return QRect(-1,-1,-1,-1); - } - }else{ - return QRect(pt,QSize(gridwidth,gridheight)); - } -} - -QRect LDesktopPluginSpace::findOpenSpot(QRect grid, QString plugID, bool recursive){ //Reverse lookup spotc{ - //This is just an overloaded simplification for checking currently existing plugins - return findOpenSpot(grid.width(), grid.height(), grid.y(), grid.x(), recursive, plugID); -} - -// =================== -// PRIVATE SLOTS -// =================== -void LDesktopPluginSpace::reloadPlugins(bool ForceIconUpdate ){ - //Remove any plugins as necessary - QStringList plugs = plugins; - QStringList items = deskitems; - for(int i=0; i<ITEMS.length(); i++){ - - if( ITEMS[i]->whatsThis().startsWith("applauncher") && ForceIconUpdate){ - //Change the size of the existing plugin - preserving the location if possible - /*QRect geom = ITEMS[i]->loadPluginGeometry(); //pixel coords - if(!geom.isNull()){ - geom = geomToGrid(geom); //convert to grid coords - geom.setSize(itemSize); //Reset back to default size (does not change location) - ITEMS[i]->savePluginGeometry( gridToGeom(geom)); //save it back in pixel coords - }*/ - //Now remove the plugin for the moment - run it through the re-creation routine below - ITEMS.takeAt(i)->deleteLater(); - i--; - } - else if(plugs.contains(ITEMS[i]->whatsThis())){ plugs.removeAll(ITEMS[i]->whatsThis()); } - else if(items.contains(ITEMS[i]->whatsThis().section("---",0,0).section("::",1,50))){ items.removeAll(ITEMS[i]->whatsThis().section("---",0,0).section("::",1,50)); } - else{ ITEMS[i]->removeSettings(true); ITEMS.takeAt(i)->deleteLater(); i--; } //this is considered a permanent removal (cleans settings) - } - - //Now create any new items - //First load the plugins (almost always have fixed locations) - for(int i=0; i<plugs.length(); i++){ - addDesktopPlugin(plugs[i]); - } - //Now load the desktop shortcuts (fill in the gaps as needed) - for(int i=0; i<items.length(); i++){ - addDesktopItem(items[i]); - } -} - - -//================= -// PROTECTED -//================= -void LDesktopPluginSpace::paintEvent(QPaintEvent*ev){ - if(!wallpaper.isNull()){ - QPainter painter(this); - painter.setBrush(wallpaper); - painter.drawRect(ev->rect().adjusted(-1,-1,2,2)); - }else{ - QWidget::paintEvent(ev); - } -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopPluginSpace.h b/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopPluginSpace.h deleted file mode 100644 index abc34878..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopPluginSpace.h +++ /dev/null @@ -1,303 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_DESKTOP_LDESKTOP_PLUGIN_SPACE_H -#define _LUMINA_DESKTOP_LDESKTOP_PLUGIN_SPACE_H - -#include <QListWidget> -#include <QDropEvent> -#include <QDrag> //includes all the QDrag*Event classes -#include <QUrl> -#include <QMimeData> -#include <QSettings> -#include <QDebug> -#include <QFile> -#include <QDir> -#include <QFileInfo> -#include <QProcess> - -#include "desktop-plugins/LDPlugin.h" - -#define MIMETYPE QString("x-special/lumina-desktop-plugin") - -class LDesktopPluginSpace : public QWidget{ - Q_OBJECT - -signals: - void PluginRemovedByUser(QString ID); - void IncreaseIcons(); //increase default icon sizes - void DecreaseIcons(); //decrease default icon sizes - void HideDesktopMenu(); - -public: - LDesktopPluginSpace(); - ~LDesktopPluginSpace(); - - void LoadItems(QStringList plugs, QStringList files); - //void setShowGrid(bool show); This is already implemented in QTableView (inherited) - void SetIconSize(int size); - void ArrangeTopToBottom(bool ttb); //if false, will arrange left->right - void cleanup(); - - void setBackground(QPixmap pix); //should already be sized appropriately for this widget - void setDesktopArea(QRect area); - -public slots: - void UpdateGeom(int oldgrid = -1); - -private: - QSettings *plugsettings; - QStringList plugins, deskitems; - QList<LDPlugin*> ITEMS; - QPixmap wallpaper; - QRect desktopRect; - bool TopToBottom; - float GRIDSIZE; - - int RoundUp(double num){ - int out = num; //This will truncate the number - if(out < num){ out++; } //need to increase by 1 - return out; - } - - void addDesktopItem(QString filepath); //This will convert it into a valid Plugin ID automatically - void addDesktopPlugin(QString plugID); - - - QRect findOpenSpot(int gridwidth = 1, int gridheight = 1, int startRow = 0, int startCol = 0, bool reversed = false, QString plugID = ""); - QRect findOpenSpot(QRect grid, QString plugID, bool recursive = false); - - QPoint posToGrid(QPoint pos){ - //This assumes a point in widget-relative coordinates - pos.setX( RoundUp(pos.x()/GRIDSIZE)); - pos.setY( RoundUp(pos.y()/GRIDSIZE)); - return pos; - } - - QRect geomToGrid(QRect geom, int grid = -1){ - if(grid<0){ - //use the current grid size - return QRect( RoundUp(geom.x()/GRIDSIZE), RoundUp(geom.y()/GRIDSIZE), \ - RoundUp(geom.width()/GRIDSIZE), RoundUp(geom.height()/GRIDSIZE) ); - }else{ - //use the input grid size - return QRect( RoundUp(geom.x()/((double) grid)), RoundUp(geom.y()/((double) grid)), \ - RoundUp(geom.width()/((double) grid)), RoundUp(geom.height()/((double) grid)) ); - } - } - - QRect gridToGeom(QRect grid){ - //This function incorporates the bottom/right edge matchins procedures (for incomplete last grid) - QRect geom(grid.x()*GRIDSIZE, grid.y()*GRIDSIZE, grid.width()*GRIDSIZE, grid.height()*GRIDSIZE); - //Now check the edge conditions (last right/bottom grid points might be smaller than GRIDSIZE) - QSize areaSize = desktopRect.size(); //use the size of the area instead of the geometry - because we need this in child coordinates like "geom" above - //qDebug() << "GridToGeom:" << grid << geom << "Area size:" << areaSize; - if(geom.right() > areaSize.width() && (geom.right()-areaSize.width())<GRIDSIZE ){ - geom.setRight(areaSize.width()-1); //match up with the edge - } - if(geom.bottom() > areaSize.height() && (geom.bottom() -areaSize.height())<GRIDSIZE ){ - geom.setBottom(areaSize.height()-1); //match up with the edge - } - //qDebug() << " - Adjusted:" << geom; - return geom; - } - - //Internal simplification for setting up a drag event - void setupDrag(QString id, QString type){ - QMimeData *mime = new QMimeData; - mime->setData(MIMETYPE, QString(type+"::::"+id).toLocal8Bit() ); - //If this is a desktop file - also add it to the generic URI list mimetype - if(id.startsWith("applauncher::")){ - QList<QUrl> urilist; - urilist << QUrl::fromLocalFile( id.section("---",0,0).section("::",1,50) ); - mime->setUrls(urilist); - } - //Create the drag structure - QDrag *drag = new QDrag(this); - drag->setMimeData(mime); - drag->exec(Qt::CopyAction); - } - - bool ValidGrid(QRect grid){ - //qDebug() << "Check Valid Grid:" << grid << RoundUp(this->width()/GRIDSIZE) << RoundUp(this->height()/GRIDSIZE); - //This just checks that the grid coordinates are not out of bounds - should still run ValidGeometry() below with the actual pixel geom - if(grid.x()<0 || grid.y()<0 || grid.width()<0 || grid.height()<0){ return false; } - else if( (grid.x()+grid.width()) > RoundUp(desktopRect.width()/GRIDSIZE) ){ return false; } - else if( (grid.y()+grid.height()) > RoundUp(desktopRect.height()/GRIDSIZE) ){ return false; } - return true; - } - - bool ValidGeometry(QString id, QRect geom){ - //First check that it is within the desktop area completely - // Note that "this->geometry()" is not in the same coordinate space as the geometry inputs - if(!QRect(0,0,desktopRect.width(), desktopRect.height()).contains(geom)){ return false; } - //Now check that it does not collide with any other items - for(int i=0; i<ITEMS.length(); i++){ - if(ITEMS[i]->whatsThis()==id){ continue; } - else if(geom.intersects(ITEMS[i]->geometry())){ return false; } - } - return true; - } - - LDPlugin* ItemFromID(QString ID){ - for(int i=0; i<ITEMS.length(); i++){ - if(ITEMS[i]->whatsThis()==ID){ return ITEMS[i]; } - } - return 0; - } - - void MovePlugin(LDPlugin* plug, QRect geom){ - plug->setGeometry( geom ); - plug->setFixedSize(geom.size()); //needed for some plugins - plug->savePluginGeometry(geom); - } - -private slots: - void reloadPlugins(bool ForceIconUpdate = false); - - void StartItemMove(QString ID){ - setupDrag(ID, "move"); - } - void StartItemResize(QString ID){ - setupDrag(ID, "resize"); - } - void RemoveItem(QString ID){ - //Special case - desktop file/dir link using the "applauncher" plugin - if(ID.startsWith("applauncher::")){ - QFileInfo info(ID.section("---",0,0).section("::",1,50) ); - if(info.exists() && info.absolutePath()==QDir::homePath()+"/Desktop"){ - qDebug() << "Deleting Desktop Item:" << info.absoluteFilePath(); - if(!info.isSymLink() && info.isDir()){ QProcess::startDetached("rm -r \""+info.absoluteFilePath()+"\""); } - else{ QFile::remove(info.absoluteFilePath()); } //just remove the file/symlink directly - emit PluginRemovedByUser(ID); - return; - } - } - //Any other type of plugin - for(int i=0; i<ITEMS.length(); i++){ - if(ITEMS[i]->whatsThis()==ID){ - ITEMS[i]->Cleanup(); - ITEMS.takeAt(i)->deleteLater(); - break; - } - } - emit PluginRemovedByUser(ID); - } - -protected: - void focusInEvent(QFocusEvent *ev){ - this->lower(); //make sure we stay on the bottom of the window stack - QWidget::focusInEvent(ev); //do normal handling - } - void paintEvent(QPaintEvent*ev); - - //Need Drag and Drop functionality (internal movement) - void dragEnterEvent(QDragEnterEvent *ev){ - if(ev->mimeData()->hasFormat(MIMETYPE) ){ - ev->acceptProposedAction(); //allow this to be dropped here - }else if(ev->mimeData()->hasUrls()){ - ev->acceptProposedAction(); //allow this to be dropped here - }else{ - ev->ignore(); - } - } - - void dragMoveEvent(QDragMoveEvent *ev){ - if(ev->mimeData()->hasFormat(MIMETYPE) ){ - //Internal move/resize - Check for validity - QString act = QString( ev->mimeData()->data(MIMETYPE) ); - LDPlugin *item = ItemFromID(act.section("::::",1,50)); - //qDebug() << "Internal Move Event:" << act << ev->pos(); - if(item!=0){ - QRect geom = item->geometry(); - QPoint grid = posToGrid(ev->pos()); - if(act.section("::::",0,0)=="move"){ - QPoint diff = grid - posToGrid(geom.center()); //difference in grid coords - //qDebug() << "Move Event:" << "Diff:" << diff << "Geom:" << geom << grid << ev->pos(); - geom = geomToGrid(geom); //convert to grid coords - //qDebug() << "Move Event:" << "Old geom (grid):" << geom; - geom.moveTo( (geom.topLeft()+diff) ); - //qDebug() << " - After Move:" << geom; - bool valid = ValidGrid(geom); - if(valid){ - //Convert to pixel coordinates and check validity again - geom = gridToGeom(geom); //convert back to px coords with edge matching - valid = ValidGeometry(act.section("::::",1,50), geom); - } - if(valid){ - MovePlugin(item, geom); - //item->setGeometry(geom); - //item->setFixedSize(geom.size()); //needed due to resizing limitations and such for some plugins - ev->acceptProposedAction(); - //item->savePluginGeometry(geom); //save in pixel coords - }else{ ev->ignore(); } //invalid location - - }else{ - //Resize operation - QPoint diff = ev->pos() - (geom.center()-QPoint(1,1)); //need difference from center (pixels) - //Note: Use the 1x1 pixel offset to ensure that the center point is not exactly on a grid point intersection (2x2, 4x4, etc) - //qDebug() << "Resize Plugin:" << geom << grid << posToGrid(geom.center()) << diff; - geom = geomToGrid(geom); //convert to grid coordinates now - //qDebug() << " - Grid Geom:" << geom; - if(diff.x()<0){ geom.setLeft(ev->pos().x()/GRIDSIZE); } //expanding to the left (round down) - else if(diff.x()>0){ geom.setRight( ev->pos().x()/GRIDSIZE); } //expanding to the right (round down) - if(diff.y()<0){ geom.setTop( ev->pos().y()/GRIDSIZE); } //expanding above (round down) - else if(diff.y()>0){ geom.setBottom( ev->pos().y()/GRIDSIZE); } //expanding below (round down) - //qDebug() << " - Adjusted:" << geom; - bool valid = ValidGrid(geom); - if(valid){ - //Convert to pixel coordinates and check validity again - geom = gridToGeom(geom); //convert back to px coords with edge matching - valid = ValidGeometry(act.section("::::",1,50), geom); - } - if(valid){ - MovePlugin(item, geom); - //item->setGeometry(geom); - //item->setFixedSize(geom.size()); //needed due to resizing limitations and such for some plugins - ev->acceptProposedAction(); - //item->savePluginGeometry(geom); //save in pixel coords - }else{ ev->ignore(); } //invalid location - } - } - }else if(ev->mimeData()->hasUrls()){ - ev->acceptProposedAction(); //allow this to be dropped here - }else{ - ev->ignore(); - } - } - - void dropEvent(QDropEvent *ev){ - //QPoint grid = posToGrid(ev->pos()); - if(ev->mimeData()->hasFormat(MIMETYPE)){ - //Desktop Items getting moved around - already performed in the dragMoveEvent - ev->accept(); - }else if(ev->mimeData()->hasUrls()){ - ev->accept(); - //Files getting dropped here - QList<QUrl> urls = ev->mimeData()->urls(); - qDebug() << "Desktop Drop Event:" << urls; - for(int i=0; i<urls.length(); i++){ - //If this file is not in the desktop folder, move/copy it here - if(urls[i].isLocalFile()){ - QFileInfo info(urls[i].toLocalFile()); - if(info.exists() && !QFile::exists(QDir::homePath()+"/Desktop/"+info.fileName())){ - //Make a link to the file here - QFile::link(info.absoluteFilePath(), QDir::homePath()+"/Desktop/"+info.fileName()); - }else{ - qWarning() << "Invalid desktop file drop (ignored):" << urls[i].toString(); - } - } - - } - }else{ - //Ignore this event - ev->ignore(); - } - } - -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/LPanel.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/LPanel.cpp deleted file mode 100644 index 5df1fcb6..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/LPanel.cpp +++ /dev/null @@ -1,399 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2012-2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "LPanel.h" -#include "LSession.h" -#include <QScreen> - -#include "panel-plugins/systemtray/LSysTray.h" - -#define DEBUG 0 - -LPanel::LPanel(QSettings *file, QString scr, int num, QWidget *parent) : QWidget(){ - //Take care of inputs - this->setMouseTracking(true); - hascompositer = false; //LUtils::isValidBinary("xcompmgr"); //NOT WORKING YET - xcompmgr issue with special window flags? - if(DEBUG){ qDebug() << " - Creating Panel:" << scr << num; } - bgWindow = parent; //save for later - //Setup the widget overlay for the entire panel to provide transparency effects - panelArea = new QWidget(this); - //panelArea->setAttribute(Qt::WA_TranslucentBackground); - QBoxLayout *tmp = new QBoxLayout(QBoxLayout::LeftToRight); - tmp->setContentsMargins(0,0,0,0); - this->setLayout(tmp); - tmp->addWidget(panelArea); - settings = file; - screenID = scr; - panelnum = num; //save for later - screen = LSession::desktop(); - QString screenID = QApplication::screens().at(Screen())->name(); - PPREFIX = "panel_"+screenID+"."+QString::number(num)+"/"; - defaultpanel = (LSession::handle()->screenGeom(Screen()).x()==0 && num==0); - horizontal=true; //use this by default initially - hidden = false; //use this by default - //Setup the panel - if(DEBUG){ qDebug() << " -- Setup Panel"; } - this->setContentsMargins(0,0,0,0); - this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - //panels cannot get keyboard focus otherwise it upsets the task manager window detection - //this->setAttribute(Qt::WA_X11DoNotAcceptFocus); - this->setAttribute(Qt::WA_X11NetWmWindowTypeDock); - this->setAttribute(Qt::WA_AlwaysShowToolTips); - this->setAttribute(Qt::WA_TranslucentBackground); - //this->setAttribute(Qt::WA_NoSystemBackground); - this->setAutoFillBackground(false); - this->setWindowFlags(Qt::FramelessWindowHint | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint); - //this->setWindowFlags(Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint); - - this->setWindowTitle("LuminaPanel"); - this->setObjectName("LuminaPanelBackgroundWidget"); - this->setStyleSheet("QToolButton::menu-indicator{ image: none; } QWidget#LuminaPanelBackgroundWidget{ background: transparent; }"); - panelArea->setObjectName("LuminaPanelColor"); - layout = new QBoxLayout(QBoxLayout::LeftToRight); - layout->setContentsMargins(0,0,0,0); - layout->setSpacing(1); - //layout->setSizeConstraint(QLayout::SetFixedSize); - panelArea->setLayout(layout); - //Set special window flags on the panel for proper usage - this->show(); - LSession::handle()->XCB->SetAsPanel(this->winId()); - LSession::handle()->XCB->SetAsSticky(this->winId()); - if(hascompositer){ - //qDebug() << "Enable Panel compositing"; - //this->setStyleSheet("QWidget#LuminaPanelBackgroundWidget{ background: transparent; }"); - //this->setWindowOpacity(0.5); //fully transparent background for the main widget - //panelArea->setWindowOpacity(1.0); //fully opaque for the widget on top (apply stylesheet transparencies) - } - QTimer::singleShot(1,this, SLOT(UpdatePanel()) ); - //connect(screen, SIGNAL(resized(int)), this, SLOT(UpdatePanel()) ); //in case the screen resolution changes -} - -LPanel::~LPanel(){ - -} - -int LPanel::Screen(){ - // Find the screen number associated with this ID - QList<QScreen*> scrns = QApplication::screens(); - for(int i=0; i<scrns.length(); i++){ - if(scrns[i]->name() == screenID){ return i; } - } - return -1; -} - -void LPanel::prepareToClose(){ - //Go through and remove all the plugins - for(int i=0; i<PLUGINS.length(); i++){ - PLUGINS[i]->AboutToClose(); //any last cleanup for this plugin - layout->takeAt(i); //remove from the layout - PLUGINS.takeAt(i)->deleteLater(); //delete the actual widget - LSession::processEvents(); - i--; //need to back up one space to not miss another plugin - } - this->hide(); -} - -void LPanel::scalePanel(double xscale, double yscale){ - int ht = settings->value(PPREFIX+"height", 30).toInt(); //this is technically the distance into the screen from the edge - QString loc = settings->value(PPREFIX+"location","").toString().toLower(); - if(loc=="top" || loc=="bottom"){ - ht = qRound(ht*yscale); - }else{ - ht = qRound(ht*xscale); - } - settings->setValue(PPREFIX+"height", ht); - settings->sync(); - QTimer::singleShot(0, this, SLOT(UpdatePanel()) ); -} - -//=========== -// PUBLIC SLOTS -//=========== -void LPanel::UpdatePanel(bool geomonly){ - //Create/Update the panel as designated in the Settings file - settings->sync(); //make sure to catch external settings changes - //First set the geometry of the panel and send the EWMH message to reserve that space - if(DEBUG){ qDebug() << "Update Panel: Geometry only=" << geomonly << "Screen Size:" << LSession::handle()->screenGeom(Screen()); } - hidden = settings->value(PPREFIX+"hidepanel",false).toBool(); - QString loc = settings->value(PPREFIX+"location","").toString().toLower(); - if(loc.isEmpty() && defaultpanel){ loc="top"; } - if(loc=="top" || loc=="bottom"){ - horizontal=true; - layout->setAlignment(Qt::AlignLeft); - layout->setDirection(QBoxLayout::LeftToRight); - }else{ - horizontal=false; - layout->setAlignment(Qt::AlignTop); - layout->setDirection(QBoxLayout::TopToBottom); - } - int ht = qRound(settings->value(PPREFIX+"height", 30).toDouble()); //this is technically the distance into the screen from the edge - fullwidth = ht; //save this for later - if(ht<=1){ ht = 30; } //some kind of error in the saved height - use the default value - int hidesize = qRound(ht*0.01); //use 1% of the panel size - if(hidesize<2){ hidesize=2; } //minimum of 2 pixels (need space for the mouse to go over it) - if(hidden){ viswidth = hidesize; } - else{ viswidth = ht; } - if(DEBUG){ qDebug() << "Hidden Panel size:" << hidesize << "pixels"; } - //qDebug() << " - set Geometry"; - int xwid = LSession::handle()->screenGeom(Screen()).width(); - int xhi = LSession::handle()->screenGeom(Screen()).height(); - int xloc = LSession::handle()->screenGeom(Screen()).x(); - int yloc = LSession::handle()->screenGeom(Screen()).y(); - double panelPercent = settings->value(PPREFIX+"lengthPercent",100).toInt(); - if(panelPercent<1 || panelPercent>100){ panelPercent = 100; } - panelPercent = panelPercent/100.0; - QString panelPinLoc = settings->value(PPREFIX+"pinLocation","center").toString().toLower(); //[left/right/center] possible values (assume center otherwise) - if(DEBUG){ qDebug() << " - Panel settings:" << QString::number(panelPercent)+QString("%") << panelPinLoc << loc; } - //xloc=xoffset; - if(loc=="top"){ //top of screen - QSize sz = QSize(xwid*panelPercent, ht); - if(panelPinLoc=="left"){} // no change to xloc - else if(panelPinLoc=="right"){ xloc = xloc+xwid-sz.width(); } - else{ xloc = xloc+((xwid-sz.width())/2) ; } //centered - //qDebug() << " - Panel Sizing:" << xloc << sz; - this->setMinimumSize(sz); - this->setMaximumSize(sz); - this->setGeometry(xloc,yloc,sz.width(), sz.height()); - //qDebug() << " - Reserve Panel Localation"; - if(!hidden){ LSession::handle()->XCB->ReserveLocation(this->winId(), this->geometry(), "top"); } - else{ - LSession::handle()->XCB->ReserveLocation(this->winId(), QRect(xloc, yloc, this->width(), hidesize), "top"); - hidepoint = QPoint(xloc, yloc); - showpoint = QPoint(xloc, yloc); - this->move(hidepoint); - this->resize( this->width(), viswidth); - } - }else if(loc=="bottom"){ //bottom of screen - QSize sz = QSize(xwid*panelPercent, ht); - if(panelPinLoc=="left"){} // no change to xloc - else if(panelPinLoc=="right"){ xloc = xloc+xwid-sz.width(); } - else{ xloc = xloc+((xwid-sz.width())/2) ; } //centered - this->setMinimumSize(sz); - this->setMaximumSize(sz); - this->setGeometry(xloc,yloc+xhi-ht,sz.width(), ht ); - if(!hidden){ LSession::handle()->XCB->ReserveLocation(this->winId(), this->geometry(), "bottom"); } - else{ - LSession::handle()->XCB->ReserveLocation(this->winId(), QRect(xloc,yloc+ xhi-hidesize, this->width(), hidesize), "bottom"); - hidepoint = QPoint(xloc, yloc+xhi-hidesize); - showpoint = QPoint(xloc, yloc+xhi-ht); - this->move(hidepoint); //Could bleed over onto the screen below - this->resize( this->width(), viswidth); - } - }else if(loc=="left"){ //left side of screen - QSize sz = QSize(ht, xhi*panelPercent); - if(panelPinLoc=="left"){} //this is actually the top (left of center in length dimension) - else if(panelPinLoc=="right"){ yloc = yloc+xhi-sz.height(); } - else{ yloc = yloc+((xhi-sz.height())/2) ; } //centered - this->setMinimumSize(sz); - this->setMaximumSize(sz); - this->setGeometry(xloc,yloc, ht, sz.height()); - if(!hidden){ LSession::handle()->XCB->ReserveLocation(this->winId(), this->geometry(), "left"); } - else{ - LSession::handle()->XCB->ReserveLocation(this->winId(), QRect(xloc, yloc, hidesize, sz.height()), "left"); - hidepoint = QPoint(xloc, yloc); - showpoint = QPoint(xloc, yloc); - this->move(hidepoint); //Could bleed over onto the screen left - this->resize( viswidth, this->height()); - } - }else{ //right side of screen - QSize sz = QSize(ht, xhi*panelPercent); - if(panelPinLoc=="left"){} //this is actually the top (left of center in length dimension) - else if(panelPinLoc=="right"){ yloc = yloc+xhi-sz.height(); } - else{ yloc = yloc+((xhi-sz.height())/2) ; } //centered - this->setMinimumSize(sz); - this->setMaximumSize(sz); - this->setGeometry(xloc+xwid-ht,yloc,ht, sz.height()); - if(!hidden){ LSession::handle()->XCB->ReserveLocation(this->winId(), this->geometry(), "right"); } - else{ - LSession::handle()->XCB->ReserveLocation(this->winId(), QRect(xloc+xwid-hidesize, yloc, hidesize, sz.height()), "right"); - hidepoint = QPoint(xloc+xwid-hidesize, yloc); - showpoint = QPoint(xloc+xwid-ht, yloc); - this->move(hidepoint); //Could bleed over onto the screen right - this->resize( viswidth, this->height()); - } - } - if(DEBUG){ qDebug() << " - Done with panel geometry"; } - //Double check that the "sticky" bit is set on the window state - bool needsticky = !LSession::handle()->XCB->WM_Get_Window_States(this->winId()).contains(LXCB::S_STICKY); - if(needsticky){ LSession::handle()->XCB->SetAsSticky(this->winId()); } - if(geomonly){ return; } - //Now update the appearance of the toolbar - if(settings->value(PPREFIX+"customColor", false).toBool()){ - QString color = settings->value(PPREFIX+"color", "rgba(255,255,255,160)").toString(); - QString style = "QWidget#LuminaPanelColor{ background: %1; border-radius: 3px; border: 1px solid %1; }"; - style = style.arg(color); - panelArea->setStyleSheet(style); - }else{ - panelArea->setStyleSheet(""); //clear it and use the one from the theme - } - - //Then go through the plugins and create them as necessary - QStringList plugins = settings->value(PPREFIX+"pluginlist", QStringList()).toStringList(); - /*if(defaultpanel && plugins.isEmpty()){ - plugins << "userbutton" << "taskmanager" << "spacer" << "systemtray" << "clock" << "systemdashboard"; - }*/ - if(DEBUG){ qDebug() << " - Initialize Plugins: " << plugins; } - for(int i=0; i<plugins.length(); i++){ - //Ensure this plugin has a unique ID (NOTE: this numbering does not persist between sessions) - if(!plugins[i].contains("---")){ - int num=1; - while( plugins.contains(plugins[i]+"---"+QString::number(Screen())+"."+QString::number(this->number())+"."+QString::number(num)) ){ - num++; - } - - plugins[i] = plugins[i]+"---"+QString::number(Screen())+"."+QString::number(this->number())+"."+QString::number(num); - //qDebug() << "Adjust Plugin ID:" << plugins[i]; - } - //See if this plugin is already there or in a different spot - bool found = false; - for(int p=0; p<PLUGINS.length(); p++){ - if(PLUGINS[p]->type()==plugins[i]){ - found = true; //already exists - //Make sure the plugin layout has the correct orientation - if(horizontal){PLUGINS[p]->layout()->setDirection(QBoxLayout::LeftToRight); } - else{ PLUGINS[p]->layout()->setDirection(QBoxLayout::TopToBottom); } - PLUGINS[p]->OrientationChange(); - //Now check the location of the plugin in the panel - if(p!=i){ //wrong place in the panel - layout->takeAt(p); //remove the item from the current location - layout->insertWidget(i, PLUGINS[p]); //add the item into the correct location - PLUGINS.move(p,i); //move the identifier in the list to match - } - break; - } - } - if(!found){ - //New Plugin - if(DEBUG){ qDebug() << " -- New Plugin:" << plugins[i] << i; } - LPPlugin *plug = NewPP::createPlugin(plugins[i], panelArea, horizontal); - if(plug != 0){ - PLUGINS.insert(i, plug); - layout->insertWidget(i, PLUGINS[i]); - connect(plug, SIGNAL(MenuClosed()), this, SLOT(checkPanelFocus())); - }else{ - //invalid plugin type - plugins.removeAt(i); //remove this invalid plugin from the list - i--; //make sure we don't miss the next item with the re-order - } - } - //LSession::processEvents(); - } - //Now remove any extra plugins from the end - //qDebug() << "plugins:" << plugins; - //qDebug() << "PLUGINS length:" << PLUGINS.length(); - for(int i=0; i<PLUGINS.length(); i++){ - if(plugins.contains(PLUGINS[i]->type())){ continue; } //good plugin - skip it - if(DEBUG){ qDebug() << " -- Remove Plugin: " << PLUGINS[i]->type(); } - //If this is the system tray - stop it first - if( PLUGINS[i]->type().startsWith("systemtray---") ){ - static_cast<LSysTray*>(PLUGINS[i])->stop(); - } - layout->takeAt(i); //remove from the layout - PLUGINS.takeAt(i)->deleteLater(); //delete the actual widget - //LSession::processEvents(); - i--; //need to back up one space to not miss another plugin - } - this->update(); - this->show(); //make sure the panel is visible now - if(hidden){ this->move(hidepoint); } - //Now go through and send the orientation update signal to each plugin - for(int i=0; i<PLUGINS.length(); i++){ - QTimer::singleShot(0,PLUGINS[i], SLOT(OrientationChange())); - } - checkPanelFocus(); - //LSession::processEvents(); -} - -void LPanel::UpdateLocale(){ - //The panel itself has no text to translate, just forward the signal to all the plugins - for(int i=0; i<PLUGINS.length(); i++){ - QTimer::singleShot(1,PLUGINS[i], SLOT(LocaleChange())); - } -} - -void LPanel::UpdateTheme(){ - //The panel itself has no theme-based icons, just forward the signal to all the plugins - for(int i=0; i<PLUGINS.length(); i++){ - QTimer::singleShot(1,PLUGINS[i], SLOT(ThemeChange())); - } -} - -// =================== -// PRIVATE SLOTS -// =================== -void LPanel::checkPanelFocus(){ - qDebug() << "Check Panel Focus:" << panelnum << viswidth << fullwidth << this->size(); - if( !this->geometry().contains(QCursor::pos()) ){ - //Move the panel back to it's "hiding" spot - if(hidden){ - QSize sz(horizontal ? this->width() : viswidth, horizontal ? viswidth : this->height() ); - this->setMinimumSize(sz); - this->setMaximumSize(sz); - this->setGeometry( QRect(hidepoint, sz) ); - } - //Re-active the old window - if(LSession::handle()->activeWindow()!=0){ - LSession::handle()->XCB->ActivateWindow(LSession::handle()->activeWindow()); - } - }else if(hidden){ - QSize sz(horizontal ? this->width() : fullwidth, horizontal ? fullwidth : this->height() ); - this->setMinimumSize(sz); - this->setMaximumSize(sz); - this->setGeometry( QRect(showpoint, sz) ); - } -} - -//=========== -// PROTECTED -//=========== -void LPanel::resizeEvent(QResizeEvent *event){ - QWidget::resizeEvent(event); - for(int i=0; i<PLUGINS.length(); i++){ PLUGINS[i]->OrientationChange(); } -} - -void LPanel::paintEvent(QPaintEvent *event){ - if(!hascompositer){ - QPainter *painter = new QPainter(this); - //qDebug() << "Paint Panel:" << PPREFIX; - //Make sure the base background of the event rectangle is the associated rectangle from the BGWindow - QRect rec = event->rect();//this->geometry(); //start with the global geometry of the panel - rec.adjust(-1,-1,2,2); //add 1 more pixel on each side - //Need to translate that rectangle to the background image coordinates - //qDebug() << " - Rec:" << rec << hidden << this->geometry() << bgWindow->geometry(); - rec.moveTo( bgWindow->mapFromGlobal( this->mapToGlobal(rec.topLeft()) ) ); //(rec.x()-LSession::handle()->screenGeom(Screen()).x(), rec.y()-LSession::handle()->screenGeom(Screen()).y() ); - //qDebug() << " - Adjusted Window Rec:" << rec; - painter->drawPixmap(event->rect().adjusted(-1,-1,2,2), bgWindow->grab(rec)); - //painter->drawPixmap(event->rect().adjusted(-1,-1,2,2), QApplication::screens().at(Screen())->grabWindow(QX11Info::appRootWindow(), rec.x(), rec.y(), rec.width(), rec.height()) ); - delete(painter); - } - QWidget::paintEvent(event); //now pass the event along to the normal painting event -} - -void LPanel::enterEvent(QEvent *event){ - //qDebug() << "Panel Enter Event:"; - checkPanelFocus(); - /*if(hidden){ - //Move the panel out so it is fully available - this->move(showpoint); - this->resize( horizontal ? this->width() : fullwidth, horizontal ? fullwidth : this->height() ); - this->update(); - }*/ - //this->activateWindow(); - event->accept(); //just to quiet the compile warning -} - -void LPanel::leaveEvent(QEvent *event){ - /*qDebug() << "Panel Leave Event:"; - qDebug() << "Panel Geom:" << this->geometry().x() << this->geometry().y() << this->geometry().width() << this->geometry().height() ; - QPoint pt = QCursor::pos(); - qDebug() << "Mouse Point (global):" << pt.x() << pt.y(); - //pt = this->mapFromGlobal(pt); - //qDebug() << "Mouse Point (local):" << pt.x() << pt.y(); - qDebug() << "Contained:" << this->geometry().contains(pt);*/ - checkPanelFocus(); - QWidget::leaveEvent(event); - //event->accept(); //just to quiet the compile warning -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/LPanel.h b/src-qt5/core/lumina-desktop-unified/src-DE/LPanel.h deleted file mode 100644 index bcea8eaf..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/LPanel.h +++ /dev/null @@ -1,81 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2012-2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This is the generic class for creating a full-width panel that stays -// on top of all other windows (top or bottom of the screen only) -//=========================================== -#ifndef _LUMINA_DESKTOP_PANEL_H -#define _LUMINA_DESKTOP_PANEL_H - -#include <QWidget> -#include <QBoxLayout> -#include <QSettings> -#include <QString> -#include <QStringList> -#include <QTimer> -#include <QMoveEvent> -#include <QDesktopWidget> -#include <QPainter> -#include <QPaintEvent> - -#include "panel-plugins/NewPP.h" -#include "panel-plugins/LPPlugin.h" - -#include <LuminaX11.h> -#include <LuminaOS.h> - -class LPanel : public QWidget{ - Q_OBJECT -private: - QBoxLayout *layout; - QSettings *settings; - QString PPREFIX; //internal prefix for all settings - QDesktopWidget *screen; - QWidget *bgWindow, *panelArea; - //QRect hidegeom, showgeom; //for hidden panels - QPoint hidepoint, showpoint; //for hidden panels: locations when hidden/visible - bool defaultpanel, horizontal, hidden, hascompositer; - QString screenID; - int panelnum; - int viswidth, fullwidth; - QList<LPPlugin*> PLUGINS; - - int Screen(); //Turn the screenID into the appropriate number - -public: - LPanel(QSettings *file, QString scr = 0, int num =0, QWidget *parent=0); //settings file, screen number, panel number - ~LPanel(); - - int number(){ - return panelnum; - } - - QString prefix(){ - return PPREFIX; - } - - int visibleWidth(){ - return viswidth; - } - void prepareToClose(); - void scalePanel(double xscale, double yscale); - -public slots: - void UpdatePanel(bool geomonly = false); //Load the settings file and update the panel appropriately - void UpdateLocale(); //Locale Changed externally - void UpdateTheme(); //Theme Changed externally - -private slots: - void checkPanelFocus(); - -protected: - void resizeEvent(QResizeEvent *event); - void paintEvent(QPaintEvent *event); - void enterEvent(QEvent *event); - void leaveEvent(QEvent *event); -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/LSession.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/LSession.cpp deleted file mode 100644 index 0387555a..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/LSession.cpp +++ /dev/null @@ -1,798 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2012-2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "LSession.h" -#include <LuminaOS.h> - -#include <QTime> -#include <QScreen> -#include <QtConcurrent> -#include "LXcbEventFilter.h" -#include "BootSplash.h" - -//LibLumina X11 class -#include <LuminaX11.h> -#include <LUtils.h> - -#include <unistd.h> //for usleep() usage - -#ifndef DEBUG -#define DEBUG 0 -#endif - -XCBEventFilter *evFilter = 0; - -LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lumina-desktop"){ - if(this->isPrimaryProcess()){ - connect(this, SIGNAL(InputsAvailable(QStringList)), this, SLOT(NewCommunication(QStringList)) ); - this->setApplicationName("Lumina Desktop Environment"); - this->setApplicationVersion( LDesktopUtils::LuminaDesktopVersion() ); - this->setOrganizationName("LuminaDesktopEnvironment"); - this->setQuitOnLastWindowClosed(false); //since the LDesktop's are not necessarily "window"s - //Enabled a few of the simple effects by default - this->setEffectEnabled( Qt::UI_AnimateMenu, true); - this->setEffectEnabled( Qt::UI_AnimateCombo, true); - this->setEffectEnabled( Qt::UI_AnimateTooltip, true); - //this->setAttribute(Qt::AA_UseDesktopOpenGL); - //this->setAttribute(Qt::AA_UseHighDpiPixmaps); //allow pixmaps to be scaled up as well as down - //this->setStyle( new MenuProxyStyle); //QMenu icon size override - SystemTrayID = 0; VisualTrayID = 0; - sysWindow = 0; - TrayDmgEvent = 0; - TrayDmgError = 0; - lastActiveWin = 0; - cleansession = true; - TrayStopping = false; - screenTimer = new QTimer(this); - screenTimer->setSingleShot(true); - screenTimer->setInterval(50); - connect(screenTimer, SIGNAL(timeout()), this, SLOT(updateDesktops()) ); - for(int i=1; i<argc; i++){ - if( QString::fromLocal8Bit(argv[i]) == "--noclean" ){ cleansession = false; break; } - } - XCB = new LXCB(); //need access to XCB data/functions right away - //initialize the empty internal pointers to 0 - appmenu = 0; - settingsmenu = 0; - currTranslator=0; - mediaObj=0; - sessionsettings=0; - //Setup the event filter for Qt5 - evFilter = new XCBEventFilter(this); - this->installNativeEventFilter( evFilter ); - connect(this, SIGNAL(screenAdded(QScreen*)), this, SLOT(screensChanged()) ); - connect(this, SIGNAL(screenRemoved(QScreen*)), this, SLOT(screensChanged()) ); - connect(this, SIGNAL(primaryScreenChanged(QScreen*)), this, SLOT(screensChanged()) ); - } //end check for primary process -} - -LSession::~LSession(){ - if(this->isPrimaryProcess()){ - //WM->stopWM(); - for(int i=0; i<DESKTOPS.length(); i++){ - DESKTOPS[i]->deleteLater(); - } - //delete WM; - settingsmenu->deleteLater(); - appmenu->deleteLater(); - delete currTranslator; - if(mediaObj!=0){delete mediaObj;} - } -} - -void LSession::setupSession(){ - //Seed random number generator (if needed) - qsrand( QTime::currentTime().msec() ); - - BootSplash splash; - splash.showScreen("init"); - qDebug() << "Initializing Session"; - if(QFile::exists("/tmp/.luminastopping")){ QFile::remove("/tmp/.luminastopping"); } - QTime* timer = 0; - //if(DEBUG){ timer = new QTime(); timer->start(); qDebug() << " - Init srand:" << timer->elapsed();} - - //Setup the QSettings default paths - splash.showScreen("settings"); - if(DEBUG){ qDebug() << " - Init QSettings:" << timer->elapsed();} - sessionsettings = new QSettings("lumina-desktop", "sessionsettings"); - DPlugSettings = new QSettings("lumina-desktop","pluginsettings/desktopsettings"); - //Load the proper translation files - if(sessionsettings->value("ForceInitialLocale",false).toBool()){ - //Some system locale override it in place - change the env first - LUtils::setLocaleEnv( sessionsettings->value("InitLocale/LANG","").toString(), \ - sessionsettings->value("InitLocale/LC_MESSAGES","").toString(), \ - sessionsettings->value("InitLocale/LC_TIME","").toString(), \ - sessionsettings->value("InitLocale/LC_NUMERIC","").toString(), \ - sessionsettings->value("InitLocale/LC_MONETARY","").toString(), \ - sessionsettings->value("InitLocale/LC_COLLATE","").toString(), \ - sessionsettings->value("InitLocale/LC_CTYPE","").toString() ); - } - currTranslator = LUtils::LoadTranslation(this, "lumina-desktop"); -//use the system settings - //Setup the user's lumina settings directory as necessary - splash.showScreen("user"); - if(DEBUG){ qDebug() << " - Init User Files:" << timer->elapsed();} - checkUserFiles(); //adds these files to the watcher as well - - //Initialize the internal variables - DESKTOPS.clear(); - - //Start the background system tray - splash.showScreen("systray"); - if(DEBUG){ qDebug() << " - Init System Tray:" << timer->elapsed();} - startSystemTray(); - - //Initialize the global menus - qDebug() << " - Initialize system menus"; - splash.showScreen("apps"); - if(DEBUG){ qDebug() << " - Init AppMenu:" << timer->elapsed();} - appmenu = new AppMenu(); - - splash.showScreen("menus"); - if(DEBUG){ qDebug() << " - Init SettingsMenu:" << timer->elapsed();} - settingsmenu = new SettingsMenu(); - if(DEBUG){ qDebug() << " - Init SystemWindow:" << timer->elapsed();} - sysWindow = new SystemWindow(); - - //Initialize the desktops - splash.showScreen("desktop"); - if(DEBUG){ qDebug() << " - Init Desktops:" << timer->elapsed();} - desktopFiles = QDir(QDir::homePath()+"/Desktop").entryInfoList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs, QDir::Name | QDir::IgnoreCase | QDir::DirsFirst); - updateDesktops(); - for(int i=0; i<6; i++){ LSession::processEvents(); } //Run through this a few times so the interface systems get up and running - - //Now setup the system watcher for changes - splash.showScreen("final"); - qDebug() << " - Initialize file system watcher"; - if(DEBUG){ qDebug() << " - Init QFileSystemWatcher:" << timer->elapsed();} - watcher = new QFileSystemWatcher(this); - QString confdir = sessionsettings->fileName().section("/",0,-2); - watcherChange(sessionsettings->fileName() ); - watcherChange( confdir+"/desktopsettings.conf" ); - watcherChange( confdir+"/fluxbox-init" ); - watcherChange( confdir+"/fluxbox-keys" ); - watcherChange( confdir+"/favorites.list" ); - //Try to watch the localized desktop folder too - if(QFile::exists(QDir::homePath()+"/"+tr("Desktop"))){ watcherChange( QDir::homePath()+"/"+tr("Desktop") ); } - watcherChange( QDir::homePath()+"/Desktop" ); - - //connect internal signals/slots - connect(watcher, SIGNAL(directoryChanged(QString)), this, SLOT(watcherChange(QString)) ); - connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(watcherChange(QString)) ); - connect(this, SIGNAL(aboutToQuit()), this, SLOT(SessionEnding()) ); - if(DEBUG){ qDebug() << " - Init Finished:" << timer->elapsed(); delete timer;} - for(int i=0; i<4; i++){ LSession::processEvents(); } //Again, just a few event loops here so thing can settle before we close the splash screen - //launchStartupApps(); - QTimer::singleShot(500, this, SLOT(launchStartupApps()) ); - splash.hide(); - LSession::processEvents(); - splash.close(); - LSession::processEvents(); -} - -void LSession::CleanupSession(){ - //Close any running applications and tray utilities (Make sure to keep the UI interactive) - LSession::processEvents(); - QDateTime time = QDateTime::currentDateTime(); - qDebug() << "Start closing down the session: " << time.toString( Qt::SystemLocaleShortDate); - //Create a temporary flag to prevent crash dialogs from opening during cleanup - LUtils::writeFile("/tmp/.luminastopping",QStringList() << "yes", true); - //Start the logout chimes (if necessary) - LOS::setAudioVolume( LOS::audioVolume() ); //make sure the audio volume is saved in the backend for the next login - bool playaudio = sessionsettings->value("PlayLogoutAudio",true).toBool(); - if( playaudio ){ playAudioFile(LOS::LuminaShare()+"Logout.ogg"); } - //Stop the background system tray (detaching/closing apps as necessary) - stopSystemTray(!cleansession); - //Now perform any other cleanup - if(cleansession){ - //Close any open windows - //qDebug() << " - Closing any open windows"; - QList<WId> WL = XCB->WindowList(true); - for(int i=0; i<WL.length(); i++){ - qDebug() << " - Closing window:" << XCB->WindowClass(WL[i]) << WL[i]; - XCB->CloseWindow(WL[i]); - LSession::processEvents(); - } - //Now wait a moment for things to close down before quitting - for(int i=0; i<20; i++){ LSession::processEvents(); usleep(25); } //1/2 second pause - //Kill any remaining windows - WL = XCB->WindowList(true); //all workspaces - for(int i=0; i<WL.length(); i++){ - qDebug() << " - Window did not close, killing application:" << XCB->WindowClass(WL[i]) << WL[i]; - XCB->KillClient(WL[i]); - LSession::processEvents(); - } - } - evFilter->StopEventHandling(); - //Stop the window manager - //qDebug() << " - Stopping the window manager"; - //WM->stopWM(); - //Now close down the desktop - qDebug() << " - Closing down the desktop elements"; - for(int i=0; i<DESKTOPS.length(); i++){ - DESKTOPS[i]->prepareToClose(); - //don't actually close them yet - that will happen when the session exits - // this will leave the wallpapers up for a few moments (preventing black screens) - } - //Now wait a moment for things to close down before quitting - if(playaudio){ - //wait a max of 5 seconds for audio to finish - bool waitmore = true; - for(int i=0; i<100 && waitmore; i++){ - usleep(50000); //50ms = 50000 us - waitmore = (mediaObj->state()==QMediaPlayer::PlayingState); - LSession::processEvents(); - } - if(waitmore){ mediaObj->stop(); } //timed out - }else{ - for(int i=0; i<20; i++){ LSession::processEvents(); usleep(25000); } //1/2 second pause - } - //Clean up the temporary flag - if(QFile::exists("/tmp/.luminastopping")){ QFile::remove("/tmp/.luminastopping"); } -} - -int LSession::VersionStringToNumber(QString version){ - version = version.section("-",0,0); //trim any extra labels off the end - int maj, mid, min; //major/middle/minor version numbers (<Major>.<Middle>.<Minor>) - maj = mid = min = 0; - bool ok = true; - maj = version.section(".",0,0).toInt(&ok); - if(ok){ mid = version.section(".",1,1).toInt(&ok); }else{ maj = 0; } - if(ok){ min = version.section(".",2,2).toInt(&ok); }else{ mid = 0; } - if(!ok){ min = 0; } - //Now assemble the number - //NOTE: This format allows numbers to be anywhere from 0->999 without conflict - return (maj*1000000 + mid*1000 + min); -} - -void LSession::NewCommunication(QStringList list){ - if(DEBUG){ qDebug() << "New Communications:" << list; } - for(int i=0; i<list.length(); i++){ - if(list[i]=="--check-geoms"){ - screensChanged(); - }else if(list[i]=="--show-start"){ - emit StartButtonActivated(); - } - } -} - -void LSession::launchStartupApps(){ - //First start any system-defined startups, then do user defined - qDebug() << "Launching startup applications"; - - //Enable Numlock - if(LUtils::isValidBinary("numlockx")){ //make sure numlockx is installed - if(sessionsettings->value("EnableNumlock",false).toBool()){ - QProcess::startDetached("numlockx on"); - }else{ - QProcess::startDetached("numlockx off"); - } - } - int tmp = LOS::ScreenBrightness(); - if(tmp>0){ - LOS::setScreenBrightness( tmp ); - qDebug() << " - - Screen Brightness:" << QString::number(tmp)+"%"; - } - QProcess::startDetached("nice lumina-open -autostart-apps"); - - //Re-load the screen brightness and volume settings from the previous session - // Wait until after the XDG-autostart functions, since the audio system might be started that way - qDebug() << " - Loading previous settings"; - tmp = LOS::audioVolume(); - LOS::setAudioVolume(tmp); - qDebug() << " - - Audio Volume:" << QString::number(tmp)+"%"; - - //Now play the login music since we are finished - if(sessionsettings->value("PlayStartupAudio",true).toBool()){ - //Make sure to re-set the system volume to the last-used value at outset - int vol = LOS::audioVolume(); - if(vol>=0){ LOS::setAudioVolume(vol); } - LSession::playAudioFile(LOS::LuminaShare()+"Login.ogg"); - } - qDebug() << " - Finished with startup routines"; -} - -void LSession::StartLogout(){ - CleanupSession(); - QCoreApplication::exit(0); -} - -void LSession::StartShutdown(bool skipupdates){ - CleanupSession(); - LOS::systemShutdown(skipupdates); - QCoreApplication::exit(0); -} - -void LSession::StartReboot(bool skipupdates){ - CleanupSession(); - LOS::systemRestart(skipupdates); - QCoreApplication::exit(0); -} - -void LSession::reloadIconTheme(){ - //Wait a moment for things to settle before sending out the signal to the interfaces - QApplication::processEvents(); - QApplication::processEvents(); - emit IconThemeChanged(); -} - -void LSession::watcherChange(QString changed){ - if(DEBUG){ qDebug() << "Session Watcher Change:" << changed; } - //if(changed.endsWith("fluxbox-init") || changed.endsWith("fluxbox-keys")){ refreshWindowManager(); } - if(changed.endsWith("sessionsettings.conf") ){ - sessionsettings->sync(); - //qDebug() << "Session Settings Changed"; - if(sessionsettings->contains("Qt5_theme_engine")){ - QString engine = sessionsettings->value("Qt5_theme_engine","").toString(); - //qDebug() << "Set Qt5 theme engine: " << engine; - if(engine.isEmpty()){ unsetenv("QT_QPA_PLATFORMTHEME"); } - else{ setenv("QT_QPA_PLATFORMTHEME", engine.toUtf8().data(),1); } - } - emit SessionConfigChanged(); - }else if(changed.endsWith("desktopsettings.conf") ){ emit DesktopConfigChanged(); } - else if(changed == QDir::homePath()+"/Desktop" || changed == QDir::homePath()+"/"+tr("Desktop") ){ - desktopFiles = QDir(changed).entryInfoList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs ,QDir::Name | QDir::IgnoreCase | QDir::DirsFirst); - if(DEBUG){ qDebug() << "New Desktop Files:" << desktopFiles.length(); } - emit DesktopFilesChanged(); - }else if(changed.endsWith("favorites.list")){ emit FavoritesChanged(); } - //Now ensure this file was not removed from the watcher - if(!watcher->files().contains(changed) && !watcher->directories().contains(changed)){ - if(!QFile::exists(changed)){ - //Create the file really quick to ensure it can be watched - //TODO - } - watcher->addPath(changed); - } -} - -void LSession::screensChanged(){ - qDebug() << "Screen Number Changed"; - if(screenTimer->isActive()){ screenTimer->stop(); } - screenTimer->start(); -} - -void LSession::screenResized(int scrn){ - qDebug() << "Screen Resized:" << scrn; - if(screenTimer->isActive()){ screenTimer->stop(); } - screenTimer->start(); -} - -void LSession::checkWindowGeoms(){ - //Only do one window per run (this will be called once per new window - with time delays between) - if(checkWin.isEmpty()){ return; } - WId win = checkWin.takeFirst(); - if(RunningApps.contains(win) ){ //just to make sure it did not close during the delay - adjustWindowGeom( win ); - } -} - -void LSession::checkUserFiles(){ - //internal version conversion examples: - // [1.0.0 -> 1000000], [1.2.3 -> 1002003], [0.6.1 -> 6001] - QString OVS = sessionsettings->value("DesktopVersion","0").toString(); //Old Version String - bool changed = LDesktopUtils::checkUserFiles(OVS); - if(changed){ - //Save the current version of the session to the settings file (for next time) - sessionsettings->setValue("DesktopVersion", this->applicationVersion()); - } -} - -void LSession::refreshWindowManager(){ - LUtils::runCmd("touch \""+QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/fluxbox-init\"" ); -} - -void LSession::updateDesktops(){ - qDebug() << " - Update Desktops"; - QDesktopWidget *DW = this->desktop(); - int sC = DW->screenCount(); - qDebug() << " Screen Count:" << sC; - qDebug() << " DESKTOPS Length:" << DESKTOPS.length(); - if(sC<1){ return; } //stop here - no screens available temporarily (displayport/4K issue) - - for(int i=0; i<sC; i++){ qDebug() << " -- Screen["+QString::number(i)+"]:" << DW->screenGeometry(i); } - - bool firstrun = (DESKTOPS.length()==0); - bool numchange = DESKTOPS.length()!=sC; - - // If the screen count is changing on us - if ( sC != DW->screenCount() ) { - qDebug() << "Screen Count changed while running"; - return; - } - - //First clean up any current desktops - QList<int> dnums; //keep track of which screens are already managed - QList<QRect> geoms; - for(int i=0; i<DESKTOPS.length(); i++){ - if ( DESKTOPS[i]->Screen() < 0 || DESKTOPS[i]->Screen() >= sC || geoms.contains(DW->screenGeometry(DESKTOPS[i]->Screen())) ) { - //qDebug() << " - Close desktop:" << i; - qDebug() << " - Close desktop on screen:" << DESKTOPS[i]->Screen(); - DESKTOPS[i]->prepareToClose(); - DESKTOPS.takeAt(i)->deleteLater(); - i--; - } else { - //qDebug() << " - Show desktop:" << i; - qDebug() << " - Show desktop on screen:" << DESKTOPS[i]->Screen(); - DESKTOPS[i]->UpdateGeometry(); - DESKTOPS[i]->show(); - dnums << DESKTOPS[i]->Screen(); - geoms << DW->screenGeometry(DESKTOPS[i]->Screen()); - } - } - - //Now add any new desktops - for(int i=0; i<sC; i++){ - if(!dnums.contains(i) && !geoms.contains(DW->screenGeometry(i)) ){ - //Start the desktop on this screen - qDebug() << " - Start desktop on screen:" << i; - DESKTOPS << new LDesktop(i); - geoms << DW->screenGeometry(i); - } - } - - //Make sure fluxbox also gets prompted to re-load screen config if the number of screens changes in the middle of a session - if(numchange && !firstrun) { - qDebug() << "Update WM"; - refreshWindowManager(); - } - - //Make sure all the background windows are registered on the system as virtual roots - QTimer::singleShot(100,this, SLOT(registerDesktopWindows())); -} - -void LSession::registerDesktopWindows(){ - QList<WId> wins; - for(int i=0; i<DESKTOPS.length(); i++){ - wins << DESKTOPS[i]->backgroundID(); - } - XCB->RegisterVirtualRoots(wins); -} - -void LSession::adjustWindowGeom(WId win, bool maximize){ - //return; //temporary disable - if(DEBUG){ qDebug() << "AdjustWindowGeometry():" << win << maximize << XCB->WindowClass(win); } - if(XCB->WindowIsFullscreen(win) >=0 ){ return; } //don't touch it - //Quick hack for making sure that new windows are not located underneath any panels - // Get the window location - QRect geom = XCB->WindowGeometry(win, false); - //Get the frame size - QList<int> frame = XCB->WindowFrameGeometry(win); //[top,bottom,left,right] sizes of the frame - //Calculate the full geometry (window + frame) - QRect fgeom = QRect(geom.x()-frame[2], geom.y()-frame[0], geom.width()+frame[2]+frame[3], geom.height()+frame[0]+frame[1]); - if(DEBUG){ - qDebug() << "Check Window Geometry:" << XCB->WindowClass(win) << !geom.isNull() << geom << fgeom; - } - if(geom.isNull()){ return; } //Could not get geometry for some reason - //Get the available geometry for the screen the window is on - QRect desk; - for(int i=0; i<DESKTOPS.length(); i++){ - if( this->desktop()->screenGeometry(DESKTOPS[i]->Screen()).contains(geom.center()) ){ - //Window is on this screen - if(DEBUG){ qDebug() << " - On Screen:" << DESKTOPS[i]->Screen(); } - desk = DESKTOPS[i]->availableScreenGeom(); - if(DEBUG){ qDebug() << " - Screen Geom:" << desk; } - break; - } - } - if(desk.isNull()){ return; } //Unable to determine screen - //Adjust the window location if necessary - if(maximize){ - if(DEBUG){ qDebug() << " - Maximizing New Window:" << desk.width() << desk.height(); } - geom = desk; //Use the full screen - XCB->MoveResizeWindow(win, geom); - XCB->MaximizeWindow(win, true); //directly set the appropriate "maximized" flags (bypassing WM) - - }else if(!desk.contains(fgeom) ){ - //Adjust origin point for left/top margins - if(fgeom.y() < desk.y()){ geom.moveTop(desk.y()+frame[0]); fgeom.moveTop(desk.y()); } //move down to the edge (top panel) - if(fgeom.x() < desk.x()){ geom.moveLeft(desk.x()+frame[2]); fgeom.moveLeft(desk.x()); } //move right to the edge (left panel) - //Adjust size for bottom margins (within reason, since window titles are on top normally) - // if(geom.right() > desk.right() && (geom.width() > 100)){ geom.setRight(desk.right()); } - if(fgeom.bottom() > desk.bottom() && geom.height() > 10){ - if(DEBUG){ qDebug() << "Adjust Y:" << fgeom << geom << desk; } - int diff = fgeom.bottom()-desk.bottom(); //amount of overlap - if(DEBUG){ qDebug() << "Y-Diff:" << diff; } - if(diff < 0){ diff = -diff; } //need a positive value - if( (fgeom.height()+ diff)< desk.height()){ - //just move the window - there is room for it above - geom.setBottom(desk.bottom()-frame[1]); - fgeom.setBottom(desk.bottom()); - }else if(geom.height() > diff){ //window bigger than the difference - //Need to resize the window - keeping the origin point the same - geom.setHeight( geom.height()-diff-1 ); //shrink it by the difference (need an extra pixel somewhere) - fgeom.setHeight( fgeom.height()-diff ); - } - } - //Now move/resize the window - if(DEBUG){ - qDebug() << " - New Geom:" << geom << fgeom; - } - XCB->WM_Request_MoveResize_Window(win, geom); - } - -} - -void LSession::SessionEnding(){ - stopSystemTray(); //just in case it was not stopped properly earlier -} - -//=============== -// SYSTEM ACCESS -//=============== -void LSession::LaunchApplication(QString cmd){ - LSession::setOverrideCursor(QCursor(Qt::BusyCursor)); - QProcess::startDetached(cmd); -} - -QFileInfoList LSession::DesktopFiles(){ - return desktopFiles; -} - -QRect LSession::screenGeom(int num){ - if(num < 0 || num >= this->desktop()->screenCount() ){ return QRect(); } - QRect geom = this->desktop()->screenGeometry(num); - return geom; -} - -AppMenu* LSession::applicationMenu(){ - return appmenu; -} - -SettingsMenu* LSession::settingsMenu(){ - return settingsmenu; -} - -QSettings* LSession::sessionSettings(){ - return sessionsettings; -} - -QSettings* LSession::DesktopPluginSettings(){ - return DPlugSettings; -} - -WId LSession::activeWindow(){ - //Check the last active window pointer first - WId active = XCB->ActiveWindow(); - //qDebug() << "Check Active Window:" << active << lastActiveWin; - if(RunningApps.contains(active)){ lastActiveWin = active; } - else if(RunningApps.contains(lastActiveWin) && XCB->WindowState(lastActiveWin) >= LXCB::VISIBLE){} //no change needed - else if(RunningApps.contains(lastActiveWin) && RunningApps.length()>1){ - int start = RunningApps.indexOf(lastActiveWin); - if(start<1){ lastActiveWin = RunningApps.length()-1; } //wrap around to the last item - else{ lastActiveWin = RunningApps[start-1]; } - }else{ - //Need to change the last active window - find the first one which is visible - lastActiveWin = 0; //fallback value - nothing active - for(int i=0; i<RunningApps.length(); i++){ - if(XCB->WindowState(RunningApps[i]) >= LXCB::VISIBLE){ - lastActiveWin = RunningApps[i]; - break; - } - } - //qDebug() << " -- New Last Active Window:" << lastActiveWin; - } - return lastActiveWin; -} - -//Temporarily change the session locale (nothing saved between sessions) -void LSession::switchLocale(QString localeCode){ - currTranslator = LUtils::LoadTranslation(this, "lumina-desktop", localeCode, currTranslator); - if(currTranslator!=0 || localeCode=="en_US"){ - LUtils::setLocaleEnv(localeCode); //will set everything to this locale (no custom settings) - } - emit LocaleChanged(); -} - -void LSession::systemWindow(){ - if(sysWindow==0){ sysWindow = new SystemWindow(); } - else{ sysWindow->updateWindow(); } - sysWindow->show(); - //LSession::processEvents(); -} - -//Play System Audio -void LSession::playAudioFile(QString filepath){ - if( !QFile::exists(filepath) ){ return; } - //Setup the audio output systems for the desktop - if(DEBUG){ qDebug() << "Play Audio File"; } - if(mediaObj==0){ qDebug() << " - Initialize media player"; mediaObj = new QMediaPlayer(); } - if(mediaObj !=0 ){ - if(DEBUG){ qDebug() << " - starting playback:" << filepath; } - mediaObj->setVolume(100); - mediaObj->setMedia(QUrl::fromLocalFile(filepath)); - mediaObj->play(); - LSession::processEvents(); - } - if(DEBUG){ qDebug() << " - Done with Audio File"; } -} -// ======================= -// XCB EVENT FILTER FUNCTIONS -// ======================= -void LSession::RootSizeChange(){ - qDebug() << "Got Root Size Change"; - if(DESKTOPS.isEmpty()){ return; } //Initial setup not run yet - screenTimer->start(); -} - -void LSession::WindowPropertyEvent(){ - if(DEBUG){ qDebug() << "Window Property Event"; } - QList<WId> newapps = XCB->WindowList(); - if(RunningApps.length() < newapps.length()){ - //New Window found - //qDebug() << "New window found"; - LSession::restoreOverrideCursor(); //restore the mouse cursor back to normal (new window opened?) - //Perform sanity checks on any new window geometries - for(int i=0; i<newapps.length() && !TrayStopping; i++){ - if(!RunningApps.contains(newapps[i])){ - checkWin << newapps[i]; - XCB->SelectInput(newapps[i]); //make sure we get property/focus events for this window - if(DEBUG){ qDebug() << "New Window - check geom in a moment:" << XCB->WindowClass(newapps[i]); } - QTimer::singleShot(50, this, SLOT(checkWindowGeoms()) ); - } - } - } - - //Now save the list and send out the event - RunningApps = newapps; - emit WindowListEvent(); -} - -void LSession::WindowPropertyEvent(WId win){ - //Emit the single-app signal if the window in question is one used by the task manager - if(RunningApps.contains(win)){ - if(DEBUG){ qDebug() << "Single-window property event"; } - //emit WindowListEvent(); - WindowPropertyEvent(); //Run through the entire routine for window checks - }else if(RunningTrayApps.contains(win)){ - emit TrayIconChanged(win); - } -} - -void LSession::SysTrayDockRequest(WId win){ - if(TrayStopping){ return; } - attachTrayWindow(win); //Check to see if the window is already registered -} - -void LSession::WindowClosedEvent(WId win){ - if(TrayStopping){ return; } - removeTrayWindow(win); //Check to see if the window is a tray app -} - -void LSession::WindowConfigureEvent(WId win){ - if(TrayStopping){ return; } - if(RunningTrayApps.contains(win)){ - if(DEBUG){ qDebug() << "SysTray: Configure Event"; } - emit TrayIconChanged(win); //trigger a repaint event - }else if(RunningApps.contains(win)){ - WindowPropertyEvent(); - } -} - -void LSession::WindowDamageEvent(WId win){ - if(TrayStopping){ return; } - if(RunningTrayApps.contains(win)){ - if(DEBUG){ qDebug() << "SysTray: Damage Event"; } - emit TrayIconChanged(win); //trigger a repaint event - } -} - -void LSession::WindowSelectionClearEvent(WId win){ - if(win==SystemTrayID && !TrayStopping){ - qDebug() << "Stopping system tray"; - stopSystemTray(true); //make sure to detach all windows - } -} - - -//====================== -// SYSTEM TRAY FUNCTIONS -//====================== -bool LSession::registerVisualTray(WId visualTray){ - //Only one visual tray can be registered at a time - // (limitation of how tray apps are embedded) - if(TrayStopping){ return false; } - else if(VisualTrayID==0){ VisualTrayID = visualTray; return true; } - else if(VisualTrayID==visualTray){ return true; } - else{ return false; } -} - -void LSession::unregisterVisualTray(WId visualTray){ - if(VisualTrayID==visualTray){ - qDebug() << "Unregistered Visual Tray"; - VisualTrayID=0; - if(!TrayStopping){ emit VisualTrayAvailable(); } - } -} - -QList<WId> LSession::currentTrayApps(WId visualTray){ - if(visualTray==VisualTrayID){ - //Check the validity of all the current tray apps (make sure nothing closed erratically) - for(int i=0; i<RunningTrayApps.length(); i++){ - if(XCB->WindowClass(RunningTrayApps[i]).isEmpty()){ RunningTrayApps.removeAt(i); i--; } - } - return RunningTrayApps; - }else if( registerVisualTray(visualTray) ){ - return RunningTrayApps; - }else{ - return QList<WId>(); - } -} - -void LSession::startSystemTray(){ - if(SystemTrayID!=0){ return; } - RunningTrayApps.clear(); //nothing running yet - SystemTrayID = XCB->startSystemTray(0); - TrayStopping = false; - if(SystemTrayID!=0){ - XCB->SelectInput(SystemTrayID); //make sure TrayID events get forwarded here - TrayDmgEvent = XCB->GenerateDamageID(SystemTrayID); - evFilter->setTrayDamageFlag(TrayDmgEvent); - qDebug() << "System Tray Started Successfully"; - if(DEBUG){ qDebug() << " - System Tray Flags:" << TrayDmgEvent << TrayDmgError; } - } -} - -void LSession::stopSystemTray(bool detachall){ - if(TrayStopping){ return; } //already run - qDebug() << "Stopping system tray..."; - TrayStopping = true; //make sure the internal list does not modified during this - //Close all the running Tray Apps - QList<WId> tmpApps = RunningTrayApps; - RunningTrayApps.clear(); //clear this ahead of time so tray's do not attempt to re-access the apps - if(!detachall){ - for(int i=0; i<tmpApps.length(); i++){ - qDebug() << " - Stopping tray app:" << XCB->WindowClass(tmpApps[i]); - //Tray apps are special and closing the window does not close the app - XCB->KillClient(tmpApps[i]); - LSession::processEvents(); - } - } - //Now close down the tray backend - XCB->closeSystemTray(SystemTrayID); - SystemTrayID = 0; - TrayDmgEvent = 0; - TrayDmgError = 0; - evFilter->setTrayDamageFlag(0); //turn off tray event handling - emit TrayListChanged(); - LSession::processEvents(); -} - -void LSession::attachTrayWindow(WId win){ - //static int appnum = 0; - if(TrayStopping){ return; } - if(RunningTrayApps.contains(win)){ return; } //already managed - qDebug() << "Session Tray: Window Added"; - RunningTrayApps << win; - LSession::restoreOverrideCursor(); - if(DEBUG){ qDebug() << "Tray List Changed"; } - emit TrayListChanged(); -} - -void LSession::removeTrayWindow(WId win){ - if(SystemTrayID==0){ return; } - for(int i=0; i<RunningTrayApps.length(); i++){ - if(win==RunningTrayApps[i]){ - qDebug() << "Session Tray: Window Removed"; - RunningTrayApps.removeAt(i); - emit TrayListChanged(); - break; - } - } -} -//========================= -// START MENU FUNCTIONS -//========================= -bool LSession::registerStartButton(QString ID){ - if(StartButtonID.isEmpty()){ StartButtonID = ID; } - return (StartButtonID==ID); -} - -void LSession::unregisterStartButton(QString ID){ - if(StartButtonID == ID){ - StartButtonID.clear(); - emit StartButtonAvailable(); - } -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/LSession.h b/src-qt5/core/lumina-desktop-unified/src-DE/LSession.h deleted file mode 100644 index bd93289a..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/LSession.h +++ /dev/null @@ -1,193 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2012-2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_DESKTOP_SESSION_H -#define _LUMINA_DESKTOP_SESSION_H - -#include <QApplication> -#include <QDebug> -#include <QString> -#include <QX11Info> -#include <QEvent> -#include <QTranslator> -#include <QSettings> -#include <QProxyStyle> -#include <QDesktopWidget> -#include <QList> -#include <QThread> -#include <QMediaPlayer> -#include <QThread> -#include <QUrl> - -#include "Globals.h" -#include "AppMenu.h" -#include "SettingsMenu.h" -#include "SystemWindow.h" -#include "LDesktop.h" -//#include "WMProcess.h" -//#include "BootSplash.h" - -#include <LuminaX11.h> -#include <LuminaSingleApplication.h> - -//SYSTEM TRAY STANDARD DEFINITIONS -#define SYSTEM_TRAY_REQUEST_DOCK 0 -#define SYSTEM_TRAY_BEGIN_MESSAGE 1 -#define SYSTEM_TRAY_CANCEL_MESSAGE 2 - -/*class MenuProxyStyle : public QProxyStyle{ -public: - int pixelMetric(PixelMetric metric, const QStyleOption *option=0, const QWidget *widget=0) const{ - if(metric==PM_SmallIconSize){ return 22; } //override QMenu icon size (make it larger) - else{ return QProxyStyle::pixelMetric(metric, option, widget); } //use the current style for everything else - } -};*/ - -class LSession : public LSingleApplication{ - Q_OBJECT -public: - LSession(int &argc, char **argv); - ~LSession(); - //Functions to be called during startup - void setupSession(); - - //Public System Tray Functions - QList<WId> currentTrayApps(WId visualTray); - bool registerVisualTray(WId); - void unregisterVisualTray(WId); - - //Public start menu buttons - bool registerStartButton(QString ID); - void unregisterStartButton(QString ID); - - //Special functions for XCB event filter parsing only - // (DO NOT USE MANUALLY) - void RootSizeChange(); - void WindowPropertyEvent(); - void WindowPropertyEvent(WId); - void SysTrayDockRequest(WId); - void WindowClosedEvent(WId); - void WindowConfigureEvent(WId); - void WindowDamageEvent(WId); - void WindowSelectionClearEvent(WId); - - //System Access - //Return a pointer to the current session - static LSession* handle(){ - return static_cast<LSession*>(LSession::instance()); - } - - static void LaunchApplication(QString cmd); - QFileInfoList DesktopFiles(); - - QRect screenGeom(int num); - - AppMenu* applicationMenu(); - void systemWindow(); - SettingsMenu* settingsMenu(); - LXCB *XCB; //class for XCB usage - - QSettings* sessionSettings(); - QSettings* DesktopPluginSettings(); - - //Keep track of which non-desktop window should be treated as active - WId activeWindow(); //This will return the last active window if a desktop element is currently active - - //Temporarily change the session locale (nothing saved between sessions) - void switchLocale(QString localeCode); - - //Play System Audio - void playAudioFile(QString filepath); - //Window Adjustment Routine (due to Fluxbox not respecting _NET_WM_STRUT) - void adjustWindowGeom(WId win, bool maximize = false); - -private: - //WMProcess *WM; - QList<LDesktop*> DESKTOPS; - QFileSystemWatcher *watcher; - QTimer *screenTimer; - - //Internal variable for global usage - AppMenu *appmenu; - SettingsMenu *settingsmenu; - SystemWindow *sysWindow; - QTranslator *currTranslator; - QMediaPlayer *mediaObj; - QSettings *sessionsettings, *DPlugSettings; - bool cleansession; - //QList<QRect> savedScreens; - - //System Tray Variables - WId SystemTrayID, VisualTrayID; - int TrayDmgEvent, TrayDmgError; - QList<WId> RunningTrayApps; - bool TrayStopping; - //Start Button Variables - QString StartButtonID; - - //Task Manager Variables - WId lastActiveWin; - QList<WId> RunningApps; - QList<WId> checkWin; - QFileInfoList desktopFiles; - - void CleanupSession(); - - int VersionStringToNumber(QString version); - -public slots: - void StartLogout(); - void StartShutdown(bool skipupdates = false); - void StartReboot(bool skipupdates = false); - - void reloadIconTheme(); - -private slots: - void NewCommunication(QStringList); - void launchStartupApps(); //used during initialization - void watcherChange(QString); - void screensChanged(); - void screenResized(int); - void checkWindowGeoms(); - - //System Tray Functions - void startSystemTray(); - void stopSystemTray(bool detachall = false); - void attachTrayWindow(WId); - void removeTrayWindow(WId); - - //Internal simplification functions - void checkUserFiles(); - void refreshWindowManager(); - void updateDesktops(); - void registerDesktopWindows(); - - - void SessionEnding(); - -signals: - //System Tray Signals - void VisualTrayAvailable(); //new Visual Tray Plugin can be registered - void TrayListChanged(); //Item added/removed from the list - void TrayIconChanged(WId); //WinID of Tray App - //Start Button signals - void StartButtonAvailable(); - void StartButtonActivated(); - //Task Manager Signals - void WindowListEvent(WId); - void WindowListEvent(); - //General Signals - void LocaleChanged(); - void IconThemeChanged(); - void DesktopConfigChanged(); - void SessionConfigChanged(); - void FavoritesChanged(); - void DesktopFilesChanged(); - void WorkspaceChanged(); - -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/LWinInfo.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/LWinInfo.cpp deleted file mode 100644 index 6a6cea0b..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/LWinInfo.cpp +++ /dev/null @@ -1,48 +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 -//=========================================== -#include "LWinInfo.h" - -#include <LuminaX11.h> - -#include "LSession.h" - -//Information Retrieval - // Don't cache these results because they can change regularly -QString LWinInfo::text(){ - if(window==0){ return ""; } - QString nm = LSession::handle()->XCB->WindowVisibleIconName(window); - if(nm.simplified().isEmpty()){ nm = LSession::handle()->XCB->WindowIconName(window); } - if(nm.simplified().isEmpty()){ nm = LSession::handle()->XCB->WindowVisibleName(window); } - if(nm.simplified().isEmpty()){ nm = LSession::handle()->XCB->WindowName(window); } - if(nm.simplified().isEmpty()){ nm = LSession::handle()->XCB->OldWindowIconName(window); } - if(nm.simplified().isEmpty()){ nm = LSession::handle()->XCB->OldWindowName(window); } - //Make sure that the text is a reasonable size (40 char limit) - //if(nm.length()>40){ nm = nm.left(40)+"..."; } - return nm; -} - -QIcon LWinInfo::icon(bool &noicon){ - if(window==0){ noicon = true; return QIcon();} - noicon = false; - QIcon ico = LSession::handle()->XCB->WindowIcon(window); - //Check for a null icon, and supply one if necessary - if(ico.isNull()){ ico = LXDG::findIcon( this->Class().toLower(),""); } - if(ico.isNull()){ico = LXDG::findIcon("preferences-system-windows",""); noicon=true;} - return ico; -} - -QString LWinInfo::Class(){ - return LSession::handle()->XCB->WindowClass(window); -} - -LXCB::WINDOWVISIBILITY LWinInfo::status(bool update){ - if(window==0){ return LXCB::IGNORE; } - if(update || cstate == LXCB::IGNORE){ - cstate = LSession::handle()->XCB->WindowState(window); - } - return cstate; -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/LWinInfo.h b/src-qt5/core/lumina-desktop-unified/src-DE/LWinInfo.h deleted file mode 100644 index 3d2ea65a..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/LWinInfo.h +++ /dev/null @@ -1,50 +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 -//=========================================== -#ifndef _LUMINA_DESKTOP_WINDOW_INFO_H -#define _LUMINA_DESKTOP_WINDOW_INFO_H - -// Qt includes -#include <QString> -#include <QPixmap> -#include <QIcon> -#include <QPainter> - -// libLumina includes -#include <LuminaX11.h> -#include <LuminaXDG.h> - -// Local includes -//#include "Globals.h" //For the STATES enumeration definition -//#include "LSession.h" - - -class LWinInfo{ -private: - WId window; - LXCB::WINDOWVISIBILITY cstate; //current window state - -public: - LWinInfo(WId id = 0){ - window = id; - cstate = LXCB::IGNORE; //make sure this gets updates with the first "status" call - } - ~LWinInfo(){}; - - //The current window ID - WId windowID(){ - return window; - } - - //Information Retrieval - // Don't cache these results because they can change regularly - QString text(); - QIcon icon(bool &noicon); - QString Class(); - LXCB::WINDOWVISIBILITY status(bool update = false); -}; - -#endif
\ No newline at end of file diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/LXcbEventFilter.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/LXcbEventFilter.cpp deleted file mode 100644 index ca7fb38d..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/LXcbEventFilter.cpp +++ /dev/null @@ -1,118 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2012, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "LXcbEventFilter.h" - -//For all the XCB interactions and atoms -// is accessed via -// session->XCB->EWMH.(atom name) -// session->XCB->(do something) -#include <LuminaX11.h> -#include <QDebug> - -XCBEventFilter::XCBEventFilter(LSession *sessionhandle) : QAbstractNativeEventFilter(){ - session = sessionhandle; //save this for interaction with the session later - TrayDmgFlag = 0; - stopping = false; - session->XCB->SelectInput(QX11Info::appRootWindow()); //make sure we get root window events - InitAtoms(); -} - -void XCBEventFilter::setTrayDamageFlag(int flag){ - //Special flag for system tray damage events - TrayDmgFlag = flag + XCB_DAMAGE_NOTIFY; //save the whole flag (no calculations later) -} - -//This function format taken directly from the Qt5.3 documentation -bool XCBEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *){ - if(stopping){ return false; } //don't do any parsing - //qDebug() << "New Event"; - if(eventType=="xcb_generic_event_t"){ - //qDebug() << " - XCB event"; - //Convert to known event type (for X11 systems) - xcb_generic_event_t *ev = static_cast<xcb_generic_event_t *>(message); - //Now parse the event and emit signals as necessary - switch( ev->response_type & ~0x80){ -//============================== - case XCB_PROPERTY_NOTIFY: - //qDebug() << "Property Notify Event:"; - //qDebug() << " - Root Window:" << QX11Info::appRootWindow(); - //qDebug() << " - Given Window:" << ((xcb_property_notify_event_t*)ev)->window; - //System-specific proprty change - if( ((xcb_property_notify_event_t*)ev)->window == QX11Info::appRootWindow() \ - && ( ( ((xcb_property_notify_event_t*)ev)->atom == session->XCB->EWMH._NET_DESKTOP_GEOMETRY) \ - || (((xcb_property_notify_event_t*)ev)->atom == session->XCB->EWMH._NET_WORKAREA) )){ - session->RootSizeChange(); - }else if( ((xcb_property_notify_event_t*)ev)->window == QX11Info::appRootWindow() \ - && ( ( ((xcb_property_notify_event_t*)ev)->atom == session->XCB->EWMH._NET_CURRENT_DESKTOP) )){ - //qDebug() << "Got Workspace Change"; - session->emit WorkspaceChanged(); - }else if( SysNotifyAtoms.contains( ((xcb_property_notify_event_t*)ev)->atom ) ){ - //Update the status/list of all running windows - session->WindowPropertyEvent(); - - //window-specific property change - }else if( WinNotifyAtoms.contains( ((xcb_property_notify_event_t*)ev)->atom ) ){ - //Ping only that window - //session->WindowPropertyEvent( ((xcb_property_notify_event_t*)ev)->window ); - session->WindowPropertyEvent(); - } - break; -//============================== - case XCB_CLIENT_MESSAGE: - //qDebug() << "Client Message Event"; - //qDebug() << " - Root Window:" << QX11Info::appRootWindow(); - //qDebug() << " - Given Window:" << ((xcb_client_message_event_t*)ev)->window; - if( TrayDmgFlag!=0 && ((xcb_client_message_event_t*)ev)->type == _NET_SYSTEM_TRAY_OPCODE && ((xcb_client_message_event_t*)ev)->format == 32){ - //data32[0] is timestamp, [1] is opcode, [2] is window handle - if(SYSTEM_TRAY_REQUEST_DOCK == ((xcb_client_message_event_t*)ev)->data.data32[1]){ - session->SysTrayDockRequest( ((xcb_client_message_event_t*)ev)->data.data32[2] ); - } - //Ignore the System Tray messages at the moment (let the WM handle it) - - //window-specific property changes - /*}else if( ((xcb_client_message_event_t*)ev)->type == session->XCB->EWMH._NET_WM_STATE ){ - if( session->XCB->WindowIsMaximized( ((xcb_client_message_event_t*)ev)->window ) ){ - //Quick fix for maximized windows (since Fluxbox is not doing the STRUT detection properly) - session->adjustWindowGeom( ((xcb_client_message_event_t*)ev)->window ); - } - session->WindowPropertyEvent( ((xcb_client_message_event_t*)ev)->window );*/ - }else if( WinNotifyAtoms.contains( ((xcb_client_message_event_t*)ev)->type ) ){ - //Ping only that window - //session->WindowPropertyEvent( ((xcb_client_message_event_t*)ev)->window ); - session->WindowPropertyEvent(); - } - break; -//============================== - case XCB_DESTROY_NOTIFY: - //qDebug() << "Window Closed Event"; - session->WindowClosedEvent( ( (xcb_destroy_notify_event_t*)ev )->window ); - break; -//============================== - case XCB_CONFIGURE_NOTIFY: - //qDebug() << "Configure Notify Event"; - session->WindowConfigureEvent( ((xcb_configure_notify_event_t*)ev)->window ); - break; -//============================== - case XCB_SELECTION_CLEAR: - //qDebug() << "Selection Clear Event"; - session->WindowSelectionClearEvent( ((xcb_selection_clear_event_t*)ev)->owner ); - break; -//============================== - default: - if(TrayDmgFlag!=0){ - //if( (ev->response_type & ~0x80)==TrayDmgFlag){ - session->WindowDamageEvent( ((xcb_damage_notify_event_t*)ev)->drawable ); - //} - }/*else{ - qDebug() << "Default Event:" << (ev->response_type & ~0x80); - }*/ -//============================== - } - } - //qDebug() << " - finished event"; - return false; //make sure the handling keeps going (transparent watching of events) -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/LXcbEventFilter.h b/src-qt5/core/lumina-desktop-unified/src-DE/LXcbEventFilter.h deleted file mode 100644 index c56471c9..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/LXcbEventFilter.h +++ /dev/null @@ -1,104 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2012, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This class provides the XCB ->Xlib conversion necessary for Qt5 usage -//=========================================== -#ifndef _LUMINA_DESKTOP_XCB_FILTER_H -#define _LUMINA_DESKTOP_XCB_FILTER_H - -#include <QAbstractNativeEventFilter> -#include <QList> -#include <QStringList> -#include <QX11Info> - -#include <xcb/xcb.h> -#include <xcb/xproto.h> -#include <xcb/damage.h> -#include <xcb/xcb_atom.h> -#include "LSession.h" - -/* -List of XCB response types (since almost impossible to find good docs on XCB) -switch (xcb_generic_event_t*->response_type & ~0x80) -case values: -XCB_KEY_[PRESS | RELEASE] -XCB_BUTTON_[PRESS | RELEASE] -XCB_MOTION_NOTIFY -XCB_ENTER_NOTIFY -XCB_LEAVE_NOTIFY -XCB_FOCUS_[IN | OUT] -XCB_KEYMAP_NOTIFY -XCB_EXPOSE -XCB_GRAPHICS_EXPOSURE -XCB_VISIBILITY_NOTIFY -XCB_CREATE_NOTIFY -XCB_DESTROY_NOTIFY -XCB_UNMAP_NOTIFY -XCB_MAP_[NOTIFY | REQUEST] -XCB_REPARENT_NOTIFY -XCB_CONFIGURE_[NOTIFY | REQUEST] -XCB_GRAVITY_NOTIFY -XCB_RESIZE_REQUEST -XCB_CIRCULATE_[NOTIFY | REQUEST] -XCB_PROPERTY_NOTIFY -XCB_SELECTION_[CLEAR | REQUEST | NOTIFY] -XCB_COLORMAP_NOTIFY -XCB_CLIENT_MESSAGE - -*/ - -//SYSTEM TRAY STANDARD DEFINITIONS -#define SYSTEM_TRAY_REQUEST_DOCK 0 -#define SYSTEM_TRAY_BEGIN_MESSAGE 1 -#define SYSTEM_TRAY_CANCEL_MESSAGE 2 - -class XCBEventFilter : public QAbstractNativeEventFilter{ -private: - LSession *session; - xcb_atom_t _NET_SYSTEM_TRAY_OPCODE; - QList<xcb_atom_t> WinNotifyAtoms, SysNotifyAtoms; - int TrayDmgFlag; //internal damage event offset value for the system tray - bool stopping; - - void InitAtoms(){ - //Initialize any special atoms that we need to save/use regularly - //NOTE: All the EWMH atoms are already saved in session->XCB->EWMH - WinNotifyAtoms.clear(); - WinNotifyAtoms << session->XCB->EWMH._NET_WM_NAME \ - << session->XCB->EWMH._NET_WM_VISIBLE_NAME \ - << session->XCB->EWMH._NET_WM_ICON_NAME \ - << session->XCB->EWMH._NET_WM_VISIBLE_ICON_NAME \ - << session->XCB->EWMH._NET_WM_ICON \ - << session->XCB->EWMH._NET_WM_ICON_GEOMETRY; - - SysNotifyAtoms.clear(); - SysNotifyAtoms << session->XCB->EWMH._NET_CLIENT_LIST \ - << session->XCB->EWMH._NET_CLIENT_LIST_STACKING \ - << session->XCB->EWMH._NET_CURRENT_DESKTOP \ - << session->XCB->EWMH._NET_WM_STATE \ - << session->XCB->EWMH._NET_ACTIVE_WINDOW \ - << session->XCB->EWMH._NET_WM_ICON \ - << session->XCB->EWMH._NET_WM_ICON_GEOMETRY; - //_NET_SYSTEM_TRAY_OPCODE - xcb_intern_atom_cookie_t cookie = xcb_intern_atom(QX11Info::connection(), 0, 23,"_NET_SYSTEM_TRAY_OPCODE"); - xcb_intern_atom_reply_t *r = xcb_intern_atom_reply(QX11Info::connection(), cookie, NULL); - if(r){ - _NET_SYSTEM_TRAY_OPCODE = r->atom; - free(r); - } - } - -public: - XCBEventFilter(LSession *sessionhandle); - void setTrayDamageFlag(int flag); - void StopEventHandling(){ stopping = true; } - - //This function format taken directly from the Qt5.3 documentation - virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *) Q_DECL_OVERRIDE; - -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/SettingsMenu.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/SettingsMenu.cpp deleted file mode 100644 index 58208931..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/SettingsMenu.cpp +++ /dev/null @@ -1,67 +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 -//=========================================== -#include "SettingsMenu.h" -#include "LSession.h" - -#include <LuminaOS.h> - -SettingsMenu::SettingsMenu() : QMenu(){ - this->setObjectName("SettingsMenu"); - connect(this, SIGNAL(triggered(QAction*)), this, SLOT(runApp(QAction*)) ); - connect(QApplication::instance(), SIGNAL(LocaleChanged()), this, SLOT(UpdateMenu()) ); - connect(QApplication::instance(), SIGNAL(IconThemeChanged()), this, SLOT(UpdateMenu()) ); - QTimer::singleShot(100, this, SLOT(UpdateMenu()) ); -} - -SettingsMenu::~SettingsMenu(){ - -} - -void SettingsMenu::UpdateMenu(){ - //Change the title/icon to account for locale/icon changes - this->setTitle( tr("Preferences") ); - this->setIcon( LXDG::findIcon("configure","") ); - this->clear(); - //Now setup the possible configuration options - QAction *act = new QAction(LXDG::findIcon("preferences-desktop-screensaver",""), tr("Screensaver"), this); - act->setWhatsThis("xscreensaver-demo"); - this->addAction(act); - act = new QAction( LXDG::findIcon("preferences-desktop-wallpaper",""), tr("Wallpaper"), this); - act->setWhatsThis("lumina-config --page wallpaper"); - this->addAction(act); - act = new QAction( LXDG::findIcon("preferences-other",""), tr("Display"), this); - act->setWhatsThis("lumina-xconfig"); - this->addAction(act); - act = new QAction( LXDG::findIcon("preferences-desktop",""), tr("All Desktop Settings"), this); - act->setWhatsThis("lumina-config"); - this->addAction(act); - this->addSeparator(); - /*QString qtconfig = LOS::QtConfigShortcut(); - if(QFile::exists(qtconfig) && !qtconfig.isEmpty()){ - act = new QAction( LXDG::findIcon("preferences-desktop-theme",""), tr("Window Theme"), this); - act->setWhatsThis(qtconfig); - this->addAction(act); - }*/ - QString CONTROLPANEL = LOS::ControlPanelShortcut(); - if(QFile::exists(CONTROLPANEL) && !CONTROLPANEL.isEmpty()){ - //Now load the info - XDGDesktop cpan(CONTROLPANEL); - if(cpan.isValid()){ - act = new QAction( LXDG::findIcon(cpan.icon,""), tr("Control Panel"), this); - act->setWhatsThis("lumina-open \""+CONTROLPANEL+"\""); - this->addAction(act); - } - } - act = new QAction( LXDG::findIcon("lumina",""), tr("About Lumina"), this); - act->setWhatsThis("lumina-info"); - this->addAction(act); -} - - -void SettingsMenu::runApp(QAction* act){ - LSession::LaunchApplication(act->whatsThis()); -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/SettingsMenu.h b/src-qt5/core/lumina-desktop-unified/src-DE/SettingsMenu.h deleted file mode 100644 index eeabab85..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/SettingsMenu.h +++ /dev/null @@ -1,28 +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 -//=========================================== -#ifndef _LUMINA_DESKTOP_SETTINGS_MENU_H -#define _LUMINA_DESKTOP_SETTINGS_MENU_H - -#include <QMenu> -#include <QProcess> -#include <QAction> - -#include <LuminaXDG.h> - -class SettingsMenu : public QMenu{ - Q_OBJECT -public: - SettingsMenu(); - ~SettingsMenu(); - -private slots: - void UpdateMenu(); - void runApp(QAction* act); - -}; - -#endif
\ No newline at end of file diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/SystemWindow.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/SystemWindow.cpp deleted file mode 100644 index 1c0b59a5..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/SystemWindow.cpp +++ /dev/null @@ -1,104 +0,0 @@ -#include "SystemWindow.h" -#include "ui_SystemWindow.h" - -#include "LSession.h" -#include <LuminaOS.h> -#include <QPoint> -#include <QCursor> -#include <QDebug> -#include <QProcess> -#include <QDesktopWidget> -#include <QMessageBox> - -SystemWindow::SystemWindow() : QDialog(), ui(new Ui::SystemWindow){ - ui->setupUi(this); //load the designer file - //Setup the window flags - this->setWindowFlags( Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); - //Setup the icons based on the current theme - ui->tool_logout->setIcon( LXDG::findIcon("system-log-out","") ); - ui->tool_restart->setIcon( LXDG::findIcon("system-reboot","") ); - ui->tool_shutdown->setIcon( LXDG::findIcon("system-shutdown","") ); - ui->tool_suspend->setIcon( LXDG::findIcon("system-suspend","") ); - ui->push_cancel->setIcon( LXDG::findIcon("dialog-cancel","") ); - ui->push_lock->setIcon( LXDG::findIcon("system-lock-screen","") ); - //Connect the signals/slots - connect(ui->tool_logout, SIGNAL(clicked()), this, SLOT(sysLogout()) ); - connect(ui->tool_restart, SIGNAL(clicked()), this, SLOT(sysRestart()) ); - connect(ui->tool_shutdown, SIGNAL(clicked()), this, SLOT(sysShutdown()) ); - connect(ui->tool_suspend, SIGNAL(clicked()), this, SLOT(sysSuspend()) ); - connect(ui->push_cancel, SIGNAL(clicked()), this, SLOT(sysCancel()) ); - connect(ui->push_lock, SIGNAL(clicked()), this, SLOT(sysLock()) ); - //Disable buttons if necessary - updateWindow(); - ui->tool_suspend->setVisible(LOS::systemCanSuspend()); //does not change with time - just do a single check - connect(QApplication::instance(), SIGNAL(LocaleChanged()), this, SLOT(updateWindow()) ); - connect(QApplication::instance(), SIGNAL(IconThemeChanged()), this, SLOT(updateWindow()) ); -} - -SystemWindow::~SystemWindow(){ - -} - -void SystemWindow::updateWindow(){ - //Disable the shutdown/restart buttons if necessary - ui->retranslateUi(this); - bool ok = LOS::userHasShutdownAccess(); - ui->tool_restart->setEnabled(ok); - ui->tool_shutdown->setEnabled(ok); - //Center this window on the current screen - QPoint center = QApplication::desktop()->screenGeometry(QCursor::pos()).center(); //get the center of the current screen - this->move(center.x() - this->width()/2, center.y() - this->height()/2); -} - -bool SystemWindow::promptAboutUpdates(bool &skip){ - QString pending = LOS::systemPendingUpdates(); - if(pending.isEmpty()){ skip = false; } //continue without skip - else{ - QMessageBox dlg(QMessageBox::Question, tr("Apply Updates?"), tr("You have system updates waiting to be applied! Do you wish to install them now?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, this); - dlg.setDetailedText(pending); - dlg.setDefaultButton(QMessageBox::Yes); - dlg.show(); - int ret = dlg.exec(); - if(ret == QMessageBox::Cancel){ return false; } //do not continue - else{ skip = (ret==QMessageBox::No); } - } - return true; -} - -void SystemWindow::sysLogout(){ - this->close(); - LSession::processEvents(); - QTimer::singleShot(0, LSession::handle(), SLOT(StartLogout()) ); -} - -void SystemWindow::sysRestart(){ - bool skip = false; - if(!promptAboutUpdates(skip)){ this->close(); return; } //cancelled - this->close(); - LSession::processEvents(); - LSession::handle()->StartReboot(skip); -} - -void SystemWindow::sysShutdown(){ - bool skip = false; - if(!promptAboutUpdates(skip)){ this->close(); return; } //cancelled - this->close(); - LSession::processEvents(); - LSession::handle()->StartShutdown(skip); -} - -void SystemWindow::sysSuspend(){ - this->hide(); - LSession::processEvents(); - //Make sure to lock the system first (otherwise anybody can access it again) - LUtils::runCmd("xscreensaver-command -lock"); - //Now suspend the system - LOS::systemSuspend(); -} - -void SystemWindow::sysLock(){ - this->hide(); - LSession::processEvents(); - qDebug() << "Locking the desktop..."; - QProcess::startDetached("xscreensaver-command -lock"); -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/SystemWindow.h b/src-qt5/core/lumina-desktop-unified/src-DE/SystemWindow.h deleted file mode 100644 index bbef36a3..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/SystemWindow.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef _LUMINA_DESKTOP_SYSTEM_WINDOW_H -#define _LUMINA_DESKTOP_SYSTEM_WINDOW_H - -#include <QDialog> - -#include "ui_SystemWindow.h" - - - - -namespace Ui{ - class SystemWindow; -}; - -class SystemWindow : public QDialog{ - Q_OBJECT -public: - SystemWindow(); - ~SystemWindow(); - -public slots: - void updateWindow(); - -private: - Ui::SystemWindow *ui; - - //void closeAllWindows(); - bool promptAboutUpdates(bool &skip); //main bool return: continue/cancel, skip: skip updates or not - -private slots: - void sysLogout(); - - void sysRestart(); - - void sysShutdown(); - - void sysSuspend(); - - void sysCancel(){ - this->close(); - } - - void sysLock(); -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/SystemWindow.ui b/src-qt5/core/lumina-desktop-unified/src-DE/SystemWindow.ui deleted file mode 100644 index 9e25509b..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/SystemWindow.ui +++ /dev/null @@ -1,194 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>SystemWindow</class> - <widget class="QDialog" name="SystemWindow"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>289</width> - <height>135</height> - </rect> - </property> - <property name="windowTitle"> - <string>System Options</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="leftMargin"> - <number>2</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="rightMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>2</number> - </property> - <item> - <widget class="QFrame" name="frame"> - <property name="frameShape"> - <enum>QFrame::StyledPanel</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <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>0</number> - </property> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QToolButton" name="tool_logout"> - <property name="text"> - <string>Log Out</string> - </property> - <property name="iconSize"> - <size> - <width>64</width> - <height>64</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextUnderIcon</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_restart"> - <property name="text"> - <string>Restart</string> - </property> - <property name="iconSize"> - <size> - <width>64</width> - <height>64</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextUnderIcon</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_shutdown"> - <property name="text"> - <string>Shutdown</string> - </property> - <property name="iconSize"> - <size> - <width>64</width> - <height>64</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextUnderIcon</enum> - </property> - </widget> - </item> - </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> - <item> - <widget class="Line" name="line"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QToolButton" name="push_cancel"> - <property name="text"> - <string>Cancel</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextUnderIcon</enum> - </property> - </widget> - </item> - <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="QToolButton" name="push_lock"> - <property name="text"> - <string>Lock</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextUnderIcon</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_suspend"> - <property name="text"> - <string>Suspend</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextUnderIcon</enum> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/LDPlugin.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/LDPlugin.cpp deleted file mode 100644 index 545ba430..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/LDPlugin.cpp +++ /dev/null @@ -1,63 +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 "LDPlugin.h" - -#include "../LSession.h" -#include <LuminaXDG.h> - -LDPlugin::LDPlugin(QWidget *parent, QString id) : QFrame(parent){ - PLUGID=id; - prefix = id.replace("/","_")+"/"; - //qDebug() << "ID:" << PLUGID << prefix; - settings = LSession::handle()->DesktopPluginSettings(); - //Setup the plugin system control menu - menu = new QMenu(this); - setupMenu(); - //Setup the internal timer for when to start/stop drag events - dragTimer = new QTimer(this); - dragTimer->setSingleShot(true); - dragTimer->setInterval(500); //1/2 second to show the plugin menu - connect(dragTimer, SIGNAL(timeout()), this, SLOT(showPluginMenu())); - //Use plugin-specific values for stylesheet control (applauncher, desktopview, etc...) - this->setObjectName(id.section("---",0,0).section("::",0,0)); - this->setContextMenuPolicy(Qt::CustomContextMenu); - this->setMouseTracking(false); //only catch mouse movement events if the mouse is clicked/held on the plugin - connect(QApplication::instance(), SIGNAL(LocaleChanged()), this, SLOT(LocaleChange()) ); - connect(QApplication::instance(), SIGNAL(IconThemeChanged()), this, SLOT(ThemeChange()) ); - connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showPluginMenu()) ); -} - -void LDPlugin::setupMenu(){ - menu->clear(); - //SPECIAL CONTEXT MENU OPTIONS FOR PARTICULAR PLUGIN TYPES - if(PLUGID.startsWith("applauncher::")){ - menu->addAction( LXDG::findIcon("quickopen",""), tr("Launch Item"), this, SIGNAL(PluginActivated()) ); - menu->addSeparator(); - } - //General Options - menu->addAction( LXDG::findIcon("transform-move",""), tr("Start Moving Item"), this, SLOT(slotStartMove()) ); - menu->addAction( LXDG::findIcon("transform-scale",""), tr("Start Resizing Item"), this, SLOT(slotStartResize()) ); - menu->addSeparator(); - menu->addAction( LXDG::findIcon("zoom-in",""), tr("Increase Item Sizes"), this, SIGNAL(IncreaseIconSize()) ); - menu->addAction( LXDG::findIcon("zoom-out",""), tr("Decrease Item Sizes"), this, SIGNAL(DecreaseIconSize()) ); - menu->addSeparator(); - menu->addAction( LXDG::findIcon("edit-delete",""), tr("Remove Item"), this, SLOT(slotRemovePlugin()) ); -} - -/*void LDPlugin::setInitialSize(int width, int height){ - //Note: Only run this in the plugin initization routine: - // if the plugin is completely new (first time used), it will be this size - if(settings->allKeys().filter(prefix+"location").isEmpty()){ - //Brand new plugin: set initial size - //qDebug() << "Setting Initial Size:" << PLUGID << width << height; - settings->setValue(prefix+"location/width",width); - settings->setValue(prefix+"location/height",height); - settings->sync(); - } - //Now make sure the plugin is the saved size right away - this->resize( settings->value(prefix+"location/width").toInt(), settings->value(prefix+"location/height").toInt()); -}*/ diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/LDPlugin.h b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/LDPlugin.h deleted file mode 100644 index 820880ed..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/LDPlugin.h +++ /dev/null @@ -1,156 +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 -//=========================================== -// This class is the generic container layout for all desktop plugins -// Simply subclass this when creating a new plugin to enable correct -// visibility and usage within the desktop window -//=========================================== -// WARNING: Do *not* setup a custom context menu for the entire plugins area! -// This can prevent access to the general desktop context menu if -// the plugin was maximized to fill the desktop area! -//=========================================== -#ifndef _LUMINA_DESKTOP_DESKTOP_PLUGIN_H -#define _LUMINA_DESKTOP_DESKTOP_PLUGIN_H - -#include <QObject> -#include <QFrame> -#include <QWidget> -#include <QString> -#include <QDebug> -#include <QSettings> -#include <QMoveEvent> -#include <QResizeEvent> -#include <QMouseEvent> -#include <QTimer> -#include <QMenu> - -class LDPlugin : public QFrame{ - Q_OBJECT - -private: - QString PLUGID, prefix; - QSettings *settings; - QMenu *menu; - QTimer *dragTimer; - - void setupMenu(); - -public: - LDPlugin(QWidget *parent = 0, QString id="unknown"); - - ~LDPlugin(){} - - QString ID(){ - return PLUGID; - } - - virtual QSize defaultPluginSize(){ - //This needs to be re-implemented in the subclassed plugin - // The returned QSize is in grid points (typically 100 or 200 pixels square) - return QSize(1,1); //1x1 grid size - } - - void savePluginGeometry(QRect geom){ - settings->setValue(prefix+"geometry/desktopGridPoints", geom); - settings->sync(); - } - - QRect loadPluginGeometry(){ - return settings->value(prefix+"geometry/desktopGridPoints", QRect()).toRect(); - } - - void saveSetting(QString var, QVariant val){ - //qDebug() << "Saving Setting:" << prefix+var+QString(" = ")+val.toString(); - settings->setValue(prefix+var, val); - settings->sync(); - } - - QVariant readSetting(QString var, QVariant defaultval){ - return settings->value(prefix+var, defaultval); - } - - virtual void Cleanup(){ - //This needs to be re-implemented in the subclassed plugin - //This is where any last-minute changes are performed before a plugin is removed permanently - //Note1: This is *not* called if the plugin is being temporarily closed - //Note2: All the settings for this plugin will be automatically removed after this is finished - } - - void removeSettings(bool permanent = false){ //such as when a plugin is deleted - if(permanent){ Cleanup(); } - QStringList list = settings->allKeys().filter(prefix); - for(int i=0; i<list.length(); i++){ settings->remove(list[i]); } - - } - -public slots: - virtual void LocaleChange(){ - //This needs to be re-implemented in the subclassed plugin - //This is where all text is set/translated - setupMenu(); - } - virtual void ThemeChange(){ - //This needs to be re-implemented in the subclassed plugin - //This is where all the visuals are set if using Theme-dependant icons. - setupMenu(); - } - void showPluginMenu(){ - emit CloseDesktopMenu(); - menu->popup( QCursor::pos() ); - } - -signals: - void OpenDesktopMenu(); - void CloseDesktopMenu(); - void PluginResized(); - void PluginActivated(); - - //Signals for communication with the desktop layout system (not generally used by hand) - void StartMoving(QString); //ID of plugin - void StartResizing(QString); //ID of plugin - void RemovePlugin(QString); //ID of plugin - void IncreaseIconSize(); // only used for desktop icons - void DecreaseIconSize(); // only used for desktop icons - -private slots: - void slotStartMove(){ - QCursor::setPos( this->mapToGlobal(QPoint(this->width()/2, this->height()/2)) ); - emit StartMoving(PLUGID); - } - - void slotStartResize(){ - QCursor::setPos( this->mapToGlobal(QPoint(this->width()/2, this->height()/2)) ); - emit StartResizing(PLUGID); - } - - void slotRemovePlugin(){ - removeSettings(true); - emit RemovePlugin(PLUGID); - } - -protected: - void mousePressEvent(QMouseEvent *ev){ - if(!dragTimer->isActive() && ev->buttons().testFlag(Qt::LeftButton) ){ dragTimer->start(); } - QWidget::mousePressEvent(ev); - } - void mouseReleaseEvent(QMouseEvent *ev){ - if(dragTimer->isActive()){ dragTimer->stop(); } - QWidget::mouseReleaseEvent(ev); - } - void mouseMoveEvent(QMouseEvent *ev){ - if(ev->buttons().testFlag(Qt::LeftButton)){ - if(dragTimer->isActive()){ dragTimer->stop(); } - slotStartMove(); - } - QWidget::mouseMoveEvent(ev); - } - void resizeEvent(QResizeEvent *ev){ - emit PluginResized(); - QFrame::resizeEvent(ev); //do normal processing - } -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/NewDP.h b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/NewDP.h deleted file mode 100644 index e28b8c61..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/NewDP.h +++ /dev/null @@ -1,63 +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 class is the interface to load all the different desktop plugins -//=========================================== -#ifndef _LUMINA_DESKTOP_NEW_DESKTOP_PLUGIN_H -#define _LUMINA_DESKTOP_NEW_DESKTOP_PLUGIN_H - -#include <QDebug> - -//List all the individual plugin includes here -#include "LDPlugin.h" -//#include "SamplePlugin.h" -#include "calendar/CalendarPlugin.h" -#include "applauncher/AppLauncherPlugin.h" -#include "desktopview/DesktopViewPlugin.h" -#include "notepad/NotepadPlugin.h" -#include "audioplayer/PlayerWidget.h" -#include "systemmonitor/MonitorWidget.h" -//#include "quickcontainer/QuickDPlugin.h" -//#include "messagecenter/MessageCenter.h" -#include "rssreader/RSSFeedPlugin.h" - -class NewDP{ -public: - static LDPlugin* createPlugin(QString plugin, QWidget* parent=0){ - //qDebug() << "Create Plugin:" << plugin; - LDPlugin *plug = 0; - /*if(plugin.section("---",0,0)=="sample"){ - plug = new SamplePlugin(parent, plugin); - }else */ - if(plugin.section("---",0,0)=="calendar"){ - plug = new CalendarPlugin(parent, plugin); - }else if(plugin.section("---",0,0).section("::",0,0)=="applauncher"){ - //This plugin can be pre-initialized to a file path after the "::" delimiter - plug = new AppLauncherPlugin(parent, plugin); - }else if(plugin.section("---",0,0)=="desktopview"){ - plug = new DesktopViewPlugin(parent, plugin); - }else if(plugin.section("---",0,0)=="notepad"){ - plug = new NotePadPlugin(parent, plugin); - }else if(plugin.section("---",0,0)=="audioplayer"){ - plug = new AudioPlayerPlugin(parent, plugin); - }else if(plugin.section("---",0,0)=="systemmonitor"){ - plug = new SysMonitorPlugin(parent, plugin); - //}else if(plugin.section("---",0,0)=="messagecenter"){ - //plug = new MessageCenterPlugin(parent, plugin); - //}else if(plugin.section("---",0,0).startsWith("quick-") && LUtils::validQuickPlugin(plugin.section("---",0,0)) ){ - //plug = new QuickDPlugin(parent, plugin); - }else if(plugin.section("---",0,0)=="rssreader"){ - plug = new RSSFeedPlugin(parent, plugin); - }else{ - qWarning() << "Invalid Desktop Plugin:"<<plugin << " -- Ignored"; - } - //qDebug() << " -- done"; - return plug; - } - -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/SamplePlugin.h b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/SamplePlugin.h deleted file mode 100644 index 4a790c2d..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/SamplePlugin.h +++ /dev/null @@ -1,38 +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 class is a quick sample desktop plugin -//=========================================== -#ifndef _LUMINA_DESKTOP_DESKTOP_PLUGIN_SAMPLE_H -#define _LUMINA_DESKTOP_DESKTOP_PLUGIN_SAMPLE_H - -#include <QPushButton> -#include <QMessageBox> -#include <QVBoxLayout> -#include "LDPlugin.h" - -class SamplePlugin : public LDPlugin{ - Q_OBJECT -public: - SamplePlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID){ - this->setLayout( new QVBoxLayout()); - this->layout()->setContentsMargins(0,0,0,0); - button = new QPushButton("sample"); - this->layout()->addWidget(button); - connect(button, SIGNAL(clicked()), this, SLOT(showMessage()) ); - } - - ~SamplePlugin(){} - -private: - QPushButton *button; - -private slots: - void showMessage(){ - QMessageBox::information(this,"sample","sample desktop plugin works"); - } -}; -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/applauncher/AppLauncherPlugin.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/applauncher/AppLauncherPlugin.cpp deleted file mode 100644 index 3be19faa..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/applauncher/AppLauncherPlugin.cpp +++ /dev/null @@ -1,145 +0,0 @@ -#include "AppLauncherPlugin.h" -#include "../../LSession.h" -#include "OutlineToolButton.h" - -#define OUTMARGIN 10 //special margin for fonts due to the outlining effect from the OutlineToolbutton - -AppLauncherPlugin::AppLauncherPlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID){ - QVBoxLayout *lay = new QVBoxLayout(); - this->setLayout(lay); - lay->setContentsMargins(0,0,0,0); - button = new OutlineToolButton(this); - button->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); - button->setAutoRaise(true); - button->setText("...\n..."); //Need to set something here so that initial sizing works properly - button->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); - lay->addWidget(button, 0, Qt::AlignCenter); - connect(button, SIGNAL(DoubleClicked()), this, SLOT(buttonClicked()) ); - button->setContextMenuPolicy(Qt::NoContextMenu); - watcher = new QFileSystemWatcher(this); - connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT( loadButton()) ); - - connect(this, SIGNAL(PluginActivated()), this, SLOT(buttonClicked()) ); //in case they use the context menu to launch it. - loadButton(); - //QTimer::singleShot(0,this, SLOT(loadButton()) ); -} - -void AppLauncherPlugin::Cleanup(){ - //This is run only when the plugin was forcibly closed/removed - -} - -void AppLauncherPlugin::loadButton(){ - QString def = this->ID().section("::",1,50).section("---",0,0).simplified(); - QString path = this->readSetting("applicationpath",def).toString(); //use the default if necessary - //qDebug() << "Default Application Launcher:" << def << path; - bool ok = QFile::exists(path); - if(!ok){ emit RemovePlugin(this->ID()); return;} - int icosize = this->height()-4 - 2.2*button->fontMetrics().height(); - button->setFixedSize( this->width()-4, this->height()-4); - button->setIconSize( QSize(icosize,icosize) ); - QString txt; - if(path.endsWith(".desktop") && ok){ - XDGDesktop file(path); - ok = !file.name.isEmpty(); - if(!ok){ - button->setWhatsThis(""); - button->setIcon( QIcon(LXDG::findIcon("quickopen-file","").pixmap(QSize(icosize,icosize)).scaledToHeight(icosize, Qt::SmoothTransformation) ) ); - txt = tr("Click to Set"); - if(!watcher->files().isEmpty()){ watcher->removePaths(watcher->files()); } - }else{ - button->setWhatsThis(file.filePath); - button->setIcon( QIcon(LXDG::findIcon(file.icon,"system-run").pixmap(QSize(icosize,icosize)).scaledToHeight(icosize, Qt::SmoothTransformation) ) ); - txt = file.name; - if(!watcher->files().isEmpty()){ watcher->removePaths(watcher->files()); } - watcher->addPath(file.filePath); //make sure to update this shortcut if the file changes - } - }else if(ok){ - QFileInfo info(path); - button->setWhatsThis(info.absoluteFilePath()); - if(info.isDir()){ - button->setIcon( LXDG::findIcon("folder","") ); - }else if(LUtils::imageExtensions().contains(info.suffix().toLower()) ){ - QPixmap pix; - if(pix.load(path)){ button->setIcon( QIcon(pix.scaled(256,256)) ); } //max size for thumbnails in memory - else{ button->setIcon( LXDG::findIcon("dialog-cancel","") ); } - }else{ - button->setIcon( QIcon(LXDG::findMimeIcon(path).pixmap(QSize(icosize,icosize)).scaledToHeight(icosize, Qt::SmoothTransformation) ) ); - } - txt = info.fileName(); - if(!watcher->files().isEmpty()){ watcher->removePaths(watcher->files()); } - watcher->addPath(path); //make sure to update this shortcut if the file changes - }else{ - //InValid File - button->setWhatsThis(""); - button->setIcon( QIcon(LXDG::findIcon("quickopen","dialog-cancel").pixmap(QSize(icosize,icosize)).scaledToHeight(icosize, Qt::SmoothTransformation) ) ); - button->setText( tr("Click to Set") ); - if(!watcher->files().isEmpty()){ watcher->removePaths(watcher->files()); } - } - //If the file is a symlink, put the overlay on the icon - if(QFileInfo(path).isSymLink()){ - QImage img = button->icon().pixmap(QSize(icosize,icosize)).toImage(); - int oSize = icosize/3; //overlay size - QPixmap overlay = LXDG::findIcon("emblem-symbolic-link").pixmap(oSize,oSize).scaled(oSize,oSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); - QPainter painter(&img); - painter.drawPixmap(icosize-oSize,icosize-oSize,overlay); //put it in the bottom-right corner - button->setIcon( QIcon(QPixmap::fromImage(img)) ); - } - //Now adjust the visible text as necessary based on font/grid sizing - button->setToolTip(txt); - //Double check that the visual icon size matches the requested size - otherwise upscale the icon - if(button->fontMetrics().width(txt) > (button->width()-OUTMARGIN) ){ - //Text too long, try to show it on two lines - //txt = button->fontMetrics().elidedText(txt, Qt::ElideRight, 2*(button->width()-OUTMARGIN), Qt::TextWordWrap); - txt =txt.section(" ",0,2).replace(" ","\n"); //First take care of any natural breaks - //Go through and combine any lines - if(txt.contains("\n")){ - //need to check each line - QStringList txtL = txt.split("\n"); - for(int i=0; i<txtL.length(); i++){ - if(( i+1<txtL.length()) && (button->fontMetrics().width(txtL[i]) < button->width()/2) ){ - txtL[i] = txtL[i]+" "+txtL[i+1]; - txtL.removeAt(i+1); - } - } - txt = txtL.join("\n").section("\n",0,2); - } - - if(txt.contains("\n")){ - //need to check each line - QStringList txtL = txt.split("\n"); - for(int i=0; i<txtL.length(); i++){ - if(i>1){ txtL.removeAt(i); i--; } //Only take the first two lines - else{ txtL[i] = button->fontMetrics().elidedText(txtL[i], Qt::ElideRight, (button->width()-OUTMARGIN) ); } - } - txt = txtL.join("\n"); - }else{ - txt = this->fontMetrics().elidedText(txt,Qt::ElideRight, 2*(button->width()-OUTMARGIN)); - //Now split the line in half for the two lines - txt.insert( ((txt.count())/2), "\n"); - } - } - if(!txt.contains("\n")){ txt.append("\n "); } //always use two lines - //qDebug() << " - Setting Button Text:" << txt; - button->setText(txt); - - QTimer::singleShot(100, this, SLOT(update()) ); //Make sure to re-draw the image in a moment -} - -void AppLauncherPlugin::buttonClicked(){ - QString path = button->whatsThis(); - if(path.isEmpty() || !QFile::exists(path) ){ - //prompt for the user to select an application - QList<XDGDesktop*> apps = LSession::handle()->applicationMenu()->currentAppHash()->value("All"); //LXDG::sortDesktopNames( LXDG::systemDesktopFiles() ); - QStringList names; - for(int i=0; i<apps.length(); i++){ names << apps[i]->name; } - bool ok = false; - QString app = QInputDialog::getItem(this, tr("Select Application"), tr("Name:"), names, 0, false, &ok); - if(!ok || names.indexOf(app)<0){ return; } //cancelled - this->saveSetting("applicationpath", apps[ names.indexOf(app) ]->filePath); - QTimer::singleShot(0,this, SLOT(loadButton())); - }else{ - LSession::LaunchApplication("lumina-open \""+path+"\""); - } - -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/applauncher/AppLauncherPlugin.h b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/applauncher/AppLauncherPlugin.h deleted file mode 100644 index a0f6a7cd..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/applauncher/AppLauncherPlugin.h +++ /dev/null @@ -1,59 +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 class is a quick sample desktop plugin -//=========================================== -#ifndef _LUMINA_DESKTOP_DESKTOP_PLUGIN_APPLICATION_LAUNCHER_H -#define _LUMINA_DESKTOP_DESKTOP_PLUGIN_APPLICATION_LAUNCHER_H - -#include <QToolButton> -#include <QInputDialog> -#include <QVBoxLayout> -#include <QProcess> -#include <QFile> -#include <QFileSystemWatcher> -#include <QTimer> -#include <QMenu> -#include <QCursor> - -#include "../LDPlugin.h" - -#include <LuminaXDG.h> - -class AppLauncherPlugin : public LDPlugin{ - Q_OBJECT -public: - AppLauncherPlugin(QWidget* parent, QString ID); - ~AppLauncherPlugin(){} - - void Cleanup(); //special function for final cleanup - -private: - QToolButton *button; - QFileSystemWatcher *watcher; - //QMenu *menu; - -private slots: - void loadButton(); - void buttonClicked(); - //void openContextMenu(); - - //void increaseIconSize(); - //void decreaseIconSize(); - //void deleteFile(); - -public slots: - void LocaleChange(){ - loadButton(); //force reload - } - -protected: - void resizeEvent(QResizeEvent *ev){ - LDPlugin::resizeEvent(ev); - QTimer::singleShot(100, this, SLOT(loadButton()) ); - } -}; -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/applauncher/OutlineToolButton.h b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/applauncher/OutlineToolButton.h deleted file mode 100644 index 24410e75..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/applauncher/OutlineToolButton.h +++ /dev/null @@ -1,99 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This is a simple subclass for a QToolButton with black/white text (for transparent backgrounds) -//=========================================== -#ifndef _LUMINA_DESKTOP_PLUGIN_APPLAUNCHER_OUTLINE_TOOLBUTTON_H -#define _LUMINA_DESKTOP_PLUGIN_APPLAUNCHER_OUTLINE_TOOLBUTTON_H - -#include <QToolButton> -#include <QPainter> -#include <QPainterPath> -#include <QPen> -#include <QStyle> -#include <QStyleOption> -#include <QStylePainter> -#include <QFont> -#include <QDebug> -#include <QMouseEvent> - - -class OutlineToolButton : public QToolButton{ - Q_OBJECT -public: - OutlineToolButton(QWidget *parent=0) : QToolButton(parent){ - //This button needs slightly different font settings - do this in the constructor so that other widgets can take it into account. - QFont font = this->font(); - font.setStyleStrategy(QFont::PreferAntialias); //Always set the font strategy (just in case it starts working down the road) - this->setFont(font); - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); - } - ~OutlineToolButton(){} - -signals: - void DoubleClicked(); - -protected: - void mouseDoubleClickEvent(QMouseEvent *ev){ - ev->accept(); - emit DoubleClicked(); - } - void mousePressEvent(QMouseEvent *ev){ - ev->ignore(); - } - void mouseReleaseEvent(QMouseEvent *ev){ - ev->ignore(); - } - - void paintEvent(QPaintEvent*){ - /* NOTE: This is what a standard QToolButton performs (peeked at Qt source code for this tidbit) - QStylePainter p(this); - QStyleOptionToolButton opt; - initStyleOption(&opt); - p.drawComplexControl(QStyle::CC_ToolButton, opt); - */ - - //Modify the standard QToolButton routine to paint the text differently - QStylePainter p(this); - QStyleOptionToolButton opt; - initStyleOption(&opt); - opt.font = this->property("font").value<QFont>(); //This ensures that the stylesheet values are incorporated - opt.font.setStyleStrategy(QFont::PreferAntialias); //Always set the font strategy (just in case it starts working down the road) - opt.font.setKerning(true); - opt.fontMetrics = QFontMetrics(opt.font); - opt.text.clear(); //Don't paint the text yet - just the background/icon - p.drawComplexControl(QStyle::CC_ToolButton, opt); //This does all the normal QToolButton stuff - just not text - //Now get the text rectangle for the widget - QRect box = p.style()->itemTextRect(opt.fontMetrics, opt.rect, Qt::AlignHCenter | Qt::AlignBottom, true, this->text()); - //Get the QColors for the outline/text - QColor textC = opt.palette.text().color().toHsl(); //need the lightness value in a moment - QColor outC = textC; - //qDebug() << "Font Color Values:" << textC << textC.lightness() << textC.lightnessF(); - if(textC.lightnessF() > 0.5){ outC.setHsl(textC.hue(), textC.hslSaturation(), 0, 90); } - else{outC.setHsl(textC.hue(), textC.hslSaturation(), 255, 50); } - //qDebug() << "Outline Color Values:" << outC; - //Now get the size of the outline border (need to scale for high-res monitors) - qreal OWidth = opt.fontMetrics.width("o")/2.0; - //qDebug() << "Outline Width:" << OWidth; - //Now generate a QPainterPath for the text - QPainterPath path; - QStringList txt = this->text().split("\n"); //need each line independently, the newline actually gets painted otherwise - for(int i=0; i<txt.length(); i++){ - path.addText(box.center().x() - (opt.fontMetrics.width(txt[i])/2), box.y()+((i+1)*(box.height()/txt.length()))-opt.fontMetrics.descent(), opt.font, txt[i] ); - } - path.setFillRule(Qt::WindingFill); - //Now paint the text - QRadialGradient RG(box.center(), box.width()*1.5); //width is always going to be greater than height - RG.setColorAt(0, outC); - RG.setColorAt(1, Qt::transparent); - p.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); //need antialiasing for this to work well (sub-pixel painting) - p.strokePath(path, QPen(QBrush(RG),OWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin) ); //This will be the outline - 1pixel thick, semi-transparent - p.fillPath(path, QBrush(textC)); //this will be the inside/text color - - } - -}; -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/audioplayer/PlayerWidget.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/audioplayer/PlayerWidget.cpp deleted file mode 100644 index 722a5865..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/audioplayer/PlayerWidget.cpp +++ /dev/null @@ -1,271 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "PlayerWidget.h" -#include "ui_PlayerWidget.h" - -#include <QDir> -#include <QUrl> -#include <QInputDialog> -#include <QFileDialog> -#include <LuminaXDG.h> -#include <QDebug> -#include <QDesktopWidget> - -PlayerWidget::PlayerWidget(QWidget *parent) : QWidget(parent), ui(new Ui::PlayerWidget()){ - ui->setupUi(this); //load the designer form - PLAYER = new QMediaPlayer(this); - PLAYER->setVolume(100); - PLAYER->setNotifyInterval(1000); //1 second interval (just needs to be a rough estimate) - PLAYLIST = new QMediaPlaylist(this); - PLAYLIST->setPlaybackMode(QMediaPlaylist::Sequential); - PLAYER->setPlaylist(PLAYLIST); - - configMenu = new QMenu(this); - ui->tool_config->setMenu(configMenu); - addMenu = new QMenu(this); - ui->tool_add->setMenu(addMenu); - - updatinglists = false; //start off as false - - ui->combo_playlist->setContextMenuPolicy(Qt::NoContextMenu); - - LoadIcons(); - playerStateChanged(); //update button visibility - currentSongChanged(); - //Connect all the signals/slots - //connect(infoTimer, SIGNAL(timeout()), this, SLOT(rotateTrackInfo()) ); - connect(PLAYER, SIGNAL(positionChanged(qint64)),this, SLOT(updateProgress(qint64)) ); - connect(PLAYER, SIGNAL(durationChanged(qint64)), this, SLOT(updateMaxProgress(qint64)) ); - connect(PLAYLIST, SIGNAL(mediaChanged(int, int)), this, SLOT(playlistChanged()) ); - connect(PLAYER, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(playerStateChanged()) ); - connect(PLAYLIST, SIGNAL(currentMediaChanged(const QMediaContent&)), this, SLOT(currentSongChanged()) ); - connect(ui->combo_playlist, SIGNAL(currentIndexChanged(int)), this, SLOT(userlistSelectionChanged()) ); - connect(ui->tool_play, SIGNAL(clicked()), this, SLOT(playClicked()) ); - connect(ui->tool_pause, SIGNAL(clicked()), this, SLOT(pauseClicked()) ); - connect(ui->tool_stop, SIGNAL(clicked()), this, SLOT(stopClicked()) ); - connect(ui->tool_next, SIGNAL(clicked()), this, SLOT(nextClicked()) ); - connect(ui->tool_prev, SIGNAL(clicked()), this, SLOT(prevClicked()) ); - -} - -PlayerWidget::~PlayerWidget(){ - //qDebug() << "Removing PlayerWidget"; -} - -void PlayerWidget::LoadIcons(){ - ui->tool_stop->setIcon( LXDG::findIcon("media-playback-stop","") ); - ui->tool_play->setIcon( LXDG::findIcon("media-playback-start","") ); - ui->tool_pause->setIcon( LXDG::findIcon("media-playback-pause","") ); - ui->tool_next->setIcon( LXDG::findIcon("media-skip-forward","") ); - ui->tool_prev->setIcon( LXDG::findIcon("media-skip-backward","") ); - ui->tool_add->setIcon( LXDG::findIcon("list-add","") ); - ui->tool_config->setIcon( LXDG::findIcon("configure","") ); - //Now re-assemble the menus as well - configMenu->clear(); - configMenu->addAction(LXDG::findIcon("media-eject",""), tr("Clear Playlist"), this, SLOT(ClearPlaylist())); - configMenu->addAction(LXDG::findIcon("roll",""), tr("Shuffle Playlist"), this, SLOT(ShufflePlaylist())); - addMenu->clear(); - addMenu->addAction(LXDG::findIcon("document-new",""), tr("Add Files"), this, SLOT(AddFilesToPlaylist())); - addMenu->addAction(LXDG::findIcon("folder-new",""), tr("Add Directory"), this, SLOT(AddDirToPlaylist())); - addMenu->addAction(LXDG::findIcon("download",""), tr("Add URL"), this, SLOT(AddURLToPlaylist())); -} - -void PlayerWidget::playClicked(){ - PLAYER->play(); -} - -void PlayerWidget::pauseClicked(){ - PLAYER->pause(); -} - -void PlayerWidget::stopClicked(){ - PLAYER->stop(); -} - -void PlayerWidget::nextClicked(){ - PLAYLIST->next(); -} - -void PlayerWidget::prevClicked(){ - PLAYLIST->previous(); -} - -void PlayerWidget::AddFilesToPlaylist(){ - //Prompt the user to select multimedia files - QFileDialog dlg(0, Qt::Dialog | Qt::WindowStaysOnTopHint ); - dlg.setFileMode(QFileDialog::ExistingFiles); - dlg.setAcceptMode(QFileDialog::AcceptOpen); - dlg.setNameFilter( tr("Multimedia Files")+" ("+LXDG::findAVFileExtensions().join(" ")+")"); - dlg.setWindowTitle(tr("Select Multimedia Files")); - dlg.setWindowIcon( LXDG::findIcon("file-open","") ); - dlg.setDirectory(QDir::homePath()); //start in the home directory - //ensure it is centered on the current screen - QPoint center = QApplication::desktop()->screenGeometry(this).center(); - dlg.move( center.x()-(dlg.width()/2), center.y()-(dlg.height()/2) ); - dlg.show(); - while( dlg.isVisible() ){ - QApplication::processEvents(); - } - QList<QUrl> files = dlg.selectedUrls(); - if(files.isEmpty() || dlg.result()!=QDialog::Accepted){ return; } //cancelled - //Make this use show/processEvents later - //QList<QUrl> files = QFileDialog::getOpenFileUrls(0, tr("Select Multimedia Files"), QDir::homePath(), "Multimedia Files ("+LXDG::findAVFileExtensions().join(" ")+")"); - QList<QMediaContent> urls; - for(int i=0; i<files.length(); i++){ - urls << QMediaContent(files[i]); - } - PLAYLIST->addMedia(urls); - playlistChanged(); -} - -void PlayerWidget::AddDirToPlaylist(){ - QFileDialog dlg(0, Qt::Dialog | Qt::WindowStaysOnTopHint ); - dlg.setFileMode(QFileDialog::Directory); - dlg.setOption(QFileDialog::ShowDirsOnly, true); - dlg.setAcceptMode(QFileDialog::AcceptOpen); - dlg.setWindowTitle(tr("Select Multimedia Directory")); - dlg.setWindowIcon( LXDG::findIcon("folder-open","") ); - dlg.setDirectory(QDir::homePath()); //start in the home directory - //ensure it is centered on the current screen - QPoint center = QApplication::desktop()->screenGeometry(this).center(); - dlg.move( center.x()-(dlg.width()/2), center.y()-(dlg.height()/2) ); - dlg.show(); - while( dlg.isVisible() ){ - QApplication::processEvents(); - } - if(dlg.result() != QDialog::Accepted){ return; } //cancelled - QStringList sel = dlg.selectedFiles(); - if(sel.isEmpty()){ return; } //cancelled - QString dirpath = sel.first(); //QFileDialog::getExistingDirectory(0, tr("Select a Multimedia Directory"), QDir::homePath() ); - if(dirpath.isEmpty()){ return; } //cancelled - QDir dir(dirpath); - QFileInfoList files = dir.entryInfoList(LXDG::findAVFileExtensions(), QDir::Files | QDir::NoDotAndDotDot, QDir::Name); - if(files.isEmpty()){ return; } //nothing in this directory - QList<QMediaContent> urls; - for(int i=0; i<files.length(); i++){ - urls << QMediaContent(QUrl::fromLocalFile(files[i].absoluteFilePath()) ); - } - PLAYLIST->addMedia(urls); - playlistChanged(); -} - -void PlayerWidget::AddURLToPlaylist(){ - QInputDialog dlg(0, Qt::Dialog | Qt::WindowStaysOnTopHint ); - dlg.setInputMode(QInputDialog::TextInput); - dlg.setLabelText(tr("Enter a valid URL for a multimedia file or stream:")); - dlg.setTextEchoMode(QLineEdit::Normal); - dlg.setWindowTitle(tr("Multimedia URL")); - dlg.setWindowIcon( LXDG::findIcon("download","") ); - //ensure it is centered on the current screen - QPoint center = QApplication::desktop()->screenGeometry(this).center(); - dlg.move( center.x()-(dlg.width()/2), center.y()-(dlg.height()/2) ); - dlg.show(); - while( dlg.isVisible() ){ - QApplication::processEvents(); - } - QString url = dlg.textValue(); - if(url.isEmpty() || dlg.result()!=QDialog::Accepted){ return; } //cancelled - - //QString url = QInputDialog::getText(0, tr("Multimedia URL"), tr("Enter a valid URL for a multimedia file or stream"), QLineEdit::Normal); - //if(url.isEmpty()){ return; } - QUrl newurl(url); - if(!newurl.isValid()){ return; } //invalid URL - PLAYLIST->addMedia(newurl); - playlistChanged(); -} - -void PlayerWidget::ClearPlaylist(){ - PLAYER->stop(); - PLAYLIST->clear(); - playlistChanged(); -} - -void PlayerWidget::ShufflePlaylist(){ - PLAYLIST->shuffle(); -} - - -void PlayerWidget::userlistSelectionChanged(){ //front-end combobox was changed by the user - if(updatinglists){ return; } - PLAYLIST->setCurrentIndex( ui->combo_playlist->currentIndex() ); -} - -void PlayerWidget::playerStateChanged(){ - switch( PLAYER->state() ){ - case QMediaPlayer::StoppedState: - ui->tool_stop->setVisible(false); - ui->tool_play->setVisible(true); - ui->tool_pause->setVisible(false); - ui->progressBar->setVisible(false); - break; - case QMediaPlayer::PausedState: - ui->tool_stop->setVisible(true); - ui->tool_play->setVisible(true); - ui->tool_pause->setVisible(false); - ui->progressBar->setVisible(true); - break; - case QMediaPlayer::PlayingState: - ui->tool_stop->setVisible(true); - ui->tool_play->setVisible(false); - ui->tool_pause->setVisible(true); - ui->progressBar->setVisible(true); - break; - } - -} - -void PlayerWidget::playlistChanged(){ - updatinglists = true; - ui->combo_playlist->clear(); - for(int i=0; i<PLAYLIST->mediaCount(); i++){ - QUrl url = PLAYLIST->media(i).canonicalUrl(); - if(url.isLocalFile()){ - ui->combo_playlist->addItem(LXDG::findMimeIcon(url.fileName().section(".",-1)), url.fileName() ); - }else{ - ui->combo_playlist->addItem(LXDG::findIcon("download",""), url.toString() ); - } - } - if(PLAYLIST->currentIndex()<0 && PLAYLIST->mediaCount()>0){ PLAYLIST->setCurrentIndex(0); } - ui->combo_playlist->setCurrentIndex(PLAYLIST->currentIndex()); - - updatinglists = false; -} - -void PlayerWidget::currentSongChanged(){ - if(PLAYLIST->currentIndex() != ui->combo_playlist->currentIndex()){ - updatinglists = true; - ui->combo_playlist->setCurrentIndex(PLAYLIST->currentIndex()); - updatinglists = false; - } - ui->tool_next->setEnabled( PLAYLIST->nextIndex() >= 0 ); - ui->tool_prev->setEnabled( PLAYLIST->previousIndex() >= 0); - ui->label_num->setText( QString::number( PLAYLIST->currentIndex()+1)+"/"+QString::number(PLAYLIST->mediaCount()) ); - ui->progressBar->setRange(0, PLAYER->duration() ); - ui->progressBar->setValue(0); -} - -void PlayerWidget::updateProgress(qint64 val){ - //qDebug() << "Update Progress Bar:" << val; - ui->progressBar->setValue(val); -} - -void PlayerWidget::updateMaxProgress(qint64 val){ - ui->progressBar->setRange(0,val); -} - - -AudioPlayerPlugin::AudioPlayerPlugin(QWidget *parent, QString ID) : LDPlugin(parent, ID){ - player = new PlayerWidget(this); - this->setLayout( new QVBoxLayout() ); - this->layout()->setContentsMargins(0,0,0,0); - this->layout()->addWidget(player); - -} - -AudioPlayerPlugin::~AudioPlayerPlugin(){ - //qDebug() << "Remove AudioPlayerPlugin"; -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/audioplayer/PlayerWidget.h b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/audioplayer/PlayerWidget.h deleted file mode 100644 index 6aaeac4c..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/audioplayer/PlayerWidget.h +++ /dev/null @@ -1,84 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This plugin is a simple audio player on the desktop -//=========================================== -#ifndef _LUMINA_DESKTOP_PLUGIN_AUDIO_PLAYER_WIDGET_H -#define _LUMINA_DESKTOP_PLUGIN_AUDIO_PLAYER_WIDGET_H - -#include <QMediaPlaylist> -#include <QMediaPlayer> -#include <QTimer> -#include <QWidget> -#include <QMenu> - -#include "../LDPlugin.h" - -namespace Ui{ - class PlayerWidget; -}; - -class PlayerWidget : public QWidget{ - Q_OBJECT -public: - PlayerWidget(QWidget *parent = 0); - ~PlayerWidget(); - -public slots: - void LoadIcons(); - -private: - Ui::PlayerWidget *ui; - QMediaPlaylist *PLAYLIST; - QMediaPlayer *PLAYER; - QMenu *configMenu, *addMenu; - bool updatinglists; - -private slots: - void playClicked(); - void pauseClicked(); - void stopClicked(); - void nextClicked(); - void prevClicked(); - - void AddFilesToPlaylist(); - void AddDirToPlaylist(); - void AddURLToPlaylist(); - void ClearPlaylist(); - void ShufflePlaylist(); - void userlistSelectionChanged(); //front-end combobox was changed by the user - void playerStateChanged(); - void playlistChanged(); //list of items changed - void currentSongChanged(); - void updateProgress(qint64 val); - void updateMaxProgress(qint64 val); -}; - -// Wrapper class to put this into a desktop plugin container -class AudioPlayerPlugin : public LDPlugin{ - Q_OBJECT -public: - AudioPlayerPlugin(QWidget* parent, QString ID); - ~AudioPlayerPlugin(); - - virtual QSize defaultPluginSize(){ - // The returned QSize is in grid points (typically 100 or 200 pixels square) - return QSize(3,1); - } - -private: - PlayerWidget *player; - -public slots: - void LocaleChange(){ - QTimer::singleShot(0,player, SLOT(LoadIcons())); - } - void ThemeChange(){ - QTimer::singleShot(0,player, SLOT(LoadIcons())); - } -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/audioplayer/PlayerWidget.ui b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/audioplayer/PlayerWidget.ui deleted file mode 100644 index b1e7ee59..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/audioplayer/PlayerWidget.ui +++ /dev/null @@ -1,182 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>PlayerWidget</class> - <widget class="QWidget" name="PlayerWidget"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>346</width> - <height>81</height> - </rect> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <property name="styleSheet"> - <string notr="true">QToolButton::menu-indicator{ image: none; }</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="spacing"> - <number>4</number> - </property> - <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_2"> - <item> - <widget class="QToolButton" name="tool_config"> - <property name="text"> - <string notr="true">Config</string> - </property> - <property name="popupMode"> - <enum>QToolButton::InstantPopup</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_add"> - <property name="text"> - <string notr="true">Add</string> - </property> - <property name="popupMode"> - <enum>QToolButton::InstantPopup</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <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="QToolButton" name="tool_prev"> - <property name="text"> - <string notr="true">prev</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_num"> - <property name="text"> - <string notr="true">1/10</string> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_next"> - <property name="text"> - <string notr="true">next</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QComboBox" name="combo_playlist"/> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QToolButton" name="tool_play"> - <property name="text"> - <string notr="true">Play</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_pause"> - <property name="text"> - <string notr="true">Pause</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_stop"> - <property name="text"> - <string notr="true">Stop</string> - </property> - <property name="autoRaise"> - <bool>true</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> - <item> - <widget class="QProgressBar" name="progressBar"> - <property name="value"> - <number>24</number> - </property> - <property name="textVisible"> - <bool>false</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>0</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/calendar/CalendarPlugin.h b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/calendar/CalendarPlugin.h deleted file mode 100644 index abb138f7..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/calendar/CalendarPlugin.h +++ /dev/null @@ -1,59 +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 class is a quick sample desktop plugin -//=========================================== -#ifndef _LUMINA_DESKTOP_DESKTOP_PLUGIN_CALENDAR_H -#define _LUMINA_DESKTOP_DESKTOP_PLUGIN_CALENDAR_H - -#include <QCalendarWidget> -#include <QVBoxLayout> -#include <QDate> -#include <QTimer> -#include "../LDPlugin.h" - -class CalendarPlugin : public LDPlugin{ - Q_OBJECT -private: - QCalendarWidget *cal; - QTimer *timer; - -public: - CalendarPlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID){ - this->setLayout( new QVBoxLayout()); - this->layout()->setContentsMargins(0,0,0,0); - cal = new QCalendarWidget(this); - cal->setSelectionMode(QCalendarWidget::NoSelection); - this->layout()->addWidget(cal); - timer = new QTimer(this); - timer->setInterval(1800000); //30 minute refresh timer - timer->start(); - connect(timer, SIGNAL(timeout()), this, SLOT(updateDate()) ); - QTimer::singleShot(0,this, SLOT(updateDate()) ); - connect(this, SIGNAL(PluginResized()), this, SLOT(UpdateCalendarSize())); - } - - ~CalendarPlugin(){ timer->stop(); } - - virtual QSize defaultPluginSize(){ - // The returned QSize is in grid points (typically 100 or 200 pixels square) - return QSize(3,2); - } - -private slots: - void updateDate(){ - if(cal->selectedDate() != QDate::currentDate()){ - cal->setSelectedDate(QDate::currentDate()); - cal->showSelectedDate(); - } - } - void UpdateCalendarSize(){ - cal->setFixedSize(this->size()); - } - - -}; -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/desktop-plugins.pri b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/desktop-plugins.pri deleted file mode 100644 index 8376316a..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/desktop-plugins.pri +++ /dev/null @@ -1,24 +0,0 @@ -SOURCES += $$PWD/applauncher/AppLauncherPlugin.cpp \ - $$PWD/desktopview/DesktopViewPlugin.cpp \ - $$PWD/notepad/NotepadPlugin.cpp \ - $$PWD/audioplayer/PlayerWidget.cpp \ - $$PWD/systemmonitor/MonitorWidget.cpp \ - $$PWD/rssreader/RSSFeedPlugin.cpp \ - $$PWD/rssreader/RSSObjects.cpp -# $$PWD/messagecenter/MessageCenter.cpp - -HEADERS += $$PWD/calendar/CalendarPlugin.h \ - $$PWD/applauncher/AppLauncherPlugin.h \ - $$PWD/applauncher/OutlineToolButton.h \ - $$PWD/desktopview/DesktopViewPlugin.h \ - $$PWD/notepad/NotepadPlugin.h \ - $$PWD/audioplayer/PlayerWidget.h \ - $$PWD/systemmonitor/MonitorWidget.h \ - $$PWD/rssreader/RSSFeedPlugin.h \ - $$PWD/rssreader/RSSObjects.h -# $$PWD/quickcontainer/QuickDPlugin.h -# $$PWD/messagecenter/MessageCenter.h - -FORMS += $$PWD/audioplayer/PlayerWidget.ui \ - $$PWD/systemmonitor/MonitorWidget.ui \ - $$PWD/rssreader/RSSFeedPlugin.ui diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/desktopview/DesktopViewPlugin.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/desktopview/DesktopViewPlugin.cpp deleted file mode 100644 index 90f3374b..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/desktopview/DesktopViewPlugin.cpp +++ /dev/null @@ -1,214 +0,0 @@ -#include "DesktopViewPlugin.h" - -#include <QFileInfo> -#include <QDir> -#include <QClipboard> -#include <QMimeData> -#include <QImageReader> - -#include <LuminaXDG.h> -#include "LSession.h" - - -DesktopViewPlugin::DesktopViewPlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID){ - this->setLayout( new QVBoxLayout()); - this->layout()->setContentsMargins(0,0,0,0); - - list = new QListWidget(this); - list->setViewMode(QListView::IconMode); - list->setFlow(QListWidget::TopToBottom); //Qt bug workaround - need the opposite flow in the widget constructor - list->setWrapping(true); - list->setSpacing(4); - list->setSelectionBehavior(QAbstractItemView::SelectItems); - list->setSelectionMode(QAbstractItemView::ExtendedSelection); - list->setContextMenuPolicy(Qt::CustomContextMenu); - list->setMovement(QListView::Snap); //make sure items are "stuck" in the grid - - menu = new QMenu(this); - menu->addAction( LXDG::findIcon("run-build-file",""), tr("Open"), this, SLOT(runItems()) ); - menu->addSeparator(); - menu->addAction( LXDG::findIcon("edit-cut",""), tr("Cut"), this, SLOT(cutItems()) ); - menu->addAction( LXDG::findIcon("edit-copy",""), tr("Copy"), this, SLOT(copyItems()) ); - menu->addSeparator(); - menu->addAction( LXDG::findIcon("zoom-in",""), tr("Increase Icons"), this, SLOT(increaseIconSize()) ); - menu->addAction( LXDG::findIcon("zoom-out",""), tr("Decrease Icons"), this, SLOT(decreaseIconSize()) ); - menu->addSeparator(); - menu->addAction( LXDG::findIcon("edit-delete",""), tr("Delete"), this, SLOT(deleteItems()) ); - menu->addSeparator(); - if(LUtils::isValidBinary("lumina-fileinfo")){ - menu->addAction( LXDG::findIcon("system-search",""), tr("Properties"), this, SLOT(displayProperties()) ); - } - this->layout()->addWidget(list); - - connect(QApplication::instance(), SIGNAL(DesktopFilesChanged()), this, SLOT(updateContents()) ); - connect(list, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(runItems()) ); - connect(list, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showMenu(const QPoint&)) ); - QTimer::singleShot(1000,this, SLOT(updateContents()) ); //wait a second before loading contents -} - -DesktopViewPlugin::~DesktopViewPlugin(){ - -} - -void DesktopViewPlugin::runItems(){ - QList<QListWidgetItem*> sel = list->selectedItems(); - for(int i=0; i<sel.length(); i++){ - LSession::LaunchApplication("lumina-open \""+sel[i]->whatsThis()+"\""); - } -} - -void DesktopViewPlugin::copyItems(){ - QList<QListWidgetItem*> sel = list->selectedItems(); - if(sel.isEmpty()){ return; } //nothing selected - QStringList items; - //Format the data string - for(int i=0; i<sel.length(); i++){ - items << "copy::::"+sel[i]->whatsThis(); - } - //Now save that data to the global clipboard - QMimeData *dat = new QMimeData; - dat->clear(); - dat->setData("x-special/lumina-copied-files", items.join("\n").toLocal8Bit()); - QApplication::clipboard()->clear(); - QApplication::clipboard()->setMimeData(dat); -} - -void DesktopViewPlugin::cutItems(){ - QList<QListWidgetItem*> sel = list->selectedItems(); - if(sel.isEmpty()){ return; } //nothing selected - QStringList items; - //Format the data string - for(int i=0; i<sel.length(); i++){ - items << "cut::::"+sel[i]->whatsThis(); - } - //Now save that data to the global clipboard - QMimeData *dat = new QMimeData; - dat->clear(); - dat->setData("x-special/lumina-copied-files", items.join("\n").toLocal8Bit()); - QApplication::clipboard()->clear(); - QApplication::clipboard()->setMimeData(dat); -} - -void DesktopViewPlugin::deleteItems(){ - QList<QListWidgetItem*> sel = list->selectedItems(); - for(int i=0; i<sel.length(); i++){ - if(QFileInfo(sel[i]->whatsThis()).isDir()){ - QProcess::startDetached("rm -r \""+sel[i]->whatsThis()+"\""); - }else{ - QFile::remove(sel[i]->whatsThis()); - } - } -} - -void DesktopViewPlugin::showMenu(const QPoint &pos){ - //Make sure there is an item underneath the mouse first - if(list->itemAt(pos)!=0){ - menu->popup(this->mapToGlobal(pos)); - }else{ - //Pass the context menu request on to the desktop (emit it from the plugin) - this->showPluginMenu(); - //emit OpenDesktopMenu(); - } -} - -void DesktopViewPlugin::increaseIconSize(){ - int icosize = this->readSetting("IconSize",64).toInt(); - icosize+=16; //go in orders of 16 pixels - //list->setIconSize(QSize(icosize,icosize)); - this->saveSetting("IconSize",icosize); - QTimer::singleShot(10, this, SLOT(updateContents())); -} - -void DesktopViewPlugin::decreaseIconSize(){ - int icosize = this->readSetting("IconSize",64).toInt(); - if(icosize < 20){ return; } //too small to decrease more - icosize-=16; //go in orders of 16 pixels - //list->setIconSize(QSize(icosize,icosize)); - this->saveSetting("IconSize",icosize); - QTimer::singleShot(10,this, SLOT(updateContents())); -} - -void DesktopViewPlugin::updateContents(){ - list->clear(); - - int icosize = this->readSetting("IconSize",64).toInt(); - QSize gridSZ = QSize(qRound(1.8*icosize),icosize+4+(2*this->fontMetrics().height()) ); - //qDebug() << "Icon Size:" << icosize <<"Grid Size:" << gridSZ.width() << gridSZ.height(); - list->setGridSize(gridSZ); - list->setIconSize(QSize(icosize,icosize)); - QDir dir(QDir::homePath()+"/Desktop"); - QFileInfoList files = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name | QDir::Type | QDir::DirsFirst); - for(int i=0; i<files.length(); i++){ - QListWidgetItem *it = new QListWidgetItem; - it->setSizeHint(gridSZ); //ensure uniform item sizes - //it->setForeground(QBrush(Qt::black, Qt::Dense2Pattern)); //Try to use a font color which will always be visible - it->setTextAlignment(Qt::AlignCenter); - it->setWhatsThis(files[i].absoluteFilePath()); - QString txt; - if(files[i].isDir()){ - it->setIcon( LXDG::findIcon("folder","") ); - txt = files[i].fileName(); - }else if(files[i].suffix() == "desktop" ){ - XDGDesktop desk(files[i].absoluteFilePath()); - if(desk.isValid()){ - it->setIcon( LXDG::findIcon(desk.icon,"unknown") ); - if(desk.name.isEmpty()){ - txt = files[i].fileName(); - }else{ - txt = desk.name; - } - }else{ - //Revert back to a standard file handling - it->setIcon( LXDG::findMimeIcon(files[i].fileName()) ); - txt = files[i].fileName(); - } - }else if(LUtils::imageExtensions().contains(files[i].suffix().toLower()) ){ - it->setIcon( QIcon( QPixmap(files[i].absoluteFilePath()).scaled(icosize,icosize,Qt::IgnoreAspectRatio, Qt::SmoothTransformation) ) ); - txt = files[i].fileName(); - }else{ - it->setIcon( LXDG::findMimeIcon( files[i].fileName() ) ); - txt = files[i].fileName(); - } - //Add the sym-link overlay to the icon as necessary - if(files[i].isSymLink()){ - QImage img = it->icon().pixmap(QSize(icosize,icosize)).toImage(); - int oSize = icosize/2; //overlay size - QPixmap overlay = LXDG::findIcon("emblem-symbolic-link").pixmap(oSize,oSize).scaled(oSize,oSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); - QPainter painter(&img); - painter.drawPixmap(icosize-oSize,icosize-oSize,overlay); //put it in the bottom-right corner - it->setIcon( QIcon(QPixmap::fromImage(img)) ); - } - //Now adjust the visible text as necessary based on font/grid sizing - it->setToolTip(txt); - if(this->fontMetrics().width(txt) > (gridSZ.width()-4) ){ - //int dash = this->fontMetrics().width("-"); - //Text too long, try to show it on two lines - txt = txt.section(" ",0,2).replace(" ","\n"); //First take care of any natural breaks - if(txt.contains("\n")){ - //need to check each line - QStringList txtL = txt.split("\n"); - for(int i=0; i<txtL.length(); i++){ txtL[i] = this->fontMetrics().elidedText(txtL[i], Qt::ElideRight, gridSZ.width()-4); } - txt = txtL.join("\n"); - if(txtL.length()>2){ txt = txt.section("\n",0,1); } //only keep the first two lines - }else{ - txt = this->fontMetrics().elidedText(txt,Qt::ElideRight, 2*(gridSZ.width()-4)); - //Now split the line in half for the two lines - txt.insert( (txt.count()/2), "\n"); - } - }else{ - txt.append("\n "); //ensure two lines (2nd one invisible) - keeps formatting sane - } - it->setText(txt); - list->addItem(it); - if( (i%10) == 0){ QApplication::processEvents(); }//keep the UI snappy, every 10 items - } - list->setFlow(QListWidget::TopToBottom); //To ensure this is consistent - issues with putting it in the constructor - list->update(); //Re-paint the widget after all items are added -} - -void DesktopViewPlugin::displayProperties(){ - QList<QListWidgetItem*> sel = list->selectedItems(); - for(int i=0; i<sel.length(); i++){ - LSession::LaunchApplication("lumina-fileinfo \""+sel[i]->whatsThis()); - } -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/desktopview/DesktopViewPlugin.h b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/desktopview/DesktopViewPlugin.h deleted file mode 100644 index 046b6e5c..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/desktopview/DesktopViewPlugin.h +++ /dev/null @@ -1,55 +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 plugin is a listing/launcher for things in the ~/Desktop folder -//=========================================== -#ifndef _LUMINA_DESKTOP_DESKTOP_VIEW_PLUGIN_H -#define _LUMINA_DESKTOP_DESKTOP_VIEW_PLUGIN_H - -#include <QListWidget> -#include <QVBoxLayout> -#include <QTimer> -#include <QFileSystemWatcher> -#include <QMouseEvent> - -#include "../LDPlugin.h" - -class DesktopViewPlugin : public LDPlugin{ - Q_OBJECT -public: - DesktopViewPlugin(QWidget* parent, QString ID); - ~DesktopViewPlugin(); - - virtual QSize defaultPluginSize(){ - // The returned QSize is in grid points (typically 100 or 200 pixels square) - return QSize(3,3); - } -private: - QListWidget *list; - QMenu *menu; - -private slots: - void runItems(); - void copyItems(); - void cutItems(); - void deleteItems(); - void showMenu(const QPoint&); - void increaseIconSize(); - void decreaseIconSize(); - void updateContents(); - void displayProperties(); - - -public slots: - void LocaleChange(){ - QTimer::singleShot(0,this, SLOT(updateContents())); - } - void ThemeChange(){ - QTimer::singleShot(0,this, SLOT(updateContents())); - } - -}; -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/messagecenter/LXDG-DBusNotifier.h b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/messagecenter/LXDG-DBusNotifier.h deleted file mode 100644 index 64413e95..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/messagecenter/LXDG-DBusNotifier.h +++ /dev/null @@ -1,17 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// Simple DBUS message handler for the FreeDesktop desktop notifications specification - - -class LXDG-DBusNotifier : public QDBusVirtualObkect{ - Q_OBJECT -public: - -private: - - -}; diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/messagecenter/MessageCenter.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/messagecenter/MessageCenter.cpp deleted file mode 100644 index df07a122..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/messagecenter/MessageCenter.cpp +++ /dev/null @@ -1,90 +0,0 @@ -#include "MessageCenter.h" - -#include <LuminaXDG.h> -#include <QVBoxLayout> -#include <QHBoxLayout> -#include <QDBusConnection> -#include <QDBusConnectionInterface> - -MessageCenterPlugin::MessageCenterPlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID){ - //Setup the UI - QVBoxLayout *vlay = new QVBoxLayout(); - this->setLayout( new QVBoxLayout() ); - this->layout()->setContentsMargins(0,0,0,0); - vlay->setContentsMargins(3,3,3,3); - frame = new QFrame(this); - frame->setObjectName("messagecenterbase"); - this->layout()->addWidget(frame); - frame->setLayout(vlay); - - - //Setup the title bar header buttons - QHBoxLayout *hlay = new QHBoxLayout(); - tool_clearall = new QToolButton(this); - tool_clearall->setAutoRaise(true); - tool_clearone = new QToolButton(this); - tool_clearone->setAutoRaise(true); - QWidget *spacer = new QWidget(this); - spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - hlay->addWidget(spacer); - hlay->addWidget(tool_clearone); - hlay->addWidget(tool_clearall); - vlay->addLayout(hlay); - - //Setup the main text widget - list_messages = new QListWidget(this); - list_messages->setSelectionMode(QAbstractItemView::SingleSelection); - list_messages->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - vlay->addWidget(list_messages); - - //Now setup the initial values - this->setInitialSize(200,300); - //Setup the button connections - connect(tool_clearall, SIGNAL(clicked()), this, SLOT(clearAllMessages()) ); - connect(tool_clearone, SIGNAL(clicked()), this, SLOT(clearSelectedMessage()) ); - - //Setup the DBUS signals/slots - if(QDBusConnection::sessionBus().isConnected()){ - if( QDBusConnection::sessionBus().registerService("org.freedesktop.Notifications") ){ - //Was able to register this service, also register everything it can do... - //SUPPORTED: "body", "body-hyperlinks", "body-markup", "icon-static" - - - } - QDBusConnection::sessionBus().connect("", "", "org.freedesktop.Notifications", "Notify", this, SLOT(newMessage(QString, uint, QString, QString, QString, QStringList, dict, int)) ); - QDBusConnection::sessionBus().interface().call("AddMatch", "interface='org.freedesktop.Notifications',member='Notify',type='method_call',eavesdrop='true'"); - qDebug() << "Available Session DBUS Services:" << QDBusConnection::sessionBus().interface()->registeredServiceNames().value(); - //connect(QString(), QString(), - } - if(QDBusConnection::systemBus().isConnected()){ - qDebug() << "Available System DBUS Services:" << QDBusConnection::systemBus().interface()->registeredServiceNames().value(); - } - - QTimer::singleShot(0,this, SLOT(loadIcons()) ); -} - -MessageCenterPlugin::~MessageCenterPlugin(){ - -} - -void MessageCenterPlugin::newMessage(QString summary, QString body){ - qDebug() << "New Message:" << summary, body; -} - -void MessageCenterPlugin::clearAllMessages(){ - list_messages->clear(); -} - -void MessageCenterPlugin::clearSelectedMessage(){ - if( list_messages->currentItem()==0){ return; } //nothing selected - list_messages->removeItemWidget( list_messages->currentItem() ); -} - - -void MessageCenterPlugin::loadIcons(){ - tool_clearall->setIcon( LXDG::findIcon("edit-clear-list","") ); - tool_clearall->setToolTip( tr("Clear all messages") ); - tool_clearone->setIcon( LXDG::findIcon("edit-delete","") ); - tool_clearone->setToolTip( tr("Clear selected message") ); - -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/messagecenter/MessageCenter.h b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/messagecenter/MessageCenter.h deleted file mode 100644 index 8491546f..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/messagecenter/MessageCenter.h +++ /dev/null @@ -1,48 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This plugin is a simple DBUS monitor which display's messages that come in -//=========================================== -#ifndef _LUMINA_DESKTOP_MESSAGE_CENTER_PLUGIN_H -#define _LUMINA_DESKTOP_MESSAGE_CENTER_PLUGIN_H - -#include <QListWidget> -#include <QToolButton> -#include <QFrame> - -#include <QTimer> -#include "../LDPlugin.h" - -class MessageCenterPlugin : public LDPlugin{ - Q_OBJECT -public: - MessageCenterPlugin(QWidget* parent, QString ID); - ~MessageCenterPlugin(); - -private: - //QDBusConnection *sess, *sys; - QListWidget *list_messages; - QFrame *frame; - QToolButton *tool_clearall; //clear all messages - QToolButton *tool_clearone; //clear selected message - -private slots: - //void newMessage(QDBusMessage *message); - void clearAllMessages(); - void clearSelectedMessage(); - - void loadIcons(); - -public slots: - void LocaleChange(){ - QTimer::singleShot(0,this, SLOT(loadIcons())); - } - void ThemeChange(){ - QTimer::singleShot(0,this, SLOT(loadIcons())); - } - -}; -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/notepad/NotepadPlugin.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/notepad/NotepadPlugin.cpp deleted file mode 100644 index 6d321305..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/notepad/NotepadPlugin.cpp +++ /dev/null @@ -1,330 +0,0 @@ -#include "NotepadPlugin.h" - -#include <LuminaXDG.h> -#include "LSession.h" -#include <LUtils.h> -#include <QDir> -#include <QFileDialog> -#include <QInputDialog> -#include <QtConcurrent> - -NotePadPlugin::NotePadPlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID){ - //qDebug() << "Creating Notepad Plugin:"; - QVBoxLayout *vlay = new QVBoxLayout(); - this->setLayout( new QVBoxLayout() ); - this->layout()->setContentsMargins(0,0,0,0); - vlay->setContentsMargins(3,3,3,3); - frame = new QFrame(this); - frame->setObjectName("notepadbase"); - //frame->setStyleSheet("QFrame#notepadbase{border-width: 1px; background: rgba(255,255,255,50); color: black;} QFrame{ border: none; border-radius: 3px; background: rgba(255,255,255,100); color: black;}"); - this->layout()->addWidget(frame); - frame->setLayout(vlay); - - if(!QFile::exists(QDir::homePath()+"/Notes")){ - //Create the notes directory if non-existant - QDir dir; - dir.mkpath(QDir::homePath()+"/Notes"); - } - watcher = new QFileSystemWatcher(this); - //Always watch the notes directory for new files/changes - watcher->addPath(QDir::homePath()+"/Notes"); - - typeTimer = new QTimer(this); - typeTimer->setInterval(1000); // 1 second before it saves - typeTimer->setSingleShot(true); //compress lots of signals into a single save - - updating = false; - //Setup the title bar header buttons - QHBoxLayout *hlay = new QHBoxLayout(); - config = new QToolButton(this); - config->setAutoRaise(true); - config->setMenu(new QMenu(this)); - config->setPopupMode(QToolButton::InstantPopup); - /*open = new QToolButton(this); - open->setAutoRaise(true); - add = new QToolButton(this); - add->setAutoRaise(true); - rem = new QToolButton(this); - rem->setAutoRaise(true);*/ - cnote = new QComboBox(this); - - hlay->addWidget(cnote); - hlay->addWidget(config); - //hlay->addWidget(open); - //hlay->addWidget(add); - //hlay->addWidget(rem); - vlay->addLayout(hlay); - - //Setup the main text widget - edit = new QPlainTextEdit(this); - edit->setReadOnly(false); - edit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - vlay->addWidget(edit); - edit->setContextMenuPolicy(Qt::NoContextMenu); - - //Now load the new file-based system for saving notes - //qDebug() << "Saving a new setting"; - this->saveSetting("customFile",""); //always clear this when the plugin is initialized (only maintained per-session) - //qDebug() << "Loading Notes Dir"; - QTimer::singleShot(10, this, SLOT(notesDirChanged())); - //qDebug() << "Set Sizing"; - - //qDebug() << "Connect Signals/slots"; - //Setup the button connections - /*connect(open, SIGNAL(clicked()), this, SLOT(openNoteClicked()) ); - connect(add, SIGNAL(clicked()), this, SLOT(newNoteClicked()) ); - connect(rem, SIGNAL(clicked()), this, SLOT(remNote()) );*/ - //connect(config, SIGNAL(clicked()), this, SLOT(openConfigMenu()) ); - connect(edit, SIGNAL(textChanged()), this, SLOT(newTextAvailable()) ); - connect(cnote, SIGNAL(currentIndexChanged(QString)), this, SLOT(noteChanged()) ); - connect(typeTimer, SIGNAL(timeout()), this, SLOT(updateContents()) ); - connect(watcher, SIGNAL(directoryChanged(QString)), this, SLOT(notesDirChanged()) ); //re-load the available notes - connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(noteChanged()) ); //re-load the current file - QTimer::singleShot(0,this, SLOT(loadIcons()) ); - //qDebug() << " - Done with init"; -} - -NotePadPlugin::~NotePadPlugin(){ - -} - - -void NotePadPlugin::openNote(){ - //qDebug() << "Open New Note:"; - //Prompt for a name for the new note - QFileDialog dlg(0, Qt::Dialog | Qt::WindowStaysOnTopHint ); - dlg.setFileMode(QFileDialog::ExistingFile); - dlg.setAcceptMode(QFileDialog::AcceptOpen); - dlg.setNameFilters( QStringList() << tr("Note Files (*.note)") << tr("Text Files (*)")); - dlg.setWindowTitle(tr("Open a note file")); - dlg.setWindowIcon( LXDG::findIcon("document-open","") ); - dlg.setDirectory(QDir::homePath()); //start in the home directory - //ensure it is centered on the current screen - QPoint center = QApplication::desktop()->screenGeometry(this).center(); - dlg.move( center.x()-(dlg.width()/2), center.y()-(dlg.height()/2) ); - dlg.show(); - while( dlg.isVisible() ){ - QApplication::processEvents(); - } - QStringList sel = dlg.selectedFiles(); - if(sel.isEmpty() || dlg.result()!=QDialog::Accepted){ return; } //cancelled - QString fullpath = sel.first(); - QString name = fullpath.section("/",-1); - //qDebug() << " - Found Note:" << name << fullpath; - int index = cnote->findText(name, Qt::MatchExactly | Qt::MatchCaseSensitive); - if(QFile::exists(fullpath) && index <0){ - //Alternate option of searching for the file in the list - index = cnote->findText(fullpath, Qt::MatchExactly | Qt::MatchCaseSensitive); - } - if(index>=0){ - //This note already exists: just load it - cnote->setCurrentIndex(index); - }else{ - //New note - add it to the end of the list and then load it - cnote->addItem(name, fullpath); - this->saveSetting("customFile", fullpath); //save this as a custom file - cnote->setCurrentIndex( cnote->count()-1 ); - QTimer::singleShot(1000, this, SLOT(notesDirChanged())); //Make sure to refresh the list (only one custom file at a time) - } -} - -QString NotePadPlugin::newNoteName(QString oldname, bool tryagain){ - //Prompt for a name for the new note - //qDebug() << "Create new note"; - QInputDialog dlg(0, Qt::Dialog | Qt::WindowStaysOnTopHint ); - dlg.setInputMode(QInputDialog::TextInput); - dlg.setLabelText(tr("Name:")); - dlg.setTextEchoMode(QLineEdit::Normal); - if(tryagain){ dlg.setWindowTitle(tr("Invalid Note Name: Try Again")); } - else{ dlg.setWindowTitle(tr("Select a Note Name")); } - dlg.setWindowIcon( LXDG::findIcon("document-new","") ); - dlg.setTextValue(oldname); - //ensure it is centered on the current screen - QPoint center = QApplication::desktop()->screenGeometry(this).center(); - dlg.move( center.x()-(dlg.width()/2), center.y()-(dlg.height()/2) ); - dlg.show(); - while( dlg.isVisible() ){ - //this->thread()->usleep(300000); //300 ms between updates - QApplication::processEvents(); - } - QString name = dlg.textValue(); - //make sure to remove any "bad" characters from the name - name.remove("\""); name.remove(";"); name.remove("\'"); name.replace("/","_"); - if(name.isEmpty() || dlg.result()!=QDialog::Accepted){ return ""; } //cancelled - //Check validity of the new note filename - QString fullpath = QDir::homePath()+"/Notes/"+name; - if(!fullpath.endsWith(".note")){ fullpath.append(".note"); } - if(QFile::exists(fullpath)){ - return newNoteName(name, true); //try again - } - return name; //good name - go ahead and return it -} - -void NotePadPlugin::updateConfigMenu(){ - //Re-create the menu and open it - config->menu()->clear(); - config->menu()->addAction(LXDG::findIcon("document-open",""), tr("Open Text File"), this, SLOT(openNoteClicked()) ); - config->menu()->addAction(LXDG::findIcon("document-new",""), tr("Create a Note"), this, SLOT(newNoteClicked()) ); - if(cnote->currentIndex()>=0){ - config->menu()->addSeparator(); - config->menu()->addAction(LXDG::findIcon("document-edit",""), tr("Rename Note"), this, SLOT(renameNote()) ); - config->menu()->addAction(LXDG::findIcon("document-close",""), tr("Delete Note"), this, SLOT(remNote()) ); - } -} - -void NotePadPlugin::openNoteClicked(){ - openNote(); -} - -void NotePadPlugin::newNoteClicked(){ - //QtConcurrent::run(this, &NotePadPlugin::newNote); - QString name = newNoteName(); - if(name.isEmpty()){ return; } - QString fullpath = QDir::homePath()+"/Notes/"+name; - if(!fullpath.endsWith(".note")){ fullpath.append(".note"); } - //qDebug() << " - New Note:" << name << fullpath; - int index = cnote->findText(name, Qt::MatchExactly | Qt::MatchCaseSensitive); - if(QFile::exists(fullpath) && index <0){ - //Alternate option of searching for the file in the list - index = cnote->findText(fullpath, Qt::MatchExactly | Qt::MatchCaseSensitive); - } - if(index>=0){ - //This note already exists: just load it - cnote->setCurrentIndex(index); - }else{ - //New note - add it to the end of the list and then load it - cnote->addItem(name, fullpath); - cnote->setCurrentIndex( cnote->count()-1 ); - } -} - -void NotePadPlugin::remNote(){ - QString note = cnote->currentData().toString(); - if(note.isEmpty()){ return; } - watcher->removePath(note); //remove this file from the watcher - this->saveSetting("currentFile",""); //reset the internal value - QFile::remove(note); //remove the file - //if(!note.startsWith(QDir::homePath()+"/Notes/") ){ - //If the file was not in the notes directory, need to manually prompt for a re-load - // otherwise, the directory watcher will catch it and trigger a re-load (no need to double-load) - notesDirChanged(); - //} -} - -void NotePadPlugin::renameNote(){ - int item = cnote->currentIndex(); - if(item<0){ return; } //nothing selected - QString oldpath = cnote->currentData().toString(); - if(oldpath.isEmpty() || !oldpath.endsWith(".note")){ return; } - QString name = newNoteName(cnote->currentText()); - if(name.isEmpty()){ return; } - QString fullpath = QDir::homePath()+"/Notes/"+name; - if(!fullpath.endsWith(".note")){ fullpath.append(".note"); } - //qDebug() << " - New Note:" << name << fullpath; - //Update the current item data to point to this file - cnote->setItemText(item, name); - cnote->setItemData(item, fullpath); - //Now move the file over - QFile::rename(oldpath, fullpath); - noteChanged(); -} - -void NotePadPlugin::newTextAvailable(){ - if(updating){ return; } //programmatic change of the widget - if(typeTimer->isActive()){ typeTimer->stop(); } - typeTimer->start(); -} - -void NotePadPlugin::updateContents(){ - if(updating){ return; } //this was a programmatic change to the widget - //The text was changed in the plugin - save it in the file - QString note = cnote->currentData().toString(); - updating = true; - LUtils::writeFile(note, edit->toPlainText().split("\n"), true); - QApplication::processEvents(); //make sure to process/discard the file changed signal before disabling the flag - updating = false; -} - -void NotePadPlugin::notesDirChanged(){ - if(updating){ return; } - QString cfile = this->readSetting("currentFile","").toString(); - QStringList notes; - QDir dir(QDir::homePath()+"/Notes"); - QStringList files = dir.entryList(QStringList() << "*.note", QDir::Files | QDir::NoDotAndDotDot, QDir::Name); - for(int i=0; i<files.length(); i++){ - notes << dir.absoluteFilePath(files[i]); - } - QString custom = this->readSetting("customFile","").toString(); - if(!custom.isEmpty() && QFile::exists(custom) ){ notes << custom; } - //qDebug() << "Available Notes:" << notes << cfile; - //Now update the UI list - updating = true; //don't refresh the UI until done changing lists - cnote->clear(); - bool found = false; - for(int i=0; i<notes.length(); i++){ - QString name = notes[i].section("/",-1); - if(name.endsWith(".note")){ name.chop(5); } - cnote->addItem(name, notes[i]); - if(notes[i]==cfile){ cnote->setCurrentIndex(i); found = true;} - } - if(!found && !cfile.isEmpty() && QFile::exists(cfile)){ - //Current note is a manually-loaded text file - cnote->addItem(cfile.section("/",-1), cfile); - cnote->setCurrentIndex( cnote->count()-1 ); //last item - found = true; - } - if(!found && cnote->count()>0){ cnote->setCurrentIndex(0); } - updating =false; - noteChanged(); -} - -void NotePadPlugin::noteChanged(){ - if(updating){ return; } - updating =true; - QString note; - if(cnote->currentIndex()>=0){ - note = cnote->currentData().toString(); - } - QTimer::singleShot(0, this, SLOT(updateConfigMenu()) ); - if(note.isEmpty() && cnote->count()>0){ - updating=false; - cnote->setCurrentIndex(0); - return; - } - QString oldnote = this->readSetting("currentFile","").toString(); - //qDebug() << "Note Changed:" << note << oldnote; - if( oldnote!=note ){ - //Clear the old note file/setting - if(!oldnote.isEmpty()){ - watcher->removePath(oldnote); - this->saveSetting("currentFile",""); - } - if(!note.isEmpty()){ - this->saveSetting("currentFile",note); - watcher->addPath(note); - } - } - - if(!note.isEmpty()){ - QString text = LUtils::readFile(note).join("\n"); - if(text!=edit->toPlainText()){ - edit->setPlainText( text ); - } - }else{ - edit->clear(); - } - //If no notes available - disable the editor until a new one is created - edit->setEnabled(!note.isEmpty()); - //rem->setEnabled(!note.isEmpty()); - cnote->setEnabled(!note.isEmpty()); - //leave the new/open buttons enabled all the time - updating = false; -} - - -void NotePadPlugin::loadIcons(){ - /*open->setIcon( LXDG::findIcon("document-open","") ); - add->setIcon( LXDG::findIcon("document-new","") ); - rem->setIcon( LXDG::findIcon("document-close","") );*/ - config->setIcon( LXDG::findIcon("configure","") ); -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/notepad/NotepadPlugin.h b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/notepad/NotepadPlugin.h deleted file mode 100644 index 5084dadf..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/notepad/NotepadPlugin.h +++ /dev/null @@ -1,66 +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 plugin is a simple text editor for notes on the desktop -//=========================================== -#ifndef _LUMINA_DESKTOP_NOTEPAD_PLUGIN_H -#define _LUMINA_DESKTOP_NOTEPAD_PLUGIN_H - -#include <QPlainTextEdit> -#include <QToolButton> -#include <QComboBox> -#include <QVBoxLayout> -#include <QTimer> -#include <QFileSystemWatcher> -#include "../LDPlugin.h" - -class NotePadPlugin : public LDPlugin{ - Q_OBJECT -public: - NotePadPlugin(QWidget* parent, QString ID); - ~NotePadPlugin(); - - virtual QSize defaultPluginSize(){ - // The returned QSize is in grid points (typically 100 or 200 pixels square) - return QSize(3,3); - } -private: - QPlainTextEdit *edit; - QToolButton *config; //*open, *add, *rem; - QComboBox *cnote; - QFrame *frame; - QFileSystemWatcher *watcher; - bool updating; - QTimer *typeTimer; - - void openNote(); - QString newNoteName(QString oldname = "", bool tryagain = false); - -private slots: - void updateConfigMenu(); - - void openNoteClicked(); - void newNoteClicked(); - void remNote(); - void renameNote(); - void newTextAvailable(); - void updateContents(); - - void notesDirChanged(); - void noteChanged(); - - void loadIcons(); - -public slots: - void LocaleChange(){ - QTimer::singleShot(0,this, SLOT(noteChanged())); - } - void ThemeChange(){ - QTimer::singleShot(0,this, SLOT(loadIcons())); - } - -}; -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/quickcontainer/QuickDPlugin.h b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/quickcontainer/QuickDPlugin.h deleted file mode 100644 index d6039ac0..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/quickcontainer/QuickDPlugin.h +++ /dev/null @@ -1,51 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This class is a simple container for a QtQuick plugin -//=========================================== -#ifndef _LUMINA_DESKTOP_DESKTOP_PLUGIN_QUICK_H -#define _LUMINA_DESKTOP_DESKTOP_PLUGIN_QUICK_H - -#include <QQuickWidget> -#include <QVBoxLayout> -#include "../LDPlugin.h" - -#include <LUtils.h> - -class QuickDPlugin : public LDPlugin{ - Q_OBJECT -public: - QuickDPlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID){ - this->setLayout( new QVBoxLayout()); - this->layout()->setContentsMargins(0,0,0,0); - container = new QQuickWidget(this); - container->setResizeMode(QQuickWidget::SizeRootObjectToView); - connect(container, SIGNAL(statusChanged(QQuickWidget::Status)), this, SLOT(statusChange(QQuickWidget::Status)) ); - this->layout()->addWidget(container); - container->setSource(QUrl::fromLocalFile( LUtils::findQuickPluginFile(ID.section("---",0,0)) )); - QApplication::processEvents(); //to check for errors right away - //this->setInitialSize(container->initialSize().width(), container->initialSize().height()); - } - - ~QuickDPlugin(){} - - virtual QSize defaultPluginSize(){ - // The returned QSize is in grid points (typically 100 or 200 pixels square) - return QSize(2,2); - } -private: - QQuickWidget *container; - -private slots: - void statusChange(QQuickWidget::Status status){ - if(status == QQuickWidget::Error){ - qDebug() << "Quick Widget Error:" << this->ID(); - container->setSource(QUrl()); //clear out the script - experienced an error - } - } - -}; -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/rssreader/RSSFeedPlugin.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/rssreader/RSSFeedPlugin.cpp deleted file mode 100644 index c330d6c0..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/rssreader/RSSFeedPlugin.cpp +++ /dev/null @@ -1,363 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2016, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "RSSFeedPlugin.h" -#include "ui_RSSFeedPlugin.h" - -#include <LuminaXDG.h> -#include "LSession.h" -#include <LUtils.h> -#include <QDir> -#include <QFileDialog> -#include <QInputDialog> -#include <QtConcurrent> - -RSSFeedPlugin::RSSFeedPlugin(QWidget* parent, QString ID) : LDPlugin(parent, ID), ui(new Ui::RSSFeedPlugin()){ - ui->setupUi(this); - //Load the global settings - setprefix = "rssreader/"; //this structure/prefix should be used for *all* plugins of this type - RSS = new RSSReader(this, setprefix); - ui->text_feed->setContextMenuPolicy(Qt::NoContextMenu); - //Create the options menu - optionsMenu = new QMenu(this); - ui->tool_options->setMenu(optionsMenu); - presetMenu = new QMenu(this); - ui->tool_add_preset->setMenu(presetMenu); - - //Setup any signal/slot connections - connect(ui->push_back1, SIGNAL(clicked()), this, SLOT(backToFeeds()) ); - connect(ui->push_back2, SIGNAL(clicked()), this, SLOT(backToFeeds()) ); - connect(ui->push_back3, SIGNAL(clicked()), this, SLOT(backToFeeds()) ); - connect(ui->push_save_settings, SIGNAL(clicked()), this, SLOT(saveSettings()) ); - connect(RSS, SIGNAL(rssChanged(QString)), this, SLOT(RSSItemChanged(QString)) ); - connect(RSS, SIGNAL(newChannelsAvailable()), this, SLOT(UpdateFeedList())); - connect(ui->tool_gotosite, SIGNAL(clicked()), this, SLOT(openFeedPage()) ); - connect(ui->push_rm_feed, SIGNAL(clicked()), this, SLOT(removeFeed()) ); - connect(ui->push_add_url, SIGNAL(clicked()), this, SLOT(addNewFeed()) ); - connect(ui->combo_feed, SIGNAL(currentIndexChanged(int)), this, SLOT(currentFeedChanged()) ); - - connect(presetMenu, SIGNAL(triggered(QAction*)), this, SLOT(loadPreset(QAction*)) ); - - updateOptionsMenu(); - QTimer::singleShot(0,this, SLOT(ThemeChange()) ); - //qDebug() << " - Done with init"; - QStringList feeds; - if( !LSession::handle()->DesktopPluginSettings()->contains(setprefix+"currentfeeds") ){ - //First-time run of the plugin - automatically load the default feeds - feeds = LOS::RSSFeeds(); - for(int i=0; i<feeds.length(); i++){ feeds[i] = feeds[i].section("::::",1,-1); } //just need url right now - feeds << "http://lumina-desktop.org/?feed=rss2"; //Lumina Desktop blog feed - LSession::handle()->DesktopPluginSettings()->setValue(setprefix+"currentfeeds", feeds); - }else{ - feeds = LSession::handle()->DesktopPluginSettings()->value(setprefix+"currentfeeds",QStringList()).toStringList(); - } - RSS->addUrls(feeds); - backToFeeds(); //always load the first page -} - -RSSFeedPlugin::~RSSFeedPlugin(){ - -} - -//================ -// PRIVATE -//================ -void RSSFeedPlugin::updateOptionsMenu(){ - optionsMenu->clear(); - optionsMenu->addAction(LXDG::findIcon("list-add",""), tr("Add RSS Feed"), this, SLOT(openFeedNew()) ); - optionsMenu->addAction(LXDG::findIcon("help-about",""), tr("View Feed Details"), this, SLOT(openFeedInfo()) ); - optionsMenu->addAction(LXDG::findIcon("configure",""), tr("Settings"), this, SLOT(openSettings()) ); - optionsMenu->addSeparator(); - optionsMenu->addAction(LXDG::findIcon("download",""), tr("Update Feeds Now"), this, SLOT(resyncFeeds()) ); - - presetMenu->clear(); - QStringList feeds = LOS::RSSFeeds(); - feeds << tr("Lumina Desktop RSS")+"::::http://lumina-desktop.org/?feed=rss2"; - feeds.sort(); - for(int i=0; i<feeds.length(); i++){ - QAction *tmp = presetMenu->addAction(feeds[i].section("::::",0,0) ); - tmp->setWhatsThis( feeds[i].section("::::",1,-1) ); - } -} - -void RSSFeedPlugin::checkFeedNotify(){ - bool notify = false; - for(int i=0; i<ui->combo_feed->count() && !notify; i++){ - if( !ui->combo_feed->itemData(i, Qt::WhatsThisRole).toString().isEmpty()){ notify = true; } - } - QString style; - if(notify){ style = "QComboBox{ background-color: rgba(255,0,0,120); }"; } - ui->combo_feed->setStyleSheet(style); -} - -//Simplification functions for loading feed info onto widgets -void RSSFeedPlugin::updateFeed(QString ID){ - //Now clear/update the feed viewer (HTML) - ui->text_feed->clear(); - if(ID.isEmpty()){ return; } //nothing to show - - //Save the datetime this feed was read - LSession::handle()->DesktopPluginSettings()->setValue(setprefix+"feedReads/"+ID, QDateTime::currentDateTime() ); - //Get the color to use for hyperlinks (need to specify in html) - QString color = ui->text_feed->palette().text().color().name(); //keep the hyperlinks the same color as the main text (different formatting still applies) - QString html; - RSSchannel data = RSS->dataForID(ID); - ui->label_lastupdate->setText( data.lastsync.toString(Qt::DefaultLocaleShortDate) ); - // - generate the html - // html.append("<ul style=\"margin-left: 3px;\">\n"); - for(int i=0; i<data.items.length(); i++){ - //html.append("<li>"); - html.append("<h4><a href=\""+data.items[i].link+"\" style=\"color: "+color+";\">"+data.items[i].title+"</a></h4>"); - if(!data.items[i].pubdate.isNull() || !data.items[i].author.isEmpty()){ - html.append("<i>("); - if(!data.items[i].pubdate.isNull()){ html.append(data.items[i].pubdate.toString(Qt::DefaultLocaleShortDate)); } - if(!data.items[i].author.isEmpty()){ - if(!html.endsWith("(")){ html.append(", "); } //spacing between date/author - if(!data.items[i].author_email.isEmpty()){ html.append("<a href=\"mailto:"+data.items[i].author_email+"\" style=\"color: "+color+";\">"+data.items[i].author+"</a>"); } - else{ html.append(data.items[i].author); } - } - html.append(")</i><br>"); - } - html.append(data.items[i].description); - //html.append("</li>\n"); - if(i+1 < data.items.length()){ html.append("<br>"); } - } - //html.append("</ul>\n"); - // - load that html into the viewer - ui->text_feed->setHtml(html); -} - -void RSSFeedPlugin::updateFeedInfo(QString ID){ - ui->page_feed_info->setWhatsThis(ID); - ui->text_feed_info->clear(); - if(ID.isEmpty()){ return; } - //Get the color to use for hyperlinks (need to specify in html) - QString color = ui->text_feed->palette().text().color().name(); //keep the hyperlinks the same color as the main text (different formatting still applies) - QString html; - RSSchannel data = RSS->dataForID(ID); - // - generate the html - // <a href=\""+LINK+"\" style=\"color: "+color+";\">"+TEXT+"</a> - html.append( QString(tr("Feed URL: %1")).arg("<a href=\""+data.originalURL+"\" style=\"color: "+color+";\">"+data.originalURL+"</a>") +"<br><hr>"); - html.append( QString(tr("Title: %1")).arg(data.title) +"<br>"); - html.append( QString(tr("Description: %1")).arg(data.description) +"<br>"); - html.append( QString(tr("Website: %1")).arg("<a href=\""+data.link+"\" style=\"color: "+color+";\">"+data.link+"</a>") +"<br><hr>"); - if(!data.lastBuildDate.isNull()){ html.append( QString(tr("Last Build Date: %1")).arg(data.lastBuildDate.toString(Qt::DefaultLocaleShortDate)) +"<br>"); } - html.append( QString(tr("Last Sync: %1")).arg(data.lastsync.toString(Qt::DefaultLocaleShortDate)) +"<br>"); - html.append( QString(tr("Next Sync: %1")).arg(data.nextsync.toString(Qt::DefaultLocaleShortDate)) +"<br>"); - // - load that html into the viewer - ui->text_feed_info->setHtml(html); -} - -//================ -// PRIVATE SLOTS -//================ -void RSSFeedPlugin::loadIcons(){ - ui->tool_options->setIcon( LXDG::findIcon("configure","") ); - ui->tool_gotosite->setIcon( LXDG::findIcon("applications-internet","") ); - ui->push_back1->setIcon( LXDG::findIcon("go-previous","") ); - ui->push_back2->setIcon( LXDG::findIcon("go-previous","") ); - ui->push_back3->setIcon( LXDG::findIcon("go-previous","") ); - ui->push_rm_feed->setIcon( LXDG::findIcon("list-remove","") ); - ui->push_add_url->setIcon( LXDG::findIcon("list-add","") ); - ui->push_save_settings->setIcon( LXDG::findIcon("document-save","") ); - ui->tool_add_preset->setIcon( LXDG::findIcon("bookmark-new-list","") ); -} - -//GUI slots -// - Page management -void RSSFeedPlugin::backToFeeds(){ - ui->stackedWidget->setCurrentWidget(ui->page_feed); -} - -void RSSFeedPlugin::openFeedInfo(){ - QString ID = ui->combo_feed->currentData().toString(); - if(ID.isEmpty()){ return; } - updateFeedInfo(ID); - ui->stackedWidget->setCurrentWidget(ui->page_feed_info); - -} - -void RSSFeedPlugin::openFeedNew(){ - ui->line_new_url->setText(""); - ui->stackedWidget->setCurrentWidget(ui->page_new_feed); -} - -void RSSFeedPlugin::openSettings(){ - //Sync the widget with the current settings - QSettings *set = LSession::handle()->DesktopPluginSettings(); - - ui->check_manual_sync->setChecked( set->value(setprefix+"manual_sync_only", false).toBool() ); - int DI = set->value(setprefix+"default_interval_minutes", 60).toInt(); - if(DI<1){ DI = 60; } - if( (DI%60) == 0 ){DI = DI/60; ui->combo_sync_units->setCurrentIndex(1); } //hourly setting - else{ ui->combo_sync_units->setCurrentIndex(1); } //minutes setting - ui->spin_synctime->setValue(DI); - - //Now show the page - ui->stackedWidget->setCurrentWidget(ui->page_settings); -} - -// - Feed Management -void RSSFeedPlugin::addNewFeed(){ - if(ui->line_new_url->text().isEmpty()){ return; } //nothing to add - //Validate the URL - QUrl url(ui->line_new_url->text()); - if(!url.isValid()){ - ui->line_new_url->setFocus(); - return; - } - //Add the URL to the settings file for next login - QStringList feeds = LSession::handle()->DesktopPluginSettings()->value(setprefix+"currentfeeds",QStringList()).toStringList(); - feeds << url.toString(); - LSession::handle()->DesktopPluginSettings()->setValue(setprefix+"currentfeeds", feeds); - - //Set this URL as the current selection - ui->combo_feed->setWhatsThis(url.toString()); //hidden field - will trigger an update in a moment - //Add the URL to the backend - RSS->addUrls(QStringList() << url.toString()); - //UpdateFeedList(); //now re-load the feeds which are available - - //Now go back to the main page - backToFeeds(); -} - -void RSSFeedPlugin::loadPreset(QAction *act){ - ui->line_new_url->setText( act->whatsThis() ); -} - -void RSSFeedPlugin::removeFeed(){ - QString ID = ui->page_feed_info->whatsThis(); - if(ID.isEmpty()){ return; } - //Remove from the RSS feed object - RSSchannel info = RSS->dataForID(ID); - RSS->removeUrl(ID); - //Remove the URL from the settings file for next login - QStringList feeds = LSession::handle()->DesktopPluginSettings()->value(setprefix+"currentfeeds",QStringList()).toStringList(); - feeds.removeAll(info.originalURL); - LSession::handle()->DesktopPluginSettings()->setValue(setprefix+"currentfeeds", feeds); - LSession::handle()->DesktopPluginSettings()->remove(setprefix+"feedReads/"+ID); - //Now go back to the main page - backToFeeds(); -} - -void RSSFeedPlugin::resyncFeeds(){ - RSS->addUrls( LSession::handle()->DesktopPluginSettings()->value(setprefix+"currentfeeds",QStringList()).toStringList() ); - RSS->syncNow(); -} - -// - Feed Interactions -void RSSFeedPlugin::currentFeedChanged(){ - QString ID = ui->combo_feed->currentData().toString(); - //Remove the "unread" color/flag from the feed - ui->combo_feed->setItemData( ui->combo_feed->currentIndex(), QBrush(Qt::transparent) , Qt::BackgroundRole); - ui->combo_feed->setItemData( ui->combo_feed->currentIndex(), "", Qt::WhatsThisRole); - checkFeedNotify(); - updateFeed(ID); -} - -void RSSFeedPlugin::openFeedPage(){ //Open main website for feed - QString ID = ui->combo_feed->currentData().toString(); - //Find the data associated with this feed - RSSchannel data = RSS->dataForID(ID); - QString url = data.link; - //qDebug() << "Open Feed Page:" << url; - //Now launch the browser - if(!url.isEmpty()){ - LSession::LaunchApplication("lumina-open \""+url+"\""); - } -} - -void RSSFeedPlugin::saveSettings(){ - QSettings *set = LSession::handle()->DesktopPluginSettings(); - set->setValue(setprefix+"manual_sync_only", ui->check_manual_sync->isChecked() ); - int DI = ui->spin_synctime->value(); - if(ui->combo_sync_units->currentIndex()==1){ DI = DI*60; } //convert from hours to minutes - set->setValue(setprefix+"default_interval_minutes", DI); - set->sync(); - - //Now go back to the feeds - backToFeeds(); -} - -//Feed Object interactions -void RSSFeedPlugin::UpdateFeedList(){ - - QString activate = ui->combo_feed->whatsThis(); - if(!activate.isEmpty()){ ui->combo_feed->setWhatsThis(""); } - if(activate.isEmpty()){ activate = ui->combo_feed->currentData().toString(); } // keep current item selected - //Now get/list all the available feeds - QStringList IDS = RSS->channels(); //this is pre-sorted by title of the feed - //qDebug() << "Update RSS Feed List:" << IDS << activate; - for(int i=0; i<IDS.length(); i++){ - bool newitem = false; - if(ui->combo_feed->count()<=i){ newitem = true; } - else{ - QString cid = ui->combo_feed->itemData(i).toString(); - if(IDS[i]!=cid){ - if(IDS.contains(cid)){ newitem = true; } //this item is just out of order - else{ ui->combo_feed->removeItem(i); } //item no longer is valid - } - } - if(newitem){ - //Need to add a new item at this point in the menu - RSSchannel info = RSS->dataForID(IDS[i]); - if(info.title.isEmpty()){ - //invalid/empty channel - ui->combo_feed->insertItem(i, IDS[i], IDS[i]); //just show the URL - }else{ - ui->combo_feed->insertItem(i, info.icon, info.title, IDS[i]); - } - } - } - //Remove any extra items on the end of the list - for(int i=IDS.length(); i<ui->combo_feed->count(); i++){ - ui->combo_feed->removeItem(i); i--; - } - //Now activate the proper item as needed - if(IDS.contains(activate)){ - ui->combo_feed->setCurrentIndex( IDS.indexOf(activate) ); - } - checkFeedNotify(); -} - -void RSSFeedPlugin::RSSItemChanged(QString ID){ - for(int i=0; i<ui->combo_feed->count(); i++){ - if(ui->combo_feed->itemData(i).toString()!=ID){ continue; } - RSSchannel info = RSS->dataForID(ID); - if(info.title.isEmpty()){ - ui->combo_feed->setItemText(i, ID); - ui->combo_feed->setItemIcon(i, LXDG::findIcon("dialog-cancel","") ); - }else{ - ui->combo_feed->setItemText(i, info.title); - ui->combo_feed->setItemIcon(i, info.icon ); - QColor color(Qt::transparent); - if( info.lastBuildDate > LSession::handle()->DesktopPluginSettings()->value(setprefix+"feedReads/"+ID,QDateTime()).toDateTime() ){ - color = QColor(255,10,10,100); //semi-transparent red - ui->combo_feed->setItemData(i, "notify", Qt::WhatsThisRole); - }else{ - ui->combo_feed->setItemData(i, "", Qt::WhatsThisRole); - } - ui->combo_feed->setItemData(i, QBrush(color) , Qt::BackgroundRole); - } - } - if(ID == ui->combo_feed->currentData().toString()){ - currentFeedChanged(); //re-load the current feed - }else{ - checkFeedNotify(); - } -} - -//================== -// PUBLIC SLOTS -//================== -void RSSFeedPlugin::LocaleChange(){ - ui->retranslateUi(this); - updateOptionsMenu(); -} -void RSSFeedPlugin::ThemeChange(){ - QTimer::singleShot(0,this, SLOT(loadIcons())); - updateOptionsMenu(); -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/rssreader/RSSFeedPlugin.h b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/rssreader/RSSFeedPlugin.h deleted file mode 100644 index 68b36760..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/rssreader/RSSFeedPlugin.h +++ /dev/null @@ -1,72 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2016, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This plugin is a simple RSS feed reader for the desktop -//=========================================== -#ifndef _LUMINA_DESKTOP_RSS_FEEDER_PLUGIN_H -#define _LUMINA_DESKTOP_RSS_FEEDER_PLUGIN_H - -#include <QTimer> -#include "../LDPlugin.h" - -#include "RSSObjects.h" - -namespace Ui{ - class RSSFeedPlugin; -}; - -class RSSFeedPlugin : public LDPlugin{ - Q_OBJECT -public: - RSSFeedPlugin(QWidget* parent, QString ID); - ~RSSFeedPlugin(); - - virtual QSize defaultPluginSize(){ - // The returned QSize is in grid points (typically 100 or 200 pixels square) - return QSize(3,3); - } -private: - Ui::RSSFeedPlugin *ui; - QMenu *optionsMenu, *presetMenu; - QString setprefix; //settings prefix - RSSReader *RSS; - - void updateOptionsMenu(); - void checkFeedNotify(); //check if unread feeds are available and change the styling a bit as needed - - //Simplification functions for loading feed info onto widgets - void updateFeed(QString ID); - void updateFeedInfo(QString ID); - -private slots: - void loadIcons(); - - //GUI slots - // - Page management - void backToFeeds(); - void openFeedInfo(); - void openFeedNew(); - void openSettings(); - // - Feed Management - void addNewFeed(); // the "add" button (current url in widget on page) - void loadPreset(QAction*); //the add-preset menu - void removeFeed(); // the "remove" button (current feed for page) - void resyncFeeds(); - // - Feed Interactions - void currentFeedChanged(); - void openFeedPage(); //Open the website in a browser - void saveSettings(); - - //Feed Object interactions - void UpdateFeedList(); - void RSSItemChanged(QString ID); - -public slots: - void LocaleChange(); - void ThemeChange(); - -}; -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/rssreader/RSSFeedPlugin.ui b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/rssreader/RSSFeedPlugin.ui deleted file mode 100644 index dc7acd0b..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/rssreader/RSSFeedPlugin.ui +++ /dev/null @@ -1,552 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>RSSFeedPlugin</class> - <widget class="QWidget" name="RSSFeedPlugin"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>238</width> - <height>278</height> - </rect> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="spacing"> - <number>0</number> - </property> - <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="QStackedWidget" name="stackedWidget"> - <property name="currentIndex"> - <number>1</number> - </property> - <widget class="QWidget" name="page_feed"> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <property name="spacing"> - <number>3</number> - </property> - <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"> - <item> - <widget class="QComboBox" name="combo_feed"/> - </item> - <item> - <widget class="QToolButton" name="tool_options"> - <property name="toolTip"> - <string>View Options</string> - </property> - <property name="text"> - <string/> - </property> - <property name="popupMode"> - <enum>QToolButton::InstantPopup</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QLabel" name="label_lastupdate"> - <property name="text"> - <string notr="true"/> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_gotosite"> - <property name="toolTip"> - <string>Open Website</string> - </property> - <property name="text"> - <string>More</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - <property name="arrowType"> - <enum>Qt::NoArrow</enum> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QTextBrowser" name="text_feed"> - <property name="undoRedoEnabled"> - <bool>false</bool> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - <property name="html"> - <string notr="true"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></string> - </property> - <property name="textInteractionFlags"> - <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set> - </property> - <property name="openExternalLinks"> - <bool>true</bool> - </property> - <property name="openLinks"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_feed_info"> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <property name="spacing"> - <number>4</number> - </property> - <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>5</number> - </property> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <item> - <widget class="QPushButton" name="push_back1"> - <property name="text"> - <string>Back to Feeds</string> - </property> - <property name="flat"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QGroupBox" name="groupBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title"> - <string>Feed Information</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout_4"> - <property name="spacing"> - <number>0</number> - </property> - <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> - <widget class="QTextBrowser" name="text_feed_info"> - <property name="html"> - <string notr="true"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></string> - </property> - <property name="openExternalLinks"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_8"> - <item> - <widget class="QPushButton" name="push_rm_feed"> - <property name="text"> - <string>Remove Feed</string> - </property> - <property name="flat"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_new_feed"> - <layout class="QVBoxLayout" name="verticalLayout_5"> - <property name="spacing"> - <number>4</number> - </property> - <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_4"> - <item> - <widget class="QPushButton" name="push_back2"> - <property name="text"> - <string>Back to Feeds</string> - </property> - <property name="flat"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QGroupBox" name="groupBox_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title"> - <string>New Feed Subscription</string> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> - </property> - <layout class="QVBoxLayout" name="verticalLayout_6"> - <property name="spacing"> - <number>2</number> - </property> - <property name="leftMargin"> - <number>2</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="rightMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>2</number> - </property> - <item> - <widget class="QLabel" name="label"> - <property name="text"> - <string>RSS URL</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_10"> - <item> - <widget class="QLineEdit" name="line_new_url"/> - </item> - <item> - <widget class="QToolButton" name="tool_add_preset"> - <property name="toolTip"> - <string>Load a preset RSS Feed</string> - </property> - <property name="text"> - <string/> - </property> - <property name="popupMode"> - <enum>QToolButton::InstantPopup</enum> - </property> - </widget> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_5"> - <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_add_url"> - <property name="text"> - <string>Add to Feeds</string> - </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> - </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> - </widget> - <widget class="QWidget" name="page_settings"> - <layout class="QVBoxLayout" name="verticalLayout_7"> - <property name="spacing"> - <number>4</number> - </property> - <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_6"> - <item> - <widget class="QPushButton" name="push_back3"> - <property name="text"> - <string>Back to Feeds</string> - </property> - <property name="flat"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QGroupBox" name="groupBox_3"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title"> - <string>Feed Reader Settings</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout_8"> - <property name="spacing"> - <number>2</number> - </property> - <property name="leftMargin"> - <number>2</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="rightMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>2</number> - </property> - <item> - <widget class="QCheckBox" name="check_manual_sync"> - <property name="text"> - <string>Manual Sync Only</string> - </property> - </widget> - </item> - <item> - <widget class="QGroupBox" name="groupBox_4"> - <property name="toolTip"> - <string>Some RSS feeds may request custom update intervals instead of using this setting</string> - </property> - <property name="title"> - <string>Default Sync Interval</string> - </property> - <layout class="QHBoxLayout" name="horizontalLayout_7"> - <property name="spacing"> - <number>2</number> - </property> - <property name="leftMargin"> - <number>2</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="rightMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>2</number> - </property> - <item> - <widget class="QSpinBox" name="spin_synctime"> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>60</number> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="combo_sync_units"> - <property name="currentText"> - <string>Hour(s)</string> - </property> - <property name="currentIndex"> - <number>1</number> - </property> - <item> - <property name="text"> - <string>Minutes</string> - </property> - </item> - <item> - <property name="text"> - <string>Hour(s)</string> - </property> - </item> - </widget> - </item> - </layout> - </widget> - </item> - <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> - <layout class="QHBoxLayout" name="horizontalLayout_9"> - <item> - <spacer name="horizontalSpacer_3"> - <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_settings"> - <property name="text"> - <string>Save Settings</string> - </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> - </item> - </layout> - </widget> - </item> - </layout> - </widget> - </widget> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/rssreader/RSSObjects.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/rssreader/RSSObjects.cpp deleted file mode 100644 index 0a805252..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/rssreader/RSSObjects.cpp +++ /dev/null @@ -1,287 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2016, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "RSSObjects.h" -#include <QNetworkRequest> -#include <QXmlStreamReader> - -#include "LSession.h" - -//============ -// PUBLIC -//============ -RSSReader::RSSReader(QObject *parent, QString settingsPrefix) : QObject(parent){ - NMAN = new QNetworkAccessManager(this); - connect(NMAN, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)) ); - connect(NMAN, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError>&)), this, SLOT(sslErrors(QNetworkReply*, const QList<QSslError>&)) ); - - setprefix = settingsPrefix; - syncTimer = new QTimer(this); - syncTimer->setInterval(300000); //5 minutes - connect(syncTimer, SIGNAL(timeout()), this, SLOT(checkTimes())); - syncTimer->start(); -} - -RSSReader::~RSSReader(){ - -} - -//Information retrieval -QStringList RSSReader::channels(){ - QStringList urls = hash.keys(); - QStringList ids; - //sort all the channels by title before output - for(int i=0; i<urls.length(); i++){ - QString title = hash[urls[i]].title; - if(title.isEmpty()){ title = "ZZZ"; } //put currently-invalid ones at the end of the list - ids << title+" : "+hash[urls[i]].originalURL; - } - ids.sort(); - //Now strip off all the titles again to just get the IDs - for(int i=0; i<ids.length(); i++){ - ids[i] = ids[i].section(" : ",-1); - } - return ids; -} - -RSSchannel RSSReader::dataForID(QString ID){ - QString key = keyForUrl(ID); - if(hash.contains(key)){ return hash[key]; } - else{ return RSSchannel(); } -} - -//Initial setup -void RSSReader::addUrls(QStringList urls){ - //qDebug() << "Add URLS:" << urls; - for(int i=0; i<urls.length(); i++){ - //Note: Make sure we get the complete URL form for accurate comparison later - QString url = QUrl(urls[i]).toString(); - QString key = keyForUrl(url); - if(hash.contains(key)){ continue; } //already handled - RSSchannel blank; - blank.originalURL = url; - hash.insert(url, blank); //put the empty struct into the hash for now - requestRSS(url); //startup the initial request for this url - } - emit newChannelsAvailable(); -} - -void RSSReader::removeUrl(QString ID){ - QString key = keyForUrl(ID); - if(hash.contains(key)){ hash.remove(key); } - emit newChannelsAvailable(); -} - -//================= -// PUBLIC SLOTS -//================= -void RSSReader::syncNow(){ - QStringList urls = hash.keys(); - for(int i=0; i<urls.length(); i++){ - requestRSS(hash[urls[i]].originalURL); - } -} - -//================= -// PRIVATE -//================= -QString RSSReader::keyForUrl(QString url){ - //get current hash key for this URL - QStringList keys = hash.keys(); - if(keys.contains(url)){ return url; } //this is already a valid key - for(int i=0; i<keys.length(); i++){ - if(hash[keys[i]].originalURL == url){ return keys[i]; } //this was an original URL - } - return ""; -} - -void RSSReader::requestRSS(QString url){ - if(!outstandingURLS.contains(url)){ - //qDebug() << "Request URL:" << url; - NMAN->get( QNetworkRequest( QUrl(url) ) ); - outstandingURLS << url; - } -} - -//RSS parsing functions -RSSchannel RSSReader::readRSS(QByteArray bytes){ - //Note: We could expand this later to support multiple "channel"s per Feed - // but it seems like there is normally only one channel anyway - //qDebug() << "Read RSS:" << bytes.left(100); - QXmlStreamReader xml(bytes); - RSSchannel rssinfo; - //qDebug() << "Can Read XML Stream:" << !xml.hasError(); - if(xml.readNextStartElement()){ - //qDebug() << " - RSS Element:" << xml.name(); - if(xml.name() == "rss" && (xml.attributes().value("version") =="2.0" || xml.attributes().value("version") =="0.91") ){ - while(xml.readNextStartElement()){ - //qDebug() << " - RSS Element:" << xml.name(); - if(xml.name()=="channel"){ rssinfo = readRSSChannel(&xml); } - else{ xml.skipCurrentElement(); } - } - } - } - if(xml.hasError()){ qDebug() << " - XML Read Error:" << xml.errorString() << "\n" << bytes; } - return rssinfo; -} -RSSchannel RSSReader::readRSSChannel(QXmlStreamReader *rss){ - RSSchannel info; - info.timetolive = -1; - while(rss->readNextStartElement()){ - //qDebug() << " - RSS Element (channel):" <<rss->name(); - if(rss->name()=="item"){ info.items << readRSSItem(rss); } - else if(rss->name()=="title"){ info.title = rss->readElementText(); } - else if(rss->name()=="link"){ - QString txt = rss->readElementText(); - if(!txt.isEmpty()){ info.link = txt; } - } - else if(rss->name()=="description"){ info.description = rss->readElementText(); } - else if(rss->name()=="lastBuildDate"){ info.lastBuildDate = RSSDateTime(rss->readElementText()); } - else if(rss->name()=="pubDate"){ info.lastPubDate = RSSDateTime(rss->readElementText()); } - else if(rss->name()=="image"){ readRSSImage(&info, rss); } - //else if(rss->name()=="skipHours"){ info.link = rss->readElementText(); } - //else if(rss->name()=="skipDays"){ info.link = rss->readElementText(); } - else if(rss->name()=="ttl"){ info.timetolive = rss->readElementText().toInt(); } - else{ rss->skipCurrentElement(); } - } - return info; -} - -RSSitem RSSReader::readRSSItem(QXmlStreamReader *rss){ - RSSitem item; - while(rss->readNextStartElement()){ - //qDebug() << " - RSS Element (Item):" << rss->name(); - if(rss->name()=="title"){ item.title = rss->readElementText(); } - else if(rss->name()=="link"){ item.link = rss->readElementText(); } - else if(rss->name()=="description"){ item.description = rss->readElementText(); } - else if(rss->name()=="comments"){ item.comments_url = rss->readElementText(); } - else if(rss->name()=="author"){ - //Special handling - this field can contain both email and name - QString raw = rss->readElementText(); - if(raw.contains("@")){ - item.author_email = raw.split(" ").filter("@").first(); - item.author = raw.remove(item.author_email).remove("(").remove(")").simplified(); //the name is often put within parentheses after the email - }else{ item.author = raw; } - } - else if(rss->name()=="guid"){ item.guid = rss->readElementText(); } - else if(rss->name()=="pubDate"){ item.pubdate = RSSDateTime(rss->readElementText()); } - else{ rss->skipCurrentElement(); } - } - return item; -} - -void RSSReader::readRSSImage(RSSchannel *item, QXmlStreamReader *rss){ - while(rss->readNextStartElement()){ - //qDebug() << " - RSS Element (Image):" << rss->name(); - if(rss->name()=="url"){ item->icon_url = rss->readElementText(); } - else if(rss->name()=="title"){ item->icon_title = rss->readElementText(); } - else if(rss->name()=="link"){ item->icon_link = rss->readElementText(); } - else if(rss->name()=="width"){ item->icon_size.setWidth(rss->readElementText().toInt()); } - else if(rss->name()=="height"){ item->icon_size.setHeight(rss->readElementText().toInt()); } - else if(rss->name()=="description"){ item->icon_description = rss->readElementText(); } - } - //Go ahead and kick off the request for the icon - if(!item->icon_url.isEmpty()){ requestRSS(item->icon_url); } -} - -QDateTime RSSReader::RSSDateTime(QString datetime){ - return QDateTime::fromString(datetime, Qt::RFC2822Date); -} - -//================= -// PRIVATE SLOTS -//================= -void RSSReader::replyFinished(QNetworkReply *reply){ - QString url = reply->request().url().toString(); - //qDebug() << "Got Reply:" << url; - QString key = keyForUrl(url); //current hash key for this URL - QByteArray data = reply->readAll(); - outstandingURLS.removeAll(url); - if(data.isEmpty()){ - //qDebug() << "No data returned:" << url; - //see if the URL can be adjusted for known issues - bool handled = false; - QUrl redirecturl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); - if(redirecturl.isValid() && (redirecturl.toString() != url )){ - //New URL redirect - make the change and send a new request - QString newurl = redirecturl.toString(); - //qDebug() << " - Redirect to:" << newurl; - if(hash.contains(key) && !hash.contains(newurl)){ - hash.insert(newurl, hash.take(key) ); //just move the data over to the new url - requestRSS(newurl); - emit newChannelsAvailable(); - handled = true; - } - } - if(!handled && hash.contains(key) ){ - emit rssChanged(hash[key].originalURL); - } - return; - } - - if(!hash.contains(key)){ - //qDebug() << " - hash does not contain URL:" << url; - //URL removed from list while a request was outstanding? - //Could also be an icon fetch response - QStringList keys = hash.keys(); - for(int i=0; i<keys.length(); i++){ - //qDebug() << " - Check for icon URL:" << hash[keys[i]].icon_url; - if(hash[keys[i]].icon_url.toLower() == url.toLower()){ //needs to be case-insensitive - //Icon fetch response - RSSchannel info = hash[keys[i]]; - QImage img = QImage::fromData(data); - info.icon = QIcon( QPixmap::fromImage(img) ); - //qDebug() << "Got Icon response:" << url << info.icon; - hash.insert(keys[i], info); //insert back into the hash - emit rssChanged( hash[keys[i]].originalURL ); - break; - } - } - reply->deleteLater(); - }else{ - //RSS reply - RSSchannel info = readRSS(data); //QNetworkReply can be used as QIODevice - reply->deleteLater(); //clean up - //Validate the info and announce any changes - if(info.title.isEmpty() || info.link.isEmpty() || info.description.isEmpty()){ - qDebug() << "Missing XML Information:" << url << info.title << info.link << info.description; - return; - } //bad info/read - //Update the bookkeeping elements of the info - if(info.timetolive<=0){ info.timetolive = LSession::handle()->DesktopPluginSettings()->value(setprefix+"default_interval_minutes", 60).toInt(); } - if(info.timetolive <=0){ info.timetolive = 60; } //error in integer conversion from settings? - info.lastsync = QDateTime::currentDateTime(); info.nextsync = info.lastsync.addSecs(info.timetolive * 60); - //Now see if anything changed and save the info into the hash - bool changed = (hash[key].lastBuildDate.isNull() || (hash[key].lastBuildDate < info.lastBuildDate) ); - bool newinfo = false; - if(changed){ newinfo = hash[key].title.isEmpty(); } //no previous info from this URL - info.originalURL = hash[key].originalURL; //make sure this info gets preserved across updates - if(!hash[key].icon.isNull()){ info.icon = hash[key].icon; } //copy over the icon from the previous reply - hash.insert(key, info); - if(newinfo){ emit newChannelsAvailable(); } //new channel - else if(changed){ emit rssChanged(info.originalURL); } //update to existing channel - } -} - -void RSSReader::sslErrors(QNetworkReply *reply, const QList<QSslError> &errors){ - int ok = 0; - qDebug() << "SSL Errors Detected (RSS Reader):" << reply->url(); - for(int i=0; i<errors.length(); i++){ - if(errors[i].error()==QSslError::SelfSignedCertificate || errors[i].error()==QSslError::SelfSignedCertificateInChain){ ok++; } - else{ qDebug() << "Unhandled SSL Error:" << errors[i].errorString(); } - } - if(ok==errors.length()){ qDebug() << " - Permitted:" << reply->url(); reply->ignoreSslErrors(); } - else{ qDebug() << " - Denied:" << reply->url(); } -} - -void RSSReader::checkTimes(){ - if(LSession::handle()->DesktopPluginSettings()->value(setprefix+"manual_sync_only", false).toBool()){ return; } - QStringList urls = hash.keys(); - QDateTime cdt = QDateTime::currentDateTime(); - for(int i=0; i<urls.length(); i++){ - if(hash[urls[i]].nextsync < cdt){ requestRSS(urls[i]); } - } -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/rssreader/RSSObjects.h b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/rssreader/RSSObjects.h deleted file mode 100644 index 3069bf8d..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/rssreader/RSSObjects.h +++ /dev/null @@ -1,105 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2016, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_DESKTOP_RSS_READER_PLUGIN_OBJECT_H -#define _LUMINA_DESKTOP_RSS_READER_PLUGIN_OBJECT_H - -#include <QNetworkAccessManager> -#include <QNetworkReply> -#include <QString> -#include <QDateTime> -#include <QList> -#include <QIcon> -#include <QTimer> -#include <QXmlStreamReader> //Contained in the Qt "core" module - don't need the full "xml" module for this -#include <QSslError> - -struct RSSitem{ - //Required Fields - QString title, link, description; - - //Optional Fields - QString comments_url, author_email, author, guid; - QDateTime pubdate; //when the item was published - //IGNORED INFO from RSS2 spec: "category", "source", "enclosure" -}; - -struct RSSchannel{ - //Required fields - QString title, link, description; - - //Optional Fields - QDateTime lastBuildDate, lastPubDate; //last build/publish dates - // - channel refresh information - int timetolive; //in minutes - time until next sync should be performed - //QList<int> skiphours; - //QStringList skipdays; - // - icon info - QIcon icon; - QString icon_url, icon_title, icon_link, icon_description; - QSize icon_size; - //All items within this channel - QList<RSSitem> items; - - //Optional RSS2 elements ignored: - // "cloud", "textInput", "rating", "language", "copyright", "managingEditor", "webMaster", - // "category", "generator", "docs" - - //Internal data for bookkeeping - QDateTime lastsync, nextsync; - QString originalURL; //in case it was redirected to some "fixed" url later -}; - -class RSSReader : public QObject{ - Q_OBJECT -public: - RSSReader(QObject *parent, QString settingsPrefix); - ~RSSReader(); - - //Information retrieval - QStringList channels(); //returns all ID's - RSSchannel dataForID(QString ID); - - //Initial setup - void addUrls(QStringList urls); - void removeUrl(QString ID); - -public slots: - void syncNow(); //not generally needed - -private: - //Internal data objects - QHash<QString, RSSchannel> hash; // ID/data - QString setprefix; - QTimer *syncTimer; - QNetworkAccessManager *NMAN; - QStringList outstandingURLS; - - - //Simple hash data search functions - QString keyForUrl(QString url); - - //Network request function - void requestRSS(QString url); - - //RSS parsing functions - RSSchannel readRSS(QByteArray bytes); - RSSchannel readRSSChannel(QXmlStreamReader *rss); - RSSitem readRSSItem(QXmlStreamReader *rss); - void readRSSImage(RSSchannel *item, QXmlStreamReader *rss); - QDateTime RSSDateTime(QString datetime); - -private slots: - void replyFinished(QNetworkReply *reply); - void sslErrors(QNetworkReply *reply, const QList<QSslError> &errors); - void checkTimes(); - -signals: - void rssChanged(QString); //ID - void newChannelsAvailable(); -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/systemmonitor/MonitorWidget.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/systemmonitor/MonitorWidget.cpp deleted file mode 100644 index 951bcc98..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/systemmonitor/MonitorWidget.cpp +++ /dev/null @@ -1,63 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "MonitorWidget.h" -#include "ui_MonitorWidget.h" - - -#include <LuminaXDG.h> -#include <LuminaOS.h> - -MonitorWidget::MonitorWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MonitorWidget()){ - ui->setupUi(this); //load the designer form - upTimer = new QTimer(this); - upTimer->setInterval(2000); //update every 2 seconds - connect(upTimer, SIGNAL(timeout()), this, SLOT(UpdateStats()) ); - LoadIcons(); - upTimer->start(); -} - -MonitorWidget::~MonitorWidget(){ - //qDebug() << "Removing MonitorWidget"; -} - -void MonitorWidget::LoadIcons(){ - ui->tabWidget->setTabIcon(0,LXDG::findIcon("appointment-recurring","") ); //Summary - ui->tabWidget->setTabIcon(1,LXDG::findIcon("drive-harddisk","") ); //Disk Usage - //ui->tabWidget->setTabIcon(1,LXDG::findIcon("cpu","") ); //CPU Log - //ui->tabWidget->setTabIcon(2,LXDG::findIcon("media-flash-memory-stick","") ); //Mem Log -} - -void MonitorWidget::UpdateStats(){ - //qDebug() << "Updating System statistics..."; - ui->label_temps->setText( LOS::CPUTemperatures().join(", ") ); - if(ui->progress_cpu->isEnabled()){ - int perc = LOS::CPUUsagePercent(); - ui->progress_cpu->setValue(perc); - if(perc<0){ ui->progress_cpu->setEnabled(false); } //disable this for future checks - } - if(ui->progress_mem->isEnabled()){ - int perc = LOS::MemoryUsagePercent(); - ui->progress_mem->setValue(perc); - if(perc<0){ ui->progress_mem->setEnabled(false); } //disable this for future checks - } - ui->label_diskinfo->setText( LOS::DiskUsage().join("\n") ); - //Also perform/update the logs as necessary - // -- TO DO -- -} - -SysMonitorPlugin::SysMonitorPlugin(QWidget *parent, QString ID) : LDPlugin(parent, ID){ - monitor = new MonitorWidget(this); - this->setLayout( new QVBoxLayout() ); - this->layout()->setContentsMargins(0,0,0,0); - this->layout()->addWidget(monitor); - - //this->setInitialSize(monitor->sizeHint().width(),monitor->sizeHint().height()); -} - -SysMonitorPlugin::~SysMonitorPlugin(){ - //qDebug() << "Remove SysMonitorPlugin"; -}
\ No newline at end of file diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/systemmonitor/MonitorWidget.h b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/systemmonitor/MonitorWidget.h deleted file mode 100644 index 618ac8f4..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/systemmonitor/MonitorWidget.h +++ /dev/null @@ -1,62 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This plugin is a simple hardware status monitor on the desktop -//=========================================== -#ifndef _LUMINA_DESKTOP_PLUGIN_HW_MONITOR_WIDGET_H -#define _LUMINA_DESKTOP_PLUGIN_HW_MONITOR_WIDGET_H - -#include <QTimer> -#include <QWidget> - -#include "../LDPlugin.h" - -namespace Ui{ - class MonitorWidget; -}; - -class MonitorWidget : public QWidget{ - Q_OBJECT -public: - MonitorWidget(QWidget *parent = 0); - ~MonitorWidget(); - -public slots: - void LoadIcons(); - -private: - Ui::MonitorWidget *ui; - QTimer *upTimer; - -private slots: - void UpdateStats(); -}; - -// Wrapper class to put this into a desktop plugin container -class SysMonitorPlugin : public LDPlugin{ - Q_OBJECT -public: - SysMonitorPlugin(QWidget* parent, QString ID); - ~SysMonitorPlugin(); - - virtual QSize defaultPluginSize(){ - // The returned QSize is in grid points (typically 100 or 200 pixels square) - return QSize(3,2); - } - -private: - MonitorWidget *monitor; - -public slots: - void LocaleChange(){ - QTimer::singleShot(0,monitor, SLOT(LoadIcons())); - } - void ThemeChange(){ - QTimer::singleShot(0,monitor, SLOT(LoadIcons())); - } -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/systemmonitor/MonitorWidget.ui b/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/systemmonitor/MonitorWidget.ui deleted file mode 100644 index 8798bc25..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/desktop-plugins/systemmonitor/MonitorWidget.ui +++ /dev/null @@ -1,143 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>MonitorWidget</class> - <widget class="QWidget" name="MonitorWidget"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>300</width> - <height>122</height> - </rect> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="leftMargin"> - <number>2</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="rightMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>2</number> - </property> - <item> - <widget class="QTabWidget" name="tabWidget"> - <property name="currentIndex"> - <number>0</number> - </property> - <widget class="QWidget" name="tab_summary"> - <attribute name="title"> - <string>Summary</string> - </attribute> - <layout class="QFormLayout" name="formLayout"> - <item row="0" column="0"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>CPU Temp:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLabel" name="label_temps"> - <property name="text"> - <string notr="true"/> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string>CPU Usage:</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QProgressBar" name="progress_cpu"> - <property name="value"> - <number>0</number> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_3"> - <property name="text"> - <string>Mem Usage:</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QProgressBar" name="progress_mem"> - <property name="value"> - <number>0</number> - </property> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="tab_disks"> - <attribute name="title"> - <string>Disk I/O</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout"> - <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> - <widget class="QScrollArea" name="scrollArea"> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="widgetResizable"> - <bool>true</bool> - </property> - <widget class="QWidget" name="scrollAreaWidgetContents"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>292</width> - <height>89</height> - </rect> - </property> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <widget class="QLabel" name="label_diskinfo"> - <property name="text"> - <string notr="true"/> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </widget> - </widget> - </item> - </layout> - </widget> - </widget> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/LPPlugin.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/LPPlugin.h deleted file mode 100644 index c4c76297..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/LPPlugin.h +++ /dev/null @@ -1,77 +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 -//=========================================== -// This class is the generic container layout for all panel plugins -// Simply subclass this when creating a new plugin to enable correct -// visibility and usage within a panel -//=========================================== -#ifndef _LUMINA_DESKTOP_PANEL_PLUGIN_H -#define _LUMINA_DESKTOP_PANEL_PLUGIN_H - -#include <QObject> -#include <QWidget> -#include <QString> -#include <QBoxLayout> -#include <QApplication> - -class LPPlugin : public QWidget{ - Q_OBJECT - -private: - QBoxLayout *LY; - QString plugintype; - -public: - LPPlugin(QWidget *parent = 0, QString ptype="unknown", bool horizontal = true) : QWidget(parent){ - plugintype=ptype; - this->setContentsMargins(1,1,1,1); - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); - this->setFocusPolicy(Qt::NoFocus); //no keyboard focus on the panel/plugins - if(horizontal){LY = new QBoxLayout(QBoxLayout::LeftToRight, this); } - else{ LY = new QBoxLayout(QBoxLayout::TopToBottom, this); } - this->setObjectName(ptype.section("---",0,0)); - LY->setContentsMargins(0,0,0,0); - LY->setSpacing(1); - this->setLayout(LY); - connect(QApplication::instance(), SIGNAL(LocaleChanged()), this, SLOT(LocaleChange()) ); - connect(QApplication::instance(), SIGNAL(IconThemeChanged()), this, SLOT(ThemeChange()) ); - } - - ~LPPlugin(){ - } - - QBoxLayout* layout(){ - return LY; - } - - QString type(){ - return plugintype; - } - - virtual void AboutToClose(){ - //This needs to be re-implemented in the subclasses plugin - //This is for any last-minute cleanup before the plugin gets deleted - } - -public slots: - virtual void LocaleChange(){ - //This needs to be re-implemented in the subclassed plugin - //This is where all text is set/translated - } - virtual void ThemeChange(){ - //This needs to be re-implemented in the subclasses plugin - //This is where all the visuals are set if using Theme-dependant icons. - } - virtual void OrientationChange(){ - //This needs to be re-implemented in the subclasses plugin - //This is where any horizontal/vertical orientations can be changed appropriately - } - -signals: - void MenuClosed(); //This needs to be emitted when any plugin's menu is closed for some reason (check/set focus properly) -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/LTBWidget.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/LTBWidget.h deleted file mode 100644 index 560e5811..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/LTBWidget.h +++ /dev/null @@ -1,71 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2013, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_TOOLBAR_WIDGET_H -#define _LUMINA_TOOLBAR_WIDGET_H - -#include <QToolButton> -#include <QEvent> -#include <QWheelEvent> - -#include "Globals.h" -#include <LuminaX11.h> - -class LTBWidget : public QToolButton{ - Q_OBJECT - -private: - LXCB::WINDOWVISIBILITY cstate; - //QString rawstyle; - void updateBackground(){ - //QString background = "background: transparent; "; //default value - //QString border = "border: 1px solid transparent;"; - if(cstate == LXCB::IGNORE){ this->setObjectName(""); } //just use the defaults - else if(cstate == LXCB::VISIBLE){ this->setObjectName("WindowVisible"); }//background = "background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(255, 255, 255, 240), stop:0.505682 rgba(240, 240, 240, 150), stop:1 rgba(210, 210, 210, 55));"; border="border: 1px solid transparent;"; } - else if(cstate == LXCB::INVISIBLE){this->setObjectName("WindowInvisible"); } //background = "background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(215, 215, 215, 240), stop:0.505682 rgba(184, 185, 186, 150), stop:1 rgba(221, 246, 255, 55));"; border="border: 1px solid transparent;"; } - else if(cstate == LXCB::ACTIVE){ this->setObjectName("WindowActive"); }//background= "background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(241, 233, 156, 240), stop:0.355682 rgba(255, 243, 127, 150), stop:1 rgba(221, 246, 255, 55));"; border ="border: 1px solid transparent;"; } - else if(cstate == LXCB::ATTENTION){ this->setObjectName("WindowAttention"); }//background= "background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(252, 187, 127, 240), stop:0.505682 rgba(255, 222, 197, 150), stop:1 rgba(221, 246, 255, 55));"; border="border: 1px solid transparent;"; } - this->setStyleSheet(""); //force the object to re-evaluate the current theme stylesheet and update visuals - //QString raw = rawstyle; - //this->setStyleSheet( raw.replace("%1",background).replace("%2", border) ); - } - -signals: - - void wheelScroll(int change); - -public: - LTBWidget(QWidget* parent) : QToolButton(parent){ - //this->setStyleSheet( this->styleSheet()+" LTBWidget::menu-indicator{image: none;}"); - cstate = LXCB::IGNORE; - - this->setPopupMode(QToolButton::InstantPopup); - this->setAutoRaise(true); - - //rawstyle = "LTBWidget{ %1 %2 border-radius: 5px;} LTBWidget::menu-indicator{image: none;} LTBWidget::hover{ %1 border: 1px solid black; border-radius: 5px; } LTBWidget::menu-button{ background: transparent; width: 15px; } LTBWidget[popupMode=\"1\"]{%1 %2 border-radius: 5px; padding-right: 15px;} LTBWidget[popupMode=\"1\"]::hover{%1 border: 1px solid black; border-radius: 5px; padding-right: 15px}"; - updateBackground(); - } - - ~LTBWidget(){ - } - - void setState(LXCB::WINDOWVISIBILITY newstate){ - cstate = newstate; - updateBackground(); - } - -public slots: - - -protected: - void wheelEvent(QWheelEvent *event){ - int change = event->delta()/120; // 1/15th of a rotation (delta/120) is usually one "click" of the wheel - emit wheelScroll(change); - } - -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/NewPP.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/NewPP.h deleted file mode 100644 index 3a5f6a5b..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/NewPP.h +++ /dev/null @@ -1,82 +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 -//=========================================== -// This class is the interface to load all the different panel plugins -//=========================================== -#ifndef _LUMINA_DESKTOP_NEW_PANEL_PLUGIN_H -#define _LUMINA_DESKTOP_NEW_PANEL_PLUGIN_H - -#include <QDebug> - -//List all the individual plugin includes here -#include "LPPlugin.h" -#include "userbutton/LUserButton.h" -#include "desktopbar/LDeskBar.h" -#include "spacer/LSpacer.h" -#include "line/LLine.h" -#include "clock/LClock.h" -#include "battery/LBattery.h" -#include "desktopswitcher/LDesktopSwitcher.h" -#include "taskmanager/LTaskManagerPlugin.h" -#include "systemdashboard/LSysDashboard.h" -#include "showdesktop/LHomeButton.h" -#include "appmenu/LAppMenuPlugin.h" -#include "applauncher/AppLaunchButton.h" -#include "systemstart/LStartButton.h" -#include "audioplayer/LPAudioPlayer.h" -#include "jsonmenu/PPJsonMenu.h" -//#include "quickcontainer/QuickPPlugin.h" -#include "systemtray/LSysTray.h" //must be last due to X11 compile issues - - -class NewPP{ -public: - static LPPlugin* createPlugin(QString plugin, QWidget* parent = 0, bool horizontal = true){ - LPPlugin *plug = 0; - if(plugin.startsWith("userbutton---")){ - plug = new LUserButtonPlugin(parent, plugin, horizontal); - }else if(plugin.startsWith("homebutton---")){ - plug = new LHomeButtonPlugin(parent, plugin, horizontal); - }else if(plugin.startsWith("desktopbar---")){ - plug = new LDeskBarPlugin(parent, plugin, horizontal); - }else if(plugin.startsWith("spacer---")){ - plug = new LSpacerPlugin(parent, plugin, horizontal); - }else if(plugin.startsWith("line---")){ - plug = new LLinePlugin(parent, plugin, horizontal); - }else if(plugin.startsWith("taskmanager")){ - //This one can be "taskmanager[-nogroups]---" - plug = new LTaskManagerPlugin(parent, plugin, horizontal); - }else if(plugin.startsWith("systemtray---")){ - plug = new LSysTray(parent, plugin, horizontal); - }else if(plugin.startsWith("desktopswitcher---")){ - plug = new LDesktopSwitcher(parent, plugin, horizontal); - }else if(plugin.startsWith("battery---") && LOS::hasBattery()){ - plug = new LBattery(parent, plugin, horizontal); - }else if(plugin.startsWith("clock---")){ - plug = new LClock(parent, plugin, horizontal); - }else if(plugin.startsWith("systemdashboard---")){ - plug = new LSysDashboard(parent, plugin, horizontal); - }else if(plugin.startsWith("appmenu---")){ - plug = new LAppMenuPlugin(parent, plugin, horizontal); - }else if(plugin.startsWith("systemstart---")){ - plug = new LStartButtonPlugin(parent, plugin, horizontal); - }else if(plugin.startsWith("audioplayer---")){ - plug = new LPAudioPlayer(parent, plugin, horizontal); - }else if(plugin.section("::::",0,0)=="jsonmenu" && plugin.split("::::").length()>=3 ){ - plug = new LPJsonMenu(parent, plugin, horizontal); - }else if(plugin.section("---",0,0).section("::",0,0)=="applauncher"){ - plug = new AppLaunchButtonPlugin(parent, plugin, horizontal); - //}else if( plugin.section("---",0,0).startsWith("quick-") && LUtils::validQuickPlugin(plugin.section("---",0,0)) ){ - //plug = new QuickPPlugin(parent, plugin, horizontal); - }else{ - qWarning() << "Invalid Panel Plugin:"<<plugin << " -- Ignored"; - } - return plug; - } - -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/RotateToolButton.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/RotateToolButton.h deleted file mode 100644 index 1c8085f6..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/RotateToolButton.h +++ /dev/null @@ -1,58 +0,0 @@ -//=========================================== -// Lumina Desktop source code -// Copyright (c) 2016, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This is a simple subclass of a QToolButton so it can -// provice text rotated vertically as needed -//=========================================== -#ifndef _LUMINA_DESKTOP_ROTATE_TOOLBUTTON_H -#define _LUMINA_DESKTOP_ROTATE_TOOLBUTTON_H - -#include <QStylePainter> -#include <QStyleOptionToolButton> -#include <QToolButton> -#include <QTransform> - -class RotateToolButton : public QToolButton{ - Q_OBJECT - -private: - int rotate_degrees; - void paintEvent(QPaintEvent*){ - /* NOTE: This is what a standard QToolButton performs (peeked at Qt source code for this tidbit) - QStylePainter p(this); - QStyleOptionToolButton opt; - initStyleOption(&opt); - p.drawComplexControl(QStyle::CC_ToolButton, opt); - */ - QStylePainter p(this); - QStyleOptionToolButton opt; - initStyleOption(&opt); - //Apply the rotation matrix to the painter before starting the paint - QTransform trans = QTransform( p.transform() ).rotate(rotate_degrees); - p.setTransform(trans, false); //merging already taken care of - //Now do the normal painting procedure - p.drawComplexControl(QStyle::CC_ToolButton, opt); - } - -public: - RotateToolButton(QWidget *parent = Q_NULLPTR) : QToolButton(parent){ - rotate_degrees = 0; //no rotation initially - } - - void setRotation(int degrees){ - rotate_degrees = degrees; - this->update(); //trigger a paint event - } - - /*virtual void setText(QString text){ - this->setText(text); - if(rotate_degrees !=0){ - this->setSizeHint( this->sizeHint() - } - }*/ -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/applauncher/AppLaunchButton.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/applauncher/AppLaunchButton.cpp deleted file mode 100644 index 1fd819b5..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/applauncher/AppLaunchButton.cpp +++ /dev/null @@ -1,77 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "AppLaunchButton.h" -#include "../../LSession.h" - -#include <LuminaXDG.h> -#include <LUtils.h> -#include <QInputDialog> - -AppLaunchButtonPlugin::AppLaunchButtonPlugin(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){ - button = new QToolButton(this); - button->setAutoRaise(true); - button->setToolButtonStyle(Qt::ToolButtonIconOnly); - appfile = id.section("---",0,0).section("::",1,1); - if(!QFile::exists(appfile) && appfile.endsWith(".desktop")){ - //might be a relative path - try to find the file - appfile = LUtils::AppToAbsolute(appfile.section("/",-1) ); - } - if(!QFile::exists(appfile)){ appfile.clear(); } - connect(button, SIGNAL(clicked()), this, SLOT(AppClicked())); - this->layout()->setContentsMargins(0,0,0,0); - this->layout()->addWidget(button); - - QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes -} - -AppLaunchButtonPlugin::~AppLaunchButtonPlugin(){ - -} - -void AppLaunchButtonPlugin::updateButtonVisuals(){ - QIcon icon; - QString tooltip = tr("Click to assign an application"); - if(appfile.endsWith(".desktop")){ - XDGDesktop desk(appfile); - if(desk.isValid()){ - icon = LXDG::findIcon(desk.icon, "unknown"); - tooltip = QString(tr("Launch %1")).arg(desk.name); - }else{ - icon = LXDG::findIcon("task-attention",""); - appfile.clear(); - } - }else if(QFile::exists(appfile)){ - icon = LXDG::findMimeIcon(appfile.section("/",-1)); - tooltip = QString(tr("Open %1")).arg(appfile.section("/",-1)); - }else{ - icon = LXDG::findIcon("task-attention", ""); - } - button->setIcon( icon ); - button->setToolTip(tooltip); -} - -// ======================== -// PRIVATE FUNCTIONS -// ======================== -void AppLaunchButtonPlugin::AppClicked(){ - if(appfile.isEmpty()){ - //No App File selected - QList<XDGDesktop*> apps = LSession::handle()->applicationMenu()->currentAppHash()->value("All"); - QStringList names; - for(int i=0; i<apps.length(); i++){ names << apps[i]->name; } - bool ok = false; - QString app = QInputDialog::getItem(this, tr("Select Application"), tr("Name:"), names, 0, false, &ok); - if(!ok || names.indexOf(app)<0){ return; } //cancelled - appfile = apps[ names.indexOf(app) ]->filePath; - //Still need to find a way to set this value persistently - // --- perhaps replace the plugin in the desktop settings file with the new path? - // --- "applauncher::broken---<something>" -> "applauncher::fixed---<something>" ? - QTimer::singleShot(0,this, SLOT(updateButtonVisuals())); - }else{ - LSession::LaunchApplication("lumina-open \""+appfile+"\""); - } -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/applauncher/AppLaunchButton.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/applauncher/AppLaunchButton.h deleted file mode 100644 index 3aa3c7ad..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/applauncher/AppLaunchButton.h +++ /dev/null @@ -1,63 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This panel plugin is a simple button to launch a single application -//=========================================== -#ifndef _LUMINA_DESKTOP_LAUNCH_APP_PANEL_PLUGIN_H -#define _LUMINA_DESKTOP_LAUNCH_APP_PANEL_PLUGIN_H - -// Qt includes -#include <QToolButton> -#include <QString> -#include <QWidget> - - -// Lumina-desktop includes -#include "../LPPlugin.h" //main plugin widget - -// libLumina includes -#include "LuminaXDG.h" - -// PANEL PLUGIN BUTTON -class AppLaunchButtonPlugin : public LPPlugin{ - Q_OBJECT - -public: - AppLaunchButtonPlugin(QWidget *parent = 0, QString id = "applauncher", bool horizontal=true); - ~AppLaunchButtonPlugin(); - -private: - QToolButton *button; - QString appfile; - - void updateButtonVisuals(); - -private slots: - void AppClicked(); - -public slots: - void OrientationChange(){ - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); - button->setIconSize( QSize(this->height(), this->height()) ); - }else{ - this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); - button->setIconSize( QSize(this->width(), this->width()) ); - } - this->layout()->update(); - updateButtonVisuals(); - } - - void LocaleChange(){ - updateButtonVisuals(); - } - - void ThemeChange(){ - updateButtonVisuals(); - } -}; - -#endif
\ No newline at end of file diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/appmenu/LAppMenuPlugin.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/appmenu/LAppMenuPlugin.cpp deleted file mode 100644 index e3be55c2..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/appmenu/LAppMenuPlugin.cpp +++ /dev/null @@ -1,142 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "LAppMenuPlugin.h" -#include "../../LSession.h" - -#include <LuminaXDG.h> - -LAppMenuPlugin::LAppMenuPlugin(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){ - button = new QToolButton(this); - button->setAutoRaise(true); - button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - mainmenu = new QMenu(this); - button->setMenu( mainmenu ); - button->setPopupMode(QToolButton::InstantPopup); - this->layout()->setContentsMargins(0,0,0,0); - this->layout()->addWidget(button); - - connect(mainmenu, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed())); - connect(mainmenu, SIGNAL(triggered(QAction*)), this, SLOT(LaunchItem(QAction*)) ); - connect(LSession::handle()->applicationMenu(), SIGNAL(AppMenuUpdated()), this, SLOT(UpdateMenu())); - QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes - QTimer::singleShot(0,this, SLOT(UpdateMenu()) ); - //Setup the global shortcut handling for opening the start menu - connect(QApplication::instance(), SIGNAL(StartButtonActivated()), this, SLOT(shortcutActivated()) ); - LSession::handle()->registerStartButton(this->type()); -} - -LAppMenuPlugin::~LAppMenuPlugin(){ - -} - -void LAppMenuPlugin::updateButtonVisuals(){ - button->setToolTip( tr("Quickly launch applications or open files")); - button->setText( tr("Applications") ); - //Use the TrueOS icon by default (or the Lumina icon for non-TrueOS systems) - button->setIcon( LXDG::findIcon("start-here-lumina","Lumina-DE") ); -} - -// ======================== -// PRIVATE FUNCTIONS -// ======================== -void LAppMenuPlugin::shortcutActivated(){ - if(LSession::handle()->registerStartButton(this->type())){ - if(button->menu()->isVisible()){ button->menu()->hide(); } - else{ button->showMenu(); } - } -} - -void LAppMenuPlugin::LaunchItem(QAction* item){ - QString appFile = item->whatsThis(); - if(appFile.startsWith("internal::")){ - appFile = appFile.section("::",1,50); //cut off the "internal" flag - if(appFile=="logout"){ LSession::handle()->systemWindow(); } - }else if(!appFile.isEmpty()){ - LSession::LaunchApplication("lumina-open "+appFile); - } -} - -void LAppMenuPlugin::UpdateMenu(){ - mainmenu->clear(); - QHash<QString, QList<XDGDesktop*> > *HASH = LSession::handle()->applicationMenu()->currentAppHash(); - //Now Re-create the menu (orignally copied from the AppMenu class) - //Add link to the file manager - QAction *tmpact = mainmenu->addAction( LXDG::findIcon("user-home", ""), tr("Browse Files") ); - tmpact->setWhatsThis("\""+QDir::homePath()+"\""); - //--Look for the app store - XDGDesktop store(LOS::AppStoreShortcut()); - if(store.isValid()){ - tmpact = mainmenu->addAction( LXDG::findIcon(store.icon, ""), tr("Install Applications") ); - tmpact->setWhatsThis("\""+store.filePath+"\""); - } - //--Look for the control panel - XDGDesktop controlp(LOS::ControlPanelShortcut()); - if(controlp.isValid()){ - tmpact = mainmenu->addAction( LXDG::findIcon(controlp.icon, ""), tr("Control Panel") ); - tmpact->setWhatsThis("\""+controlp.filePath+"\""); - } - mainmenu->addSeparator(); - //--Now create the sub-menus - QStringList cats = HASH->keys(); - cats.sort(); //make sure they are alphabetical - for(int i=0; i<cats.length(); i++){ - //Make sure they are translated and have the right icons - QString name, icon; - if(cats[i]=="All"){continue; } //skip this listing for the menu - else if(cats[i] == "Multimedia"){ name = tr("Multimedia"); icon = "applications-multimedia"; } - else if(cats[i] == "Development"){ name = tr("Development"); icon = "applications-development"; } - else if(cats[i] == "Education"){ name = tr("Education"); icon = "applications-education"; } - else if(cats[i] == "Game"){ name = tr("Games"); icon = "applications-games"; } - else if(cats[i] == "Graphics"){ name = tr("Graphics"); icon = "applications-graphics"; } - else if(cats[i] == "Network"){ name = tr("Network"); icon = "applications-internet"; } - else if(cats[i] == "Office"){ name = tr("Office"); icon = "applications-office"; } - else if(cats[i] == "Science"){ name = tr("Science"); icon = "applications-science"; } - else if(cats[i] == "Settings"){ name = tr("Settings"); icon = "preferences-system"; } - else if(cats[i] == "System"){ name = tr("System"); icon = "applications-system"; } - else if(cats[i] == "Utility"){ name = tr("Utility"); icon = "applications-utilities"; } - else if(cats[i] == "Wine"){ name = tr("Wine"); icon = "wine"; } - else{ name = tr("Unsorted"); icon = "applications-other"; } - - QMenu *menu = new QMenu(name, this); - menu->setIcon(LXDG::findIcon(icon,"")); - QList<XDGDesktop*> appL = HASH->value(cats[i]); - for( int a=0; a<appL.length(); a++){ - if(appL[a]->actions.isEmpty()){ - //Just a single entry point - no extra actions - QAction *act = new QAction(LXDG::findIcon(appL[a]->icon, ""), appL[a]->name, menu); - act->setToolTip(appL[a]->comment); - act->setWhatsThis("\""+appL[a]->filePath+"\""); - menu->addAction(act); - }else{ - //This app has additional actions - make this a sub menu - // - first the main menu/action - QMenu *submenu = new QMenu(appL[a]->name, menu); - submenu->setIcon( LXDG::findIcon(appL[a]->icon,"") ); - //This is the normal behavior - not a special sub-action (although it needs to be at the top of the new menu) - QAction *act = new QAction(LXDG::findIcon(appL[a]->icon, ""), appL[a]->name, submenu); - act->setToolTip(appL[a]->comment); - act->setWhatsThis(appL[a]->filePath); - submenu->addAction(act); - //Now add entries for every sub-action listed - for(int sa=0; sa<appL[a]->actions.length(); sa++){ - QAction *sact = new QAction(LXDG::findIcon(appL[a]->actions[sa].icon, appL[a]->icon), appL[a]->actions[sa].name, this); - sact->setToolTip(appL[a]->comment); - sact->setWhatsThis("-action \""+appL[a]->actions[sa].ID+"\" \""+appL[a]->filePath+"\""); - submenu->addAction(sact); - } - menu->addMenu(submenu); - } - }//end loop over apps within this category - mainmenu->addMenu(menu); - } //end loop over categories - //Now add any logout options - mainmenu->addSeparator(); - //QMenu *tmpmenu = mainmenu->addMenu(LXDG::findIcon("system-log-out",""), tr("Leave")); - tmpact =mainmenu->addAction(LXDG::findIcon("system-log-out"),tr("Leave")); - tmpact->setWhatsThis("internal::logout"); - -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/appmenu/LAppMenuPlugin.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/appmenu/LAppMenuPlugin.h deleted file mode 100644 index 659d781f..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/appmenu/LAppMenuPlugin.h +++ /dev/null @@ -1,64 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This panel plugin is a re-creation of the classic "start" menu -//=========================================== -#ifndef _LUMINA_DESKTOP_APP_MENU_PANEL_PLUGIN_H -#define _LUMINA_DESKTOP_APP_MENU_PANEL_PLUGIN_H - -// Qt includes -#include <QMenu> -#include <QToolButton> -#include <QString> -#include <QWidget> - - -// Lumina-desktop includes -#include "../LPPlugin.h" //main plugin widget - - -// PANEL PLUGIN BUTTON -class LAppMenuPlugin : public LPPlugin{ - Q_OBJECT - -public: - LAppMenuPlugin(QWidget *parent = 0, QString id = "appmenu", bool horizontal=true); - ~LAppMenuPlugin(); - -private: - QToolButton *button; - QMenu *mainmenu; - - void updateButtonVisuals(); - -private slots: - void shortcutActivated(); - void LaunchItem(QAction* item); - void UpdateMenu(); - -public slots: - void OrientationChange(){ - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); - button->setIconSize( QSize(this->height(), this->height()) ); - }else{ - this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); - button->setIconSize( QSize(this->width(), this->width()) ); - } - this->layout()->update(); - updateButtonVisuals(); - } - - void LocaleChange(){ - updateButtonVisuals(); - } - - void ThemeChange(){ - updateButtonVisuals(); - } -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/audioplayer/LPAudioPlayer.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/audioplayer/LPAudioPlayer.cpp deleted file mode 100644 index 5669aaf5..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/audioplayer/LPAudioPlayer.cpp +++ /dev/null @@ -1,30 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2014, Susanne Jaeckel -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "LPAudioPlayer.h" -#include "LSession.h" - -LPAudioPlayer::LPAudioPlayer(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){ - //Setup the button - button = new QToolButton(this); - button->setAutoRaise(true); - button->setToolButtonStyle(Qt::ToolButtonIconOnly); - button->setPopupMode(QToolButton::InstantPopup); //make sure it runs the update routine first - //connect(button, SIGNAL(clicked()), this, SLOT(openMenu())); - this->layout()->setContentsMargins(0,0,0,0); - this->layout()->addWidget(button); - wact = new QWidgetAction(this); - aplayer = new PPlayerWidget(this); - button ->setMenu(new QMenu(this) ); - wact->setDefaultWidget(aplayer); - button->menu()->addAction(wact); - //Now start up the widgets - button->setIcon( LXDG::findIcon("audio-volume-high","") ); - QTimer::singleShot(0,this,SLOT(OrientationChange()) ); //update the sizing/icon -} - -LPAudioPlayer::~LPAudioPlayer(){ -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/audioplayer/LPAudioPlayer.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/audioplayer/LPAudioPlayer.h deleted file mode 100644 index e5132b1f..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/audioplayer/LPAudioPlayer.h +++ /dev/null @@ -1,49 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2016, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_PANEL_AUDIO_PLAYER_PLUGIN_H -#define _LUMINA_PANEL_AUDIO_PLAYER_PLUGIN_H - -#include "../../Globals.h" -#include "../LTBWidget.h" -#include "../LPPlugin.h" -#include "PPlayerWidget.h" - -class LPAudioPlayer : public LPPlugin{ - Q_OBJECT -public: - LPAudioPlayer(QWidget *parent = 0, QString id = "audioplayer", bool horizontal=true); - ~LPAudioPlayer(); - -private: - QToolButton *button; - QWidgetAction *wact; - PPlayerWidget *aplayer; - - //int iconOld; - -private slots: - //void updateBattery(bool force = false); - //QString getRemainingTime(); - -public slots: - void LocaleChange(){ - //updateBattery(true); - } - - void OrientationChange(){ - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); - button->setIconSize( QSize(this->height(), this->height()) ); - }else{ - this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); - button->setIconSize( QSize(this->width(), this->width()) ); - } - this->layout()->update(); - } -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/audioplayer/PPlayerWidget.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/audioplayer/PPlayerWidget.cpp deleted file mode 100644 index 023e20c7..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/audioplayer/PPlayerWidget.cpp +++ /dev/null @@ -1,258 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "PPlayerWidget.h" -#include "ui_PPlayerWidget.h" - -#include <QDir> -#include <QUrl> -#include <QInputDialog> -#include <QFileDialog> -#include <LuminaXDG.h> -#include <QDebug> -#include <QDesktopWidget> - -PPlayerWidget::PPlayerWidget(QWidget *parent) : QWidget(parent), ui(new Ui::PPlayerWidget()){ - ui->setupUi(this); //load the designer form - PLAYER = new QMediaPlayer(this); - PLAYER->setVolume(100); - PLAYER->setNotifyInterval(1000); //1 second interval (just needs to be a rough estimate) - PLAYLIST = new QMediaPlaylist(this); - PLAYLIST->setPlaybackMode(QMediaPlaylist::Sequential); - PLAYER->setPlaylist(PLAYLIST); - - configMenu = new QMenu(this); - ui->tool_config->setMenu(configMenu); - addMenu = new QMenu(this); - ui->tool_add->setMenu(addMenu); - - updatinglists = false; //start off as false - - ui->combo_playlist->setContextMenuPolicy(Qt::NoContextMenu); - - LoadIcons(); - playerStateChanged(); //update button visibility - currentSongChanged(); - //Connect all the signals/slots - //connect(infoTimer, SIGNAL(timeout()), this, SLOT(rotateTrackInfo()) ); - connect(PLAYER, SIGNAL(positionChanged(qint64)),this, SLOT(updateProgress(qint64)) ); - connect(PLAYER, SIGNAL(durationChanged(qint64)), this, SLOT(updateMaxProgress(qint64)) ); - connect(PLAYLIST, SIGNAL(mediaChanged(int, int)), this, SLOT(playlistChanged()) ); - connect(PLAYER, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(playerStateChanged()) ); - connect(PLAYLIST, SIGNAL(currentMediaChanged(const QMediaContent&)), this, SLOT(currentSongChanged()) ); - connect(ui->combo_playlist, SIGNAL(currentIndexChanged(int)), this, SLOT(userlistSelectionChanged()) ); - connect(ui->tool_play, SIGNAL(clicked()), this, SLOT(playClicked()) ); - connect(ui->tool_pause, SIGNAL(clicked()), this, SLOT(pauseClicked()) ); - connect(ui->tool_stop, SIGNAL(clicked()), this, SLOT(stopClicked()) ); - connect(ui->tool_next, SIGNAL(clicked()), this, SLOT(nextClicked()) ); - connect(ui->tool_prev, SIGNAL(clicked()), this, SLOT(prevClicked()) ); - -} - -PPlayerWidget::~PPlayerWidget(){ - //qDebug() << "Removing PPlayerWidget"; -} - -void PPlayerWidget::LoadIcons(){ - ui->tool_stop->setIcon( LXDG::findIcon("media-playback-stop","") ); - ui->tool_play->setIcon( LXDG::findIcon("media-playback-start","") ); - ui->tool_pause->setIcon( LXDG::findIcon("media-playback-pause","") ); - ui->tool_next->setIcon( LXDG::findIcon("media-skip-forward","") ); - ui->tool_prev->setIcon( LXDG::findIcon("media-skip-backward","") ); - ui->tool_add->setIcon( LXDG::findIcon("list-add","") ); - ui->tool_config->setIcon( LXDG::findIcon("configure","") ); - //Now re-assemble the menus as well - configMenu->clear(); - configMenu->addAction(LXDG::findIcon("media-eject",""), tr("Clear Playlist"), this, SLOT(ClearPlaylist())); - configMenu->addAction(LXDG::findIcon("roll",""), tr("Shuffle Playlist"), this, SLOT(ShufflePlaylist())); - addMenu->clear(); - addMenu->addAction(LXDG::findIcon("document-new",""), tr("Add Files"), this, SLOT(AddFilesToPlaylist())); - addMenu->addAction(LXDG::findIcon("folder-new",""), tr("Add Directory"), this, SLOT(AddDirToPlaylist())); - addMenu->addAction(LXDG::findIcon("download",""), tr("Add URL"), this, SLOT(AddURLToPlaylist())); -} - -void PPlayerWidget::playClicked(){ - PLAYER->play(); -} - -void PPlayerWidget::pauseClicked(){ - PLAYER->pause(); -} - -void PPlayerWidget::stopClicked(){ - PLAYER->stop(); -} - -void PPlayerWidget::nextClicked(){ - PLAYLIST->next(); -} - -void PPlayerWidget::prevClicked(){ - PLAYLIST->previous(); -} - -void PPlayerWidget::AddFilesToPlaylist(){ - //Prompt the user to select multimedia files - QFileDialog dlg(0, Qt::Dialog | Qt::WindowStaysOnTopHint ); - dlg.setFileMode(QFileDialog::ExistingFiles); - dlg.setAcceptMode(QFileDialog::AcceptOpen); - dlg.setNameFilter( tr("Multimedia Files")+" ("+LXDG::findAVFileExtensions().join(" ")+")"); - dlg.setWindowTitle(tr("Select Multimedia Files")); - dlg.setWindowIcon( LXDG::findIcon("file-open","") ); - dlg.setDirectory(QDir::homePath()); //start in the home directory - //ensure it is centered on the current screen - QPoint center = QApplication::desktop()->screenGeometry(this).center(); - dlg.move( center.x()-(dlg.width()/2), center.y()-(dlg.height()/2) ); - dlg.show(); - while( dlg.isVisible() ){ - QApplication::processEvents(); - } - QList<QUrl> files = dlg.selectedUrls(); - if(files.isEmpty() || dlg.result()!=QDialog::Accepted){ return; } //cancelled - //Make this use show/processEvents later - //QList<QUrl> files = QFileDialog::getOpenFileUrls(0, tr("Select Multimedia Files"), QDir::homePath(), "Multimedia Files ("+LXDG::findAVFileExtensions().join(" ")+")"); - QList<QMediaContent> urls; - for(int i=0; i<files.length(); i++){ - urls << QMediaContent(files[i]); - } - PLAYLIST->addMedia(urls); - playlistChanged(); -} - -void PPlayerWidget::AddDirToPlaylist(){ - QFileDialog dlg(0, Qt::Dialog | Qt::WindowStaysOnTopHint ); - dlg.setFileMode(QFileDialog::Directory); - dlg.setOption(QFileDialog::ShowDirsOnly, true); - dlg.setAcceptMode(QFileDialog::AcceptOpen); - dlg.setWindowTitle(tr("Select Multimedia Directory")); - dlg.setWindowIcon( LXDG::findIcon("folder-open","") ); - dlg.setDirectory(QDir::homePath()); //start in the home directory - //ensure it is centered on the current screen - QPoint center = QApplication::desktop()->screenGeometry(this).center(); - dlg.move( center.x()-(dlg.width()/2), center.y()-(dlg.height()/2) ); - dlg.show(); - while( dlg.isVisible() ){ - QApplication::processEvents(); - } - if(dlg.result() != QDialog::Accepted){ return; } //cancelled - QStringList sel = dlg.selectedFiles(); - if(sel.isEmpty()){ return; } //cancelled - QString dirpath = sel.first(); //QFileDialog::getExistingDirectory(0, tr("Select a Multimedia Directory"), QDir::homePath() ); - if(dirpath.isEmpty()){ return; } //cancelled - QDir dir(dirpath); - QFileInfoList files = dir.entryInfoList(LXDG::findAVFileExtensions(), QDir::Files | QDir::NoDotAndDotDot, QDir::Name); - if(files.isEmpty()){ return; } //nothing in this directory - QList<QMediaContent> urls; - for(int i=0; i<files.length(); i++){ - urls << QMediaContent(QUrl::fromLocalFile(files[i].absoluteFilePath()) ); - } - PLAYLIST->addMedia(urls); - playlistChanged(); -} - -void PPlayerWidget::AddURLToPlaylist(){ - QInputDialog dlg(0, Qt::Dialog | Qt::WindowStaysOnTopHint ); - dlg.setInputMode(QInputDialog::TextInput); - dlg.setLabelText(tr("Enter a valid URL for a multimedia file or stream:")); - dlg.setTextEchoMode(QLineEdit::Normal); - dlg.setWindowTitle(tr("Multimedia URL")); - dlg.setWindowIcon( LXDG::findIcon("download","") ); - //ensure it is centered on the current screen - QPoint center = QApplication::desktop()->screenGeometry(this).center(); - dlg.move( center.x()-(dlg.width()/2), center.y()-(dlg.height()/2) ); - dlg.show(); - while( dlg.isVisible() ){ - QApplication::processEvents(); - } - QString url = dlg.textValue(); - if(url.isEmpty() || dlg.result()!=QDialog::Accepted){ return; } //cancelled - - //QString url = QInputDialog::getText(0, tr("Multimedia URL"), tr("Enter a valid URL for a multimedia file or stream"), QLineEdit::Normal); - //if(url.isEmpty()){ return; } - QUrl newurl(url); - if(!newurl.isValid()){ return; } //invalid URL - PLAYLIST->addMedia(newurl); - playlistChanged(); -} - -void PPlayerWidget::ClearPlaylist(){ - PLAYER->stop(); - PLAYLIST->clear(); - playlistChanged(); -} - -void PPlayerWidget::ShufflePlaylist(){ - PLAYLIST->shuffle(); -} - - -void PPlayerWidget::userlistSelectionChanged(){ //front-end combobox was changed by the user - if(updatinglists){ return; } - PLAYLIST->setCurrentIndex( ui->combo_playlist->currentIndex() ); -} - -void PPlayerWidget::playerStateChanged(){ - switch( PLAYER->state() ){ - case QMediaPlayer::StoppedState: - ui->tool_stop->setVisible(false); - ui->tool_play->setVisible(true); - ui->tool_pause->setVisible(false); - ui->progressBar->setVisible(false); - break; - case QMediaPlayer::PausedState: - ui->tool_stop->setVisible(true); - ui->tool_play->setVisible(true); - ui->tool_pause->setVisible(false); - ui->progressBar->setVisible(true); - break; - case QMediaPlayer::PlayingState: - ui->tool_stop->setVisible(true); - ui->tool_play->setVisible(false); - ui->tool_pause->setVisible(true); - ui->progressBar->setVisible(true); - break; - } - -} - -void PPlayerWidget::playlistChanged(){ - updatinglists = true; - ui->combo_playlist->clear(); - for(int i=0; i<PLAYLIST->mediaCount(); i++){ - QUrl url = PLAYLIST->media(i).canonicalUrl(); - if(url.isLocalFile()){ - ui->combo_playlist->addItem(LXDG::findMimeIcon(url.fileName().section(".",-1)), url.fileName() ); - }else{ - ui->combo_playlist->addItem(LXDG::findIcon("download",""), url.toString() ); - } - } - if(PLAYLIST->currentIndex()<0 && PLAYLIST->mediaCount()>0){ PLAYLIST->setCurrentIndex(0); } - ui->combo_playlist->setCurrentIndex(PLAYLIST->currentIndex()); - - updatinglists = false; -} - -void PPlayerWidget::currentSongChanged(){ - if(PLAYLIST->currentIndex() != ui->combo_playlist->currentIndex()){ - updatinglists = true; - ui->combo_playlist->setCurrentIndex(PLAYLIST->currentIndex()); - updatinglists = false; - } - ui->tool_next->setEnabled( PLAYLIST->nextIndex() >= 0 ); - ui->tool_prev->setEnabled( PLAYLIST->previousIndex() >= 0); - ui->label_num->setText( QString::number( PLAYLIST->currentIndex()+1)+"/"+QString::number(PLAYLIST->mediaCount()) ); - ui->progressBar->setRange(0, PLAYER->duration() ); - ui->progressBar->setValue(0); -} - -void PPlayerWidget::updateProgress(qint64 val){ - //qDebug() << "Update Progress Bar:" << val; - ui->progressBar->setValue(val); -} - -void PPlayerWidget::updateMaxProgress(qint64 val){ - ui->progressBar->setRange(0,val); -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/audioplayer/PPlayerWidget.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/audioplayer/PPlayerWidget.h deleted file mode 100644 index a551d74f..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/audioplayer/PPlayerWidget.h +++ /dev/null @@ -1,59 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This plugin is a simple audio player on the desktop -//=========================================== -#ifndef _LUMINA_PANEL_PLUGIN_AUDIO_PLAYER_WIDGET_H -#define _LUMINA_PANEL_PLUGIN_AUDIO_PLAYER_WIDGET_H - -#include <QMediaPlaylist> -#include <QMediaPlayer> -#include <QTimer> -#include <QWidget> -#include <QMenu> - - -namespace Ui{ - class PPlayerWidget; -}; - -class PPlayerWidget : public QWidget{ - Q_OBJECT -public: - PPlayerWidget(QWidget *parent = 0); - ~PPlayerWidget(); - -public slots: - void LoadIcons(); - -private: - Ui::PPlayerWidget *ui; - QMediaPlaylist *PLAYLIST; - QMediaPlayer *PLAYER; - QMenu *configMenu, *addMenu; - bool updatinglists; - -private slots: - void playClicked(); - void pauseClicked(); - void stopClicked(); - void nextClicked(); - void prevClicked(); - - void AddFilesToPlaylist(); - void AddDirToPlaylist(); - void AddURLToPlaylist(); - void ClearPlaylist(); - void ShufflePlaylist(); - void userlistSelectionChanged(); //front-end combobox was changed by the user - void playerStateChanged(); - void playlistChanged(); //list of items changed - void currentSongChanged(); - void updateProgress(qint64 val); - void updateMaxProgress(qint64 val); -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/audioplayer/PPlayerWidget.ui b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/audioplayer/PPlayerWidget.ui deleted file mode 100644 index 2d2450be..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/audioplayer/PPlayerWidget.ui +++ /dev/null @@ -1,182 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>PPlayerWidget</class> - <widget class="QWidget" name="PPlayerWidget"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>346</width> - <height>90</height> - </rect> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <property name="styleSheet"> - <string notr="true">QToolButton::menu-indicator{ image: none; }</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="spacing"> - <number>4</number> - </property> - <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_2"> - <item> - <widget class="QToolButton" name="tool_config"> - <property name="text"> - <string notr="true">Config</string> - </property> - <property name="popupMode"> - <enum>QToolButton::InstantPopup</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_add"> - <property name="text"> - <string notr="true">Add</string> - </property> - <property name="popupMode"> - <enum>QToolButton::InstantPopup</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <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="QToolButton" name="tool_prev"> - <property name="text"> - <string notr="true">prev</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_num"> - <property name="text"> - <string notr="true">1/10</string> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_next"> - <property name="text"> - <string notr="true">next</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QComboBox" name="combo_playlist"/> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QToolButton" name="tool_play"> - <property name="text"> - <string notr="true">Play</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_pause"> - <property name="text"> - <string notr="true">Pause</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_stop"> - <property name="text"> - <string notr="true">Stop</string> - </property> - <property name="autoRaise"> - <bool>true</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> - <item> - <widget class="QProgressBar" name="progressBar"> - <property name="value"> - <number>24</number> - </property> - <property name="textVisible"> - <bool>false</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>0</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/battery/LBattery.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/battery/LBattery.cpp deleted file mode 100644 index ee379613..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/battery/LBattery.cpp +++ /dev/null @@ -1,115 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2014, Susanne Jaeckel, 2015-2016 Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "LBattery.h" -#include "LSession.h" - -LBattery::LBattery(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){ - iconOld = -1; - //Setup the widget - label = new QLabel(this); - label->setScaledContents(true); - //label->setAlignment(Qt::AlignCenter); - this->layout()->addWidget(label); - //Setup the timer - timer = new QTimer(); - timer->setInterval(5000); //update every 5 seconds - connect(timer,SIGNAL(timeout()), this, SLOT(updateBattery()) ); - timer->start(); - QTimer::singleShot(0,this,SLOT(OrientationChange()) ); //update the sizing/icon -} - -LBattery::~LBattery(){ - timer->stop(); - delete timer; -} - -void LBattery::updateBattery(bool force){ - // Get current state of charge - //QStringList result = LUtils::getCmdOutput("/usr/sbin/apm", QStringList() << "-al"); - int charge = LOS::batteryCharge(); //result.at(1).toInt(); -//qDebug() << "1: " << result.at(0).toInt() << " 2: " << result.at(1).toInt(); - int icon = -1; - if (charge > 90) { icon = 4; } - else if (charge > 70) { icon = 3; } - else if (charge > 20) { icon = 2; } - else if (charge > 5) { icon = 1; } - else if (charge > 0 ) { icon = 0; } - if(LOS::batteryIsCharging()){ icon = icon+10; } - //icon = icon + result.at(0).toInt() * 10; - if (icon != iconOld || force) { - switch (icon) { - case 0: - label->setPixmap( LXDG::findIcon("battery-caution", "").pixmap(label->size()) ); - break; - case 1: - label->setPixmap( LXDG::findIcon("battery-040", "").pixmap(label->size()) ); - break; - case 2: - label->setPixmap( LXDG::findIcon("battery-060", "").pixmap(label->size()) ); - break; - case 3: - label->setPixmap( LXDG::findIcon("battery-080", "").pixmap(label->size()) ); - break; - case 4: - label->setPixmap( LXDG::findIcon("battery-100", "").pixmap(label->size()) ); - break; - case 10: - label->setPixmap( LXDG::findIcon("battery-charging-caution", "").pixmap(label->size()) ); - break; - case 11: - label->setPixmap( LXDG::findIcon("battery-charging-040", "").pixmap(label->size()) ); - break; - case 12: - label->setPixmap( LXDG::findIcon("battery-charging-060", "").pixmap(label->size()) ); - break; - case 13: - label->setPixmap( LXDG::findIcon("battery-charging-080", "").pixmap(label->size()) ); - break; - case 14: - label->setPixmap( LXDG::findIcon("battery-charging", "").pixmap(label->size()) ); - break; - default: - label->setPixmap( LXDG::findIcon("battery-missing", "").pixmap(label->size()) ); - break; - } - if(icon<iconOld && icon==0){ - //Play some audio warning chime when - LSession::handle()->playAudioFile(LOS::LuminaShare()+"low-battery.ogg"); - } - if(icon==0){ label->setStyleSheet("QLabel{ background: red;}"); } - else if(icon==14 && charge>98){ label->setStyleSheet("QLabel{ background: green;}"); } - else{ label->setStyleSheet("QLabel{ background: transparent;}"); } - iconOld = icon; - - } - //Now update the display - QString tt; - //Make sure the tooltip can be properly translated as necessary (Ken Moore 5/9/14) - if(icon > 9 && icon < 15){ tt = QString(tr("%1 % (Charging)")).arg(QString::number(charge)); } - else{ tt = QString( tr("%1 % (%2 Remaining)") ).arg(QString::number(charge), getRemainingTime() ); } - label->setToolTip(tt); -} - -QString LBattery::getRemainingTime(){ - int secs = LOS::batterySecondsLeft(); - if(secs < 0){ return "??"; } - QString rem; //remaining - if(secs > 3600){ - int hours = secs/3600; - rem.append( QString::number(hours)+"h "); - secs = secs - (hours*3600); - } - if(secs > 60){ - int min = secs/60; - rem.append( QString::number(min)+"m "); - secs = secs - (min*60); - } - if(secs > 0){ - rem.append(QString::number(secs)+"s"); - } - return rem; -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/battery/LBattery.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/battery/LBattery.h deleted file mode 100644 index 29562d5d..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/battery/LBattery.h +++ /dev/null @@ -1,53 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2014, Susanne Jaeckel -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_DESKTOP_BATTERY_H -#define _LUMINA_DESKTOP_BATTERY_H - -#include <QTimer> -#include <QWidget> -#include <QString> -#include <QLabel> - -#include <LUtils.h> -#include <LuminaXDG.h> -#include <LuminaOS.h> - -#include "../../Globals.h" -//#include "../LTBWidget.h" -#include "../LPPlugin.h" - -class LBattery : public LPPlugin{ - Q_OBJECT -public: - LBattery(QWidget *parent = 0, QString id = "battery", bool horizontal=true); - ~LBattery(); - -private: - QTimer *timer; - QLabel *label; - int iconOld; - -private slots: - void updateBattery(bool force = false); - QString getRemainingTime(); - -public slots: - void LocaleChange(){ - updateBattery(true); - } - - void OrientationChange(){ - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - label->setFixedSize( QSize(this->height(), this->height()) ); - }else{ - label->setFixedSize( QSize(this->width(), this->width()) ); - } - updateBattery(true); //force icon refresh - } -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/battery/NOTES b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/battery/NOTES deleted file mode 100644 index 3d93267e..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/battery/NOTES +++ /dev/null @@ -1,49 +0,0 @@ -Eventuell mit einem Menü implementieren, mit Einträgen für: -Anzeige des kompletten Status und Infos -Herunterfahren des Systems etc. - -apm -a - Zeigt den AC line status an - 0 = off-line - 1 = on-line - 2 = backup-power - -apm -b - Zeigt - 0 = high - 1 = low - 2 = critical - 3 = charging - -apm -l - Zeit die prozentuale Kapazitaet - 255 = nicht unterstuetzt - -apm -t - Zeigt die verbleibende Zeit in Sekunden - -Aufruf Systemfunktionen: LUtils.h - -mit der Methode: -QStringList LUtils::getCmdOutput(QString cmd, QStringList args) - -Icons: -/usr/local/share/icons/oxygen/22x22/status -oder unter: -/usr/local/share/icons/oxygen/16x16/status - -battery-040.png // 40 % -battery-060.png -battery-080.png -battery-100.png - -battery-caution.png -battery-charging.png -battery-charging-040.png -battery-charging-060.png -battery-charging-080.png -battery-charging-caution.png - -battery-charging-log.png -battery-log.png -battery-missing.png diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/clock/LClock.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/clock/LClock.cpp deleted file mode 100644 index b370c536..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/clock/LClock.cpp +++ /dev/null @@ -1,230 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2012-2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "LClock.h" -#include "LSession.h" -#include <LuminaThemes.h> -#include <LuminaXDG.h> - -LClock::LClock(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){ - button = new QToolButton(this); //RotateToolButton(this); - button->setAutoRaise(true); - button->setToolButtonStyle(Qt::ToolButtonTextOnly); - button->setStyleSheet("font-weight: bold;"); - button->setPopupMode(QToolButton::DelayedPopup); //make sure it runs the update routine first - button->setMenu(new QMenu()); - //button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); - //this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); - connect(button, SIGNAL(clicked()), this, SLOT(openMenu())); - connect(button->menu(), SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed())); - calendar = new QCalendarWidget(this); - calAct = new QWidgetAction(this); - calAct->setDefaultWidget(calendar); - TZMenu = new QMenu(this); - connect(TZMenu, SIGNAL(triggered(QAction*)), this, SLOT(ChangeTZ(QAction*)) ); - - //Now assemble the menu - button->menu()->addAction(calAct); - button->menu()->addMenu(TZMenu); - - this->layout()->setContentsMargins(0,0,0,0); //reserve some space on left/right - this->layout()->addWidget(button); - - //Setup the timer - timer = new QTimer(); - //Load all the initial settings - updateFormats(); - LocaleChange(); - ThemeChange(); - OrientationChange(); - //Now connect/start the timer - connect(timer,SIGNAL(timeout()), this, SLOT(updateTime()) ); - connect(QApplication::instance(), SIGNAL(SessionConfigChanged()), this, SLOT(updateFormats()) ); - timer->start(); -} - -LClock::~LClock(){ - timer->stop(); - delete timer; -} - - -void LClock::updateTime(bool adjustformat){ - QDateTime CT = QDateTime::currentDateTime(); - //Now update the display - QString label; - QString timelabel; - QString datelabel; - if(deftime){ timelabel = CT.time().toString(Qt::DefaultLocaleShortDate) ; } - else{ timelabel=CT.toString(timefmt); } - if(defdate){ datelabel = CT.date().toString(Qt::DefaultLocaleShortDate); } - else{ datelabel = CT.toString(datefmt); } - if(datetimeorder == "dateonly"){ - label = datelabel; - button->setToolTip(timelabel); - }else if(datetimeorder == "timedate"){ - label = timelabel + "\n" + datelabel; - button->setToolTip(""); - }else if(datetimeorder == "datetime"){ - label = datelabel + "\n" + timelabel; - button->setToolTip(""); - }else{ - label = timelabel; - button->setToolTip(datelabel); - } - if( this->layout()->direction() == QBoxLayout::TopToBottom ){ - //different routine for vertical text (need newlines instead of spaces) - for(int i=0; i<label.count("\n")+1; i++){ - if(this->size().width() < (this->fontMetrics().width(label.section("\n",i,i))+10 )&& label.section("\n",i,i).contains(" ")){ - label.replace(label.section("\n",i,i), label.section("\n",i,i).replace(" ", "\n")); - i--; - } - } - //label.replace(" ","\n"); - }else if( this->size().height() < 2*this->fontMetrics().height() ){ - label.replace("\n",", "); - } - if(adjustformat){ - //Check the font/spacing for the display and adjust as necessary - /*double efflines = label.count("\n")+1; //effective lines (with wordwrap) - if( (button->fontMetrics().height()*efflines) > button->height() ){ - //Force a pixel metric font size to fit everything - int szH = qRound( (button->height() - button->fontMetrics().lineSpacing() )/efflines ); - //Need to supply a *width* pixel, not a height metric - int szW = qRound( (szH*button->fontMetrics().maxWidth())/( (double) button->fontMetrics().height()) ); - qDebug() << "Change Clock font:" << button->height() << szH << szW << efflines << button->fontMetrics().height() << button->fontMetrics().lineSpacing(); - button->setStyleSheet("font-weight: bold; font-size: "+QString::number(szW)+"px;"); - }else{ - button->setStyleSheet("font-weight: bold;"); - }*/ - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - //horizontal layout - this->setFixedWidth( this->sizeHint().width() +6); - }else{ - //vertical layout - this->setMaximumWidth(100000); - } - } - button->setText(label); -} - -void LClock::updateFormats(){ - qDebug() << "Updating clock format"; - timefmt = LSession::handle()->sessionSettings()->value("TimeFormat","").toString(); - datefmt = LSession::handle()->sessionSettings()->value("DateFormat","").toString(); - deftime = timefmt.simplified().isEmpty(); - defdate = datefmt.simplified().isEmpty(); - //Adjust the timer interval based on the smallest unit displayed - if(deftime){ timer->setInterval(500); } //1/2 second - else if(timefmt.contains("z")){ timer->setInterval(1); } //every millisecond (smallest unit) - else if(timefmt.contains("s")){ timer->setInterval(500); } //1/2 second - else if(timefmt.contains("m")){ timer->setInterval(2000); } //2 seconds - else{ timer->setInterval(1000); } //unknown format - use 1 second interval - datetimeorder = LSession::handle()->sessionSettings()->value("DateTimeOrder", "timeonly").toString().toLower(); - //this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); - updateTime(true); - //Now fix the size of the widget with the new size hint - //this->setFixedWidth( this->sizeHint().width() +6); -} - -void LClock::updateMenu(){ - QDateTime cdt = QDateTime::currentDateTime(); - TZMenu->setTitle(QString(tr("Time Zone (%1)")).arg(cdt.timeZoneAbbreviation()) ); - calendar->showToday(); //make sure the current month is visible - calendar->setSelectedDate(QDate::currentDate()); //select the actual date for today -} - -void LClock::openMenu(){ - updateMenu(); - button->showMenu(); -} - -void LClock::closeMenu(){ - button->menu()->hide(); -} - -void LClock::ChangeTZ(QAction *act){ - LTHEME::setCustomEnvSetting("TZ",act->whatsThis()); - QTimer::singleShot(500, this, SLOT(updateTime()) ); -} - -void LClock::LocaleChange(){ - //Refresh all the time zone information - TZMenu->clear(); - TZMenu->addAction(tr("Use System Time")); - TZMenu->addSeparator(); - QList<QByteArray> TZList = QTimeZone::availableTimeZoneIds(); - //Orgnize time zones for smaller menus (Continent/Country/City) - // Note: id = Continent/City - QStringList info; - for(int i=0; i<TZList.length(); i++){ - QTimeZone tz(TZList[i]); - if(!QString(tz.id()).contains("/")){ continue; } - info << "::::"+QString(tz.id()).section("/",0,0)+"::::"+QLocale::countryToString(tz.country())+"::::"+QString(tz.id()).section("/",1,100).replace("_"," ")+"::::"+QString(tz.id()); - } - //Now sort alphabetically - info.sort(); - //Now create the menu tree - QString continent, country; //current continent/country - QMenu *tmpC=0; //continent menu - QMenu *tmpCM=0; //country menu - for(int i=0; i<info.length(); i++){ - //Check if different continent - if(info[i].section("::::",1,1)!=continent){ - if(tmpC!=0){ - if(tmpCM!=0 && !tmpCM->isEmpty()){ - tmpC->addMenu(tmpCM); - } - if(!tmpC->isEmpty()){ TZMenu->addMenu(tmpC); } - } - tmpC = new QMenu(this); - tmpC->setTitle(info[i].section("::::",1,1)); - tmpCM = new QMenu(this); - tmpCM->setTitle(info[i].section("::::",2,2)); - //Check if different country - }else if(info[i].section("::::",2,2)!=country){ - if(tmpC!=0 && tmpCM!=0 && !tmpCM->isEmpty()){ - tmpC->addMenu(tmpCM); - } - tmpCM = new QMenu(this); - tmpCM->setTitle(info[i].section("::::",2,2)); - } - //Now create the entry within the country menu - if(tmpCM!=0){ - QAction *act = new QAction(info[i].section("::::",3,3), this); - act->setWhatsThis(info[i].section("::::",4,4) ); - tmpCM->addAction(act); - } - //Save the values for the next run - continent = info[i].section("::::",1,1); - country = info[i].section("::::",2,2); - - if(i== info.length()-1){ - //last go through - save all menus - if(tmpCM!=0 && tmpC!=0 && !tmpCM->isEmpty()){ tmpC->addMenu(tmpCM); } - if(tmpC!=0 && !tmpC->isEmpty()){ TZMenu->addMenu(tmpC); } - } - } - -} - -void LClock::ThemeChange(){ - TZMenu->setIcon(LXDG::findIcon("clock","")); -} - -void LClock::OrientationChange(){ - if(this->layout()->direction()==QBoxLayout::LeftToRight){ //horizontal panel - //button->setRotation(0); //no rotation of text - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); - button->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); - }else{ //vertical panel - //button->setRotation(90); //90 degree rotation - this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - } - updateTime(true); //re-adjust the font/spacings - this->layout()->update(); -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/clock/LClock.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/clock/LClock.h deleted file mode 100644 index eddf782c..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/clock/LClock.h +++ /dev/null @@ -1,58 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2012-2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_DESKTOP_CLOCK_H -#define _LUMINA_DESKTOP_CLOCK_H - -#include <QTimer> -#include <QDateTime> -#include <QLabel> -#include <QWidget> -#include <QString> -#include <QLocale> -#include <QTimeZone> -#include <QCalendarWidget> -#include <QWidgetAction> -#include <QAction> -#include <QToolButton> -#include <QMenu> - -#include "../LPPlugin.h" - -//#include "../RotateToolButton.h" - -class LClock : public LPPlugin{ - Q_OBJECT -public: - LClock(QWidget *parent = 0, QString id = "clock", bool horizontal=true); - ~LClock(); - -private: - QTimer *timer; - QToolButton *button; //RotateToolButton - QString timefmt, datefmt, datetimeorder; - bool deftime, defdate; - QMenu *TZMenu; - QCalendarWidget *calendar; - QWidgetAction *calAct; - -private slots: - void updateTime(bool adjustformat = false); - void updateFormats(); - - void updateMenu(); - void openMenu(); - void closeMenu(); - - void ChangeTZ(QAction*); - -public slots: - void LocaleChange(); - void ThemeChange(); - void OrientationChange(); -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/desktopbar/LDeskBar.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/desktopbar/LDeskBar.cpp deleted file mode 100644 index 90d942de..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/desktopbar/LDeskBar.cpp +++ /dev/null @@ -1,207 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2012-2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "LDeskBar.h" -#include "../../LSession.h" - -LDeskBarPlugin::LDeskBarPlugin(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){ - this->layout()->setContentsMargins(0,0,0,0); - this->setStyleSheet( "QToolButton::menu-indicator{ image: none; } QToolButton{ padding: 0px; }"); - - //initialize the desktop bar items - initializeDesktop(); - //setup the directory watcher - QString fav = QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/favorites.list"; - if(!QFile::exists(fav)){ QProcess::execute("touch \""+fav+"\""); } - watcher = new QFileSystemWatcher(this); - watcher->addPath( fav ); - connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(filechanged(QString)) ); - QTimer::singleShot(1,this, SLOT(updateFiles()) ); //make sure to load it the first time - QTimer::singleShot(0,this, SLOT(OrientationChange()) ); //adjust sizes/layout - connect(QApplication::instance(), SIGNAL(DesktopFilesChanged()), this, SLOT(updateFiles()) ); -} - -LDeskBarPlugin::~LDeskBarPlugin(){ -} - -// ======================= -// PRIVATE FUNCTIONS -// ======================= -void LDeskBarPlugin::initializeDesktop(){ - //Applications on the desktop - appB = new QToolButton(this); - appB->setToolButtonStyle(Qt::ToolButtonIconOnly); - appB->setAutoRaise(true); - appB->setPopupMode(QToolButton::InstantPopup); - appM = new QMenu(this); - appB->setMenu(appM); - this->layout()->addWidget(appB); - connect(appM,SIGNAL(triggered(QAction*)),this,SLOT(ActionTriggered(QAction*)) ); - connect(appM, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed())); - //Directories on the desktop - dirB = new QToolButton(this); - dirB->setToolButtonStyle(Qt::ToolButtonIconOnly); - dirB->setAutoRaise(true); - dirB->setPopupMode(QToolButton::InstantPopup); - dirM = new QMenu(this); - dirB->setMenu(dirM); - this->layout()->addWidget(dirB); - connect(dirM,SIGNAL(triggered(QAction*)),this,SLOT(ActionTriggered(QAction*)) ); - connect(dirM, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed())); - //Audio Files on the desktop - audioM = new QMenu(this); - connect(audioM,SIGNAL(triggered(QAction*)),this,SLOT(ActionTriggered(QAction*)) ); - //Video Files on the desktop - videoM = new QMenu(this); - connect(videoM,SIGNAL(triggered(QAction*)),this,SLOT(ActionTriggered(QAction*)) ); - //Picture Files on the desktop - pictureM = new QMenu(this); - connect(pictureM,SIGNAL(triggered(QAction*)),this,SLOT(ActionTriggered(QAction*)) ); - //Other Files on the desktop - otherM = new QMenu(this); - connect(otherM,SIGNAL(triggered(QAction*)),this,SLOT(ActionTriggered(QAction*)) ); - docM = new QMenu(this); - connect(docM,SIGNAL(triggered(QAction*)), this,SLOT(ActionTriggered(QAction*)) ); - //All Files Button - fileB = new QToolButton(this); - fileB->setToolButtonStyle(Qt::ToolButtonIconOnly); - fileB->setAutoRaise(true); - fileB->setPopupMode(QToolButton::InstantPopup); - fileM = new QMenu(this); - fileB->setMenu(fileM); - this->layout()->addWidget(fileB); - - updateIcons(); //set all the text/icons -} - -QAction* LDeskBarPlugin::newAction(QString filepath, QString name, QString iconpath){ - return newAction(filepath, name, QIcon(iconpath)); -} - -QAction* LDeskBarPlugin::newAction(QString filepath, QString name, QIcon icon){ - QAction *act = new QAction(icon, name, this); - act->setWhatsThis(filepath); - return act; -} - -// ======================= -// PRIVATE SLOTS -// ======================= -void LDeskBarPlugin::ActionTriggered(QAction* act){ - //Open up the file with the appropriate application - QString cmd = "lumina-open \""+act->whatsThis()+"\""; - qDebug() << "Open File:" << cmd; - LSession::LaunchApplication(cmd); -} -void LDeskBarPlugin::filechanged(QString file){ - updateFiles(); - if(!watcher->files().contains(file)){ watcher->addPath(file); } //make sure the file does not get removed from the watcher -} -void LDeskBarPlugin::updateFiles(){ - QFileInfoList homefiles = LSession::handle()->DesktopFiles(); - QStringList favitems = LDesktopUtils::listFavorites(); - //Remember for format for favorites: <name>::::[app/dir/<mimetype>]::::<full path> - for(int i=0; i<homefiles.length(); i++){ - if( !favitems.filter(homefiles[i].canonicalFilePath()).isEmpty() ){ continue; } //duplicate entry - QString type; - if(homefiles[i].isDir()){ type="dir"; } - else if(homefiles[i].fileName().endsWith(".desktop")){ type="app"; } - else{ type=LXDG::findAppMimeForFile(homefiles[i].fileName()); } - favitems << homefiles[i].fileName()+"::::"+type+"::::"+homefiles[i].absoluteFilePath(); - //qDebug() << "Desktop Item:" << favitems.last(); - } - - favitems.sort(); //sort them alphabetically - //Now add the items to the lists - appM->clear(); - dirM->clear(); - audioM->clear(); - videoM->clear(); - pictureM->clear(); - docM->clear(); - otherM->clear(); - for(int i=0; i<favitems.length(); i++){ - QString type = favitems[i].section("::::",1,1); - QString name = favitems[i].section("::::",0,0); - QString path = favitems[i].section("::::",2,50); - if(type=="app"){ - //Add it to appM - bool ok = false; - XDGDesktop df(path); - if(df.isValid() && !df.isHidden){ - appM->addAction( newAction(df.filePath, df.name, LXDG::findIcon(df.icon, ":/images/default-application.png")) ); - } - }else if(type=="dir"){ - //Add it to dirM - dirM->addAction( newAction(path, name, LXDG::findIcon("folder","")) ); - }else if(type.startsWith("audio/")){ - //Add it to audioM - audioM->addAction( newAction(path, name, LXDG::findMimeIcon(type)) ); - }else if(type.startsWith("video/")){ - //Add it to videoM - videoM->addAction( newAction(path, name, LXDG::findMimeIcon(type)) ); - }else if(type.startsWith("image/")){ - //Add it to pictureM - if(LUtils::imageExtensions().contains(path.section("/",-1).section(".",-1).toLower()) ){ - pictureM->addAction( newAction(path, name, QIcon(path)) ); - }else{ - pictureM->addAction( newAction(path, name, LXDG::findMimeIcon(type)) ); - } - }else if(type.startsWith("text/")){ - //Add it to docM - docM->addAction( newAction(path, name, LXDG::findMimeIcon(type)) ); - }else{ - //Add it to otherM - otherM->addAction( newAction(path, name, LXDG::findMimeIcon(type)) ); - } - - } - - //Now update the file menu as appropriate - fileM->clear(); - if(!audioM->isEmpty()){ fileM->addMenu(audioM); } - if(!docM->isEmpty()){ fileM->addMenu(docM); } - if(!pictureM->isEmpty()){ fileM->addMenu(pictureM); } - if(!videoM->isEmpty()){ fileM->addMenu(videoM); } - if(!otherM->isEmpty()){ fileM->addMenu(otherM); } - //Check for a single submenu, and skip the main if need be - disconnect(fileB->menu(), SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed()) ); - if(fileM->actions().length()==1){ - if(!audioM->isEmpty()){ fileB->setMenu(audioM); } - else if(!pictureM->isEmpty()){ fileB->setMenu(pictureM); } - else if(!videoM->isEmpty()){ fileB->setMenu(videoM); } - else if(!docM->isEmpty()){ fileB->setMenu(docM); } - else if(!otherM->isEmpty()){ fileB->setMenu(otherM); } - }else{ - fileB->setMenu(fileM); - } - connect(fileB->menu(), SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed())); - - //Setup the visibility of the buttons - appB->setVisible( !appM->isEmpty() ); - dirB->setVisible( !dirM->isEmpty() ); - fileB->setVisible( !fileM->isEmpty() ); -} - -void LDeskBarPlugin::updateIcons(){ - //Set all the text/icons - appB->setIcon( LXDG::findIcon("favorites", "") ); - appB->setToolTip(tr("Favorite Applications")); - dirB->setIcon( LXDG::findIcon("folder", "") ); - dirB->setToolTip(tr("Favorite Folders")); - audioM->setTitle( tr("Audio") ); - audioM->setIcon( LXDG::findIcon("audio-x-generic","") ); - videoM->setTitle( tr("Video") ); - videoM->setIcon( LXDG::findIcon("video-x-generic","") ); - pictureM->setTitle( tr("Pictures") ); - pictureM->setIcon( LXDG::findIcon("image-x-generic","") ); - otherM->setTitle( tr("Other Files") ); - otherM->setIcon( LXDG::findIcon("unknown","") ); - docM->setTitle( tr("Documents") ); - docM->setIcon( LXDG::findIcon("x-office-document","") ); - fileB->setIcon( LXDG::findIcon("document-multiple", "") ); - fileB->setToolTip(tr("Favorite Files") ); -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/desktopbar/LDeskBar.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/desktopbar/LDeskBar.h deleted file mode 100644 index 74f41230..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/desktopbar/LDeskBar.h +++ /dev/null @@ -1,88 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2012, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This plugin displays the contents of the user's home directory -// as organized within a couple buttons on the panel (apps, dirs, files) -//=========================================== -#ifndef _LUMINA_DESKTOP_DESKBAR_H -#define _LUMINA_DESKTOP_DESKBAR_H - -// Qt includes -#include <QWidget> -#include <QString> -#include <QAction> -#include <QMenu> -#include <QProcess> -#include <QTimer> -#include <QFileSystemWatcher> -#include <QHBoxLayout> -#include <QIcon> -#include <QToolButton> -#include <QDebug> - -// libLumina includes -#include <LuminaXDG.h> - -// local includes -//#include "../LTBWidget.h" -#include "../LPPlugin.h" - -class LDeskBarPlugin : public LPPlugin{ - Q_OBJECT -public: - LDeskBarPlugin(QWidget* parent=0, QString id = "desktopbar", bool horizontal=true); - ~LDeskBarPlugin(); - -private: - QFileSystemWatcher *watcher; - //Special toolbuttons and menus - QToolButton *appB, *fileB, *dirB; - QMenu *appM, *dirM, *audioM, *videoM, *pictureM, *fileM, *otherM, *docM; - QList<QToolButton*> APPLIST; - QDateTime lastHomeUpdate; - - void initializeDesktop(); - //bool readDesktopFile(QString path, QString &name, QString &iconpath); - - QAction* newAction(QString filepath, QString name, QString iconpath); - QAction* newAction(QString filepath, QString name, QIcon icon); - - //void updateMenu(QMenu* menu, QFileInfoList files, bool trim = true); - - -private slots: - void ActionTriggered(QAction* act); - void filechanged(QString); - void updateFiles(); - void updateIcons(); - -public slots: - void LocaleChange(){ - updateIcons(); - updateFiles(); - } - - void OrientationChange(){ - QSize sz; - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); - sz = QSize(this->height(), this->height()); - }else{ - this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); - sz = QSize(this->width(), this->width()); - } - appB->setIconSize(sz); - fileB->setIconSize(sz); - dirB->setIconSize(sz); - for(int i=0; i<APPLIST.length(); i++){ - APPLIST[i]->setIconSize(sz); - } - this->layout()->update(); - } -}; - - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/desktopswitcher/LDesktopSwitcher.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/desktopswitcher/LDesktopSwitcher.cpp deleted file mode 100644 index 8e0a9d28..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/desktopswitcher/LDesktopSwitcher.cpp +++ /dev/null @@ -1,148 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2014, Susanne Jaeckel -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "LDesktopSwitcher.h" -#include <LSession.h> - -LDesktopSwitcher::LDesktopSwitcher(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal) { - iconOld = -1; - this->setStyleSheet( "QToolButton::menu-indicator{ image: none; } QToolButton{padding: 0px;}"); - //Setup the widget - label = new QToolButton(this); - label->setPopupMode(QToolButton::DelayedPopup); - label->setAutoRaise(true); - label->setToolButtonStyle(Qt::ToolButtonIconOnly); - label->setIcon( LXDG::findIcon("format-view-carousel", "preferences-desktop-display") ); - label->setToolTip(QString("Workspace 1")); - connect(label, SIGNAL(clicked()), this, SLOT(openMenu())); - menu = new QMenu(this); - connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(menuActionTriggered(QAction*))); - connect(menu, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed())); - label->setMenu(menu); - this->layout()->addWidget(label); - - // Maybe a timer should be set to set the toolTip of the button, - // becasue the workspace could be switched via Keyboard-shortcuts ... - - QTimer::singleShot(500, this, SLOT(createMenu()) ); //needs a delay to make sure it works right the first time - QTimer::singleShot(0,this, SLOT(OrientationChange()) ); //adjust icon size - - //Process the signal which is sent when the workspace is changed via keyboard-shortcuts - connect(QApplication::instance(), SIGNAL(WorkspaceChanged()), this, SLOT(updateWorkspaceMenu())); -} - -LDesktopSwitcher::~LDesktopSwitcher(){ -} -/* MOVED THESE FUNCTIONS TO LIBLUMINA (LuminaX11.h) -- Ken Moore 5/9/14 -void LDesktopSwitcher::setNumberOfDesktops(int number) { - Display *display = QX11Info::display(); - Window rootWindow = QX11Info::appRootWindow(); - - Atom atom = XInternAtom(display, "_NET_NUMBER_OF_DESKTOPS", False); - XEvent xevent; - xevent.type = ClientMessage; - xevent.xclient.type = ClientMessage; - xevent.xclient.display = display; - xevent.xclient.window = rootWindow; - xevent.xclient.message_type = atom; - xevent.xclient.format = 32; - xevent.xclient.data.l[0] = number; - xevent.xclient.data.l[1] = CurrentTime; - xevent.xclient.data.l[2] = 0; - xevent.xclient.data.l[3] = 0; - xevent.xclient.data.l[4] = 0; - XSendEvent(display, rootWindow, False, SubstructureNotifyMask | SubstructureRedirectMask, &xevent); - - XFlush(display); -} - -void LDesktopSwitcher::setCurrentDesktop(int number) { - Display *display = QX11Info::display(); - Window rootWindow = QX11Info::appRootWindow(); - - Atom atom = XInternAtom(display, "_NET_CURRENT_DESKTOP", False); - XEvent xevent; - xevent.type = ClientMessage; - xevent.xclient.type = ClientMessage; - xevent.xclient.display = display; - xevent.xclient.window = rootWindow; - xevent.xclient.message_type = atom; - xevent.xclient.format = 32; - xevent.xclient.data.l[0] = number; - xevent.xclient.data.l[1] = CurrentTime; - xevent.xclient.data.l[2] = 0; - xevent.xclient.data.l[3] = 0; - xevent.xclient.data.l[4] = 0; - XSendEvent(display, rootWindow, False, SubstructureNotifyMask | SubstructureRedirectMask, &xevent); - - XFlush(display); -} - -int LDesktopSwitcher::getNumberOfDesktops() { - int number = -1; - Atom a = XInternAtom(QX11Info::display(), "_NET_NUMBER_OF_DESKTOPS", true); - Atom realType; - int format; - unsigned long num, bytes; - unsigned char *data = 0; - int status = XGetWindowProperty(QX11Info::display(), QX11Info::appRootWindow(), a, 0L, (~0L), - false, AnyPropertyType, &realType, &format, &num, &bytes, &data); - if( (status >= Success) && (num > 0) ){ - number = *data; - XFree(data); - } - return number; -} - -int LDesktopSwitcher::getCurrentDesktop() { - int number = -1; - Atom a = XInternAtom(QX11Info::display(), "_NET_CURRENT_DESKTOP", true); - Atom realType; - int format; - unsigned long num, bytes; - unsigned char *data = 0; - int status = XGetWindowProperty(QX11Info::display(), QX11Info::appRootWindow(), a, 0L, (~0L), - false, AnyPropertyType, &realType, &format, &num, &bytes, &data); - if( (status >= Success) && (num > 0) ){ - number = *data; - XFree(data); - } - return number; -} */ - -void LDesktopSwitcher::openMenu(){ - //Make sure the menu is refreshed right before it opens - createMenu(); - label->showMenu(); -} - -QAction* LDesktopSwitcher::newAction(int what, QString name) { - QAction *act = new QAction(LXDG::findIcon("preferences-desktop-display", ""), name, this); - act->setWhatsThis(QString::number(what)); - return act; -} - -void LDesktopSwitcher::createMenu() { - int cur = LSession::handle()->XCB->CurrentWorkspace(); //current desktop number - int tot = LSession::handle()->XCB->NumberOfWorkspaces(); //total number of desktops - //qDebug() << "-- vor getCurrentDesktop SWITCH"; - qDebug() << "Virtual Desktops:" << tot << cur; - menu->clear(); - for (int i = 0; i < tot; i++) { - QString name = QString(tr("Workspace %1")).arg( QString::number(i+1) ); - if(i == cur){ name.prepend("*"); name.append("*");} //identify which desktop this is currently - menu->addAction(newAction(i, name)); - } - label->setToolTip(QString(tr("Workspace %1")).arg(QString::number(cur + 1))); -} - -void LDesktopSwitcher::menuActionTriggered(QAction* act) { - LSession::handle()->XCB->SetCurrentWorkspace(act->whatsThis().toInt()); -} - -void LDesktopSwitcher::updateWorkspaceMenu() { - createMenu(); -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/desktopswitcher/LDesktopSwitcher.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/desktopswitcher/LDesktopSwitcher.h deleted file mode 100644 index 69fe46da..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/desktopswitcher/LDesktopSwitcher.h +++ /dev/null @@ -1,73 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2014, Susanne Jaeckel -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_DESKTOP_SWITCHER_H -#define _LUMINA_DESKTOP_SWITCHER_H - -#include <QTimer> -#include <QWidget> -#include <QString> -//#include <QX11Info> -#include <QMenu> -#include <QToolButton> - -#include <LUtils.h> -#include <LuminaXDG.h> -#include <LuminaX11.h> - -//#include "../LTBWidget.h" -#include "../LPPlugin.h" - -//#include <X11/Xlib.h> -//#include <X11/Xutil.h> -//#include <X11/Xatom.h> - -class LDesktopSwitcher : public LPPlugin{ - Q_OBJECT -public: - LDesktopSwitcher(QWidget *parent = 0, QString id = "desktopswitcher", bool horizontal=true); - ~LDesktopSwitcher(); - -private: - QTimer *timer; - QToolButton *label; - QMenu *menu; - int iconOld; - - //void setNumberOfDesktops(int); - //void setCurrentDesktop(int); - //int getNumberOfDesktops(); - //int getCurrentDesktop(); - - - QAction* newAction(int, QString); - -private slots: - void openMenu(); - void createMenu(); - void menuActionTriggered(QAction*); - void updateWorkspaceMenu(); - -public slots: - void LocaleChange(){ - createMenu(); - } - - void OrientationChange(){ - QSize sz; - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); - sz = QSize(this->height(), this->height()); - }else{ - this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); - sz = QSize(this->width(), this->width()); - } - label->setIconSize(sz); - this->layout()->update(); - } -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/jsonmenu/PPJsonMenu.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/jsonmenu/PPJsonMenu.cpp deleted file mode 100644 index 14880f9b..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/jsonmenu/PPJsonMenu.cpp +++ /dev/null @@ -1,35 +0,0 @@ -//=========================================== -// Lumina Desktop source code -// Copyright (c) 2016, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "PPJsonMenu.h" -#include "../../JsonMenu.h" - -LPJsonMenu::LPJsonMenu(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){ - //Setup the button - button = new QToolButton(this); - button->setAutoRaise(true); - button->setToolButtonStyle(Qt::ToolButtonIconOnly); - button->setPopupMode(QToolButton::InstantPopup); //make sure it runs the update routine first - //connect(button, SIGNAL(clicked()), this, SLOT(openMenu())); - this->layout()->setContentsMargins(0,0,0,0); - this->layout()->addWidget(button); - //Parse the id and get the extra information needed for the plugin - QStringList info = id.section("---",0,0).split("::::"); //FORMAT:[ "jsonmenu---<number>",exec,name, icon(optional)] - if(info.length()>=3){ - qDebug() << "Custom JSON Menu Loaded:" << info; - JsonMenu *menu = new JsonMenu(info[1], button); - button->setText(info[2]); - //connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(SystemApplication(QAction*)) ); - if(info.length()>=4){ button->setIcon( LXDG::findIcon(info[3],"run-build") ); } - else{ button->setIcon( LXDG::findIcon("run-build","") ); } - button->setMenu(menu); - } - //Now start up the widgets - QTimer::singleShot(0,this,SLOT(OrientationChange()) ); //update the sizing/icon -} - -LPJsonMenu::~LPJsonMenu(){ -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/jsonmenu/PPJsonMenu.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/jsonmenu/PPJsonMenu.h deleted file mode 100644 index d0827fd2..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/jsonmenu/PPJsonMenu.h +++ /dev/null @@ -1,42 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2016, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_PANEL_JSON_PLUGIN_H -#define _LUMINA_PANEL_JSON_PLUGIN_H - -#include "../../Globals.h" -#include "../LPPlugin.h" - - -class LPJsonMenu : public LPPlugin{ - Q_OBJECT -public: - LPJsonMenu(QWidget *parent = 0, QString id = "jsonmenu", bool horizontal=true); - ~LPJsonMenu(); - -private: - QToolButton *button; - -private slots: - //void SystemApplication(QAction*); - -public slots: - void LocaleChange(){ - } - - void OrientationChange(){ - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); - button->setIconSize( QSize(this->height(), this->height()) ); - }else{ - this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); - button->setIconSize( QSize(this->width(), this->width()) ); - } - this->layout()->update(); - } -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/line/LLine.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/line/LLine.h deleted file mode 100644 index 94de486e..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/line/LLine.h +++ /dev/null @@ -1,40 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This class is a generic line separator for the panel -//=========================================== -#ifndef _LUMINA_DESKTOP_PANEL_PLUGIN_LINE_H -#define _LUMINA_DESKTOP_PANEL_PLUGIN_LINE_H - -#include "../LPPlugin.h" -#include <QFrame> - -class LLinePlugin : public LPPlugin{ - Q_OBJECT -private: - QFrame *line; - -public: - LLinePlugin(QWidget *parent=0, QString id="spacer", bool horizontal=true) : LPPlugin(parent, id, horizontal){ - line = new QFrame(this); - line->setObjectName("LuminaPanelLine"); - this->layout()->addWidget(line); - OrientationChange(); - } - ~LLinePlugin(){} - -public slots: - void OrientationChange(){ - if(this->layout()->direction()==QBoxLayout::LeftToRight){ //horizontal - line->setFrameShape(QFrame::VLine); - }else{ //vertical - line->setFrameShape(QFrame::HLine); - } - } -}; - - -#endif
\ No newline at end of file diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/panel-plugins.pri b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/panel-plugins.pri deleted file mode 100644 index c40c4725..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/panel-plugins.pri +++ /dev/null @@ -1,57 +0,0 @@ -#Lumina Desktop Panel Plugin files - -SOURCES += $$PWD/userbutton/LUserButton.cpp \ - $$PWD/userbutton/UserWidget.cpp \ - $$PWD/userbutton/UserItemWidget.cpp \ - $$PWD/desktopbar/LDeskBar.cpp \ - $$PWD/taskmanager/LTaskManagerPlugin.cpp \ - $$PWD/taskmanager/LTaskButton.cpp \ - $$PWD/systemtray/LSysTray.cpp \ - $$PWD/systemtray/TrayIcon.cpp \ - $$PWD/clock/LClock.cpp \ - $$PWD/battery/LBattery.cpp \ - $$PWD/desktopswitcher/LDesktopSwitcher.cpp \ - $$PWD/systemdashboard/LSysDashboard.cpp \ - $$PWD/systemdashboard/SysMenuQuick.cpp \ - $$PWD/showdesktop/LHomeButton.cpp \ - $$PWD/appmenu/LAppMenuPlugin.cpp \ - $$PWD/applauncher/AppLaunchButton.cpp \ - $$PWD/systemstart/LStartButton.cpp \ - $$PWD/systemstart/StartMenu.cpp \ - $$PWD/systemstart/ItemWidget.cpp \ - $$PWD/audioplayer/LPAudioPlayer.cpp \ - $$PWD/audioplayer/PPlayerWidget.cpp \ - $$PWD/jsonmenu/PPJsonMenu.cpp - -HEADERS += $$PWD/RotateToolButton.h \ - $$PWD/userbutton/LUserButton.h \ - $$PWD/userbutton/UserWidget.h \ - $$PWD/userbutton/UserItemWidget.h \ - $$PWD/desktopbar/LDeskBar.h \ - $$PWD/systemtray/LSysTray.h \ - $$PWD/systemtray/TrayIcon.h \ - $$PWD/spacer/LSpacer.h \ - $$PWD/line/LLine.h \ - $$PWD/clock/LClock.h \ - $$PWD/battery/LBattery.h \ - $$PWD/desktopswitcher/LDesktopSwitcher.h \ - $$PWD/taskmanager/LTaskManagerPlugin.h \ - $$PWD/taskmanager/LTaskButton.h \ - $$PWD/systemdashboard/LSysDashboard.h \ - $$PWD/systemdashboard/SysMenuQuick.h \ - $$PWD/showdesktop/LHomeButton.h \ - $$PWD/appmenu/LAppMenuPlugin.h \ - $$PWD/applauncher/AppLaunchButton.h \ - $$PWD/systemstart/LStartButton.h \ - $$PWD/systemstart/StartMenu.h \ - $$PWD/systemstart/ItemWidget.h \ - $$PWD/audioplayer/LPAudioPlayer.h \ - $$PWD/audioplayer/PPlayerWidget.h \ - $$PWD/jsonmenu/PPJsonMenu.h -# $$PWD/quickcontainer/QuickPPlugin.h - -FORMS += $$PWD/userbutton/UserWidget.ui \ - $$PWD/systemdashboard/SysMenuQuick.ui \ - $$PWD/systemstart/StartMenu.ui \ - $$PWD/audioplayer/PPlayerWidget.ui - diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/quickcontainer/QuickPPlugin.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/quickcontainer/QuickPPlugin.h deleted file mode 100644 index 6f61c4d5..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/quickcontainer/QuickPPlugin.h +++ /dev/null @@ -1,43 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This class is a simple container for a QtQuick plugin -//=========================================== -#ifndef _LUMINA_DESKTOP_PANEL_PLUGIN_QUICK_H -#define _LUMINA_DESKTOP_PANEL_PLUGIN_QUICK_H - -#include <QQuickWidget> -#include <QVBoxLayout> -#include "../LPPlugin.h" - -#include <LUtils.h> -#include <QDebug> - -class QuickPPlugin : public LPPlugin{ - Q_OBJECT -public: - QuickPPlugin(QWidget* parent, QString ID, bool horizontal) : LPPlugin(parent, ID){ - container = new QQuickWidget(this); - container->setResizeMode(QQuickWidget::SizeRootObjectToView); - this->layout()->addWidget(container); - horizontal = true; //just to silence compiler warning - container->setSource(QUrl::fromLocalFile( LUtils::findQuickPluginFile(ID.section("---",0,0)) )); - } - - ~QuickPPlugin(){} - -private: - QQuickWidget *container; - -private slots: - void statusChange(QQuickWidget::Status status){ - if(status == QQuickWidget::Error){ - qDebug() << "Quick Widget Error:" << this->type(); - } - } - -}; -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/showdesktop/LHomeButton.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/showdesktop/LHomeButton.cpp deleted file mode 100644 index 6c259b16..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/showdesktop/LHomeButton.cpp +++ /dev/null @@ -1,43 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "LHomeButton.h" -#include "../../LSession.h" - -#include <LuminaX11.h> - -LHomeButtonPlugin::LHomeButtonPlugin(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){ - button = new QToolButton(this); - button->setAutoRaise(true); - button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - - connect(button, SIGNAL(clicked()), this, SLOT(showDesktop())); - this->layout()->setContentsMargins(0,0,0,0); - this->layout()->addWidget(button); - - QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes -} - -LHomeButtonPlugin::~LHomeButtonPlugin(){ - -} - -void LHomeButtonPlugin::updateButtonVisuals(){ - button->setIcon( LXDG::findIcon("user-desktop", "") ); -} - -// ======================== -// PRIVATE FUNCTIONS -// ======================== -void LHomeButtonPlugin::showDesktop(){ - QList<WId> wins = LSession::handle()->XCB->WindowList(); - for(int i=0; i<wins.length(); i++){ - if( LXCB::INVISIBLE != LSession::handle()->XCB->WindowState(wins[i]) ){ - LSession::handle()->XCB->MinimizeWindow(wins[i]); - } - } -} - diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/showdesktop/LHomeButton.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/showdesktop/LHomeButton.h deleted file mode 100644 index 74aaf4fb..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/showdesktop/LHomeButton.h +++ /dev/null @@ -1,62 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This panel plugin is a simple button to hide all windows so the desktop is visible -//=========================================== -#ifndef _LUMINA_DESKTOP_GO_HOME_PLUGIN_H -#define _LUMINA_DESKTOP_GO_HOME_PLUGIN_H - -// Qt includes -#include <QToolButton> -#include <QString> -#include <QWidget> - - -// Lumina-desktop includes -#include "../LPPlugin.h" //main plugin widget - -// libLumina includes -#include "LuminaXDG.h" - -// PANEL PLUGIN BUTTON -class LHomeButtonPlugin : public LPPlugin{ - Q_OBJECT - -public: - LHomeButtonPlugin(QWidget *parent = 0, QString id = "homebutton", bool horizontal=true); - ~LHomeButtonPlugin(); - -private: - QToolButton *button; - - void updateButtonVisuals(); - -private slots: - void showDesktop(); - -public slots: - void OrientationChange(){ - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); - button->setIconSize( QSize(this->height(), this->height()) ); - }else{ - this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); - button->setIconSize( QSize(this->width(), this->width()) ); - } - this->layout()->update(); - updateButtonVisuals(); - } - - void LocaleChange(){ - updateButtonVisuals(); - } - - void ThemeChange(){ - updateButtonVisuals(); - } -}; - -#endif
\ No newline at end of file diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/spacer/LSpacer.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/spacer/LSpacer.h deleted file mode 100644 index 1e60c519..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/spacer/LSpacer.h +++ /dev/null @@ -1,34 +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 class is a generic invisible spacer for the panel -//=========================================== -#ifndef _LUMINA_DESKTOP_PANEL_PLUGIN_SPACER_H -#define _LUMINA_DESKTOP_PANEL_PLUGIN_SPACER_H - -#include "../LPPlugin.h" - -class LSpacerPlugin : public LPPlugin{ - Q_OBJECT -public: - LSpacerPlugin(QWidget *parent=0, QString id="spacer", bool horizontal=true) : LPPlugin(parent, id, horizontal){ - if(horizontal){ this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); } - else{ this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); } - } - ~LSpacerPlugin(){} - -public slots: - void OrientationChange(){ - if(this->layout()->direction()==QBoxLayout::LeftToRight){ //horizontal - this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - }else{ //vertical - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); - } - } -}; - - -#endif
\ No newline at end of file diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/LSysDashboard.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/LSysDashboard.cpp deleted file mode 100644 index b9d70e97..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/LSysDashboard.cpp +++ /dev/null @@ -1,91 +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 -//=========================================== -#include "LSysDashboard.h" - -LSysDashboard::LSysDashboard(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){ - upTimer = new QTimer(this); - upTimer->setInterval(10000); //10 second update ping - connect(upTimer, SIGNAL(timeout()), this, SLOT(updateIcon())); - button = new QToolButton(this); - button->setAutoRaise(true); - button->setToolButtonStyle(Qt::ToolButtonIconOnly); - button->setPopupMode(QToolButton::DelayedPopup); //make sure it runs the update routine first - connect(button, SIGNAL(clicked()), this, SLOT(openMenu())); - this->layout()->setContentsMargins(0,0,0,0); - this->layout()->addWidget(button); - menu = new QMenu(this); - connect(menu, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed())); - sysmenu = new LSysMenuQuick(this); - connect(sysmenu, SIGNAL(CloseMenu()), this, SLOT(closeMenu()) ); - mact = new QWidgetAction(this); - mact->setDefaultWidget(sysmenu); - menu->addAction(mact); - - button->setMenu(menu); - QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes -} - -LSysDashboard::~LSysDashboard(){ - -} - -// ======================== -// PRIVATE FUNCTIONS -// ======================== -void LSysDashboard::updateIcon(bool force){ - //For the visual, show battery state only if important - static bool batcharging = false; - QPixmap pix; - button->setToolTip(tr("System Dashboard")); - if(LOS::hasBattery()){ - int bat = LOS::batteryCharge(); - bool charging = LOS::batteryIsCharging(); - //Set the icon as necessary - if(charging && !batcharging){ - //Charging and just plugged in - if(bat < 15){ button->setIcon( LXDG::findIcon("battery-charging-low","") ); QTimer::singleShot(5000, this, SLOT(resetIcon()));} - else if(bat < 30){ button->setIcon( LXDG::findIcon("battery-charging-caution","") ); QTimer::singleShot(5000, this, SLOT(resetIcon()));} - else if(force || button->icon().isNull()){ resetIcon(); } - }else if(!charging){ - //Not charging (critical level or just unplugged) - if(bat<5){ button->setIcon( LXDG::findIcon("battery-missing","") ); } - else if(bat < 15){ button->setIcon( LXDG::findIcon("battery-low","") ); QTimer::singleShot(5000, this, SLOT(resetIcon())); } - else if(bat < 30 && batcharging){ button->setIcon( LXDG::findIcon("battery-caution","") ); QTimer::singleShot(5000, this, SLOT(resetIcon()));} - else if(bat < 50 && batcharging){ button->setIcon( LXDG::findIcon("battery-040","")); QTimer::singleShot(5000, this, SLOT(resetIcon()));} - else if(bat < 70 && batcharging){ button->setIcon( LXDG::findIcon("battery-060","")); QTimer::singleShot(5000, this, SLOT(resetIcon()));} - else if(bat < 90 && batcharging){ button->setIcon( LXDG::findIcon("battery-080","")); QTimer::singleShot(5000, this, SLOT(resetIcon()));} - else if(batcharging){ button->setIcon( LXDG::findIcon("battery-100","")); QTimer::singleShot(5000, this, SLOT(resetIcon()));} - else if(force || button->icon().isNull()){ resetIcon(); } - }else if(force || button->icon().isNull()){ - //Otherwise just use the default icon - resetIcon(); - } - //Save the values for comparison later - batcharging = charging; - if( !upTimer->isActive() ){ upTimer->start(); } //only use the timer if a battery is present - - // No battery - just use/set the normal icon - }else if(force || button->icon().isNull()){ - resetIcon(); - if(upTimer->isActive() ){ upTimer->stop(); } //no battery available - no refresh timer needed - } - -} - -void LSysDashboard::resetIcon(){ - button->setIcon( LXDG::findIcon("arrow-down-drop-circle","")); -} - -void LSysDashboard::openMenu(){ - sysmenu->UpdateMenu(); - button->showMenu(); -} - -void LSysDashboard::closeMenu(){ - menu->hide(); -} - diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/LSysDashboard.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/LSysDashboard.h deleted file mode 100644 index 782fc4e6..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/LSysDashboard.h +++ /dev/null @@ -1,76 +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 panel plugin allows the user to control different system settings -// For example: screen brightness, audio volume, workspace, and battery -//=========================================== -#ifndef _LUMINA_DESKTOP_SYSTEM_DASHBOARD_H -#define _LUMINA_DESKTOP_SYSTEM_DASHBOARD_H - -//Qt includes - -#include <QHBoxLayout> -#include <QDebug> -#include <QCoreApplication> -#include <QPainter> -#include <QPixmap> -#include <QWidgetAction> -#include <QMenu> -#include <QTimer> -#include <QToolButton> - -//libLumina includes -#include <LuminaOS.h> -#include <LuminaXDG.h> - -//Local includes -#include "../LPPlugin.h" -#include "SysMenuQuick.h" - -class LSysDashboard : public LPPlugin{ - Q_OBJECT -public: - LSysDashboard(QWidget *parent = 0, QString id="systemdashboard", bool horizontal=true); - ~LSysDashboard(); - -private: - QMenu *menu; - QWidgetAction *mact; - LSysMenuQuick *sysmenu; - QToolButton *button; - QTimer *upTimer; - -private slots: - void updateIcon(bool force = false); - void resetIcon(); - void openMenu(); - void closeMenu(); - -public slots: - void LocaleChange(){ - updateIcon(true); - sysmenu->UpdateMenu(); - } - - void ThemeChange(){ - updateIcon(true); - sysmenu->UpdateMenu(); - } - - void OrientationChange(){ - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); - button->setIconSize( QSize(this->height(), this->height()) ); - }else{ - this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); - button->setIconSize( QSize(this->width(), this->width()) ); - } - updateIcon(true); //force icon refresh - this->layout()->update(); - } -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/SysMenuQuick.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/SysMenuQuick.cpp deleted file mode 100644 index 1d699ea9..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/SysMenuQuick.cpp +++ /dev/null @@ -1,211 +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 -//=========================================== -#include "SysMenuQuick.h" -#include "ui_SysMenuQuick.h" - -#include "../../LSession.h" -#include <LuminaX11.h> - -LSysMenuQuick::LSysMenuQuick(QWidget *parent) : QWidget(parent), ui(new Ui::LSysMenuQuick){ - ui->setupUi(this); - brighttimer = new QTimer(this); - brighttimer->setSingleShot(true); - brighttimer->setInterval(50); //50ms delay in setting the new value - //Now reset the initial saved settings (this is handles by the LOS/session now - 4/22/15) - firstrun = true; - UpdateMenu(); //do this once before all the signals/slots are connected below - firstrun = false; - //Now setup the connections - connect(ui->slider_volume, SIGNAL(valueChanged(int)), this, SLOT(volSliderChanged()) ); - connect(ui->slider_brightness, SIGNAL(valueChanged(int)), this, SLOT(brightSliderChanged()) ); - connect(ui->tool_wk_prev, SIGNAL(clicked()), this, SLOT(prevWorkspace()) ); - connect(ui->tool_wk_next, SIGNAL(clicked()), this, SLOT(nextWorkspace()) ); - connect(ui->tool_logout, SIGNAL(clicked()), this, SLOT(startLogout()) ); - connect(ui->tool_vol_mixer, SIGNAL(clicked()), this, SLOT(startMixer()) ); - connect(brighttimer, SIGNAL(timeout()), this, SLOT(setCurrentBrightness()) ); - connect(ui->combo_locale, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLocale()) ); - //And setup the default icons - ui->label_bright_icon->setPixmap( LXDG::findIcon("preferences-system-power-management","").pixmap(ui->label_bright_icon->maximumSize()) ); - ui->tool_wk_prev->setIcon( LXDG::findIcon("go-previous-view","")); - ui->tool_wk_next->setIcon( LXDG::findIcon("go-next-view","") ); - ui->tool_logout->setIcon( LXDG::findIcon("system-log-out","") ); -} - -LSysMenuQuick::~LSysMenuQuick(){ - -} - -void LSysMenuQuick::UpdateMenu(){ - ui->retranslateUi(this); - //Audio Volume - int val = LOS::audioVolume(); - QIcon ico; - if(val > 66){ ico= LXDG::findIcon("audio-volume-high",""); } - else if(val > 33){ ico= LXDG::findIcon("audio-volume-medium",""); } - else if(val > 0){ ico= LXDG::findIcon("audio-volume-low",""); } - else{ ico= LXDG::findIcon("audio-volume-muted",""); } - bool hasMixer = LOS::hasMixerUtility(); - ui->label_vol_icon->setVisible(!hasMixer); - ui->tool_vol_mixer->setVisible(hasMixer); - if(!hasMixer){ ui->label_vol_icon->setPixmap( ico.pixmap(ui->label_vol_icon->maximumSize()) ); } - else{ ui->tool_vol_mixer->setIcon(ico); } - QString txt = QString::number(val)+"%"; - if(val<100){ txt.prepend(" "); } //make sure no widget resizing - ui->label_vol_text->setText(txt); - if(ui->slider_volume->value()!= val){ ui->slider_volume->setValue(val); } - //Screen Brightness - val = LOS::ScreenBrightness(); - if(val < 0){ - //No brightness control - hide it - ui->group_brightness->setVisible(false); - }else{ - ui->group_brightness->setVisible(true); - txt = QString::number(val)+"%"; - if(val<100){ txt.prepend(" "); } //make sure no widget resizing - ui->label_bright_text->setText(txt); - if(ui->slider_brightness->value()!=val){ ui->slider_brightness->setValue(val); } - } - - //Do any one-time checks - if(firstrun){ - hasBat = LOS::hasBattery(); //No need to check this more than once - will not change in the middle of a session - //Current Locale - QStringList locales = LUtils::knownLocales(); - ui->combo_locale->clear(); - QLocale curr; - for(int i=0; i<locales.length(); i++){ - QLocale loc( (locales[i]=="pt") ? "pt_PT" : locales[i] ); - ui->combo_locale->addItem(loc.nativeLanguageName()+" ("+locales[i]+")", locales[i]); //Make the display text prettier later - if(locales[i] == curr.name() || locales[i] == curr.name().section("_",0,0) ){ - //Current Locale - ui->combo_locale->setCurrentIndex(ui->combo_locale->count()-1); //the last item in the list right now - } - } - ui->group_locale->setVisible(locales.length() > 1); - } - - //Battery Status - if(hasBat){ - ui->group_battery->setVisible(true); - val = LOS::batteryCharge(); - if(LOS::batteryIsCharging()){ - if(val < 15){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging-low","").pixmap(ui->label_bat_icon->maximumSize()) ); } - else if(val < 30){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging-caution","").pixmap(ui->label_bat_icon->maximumSize()) ); } - else if(val < 50){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging-040","").pixmap(ui->label_bat_icon->maximumSize()) ); } - else if(val < 70){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging-060","").pixmap(ui->label_bat_icon->maximumSize()) ); } - else if(val < 90){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging-080","").pixmap(ui->label_bat_icon->maximumSize()) ); } - else{ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging","").pixmap(ui->label_bat_icon->maximumSize()) ); } - ui->label_bat_text->setText( QString("%1%\n(%2)").arg(QString::number(val), tr("connected")) ); - }else{ - if(val < 1){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-missing","").pixmap(ui->label_bat_icon->maximumSize()) ); } - else if(val < 15){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-low","").pixmap(ui->label_bat_icon->maximumSize()) ); } - else if(val < 30){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-caution","").pixmap(ui->label_bat_icon->maximumSize()) ); } - else if(val < 50){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-040","").pixmap(ui->label_bat_icon->maximumSize()) ); } - else if(val < 70){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-060","").pixmap(ui->label_bat_icon->maximumSize()) ); } - else if(val < 90){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-080","").pixmap(ui->label_bat_icon->maximumSize()) ); } - else{ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-100","").pixmap(ui->label_bat_icon->maximumSize()) ); } - ui->label_bat_text->setText( QString("%1%\n(%2)").arg(QString::number(val), getRemainingTime()) ); - } - }else{ - ui->group_battery->setVisible(false); - } - //Workspace - val = LSession::handle()->XCB->CurrentWorkspace(); - int tot = LSession::handle()->XCB->NumberOfWorkspaces(); - ui->group_workspace->setVisible(val>=0 && tot>1); - ui->label_wk_text->setText( QString(tr("%1 of %2")).arg(QString::number(val+1), QString::number(tot)) ); -} - -void LSysMenuQuick::volSliderChanged(){ - int val = ui->slider_volume->value(); - LOS::setAudioVolume(val); - QString txt = QString::number(val)+"%"; - if(val<100){ txt.prepend(" "); } //make sure no widget resizing - ui->label_vol_text->setText( txt ); - if(val > 66){ ui->label_vol_icon->setPixmap( LXDG::findIcon("audio-volume-high","").pixmap(ui->label_vol_icon->maximumSize()) ); } - else if(val > 33){ ui->label_vol_icon->setPixmap( LXDG::findIcon("audio-volume-medium","").pixmap(ui->label_vol_icon->maximumSize()) ); } - else if(val > 0){ ui->label_vol_icon->setPixmap( LXDG::findIcon("audio-volume-low","").pixmap(ui->label_vol_icon->maximumSize()) ); } - else{ ui->label_vol_icon->setPixmap( LXDG::findIcon("audio-volume-muted","").pixmap(ui->label_vol_icon->maximumSize()) ); } -} - -void LSysMenuQuick::startMixer(){ - emit CloseMenu(); - LOS::startMixerUtility(); -} - -void LSysMenuQuick::brightSliderChanged(){ - //Brightness controls cannot operate extremely quickly - combine calls as necessary - if(brighttimer->isActive()){ brighttimer->stop(); } - brighttimer->start(); - //*DO* update the label right away - int val = ui->slider_brightness->value(); - QString txt = QString::number(val)+"%"; - if(val<100){ txt.prepend(" "); } //make sure no widget resizing - ui->label_bright_text->setText( txt ); -} - -void LSysMenuQuick::setCurrentBrightness(){ - int val = ui->slider_brightness->value(); - LOS::setScreenBrightness(val); - QString txt = QString::number(val)+"%"; - if(val<100){ txt.prepend(" "); } //make sure no widget resizing - ui->label_bright_text->setText( txt ); -} - -void LSysMenuQuick::nextWorkspace(){ - int cur = LSession::handle()->XCB->CurrentWorkspace(); - int tot = LSession::handle()->XCB->NumberOfWorkspaces(); - //qDebug()<< "Next Workspace:" << cur << tot; - cur++; - if(cur>=tot){ cur = 0; } //back to beginning - //qDebug() << " - New Current:" << cur; - LSession::handle()->XCB->SetCurrentWorkspace(cur); -ui->label_wk_text->setText( QString(tr("%1 of %2")).arg(QString::number(cur+1), QString::number(tot)) ); -} - -void LSysMenuQuick::prevWorkspace(){ - int cur = LSession::handle()->XCB->CurrentWorkspace(); - int tot = LSession::handle()->XCB->NumberOfWorkspaces(); - cur--; - if(cur<0){ cur = tot-1; } //back to last - LSession::handle()->XCB->SetCurrentWorkspace(cur); - ui->label_wk_text->setText( QString(tr("%1 of %2")).arg(QString::number(cur+1), QString::number(tot)) ); -} - -QString LSysMenuQuick::getRemainingTime(){ - int secs = LOS::batterySecondsLeft(); - if(secs < 0){ return "??"; } - QString rem; //remaining - if(secs > 3600){ - int hours = secs/3600; - rem.append( QString::number(hours)+"h "); - secs = secs - (hours*3600); - } - if(secs > 60){ - int min = secs/60; - rem.append( QString::number(min)+"m "); - secs = secs - (min*60); - } - if(secs > 0){ - rem.append( QString::number(secs)+"s"); - }else{ - rem.append( "0s" ); - } - return rem; -} - -void LSysMenuQuick::startLogout(){ - emit CloseMenu(); - LSession::handle()->systemWindow(); -} - -void LSysMenuQuick::changeLocale(){ - //Get the currently selected Locale - QString locale = ui->combo_locale->currentData().toString(); - emit CloseMenu(); - LSession::handle()->switchLocale(locale); -}
\ No newline at end of file diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/SysMenuQuick.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/SysMenuQuick.h deleted file mode 100644 index a300b5b1..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/SysMenuQuick.h +++ /dev/null @@ -1,54 +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 panel plugin allows the user to control different system settings -// For example: screen brightness, audio volume, workspace, and battery -//=========================================== -#ifndef _LUMINA_PANEL_QUICK_SYSTEM_MENU_H -#define _LUMINA_PANEL_QUICK_SYSTEM_MENU_H - -#include <QWidget> -#include <QSettings> -#include <QString> - -#include <LuminaOS.h> -#include <LuminaXDG.h> - -namespace Ui{ - class LSysMenuQuick; -}; - -class LSysMenuQuick : public QWidget{ - Q_OBJECT -public: - LSysMenuQuick(QWidget *parent=0); - ~LSysMenuQuick(); - - void UpdateMenu(); - -private: - Ui::LSysMenuQuick *ui; - QTimer *brighttimer; - bool firstrun, hasBat; - QString getRemainingTime(); //battery time left - -private slots: - void volSliderChanged(); - void brightSliderChanged(); //start the delay/collection timer - void setCurrentBrightness(); //perform the change - void startMixer(); - void nextWorkspace(); - void prevWorkspace(); - void startLogout(); - void changeLocale(); - - -signals: - void CloseMenu(); - -}; - -#endif
\ No newline at end of file diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/SysMenuQuick.ui b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/SysMenuQuick.ui deleted file mode 100644 index 26c32c74..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/SysMenuQuick.ui +++ /dev/null @@ -1,400 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>LSysMenuQuick</class> - <widget class="QWidget" name="LSysMenuQuick"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>171</width> - <height>317</height> - </rect> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <property name="styleSheet"> - <string notr="true">/*QGroupBox{ -border-radius: 5px; -border: 1px solid grey; -margin-top: 1ex; -} -QGroupBox::title{ -subcontrol-origin: margin; -subcontrol-position: top center; -padding: 0 3px; -background-color: rgba(255,255,255,255); -border-radius: 5px; -font: bold; -}*/</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="spacing"> - <number>2</number> - </property> - <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="QGroupBox" name="group_volume"> - <property name="title"> - <string>System Volume</string> - </property> - <property name="flat"> - <bool>false</bool> - </property> - <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="spacing"> - <number>2</number> - </property> - <property name="leftMargin"> - <number>2</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="rightMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>2</number> - </property> - <item> - <widget class="QLabel" name="label_vol_icon"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="text"> - <string notr="true"/> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_vol_mixer"> - <property name="minimumSize"> - <size> - <width>30</width> - <height>30</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="toolTip"> - <string>Launch Audio Mixer</string> - </property> - <property name="text"> - <string/> - </property> - <property name="iconSize"> - <size> - <width>30</width> - <height>30</height> - </size> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QSlider" name="slider_volume"> - <property name="maximum"> - <number>100</number> - </property> - <property name="value"> - <number>100</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_vol_text"> - <property name="text"> - <string notr="true">100%</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="group_brightness"> - <property name="title"> - <string>Screen Brightness</string> - </property> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <property name="spacing"> - <number>2</number> - </property> - <property name="leftMargin"> - <number>2</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="rightMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>2</number> - </property> - <item> - <widget class="QLabel" name="label_bright_icon"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="text"> - <string notr="true"/> - </property> - </widget> - </item> - <item> - <widget class="QSlider" name="slider_brightness"> - <property name="minimum"> - <number>10</number> - </property> - <property name="maximum"> - <number>100</number> - </property> - <property name="value"> - <number>100</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_bright_text"> - <property name="text"> - <string notr="true">100%</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="group_battery"> - <property name="title"> - <string>Battery Status</string> - </property> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <property name="spacing"> - <number>2</number> - </property> - <property name="leftMargin"> - <number>2</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="rightMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>2</number> - </property> - <item> - <widget class="QLabel" name="label_bat_icon"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="text"> - <string notr="true"/> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_bat_text"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string notr="true">100% (Plugged in)</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="group_workspace"> - <property name="title"> - <string>Workspace</string> - </property> - <layout class="QHBoxLayout" name="horizontalLayout_4"> - <property name="spacing"> - <number>2</number> - </property> - <property name="leftMargin"> - <number>2</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="rightMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>2</number> - </property> - <item> - <widget class="QToolButton" name="tool_wk_prev"> - <property name="text"> - <string notr="true">prev</string> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_wk_text"> - <property name="text"> - <string notr="true">1 of 2</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_wk_next"> - <property name="text"> - <string notr="true">next</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="group_locale"> - <property name="title"> - <string>Locale</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <property name="spacing"> - <number>2</number> - </property> - <property name="leftMargin"> - <number>2</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="rightMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>2</number> - </property> - <item> - <widget class="QComboBox" name="combo_locale"/> - </item> - </layout> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_6"> - <item> - <widget class="QToolButton" name="tool_logout"> - <property name="font"> - <font> - <pointsize>9</pointsize> - </font> - </property> - <property name="text"> - <string>Log Out</string> - </property> - <property name="iconSize"> - <size> - <width>22</width> - <height>22</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>false</bool> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/ItemWidget.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/ItemWidget.cpp deleted file mode 100644 index ea074a59..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/ItemWidget.cpp +++ /dev/null @@ -1,279 +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 "ItemWidget.h" -#include <LUtils.h> -#include <QMenu> -#include "../../LSession.h" - - -ItemWidget::ItemWidget(QWidget *parent, QString itemPath, QString type, bool goback) : QFrame(parent){ - createWidget(); - //Now fill it appropriately - bool inHome = type.endsWith("-home"); //internal code - if(inHome){ type = type.remove("-home"); } - if(itemPath.endsWith(".desktop") || type=="app"){ - XDGDesktop item(itemPath, this); - gooditem = item.isValid(); - //qDebug() << "Good Item:" << gooditem << itemPath; - if(gooditem){ - icon->setPixmap( LXDG::findIcon(item.icon, "preferences-system-windows-actions").pixmap(32,32) ); - iconPath = item.icon; - text = item.name; - if(!item.genericName.isEmpty() && item.name!=item.genericName){ text.append("<br><i> -- "+item.genericName+"</i>"); } - name->setText(text); - name->setToolTip(item.comment); - setupActions(&item); - }else{ - return; - } - }else if(type=="dir"){ - actButton->setVisible(false); - if(itemPath.endsWith("/")){ itemPath.chop(1); } - if(goback){ - icon->setPixmap( LXDG::findIcon("go-previous","").pixmap(64,64) ); - iconPath = "go-previous"; - text = tr("Go Back"); - name->setText( text ); - }else{ - icon->setPixmap( LXDG::findIcon("folder","").pixmap(64,64) ); - iconPath = "folder"; - name->setText( itemPath.section("/",-1)); - text = itemPath.section("/",-1); - } - }else if(type.startsWith("chcat::::")){ - //Category given - actButton->setVisible(false); - iconPath = LXDG::DesktopCatToIcon(type.section("::::",1,50)); - if(goback){ iconPath = "go-previous"; type = "chcat::::"; itemPath = "<B>("+itemPath+")</B>"; } - icon->setPixmap( LXDG::findIcon(iconPath,"applications-other").pixmap(64,64) ); - name->setText(itemPath); - text = itemPath; - icon->setWhatsThis(type); - linkPath = type; - }else{ - actButton->setVisible(false); - if(itemPath.endsWith("/")){ itemPath.chop(1); } - if(QFileInfo(itemPath).isDir()){ - type = "dir"; - icon->setPixmap( LXDG::findIcon("folder","").pixmap(64,64) ); - iconPath = "folder"; - }else if(LUtils::imageExtensions().contains(itemPath.section("/",-1).section(".",-1).toLower()) ){ - icon->setPixmap( QIcon(itemPath).pixmap(64,64) ); - }else{ - if( LUtils::isValidBinary(itemPath) ){ icon->setPixmap( LXDG::findIcon(type, "application-x-executable").pixmap(64,64) ); } - else{ icon->setPixmap( LXDG::findMimeIcon(itemPath.section("/",-1)).pixmap(64,64) ); } - } - name->setText( itemPath.section("/",-1) ); //this->fontMetrics().elidedText(itemPath.section("/",-1), Qt::ElideRight, TEXTCUTOFF) ); - text = itemPath.section("/",-1) ; - } - icon->setWhatsThis(itemPath); - if(!goback){ this->setWhatsThis(name->text()); } - isDirectory = (type=="dir"); //save this for later - if(LDesktopUtils::isFavorite(itemPath)){ - linkPath = itemPath; - isShortcut=true; - }else if( inHome ){//|| itemPath.section("/",0,-2)==QDir::homePath()+"/Desktop" ){ - isShortcut = true; - }else{ - isShortcut = false; - } - if(isShortcut && name->toolTip().isEmpty()){ - name->setToolTip(icon->whatsThis()); //also allow the user to see the full shortcut path - } - //Now setup the button appropriately - setupContextMenu(); -} - -// - Application constructor -ItemWidget::ItemWidget(QWidget *parent, XDGDesktop *item) : QFrame(parent){ - createWidget(); - if(item==0){ gooditem = false; return; } - isDirectory = false; - if(LDesktopUtils::isFavorite(item->filePath)){ - linkPath = item->filePath; - isShortcut=true; - }else if( item->filePath.section("/",0,-2)==QDir::homePath()+"/Desktop" ){ - isShortcut = true; - }else{ - isShortcut = false; - } - if(isShortcut){ - name->setToolTip(icon->whatsThis()); //also allow the user to see the full shortcut path - } - //Now fill it appropriately - icon->setPixmap( LXDG::findIcon(item->icon,"preferences-system-windows-actions").pixmap(64,64) ); - text = item->name; - if(!item->genericName.isEmpty() && item->name!=item->genericName){ text.append("<br><i> -- "+item->genericName+"</i>"); } - name->setText(text); - name->setToolTip(item->comment); - this->setWhatsThis(item->name); - icon->setWhatsThis(item->filePath); - iconPath = item->icon; - //Now setup the buttons appropriately - setupContextMenu(); - setupActions(item); -} - -ItemWidget::~ItemWidget(){ - icon->setPixmap(QPixmap()); //make sure the pixmap is cleared from memory too - actButton->deleteLater(); - contextMenu->clear(); - contextMenu->deleteLater(); - if(actButton->menu()!=0){ - for(int i=0; i<actButton->menu()->actions().length(); i++){ - actButton->menu()->actions().at(i)->deleteLater(); - } - actButton->menu()->deleteLater(); - } - actButton->deleteLater(); - icon->deleteLater(); - name->deleteLater(); - menureset->deleteLater(); - linkPath.clear(); iconPath.clear(); text.clear(); -} - -void ItemWidget::triggerItem(){ - ItemClicked(); -} - -void ItemWidget::createWidget(){ - //Initialize the widgets - gooditem = true; - menuopen = false; - menureset = new QTimer(this); - menureset->setSingleShot(true); - menureset->setInterval(1000); //1 second - this->setContentsMargins(0,0,0,0); - contextMenu = new QMenu(this); - connect(contextMenu, SIGNAL(aboutToShow()), this, SLOT(actionMenuOpen()) ); - connect(contextMenu, SIGNAL(aboutToHide()), this, SLOT(actionMenuClosed()) ); - actButton = new QToolButton(this); - actButton->setPopupMode(QToolButton::InstantPopup); - actButton->setArrowType(Qt::DownArrow); - icon = new QLabel(this); - name = new QLabel(this); - name->setWordWrap(true); - name->setTextFormat(Qt::RichText); - name->setTextInteractionFlags(Qt::NoTextInteraction); - //Add them to the layout - this->setLayout(new QHBoxLayout(this)); - this->layout()->setContentsMargins(1,1,1,1); - this->layout()->addWidget(icon); - this->layout()->addWidget(actButton); - this->layout()->addWidget(name); - //Set a custom object name so this can be tied into the Lumina Theme stylesheets - this->setObjectName("LuminaItemWidget"); -} - -void ItemWidget::setupContextMenu(){ - //Now refresh the context menu - contextMenu->clear(); - if(!QFile::exists(QDir::homePath()+"/Desktop/"+icon->whatsThis().section("/",-1)) ){ - //Does not have a desktop link - contextMenu->addAction( LXDG::findIcon("preferences-desktop-icons",""), tr("Pin to Desktop"), this, SLOT(PinToDesktop()) ); - } - //Favorite Item - if( LDesktopUtils::isFavorite(icon->whatsThis()) ){ //Favorite Item - can always remove this - contextMenu->addAction( LXDG::findIcon("edit-delete",""), tr("Remove from Favorites"), this, SLOT(RemoveFavorite()) ); - }else{ - //This file does not have a shortcut yet -- allow the user to add it - contextMenu->addAction( LXDG::findIcon("bookmark-toolbar",""), tr("Add to Favorites"), this, SLOT(AddFavorite()) ); - } - //QuickLaunch Item - if(LSession::handle()->sessionSettings()->value("QuicklaunchApps",QStringList()).toStringList().contains(icon->whatsThis()) ){ //Favorite Item - can always remove this - contextMenu->addAction( LXDG::findIcon("edit-delete",""), tr("Remove from Quicklaunch"), this, SLOT(RemoveQL()) ); - }else{ - //This file does not have a shortcut yet -- allow the user to add it - contextMenu->addAction( LXDG::findIcon("quickopen",""), tr("Add to Quicklaunch"), this, SLOT(AddQL()) ); - } -} - -void ItemWidget::setupActions(XDGDesktop *app){ - if(app==0 || app->actions.isEmpty()){ actButton->setVisible(false); return; } - //Actions Available - go ahead and list them all - actButton->setMenu( new QMenu(this) ); - for(int i=0; i<app->actions.length(); i++){ - QAction *act = new QAction(LXDG::findIcon(app->actions[i].icon, app->icon), app->actions[i].name, this); - act->setToolTip(app->actions[i].ID); - act->setWhatsThis(app->actions[i].ID); - actButton->menu()->addAction(act); - } - connect(actButton->menu(), SIGNAL(triggered(QAction*)), this, SLOT(actionClicked(QAction*)) ); - connect(actButton->menu(), SIGNAL(aboutToShow()), this, SLOT(actionMenuOpen()) ); - connect(actButton->menu(), SIGNAL(aboutToHide()), this, SLOT(actionMenuClosed()) ); - connect(menureset, SIGNAL(timeout()), this, SLOT(resetmenuflag()) ); -} - -void ItemWidget::updateItems(){ - //update the text/icon to match sizes - int H = 2.3*name->fontMetrics().height(); //make sure the height is large enough for two lines - icon->setFixedSize(QSize(H-4, H-4)); - actButton->setFixedSize( QSize( (H-4)/2, H-4) ); - QStringList newname = text.split("<br>"); - for(int i=0; i<newname.length(); i++){ newname[i] = name->fontMetrics().elidedText(newname[i], Qt::ElideRight, name->width()); } - name->setText( newname.join("<br>") ); - //Now reload the icon if necessary - if(icon->pixmap()!=0){ - if(icon->pixmap()->size().height() < (H-4) ){ - if(iconPath.isEmpty()){ - //Use item path (thumbnail or mimetype) - if(LUtils::imageExtensions().contains(icon->whatsThis().section("/",-1).section(".",-1).toLower()) ){ - icon->setPixmap( QIcon(icon->whatsThis()).pixmap(H-4,H-4).scaledToHeight(H-4,Qt::SmoothTransformation) ); - }else{ - icon->setPixmap( LXDG::findMimeIcon(icon->whatsThis().section("/",-1)).pixmap(H-4,H-4).scaledToHeight(H-4,Qt::SmoothTransformation) ); - } - }else{ - icon->setPixmap( LXDG::findIcon(iconPath,"preferences-system-windows-actions").pixmap(H-4,H-4).scaledToHeight(H-4,Qt::SmoothTransformation) ); - } - }else if(icon->pixmap()->size().height() > (H-4) ){ - icon->setPixmap( icon->pixmap()->scaled(H-4, H-4, Qt::IgnoreAspectRatio, Qt::SmoothTransformation) ); - } - } -} - -void ItemWidget::PinToDesktop(){ - qDebug() << "Create Link on Desktop:" << icon->whatsThis(); - bool ok = QFile::link(icon->whatsThis(), QDir::homePath()+"/Desktop/"+icon->whatsThis().section("/",-1)); - qDebug() << " - " << (ok ? "Success": "Failure"); -} - -void ItemWidget::RemoveFavorite(){ - LDesktopUtils::removeFavorite(icon->whatsThis()); - linkPath.clear(); - emit RemovedShortcut(); -} - -void ItemWidget::AddFavorite(){ - if( LDesktopUtils::addFavorite(icon->whatsThis()) ){ - linkPath = icon->whatsThis(); - emit NewShortcut(); - } - -} -void ItemWidget::RemoveQL(){ - qDebug() << "Remove QuickLaunch Button:" << icon->whatsThis(); - emit toggleQuickLaunch(icon->whatsThis(), false); -} - -void ItemWidget::AddQL(){ - qDebug() << "Add QuickLaunch Button:" << icon->whatsThis(); - emit toggleQuickLaunch(icon->whatsThis(), true); -} - - -void ItemWidget::ItemClicked(){ - if(!linkPath.isEmpty()){ emit RunItem(linkPath); } - else{ emit RunItem(icon->whatsThis()); } -} - -void ItemWidget::actionClicked(QAction *act){ - actButton->menu()->hide(); - QString cmd = "lumina-open -action \""+act->whatsThis()+"\" \"%1\""; - if(!linkPath.isEmpty()){ cmd = cmd.arg(linkPath); } - else{ cmd = cmd.arg(icon->whatsThis()); } - emit RunItem(cmd); -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/ItemWidget.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/ItemWidget.h deleted file mode 100644 index 11394dd6..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/ItemWidget.h +++ /dev/null @@ -1,98 +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 -//=========================================== -// This item widget manages a single file/directory -//=========================================== -#ifndef _LUMINA_PANEL_SYSTEM_START_ITEM_WIDGET_H -#define _LUMINA_PANEL_SYSTEM_START_ITEM_WIDGET_H - -#include <QFrame> -#include <QLabel> -#include <QToolButton> -#include <QString> -#include <QHBoxLayout> -#include <QSize> -#include <QDir> -#include <QFile> -#include <QMouseEvent> -#include <QAction> -#include <QMenu> -#include <QTimer> -#include <QResizeEvent> - -#include <LuminaXDG.h> - -class ItemWidget : public QFrame{ - Q_OBJECT -public: - //Overloaded Constructors for various uses - // - Favorites (path/type) - ItemWidget(QWidget *parent=0, QString itemPath="", QString type="unknown", bool goback=false); - // - Generic Apps - ItemWidget(QWidget *parent=0, XDGDesktop *item= 0); - - ~ItemWidget(); - - bool gooditem; - - void triggerItem(); //trigger this item - just as if it was clicked on - -private: - QToolButton *actButton; - QMenu *contextMenu; - QLabel *icon, *name; - bool isDirectory, isShortcut, menuopen; - QString linkPath, iconPath, text; - QTimer *menureset; - - void createWidget(); - - void setupContextMenu(); - void setupActions(XDGDesktop*); - - void updateItems(); //update the text/icon to match sizes - -private slots: - void PinToDesktop(); - void RemoveFavorite(); - void AddFavorite(); - void RemoveQL(); - void AddQL(); - void ItemClicked(); - void actionClicked(QAction*); - //Functions to fix the submenu open/close issues - void actionMenuOpen(){ - if(menureset->isActive()){ menureset->stop(); } - menuopen = true; - } - void resetmenuflag(){ menuopen = false; } //tied to the "menureset" timer - void actionMenuClosed(){ menureset->start(); } - - -protected: - void mouseReleaseEvent(QMouseEvent *event){ - if(menuopen){ resetmenuflag(); } //skip this event if a submenu was open - else if(event->button() == Qt::RightButton && !icon->whatsThis().startsWith("chcat::::") ){ - menuopen = true; - setupContextMenu(); - contextMenu->popup(event->globalPos()); - }else if(event->button() != Qt::NoButton){ ItemClicked(); } - } - - void resizeEvent(QResizeEvent *ev){ - updateItems(); //update the sizing of everything - QFrame::resizeEvent(ev); // do the normal procedures - } - -signals: - void NewShortcut(); - void RemovedShortcut(); - void RunItem(QString cmd); - void toggleQuickLaunch(QString path, bool ok); - -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/LStartButton.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/LStartButton.cpp deleted file mode 100644 index f44add77..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/LStartButton.cpp +++ /dev/null @@ -1,137 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "LStartButton.h" -#include "../../LSession.h" - -#include <LuminaXDG.h> -#include <LUtils.h> //This contains the "ResizeMenu" class - -LStartButtonPlugin::LStartButtonPlugin(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){ - button = new QToolButton(this); - button->setAutoRaise(true); - button->setToolButtonStyle(Qt::ToolButtonIconOnly); - button->setPopupMode(QToolButton::DelayedPopup); //make sure it runs the update routine first - connect(button, SIGNAL(clicked()), this, SLOT(openMenu())); - this->layout()->setContentsMargins(0,0,0,0); - this->layout()->addWidget(button); - menu = new ResizeMenu(this); - menu->setContentsMargins(1,1,1,1); - connect(menu, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed())); - connect(menu, SIGNAL(MenuResized(QSize)), this, SLOT(SaveMenuSize(QSize)) ); - startmenu = new StartMenu(this); - connect(startmenu, SIGNAL(CloseMenu()), this, SLOT(closeMenu()) ); - connect(startmenu, SIGNAL(UpdateQuickLaunch(QStringList)), this, SLOT(updateQuickLaunch(QStringList))); - menu->setContents(startmenu); - QSize saved = LSession::handle()->DesktopPluginSettings()->value("panelPlugs/"+this->type()+"/MenuSize", QSize(0,0)).toSize(); - if(!saved.isNull()){ startmenu->setFixedSize(saved); } //re-load the previously saved value - - button->setMenu(menu); - connect(menu, SIGNAL(aboutToHide()), this, SLOT(updateButtonVisuals()) ); - QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes - QTimer::singleShot(0, startmenu, SLOT(ReLoadQuickLaunch()) ); - //Setup the global shortcut handling for opening the start menu - connect(QApplication::instance(), SIGNAL(StartButtonActivated()), this, SLOT(shortcutActivated()) ); - LSession::handle()->registerStartButton(this->type()); -} - -LStartButtonPlugin::~LStartButtonPlugin(){ - LSession::handle()->unregisterStartButton(this->type()); -} - -void LStartButtonPlugin::updateButtonVisuals(){ - button->setToolTip(tr("")); - button->setText( SYSTEM::user() ); - button->setIcon( LXDG::findIcon("start-here-lumina","Lumina-DE") ); //force icon refresh -} - -void LStartButtonPlugin::updateQuickLaunch(QStringList apps){ - //First clear any obsolete apps - QStringList old; - //qDebug() << "Update QuickLaunch Buttons"; - for(int i=0; i<QUICKL.length(); i++){ - if( !apps.contains(QUICKL[i]->whatsThis()) ){ - //App was removed - QUICKL.takeAt(i)->deleteLater(); - i--; - }else{ - //App still listed - update the button - old << QUICKL[i]->whatsThis(); //add the list of current buttons - LFileInfo info(QUICKL[i]->whatsThis()); - QUICKL[i]->setIcon( LXDG::findIcon(info.iconfile(),"unknown") ); - if(info.isDesktopFile()){ QUICKL[i]->setToolTip( info.XDG()->name ); } - else{ QUICKL[i]->setToolTip( info.fileName() ); } - } - } - //Now go through and create any new buttons - for(int i=0; i<apps.length(); i++){ - if( !old.contains(apps[i]) ){ - //New App - LQuickLaunchButton *tmp = new LQuickLaunchButton(apps[i], this); - QUICKL << tmp; - LFileInfo info(apps[i]); - tmp->setIcon( LXDG::findIcon( info.iconfile() ) ); - if(info.isDesktopFile()){ tmp->setToolTip( info.XDG()->name ); } - else{ tmp->setToolTip( info.fileName() ); } - //Now add the button to the layout and connect the signal/slots - this->layout()->insertWidget(i+1,tmp); //"button" is always in slot 0 - connect(tmp, SIGNAL(Launch(QString)), this, SLOT(LaunchQuick(QString)) ); - connect(tmp, SIGNAL(Remove(QString)), this, SLOT(RemoveQuick(QString)) ); - } - } - //qDebug() << " - Done updateing QuickLaunch Buttons"; - QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes -} - -void LStartButtonPlugin::LaunchQuick(QString file){ - //Need to get which button was clicked - //qDebug() << "Quick Launch triggered:" << file; - if(!file.isEmpty()){ - LSession::LaunchApplication("lumina-open \""+file+"\""); - emit MenuClosed(); - } -} - -void LStartButtonPlugin::RemoveQuick(QString file){ - //qDebug() << "Remove Quicklaunch Button:" << file; - if(!file.isEmpty()){ - startmenu->UpdateQuickLaunch(file, false); //always a removal - emit MenuClosed(); - } -} - -void LStartButtonPlugin::SaveMenuSize(QSize sz){ - //Save this size for the menu - LSession::handle()->DesktopPluginSettings()->setValue("panelPlugs/"+this->type()+"/MenuSize", sz); -} - -// ======================== -// PRIVATE FUNCTIONS -// ======================== -void LStartButtonPlugin::openMenu(){ - if(menu->isVisible()){ return; } //don't re-show it - already open - //TESTING CODE TO SEE IF THIS MAKES IT RECOVER MEMORY - /*StartMenu *old = startmenu; - startmenu = new StartMenu(this); - connect(startmenu, SIGNAL(CloseMenu()), this, SLOT(closeMenu()) ); - connect(startmenu, SIGNAL(UpdateQuickLaunch(QStringList)), this, SLOT(updateQuickLaunch(QStringList))); - menu->setContents(startmenu); - if(old!=0){ old->deleteLater(); }*/ -//-------- - startmenu->UpdateMenu(); - button->showMenu(); -} - -void LStartButtonPlugin::closeMenu(){ - menu->hide(); -} - -void LStartButtonPlugin::shortcutActivated(){ - if(LSession::handle()->registerStartButton(this->type())){ - if(menu->isVisible()){ closeMenu(); } - else{ this->activateWindow(); openMenu(); } - } -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/LStartButton.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/LStartButton.h deleted file mode 100644 index d46bb1be..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/LStartButton.h +++ /dev/null @@ -1,113 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This panel plugin is the main button that allow the user to run -// applications or logout of the desktop -//=========================================== -#ifndef _LUMINA_DESKTOP_START_MENU_PLUGIN_H -#define _LUMINA_DESKTOP_START_MENU_PLUGIN_H - -// Qt includes -#include <QMenu> -#include <QWidgetAction> -#include <QToolButton> -#include <QString> -#include <QWidget> -#include <QMenu> - -// Lumina-desktop includes -//#include "../../Globals.h" -#include "../LPPlugin.h" //main plugin widget - -// libLumina includes -#include <LuminaXDG.h> -#include <LUtils.h> -#include <ResizeMenu.h> - -#include "StartMenu.h" - -//Simple Tool Button For QuickLaunch Items -class LQuickLaunchButton : public QToolButton{ - Q_OBJECT -signals: - void Launch(QString); - void Remove(QString); - -private slots: - void rmentry(){ - emit Remove(this->whatsThis()); - } - void launchentry(){ - emit Launch(this->whatsThis()); - } - -public: - LQuickLaunchButton(QString path, QWidget* parent = 0) : QToolButton(parent){ - this->setWhatsThis(path); - this->setMenu(new QMenu(this)); - this->setContextMenuPolicy(Qt::CustomContextMenu); - this->menu()->addAction( LXDG::findIcon("edit-delete",""), tr("Remove from Quicklaunch"), this, SLOT(rmentry()) ); - connect(this, SIGNAL(clicked()), this, SLOT(launchentry()) ); - connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showMenu()) ); - } - ~LQuickLaunchButton(){} - -}; - -// PANEL PLUGIN BUTTON -class LStartButtonPlugin : public LPPlugin{ - Q_OBJECT - -public: - LStartButtonPlugin(QWidget *parent = 0, QString id = "systemstart", bool horizontal=true); - ~LStartButtonPlugin(); - -private: - ResizeMenu *menu; - //QWidgetAction *mact; - StartMenu *startmenu; - QToolButton *button; - QList<LQuickLaunchButton*> QUICKL; - -private slots: - void openMenu(); - void closeMenu(); - void shortcutActivated(); - - void updateButtonVisuals(); - - void updateQuickLaunch(QStringList); - void LaunchQuick(QString); - void RemoveQuick(QString); - void SaveMenuSize(QSize); - -public slots: - void OrientationChange(){ - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); - button->setIconSize( QSize(this->height(), this->height()) ); - for(int i=0; i<QUICKL.length(); i++){ QUICKL[i]->setIconSize(QSize(this->height(), this->height())); } - }else{ - this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); - button->setIconSize( QSize(this->width(), this->width()) ); - for(int i=0; i<QUICKL.length(); i++){ QUICKL[i]->setIconSize(QSize(this->width(), this->width())); } - } - this->layout()->update(); - updateButtonVisuals(); - } - - void LocaleChange(){ - updateButtonVisuals(); - if(startmenu!=0){ startmenu->UpdateAll(); } - } - - void ThemeChange(){ - updateButtonVisuals(); - if(startmenu!=0){ startmenu->UpdateAll(); } - } -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/StartMenu.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/StartMenu.cpp deleted file mode 100644 index d05ba22f..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/StartMenu.cpp +++ /dev/null @@ -1,720 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "StartMenu.h" -#include "ui_StartMenu.h" -//#include <QtConcurrent> - -#include <LuminaOS.h> -#include "../../LSession.h" -#include <QtConcurrent> -#include <QMessageBox> - -#include "ItemWidget.h" -//#define SSAVER QString("xscreensaver-demo") - -StartMenu::StartMenu(QWidget *parent) : QWidget(parent), ui(new Ui::StartMenu){ - ui->setupUi(this); //load the designer file - this->setMouseTracking(true); - searchTimer = new QTimer(this); - searchTimer->setInterval(300); //~1/3 second - searchTimer->setSingleShot(true); - connect(searchTimer, SIGNAL(timeout()), this, SLOT(startSearch()) ); - connect(LSession::handle()->applicationMenu(), SIGNAL(AppMenuUpdated()), this, SLOT(UpdateApps()) ); - connect(LSession::handle(), SIGNAL(FavoritesChanged()), this, SLOT(UpdateFavs()) ); - //Need to load the last used setting of the application list - QString state = LSession::handle()->DesktopPluginSettings()->value("panelPlugs/systemstart/showcategories", "partial").toString(); - if(state=="partial"){ui->check_apps_showcats->setCheckState(Qt::PartiallyChecked); } - else if(state=="true"){ ui->check_apps_showcats->setCheckState(Qt::Checked); } - else{ ui->check_apps_showcats->setCheckState(Qt::Unchecked); } - connect(ui->check_apps_showcats, SIGNAL(stateChanged(int)), this, SLOT(catViewChanged()) ); - UpdateAll(); - QTimer::singleShot(10, this,SLOT(UpdateApps())); - QTimer::singleShot(10, this, SLOT(UpdateFavs())); -} - -StartMenu::~StartMenu(){ - -} - -void StartMenu::UpdateAll(){ - //Update all the icons/text on all the pages - - // Update Text - ui->retranslateUi(this); - - //Update Icons - ui->tool_goto_apps->setIcon(LXDG::findIcon("system-run","")); - ui->tool_goto_settings->setIcon(LXDG::findIcon("preferences-system","")); - ui->tool_launch_fm->setIcon(LXDG::findIcon("user-home","")); - ui->tool_launch_desksettings->setIcon(LXDG::findIcon("preferences-desktop","")); - ui->tool_lock->setIcon(LXDG::findIcon("system-lock-screen","")); - ui->tool_goto_logout->setIcon(LXDG::findIcon("system-log-out","")); - ui->tool_back->setIcon(LXDG::findIcon("go-previous","")); - ui->tool_launch_deskinfo->setIcon(LXDG::findIcon("system-help","")); - - ui->tool_launch_mixer->setIcon( LXDG::findIcon("preferences-desktop-sound","") ); - ui->label_bright_icon->setPixmap( LXDG::findIcon("preferences-system-power-management","").pixmap(ui->tool_goto_apps->iconSize()) ); - ui->label_locale_icon->setPixmap( LXDG::findIcon("preferences-desktop-locale","").pixmap(ui->tool_goto_apps->iconSize()) ); - ui->tool_set_nextwkspace->setIcon(LXDG::findIcon("go-next-view","")); - ui->tool_set_prevwkspace->setIcon(LXDG::findIcon("go-previous-view","")); - ui->tool_logout->setIcon(LXDG::findIcon("system-log-out","")); - ui->tool_restart->setIcon(LXDG::findIcon("system-reboot","")); - ui->tool_shutdown->setIcon(LXDG::findIcon("system-shutdown","")); - ui->tool_suspend->setIcon(LXDG::findIcon("system-suspend","")); - - //Update Visibility of system/session/OS options - // -- Control Panel - QString tmp = LOS::ControlPanelShortcut(); - if(QFile::exists(tmp)){ - ui->tool_launch_controlpanel->setWhatsThis(tmp); - //Now read the file to see which icon to use - XDGDesktop desk(tmp); - if(desk.isValid()){ - ui->tool_launch_controlpanel->setIcon(LXDG::findIcon(desk.icon,"preferences-other")); - }else{ ui->tool_launch_controlpanel->setVisible(false); } - }else{ ui->tool_launch_controlpanel->setVisible(false); } - // -- App Store - tmp = LOS::AppStoreShortcut(); - if(QFile::exists(tmp)){ - ui->tool_launch_store->setWhatsThis(tmp); - //Now read the file to see which icon to use - XDGDesktop desk(tmp); - if(desk.isValid()){ - ui->tool_launch_store->setIcon(LXDG::findIcon(desk.icon,"utilities-file-archiver")); - }else{ ui->tool_launch_store->setVisible(false); } - }else{ ui->tool_launch_store->setVisible(false); } - //Audio Controls - ui->frame_audio->setVisible( LOS::audioVolume() >=0 ); - //Brightness controls - ui->frame_bright->setVisible( LOS::ScreenBrightness() >=0 ); - //Shutdown/restart - bool ok = LOS::userHasShutdownAccess(); - ui->frame_leave_system->setWhatsThis(ok ? "allowed": ""); - ui->frame_leave_system->setVisible(ok); - //Battery Availability - ok = LOS::hasBattery(); - ui->label_status_battery->setWhatsThis(ok ? "allowed": ""); - ui->label_status_battery->setVisible(ok); - //Locale availability - QStringList locales = LUtils::knownLocales(); - ui->stackedWidget->setCurrentWidget(ui->page_main); //need to ensure the settings page is not active - ui->combo_locale->clear(); - QString curr = LUtils::currentLocale(); - //qDebug() << "Update Locales:" << locales; - //qDebug() << "Current Locale:" << curr; - for(int i=0; i<locales.length(); i++){ - QLocale loc( (locales[i]=="pt") ? "pt_PT" : locales[i] ); - ui->combo_locale->addItem(loc.nativeLanguageName() +" ("+locales[i]+")", locales[i]); //Make the display text prettier later - if(locales[i] == curr || locales[i] == curr.section("_",0,0) ){ - //Current Locale - ui->combo_locale->setCurrentIndex(ui->combo_locale->count()-1); //the last item in the list right now - } - } - ui->frame_locale->setVisible(locales.length() > 1); - //User Name in status bar - ui->label_status->setText( QString::fromLocal8Bit(getlogin()) ); - //Lumina Utilities - ui->tool_launch_desksettings->setVisible(LUtils::isValidBinary("lumina-config")); - ui->tool_launch_deskinfo->setVisible(LUtils::isValidBinary("lumina-info")); - -} - -void StartMenu::UpdateMenu(bool forceall){ - //qDebug() << "Update Menu" << forceall; - ui->line_search->clear(); - if(forceall){ UpdateAll(); } - //Quick update routine before the menu is made visible - //qDebug() << "update favs"; - //UpdateFavs(); - //qDebug() << "check page"; - if(ui->stackedWidget->currentWidget() != ui->page_main){ - ui->stackedWidget->setCurrentWidget(ui->page_main); //just show the main page - }else{ - on_stackedWidget_currentChanged(0); //refresh/update the main page every time - } - //qDebug() << "done"; -} - -void StartMenu::ReLoadQuickLaunch(){ - emit UpdateQuickLaunch( LSession::handle()->sessionSettings()->value("QuicklaunchApps",QStringList()).toStringList() ); -} - -void StartMenu::UpdateQuickLaunch(QString path, bool keep){ - QStringList QL = LSession::handle()->sessionSettings()->value("QuicklaunchApps",QStringList()).toStringList(); - if(keep){QL << path; } - else{ QL.removeAll(path); } - QL.removeDuplicates(); - LSession::handle()->sessionSettings()->setValue("QuicklaunchApps",QL); - //LSession::handle()->sessionSettings()->sync(); - emit UpdateQuickLaunch(QL); -} - -// ========================== -// PRIVATE FUNCTIONS -// ========================== -/*void StartMenu::deleteChildren(QWidget *obj){ - if(obj->layout()==0){ - for(int i=0; i<obj->children().count(); i++){ - obj->children().at(i)->deleteLater(); - } - }else{ - - } -}*/ - -void StartMenu::ClearScrollArea(QScrollArea *area){ - //QWidget *old = area->takeWidget(); - //qDebug() << "Clear Scroll Area:"; - //if(old->layout()!=0){ qDebug() << " - Number of items in layout:" << old->layout()->count(); } - //qDebug() << " - Number of Children:" << old->children().count(); - //deleteChildren(old); //make sure we *fully* delete these items to save memory - //old->deleteLater(); - if(area == ui->scroll_favs){ - area->takeWidget()->deleteLater(); - } - if(area->widget()==0){ - area->setWidget( new QWidget(area) ); //create a new widget in the scroll area - } - if(area->widget()->layout()==0){ - QVBoxLayout *layout = new QVBoxLayout(area->widget()); - layout->setSpacing(2); - layout->setContentsMargins(3,1,3,1); - layout->setDirection(QBoxLayout::TopToBottom); - layout->setAlignment(Qt::AlignTop); - area->widget()->setContentsMargins(0,0,0,0); - area->widget()->setLayout(layout); - } - //Now clear the items in the layout - while( area->widget()->layout()->count() >0 ){ - QLayoutItem *it = area->widget()->layout()->takeAt(0); - //Need to delete both the widget and the layout item - if(it->widget()!=0){ it->widget()->deleteLater(); } - delete it; - } -} - -void StartMenu::SortScrollArea(QScrollArea *area){ - //qDebug() << "Sorting Scroll Area:"; - //Sort all the items in the scroll area alphabetically - QLayout *lay = area->widget()->layout(); - QStringList items; - for(int i=0; i<lay->count(); i++){ - items << lay->itemAt(i)->widget()->whatsThis(); - } - - items.sort(); - //qDebug() << " - Sorted Items:" << items; - for(int i=0; i<items.length(); i++){ - if(items[i].isEmpty()){ continue; } - //QLayouts are weird in that they can only add items to the end - need to re-insert almost every item - for(int j=0; j<lay->count(); j++){ - //Find this item - if(lay->itemAt(j)->widget()->whatsThis()==items[i]){ - //Found it - now move it if necessary - //qDebug() << "Found Item:" << items[i] << i << j; - lay->addItem( lay->takeAt(j) ); - break; - } - } - } -} - -void StartMenu::do_search(QString search, bool force){ - search = search.simplified(); //remove unneccesary whitespace - if(search == CSearch && !force){ - //nothing new - just ensure the page is visible - if(ui->stackedWidget->currentWidget()!=ui->page_search ){ ui->stackedWidget->setCurrentWidget(ui->page_search); } - return; - }else if(search.isEmpty()){ - CSearch.clear(); - if(ui->stackedWidget->currentWidget()==ui->page_search ){ on_tool_back_clicked(); } - return; - } - //Got a search term - check it - CSearch = search; //save this for comparison later - qDebug() << "Search for term:" << search; - ClearScrollArea(ui->scroll_search); - topsearch.clear(); - //Now find any items which match the search - QStringList found; //syntax: [<sorter>::::<mimetype>::::<filepath>] - QString tmp = search; - if(LUtils::isValidBinary(tmp)){ found << "0::::application/x-executable::::"+tmp; } - QList<XDGDesktop*> apps = LSession::handle()->applicationMenu()->currentAppHash()->value("All"); - for(int i=0; i<apps.length(); i++){ - int priority = -1; - if(apps[i]->name.toLower()==search.toLower()){ priority = 10; } - else if(apps[i]->name.startsWith(search, Qt::CaseInsensitive)){ priority = 15; } - else if(apps[i]->name.contains(search, Qt::CaseInsensitive)){ priority = 19; } - else if(apps[i]->genericName.contains(search, Qt::CaseInsensitive)){ priority = 20; } - else if(apps[i]->comment.contains(search, Qt::CaseInsensitive)){ priority = 30; } - //Can add other filters here later - - if(priority>0){ - found << QString::number(priority)+"::::app::::"+apps[i]->filePath; - } - } - found.sort(Qt::CaseInsensitive); //sort by priority/type (lower numbers are higher on list) - //qDebug() << "Sorted Items:" << found; - //Now add the items to the menu in order - for(int i=0; i<found.length(); i++){ - if( !QFile::exists(found[i].section("::::",2,-1)) ){ continue; } //invalid favorite - skip it - if(topsearch.isEmpty()){ topsearch = found[i].section("::::",2,-1); } - ItemWidget *it = 0; - if( found[i].section("::::",2,-1).endsWith(".desktop")){ - XDGDesktop item(found[i].section("::::",2,-1)); - if(item.isValid()){ it = new ItemWidget(ui->scroll_favs->widget(), &item); } - }else{ - it = new ItemWidget(ui->scroll_favs->widget(), found[i].section("::::",2,-1), found[i].section("::::",1,1) ); - } - if(it==0){ continue; } - if(!it->gooditem){ it->deleteLater(); continue; } //invalid for some reason - ui->scroll_search->widget()->layout()->addWidget(it); - connect(it, SIGNAL(NewShortcut()), this, SLOT(UpdateFavs()) ); - connect(it, SIGNAL(RemovedShortcut()), this, SLOT(UpdateFavs()) ); - connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) ); - connect(it, SIGNAL(toggleQuickLaunch(QString, bool)), this, SLOT(UpdateQuickLaunch(QString, bool)) ); - if(i%3==0){ - QApplication::processEvents(); - if(searchTimer->isActive()){ return; } //search changed - go ahead and stop here - } - } - ui->stackedWidget->setCurrentWidget(ui->page_search); -} - -bool StartMenu::promptAboutUpdates(bool &skip){ - QString pending = LOS::systemPendingUpdates(); - if(pending.isEmpty()){ skip = false; } //continue without skip - else{ - QMessageBox dlg(QMessageBox::Question, tr("Apply Updates?"), tr("You have system updates waiting to be applied! Do you wish to install them now?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, this); - dlg.setDetailedText(pending); - dlg.setDefaultButton(QMessageBox::Yes); - dlg.show(); - int ret = dlg.exec(); - if(ret == QMessageBox::Cancel){ return false; } //do not continue - else{ skip = (ret==QMessageBox::No); } - } - return true; -} - -// ======================== -// PRIVATE SLOTS -// ======================== -void StartMenu::LaunchItem(QString path, bool fix){ - if(path.startsWith("chcat::::")){ - ChangeCategory(path.section("::::",1,50)); - return; - } - qDebug() << "Launching Item:" << path << fix; - if(!path.isEmpty()){ - qDebug() << "Launch Application:" << path; - if( fix && !path.startsWith("lumina-open") ){ LSession::LaunchApplication("lumina-open \""+path+"\""); } - else{ LSession::LaunchApplication(path); } - emit CloseMenu(); //so the menu container will close - } -} - -void StartMenu::ChangeCategory(QString cat){ - //This only happens on user interaction - make sure to run the update routine in a separate thread - CCat = cat; - UpdateApps(); - //QtConcurrent::run(this, &StartMenu::UpdateApps); -} - -//Listing Update routines -void StartMenu::UpdateApps(){ - ClearScrollArea(ui->scroll_apps); - //Now assemble the apps list - //qDebug() << "Update Apps:";// << CCat << ui->check_apps_showcats->checkState(); - if(ui->check_apps_showcats->checkState() == Qt::PartiallyChecked){ - //qDebug() << " - Partially Checked"; - //Show a single page of apps, but still divided up by categories - CCat.clear(); - QStringList cats = LSession::handle()->applicationMenu()->currentAppHash()->keys(); - cats.sort(); - cats.removeAll("All"); - for(int c=0; c<cats.length(); c++){ - QList<XDGDesktop*> apps = LSession::handle()->applicationMenu()->currentAppHash()->value(cats[c]); - if(apps.isEmpty()){ continue; } - //Add the category label to the scroll - QLabel *catlabel = new QLabel("<b>"+cats[c]+"</b>",ui->scroll_apps->widget()); - catlabel->setAlignment(Qt::AlignCenter); - ui->scroll_apps->widget()->layout()->addWidget(catlabel); - //Now add all the apps for this category - for(int i=0; i<apps.length(); i++){ - ItemWidget *it = new ItemWidget(ui->scroll_apps->widget(), apps[i] ); - if(!it->gooditem){ qDebug() << "Invalid Item:"; it->deleteLater(); continue; } //invalid for some reason - ui->scroll_apps->widget()->layout()->addWidget(it); - connect(it, SIGNAL(NewShortcut()), this, SLOT(UpdateFavs()) ); - connect(it, SIGNAL(RemovedShortcut()), this, SLOT(UpdateFavs()) ); - connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) ); - connect(it, SIGNAL(toggleQuickLaunch(QString, bool)), this, SLOT(UpdateQuickLaunch(QString, bool)) ); - } - } - - }else if(ui->check_apps_showcats->checkState() == Qt::Checked){ - //qDebug() << " - Checked"; - //Only show categories to start with - and have the user click-into a cat to see apps - if(CCat.isEmpty()){ - //No cat selected yet - show cats only - QStringList cats = LSession::handle()->applicationMenu()->currentAppHash()->keys(); - cats.sort(); - cats.removeAll("All"); //This is not a "real" category - for(int c=0; c<cats.length(); c++){ - ItemWidget *it = new ItemWidget(ui->scroll_apps->widget(), cats[c], "chcat::::"+cats[c] ); - if(!it->gooditem){ qDebug() << "Invalid Item:";it->deleteLater(); continue; } //invalid for some reason - ui->scroll_apps->widget()->layout()->addWidget(it); - connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) ); - } - }else{ - //qDebug() << "Show Apps For category:" << CCat; - //Show the "go back" button - ItemWidget *it = new ItemWidget(ui->scroll_apps->widget(), CCat, "chcat::::"+CCat, true); - //if(!it->gooditem){ continue; } //invalid for some reason - ui->scroll_apps->widget()->layout()->addWidget(it); - connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) ); - //Show apps for this cat - QList<XDGDesktop*> apps = LSession::handle()->applicationMenu()->currentAppHash()->value(CCat); - for(int i=0; i<apps.length(); i++){ - //qDebug() << " - App:" << apps[i].name; - ItemWidget *it = new ItemWidget(ui->scroll_apps->widget(), apps[i] ); - if(!it->gooditem){ qDebug() << "Invalid Item:"; it->deleteLater(); continue; } //invalid for some reason - ui->scroll_apps->widget()->layout()->addWidget(it); - connect(it, SIGNAL(NewShortcut()), this, SLOT(UpdateFavs()) ); - connect(it, SIGNAL(RemovedShortcut()), this, SLOT(UpdateFavs()) ); - connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) ); - connect(it, SIGNAL(toggleQuickLaunch(QString, bool)), this, SLOT(UpdateQuickLaunch(QString, bool)) ); - } - } - - }else{ - //qDebug() << " - Not Checked"; - //No categories at all - just alphabetize all the apps - QList<XDGDesktop*> apps = LSession::handle()->applicationMenu()->currentAppHash()->value("All"); - CCat.clear(); - //Now add all the apps for this category - for(int i=0; i<apps.length(); i++){ - ItemWidget *it = new ItemWidget(ui->scroll_apps->widget(), apps[i] ); - if(!it->gooditem){ it->deleteLater(); continue; } //invalid for some reason - ui->scroll_apps->widget()->layout()->addWidget(it); - connect(it, SIGNAL(NewShortcut()), this, SLOT(UpdateFavs()) ); - connect(it, SIGNAL(RemovedShortcut()), this, SLOT(UpdateFavs()) ); - connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) ); - connect(it, SIGNAL(toggleQuickLaunch(QString, bool)), this, SLOT(UpdateQuickLaunch(QString, bool)) ); - } - } - - -} - -void StartMenu::UpdateFavs(){ - //SYNTAX NOTE: (per-line) "<name>::::[dir/app/<mimetype>]::::<path>" - QStringList newfavs = LDesktopUtils::listFavorites(); - if(favs == newfavs){ return; } //nothing to do - same as before - favs = newfavs; - ClearScrollArea(ui->scroll_favs); - favs.sort(); - //Iterate over types of favorites - QStringList rest = favs; - QStringList tmp; - for(int type = 0; type<3; type++){ - if(type==0){ tmp = favs.filter("::::app::::"); } //apps first - else if(type==1){ tmp = favs.filter("::::dir::::"); } //dirs next - else{ tmp = rest; } //everything left over - if(type==1){ - SortScrollArea(ui->scroll_favs); - //Need to run a special routine for sorting the apps (already in the widget) - //qDebug() << "Sort App Widgets..."; - // Since each app actually might have a different name listed within the file - /*QLayout *lay = ui->scroll_favs->widget()->layout(); - QStringList items; - for(int i=0; i<lay->count(); i++){ - items << lay->itemAt(i)->widget()->whatsThis().toLower(); - } - - items.sort(); - // qDebug() << " - Sorted Items:" << items; - for(int i=0; i<items.length(); i++){ - if(items[i].isEmpty()){ continue; } - //QLayouts are weird in that they can only add items to the end - need to re-insert almost every item - for(int j=0; j<lay->count(); j++){ - //Find this item - if(lay->itemAt(j)->widget()->whatsThis().toLower()==items[i]){ - //Found it - now move it if necessary - //qDebug() << "Found Item:" << items[i] << i << j; - lay->addItem( lay->takeAt(j) ); - break; - } - } - }*/ - - }//end of special app sorting routine - tmp.sort(); //Sort alphabetically by name (dirs/files) - for(int i=0; i<tmp.length(); i++){ - if(type<2){ rest.removeAll(tmp[i]); } - if( !QFile::exists(tmp[i].section("::::",2,-1)) ){ continue; } //invalid favorite - skip it - ItemWidget *it = 0; - if( tmp[i].section("::::",2,-1).endsWith(".desktop")){ - XDGDesktop item(tmp[i].section("::::",2,-1)); - if(item.isValid()){ it = new ItemWidget(ui->scroll_favs->widget(), &item); } - }else{ - it = new ItemWidget(ui->scroll_favs->widget(), tmp[i].section("::::",2,-1), tmp[i].section("::::",1,1) ); - } - if(it==0){ continue; } - if(!it->gooditem){ it->deleteLater(); continue; } //invalid for some reason - ui->scroll_favs->widget()->layout()->addWidget(it); - connect(it, SIGNAL(NewShortcut()), this, SLOT(UpdateFavs()) ); - connect(it, SIGNAL(RemovedShortcut()), this, SLOT(UpdateFavs()) ); - connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) ); - connect(it, SIGNAL(toggleQuickLaunch(QString, bool)), this, SLOT(UpdateQuickLaunch(QString, bool)) ); - } - //QApplication::processEvents(); - } //end loop over types - ui->scroll_favs->update(); - //qDebug() << "End updateFavs"; -} - -// Page update routines -void StartMenu::on_stackedWidget_currentChanged(int val){ - QWidget *page = ui->stackedWidget->widget(val); - ui->tool_back->setVisible(page != ui->page_main); - ui->line_search->setFocus(); - - //Now the page specific updates - if(page == ui->page_main){ - if(!ui->label_status_battery->whatsThis().isEmpty()){ - //Battery available - update the status button - int charge = LOS::batteryCharge(); - QString TT, ICON; - if(charge<=5){ ICON="-caution"; } - else if(charge<=20){ ICON="-040"; } - else if(charge<=70){ ICON="-060"; } - else if(charge<=90){ ICON="-080"; } - else{ ICON="-100"; } - if(LOS::batteryIsCharging()){ - if(charge>=80){ ICON.clear(); } //for charging, there is no suffix to the icon name over 80% - ICON.prepend("battery-charging"); - TT = QString(tr("%1% (Plugged In)")).arg(QString::number(charge)); - }else{ - ICON.prepend("battery"); - int secs = LOS::batterySecondsLeft(); - if(secs>1){ TT = QString(tr("%1% (%2 Estimated)")).arg(QString::number(charge), LUtils::SecondsToDisplay(secs)); } - else{ TT = QString(tr("%1% Remaining")).arg(QString::number(charge)); } - } - //qDebug() << " Battery Icon:" << ICON << val << TT - ui->label_status_battery->setPixmap( LXDG::findIcon(ICON,"").pixmap(ui->tool_goto_apps->iconSize()/2) ); - ui->label_status_battery->setToolTip(TT); - } - //Network Status - ui->label_status_network->clear(); //not implemented yet - }else if(page == ui->page_apps){ - //Nothing needed for this page explicitly - }else if( page == ui->page_settings){ - // -- Workspaces - int tot = LSession::handle()->XCB->NumberOfWorkspaces(); - if(tot>1){ - ui->frame_wkspace->setVisible(true); - int cur = LSession::handle()->XCB->CurrentWorkspace(); - ui->label_wkspace->setText( QString(tr("Workspace %1/%2")).arg(QString::number(cur+1), QString::number(tot)) ); - }else{ - ui->frame_wkspace->setVisible(false); - } - // -- Brightness Controls - int tmp = LOS::ScreenBrightness(); - ui->frame_bright->setVisible(tmp >= 0); - if(tmp >= 0){ ui->slider_bright->setValue(tmp); } - // -- Audio Controls - tmp = LOS::audioVolume(); - ui->frame_audio->setVisible(tmp >= 0); - if(tmp >= 0){ ui->slider_volume->setValue(tmp); } - }else if(page == ui->page_leave){ - if( !ui->frame_leave_system->whatsThis().isEmpty() ){ - //This frame is allowed/visible - need to adjust the shutdown detection - bool updating = LOS::systemPerformingUpdates(); - ui->tool_restart->setEnabled(!updating); - ui->tool_shutdown->setEnabled(!updating); - ui->label_updating->setVisible(updating); //to let the user know *why* they can't shutdown/restart right now - } - ui->frame_leave_suspend->setVisible( LOS::systemCanSuspend() ); - } - -} - -void StartMenu::catViewChanged(){ - QString state; - switch(ui->check_apps_showcats->checkState()){ - case Qt::Checked: - state = "true"; - break; - case Qt::PartiallyChecked: - state = "partial"; - break; - default: - state = "false"; - } - LSession::handle()->DesktopPluginSettings()->setValue("panelPlugs/systemstart/showcategories", state); - //Now kick off the reload of the apps list - UpdateApps(); - //QtConcurrent::run(this, &StartMenu::UpdateApps); //this was a direct user change - keep it thread safe -} -//Page Change Buttons -void StartMenu::on_tool_goto_apps_clicked(){ - ui->stackedWidget->setCurrentWidget(ui->page_apps); -} - -void StartMenu::on_tool_goto_settings_clicked(){ - ui->stackedWidget->setCurrentWidget(ui->page_settings); -} - -void StartMenu::on_tool_goto_logout_clicked(){ - ui->stackedWidget->setCurrentWidget(ui->page_leave); -} - -void StartMenu::on_tool_back_clicked(){ - ui->stackedWidget->setCurrentWidget(ui->page_main); -} - - -//Launch Buttons -void StartMenu::on_tool_launch_controlpanel_clicked(){ - LaunchItem(ui->tool_launch_controlpanel->whatsThis()); -} - -void StartMenu::on_tool_launch_fm_clicked(){ - LaunchItem(QDir::homePath()); -} - -void StartMenu::on_tool_launch_store_clicked(){ - LaunchItem(ui->tool_launch_store->whatsThis()); -} - -void StartMenu::on_tool_launch_desksettings_clicked(){ - LaunchItem("lumina-config", false); -} - -void StartMenu::on_tool_launch_deskinfo_clicked(){ - LaunchItem("lumina-info",false); -} - -//Logout Buttons -void StartMenu::on_tool_lock_clicked(){ - //QProcess::startDetached("xscreensaver-command -lock"); - LaunchItem("xscreensaver-command -lock",false); -} - -void StartMenu::on_tool_logout_clicked(){ - emit CloseMenu(); - LSession::handle()->StartLogout(); -} - -void StartMenu::on_tool_restart_clicked(){ - emit CloseMenu(); - QCoreApplication::processEvents(); - bool skipupdates = false; - if( !promptAboutUpdates(skipupdates) ){ return; } - LSession::handle()->StartReboot(skipupdates); -} - -void StartMenu::on_tool_shutdown_clicked(){ - emit CloseMenu(); - QCoreApplication::processEvents(); - bool skipupdates = false; - if( !promptAboutUpdates(skipupdates) ){ return; } - LSession::handle()->StartShutdown(skipupdates); -} - -void StartMenu::on_tool_suspend_clicked(){ - //Make sure to lock the system first (otherwise anybody can access it again) - emit CloseMenu(); - LUtils::runCmd("xscreensaver-command -lock"); - LOS::systemSuspend(); -} - - -//Audio Volume -void StartMenu::on_slider_volume_valueChanged(int val){ - ui->label_vol->setText(QString::number(val)+"%"); - LOS::setAudioVolume(val); - //Also adjust the icon for the volume - if(val<1){ ui->tool_mute_audio->setIcon(LXDG::findIcon("audio-volume-muted","")); } - else if(val<33){ ui->tool_mute_audio->setIcon(LXDG::findIcon("audio-volume-low","")); } - else if(val<66){ ui->tool_mute_audio->setIcon(LXDG::findIcon("audio-volume-medium","")); } - else{ ui->tool_mute_audio->setIcon(LXDG::findIcon("audio-volume-high","")); } -} - -void StartMenu::on_tool_launch_mixer_clicked(){ - if(LOS::hasMixerUtility()){ - emit CloseMenu(); - LOS::startMixerUtility(); - } -} - -void StartMenu::on_tool_mute_audio_clicked(){ - static int lastvol = 50; - if(ui->slider_volume->value()==0){ ui->slider_volume->setValue(lastvol); } - else{ - lastvol = ui->slider_volume->value(); - ui->slider_volume->setValue(0); - } -} - -//Screen Brightness -void StartMenu::on_slider_bright_valueChanged(int val){ - ui->label_bright->setText(QString::number(val)+"%"); - LOS::setScreenBrightness(val); -} - - -//Workspace -void StartMenu::on_tool_set_nextwkspace_clicked(){ - int cur = LSession::handle()->XCB->CurrentWorkspace(); - int tot = LSession::handle()->XCB->NumberOfWorkspaces(); - //qDebug()<< "Next Workspace:" << cur << tot; - cur++; - if(cur>=tot){ cur = 0; } //back to beginning - //qDebug() << " - New Current:" << cur; - LSession::handle()->XCB->SetCurrentWorkspace(cur); - ui->label_wkspace->setText( QString(tr("Workspace %1/%2")).arg(QString::number(cur+1), QString::number(tot)) ); -} - -void StartMenu::on_tool_set_prevwkspace_clicked(){ - int cur = LSession::handle()->XCB->CurrentWorkspace(); - int tot = LSession::handle()->XCB->NumberOfWorkspaces(); - //qDebug()<< "Next Workspace:" << cur << tot; - cur--; - if(cur<0){ cur = tot-1; } //back to end - //qDebug() << " - New Current:" << cur; - LSession::handle()->XCB->SetCurrentWorkspace(cur); - ui->label_wkspace->setText( QString(tr("Workspace %1/%2")).arg(QString::number(cur+1), QString::number(tot)) ); -} - - -//Locale -void StartMenu::on_combo_locale_currentIndexChanged(int){ - //Get the currently selected Locale - if(ui->stackedWidget->currentWidget()!=ui->page_settings){ return; } - QString locale = ui->combo_locale->currentData().toString(); - emit CloseMenu(); - LSession::processEvents(); - LSession::handle()->switchLocale(locale); -} - - -//Search -void StartMenu::on_line_search_textEdited(QString){ - if(searchTimer->isActive()){ searchTimer->stop(); } - searchTimer->start(); -} - -void StartMenu::startSearch(){ - if(!this->isVisible()){ return; } //menu closed while timer was active - do_search(ui->line_search->text(),false); //auto-launched -} - -void StartMenu::on_line_search_returnPressed(){ - if(topsearch.isEmpty()){ return; } - LaunchItem(topsearch); -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/StartMenu.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/StartMenu.h deleted file mode 100644 index 8ab04d94..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/StartMenu.h +++ /dev/null @@ -1,105 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_DESKTOP_SYSTEM_START_PANEL_PLUGIN_H -#define _LUMINA_DESKTOP_SYSTEM_START_PANEL_PLUGIN_H - -#include <QWidget> -#include <QScrollArea> -#include <QMouseEvent> - -#include <LuminaXDG.h> - -namespace Ui{ - class StartMenu; -}; - -class StartMenu : public QWidget{ - Q_OBJECT -public: - StartMenu(QWidget *parent = 0); - ~StartMenu(); - -public slots: - void UpdateAll(); //for re-translation/icon changes - void UpdateMenu(bool forceall = false); //for item changes - - void ReLoadQuickLaunch(); - void UpdateQuickLaunch(QString, bool); - -private: - Ui::StartMenu *ui; - QStringList favs; - QString CCat, CSearch, topsearch; //current category/search - QTimer *searchTimer; - - //Simple utility functions - //void deleteChildren(QWidget *obj); //recursive function - void ClearScrollArea(QScrollArea *area); - void SortScrollArea(QScrollArea *area); - void do_search(QString search, bool force); - - bool promptAboutUpdates(bool &skip); - -private slots: - void LaunchItem(QString path, bool fix = true); - - //Application/Favorite Listings - void ChangeCategory(QString cat); - void UpdateApps(); - void UpdateFavs(); - - // Page update routines - void on_stackedWidget_currentChanged(int); //page changed - void catViewChanged(); //application categorization view mode changed - - //Page Change Buttons - void on_tool_goto_apps_clicked(); - void on_tool_goto_settings_clicked(); - void on_tool_goto_logout_clicked(); - void on_tool_back_clicked(); - - //Launch Buttons - void on_tool_launch_controlpanel_clicked(); - void on_tool_launch_fm_clicked(); - void on_tool_launch_store_clicked(); - void on_tool_launch_desksettings_clicked(); - void on_tool_launch_deskinfo_clicked(); - - //Logout Buttons - void on_tool_lock_clicked(); - void on_tool_logout_clicked(); - void on_tool_restart_clicked(); - void on_tool_shutdown_clicked(); - void on_tool_suspend_clicked(); - - //Audio Volume - void on_slider_volume_valueChanged(int); - void on_tool_launch_mixer_clicked(); - void on_tool_mute_audio_clicked(); - - //Screen Brightness - void on_slider_bright_valueChanged(int); - - //Workspace - void on_tool_set_nextwkspace_clicked(); - void on_tool_set_prevwkspace_clicked(); - - //Locale - void on_combo_locale_currentIndexChanged(int); - - //Search - void on_line_search_textEdited(QString); - void startSearch(); - void on_line_search_returnPressed(); - -signals: - void CloseMenu(); - void UpdateQuickLaunch(QStringList); - -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/StartMenu.ui b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/StartMenu.ui deleted file mode 100644 index 74f61d7f..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemstart/StartMenu.ui +++ /dev/null @@ -1,1148 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>StartMenu</class> - <widget class="QWidget" name="StartMenu"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>181</width> - <height>405</height> - </rect> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <property name="styleSheet"> - <string notr="true">QScrollArea{background: transparent; border: none; }</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="spacing"> - <number>2</number> - </property> - <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="QLineEdit" name="line_search"> - <property name="placeholderText"> - <string>Type to search</string> - </property> - </widget> - </item> - <item> - <widget class="QStackedWidget" name="stackedWidget"> - <property name="currentIndex"> - <number>4</number> - </property> - <widget class="QWidget" name="page_main"> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <property name="spacing"> - <number>2</number> - </property> - <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"> - <item> - <widget class="QLabel" name="label_status_battery"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string notr="true">bat%</string> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_status_network"> - <property name="text"> - <string notr="true">netstat</string> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_status"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string notr="true"/> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="Line" name="line_14"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QScrollArea" name="scroll_favs"> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> - </property> - <property name="styleSheet"> - <string notr="true"/> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Plain</enum> - </property> - <property name="verticalScrollBarPolicy"> - <enum>Qt::ScrollBarAsNeeded</enum> - </property> - <property name="horizontalScrollBarPolicy"> - <enum>Qt::ScrollBarAlwaysOff</enum> - </property> - <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"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>179</width> - <height>177</height> - </rect> - </property> - </widget> - </widget> - </item> - <item> - <widget class="Line" name="line_3"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_launch_fm"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Browse Files</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_goto_apps"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Browse Applications</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_launch_controlpanel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Control Panel</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_goto_settings"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Preferences</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="popupMode"> - <enum>QToolButton::InstantPopup</enum> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_6"> - <item> - <widget class="QToolButton" name="tool_goto_logout"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="styleSheet"> - <string notr="true">QToolButton::menu-arrow{ image: rightarrow-icon; }</string> - </property> - <property name="text"> - <string>Leave</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="popupMode"> - <enum>QToolButton::DelayedPopup</enum> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - <property name="arrowType"> - <enum>Qt::NoArrow</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_lock"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string notr="true">lock</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_apps"> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <property name="spacing"> - <number>2</number> - </property> - <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> - <widget class="QToolButton" name="tool_launch_store"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Manage Applications</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line_15"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="check_apps_showcats"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Show Categories</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - <property name="tristate"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line_4"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QScrollArea" name="scroll_apps"> - <property name="horizontalScrollBarPolicy"> - <enum>Qt::ScrollBarAlwaysOff</enum> - </property> - <property name="sizeAdjustPolicy"> - <enum>QAbstractScrollArea::AdjustToContents</enum> - </property> - <property name="widgetResizable"> - <bool>true</bool> - </property> - <widget class="QWidget" name="scrollAreaWidgetContents_2"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>179</width> - <height>284</height> - </rect> - </property> - </widget> - </widget> - </item> - <item> - <widget class="Line" name="line_5"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_settings"> - <layout class="QVBoxLayout" name="verticalLayout_9"> - <property name="spacing"> - <number>2</number> - </property> - <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_7"> - <item> - <widget class="QToolButton" name="tool_launch_desksettings"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Configure Desktop</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_launch_deskinfo"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string notr="true">info</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="Line" name="line_8"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QFrame" name="frame_audio"> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <layout class="QVBoxLayout" name="verticalLayout_8"> - <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_5"> - <item> - <widget class="QToolButton" name="tool_mute_audio"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string notr="true"/> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <layout class="QVBoxLayout" name="verticalLayout_11"> - <item> - <widget class="QSlider" name="slider_volume"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="maximum"> - <number>100</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_vol"> - <property name="text"> - <string notr="true">vol%</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QToolButton" name="tool_launch_mixer"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string notr="true"/> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="autoRaise"> - <bool>false</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="Line" name="line_7"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QFrame" name="frame_bright"> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <layout class="QVBoxLayout" name="verticalLayout_7"> - <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_3"> - <item> - <widget class="QLabel" name="label_bright_icon"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="text"> - <string notr="true"/> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item> - <widget class="QSlider" name="slider_bright"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="minimum"> - <number>10</number> - </property> - <property name="maximum"> - <number>100</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_bright"> - <property name="text"> - <string notr="true">br%</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="Line" name="line_9"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QFrame" name="frame_wkspace"> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <layout class="QVBoxLayout" name="verticalLayout_4"> - <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_4"> - <item> - <widget class="QToolButton" name="tool_set_prevwkspace"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string notr="true">prev</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_wkspace"> - <property name="text"> - <string notr="true">workspace #</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_set_nextwkspace"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string notr="true">next</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="Line" name="line_10"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QFrame" name="frame_locale"> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <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> - <widget class="QLabel" name="label_locale_icon"> - <property name="text"> - <string notr="true">Locale:</string> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="combo_locale"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>161</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="Line" name="line_6"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_leave"> - <layout class="QVBoxLayout" name="verticalLayout_6"> - <property name="spacing"> - <number>2</number> - </property> - <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> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>185</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QFrame" name="frame_leave_suspend"> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <layout class="QVBoxLayout" name="verticalLayout_10"> - <property name="spacing"> - <number>2</number> - </property> - <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> - <widget class="QToolButton" name="tool_suspend"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Suspend System</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line_11"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QFrame" name="frame_leave_system"> - <property name="styleSheet"> - <string notr="true">QFrame#frame_leave_system{border: none; background: transparent; }</string> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <layout class="QVBoxLayout" name="verticalLayout_5"> - <property name="spacing"> - <number>2</number> - </property> - <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> - <widget class="QToolButton" name="tool_restart"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Restart System</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_shutdown"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Power Off System</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_updating"> - <property name="text"> - <string>(System Performing Updates)</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="Line" name="line_13"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_logout"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Sign Out User</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line_12"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_search"> - <layout class="QVBoxLayout" name="verticalLayout_12"> - <item> - <widget class="QScrollArea" name="scroll_search"> - <property name="widgetResizable"> - <bool>true</bool> - </property> - <widget class="QWidget" name="scrollAreaWidgetContents_3"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>161</width> - <height>332</height> - </rect> - </property> - </widget> - </widget> - </item> - </layout> - </widget> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_back"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Back</string> - </property> - <property name="iconSize"> - <size> - <width>32</width> - <height>32</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - <property name="arrowType"> - <enum>Qt::NoArrow</enum> - </property> - </widget> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemtray/LSysTray.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemtray/LSysTray.cpp deleted file mode 100644 index a71fd57e..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemtray/LSysTray.cpp +++ /dev/null @@ -1,167 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2012-2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "LSysTray.h" -#include "../../LSession.h" - -LSysTray::LSysTray(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){ - frame = new QFrame(this); - frame->setContentsMargins(0,0,0,0); - //frame->setStyleSheet("QFrame{ background: transparent; border: 1px solid transparent; border-radius: 3px; }"); - LI = new QBoxLayout( this->layout()->direction()); - frame->setLayout(LI); - LI->setAlignment(Qt::AlignCenter); - LI->setSpacing(0); - LI->setContentsMargins(0,0,0,0); - this->layout()->addWidget(frame); - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); - //TrayID=0; - upTimer = new QTimer(this); - upTimer->setInterval(300000); //maximum time between refreshes is 5 minutes - connect(upTimer, SIGNAL(timeout()), this, SLOT(checkAll()) ); - isRunning = false; stopping = false; checking = false; pending = false; - QTimer::singleShot(100, this, SLOT(start()) ); - //Also do one extra check a minute or so after startup (just in case something got missed in the initial flood of registrations) - QTimer::singleShot(90000,this, SLOT(checkAll()) ); - connect(LSession::handle(), SIGNAL(TrayListChanged()), this, SLOT(checkAll()) ); - connect(LSession::handle(), SIGNAL(TrayIconChanged(WId)), this, SLOT(UpdateTrayWindow(WId)) ); - connect(LSession::handle(), SIGNAL(VisualTrayAvailable()), this, SLOT(start()) ); -} - -LSysTray::~LSysTray(){ - if(isRunning){ - this->stop(); - } -} - -void LSysTray::start(){ - if(isRunning || stopping){ return; } //already running - isRunning = LSession::handle()->registerVisualTray(this->winId()); - qDebug() << "Visual Tray Started:" << this->type() << isRunning; - if(isRunning){ - //upTimer->start(); - QTimer::singleShot(0,this, SLOT(checkAll()) ); - } -} - -void LSysTray::stop(){ - if(!isRunning){ return; } - stopping = true; - upTimer->stop(); - //Now close down the system tray registry - qDebug() << "Stop visual system tray:" << this->type(); - //LX11::closeSystemTray(TrayID); - //TrayID = 0; - disconnect(this); //remove any signals/slots - isRunning = false; - //Release all the tray applications and delete the containers - if( !LSession::handle()->currentTrayApps(this->winId()).isEmpty() ){ - qDebug() << " - Remove tray applications"; - //This overall system tray is not closed down - go ahead and release them here - for(int i=(trayIcons.length()-1); i>=0; i--){ - trayIcons[i]->detachApp(); - TrayIcon *cont = trayIcons.takeAt(i); - LI->removeWidget(cont); - cont->deleteLater(); - } - } - //Now let some other visual tray take over - LSession::handle()->unregisterVisualTray(this->winId()); - qDebug() << "Done stopping visual tray"; -} - -// ======================== -// PRIVATE FUNCTIONS -// ======================== -void LSysTray::checkAll(){ - if(!isRunning || stopping || checking){ pending = true; return; } //Don't check if not running at the moment - checking = true; - pending = false; - //Make sure this tray should handle the windows (was not disabled in the backend) - bool TrayRunning = LSession::handle()->registerVisualTray(this->winId()); - //qDebug() << "System Tray: Check tray apps"; - QList<WId> wins = LSession::handle()->currentTrayApps(this->winId()); - for(int i=0; i<trayIcons.length(); i++){ - int index = wins.indexOf(trayIcons[i]->appID()); - if(index < 0){ - //Tray Icon no longer exists: remove it - qDebug() << " - Visual System Tray: Remove Icon:" << trayIcons[i]->appID(); - TrayIcon *cont = trayIcons.takeAt(i); - cont->cleanup(); - LI->removeWidget(cont); - cont->deleteLater(); - i--; //List size changed - //Re-adjust the maximum widget size to account for what is left - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - this->setMaximumSize( trayIcons.length()*this->height(), 10000); - }else{ - this->setMaximumSize(10000, trayIcons.length()*this->width()); - } - }else{ - //Tray Icon already exists - //qDebug() << " - SysTray: Update Icon"; - trayIcons[i]->update(); - wins.removeAt(index); //Already found - remove from the list - } - } - //Now go through any remaining windows and add them - for(int i=0; i<wins.length() && TrayRunning; i++){ - qDebug() << " - Visual System Tray: Add Icon:" << wins[i]; - TrayIcon *cont = new TrayIcon(this); - connect(cont, SIGNAL(BadIcon()), this, SLOT(checkAll()) ); - //LSession::processEvents(); - trayIcons << cont; - LI->addWidget(cont); - //qDebug() << " - Update tray layout"; - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - int sz = this->height()-2-2*frame->frameWidth(); - if(sz>64){ sz = 64; } - cont->setSizeSquare(sz); //horizontal tray - this->setMaximumSize( trayIcons.length()*this->height(), 10000); - }else{ - int sz = this->width()-2-2*frame->frameWidth(); - if(sz>64){ sz = 64; } - cont->setSizeSquare(sz); //vertical tray - this->setMaximumSize(10000, trayIcons.length()*this->width()); - } - //LSession::processEvents(); - //qDebug() << " - Attach tray app"; - cont->attachApp(wins[i]); - if(cont->appID()==0){ - //could not attach window - remove the widget - qDebug() << " - Invalid Tray App: Could Not Embed:"; - trayIcons.takeAt(trayIcons.length()-1); //Always at the end - LI->removeWidget(cont); - cont->deleteLater(); - continue; - } - LI->update(); //make sure there is no blank space in the layout - } - /*if(listChanged){ - //Icons got moved around: be sure to re-draw all of them to fix visuals - for(int i=0; i<trayIcons.length(); i++){ - trayIcons[i]->update(); - } - }*/ - //qDebug() << " - System Tray: check done"; - checking = false; - if(pending){ QTimer::singleShot(0,this, SLOT(checkAll()) ); } -} - -void LSysTray::UpdateTrayWindow(WId win){ - if(!isRunning || stopping || checking){ return; } - for(int i=0; i<trayIcons.length(); i++){ - if(trayIcons[i]->appID()==win){ - //qDebug() << "System Tray: Update Window " << win; - trayIcons[i]->repaint(); //don't use update() because we need an instant repaint (not a cached version) - return; //finished now - } - } - //Could not find tray in the list, run the checkall routine to make sure we are not missing any - //qDebug() << "System Tray: Missing Window - check all"; - QTimer::singleShot(0,this, SLOT(checkAll()) ); -} - diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemtray/LSysTray.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemtray/LSysTray.h deleted file mode 100644 index 7db307c6..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemtray/LSysTray.h +++ /dev/null @@ -1,74 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2012-2015, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#ifndef _LUMINA_DESKTOP_SYSTRAY_H -#define _LUMINA_DESKTOP_SYSTRAY_H - -//Qt includes -#include <QFrame> -#include <QHBoxLayout> -#include <QDebug> -#include <QX11Info> -#include <QCoreApplication> - -//Local includes -#include "../LPPlugin.h" -#include "TrayIcon.h" - -//SYSTEM TRAY STANDARD DEFINITIONS -#define SYSTEM_TRAY_REQUEST_DOCK 0 -#define SYSTEM_TRAY_BEGIN_MESSAGE 1 -#define SYSTEM_TRAY_CANCEL_MESSAGE 2 - -class LSysTray : public LPPlugin{ - Q_OBJECT -public: - LSysTray(QWidget *parent = 0, QString id="systemtray", bool horizontal=true); - ~LSysTray(); - - virtual void AboutToClose(){ - this->stop(); - } - -private: - bool isRunning, stopping, checking, pending; - QList<TrayIcon*> trayIcons; - QFrame *frame; - QBoxLayout *LI; //layout items - QTimer *upTimer; //manual timer to force refresh of all items - -private slots: - void checkAll(); - void UpdateTrayWindow(WId win); - - //void removeTrayIcon(WId win); - -public slots: - void start(); - void stop(); - - virtual void OrientationChange(){ - //make sure the internal layout has the same orientation as the main widget - LI->setDirection( this->layout()->direction() ); - //Re-adjust the maximum widget size - int sz; - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - this->setMaximumSize( trayIcons.length()*this->height(), 10000); - sz = this->height()-2*frame->frameWidth(); - }else{ - this->setMaximumSize(10000, trayIcons.length()*this->width()); - sz = this->width()-2*frame->frameWidth(); - } - if(sz>64){ sz = 64; } //many tray icons can't go larger than this anyway - for(int i=0; i<trayIcons.length(); i++){ - trayIcons[i]->setSizeSquare(sz); - trayIcons[i]->repaint(); - } - } - -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemtray/TrayIcon.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemtray/TrayIcon.cpp deleted file mode 100644 index 9fdbce50..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemtray/TrayIcon.cpp +++ /dev/null @@ -1,128 +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 "TrayIcon.h" - -#include <LSession.h> -#include <QScreen> -#include <LuminaX11.h> - -TrayIcon::TrayIcon(QWidget *parent) : QWidget(parent){ - AID = 0; //nothing yet - IID = 0; - dmgID = 0; - badpaints = 0; - //this->setLayout(new QHBoxLayout); - //this->layout()->setContentsMargins(0,0,0,0); -} - -TrayIcon::~TrayIcon(){ -} - -void TrayIcon::cleanup(){ - AID = IID = 0; -} - -WId TrayIcon::appID(){ - return AID; -} - -void TrayIcon::attachApp(WId id){ - if(id==0){ return; } //nothing to attach - else if(AID!=0){ qWarning() << "Tray Icon is already attached to a window!"; return; } - AID = id; - //WIN = QWindow::fromWinId(AID); - //connect(WIN, SIGNAL( - //this->layout()->addWidget( QWidget::createWindowContainer(WIN, this) ); - IID = this->winId(); //embed directly into this widget - dmgID = LSession::handle()->XCB->EmbedWindow(AID, IID); - if( dmgID != 0 ){ - LSession::handle()->XCB->RestoreWindow(AID); //make it visible - //qDebug() << "New System Tray App:" << AID; - QTimer::singleShot(1000, this, SLOT(updateIcon()) ); - }else{ - //qWarning() << "Could not Embed Tray Application:" << AID; - IID = 0; - AID = 0; - } -} - -void TrayIcon::setSizeSquare(int side){ - //qDebug() << " Set Fixed Systray size:" << side; - this->setFixedSize( QSize(side, side) ); -} - -// ============== -// PUBLIC SLOTS -// ============== -void TrayIcon::detachApp(){ - if(AID==0){ return; } //already detached - //qDebug() << "Detach App:" << AID; - //Temporarily move the AID, so that internal slots do not auto-run - WId tmp = AID; - AID = 0; - //Now detach the application window and clean up - //qDebug() << " - Unembed"; - //WIN->setParent(0); //Reset parentage back to the main stack - LSession::handle()->XCB->UnembedWindow(tmp); - //qDebug() << " - finished app:" << tmp; - IID = 0; -} - -// ============== -// PRIVATE SLOTS -// ============== -void TrayIcon::updateIcon(){ - if(AID==0){ return; } - //Make sure the icon is square - QSize icosize = this->size(); - LSession::handle()->XCB->ResizeWindow(AID, icosize.width(), icosize.height()); - QTimer::singleShot(500, this, SLOT(update()) ); //make sure to re-draw the window in a moment -} - -// ============= -// PROTECTED -// ============= -void TrayIcon::paintEvent(QPaintEvent *event){ - QWidget::paintEvent(event); //make sure the background is already painted - if(AID!=0){ - //Update the background on the tray app - //qDebug() << "Paint Tray Background"; - //LSession::handle()->XCB->SetWindowBackground(this, this->geometry(), AID); - //qDebug() << "Paint Tray:" << AID; - QPainter painter(this); - //Now paint the tray app on top of the background - //qDebug() << " - Draw tray:" << AID << IID << this->winId(); - //qDebug() << " - - " << event->rect().x() << event->rect().y() << event->rect().width() << event->rect().height(); - //qDebug() << " - Get image:" << AID; - QPixmap pix = LSession::handle()->XCB->TrayImage(AID); //= WIN->icon().pixmap(this->size()); - - //qDebug() << " - Pix size:" << pix.size().width() << pix.size().height(); - //qDebug() << " - Geom:" << this->geometry().x() << this->geometry().y() << this->geometry().width() << this->geometry().height(); - if(!pix.isNull()){ - if(this->size() != pix.size()){ QTimer::singleShot(10, this, SLOT(updateIcon())); } - painter.drawPixmap(0,0,this->width(), this->height(), pix.scaled(this->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation) ); - badpaints = 0; //good paint - }else{ - badpaints++; - if(badpaints>5){ - qWarning() << " - - No Tray Icon/Image found!" << "ID:" << AID; - AID = 0; //reset back to nothing - IID = 0; - emit BadIcon(); //removed/destroyed in some non-valid way? - } - } - //qDebug() << " - Done"; - } -} - -void TrayIcon::resizeEvent(QResizeEvent *event){ - //qDebug() << "Resize Event:" << event->size().width() << event->size().height(); - if(AID!=0){ - LSession::handle()->XCB->ResizeWindow(AID, event->size()); - QTimer::singleShot(500, this, SLOT(update()) ); //make sure to re-draw the window in a moment - } -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemtray/TrayIcon.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemtray/TrayIcon.h deleted file mode 100644 index 5d072cc1..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemtray/TrayIcon.h +++ /dev/null @@ -1,55 +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 -//=========================================== -// Note: The basic idea behind this class that that it puts the app window -// in the same spot as the tray icon (to directly pass mouse events and such), -// while keeping the tray icon visual in sync with the app window -//=========================================== -#ifndef _LUMINA_PANEL_PLUGIN_SYSTEM_TRAY_ICON_H -#define _LUMINA_PANEL_PLUGIN_SYSTEM_TRAY_ICON_H - -//Qt includes -#include <QWidget> -#include <QTimer> -#include <QPaintEvent> -#include <QMoveEvent> -#include <QResizeEvent> -#include <QPainter> -#include <QPixmap> -#include <QImage> -//#include <QWindow> -// libLumina includes -//#include <LuminaX11.h> - -class TrayIcon : public QWidget{ - Q_OBJECT -public: - TrayIcon(QWidget* parent = 0); - ~TrayIcon(); - - void cleanup(); //about to be removed after window was detroyed - - WId appID(); //the ID for the attached application - void attachApp(WId id); - void setSizeSquare(int side); - -public slots: - void detachApp(); - void updateIcon(); - -private: - WId IID, AID; //icon ID and app ID - int badpaints; - uint dmgID; - -protected: - void paintEvent(QPaintEvent *event); - void resizeEvent(QResizeEvent *event); - -signals: - void BadIcon(); -}; -#endif
\ No newline at end of file diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/taskmanager/LTaskButton.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/taskmanager/LTaskButton.cpp deleted file mode 100644 index 0dd68bb0..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/taskmanager/LTaskButton.cpp +++ /dev/null @@ -1,271 +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 -//=========================================== -#include "LTaskButton.h" -#include "LSession.h" - -#ifndef DEBUG -#define DEBUG 0 -#endif - -LTaskButton::LTaskButton(QWidget *parent, bool smallDisplay) : LTBWidget(parent){ - actMenu = new QMenu(this); - winMenu = new QMenu(this); - UpdateMenus(); - showText = !smallDisplay; - this->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - this->setAutoRaise(false); //make sure these always look like buttons - this->setContextMenuPolicy(Qt::CustomContextMenu); - this->setFocusPolicy(Qt::NoFocus); - this->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); - winMenu->setContextMenuPolicy(Qt::CustomContextMenu); - connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(openActionMenu()) ); - connect(this, SIGNAL(clicked()), this, SLOT(buttonClicked()) ); - connect(winMenu, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(openActionMenu()) ); - connect(winMenu, SIGNAL(triggered(QAction*)), this, SLOT(winClicked(QAction*)) ); - connect(winMenu, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed())); - connect(actMenu, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed())); -} - -LTaskButton::~LTaskButton(){ - -} - -//=========== -// PUBLIC -//=========== -QList<WId> LTaskButton::windows(){ - QList<WId> list; - for(int i=0; i<WINLIST.length(); i++){ - list << WINLIST[i].windowID(); - } - return list; -} - -QString LTaskButton::classname(){ - return cname; -} - -bool LTaskButton::isActive(){ - return cstate == LXCB::ACTIVE; -} - -void LTaskButton::addWindow(WId win){ - WINLIST << LWinInfo(win); - UpdateButton(); -} - -void LTaskButton::rmWindow(WId win){ - for(int i=0; i<WINLIST.length(); i++){ - if(WINLIST[i].windowID() == win){ - WINLIST.removeAt(i); - break; - } - } - UpdateButton(); -} - -//========== -// PRIVATE -//========== -LWinInfo LTaskButton::currentWindow(){ - if(WINLIST.length() == 1 || cWin.windowID()==0){ - return WINLIST[0]; //only 1 window - this must be it - }else{ - return cWin; - } -} - -//============= -// PUBLIC SLOTS -//============= -void LTaskButton::UpdateButton(){ - if(winMenu->isVisible()){ return; } //skip this if the window menu is currently visible for now - bool statusOnly = (WINLIST.length() == LWINLIST.length()); - LWINLIST = WINLIST; - - winMenu->clear(); - LXCB::WINDOWVISIBILITY showstate = LXCB::IGNORE; - for(int i=0; i<WINLIST.length(); i++){ - if(WINLIST[i].windowID() == 0){ - WINLIST.removeAt(i); - i--; - continue; - } - if(i==0 && !statusOnly){ - //Update the button visuals from the first window - this->setIcon(WINLIST[i].icon(noicon)); - cname = WINLIST[i].Class(); - if(cname.isEmpty()){ - //Special case (chrome/chromium does not register *any* information with X except window title) - cname = WINLIST[i].text(); - if(cname.contains(" - ")){ cname = cname.section(" - ",-1); } - } - this->setToolTip(cname); - } - bool junk; - QAction *tmp = winMenu->addAction( WINLIST[i].icon(junk), WINLIST[i].text() ); - tmp->setData(i); //save which number in the WINLIST this entry is for - LXCB::WINDOWVISIBILITY stat = WINLIST[i].status(true); //update the saved state for the window - if(stat<LXCB::ACTIVE && WINLIST[i].windowID() == LSession::handle()->activeWindow()){ stat = LXCB::ACTIVE; } - if(stat > showstate){ showstate = stat; } //higher priority - } - //Now setup the button appropriately - // - visibility - if(showstate == LXCB::IGNORE || WINLIST.length() < 1){ this->setVisible(false); } - else{ this->setVisible(true); } - // - functionality - if(WINLIST.length() == 1){ - //single window - this->setPopupMode(QToolButton::DelayedPopup); - this->setMenu(actMenu); - if(showText){ - QString txt = WINLIST[0].text(); - if(txt.length()>30){ txt.truncate(27); txt.append("..."); } - else if(txt.length()<30){ txt = txt.leftJustified(30, ' '); } - this->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); this->setText(txt); - }else if(noicon){ this->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); this->setText( cname ); } - else{ this->setToolButtonStyle(Qt::ToolButtonIconOnly); this->setText(""); } - this->setToolTip(WINLIST[0].text()); - }else if(WINLIST.length() > 1){ - //multiple windows - this->setPopupMode(QToolButton::InstantPopup); - this->setMenu(winMenu); - this->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - if(noicon || showText){ "("+QString::number(WINLIST.length())+") "+cname; } - else{ this->setText("("+QString::number(WINLIST.length())+")"); } - } - this->setState(showstate); //Make sure this is after the button setup so that it properly sets the margins/etc - cstate = showstate; //save this for later -} - -void LTaskButton::UpdateMenus(){ - //Action menu should be auto-created for the state of the current window (cWin/cstate) - actMenu->clear(); - if(cstate!=LXCB::ACTIVE){ - actMenu->addAction( LXDG::findIcon("edit-select",""), tr("Activate Window"), this, SLOT(triggerWindow()) ); - } - if(cstate!=LXCB::INVISIBLE){ - actMenu->addAction( LXDG::findIcon("view-close",""), tr("Minimize Window"), this, SLOT(minimizeWindow()) ); - if(LSession::handle()->XCB->WindowIsMaximized(cWin.windowID()) ){ - actMenu->addAction( LXDG::findIcon("view-restore",""), tr("Restore Window"), this, SLOT(maximizeWindow()) ); - }else{ - actMenu->addAction( LXDG::findIcon("view-fullscreen",""), tr("Maximize Window"), this, SLOT(maximizeWindow()) ); - } - } - actMenu->addAction( LXDG::findIcon("window-close",""), tr("Close Window"), this, SLOT(closeWindow()) ); - if(WINLIST.length()>1 && !winMenu->isVisible()){ - actMenu->addSeparator(); - actMenu->addAction( LXDG::findIcon("layer-visible-on",""), tr("Show All Windows"), this, SLOT(showAllWindows()) ); - actMenu->addAction( LXDG::findIcon("layer-visible-off",""), tr("Minimize All Windows"), this, SLOT(hideAllWindows()) ); - actMenu->addAction( LXDG::findIcon("window-close",""), tr("Close All Windows"), this, SLOT(closeAllWindows()) ); - } -} - -//============= -// PRIVATE SLOTS -//============= -void LTaskButton::buttonClicked(){ - if(WINLIST.length() > 1){ - winMenu->popup(QCursor::pos()); - }else{ - triggerWindow(); - } -} - -void LTaskButton::closeWindow(){ - if(DEBUG){ qDebug() << "Close Window:" << this->text(); } - if(winMenu->isVisible()){ winMenu->hide(); } - LWinInfo win = currentWindow(); - LSession::handle()->XCB->CloseWindow(win.windowID()); - cWin = LWinInfo(); //clear the current -} - -void LTaskButton::maximizeWindow(){ - if(DEBUG){ qDebug() << "Maximize Window:" << this->text(); } - if(winMenu->isVisible()){ winMenu->hide(); } - LWinInfo win = currentWindow(); - LSession::handle()->XCB->MaximizeWindow(win.windowID()); - //LSession::handle()->adjustWindowGeom(win.windowID(), true); //run this for now until the WM works properly - cWin = LWinInfo(); //clear the current -} - -void LTaskButton::minimizeWindow(){ - if(DEBUG){ qDebug() << "Minimize Window:" << this->text(); } - if(winMenu->isVisible()){ winMenu->hide(); } - LWinInfo win = currentWindow(); - LSession::handle()->XCB->MinimizeWindow(win.windowID()); - cWin = LWinInfo(); //clear the current - QTimer::singleShot(100, this, SLOT(UpdateButton()) ); //make sure to update this button if losing active status -} - -void LTaskButton::showAllWindows(){ - for(int i=WINLIST.length()-1; i>=0; i--){ - if(WINLIST[i].status()==LXCB::INVISIBLE){ - LSession::handle()->XCB->RestoreWindow(WINLIST[i].windowID()); - } - } -} - -void LTaskButton::hideAllWindows(){ - for(int i=WINLIST.length()-1; i>=0; i--){ - LXCB::WINDOWVISIBILITY state = WINLIST[i].status(); - if(state==LXCB::VISIBLE || state==LXCB::ACTIVE){ - LSession::handle()->XCB->MinimizeWindow(WINLIST[i].windowID()); - } - } -} - -void LTaskButton::closeAllWindows(){ - for(int i=WINLIST.length()-1; i>=0; i--){ - LSession::handle()->XCB->CloseWindow(WINLIST[i].windowID()); - } -} - -void LTaskButton::triggerWindow(){ - LWinInfo win = currentWindow(); - //Check which state the window is currently in and flip it to the other - //LXCB::WINDOWSTATE state = cstate; - //if(DEBUG){ qDebug() << "Window State: " << state; } - if(cstate == LXCB::ACTIVE){ - if(DEBUG){ qDebug() << "Minimize Window:" << this->text(); } - LSession::handle()->XCB->MinimizeWindow(win.windowID()); - QTimer::singleShot(100, this, SLOT(UpdateButton()) ); //make sure to update this button if losing active status - }else{ - if(DEBUG){ qDebug() << "Activate Window:" << this->text(); } - LSession::handle()->XCB->ActivateWindow(win.windowID()); - } - cWin = LWinInfo(); //clear the current -} - -void LTaskButton::winClicked(QAction* act){ - //Get the window from the action - if(act->data().toInt() < WINLIST.length()){ - cWin = WINLIST[act->data().toInt()]; - cstate = cWin.status(); - }else{ cWin = LWinInfo(); } //clear it - //Now trigger the window - triggerWindow(); -} - -void LTaskButton::openActionMenu(){ - //Get the Window the mouse is currently over - QPoint curpos = QCursor::pos(); - QAction *act = winMenu->actionAt(winMenu->mapFromGlobal(curpos)); - //qDebug() << "Button Context Menu:" << curpos.x() << curpos.y() << winMenu->geometry().x() << winMenu->geometry().y() << winMenu->geometry().width() << winMenu->geometry().height(); - cWin = WINLIST[0]; //default to the first window - if( act != 0 && winMenu->isVisible() ){ - //Get the window from the action - //qDebug() << "Found Action:" << act->data().toInt(); - if(act->data().toInt() < WINLIST.length()){ - cWin = WINLIST[act->data().toInt()]; - } - } - cstate = cWin.status(); - //Now show the action menu - UpdateMenus(); - actMenu->popup(QCursor::pos()); -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/taskmanager/LTaskButton.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/taskmanager/LTaskButton.h deleted file mode 100644 index 6b171c6a..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/taskmanager/LTaskButton.h +++ /dev/null @@ -1,73 +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 -//=========================================== -#ifndef _LUMINA_DESKTOP_TASK_BUTTON_H -#define _LUMINA_DESKTOP_TASK_BUTTON_H - -// Qt includes -#include <QWidget> -#include <QList> -#include <QIcon> -#include <QCursor> -#include <QMenu> -#include <QEvent> -#include <QAction> - -// libLumina includes -#include <LuminaXDG.h> -#include <LuminaX11.h> - -// Local includes -#include "../../LWinInfo.h" -#include "../LTBWidget.h" - -class LTaskButton : public LTBWidget{ - Q_OBJECT -public: - LTaskButton(QWidget *parent=0, bool smallDisplay = true); - ~LTaskButton(); - - //Window Information - QList<WId> windows(); - QString classname(); - bool isActive(); - - //Window Management - void addWindow(WId win); //Add a window to this button - void rmWindow(WId win); //Remove a window from this button - -private: - QList<LWinInfo> WINLIST; - QList<LWinInfo> LWINLIST; - QMenu *actMenu; // action menu (custom context menu) - QMenu *winMenu; // window menu (if more than 1) - LWinInfo cWin; - QString cname; //class name for the entire button - bool noicon, showText; - - LWinInfo currentWindow(); //For getting the currently-active window - LXCB::WINDOWVISIBILITY cstate; //current state of the button - -public slots: - void UpdateButton(); //re-sync the current window infomation - void UpdateMenus(); //re-create the menus (text + icons) - -private slots: - void buttonClicked(); - void closeWindow(); //send the signal to close a window - void maximizeWindow(); //send the signal to maximize/restore a window - void minimizeWindow(); //send the signal to minimize a window (iconify) - void showAllWindows(); - void hideAllWindows(); - void closeAllWindows(); - void triggerWindow(); //change b/w visible and invisible - void winClicked(QAction*); - void openActionMenu(); - -signals: - void MenuClosed(); -}; -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/taskmanager/LTaskManagerPlugin.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/taskmanager/LTaskManagerPlugin.cpp deleted file mode 100644 index 79c5dd36..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/taskmanager/LTaskManagerPlugin.cpp +++ /dev/null @@ -1,141 +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 -//=========================================== -#include "LTaskManagerPlugin.h" -#include "../../LSession.h" - -LTaskManagerPlugin::LTaskManagerPlugin(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){ - timer = new QTimer(this); - timer->setSingleShot(true); - timer->setInterval(10); // 1/100 second - connect(timer, SIGNAL(timeout()), this, SLOT(UpdateButtons()) ); - usegroups = true; //backwards-compatible default value - if(id.contains("-nogroups")){ usegroups = false; } - connect(LSession::handle(), SIGNAL(WindowListEvent()), this, SLOT(checkWindows()) ); - connect(LSession::handle(), SIGNAL(WindowListEvent(WId)), this, SLOT(UpdateButton(WId)) ); - this->layout()->setContentsMargins(0,0,0,0); - QTimer::singleShot(0,this, SLOT(UpdateButtons()) ); //perform an initial sync - //QTimer::singleShot(100,this, SLOT(OrientationChange()) ); //perform an initial sync -} - -LTaskManagerPlugin::~LTaskManagerPlugin(){ - -} - -//============== -// PRIVATE SLOTS -//============== -void LTaskManagerPlugin::UpdateButtons(){ - updating = QDateTime::currentDateTime(); //global time stamp - QDateTime ctime = updating; //current thread time stamp - - //Get the current window list - QList<WId> winlist = LSession::handle()->XCB->WindowList(); - // Ignore the windows which don't want to be listed - for (int i = 0; i < winlist.length(); i++) { - QList<LXCB::WINDOWSTATE> states = LSession::handle()->XCB->WM_Get_Window_States(winlist[i]); - for (int j = 0; j < states.length(); j++) { - if (states[j] == LXCB::S_SKIP_TASKBAR) { - // Skip taskbar window - winlist.removeAt(i); - i--; - break; - } - } - } - //Do not change the status of the previously active window if it just changed to a non-visible window - //WId activeWin = LSession::handle()->XCB->ActiveWindow(); - //bool skipActive = !winlist.contains(activeWin); - //qDebug() << "Update Buttons:" << winlist; - if(updating > ctime){ return; } //another thread kicked off already - stop this one - //Now go through all the current buttons first - for(int i=0; i<BUTTONS.length(); i++){ - //Get the windows managed in this button - QList<WId> WI = BUTTONS[i]->windows(); - bool updated=false; - if(updating > ctime){ return; } //another thread kicked off already - stop this one - //Loop over all the windows for this button - for(int w=0; w<WI.length(); w++){ - if(updating > ctime){ return; } //another thread kicked off already - stop this one - if( winlist.contains( WI[w] ) ){ - //Still current window - update it later - winlist.removeAll(WI[w] ); //remove this window from the list since it is done - }else{ - //Window was closed - remove it - if(WI.length()==1){ - //Remove the entire button - //qDebug() << "Window Closed: Remove Button" ; - this->layout()->takeAt(i); //remove from the layout - BUTTONS.takeAt(i)->deleteLater(); - i--; - updated = true; //prevent updating a removed button - break; //break out of the button->window loop - }else{ - //qDebug() << "Window Closed: Remove from button:" << WI[w].windowID() << "Button:" << w; - BUTTONS[i]->rmWindow(WI[w]); // one of the multiple windows for the button - WI.removeAt(w); //remove this window from the list - w--; - } - updated=true; //button already changed - } - if(updating > ctime){ return; } //another thread kicked off already - stop this one - } - if(!updated){ - //qDebug() << "Update Button:" << i; - if(updating > ctime){ return; } //another thread kicked off already - stop this one - //if(!skipActive || !BUTTONS[i]->isActive()){ - QTimer::singleShot(1,BUTTONS[i], SLOT(UpdateButton()) ); //keep moving on - //} - } - } - //Now go through the remaining windows - for(int i=0; i<winlist.length(); i++){ - //New windows, create buttons for each (add grouping later) - if(updating > ctime){ return; } //another thread kicked off already - stop this one - //Check for a button that this can just be added to - QString ctxt = LSession::handle()->XCB->WindowClass(winlist[i]); - bool found = false; - for(int b=0; b<BUTTONS.length(); b++){ - if(updating > ctime){ return; } //another thread kicked off already - stop this one - if(BUTTONS[b]->classname()== ctxt && usegroups){ - //This adds a window to an existing group - found = true; - //qDebug() << "Add Window to Button:" << b; - BUTTONS[b]->addWindow(winlist[i]); - break; - } - } - if(!found){ - if(updating > ctime){ return; } //another thread kicked off already - stop this one - //No group, create a new button - //qDebug() << "New Button"; - LTaskButton *but = new LTaskButton(this, usegroups); - but->addWindow( winlist[i] ); - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - but->setIconSize(QSize(this->height(), this->height())); - }else{ - but->setIconSize(QSize(this->width(), this->width())); - } - this->layout()->addWidget(but); - connect(but, SIGNAL(MenuClosed()), this, SIGNAL(MenuClosed())); - BUTTONS << but; - } - } -} - -void LTaskManagerPlugin::UpdateButton(WId win){ - for(int i=0; i<BUTTONS.length(); i++){ - if(BUTTONS[i]->windows().contains(win)){ - qDebug() << "Update Task Manager Button (single window ping)"; - QTimer::singleShot(0,BUTTONS[i], SLOT(UpdateButton()) ); - break; - } - } -} - -void LTaskManagerPlugin::checkWindows(){ - timer->start(); -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/taskmanager/LTaskManagerPlugin.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/taskmanager/LTaskManagerPlugin.h deleted file mode 100644 index e6371f34..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/taskmanager/LTaskManagerPlugin.h +++ /dev/null @@ -1,71 +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 -//=========================================== -#ifndef _LUMINA_DESKTOP_TASK_MANAGER_PLUGIN_H -#define _LUMINA_DESKTOP_TASK_MANAGER_PLUGIN_H - -// Qt includes -#include <QWidget> -#include <QList> -#include <QString> -#include <QDebug> -#include <QTimer> -#include <QEvent> -#include <QDateTime> - -// libLumina includes -#include <LuminaX11.h> - -// Local includes -#include "LTaskButton.h" -#include "LWinInfo.h" -#include "../LPPlugin.h" - -class LTaskManagerPlugin : public LPPlugin{ - Q_OBJECT -public: - LTaskManagerPlugin(QWidget *parent=0, QString id="taskmanager", bool horizontal=true); - ~LTaskManagerPlugin(); - -private: - QList<LTaskButton*> BUTTONS; //to keep track of the current buttons - QTimer *timer; - QDateTime updating; //quick flag for if it is currently working - bool usegroups; - -private slots: - void UpdateButtons(); - void UpdateButton(WId win); - void checkWindows(); - -public slots: - void LocaleChange(){ - UpdateButtons(); - } - void ThemeChange(){ - UpdateButtons(); - } - void OrientationChange(){ - if(this->layout()->direction()==QBoxLayout::LeftToRight){ //horizontal - this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - this->layout()->setAlignment(Qt::AlignLeft); - QSize sz(this->height(), this->height()); - for(int i=0; i<BUTTONS.length(); i++){ - BUTTONS[i]->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - BUTTONS[i]->setIconSize(sz); - } - }else{ //vertical - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); - this->layout()->setAlignment(Qt::AlignTop); - QSize sz(this->width(), this->width()); - for(int i=0; i<BUTTONS.length(); i++){ - BUTTONS[i]->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); - BUTTONS[i]->setIconSize(sz); - } - } - } -}; -#endif
\ No newline at end of file diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/LUserButton.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/LUserButton.cpp deleted file mode 100644 index acb27135..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/LUserButton.cpp +++ /dev/null @@ -1,67 +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 -//=========================================== -#include "LUserButton.h" -#include "../../LSession.h" - -LUserButtonPlugin::LUserButtonPlugin(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){ - button = new QToolButton(this); - button->setAutoRaise(true); - button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - button->setPopupMode(QToolButton::DelayedPopup); //make sure it runs the update routine first - connect(button, SIGNAL(clicked()), this, SLOT(openMenu())); - this->layout()->setContentsMargins(0,0,0,0); - this->layout()->addWidget(button); - menu = new QMenu(this); - menu->setContentsMargins(1,1,1,1); - connect(menu, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed())); - usermenu = new UserWidget(this); - connect(usermenu, SIGNAL(CloseMenu()), this, SLOT(closeMenu()) ); - mact = new QWidgetAction(this); - mact->setDefaultWidget(usermenu); - menu->addAction(mact); - - button->setMenu(menu); - connect(menu, SIGNAL(aboutToHide()), this, SLOT(updateButtonVisuals()) ); - //Setup the global shortcut handling for opening the start menu - connect(QApplication::instance(), SIGNAL(StartButtonActivated()), this, SLOT(shortcutActivated()) ); - LSession::handle()->registerStartButton(this->type()); - - QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes -} - -LUserButtonPlugin::~LUserButtonPlugin(){ - -} - -void LUserButtonPlugin::updateButtonVisuals(){ - button->setToolTip(tr("Quickly launch applications or open files")); - button->setText( SYSTEM::user() ); - if( QFile::exists(QDir::homePath()+"/.loginIcon.png") ){ - button->setIcon( QIcon(QDir::homePath()+"/.loginIcon.png") ); - }else{ - button->setIcon( LXDG::findIcon("user-identity", ":/images/default-user.png") ); //force icon refresh - } -} - -// ======================== -// PRIVATE FUNCTIONS -// ======================== -void LUserButtonPlugin::openMenu(){ - usermenu->UpdateMenu(); - button->showMenu(); -} - -void LUserButtonPlugin::closeMenu(){ - menu->hide(); -} - -void LUserButtonPlugin::shortcutActivated(){ - if(LSession::handle()->registerStartButton(this->type())){ - if(menu->isVisible()){ closeMenu(); } - else{ openMenu(); } - } -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/LUserButton.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/LUserButton.h deleted file mode 100644 index 8d5e5040..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/LUserButton.h +++ /dev/null @@ -1,75 +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 panel plugin is the main button that allow the user to run -// applications or logout of the desktop -//=========================================== -#ifndef _LUMINA_DESKTOP_USER_MENU_PLUGIN_H -#define _LUMINA_DESKTOP_USER_MENU_PLUGIN_H - -// Qt includes -#include <QMenu> -#include <QWidgetAction> -#include <QToolButton> -#include <QString> -#include <QWidget> - - -// Lumina-desktop includes -//#include "../../Globals.h" -#include "../LPPlugin.h" //main plugin widget - -// libLumina includes -#include "LuminaXDG.h" - -#include "UserWidget.h" - -// PANEL PLUGIN BUTTON -class LUserButtonPlugin : public LPPlugin{ - Q_OBJECT - -public: - LUserButtonPlugin(QWidget *parent = 0, QString id = "userbutton", bool horizontal=true); - ~LUserButtonPlugin(); - -private: - QMenu *menu; - QWidgetAction *mact; - UserWidget *usermenu; - QToolButton *button; - -private slots: - void openMenu(); - void closeMenu(); - void shortcutActivated(); - - void updateButtonVisuals(); - -public slots: - void OrientationChange(){ - if(this->layout()->direction()==QBoxLayout::LeftToRight){ - this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); - button->setIconSize( QSize(this->height(), this->height()) ); - }else{ - this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); - button->setIconSize( QSize(this->width(), this->width()) ); - } - this->layout()->update(); - updateButtonVisuals(); - } - - void LocaleChange(){ - updateButtonVisuals(); - usermenu->UpdateAll(); - } - - void ThemeChange(){ - updateButtonVisuals(); - usermenu->UpdateAll(); - } -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/UserItemWidget.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/UserItemWidget.cpp deleted file mode 100644 index 8d7dab7a..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/UserItemWidget.cpp +++ /dev/null @@ -1,205 +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 "UserItemWidget.h" -#include <LUtils.h> -#include <LDesktopUtils.h> -#include <QMenu> - -#define TEXTCUTOFF 165 -UserItemWidget::UserItemWidget(QWidget *parent, QString itemPath, QString type, bool goback) : QFrame(parent){ - createWidget(); - //Now fill it appropriately - bool inHome = type.endsWith("-home"); //internal code - if(inHome){ type = type.remove("-home"); } - if(itemPath.endsWith(".desktop") || type=="app"){ - XDGDesktop item(itemPath); - if( item.isValid() ){ - icon->setPixmap( LXDG::findIcon(item.icon, "preferences-system-windows-actions").pixmap(32,32) ); - name->setText( this->fontMetrics().elidedText(item.name, Qt::ElideRight, TEXTCUTOFF) ); - setupActions(&item); - }else{ - gooditem = false; - return; - } - }else if(type=="dir"){ - actButton->setVisible(false); - if(itemPath.endsWith("/")){ itemPath.chop(1); } - if(goback){ - icon->setPixmap( LXDG::findIcon("go-previous","").pixmap(32,32) ); - name->setText( tr("Go Back") ); - }else{ - icon->setPixmap( LXDG::findIcon("folder","").pixmap(32,32) ); - name->setText( this->fontMetrics().elidedText(itemPath.section("/",-1), Qt::ElideRight, TEXTCUTOFF) ); - } - }else{ - actButton->setVisible(false); - if(itemPath.endsWith("/")){ itemPath.chop(1); } - if(QFileInfo(itemPath).isDir()){ - type = "dir"; - icon->setPixmap( LXDG::findIcon("folder","").pixmap(32,32) ); - }else if(LUtils::imageExtensions().contains(itemPath.section("/",-1).section(".",-1).toLower()) ){ - icon->setPixmap( QIcon(itemPath).pixmap(32,32) ); - }else{ - icon->setPixmap( LXDG::findMimeIcon(itemPath.section("/",-1)).pixmap(32,32) ); - } - name->setText( this->fontMetrics().elidedText(itemPath.section("/",-1), Qt::ElideRight, TEXTCUTOFF) ); - } - icon->setWhatsThis(itemPath); - if(!goback){ this->setWhatsThis(name->text()); } - isDirectory = (type=="dir"); //save this for later - if(LDesktopUtils::isFavorite(itemPath)){ - linkPath = itemPath; - isShortcut=true; - }else if( inHome ){//|| itemPath.section("/",0,-2)==QDir::homePath()+"/Desktop" ){ - isShortcut = true; - }else{ - isShortcut = false; - } - //Now setup the button appropriately - setupButton(goback); -} - -UserItemWidget::UserItemWidget(QWidget *parent, XDGDesktop *item) : QFrame(parent){ - if(item==0){ return; } - createWidget(); - isDirectory = false; - if(LDesktopUtils::isFavorite(item->filePath)){ - linkPath = item->filePath; - isShortcut=true; - }else if( item->filePath.section("/",0,-2)==QDir::homePath()+"/Desktop" ){ - isShortcut = true; - }else{ - isShortcut = false; - } - //Now fill it appropriately - icon->setPixmap( LXDG::findIcon(item->icon,"preferences-system-windows-actions").pixmap(32,32) ); - name->setText( this->fontMetrics().elidedText(item->name, Qt::ElideRight, TEXTCUTOFF) ); - this->setWhatsThis(name->text()); - icon->setWhatsThis(item->filePath); - //Now setup the buttons appropriately - setupButton(); - setupActions(item); -} - -UserItemWidget::~UserItemWidget(){ - delete button; - delete icon; - delete name; -} - - -void UserItemWidget::createWidget(){ - //Initialize the widgets - gooditem = true; - menuopen = false; - menureset = new QTimer(this); - menureset->setSingleShot(true); - menureset->setInterval(1000); //1 second - this->setContentsMargins(0,0,0,0); - button = new QToolButton(this); - button->setIconSize( QSize(14,14) ); - button->setAutoRaise(true); - actButton = new QToolButton(this); - actButton->setPopupMode(QToolButton::InstantPopup); - actButton->setFixedSize( QSize(17,34) ); - actButton->setArrowType(Qt::DownArrow); - icon = new QLabel(this); - icon->setFixedSize( QSize(34,34) ); - name = new QLabel(this); - //Add them to the layout - this->setLayout(new QHBoxLayout()); - this->layout()->setContentsMargins(1,1,1,1); - this->layout()->addWidget(icon); - this->layout()->addWidget(actButton); - this->layout()->addWidget(name); - this->layout()->addWidget(button); - //Set a custom object name so this can be tied into the Lumina Theme stylesheets - this->setObjectName("LuminaUserItemWidget"); - //Install the stylesheet - //this->setStyleSheet("UserItemWidget{ background: transparent; border-radius: 5px;} UserItemWidget::hover{ background: rgba(255,255,255,200); border-radius: 5px; }"); -} - -void UserItemWidget::setupButton(bool disable){ - //if(isDirectory){ qDebug() << "Directory Entry:" << isShortcut << linkPath << icon->whatsThis(); } - - if(disable){ - button->setVisible(false); - }else if(isShortcut && !linkPath.isEmpty()){ //Favorite Item - can always remove this - button->setWhatsThis("remove"); - button->setIcon( LXDG::findIcon("list-remove","") ); - button->setToolTip(tr("Remove Shortcut")); - connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked()) ); - }else if(isShortcut){ //Physical File/Dir - can remove - button->setWhatsThis("remove"); - button->setIcon( LXDG::findIcon("user-trash","") ); - button->setToolTip(tr("Delete File")); - connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked()) ); - }else if(!isShortcut){// if( !QFile::exists( QDir::homePath()+"/Desktop/"+icon->whatsThis().section("/",-1) ) && !LUtils::isFavorite(icon->whatsThis() ) ){ - //This file does not have a shortcut yet -- allow the user to add it - button->setWhatsThis("add"); - button->setIcon( LXDG::findIcon("bookmark-toolbar","") ); - button->setToolTip(tr("Create Shortcut")); - connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked()) ); - }else{ - //This already has a desktop shortcut -- no special actions - button->setVisible(false); - } - if(isShortcut){ - name->setToolTip(icon->whatsThis()); //also allow the user to see the full shortcut path - } -} - -void UserItemWidget::setupActions(XDGDesktop *app){ - if(app==0 || app->actions.isEmpty()){ actButton->setVisible(false); return; } - //Actions Available - go ahead and list them all - actButton->setMenu( new QMenu(this) ); - for(int i=0; i<app->actions.length(); i++){ - QAction *act = new QAction(LXDG::findIcon(app->actions[i].icon, app->icon), app->actions[i].name, this); - act->setToolTip(app->actions[i].ID); - act->setWhatsThis(app->actions[i].ID); - actButton->menu()->addAction(act); - } - connect(actButton->menu(), SIGNAL(triggered(QAction*)), this, SLOT(actionClicked(QAction*)) ); - connect(actButton->menu(), SIGNAL(aboutToShow()), this, SLOT(actionMenuOpen()) ); - connect(actButton->menu(), SIGNAL(aboutToHide()), this, SLOT(actionMenuClosed()) ); - connect(menureset, SIGNAL(timeout()), this, SLOT(resetmenuflag()) ); -} - -void UserItemWidget::buttonClicked(){ - button->setVisible(false); - if(button->whatsThis()=="add"){ - LDesktopUtils::addFavorite(icon->whatsThis()); - //QFile::link(icon->whatsThis(), QDir::homePath()+"/.lumina/favorites/"+icon->whatsThis().section("/",-1) ); - emit NewShortcut(); - }else if(button->whatsThis()=="remove"){ - if(linkPath.isEmpty()){ - //This is a desktop file - if(isDirectory){ - QProcess::startDetached("rm -r \""+icon->whatsThis()+"\""); - }else{ - QFile::remove(icon->whatsThis()); - } - //Don't emit the RemovedShortcut signal here - the automatic ~/Desktop watcher will see the change when finished - }else{ - LDesktopUtils::removeFavorite(icon->whatsThis()); //This is a favorite - emit RemovedShortcut(); - } - } -} - -void UserItemWidget::ItemClicked(){ - if(!linkPath.isEmpty()){ emit RunItem(linkPath); } - else{ emit RunItem(icon->whatsThis()); } -} - -void UserItemWidget::actionClicked(QAction *act){ - actButton->menu()->hide(); - QString cmd = "lumina-open -action \""+act->whatsThis()+"\" \"%1\""; - if(!linkPath.isEmpty()){ cmd = cmd.arg(linkPath); } - else{ cmd = cmd.arg(icon->whatsThis()); } - emit RunItem(cmd); -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/UserItemWidget.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/UserItemWidget.h deleted file mode 100644 index 0b212f10..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/UserItemWidget.h +++ /dev/null @@ -1,72 +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 -//=========================================== -// This item widget manages a single file/directory -//=========================================== -#ifndef _LUMINA_PANEL_USER_ITEM_WIDGET_H -#define _LUMINA_PANEL_USER_ITEM_WIDGET_H - -#include <QFrame> -#include <QLabel> -#include <QToolButton> -#include <QString> -#include <QHBoxLayout> -#include <QSize> -#include <QDir> -#include <QFile> -#include <QMouseEvent> -#include <QAction> -#include <QMenu> -#include <QTimer> - -#include <LuminaXDG.h> - -class UserItemWidget : public QFrame{ - Q_OBJECT -public: - UserItemWidget(QWidget *parent=0, QString itemPath="", QString type="unknown", bool goback=false); - UserItemWidget(QWidget *parent=0, XDGDesktop *item= 0); - ~UserItemWidget(); - - bool gooditem; -private: - QToolButton *button, *actButton; - QLabel *icon, *name; - bool isDirectory, isShortcut, menuopen; - QString linkPath; - QTimer *menureset; - - void createWidget(); - void setupButton(bool disable = false); - void setupActions(XDGDesktop*); - -private slots: - void buttonClicked(); - void ItemClicked(); - void actionClicked(QAction*); - //Functions to fix the submenu open/close issues - void actionMenuOpen(){ - if(menureset->isActive()){ menureset->stop(); } - menuopen = true; - } - void resetmenuflag(){ menuopen = false; } //tied to the "menureset" timer - void actionMenuClosed(){ menureset->start(); } - - -protected: - void mouseReleaseEvent(QMouseEvent *event){ - if(menuopen){ resetmenuflag(); } //skip this event if a submenu was open - else if(event->button() != Qt::NoButton){ ItemClicked(); } - } - -signals: - void NewShortcut(); - void RemovedShortcut(); - void RunItem(QString cmd); - -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/UserWidget.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/UserWidget.cpp deleted file mode 100644 index a0ba8996..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/UserWidget.cpp +++ /dev/null @@ -1,393 +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 "UserWidget.h" -#include "ui_UserWidget.h" -#include "../../LSession.h" -#include "../../AppMenu.h" - -UserWidget::UserWidget(QWidget* parent) : QTabWidget(parent), ui(new Ui::UserWidget){ - ui->setupUi(this); - updatingfavs = false; - if(parent!=0){ parent->setMouseTracking(true); } - this->setMouseTracking(true); - sysapps = LSession::handle()->applicationMenu()->currentAppHash(); //get the raw info - - //Connect the signals/slots - connect(ui->tool_desktopsettings, SIGNAL(clicked()), this, SLOT(openDeskSettings()) ); - connect(ui->tool_config_screensaver, SIGNAL(clicked()), this, SLOT(openScreenSaverConfig()) ); - connect(ui->tool_config_screensettings, SIGNAL(clicked()), this, SLOT(openScreenConfig()) ); - connect(ui->tool_fav_apps, SIGNAL(clicked()), this, SLOT(FavChanged()) ); - connect(ui->tool_fav_files, SIGNAL(clicked()), this, SLOT(FavChanged()) ); - connect(ui->tool_fav_dirs, SIGNAL(clicked()), this, SLOT(FavChanged()) ); - connect(ui->combo_app_cats, SIGNAL(currentIndexChanged(int)), this, SLOT(updateApps()) ); - connect(ui->tool_home_gohome, SIGNAL(clicked()), this, SLOT(slotGoHome()) ); - connect(ui->tool_home_browse, SIGNAL(clicked()), this, SLOT(slotOpenDir()) ); - connect(ui->tool_home_search, SIGNAL(clicked()), this, SLOT(slotOpenSearch()) ); - connect(ui->tool_config_about, SIGNAL(clicked()), this, SLOT(openLuminaInfo()) ); - - //Setup the special buttons - connect(ui->tool_app_store, SIGNAL(clicked()), this, SLOT(openStore()) ); - connect(ui->tool_controlpanel, SIGNAL(clicked()), this, SLOT(openControlPanel()) ); - //connect(ui->tool_qtconfig, SIGNAL(clicked()), this, SLOT(openQtConfig()) ); - - lastUpdate = QDateTime(); //make sure it refreshes - - connect(LSession::handle()->applicationMenu(), SIGNAL(AppMenuUpdated()), this, SLOT(UpdateMenu()) ); - connect(QApplication::instance(), SIGNAL(DesktopFilesChanged()), this, SLOT(updateFavItems()) ); - QTimer::singleShot(10,this, SLOT(UpdateAll())); //make sure to load this once after initialization -} - -UserWidget::~UserWidget(){ -} - -//=========== -// PRIVATE -//=========== -void UserWidget::ClearScrollArea(QScrollArea *area){ - QWidget *wgt = area->takeWidget(); - wgt->deleteLater(); //delete the widget and all children - area->setWidget( new QWidget() ); //create a new widget in the scroll area - area->widget()->setContentsMargins(0,0,0,0); - QVBoxLayout *layout = new QVBoxLayout; - layout->setSpacing(2); - layout->setContentsMargins(3,1,3,1); - layout->setDirection(QBoxLayout::TopToBottom); - layout->setAlignment(Qt::AlignTop); - area->widget()->setLayout(layout); -} - -void UserWidget::SortScrollArea(QScrollArea *area){ - //qDebug() << "Sorting Scroll Area:"; - //Sort all the items in the scroll area alphabetically - QLayout *lay = area->widget()->layout(); - QStringList items; - for(int i=0; i<lay->count(); i++){ - items << lay->itemAt(i)->widget()->whatsThis().toLower(); - } - - items.sort(); - //qDebug() << " - Sorted Items:" << items; - for(int i=0; i<items.length(); i++){ - if(items[i].isEmpty()){ continue; } - //QLayouts are weird in that they can only add items to the end - need to re-insert almost every item - for(int j=0; j<lay->count(); j++){ - //Find this item - if(lay->itemAt(j)->widget()->whatsThis().toLower()==items[i]){ - //Found it - now move it if necessary - //qDebug() << "Found Item:" << items[i] << i << j; - lay->addItem( lay->takeAt(j) ); - break; - } - } - } - -} - -QIcon UserWidget::rotateIcon(QIcon ico){ - //Rotate the given icon to appear vertical in the tab widget - QPixmap pix = ico.pixmap(32,32); - QTransform tran; - tran.rotate(+90); //For tabs on the left/West - pix = pix.transformed(tran); - ico = QIcon(pix); - return ico; -} - -//============ -// PRIVATE SLOTS -//============ -void UserWidget::UpdateAll(){ - ui->retranslateUi(this); - //Setup the Icons - // - favorites tab - this->setTabIcon(0, rotateIcon(LXDG::findIcon("folder-favorites","")) ); - this->setTabText(0,""); - // - apps tab - this->setTabIcon(1, rotateIcon(LXDG::findIcon("system-run","")) ); - this->setTabText(1,""); - // - home tab - this->setTabIcon(2, rotateIcon(LXDG::findIcon("user-home","")) ); - this->setTabText(2,""); - // - config tab - this->setTabIcon(3, rotateIcon(LXDG::findIcon("preferences-system","")) ); - this->setTabText(3,""); - ui->tool_fav_apps->setIcon( LXDG::findIcon("system-run","") ); - ui->tool_fav_dirs->setIcon( LXDG::findIcon("folder","") ); - ui->tool_fav_files->setIcon( LXDG::findIcon("document-multiple","") ); - ui->tool_desktopsettings->setIcon( LXDG::findIcon("preferences-desktop","") ); - ui->tool_config_screensaver->setIcon( LXDG::findIcon("preferences-desktop-screensaver","") ); - ui->tool_config_screensettings->setIcon( LXDG::findIcon("preferences-other","") ); - ui->tool_home_gohome->setIcon( LXDG::findIcon("go-home","") ); - ui->tool_home_browse->setIcon( LXDG::findIcon("document-open","") ); - ui->tool_home_search->setIcon( LXDG::findIcon("system-search","") ); - ui->tool_config_about->setIcon( LXDG::findIcon("lumina","") ); - - //Setup the special buttons - QString APPSTORE = LOS::AppStoreShortcut(); - if(QFile::exists(APPSTORE) && !APPSTORE.isEmpty()){ - //Now load the info - XDGDesktop store(APPSTORE); - bool ok = store.isValid(); - if(ok){ - ui->tool_app_store->setIcon( LXDG::findIcon(store.icon, "") ); - ui->tool_app_store->setText( store.name ); - } - ui->tool_app_store->setVisible(ok); //availability - }else{ - ui->tool_app_store->setVisible(false); //not available - } - QString CONTROLPANEL = LOS::ControlPanelShortcut(); - if(QFile::exists(CONTROLPANEL) && !CONTROLPANEL.isEmpty()){ - //Now load the info - XDGDesktop cpan(CONTROLPANEL); - bool ok = cpan.isValid(); - if(ok){ - ui->tool_controlpanel->setIcon( LXDG::findIcon(cpan.icon, "") ); - } - ui->tool_controlpanel->setVisible(ok); //availability - }else{ - ui->tool_controlpanel->setVisible(false); //not available - } - /*QString QTCONFIG = LOS::QtConfigShortcut(); - if(QFile::exists(QTCONFIG) && !QTCONFIG.isEmpty()){ - ui->tool_qtconfig->setVisible(true); - ui->tool_qtconfig->setIcon( LXDG::findIcon("preferences-desktop-theme","") ); - }else{ - ui->tool_qtconfig->setVisible(false); - }*/ - //Now update the menus - UpdateMenu(); -} - -void UserWidget::UpdateMenu(bool forceall){ - this->setCurrentWidget(ui->tab_fav); - ui->tool_fav_apps->setChecked(true); - ui->tool_fav_dirs->setChecked(false); - ui->tool_fav_files->setChecked(false); - cfav = 0; //favorite apps - FavChanged(); - QString cdir = ui->label_home_dir->whatsThis(); - if(cdir.isEmpty() || !QFile::exists(cdir)){ - //Directory deleted or nothing loaded yet - ui->label_home_dir->setWhatsThis(QDir::homePath()); - QTimer::singleShot(0,this, SLOT(updateHome()) ); - }else if( lastUpdate < QFileInfo(cdir).lastModified() || forceall){ - //Directory contents changed - reload it - QTimer::singleShot(0,this, SLOT(updateHome()) ); - } - if(lastUpdate < LSession::handle()->applicationMenu()->lastHashUpdate || lastUpdate.isNull() || forceall){ - updateAppCategories(); - QTimer::singleShot(0,this, SLOT(updateApps()) ); - } - lastUpdate = QDateTime::currentDateTime(); -} - -void UserWidget::LaunchItem(QString path, bool fix){ - if(!path.isEmpty()){ - qDebug() << "Launch Application:" << path; - if( fix && !path.startsWith("lumina-open") ){ LSession::LaunchApplication("lumina-open \""+path+"\""); } - else{ LSession::LaunchApplication(path); } - emit CloseMenu(); //so the menu container will close - } -} - -void UserWidget::FavChanged(){ - //uncheck the current item for a moment - int oldfav = cfav; - if(cfav==0){ ui->tool_fav_apps->setChecked(false); } - else if(cfav==1){ ui->tool_fav_dirs->setChecked(false); } - if(cfav==2){ ui->tool_fav_files->setChecked(false); } - //Now check what other item is now the only one checked - if(ui->tool_fav_apps->isChecked() && !ui->tool_fav_dirs->isChecked() && !ui->tool_fav_files->isChecked() ){ - cfav = 0; - }else if(!ui->tool_fav_apps->isChecked() && ui->tool_fav_dirs->isChecked() && !ui->tool_fav_files->isChecked() ){ - cfav = 1; - }else if(!ui->tool_fav_apps->isChecked() && !ui->tool_fav_dirs->isChecked() && ui->tool_fav_files->isChecked() ){ - cfav = 2; - }else{ - //Re-check the old item (something invalid) - ui->tool_fav_apps->setChecked(cfav==0); - ui->tool_fav_dirs->setChecked(cfav==1); - ui->tool_fav_files->setChecked(cfav==2); - } - updateFavItems(oldfav!=cfav); -} - -void UserWidget::updateFavItems(bool newfilter){ - if(updatingfavs){ return; } - updatingfavs = true; - //qDebug() << "Updating User Favorite Items"; - QStringList newfavs = LDesktopUtils::listFavorites(); - //qDebug() << "Favorites:" << newfavs; - if(lastHomeUpdate.isNull() || (QFileInfo(QDir::homePath()+"/Desktop").lastModified() > lastHomeUpdate) || newfavs!=favs ){ - favs = newfavs; - - homefiles = LSession::handle()->DesktopFiles(); - lastHomeUpdate = QDateTime::currentDateTime(); - }else if(!newfilter){ updatingfavs = false; return; } //nothing new to change - stop now - //qDebug() << " - Passed Smoke Test..."; - QStringList favitems; - //Remember for format for favorites: <name>::::[app/dir/<mimetype>]::::<full path> - if(ui->tool_fav_apps->isChecked()){ - favitems = favs.filter("::::app::::"); - for(int i=0; i<homefiles.length(); i++){ - if(homefiles[i].fileName().endsWith(".desktop") && favitems.filter(homefiles[i].canonicalFilePath()).isEmpty() ){ - favitems << homefiles[i].fileName()+"::::app-home::::"+homefiles[i].absoluteFilePath(); - } - } - }else if(ui->tool_fav_dirs->isChecked()){ - favitems = favs.filter("::::dir::::"); - for(int i=0; i<homefiles.length(); i++){ - if(homefiles[i].isDir() && favitems.filter(homefiles[i].canonicalFilePath()).isEmpty() ){ - favitems << homefiles[i].fileName()+"::::dir-home::::"+homefiles[i].absoluteFilePath(); - } - } - }else{ - //Files - for(int i=0; i<favs.length(); i++){ - QString type = favs[i].section("::::",1,1); - if(type != "app" && type !="dir"){ - favitems << favs[i]; - } - } - for(int i=0; i<homefiles.length(); i++){ - if(!homefiles[i].isDir() && !homefiles[i].fileName().endsWith(".desktop") && favitems.filter(homefiles[i].canonicalFilePath()).isEmpty() ){ - favitems << homefiles[i].fileName()+"::::"+LXDG::findAppMimeForFile(homefiles[i].fileName())+"-home::::"+homefiles[i].absoluteFilePath(); - } - } - } - ClearScrollArea(ui->scroll_fav); - //qDebug() << " - Sorting Items"; - favitems.sort(); //sort them alphabetically - //qDebug() << " - Creating Items:" << favitems; - for(int i=0; i<favitems.length(); i++){ - if( !QFile::exists(favitems[i].section("::::",2,50)) ){ continue; } //file does not exist - just skip it - UserItemWidget *it = new UserItemWidget(ui->scroll_fav->widget(), favitems[i].section("::::",2,50), favitems[i].section("::::",1,1) ); - if(!it->gooditem){ it->deleteLater(); continue; } - ui->scroll_fav->widget()->layout()->addWidget(it); - connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) ); - connect(it, SIGNAL(NewShortcut()), this, SLOT(updateFavItems()) ); - connect(it, SIGNAL(RemovedShortcut()), this, SLOT(updateFavItems()) ); - QApplication::processEvents(); //keep the UI snappy - might be a number of these - } - SortScrollArea(ui->scroll_fav); - updatingfavs = false; - //qDebug() << " - Done"; -} - -//Apps Tab -void UserWidget::updateAppCategories(){ - ui->combo_app_cats->clear(); - QStringList cats = sysapps->keys(); - cats.sort(); - for(int i=0; i<cats.length(); i++){ - QString name, icon; - if(cats[i] == "All"){ name = tr("All"); icon = "application-x-executable"; } - else if(cats[i] == "Multimedia"){ name = tr("Multimedia"); icon = "applications-multimedia"; } - else if(cats[i] == "Development"){ name = tr("Development"); icon = "applications-development"; } - else if(cats[i] == "Education"){ name = tr("Education"); icon = "applications-education"; } - else if(cats[i] == "Game"){ name = tr("Games"); icon = "applications-games"; } - else if(cats[i] == "Graphics"){ name = tr("Graphics"); icon = "applications-graphics"; } - else if(cats[i] == "Network"){ name = tr("Network"); icon = "applications-internet"; } - else if(cats[i] == "Office"){ name = tr("Office"); icon = "applications-office"; } - else if(cats[i] == "Science"){ name = tr("Science"); icon = "applications-science"; } - else if(cats[i] == "Settings"){ name = tr("Settings"); icon = "preferences-system"; } - else if(cats[i] == "System"){ name = tr("System"); icon = "applications-system"; } - else if(cats[i] == "Utility"){ name = tr("Utilities"); icon = "applications-utilities"; } - else if(cats[i] == "Wine"){ name = tr("Wine"); icon = "wine"; } - else{ name = tr("Unsorted"); icon = "applications-other"; } - ui->combo_app_cats->addItem( LXDG::findIcon(icon,""), name, cats[i] ); - } -} - -void UserWidget::updateApps(){ - if(ui->combo_app_cats->currentIndex() < 0){ return; } //no cat - QString cat = ui->combo_app_cats->itemData( ui->combo_app_cats->currentIndex() ).toString(); - QList<XDGDesktop*> items = sysapps->value(cat); - ClearScrollArea(ui->scroll_apps); - for(int i=0; i<items.length(); i++){ - UserItemWidget *it = new UserItemWidget(ui->scroll_apps->widget(), items[i]); - ui->scroll_apps->widget()->layout()->addWidget(it); - connect(it, SIGNAL(RunItem(QString)), this, SLOT(LaunchItem(QString)) ); - connect(it, SIGNAL(NewShortcut()), this, SLOT(updateFavItems()) ); - connect(it, SIGNAL(RemovedShortcut()), this, SLOT(updateFavItems()) ); - QApplication::processEvents(); //keep the UI snappy - might be a number of these - } -} - -//Home Tab -void UserWidget::updateHome(){ - qDebug() << "Update Home"; - ClearScrollArea(ui->scroll_home); - qDebug() << " - dir:" << ui->label_home_dir->whatsThis(); - QDir homedir(ui->label_home_dir->whatsThis()); - QStringList items; - if(QDir::homePath() == homedir.absolutePath()){ - ui->label_home_dir->setText(tr("Home")); - ui->tool_home_gohome->setVisible(false); - }else{ - qDebug() << " - Show the back button"; - ui->tool_home_gohome->setVisible(true); - ui->label_home_dir->setText( this->fontMetrics().elidedText(homedir.dirName(), Qt::ElideRight, ui->label_home_dir->width())); - //Now make sure to put a "go back" button at the top of the list - QString dir = ui->label_home_dir->whatsThis(); - if(dir.endsWith("/")){ dir.chop(1); } - dir.chop( dir.section("/",-1).length() ); - items << dir; - } - qDebug() << " - Load items"; - ui->label_home_dir->setToolTip(ui->label_home_dir->whatsThis()); - items << homedir.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot, QDir::Name | QDir::DirsFirst); - QString type = ""; - if(homedir.absolutePath() == QDir::homePath()+"/Desktop"){ type.append("-home"); }//internal code - for(int i=0; i<items.length(); i++){ - qDebug() << " - New item:" << homedir.absoluteFilePath(items[i]); - UserItemWidget *it; - if(items[i].startsWith("/")){ it = new UserItemWidget(ui->scroll_home->widget(), items[i], "dir", true); } //go-back button - else{ it = new UserItemWidget(ui->scroll_home->widget(), homedir.absoluteFilePath(items[i]), type, false); } - qDebug() << " - Add to layout"; - ui->scroll_home->widget()->layout()->addWidget(it); - connect(it, SIGNAL(RunItem(QString)), this, SLOT(slotGoToDir(QString)) ); - connect(it, SIGNAL(NewShortcut()), this, SLOT(updateFavItems()) ); - connect(it, SIGNAL(RemovedShortcut()), this, SLOT(updateFavItems()) ); - qDebug() << " - process events"; - QApplication::processEvents(); //keep the UI snappy - may be a lot of these to load - } - qDebug() << " - Done"; -} - -void UserWidget::slotGoToDir(QString dir){ - if(!QFileInfo(dir).isDir()){ - LaunchItem(dir); - }else{ - ui->label_home_dir->setWhatsThis(dir); - updateHome(); - } -} - -void UserWidget::slotGoHome(){ - slotGoToDir(QDir::homePath()); -} - -void UserWidget::slotOpenDir(){ - LaunchItem(ui->label_home_dir->whatsThis()); -} - -void UserWidget::slotOpenSearch(){ - LaunchItem("lumina-search -dir \""+ui->label_home_dir->whatsThis()+"\"", false); //use command as-is -} - -void UserWidget::mouseMoveEvent( QMouseEvent *event){ - QTabBar *wid = tabBar(); - if(wid==0){ return; } //invalid widget found - QPoint relpos = wid->mapFromGlobal( this->mapToGlobal(event->pos()) ); - //qDebug() << "Mouse Move Event: " << event->pos().x() << event->pos().y() << relpos.x() << relpos.y() << wid->width() << wid->height(); - if(wid && wid->tabAt(relpos) != -1){ - qDebug() << " - Mouse over tab"; - this->setCurrentIndex( wid->tabAt(relpos) ); - } -} diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/UserWidget.h b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/UserWidget.h deleted file mode 100644 index 8b03c489..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/UserWidget.h +++ /dev/null @@ -1,101 +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 panel plugin allows the user to quickly access user favorites and applications -//=========================================== -#ifndef _LUMINA_PANEL_USER_BUTTON_WIDGET_H -#define _LUMINA_PANEL_USER_BUTTON_WIDGET_H - -#include <QWidget> -#include <QString> -#include <QList> -#include <QHash> -#include <QVBoxLayout> -#include <QScrollArea> -#include <QDateTime> -#include <QTransform> -#include <QMouseEvent> -#include <QTabWidget> - -#include <LuminaXDG.h> -#include <LuminaOS.h> -#include "UserItemWidget.h" - -#define SSAVER QString("xscreensaver-demo") - -namespace Ui{ - class UserWidget; -}; - -class UserWidget : public QTabWidget{ - Q_OBJECT -public: - UserWidget(QWidget *parent=0); - ~UserWidget(); - -public slots: - void UpdateAll(); //for re-translation/icon changes - void UpdateMenu(bool forceall = false); //for item changes - -private: - Ui::UserWidget *ui; - QHash<QString, QList<XDGDesktop*> > *sysapps; - QDateTime lastUpdate, lastHomeUpdate; - QStringList favs; - QFileInfoList homefiles; - int cfav; //current favorite category - void ClearScrollArea(QScrollArea *area); - void SortScrollArea(QScrollArea *area); - QIcon rotateIcon(QIcon); - bool updatingfavs; - -private slots: - void LaunchItem(QString path, bool fix = true); - - //Favorites Tab - void FavChanged(); //for ensuring radio-button-like behaviour - void updateFavItems(bool newfilter = true); //if false, will only update if filesystem changes - - //Apps Tab - void updateAppCategories(); - void updateApps(); - - //Home Tab - void updateHome(); - void slotGoToDir(QString dir); - void slotGoHome(); - void slotOpenDir(); - void slotOpenSearch(); - - //Slots for the special buttons - void openStore(){ - LaunchItem(LOS::AppStoreShortcut()); - } - void openControlPanel(){ - LaunchItem(LOS::ControlPanelShortcut()); - } - void openDeskSettings(){ - LaunchItem("lumina-config", false); - } - void openScreenSaverConfig(){ - LaunchItem(SSAVER, false); - } - void openScreenConfig(){ - LaunchItem("lumina-xconfig",false); - } - void openLuminaInfo(){ - LaunchItem("lumina-info",false); - } - -protected: - void mouseMoveEvent( QMouseEvent *event); - -signals: - void CloseMenu(); - -}; - -#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/UserWidget.ui b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/UserWidget.ui deleted file mode 100644 index 9ef5af7e..00000000 --- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/userbutton/UserWidget.ui +++ /dev/null @@ -1,593 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>UserWidget</class> - <widget class="QTabWidget" name="UserWidget"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>294</width> - <height>289</height> - </rect> - </property> - <property name="windowTitle"> - <string>UserWidget</string> - </property> - <property name="tabPosition"> - <enum>QTabWidget::West</enum> - </property> - <property name="currentIndex"> - <number>0</number> - </property> - <widget class="QWidget" name="tab_fav"> - <attribute name="title"> - <string>Favorites</string> - </attribute> - <attribute name="toolTip"> - <string>Favorites</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="spacing"> - <number>2</number> - </property> - <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> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QToolButton" name="tool_fav_apps"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>30</width> - <height>30</height> - </size> - </property> - <property name="cursor"> - <cursorShape>ArrowCursor</cursorShape> - </property> - <property name="toolTip"> - <string>Favorite Applications</string> - </property> - <property name="text"> - <string>Applications</string> - </property> - <property name="iconSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="checkable"> - <bool>true</bool> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_fav_dirs"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>30</width> - <height>30</height> - </size> - </property> - <property name="toolTip"> - <string>Favorite Directories</string> - </property> - <property name="text"> - <string>Places</string> - </property> - <property name="iconSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="checkable"> - <bool>true</bool> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_fav_files"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>30</width> - <height>30</height> - </size> - </property> - <property name="toolTip"> - <string>Favorite FIles</string> - </property> - <property name="text"> - <string>Files</string> - </property> - <property name="iconSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="checkable"> - <bool>true</bool> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QScrollArea" name="scroll_fav"> - <property name="widgetResizable"> - <bool>true</bool> - </property> - <widget class="QWidget" name="scrollAreaWidgetContents"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>259</width> - <height>247</height> - </rect> - </property> - </widget> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="tab_apps"> - <attribute name="title"> - <string>Apps</string> - </attribute> - <attribute name="toolTip"> - <string>Applications</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <property name="spacing"> - <number>2</number> - </property> - <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> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QComboBox" name="combo_app_cats"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>30</height> - </size> - </property> - <property name="maxVisibleItems"> - <number>12</number> - </property> - <property name="iconSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </widget> - </item> - <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="QToolButton" name="tool_app_store"> - <property name="minimumSize"> - <size> - <width>30</width> - <height>30</height> - </size> - </property> - <property name="text"> - <string/> - </property> - <property name="iconSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QScrollArea" name="scroll_apps"> - <property name="widgetResizable"> - <bool>true</bool> - </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 class="QWidget" name="tab_home"> - <attribute name="title"> - <string>Home</string> - </attribute> - <attribute name="toolTip"> - <string>Home Directory</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <property name="spacing"> - <number>2</number> - </property> - <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> - <layout class="QGridLayout" name="gridLayout"> - <property name="horizontalSpacing"> - <number>4</number> - </property> - <property name="verticalSpacing"> - <number>1</number> - </property> - <item row="0" column="3"> - <widget class="QToolButton" name="tool_home_search"> - <property name="toolTip"> - <string>Search this Directory</string> - </property> - <property name="text"> - <string notr="true"/> - </property> - <property name="iconSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </widget> - </item> - <item row="0" column="2"> - <widget class="QToolButton" name="tool_home_browse"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>30</width> - <height>30</height> - </size> - </property> - <property name="toolTip"> - <string>Open Directory</string> - </property> - <property name="text"> - <string notr="true">Browse</string> - </property> - <property name="iconSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonIconOnly</enum> - </property> - </widget> - </item> - <item row="0" column="0"> - <widget class="QToolButton" name="tool_home_gohome"> - <property name="minimumSize"> - <size> - <width>30</width> - <height>30</height> - </size> - </property> - <property name="toolTip"> - <string>Go back to home directory</string> - </property> - <property name="text"> - <string notr="true">home</string> - </property> - <property name="iconSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLabel" name="label_home_dir"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>30</height> - </size> - </property> - <property name="font"> - <font> - <pointsize>10</pointsize> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="text"> - <string notr="true"><current dir></string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="indent"> - <number>0</number> - </property> - <property name="textInteractionFlags"> - <set>Qt::NoTextInteraction</set> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QScrollArea" name="scroll_home"> - <property name="widgetResizable"> - <bool>true</bool> - </property> - <widget class="QWidget" name="scrollAreaWidgetContents_3"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>98</width> - <height>28</height> - </rect> - </property> - </widget> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="tab_config"> - <attribute name="title"> - <string>Config</string> - </attribute> - <attribute name="toolTip"> - <string>Desktop Preferences</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_4"> - <item> - <widget class="QToolButton" name="tool_controlpanel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Control Panel</string> - </property> - <property name="iconSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_desktopsettings"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Desktop Appearance/Plugins</string> - </property> - <property name="iconSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_config_screensettings"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Screen Configuration</string> - </property> - <property name="iconSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_config_screensaver"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Screensaver Settings</string> - </property> - <property name="iconSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>243</width> - <height>162</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="Line" name="line"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_config_about"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>About the Lumina Desktop</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - </layout> - </widget> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp index c3e9a1db..47f0e3d7 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp @@ -6,67 +6,105 @@ //=========================================== #include "ContextMenu.h" #include <global-objects.h> +#include <JsonMenu.h> void DesktopContextMenu::SettingsChanged(DesktopSettings::File file){ - if(file == DesktopSettings::ContextMenu){ UpdateMenu(); } + if(file == DesktopSettings::ContextMenu){ UpdateMenu(false); } } -void DesktopContextMenu::UpdateMenu(){ +void DesktopContextMenu::UpdateMenu(bool fast){ //Put a label at the top unsigned int num = Lumina::NWS->currentWorkspace(); workspaceLabel->setText( "<b>"+QString(tr("Workspace %1")).arg(QString::number(num+1))+"</b>"); + if(fast && usewinmenu){ updateWinMenu(); } + if(fast){ return; } //already done this->clear(); //clear it for refresh this->addAction(wkspaceact); this->addSeparator(); //Now load the user's menu setup and fill the menu - QStringList items = DesktopSettings::instance()->value(DesktopSettings::ContextMenu, "itemlist", QStringList()<< "terminal" << "filemanager" << "line" << "settings" <<"lockdesktop").toStringList(); - //usewinmenu=false; + QStringList items = DesktopSettings::instance()->value(DesktopSettings::ContextMenu, "itemlist", QStringList()<< "terminal" << "filemanager" << "line" << "applications" << "windowlist" << "settings" << "lockdesktop").toStringList(); + usewinmenu=false; for(int i=0; i<items.length(); i++){ - if(items[i]=="terminal"){ this->addAction(LXDG::findIcon("utilities-terminal",""), tr("Terminal"))->setWhatsThis("lumina-open -terminal"); } - else if(items[i]=="lockdesktop"){ this->addAction(LXDG::findIcon("system-lock-screen",""), tr("Lock Session"), this, SIGNAL(LockSession()) ); } - else if(items[i]=="filemanager"){ this->addAction( LXDG::findIcon("user-home",""), tr("Browse Files"))->setWhatsThis("lumina-open \""+QDir::homePath()+"\""); } - //else if(items[i]=="applications"){ this->addMenu( LSession::handle()->applicationMenu() ); } + if(items[i]=="terminal"){ + QAction *act = this->addAction( tr("Terminal")); + LIconCache::instance()->loadIcon(act, "utilities-terminal"); + act->setWhatsThis("--terminal"); + } + else if(items[i]=="lockdesktop"){ + QAction *act = this->addAction( tr("Lock Session"), this, SIGNAL(LockSession()) ); + LIconCache::instance()->loadIcon(act, "system-lock-screen"); + } + else if(items[i]=="filemanager"){ + QAction *act = this->addAction( tr("Browse Files")); + LIconCache::instance()->loadIcon(act, "user-home"); + act->setWhatsThis(QDir::homePath()); + } + else if(items[i]=="applications"){ + if(appMenu==0){ updateAppMenu(); } + this->addMenu( appMenu ); + } else if(items[i]=="line"){ this->addSeparator(); } //else if(items[i]=="settings"){ this->addMenu( LSession::handle()->settingsMenu() ); } - //else if(items[i]=="windowlist"){ this->addMenu( winMenu); usewinmenu=true;} - else if(items[i].startsWith("app::::") && items[i].endsWith(".desktop")){ + else if(items[i]=="windowlist"){ + if(winMenu==0){ updateWinMenu(); } + this->addMenu( winMenu); + usewinmenu=true; + }else if(items[i].startsWith("app::::") && items[i].endsWith(".desktop")){ //Custom *.desktop application QString file = items[i].section("::::",1,1).simplified(); - XDGDesktop xdgf(file);// = LXDG::loadDesktopFile(file, ok); - if(xdgf.type!=XDGDesktop::BAD){ - this->addAction( LXDG::findIcon(xdgf.icon,""), xdgf.name)->setWhatsThis("lumina-open \""+file+"\""); - }else{ - qDebug() << "Could not load application file:" << file; - } - }/*else if(items[i].startsWith("jsonmenu::::")){ + //Try to use the pre-loaded app entry for this + XDGDesktop *xdg = XDGDesktopList::instance()->findAppFile(file); + if(xdg!=0){ xdg->addToMenu(this); } + else{ + XDGDesktop xdgf(file);// = LXDG::loadDesktopFile(file, ok); + if(xdgf.type!=XDGDesktop::BAD){ xdgf.addToMenu(this); } + } + }else if(items[i].startsWith("jsonmenu::::")){ //Custom JSON menu system (populated on demand via external scripts/tools QStringList info = items[i].split("::::"); //FORMAT:[ "jsonmenu",exec,name, icon(optional)] if(info.length()>=3){ - qDebug() << "Custom JSON Menu Loaded:" << info; - JsonMenu *tmp = new JsonMenu(info[1], deskMenu); + //qDebug() << "Custom JSON Menu Loaded:" << info; + JsonMenu *tmp = new JsonMenu(info[1], this); tmp->setTitle(info[2]); connect(tmp, SIGNAL(triggered(QAction*)), this, SLOT(SystemApplication(QAction*)) ); if(info.length()>=4){ tmp->setIcon( LXDG::findIcon(info[3],"") ); } this->addMenu(tmp); } - }*/ + } } //Now add the system quit options this->addSeparator(); this->addAction(LXDG::findIcon("system-log-out",""), tr("Leave"), this, SIGNAL(showLeaveDialog()) ); } +// === PRIVATE === +void DesktopContextMenu::AddWindowToMenu(NativeWindow *win){ + QString label = win->property(NativeWindow::ShortTitle).toString(); + if(label.isEmpty()){ label = win->property(NativeWindow::Title).toString(); } + if(label.isEmpty()){ label = win->property(NativeWindow::Name).toString(); } + QAction *tmp = winMenu->addAction( win->property(NativeWindow::Icon).value<QIcon>(), label, win, SLOT(toggleVisibility()) ); + //Need to change the visual somehow to indicate whether it is visible or not + //bool visible = win->property(NativeWindow::Visible).toBool(); + // TODO +} + // === PUBLIC === DesktopContextMenu::DesktopContextMenu(QWidget *parent) : QMenu(parent){ if(parent!=0){ parent->setContextMenuPolicy(Qt::CustomContextMenu); connect(parent, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showMenu(const QPoint&)) ); } + appMenu = 0; + winMenu = 0; + usewinmenu = false; workspaceLabel = new QLabel(0); + workspaceLabel->setAlignment(Qt::AlignCenter); wkspaceact = new QWidgetAction(0); wkspaceact->setDefaultWidget(workspaceLabel); connect(this, SIGNAL(triggered(QAction*)), this, SLOT(LaunchAction(QAction*)) ); - + //Connect to a couple global objects + connect(this, SIGNAL(aboutToShow()), this, SLOT(UpdateMenu()) ); //this will do a "fast" update + qDebug() << "Done Creating Context Menu"; } DesktopContextMenu::~DesktopContextMenu(){ @@ -78,9 +116,9 @@ DesktopContextMenu::~DesktopContextMenu(){ void DesktopContextMenu::start(){ connect(DesktopSettings::instance(), SIGNAL(FileModified(DesktopSettings::File)), this, SLOT(SettingsChanged(DesktopSettings::File)) ); connect(this, SIGNAL(LockSession()), Lumina::SS, SLOT(LockScreenNow()) ); - + connect(XDGDesktopList::instance(), SIGNAL(appsUpdated()), this, SLOT(updateAppMenu()) ); + UpdateMenu(false); //Still need to connect to some "workspaceChanged(int)" signal - QTimer::singleShot(0, this, SLOT(UpdateMenu()) ); //initial update } // === PRIVATE SLOTS === @@ -89,9 +127,63 @@ void DesktopContextMenu::LaunchAction(QAction *act){ if(act->whatsThis().isEmpty() || act->parent()!=this ){ return; } qDebug() << "Launch Menu Action:" << act->whatsThis(); QString cmd = act->whatsThis(); - ExternalProcess::launch(cmd); + if(cmd.startsWith("-action ")){ + LaunchApp(act); //forward this to the XDGDesktop parser + }else if(cmd.startsWith("--") || cmd.endsWith(".desktop")){ + LSession::instance()->LaunchStandardApplication(cmd); + }else if(QFile::exists(cmd)){ + QString mime = XDGMime::fromFileName(cmd); + LSession::instance()->LaunchStandardApplication(mime, QStringList() << cmd); + } +} + +void DesktopContextMenu::LaunchApp(QAction *act){ + + // The "whatsThis() field is set by the XDGDesktop object/format + if(act->whatsThis().isEmpty()){ return; } + QString action, file; + QString wt = act->whatsThis(); + if(wt.startsWith("-action")){ + action = wt.section(" ",1,1); action=action.remove("\""); + file = wt.section(" ",2,-1); file=file.remove("\""); + } + else{ file = wt; } + LSession::instance()->LaunchDesktopApplication(file, action); + } void DesktopContextMenu::showMenu(const QPoint &pt){ this->popup(pt); } + +void DesktopContextMenu::updateAppMenu(){ + //qDebug() << "Update App Menu"; + if(appMenu==0){ + appMenu = new QMenu(this); + appMenu->setTitle( tr("Applications")); + LIconCache::instance()->loadIcon( appMenu, "system-run"); + connect(appMenu, SIGNAL(triggered(QAction*)), this, SLOT(LaunchApp(QAction*)) ); + } + //qDebug() << "Populate App Menu"; + XDGDesktopList::instance()->populateMenu(appMenu); +} + +void DesktopContextMenu::updateWinMenu(){ + //qDebug() << "Update Win Menu"; + if(winMenu==0){ + winMenu = new QMenu(this); + winMenu->setTitle( tr("Task Manager") ); + LIconCache::instance()->loadIcon( winMenu, "preferences-system-windows"); + } + winMenu->clear(); + QList<NativeWindow*> wins = Lumina::NWS->currentWindows(); + unsigned int wkspace = Lumina::NWS->currentWorkspace(); + for(int i=0; i<wins.length(); i++){ + //First check if this window is in the current workspace (or is "sticky") + if(wins.at(i)->property(NativeWindow::Workspace).toUInt() != wkspace + && wins.at(i)->property(NativeWindow::States).value< QList<NativeWindow::State> >().contains(NativeWindow::S_STICKY) ){ + continue; + } + AddWindowToMenu(wins.at(i)); + } +} diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h b/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h index 7fd21967..78756e8c 100644 --- a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h +++ b/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h @@ -13,11 +13,15 @@ class DesktopContextMenu : public QMenu{ Q_OBJECT public slots: void SettingsChanged(DesktopSettings::File); - void UpdateMenu(); //re-create the menu + void UpdateMenu(bool fast = true); //re-create the menu private: QLabel *workspaceLabel; QWidgetAction *wkspaceact; + QMenu *appMenu, *winMenu; + bool usewinmenu; + + void AddWindowToMenu(NativeWindow*); public: DesktopContextMenu(QWidget *parent = 0); @@ -27,8 +31,13 @@ public: private slots: void LaunchAction(QAction *act); + void LaunchApp(QAction *act); + void showMenu(const QPoint&); + void updateAppMenu(); + void updateWinMenu(); + signals: void LockSession(); void showLeaveDialog(); diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.cpp b/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.cpp index 39a7b596..a0edde9f 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.cpp @@ -8,7 +8,7 @@ #include <QScreen> #include <QApplication> -#define DEBUG 1 +#define DEBUG 0 LScreenSaver::LScreenSaver() : QWidget(0,Qt::BypassWindowManagerHint | Qt::WindowStaysOnTopHint){ starttimer = new QTimer(this); @@ -20,7 +20,6 @@ LScreenSaver::LScreenSaver() : QWidget(0,Qt::BypassWindowManagerHint | Qt::Windo LOCKER = new LLockScreen(this); LOCKER->hide(); - settings = new QSettings("lumina-desktop","lumina-screensaver",this); SSRunning = SSLocked = updating = false; this->setObjectName("LSCREENSAVERBASE"); this->setStyleSheet("LScreenSaver#LSCREENSAVERBASE{ background: grey; }"); @@ -60,10 +59,9 @@ void LScreenSaver::start(){ } void LScreenSaver::reloadSettings(){ - settings->sync(); - starttimer->setInterval( settings->value("timedelaymin",10).toInt() * 60000 ); - locktimer->setInterval( settings->value("lockdelaymin",1).toInt() * 60000 ); - hidetimer->setInterval( settings->value("hidesecs",15).toInt() * 1000 ); + starttimer->setInterval( DesktopSettings::instance()->value(DesktopSettings::ScreenSaver, "timedelaymin",10).toInt() * 60000 ); + locktimer->setInterval( DesktopSettings::instance()->value(DesktopSettings::ScreenSaver, "lockdelaymin",1).toInt() * 60000 ); + hidetimer->setInterval( DesktopSettings::instance()->value(DesktopSettings::ScreenSaver, "hidesecs",15).toInt() * 1000 ); } void LScreenSaver::newInputEvent(){ @@ -107,12 +105,14 @@ void LScreenSaver::ShowScreenSaver(){ for(int i=0; i<SCREENS.length(); i++){ bounds = bounds.united(SCREENS[i]->geometry()); if(DEBUG){ qDebug() << " - New SS Base:" << i; } - BASES << new SSBaseWidget(this, settings); + BASES << new SSBaseWidget(this); connect(BASES[i], SIGNAL(InputDetected()), this, SLOT(newInputEvent()) ); - + //Setup the geometry of the base to match the screen BASES[i]->setGeometry(SCREENS[i]->geometry()); //match this screen geometry - BASES[i]->setPlugin(settings->value("screenplugin"+QString::number(i+1), settings->value("defaultscreenplugin","random").toString() ).toString() ); + QString plug = DesktopSettings::instance()->value(DesktopSettings::ScreenSaver, "plugin_"+SCREENS[i]->name(), "").toString(); + if(plug.isEmpty()){ plug = DesktopSettings::instance()->value(DesktopSettings::ScreenSaver, "default_plugin","random").toString(); } + BASES[i]->setPlugin(plug); } //Now set the overall parent widget geometry and show everything this->setGeometry(bounds); //overall background widget @@ -151,7 +151,7 @@ void LScreenSaver::HideScreenSaver(){ emit ClosingScreenSaver(); emit LockStatusChanged(false); } - qDebug() << "Stop ScreenSavers"; + if(DEBUG){ qDebug() << "Stop ScreenSavers"; } for(int i=0; i<BASES.length(); i++){ BASES[i]->stopPainting(); BASES[i]->hide(); diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.h index 18f12fab..2276fb6d 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.h +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.h @@ -22,7 +22,6 @@ public: private: QTimer *starttimer, *locktimer, *hidetimer; - QSettings *settings; QList<SSBaseWidget*> BASES; LLockScreen *LOCKER; int cBright; diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.cpp b/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.cpp index 7854b597..a6d5be60 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.cpp @@ -9,17 +9,18 @@ #define DEBUG 1 -static QStringList validPlugs; // ======== // PUBLIC // ======== -SSBaseWidget::SSBaseWidget(QWidget *parent, QSettings *set) : QWidget(parent){ - if(validPlugs.isEmpty()){ validPlugs << "none"; } //add more later - settings = set; //needed to pass along for plugins to read any special options/settings +SSBaseWidget::SSBaseWidget(QWidget *parent) : QWidget(parent){ this->setObjectName("LuminaBaseSSWidget"); ANIM = 0; this->setMouseTracking(true); plugType="none"; + restartTimer = new QTimer(this); + restartTimer->setInterval( DesktopSettings::instance()->value(DesktopSettings::ScreenSaver, "globals/plugin_time_seconds", 60).toInt() * 1000); + restartTimer->setSingleShot(true); + connect(restartTimer, SIGNAL(timeout()), this, SLOT(startPainting()) ); } SSBaseWidget::~SSBaseWidget(){ @@ -27,9 +28,7 @@ SSBaseWidget::~SSBaseWidget(){ } void SSBaseWidget::setPlugin(QString plug){ - plug = plug.toLower(); - if(validPlugs.contains(plug) || plug=="random"){ plugType = plug; } - else{ plugType = "none"; } + plugType = plug.toLower(); } // ============= @@ -48,7 +47,7 @@ void SSBaseWidget::startPainting(){ if(valid.isEmpty()){ cplug = "none"; } //no known plugins else{ cplug = valid[ qrand()%valid.length() ]; } //grab a random plugin } - if(DEBUG){ qDebug() << " - Screen Saver:" << cplug; } + if(DEBUG){ qDebug() << " - Screen Saver:" << plugType << cplug; } //Now list all the various plugins and start them appropriately QString style; if(cplug=="none"){ @@ -60,7 +59,7 @@ void SSBaseWidget::startPainting(){ this->repaint(); //If not a stylesheet-based plugin - set it here if(cplug!="none"){ - ANIM = BaseAnimGroup::NewAnimation(cplug, this, settings); + ANIM = BaseAnimGroup::NewAnimation(cplug, this); connect(ANIM, SIGNAL(finished()), this, SLOT(startPainting()) ); //repeat the plugin as needed ANIM->LoadAnimations(); } @@ -71,14 +70,19 @@ void SSBaseWidget::startPainting(){ ANIM->start(); } } + restartTimer->start(); } void SSBaseWidget::stopPainting(){ if(ANIM!=0){ - qDebug() << "Stopping Animation!!"; + if(DEBUG){ qDebug() << "Stopping Animation!!"; } ANIM->stop(); //ANIM->clear(); ANIM->deleteLater(); ANIM = 0; + //Delete any child widgets of the canvas + QList<QWidget*> widgets = this->findChildren<QWidget*>("",Qt::FindDirectChildrenOnly); + for(int i=0; i<widgets.length(); i++){ widgets[i]->deleteLater(); } } + if(restartTimer->isActive()){ restartTimer->stop(); } } diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.h index 9d987178..af809127 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.h +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.h @@ -15,7 +15,7 @@ class SSBaseWidget : public QWidget{ Q_OBJECT public: - SSBaseWidget(QWidget *parent, QSettings *set); + SSBaseWidget(QWidget *parent); ~SSBaseWidget(); void setPlugin(QString); @@ -27,7 +27,7 @@ public slots: private: QString plugType, cplug; //type of custom painting to do BaseAnimGroup *ANIM; - QSettings *settings; + QTimer *restartTimer; private slots: diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.cpp b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.cpp index c8a248c0..9b095fe4 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.cpp +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.cpp @@ -15,27 +15,37 @@ #include "ImageSlideshow.h" #include "VideoSlideshow.h" + +QVariant BaseAnimGroup::readSetting(QString variable, QVariant defaultvalue){ + return DesktopSettings::instance()->value(DesktopSettings::ScreenSaver, + "Animations/"+animPlugin+"/"+variable, defaultvalue); +} + //============================== // PLUGIN LOADING/LISTING //============================== -BaseAnimGroup* BaseAnimGroup::NewAnimation(QString type, QWidget *parent, QSettings *set){ +BaseAnimGroup* BaseAnimGroup::NewAnimation(QString type, QWidget *parent){ //This is where we place all the known plugin ID's, and load the associated subclass + BaseAnimGroup *anim = 0; if(type=="fireflies"){ - return (new FirefliesAnimation(parent,set)); + anim = new FirefliesAnimation(parent); }else if(type == "grav") { - return (new GravAnimation(parent, set)); + anim = new GravAnimation(parent); }else if(type == "text") { - return (new TextAnimation(parent, set)); + anim = new TextAnimation(parent); }else if(type == "imageSlideshow") { - return (new ImageAnimation(parent, set)); + anim = new ImageAnimation(parent); }else if(type == "videoSlideshow") { - return (new VideoAnimation(parent, set)); + anim = new VideoAnimation(parent); }else { //Unknown screensaver, return a blank animation group - return (new BaseAnimGroup(parent, set)); + anim = new BaseAnimGroup(parent); } + //tag the animation with the type it is and return it + if(anim!=0){ anim->animPlugin = type; } + return anim; } QStringList BaseAnimGroup::KnownAnimations(){ - return (QStringList() << "imageSlideshow" /*<< "grav" << "text" << "imageSlideshow" << "fireflies"*/); + return (QStringList() << "none" << "grav" << "text" << "imageSlideshow" << "videoSlideshow" << "fireflies"); } diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.h index b1324e78..92e038ed 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.h +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.h @@ -16,21 +16,23 @@ class BaseAnimGroup : public QParallelAnimationGroup{ Q_OBJECT public: QWidget *canvas; - QSettings *settings; + QString animPlugin; virtual void LoadAnimations(){} //This is the main function which needs to be subclassed - BaseAnimGroup(QWidget *parent, QSettings *set){ + BaseAnimGroup(QWidget *parent){ canvas = parent; - settings = set; canvas->setCursor( QCursor(Qt::BlankCursor) ); } ~BaseAnimGroup(){} + QVariant readSetting(QString variable, QVariant defaultvalue = QVariant()); + + //============================== // PLUGIN LOADING/LISTING (Change in the .cpp file) //============================== - static BaseAnimGroup* NewAnimation(QString type, QWidget *parent, QSettings *set); + static BaseAnimGroup* NewAnimation(QString type, QWidget *parent); static QStringList KnownAnimations(); }; diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Fireflies.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Fireflies.h index 75dfb1ae..dfc12e79 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Fireflies.h +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Fireflies.h @@ -12,6 +12,7 @@ #include "global-includes.h" #include "BaseAnimGroup.h" #include <QSequentialAnimationGroup> +#include <QGraphicsOpacityEffect> class Firefly : public QSequentialAnimationGroup{ Q_OBJECT @@ -34,9 +35,12 @@ private slots: movement->setEndValue(pt); movement->setDuration( qrand() %500 + 1000); //between 1000->1500 ms animations for movements //Adjust the flash duration/size a bit - flash->setDuration(qrand() %300 + 700); //700-1000 ms - int sz = qrand()%4 + 6; //6-10 pixel square + flash->setDuration(qrand() %200 + 500); //500-700 ms + int sz = qrand()%4 + 4; //6-10 pixel square + //flash->setKeyValueAt(0.5, (qrand()%50) /100.0); + //fly->resize(sz,sz); flash->setKeyValueAt(0.5, QSize(sz,sz)); //half-way point for the flash + fly->show(); } void stopped(){ fly->hide(); } @@ -46,24 +50,41 @@ public: fly = new QWidget(parent); range = parent->size(); maxX = range.width()/4; maxY = range.height()/4; - fly->setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(215, 215, 143, 255), stop:0.83871 rgba(221, 235, 64, 140), stop:0.99 rgba(0, 0, 0, 255), stop:1 transparent);"); + QString B = QString::number(qrand()%70); + QString RY = QString::number(qrand()%200+50); + QString style = "background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(245, 245, 143, 200), stop:0.83871 rgba(%1, %1, %2, 140), stop:0.99 rgba(0, 0, 0, 255), stop:1 transparent);"; + fly->setStyleSheet(style.arg(RY, B) ); //setup the movement animation movement = new QPropertyAnimation(fly); movement->setTargetObject(fly); movement->setPropertyName("pos"); movement->setEndValue( QPoint( qrand() % range.width(), qrand()%range.height()) ); //on anim start, this will become the starting point //setup the flashing animation - flash = new QPropertyAnimation(fly); + /*QGraphicsOpacityEffect *eff = new QGraphicsOpacityEffect(parent); + fly->setGraphicsEffect(eff); + flash = new QPropertyAnimation(eff, "opacity");*/ + flash = new QPropertyAnimation(this); flash->setTargetObject(fly); flash->setPropertyName("size"); - flash->setStartValue(QSize(2,2)); + flash->setStartValue(QSize(0,0)); flash->setEndValue(flash->startValue()); + //fly->setProperty("opacity",0); + //flash->setPropertyName("opacity"); + //flash->setStartValue(0); + //flash->setEndValue(0); //now setup the order of the animations this->setLoopCount(100); //do this 100 times - this->addAnimation(movement); - this->addAnimation(flash); + //Roughly half the number of fireflies with start with movement/flash + if(qrand()%2 == 1){ + this->addAnimation(movement); + this->addAnimation(flash); + }else{ + this->addAnimation(flash); + this->addAnimation(movement); + } //Start up this firefly LoopChanged(); //load initial values + fly->setGeometry( QRect(movement->startValue().toPoint(), flash->startValue().toSize()) ); connect(this, SIGNAL(currentLoopChanged(int)), this, SLOT(LoopChanged()) ); connect(this, SIGNAL(finished()), this, SLOT(stopped()) ); @@ -78,7 +99,7 @@ private: QList<Firefly*> fireflies; public: - FirefliesAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){} + FirefliesAnimation(QWidget *parent) : BaseAnimGroup(parent){} ~FirefliesAnimation(){ this->stop(); //while(fireflies.length()>0){ fireflies.takeAt(0)->deleteLater(); } @@ -87,14 +108,14 @@ public: void LoadAnimations(){ while(fireflies.length()>0){ fireflies.takeAt(0)->deleteLater(); } canvas->setStyleSheet("background: black;"); - int number = settings->value("fireflies/number",100).toInt(); + int number = readSetting("number",qrand()%30 + 50).toInt(); for(int i=0; i<number; i++){ if(fireflies.length()>number){ continue; } Firefly *tmp = new Firefly(canvas); this->addAnimation(tmp); fireflies << tmp; } - while( fireflies.length()>number){ fireflies.takeAt(number)->deleteLater(); } + } }; diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Grav.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Grav.h index 50d733e9..df75ad67 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Grav.h +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Grav.h @@ -36,7 +36,7 @@ private: double xrand = 0.4; //(qrand()%10+4)/10.0; double yrand = 0.4; //(qrand()%10+4)/10.0; - double theta = 1.5707963; + double theta = 1.5707963; //double theta = aTan((start.x() - ref->x())/(start.y() - ref->y())); QMatrix rotation = QMatrix(qCos(theta), qSin(theta), -qSin(theta), qCos(theta), -ref->x(), -ref->y()); qDebug() << rotation; @@ -46,9 +46,9 @@ private: //qDebug() << "Center" << *ref; QPoint firstP = (QPoint(ref->x() + xrand*start.x()*(qCos(0/step) -qSin(0/step)), ref->y() + yrand*start.y()*(qCos(0/step) -qSin(0/step)))); - QPoint rotFP = rotation.map(firstP); + QPoint rotFP = rotation.map(firstP); qDebug() << "First Point" << firstP; - qDebug() << "Rotation by Matrix" << rotFP; + qDebug() << "Rotation by Matrix" << rotFP; QPoint lastP = (QPoint(ref->x() + xrand*start.x()*(qCos(PI/step) -qSin(PI/step)), ref->y() + yrand*start.y()*(qCos(PI/step) -qSin(PI/step)))); orbit->setKeyValueAt(0, firstP); orbit->setKeyValueAt(1, lastP); @@ -77,13 +77,13 @@ private slots: orbit->setDuration(10); } }*/ - void stopped(){ qDebug() << "Planet stopped"; planet->hide();} + void stopped(){ planet->hide();} public: Grav(QWidget *parent) : QParallelAnimationGroup(parent){ planet = new QWidget(parent); range = parent->size(); - QPoint center = parent->geometry().center(); + QPoint center = QRect(QPoint(0,0), parent->size()).center();; //Creates a random planet size. Between 12 and 45 pixels int planet_radius = qRound(1.75* ((qrand()%20)+7) ); @@ -114,7 +114,7 @@ public: planet->show(); //Ensures the screensaver will not stop until the user wishes to login or it times out - this->setLoopCount(1); //number of orbits + this->setLoopCount(3); //number of orbits orbit->setDuration( qrand() %1000 + 19000); //20 second orbits //orbit->setEndValue(path.at(0)); //LoopChanged(0); //load initial values @@ -145,7 +145,7 @@ private slots: } public: - GravAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){} + GravAnimation(QWidget *parent) : BaseAnimGroup(parent){} ~GravAnimation(){ sun->deleteLater(); while(planets.length()>0){ planets.takeAt(0)->deleteLater(); } @@ -154,7 +154,7 @@ public: void LoadAnimations(){ //Creates the sun, which is a thin shell with a gradient from green to yellow sun = new QWidget(canvas); - QPoint center = canvas->geometry().center(); + QPoint center = QRect(QPoint(0,0), canvas->size()).center(); QString sunstyle = QStringLiteral("background-color:qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, ") + QStringLiteral("stop:0 rgba(0, 0, 0, 0), stop:0.38 rgba(0, 0, 0, 0), stop:0.4 rgba(82, 121, 76, 33), stop:0.5 rgba(159, 235, 148, 64), ") + QStringLiteral("stop:0.6 rgba(255, 238, 150, 129), stop:0.7 rgba(0, 0, 0, 0));"); @@ -164,11 +164,11 @@ public: wobble = new QPropertyAnimation(sun); wobble->setPropertyName("geometry"); wobble->setTargetObject(sun); - QRect initgeom = QRect(center-QPoint(12,12), QSize(60, 60)); + QRect initgeom = QRect(center-QPoint(30,30), QSize(60, 60)); wobble->setStartValue(initgeom); wobble->setKeyValueAt(0, initgeom ); //starting point wobble->setKeyValueAt(1, initgeom ); //starting point - wobble->setKeyValueAt(0.5, QRect(center-QPoint(18,18), QSize(90, 90))); //starting point + wobble->setKeyValueAt(0.5, QRect(center-QPoint(45,45), QSize(90, 90))); //starting point wobble->setDuration(2000); wobble->setLoopCount(-1); this->addAnimation(wobble); @@ -176,13 +176,13 @@ public: sun->setGeometry(initgeom); //Gives the screensaver a black background - canvas->setStyleSheet("background: black;"); + //canvas->setStyleSheet("background: black;"); //Pulls number of planets from settings, with 10 as default - int number = settings->value("planets/number",10).toInt(); + int number = readSetting("planets/number",qrand()%5+3).toInt(); //Loops through all planets and sets up the animations, then adds them to the base group and vector, which - qDebug() << "Starting planets"; + //qDebug() << "Starting planets"; for(int i=0; i<number; i++){ Grav *tmp = new Grav(canvas); this->addAnimation(tmp); diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/ImageSlideshow.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/ImageSlideshow.h index a64144ac..81bc2b35 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/ImageSlideshow.h +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/ImageSlideshow.h @@ -17,7 +17,7 @@ private: QPropertyAnimation *bounce, *fading; QPixmap pixmap; QStringList imageFiles; - QString imagePath, scriptPath; + QString imagePath, scriptPath, curpixmap; QSize screenSize; bool animate, scriptLoad; @@ -40,30 +40,34 @@ private: } void chooseImage() { - QString randomFile = imagePath+imageFiles[qrand() % imageFiles.size()]; - - //Choose a new file if the chosen one is not an image - while(QImageReader::imageFormat(randomFile).isEmpty()) - randomFile = imagePath+imageFiles[qrand() % imageFiles.size()]; - if(scriptLoad){ - QProcess process; - process.start("/home/zwelch/test.sh"); - process.waitForFinished(1000); - QByteArray output = process.readAllStandardOutput(); - qDebug() << output; - pixmap.load(imagePath+imageFiles[qrand() % imageFiles.size()]); - }else{ - pixmap.load(imagePath+imageFiles[qrand() % imageFiles.size()]); - } - - //If the image is larger than the screen, then shrink the image down to 3/4 it's size (so there's still some bounce) + /*if(scriptLoad){ + QProcess process; + process.start("/home/zwelch/test.sh"); + process.waitForFinished(1000); + QByteArray output = process.readAllStandardOutput(); + //qDebug() << output; + //pixmap.load(randomFile); + }else{*/ + //File Load + QString randomFile = curpixmap; + if(imageFiles.size()>1 || curpixmap.isEmpty()){ + while(curpixmap==randomFile){ randomFile = imagePath+imageFiles[qrand() % imageFiles.size()]; } + } + if(curpixmap!=randomFile){ + curpixmap = randomFile; //save this for later + //no need to load the new file or change the label + pixmap.load(randomFile); + //If the image is larger than the screen, then shrink the image down to 3/4 it's size (so there's still some bounce) //Scale the pixmap to keep the aspect ratio instead of resizing the label itself - if(pixmap.width() > screenSize.width() or pixmap.height() > screenSize.height()) - pixmap = pixmap.scaled(screenSize*(3.0/4.0), Qt::KeepAspectRatio); + if(pixmap.width() >= (screenSize.width()-10) || pixmap.height() >= (screenSize.height()-10) ){ + pixmap = pixmap.scaled(screenSize*(3.0/4.0), Qt::KeepAspectRatio); + } + //Set pixmap to the image label + image->setPixmap(pixmap); + image->resize(pixmap.size()); + } + //} - //Set pixmap to the image label - image->setPixmap(pixmap); - image->resize(pixmap.size()); } private slots: @@ -72,7 +76,7 @@ private slots: chooseImage(); setupAnimation(); } - void stopped(){ qDebug() << "Image Stopped"; image->hide();} + void stopped(){ image->hide();} public: ImageSlideshow(QWidget *parent, QString path, bool animate, bool scriptLoad, QString scriptPath) : QParallelAnimationGroup(parent){ @@ -80,20 +84,25 @@ public: image = new QLabel(parent); screenSize = parent->size(); this->animate = animate; - this->scriptLoad = scriptLoad; - this->scriptPath = scriptPath; - + this->scriptLoad = scriptLoad; + this->scriptPath = scriptPath; + //Generate the list of files in the directory imageFiles = QDir(imagePath).entryList(QDir::Files); - if(imageFiles.empty()) - qDebug() << "Current image file path has no files."; - - //Change some default settings for the image. If scaledContents is false, the image will be cut off if resized - image->setScaledContents(true); - image->setAlignment(Qt::AlignHCenter); - - //Load a random initial image - chooseImage(); + //Ensure all the files are actually images + for(int i=0; i<imageFiles.length(); i++){ + if(QImageReader::imageFormat(imagePath+"/"+imageFiles[i]).isEmpty()){ imageFiles.removeAt(i); i--; } + } + if(imageFiles.empty()){ + qDebug() << "Current image file path has no files."; + image->setText("No image files found:\n"+imagePath); + }else{ + //Change some default settings for the image. If scaledContents is false, the image will be cut off if resized + image->setScaledContents(true); + image->setAlignment(Qt::AlignHCenter); + //Load a random initial image + chooseImage(); + } //Create the animation that moves the image across the screen bounce = new QPropertyAnimation(image, "pos", parent); @@ -117,8 +126,8 @@ public: //If no animation, center the image in the middle of the screen image->move(QPoint((parent->width()-image->width())/2,(parent->height()-image->height())/2)); - //Loop through 30 times for a total for 4 minutes - this->setLoopCount(30); + //Loop through 15 times for a total for 2 minutes + this->setLoopCount(15); bounce->setDuration(8000); fading->setDuration(8000); @@ -132,7 +141,7 @@ public: class ImageAnimation: public BaseAnimGroup{ Q_OBJECT public: - ImageAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){} + ImageAnimation(QWidget *parent) : BaseAnimGroup(parent){} ~ImageAnimation(){ this->stop(); } @@ -140,13 +149,14 @@ public: void LoadAnimations(){ canvas->setStyleSheet("background: black;"); //Load the path of the images from the configuration file (default /usr/local/backgrounds/) - QString imagePath = settings->value("imageSlideshow/path","/usr/local/backgrounds/").toString(); + QString imagePath = readSetting("path", LOS::LuminaShare()+"../wallpapers/").toString(); //Load whether to animate the image (default true) - bool animate = settings->value("imageSlideshow/animate", true).toBool(); - bool scriptLoad = settings->value("imageSlideshow/scriptLoad", true).toBool(); - QString scriptPath; - if(scriptLoad) - scriptPath = settings->value("imageSlideshow/scriptPath", "/usr/local/backgrounds/script.sh").toString(); + bool animate = readSetting("animate", true).toBool(); + bool scriptLoad = readSetting("scriptLoad", true).toBool(); + QString scriptPath; + if(scriptLoad){ + scriptPath = readSetting("scriptPath", "/usr/local/backgrounds/script.sh").toString(); + } ImageSlideshow *tmp = new ImageSlideshow(canvas, imagePath, animate, scriptLoad, scriptPath); this->addAnimation(tmp); } diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/SampleAnimation.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/SampleAnimation.h index c2bb0c96..c7a8b237 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/SampleAnimation.h +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/SampleAnimation.h @@ -18,7 +18,7 @@ private: QWidget *ball; public: - SampleAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){} + SampleAnimation(QWidget *parent) : BaseAnimGroup(parent){} ~SampleAnimation(){ this->stop(); delete ball; } void LoadAnimations(){ diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Text.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Text.h index 3ec0af82..6ba18b22 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Text.h +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Text.h @@ -12,6 +12,8 @@ #include <QParallelAnimationGroup> #include <QtMath> +#include <unistd.h> + class Text: public QParallelAnimationGroup{ Q_OBJECT private: @@ -38,15 +40,15 @@ private slots: void stopped(){ qDebug() << "Text Stopped"; text->hide();} public: - Text(QWidget *parent) : QParallelAnimationGroup(parent){ + Text(QWidget *parent, QString display) : QParallelAnimationGroup(parent){ text = new QLabel(parent); range = parent->size(); - QPoint center = parent->geometry().center(); + QPoint center = QRect( QPoint(0,0), parent->size()).center(); QString color = "rgba(" + QString::number(qrand() % 206 + 50) + ", " + QString::number(qrand() % 206 + 50) + ", " + QString::number(qrand() % 206 + 50); - text->setStyleSheet("QLabel {background-color: rgba(255, 255, 255, 10); color: " + color + "); }"); + text->setStyleSheet("QLabel {background-color: transparent; color: " + color + "); }"); text->setFont(QFont("Courier", 24, QFont::Bold)); - text->setText("test"); + text->setText(display); QFontMetrics metrics(text->font()); text->setMinimumSize(QSize( metrics.width(text->text())+10, metrics.height()*text->text().count("\n") +10)); @@ -60,7 +62,7 @@ public: v.setY((qrand() % 100 + 50) * qPow(-1, qrand() % 2)); movement->setStartValue(center); //Ensures the screensaver will not stop until the user wishes to login or it times out - this->setLoopCount(2000); //number of movements + this->setLoopCount(200); //number of wall bounces movement->setDuration(200); movement->setEndValue(QPoint(qrand() % (int)range.height(), qrand() % range.width())); LoopChanged(); //load initial values @@ -75,14 +77,22 @@ public: class TextAnimation : public BaseAnimGroup{ Q_OBJECT public: - TextAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){} + TextAnimation(QWidget *parent) : BaseAnimGroup(parent){} ~TextAnimation(){ this->stop(); } void LoadAnimations(){ canvas->setStyleSheet("background: black;"); - Text *tmp = new Text(canvas); + //Read off the text that needs to be displayed + QString textToShow = readSetting("text", "").toString(); + if(textToShow.isEmpty()){ + char hname[300]; + gethostname(hname, 300); + textToShow = QString::fromLocal8Bit(hname); + } + // Now create the animation + Text *tmp = new Text(canvas, textToShow); this->addAnimation(tmp); } diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/VideoSlideshow.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/VideoSlideshow.h index cc3c1b83..358b4bfb 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/VideoSlideshow.h +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/VideoSlideshow.h @@ -10,55 +10,19 @@ #include "global-includes.h" #include "BaseAnimGroup.h" -class VideoSlideshow: public QPropertyAnimation{ - Q_OBJECT -public: - VideoSlideshow(QWidget *parent, QVideoWidget *videoWidget) : QPropertyAnimation(videoWidget, "pos", parent){ - this->setKeyValueAt(0,QPoint(0,0)); - this->setKeyValueAt(1,QPoint(0,0)); - this->setDuration(1000000); - this->setLoopCount(-1); - } - ~VideoSlideshow(){} - -}; - class VideoAnimation: public BaseAnimGroup{ Q_OBJECT private: - QString videoPath; - VideoSlideshow *tmp; + QString videoPath, singleVideo; QVideoWidget *videoWidget; QMediaPlayer *video; QStringList videoFiles; - bool multimonitor; + bool multiple; private slots: - void startVideo(QAbstractAnimation::State state) { - qDebug() << "Status: " << video->mediaStatus() << "New Animation State:" << state; - if(state==QAbstractAnimation::Running){ - video->setVolume(100); - video->play(); - } - if(state==QAbstractAnimation::Stopped && video->state()!=QMediaPlayer::StoppedState){ - video->stop(); - } - } - - void stopVideo() { - if(video->state() == QMediaPlayer::StoppedState) { - qDebug() << "Stopping Animation"; - //this->deleteLater(); - videoWidget->hide(); - tmp->stop(); - //tmp->deleteLater(); - videoWidget->deleteLater(); - video->deleteLater(); - } - } public: - VideoAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){} + VideoAnimation(QWidget *parent) : BaseAnimGroup(parent){} ~VideoAnimation(){ this->stop(); @@ -68,36 +32,53 @@ public: canvas->setStyleSheet("background: black;"); //Load the path of the videos from the configuration file (default /usr/local/videos/) - videoPath = settings->value("videoSlideshow/path","/usr/local/videos").toString(); + videoPath = readSetting("path","/usr/local/videos").toString(); + singleVideo = readSetting("videoLocation","").toString(); + multiple = readSetting("multiple",true).toBool(); if(!videoPath.endsWith("/")){ videoPath.append("/"); } //Set whether to copy videos on two monitors or play different videos - multimonitor = settings->value("videoSlideshow/multimonitor",true).toBool(); + //multimonitor = settings->value("videoSlideshow/multimonitor",true).toBool(); + //Set up the VideoWidget video = new QMediaPlayer(canvas, QMediaPlayer::VideoSurface); videoWidget = new QVideoWidget(canvas); + video->setVideoOutput(videoWidget); videoWidget->setGeometry(QRect(QPoint(0,0), canvas->size())); - tmp = new VideoSlideshow(canvas, videoWidget); - this->addAnimation(tmp); - //Generate the list of files in the directory videoFiles = QDir(videoPath).entryList(QDir::Files); - if(videoFiles.empty()) - qDebug() << "Current video file path has no files."; + if(videoFiles.empty()){ + qDebug() << "Current video file path has no files:" << videoPath; + return; + } - this->setLoopCount(1); + if(singleVideo.isNull()) + singleVideo = videoPath+videoFiles[0]; - QUrl url = QUrl::fromLocalFile(videoPath+videoFiles[qrand() % videoFiles.size()]); - video->setMedia(url); - qDebug() << url; - video->setVideoOutput(videoWidget); + //Loading a random file from a directory + QDesktopWidget *dw = new QDesktopWidget(); + QMediaPlaylist *playlist = new QMediaPlaylist(); + if(multiple) { + for(int i = 0; i < videoFiles.size(); i++){ + playlist->addMedia(QUrl::fromLocalFile(videoPath+videoFiles[i])); + } + playlist->shuffle(); + }else{ + playlist->addMedia(QUrl::fromLocalFile(singleVideo)); + playlist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop); + } videoWidget->show(); + if(multiple) + video->setPlaylist(playlist); + + //Only play sound for one monitor to prevent messed up audio + if(dw->screenNumber(canvas) == 0) + video->setVolume(100); + else + video->setVolume(0); - qDebug() << "VideoWidget Displayed"; - connect(tmp, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State)), this, SLOT(startVideo(QAbstractAnimation::State)) ); - //connect(video, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(startVideo()) ); - connect(video, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(stopVideo()) ); + video->play(); } }; |