diff options
Diffstat (limited to 'lumina-desktop/desktop-plugins/desktopview')
4 files changed, 210 insertions, 0 deletions
diff --git a/lumina-desktop/desktop-plugins/desktopview/DeskItem.cpp b/lumina-desktop/desktop-plugins/desktopview/DeskItem.cpp new file mode 100644 index 00000000..21b1d1f6 --- /dev/null +++ b/lumina-desktop/desktop-plugins/desktopview/DeskItem.cpp @@ -0,0 +1,50 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2014, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "DeskItem.h" + +DeskItem::DeskItem(QWidget *parent, QString itempath, int ssize) : QToolButton(parent){ + this->setFixedSize(ssize, ssize); + this->setWhatsThis(itempath); + this->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); + this->setAutoRaise(true); + int txtheight = this->fontMetrics().height() *2; + this->setIconSize( QSize(ssize-txtheight, ssize-txtheight)); + connect(this, SIGNAL(clicked()), this, SLOT(RunItem()) ); + updateItem(); +} + +DeskItem::~DeskItem(){ + +} + +void DeskItem::updateItem(){ + QFileInfo info(this->whatsThis()); + QIcon ico; + QString txt; + if(info.isDir()){ + ico = LXDG::findIcon("folder",""); + txt = info.fileName(); + }else if(info.suffix()=="desktop"){ + bool ok = false; + XDGDesktop dsk = LXDG::loadDesktopFile(this->whatsThis(), ok); + if(ok){ + ico = LXDG::findIcon( dsk.icon ); + txt = dsk.name; + }else{ + ico = LXDG::findIcon("",""); + txt = info.fileName(); + } + }else{ + ico = LXDG::findIcon("application-x-zerosize",""); + txt = info.fileName(); + } + this->setIcon(ico); + //Trim the text size to fit + txt = this->fontMetrics().elidedText(txt, Qt::ElideRight ,this->width() - 4); + this->setText(txt); + +}
\ No newline at end of file diff --git a/lumina-desktop/desktop-plugins/desktopview/DeskItem.h b/lumina-desktop/desktop-plugins/desktopview/DeskItem.h new file mode 100644 index 00000000..c578d692 --- /dev/null +++ b/lumina-desktop/desktop-plugins/desktopview/DeskItem.h @@ -0,0 +1,30 @@ +//=========================================== +// 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_DESKTOP_ITEM_H +#define _LUMINA_DESKTOP_DESKTOP_ITEM_H + +#include <QToolButton> +#include <QProcess> +#include <QString> + +#include <LuminaXDG.h> + +class DeskItem : public QToolButton{ + Q_OBJECT +public: + DeskItem(QWidget *parent, QString itempath, int ssize); + ~DeskItem(); + + void updateItem(); + +private slots: + void RunItem(){ + QProcess::startDetached("lumina-open "+this->whatsThis()); + } +}; + +#endif
\ No newline at end of file diff --git a/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp b/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp new file mode 100644 index 00000000..4c70d19f --- /dev/null +++ b/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.cpp @@ -0,0 +1,87 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2014, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "DesktopViewPlugin.h" + +DesktopViewPlugin::DesktopViewPlugin(QWidget *parent) : LDPlugin(parent, "desktopview"){ + watcher = new QFileSystemWatcher(this); + deskDir = QDir::homePath(); + if(QFile::exists(deskDir+"/Desktop") ){ + deskDir = deskDir+"/Desktop"; + }else if(QFile::exists(deskDir+"/desktop") ){ + deskDir = deskDir+"/desktop"; + } + watcher->addPath(deskDir); + icoSize = 0; //temporary placeholder + spacing = 0; //temporary placeholder + ITEMS.clear(); + layout = new QGridLayout(this); + layout->setContentsMargins(1,1,1,1); + this->setLayout(layout); + + //Connect the signals/slots + connect(watcher, SIGNAL(directoryChanged(QString)), this, SLOT(UpdateDesktop()) ); + connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(UpdateDesktop()) ); + + //Now launch the update mechanisms in a new thread + QTimer::singleShot(10, this, SLOT(UpdateDesktop()) ); +} + +DesktopViewPlugin::~DesktopViewPlugin(){ + +} + +void DesktopViewPlugin::UpdateDesktop(){ + //Calculate available rows/columns + int oldSize = icoSize; + icoSize = 64; //64x64 default icons for now (make dynamic later) + int oldspacing = spacing; + spacing = 4; // 4 pixel space between items (make dynamic later); + if(icoSize != oldSize || spacing != oldspacing){ + //Re-create all the items with the proper size + for(int i=0; i<ITEMS.length(); i++){ + delete ITEMS.takeAt(i); //delete the widget + i--; + } + } + layout->setSpacing(spacing); + + int rmax = (this->height()-2)/(icoSize+spacing); + int cmax = (this->width()-2)/(icoSize+spacing); + //Now get the current items in the folder + QDir dir(deskDir); + QStringList items = dir.entryList( QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot, QDir::Type | QDir::LocaleAware | QDir::DirsFirst); + //iterate over all current items + for(int i=0; i<ITEMS.length(); i++){ + int index = items.indexOf( ITEMS[i]->whatsThis().section("/",-1) ); + if( index == -1 ){ + //item no longer exists - remove it + delete ITEMS.takeAt(i); + i--; + }else{ + //Item still exists - remove it from the "new" list + ITEMS[i]->updateItem(); + items.removeAt(index); + } + } + //Now iterate over the spaces in the widget and create items as necessary + for(int r=0; r<rmax; r++){ + layout->setRowMinimumHeight(r,icoSize); + for(int c=0; c<cmax && items.length() > 0; c++){ + if(r==0){ layout->setColumnMinimumWidth(c,icoSize); } + if(layout->itemAtPosition(r,c)==0 && items.length() > 0){ + //Empty spot, put the first new item here + DeskItem *it = new DeskItem(this, deskDir+"/"+items[0], icoSize); + items.removeAt(0); + layout->addWidget(it, r,c); + ITEMS << it; + } + } + } + if(layout->itemAtPosition(rmax,cmax)==0){ + layout->addWidget(new QWidget(this), rmax, cmax); //put an empty widget here as a placeholder + } +}
\ No newline at end of file diff --git a/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.h b/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.h new file mode 100644 index 00000000..9702e6e4 --- /dev/null +++ b/lumina-desktop/desktop-plugins/desktopview/DesktopViewPlugin.h @@ -0,0 +1,43 @@ +//=========================================== +// 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_VIEW_PLUGIN_H +#define _LUMINA_DESKTOP_VIEW_PLUGIN_H + +#include <QDir> +#include <QFile> +#include <QFileSystemWatcher> +#include <QGridLayout> +#include <QStringList> +#include <QList> +#include <QTimer> + +#include <LuminaXDG.h> + +#include "../LDPlugin.h" +#include "DeskItem.h" + + +class DesktopViewPlugin : public LDPlugin{ + Q_OBJECT +public: + DesktopViewPlugin(QWidget *parent = 0); + ~DesktopViewPlugin(); + +private: + QString deskDir; + QFileSystemWatcher *watcher; + QGridLayout *layout; + int icoSize, spacing; + QList<DeskItem*> ITEMS; + +private slots: + void UpdateDesktop(); + +}; +#endif
\ No newline at end of file |