aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src-qt5/core-utils/lumina-config/PanelWidget.cpp6
-rw-r--r--src-qt5/core-utils/lumina-config/pages/page_interface_desktop.cpp6
-rw-r--r--src-qt5/core-utils/lumina-config/pages/page_interface_panels.cpp6
-rw-r--r--src-qt5/core/libLumina/LuminaOS-FreeBSD.cpp6
-rw-r--r--src-qt5/core/libLumina/LuminaUtils.cpp66
-rw-r--r--src-qt5/core/libLumina/LuminaXDG.cpp1
-rw-r--r--src-qt5/core/lumina-desktop/LDesktop.cpp6
-rw-r--r--src-qt5/core/lumina-desktop/LDesktopBackground.cpp3
-rw-r--r--src-qt5/core/lumina-desktop/LDesktopPluginSpace.h3
-rw-r--r--src-qt5/core/lumina-desktop/LPanel.cpp5
-rw-r--r--src-qt5/core/lumina-desktop/LSession.cpp8
-rw-r--r--src-qt5/core/lumina-desktop/LXcbEventFilter.cpp2
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.cpp8
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.h1
-rw-r--r--src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp1
-rw-r--r--src-qt5/core/lumina-info/MainUI.ui4
-rw-r--r--src-qt5/core/lumina-info/main.cpp2
-rw-r--r--src-qt5/core/lumina-session/main.cpp6
-rw-r--r--src-qt5/core/lumina-session/session.cpp13
-rw-r--r--src-qt5/desktop-utils/lumina-calculator/lumina-calculator.pro92
-rw-r--r--src-qt5/desktop-utils/lumina-calculator/main.cpp19
-rw-r--r--src-qt5/desktop-utils/lumina-calculator/mainUI.cpp133
-rw-r--r--src-qt5/desktop-utils/lumina-calculator/mainUI.h50
-rw-r--r--src-qt5/desktop-utils/lumina-calculator/mainUI.ui192
-rw-r--r--src-qt5/desktop-utils/lumina-fileinfo/MainUI.cpp17
-rw-r--r--src-qt5/desktop-utils/lumina-fm/Browser.cpp8
-rw-r--r--src-qt5/desktop-utils/lumina-fm/BrowserWidget.cpp4
-rw-r--r--src-qt5/desktop-utils/lumina-fm/FODialog.cpp10
-rw-r--r--src-qt5/desktop-utils/lumina-fm/FODialog.h8
-rw-r--r--src-qt5/desktop-utils/lumina-fm/MainUI.cpp29
-rw-r--r--src-qt5/desktop-utils/lumina-fm/MainUI.h6
-rw-r--r--src-qt5/desktop-utils/lumina-fm/OPWidget.cpp108
-rw-r--r--src-qt5/desktop-utils/lumina-fm/OPWidget.h59
-rw-r--r--src-qt5/desktop-utils/lumina-fm/OPWidget.ui71
-rw-r--r--src-qt5/desktop-utils/lumina-fm/TrayUI.cpp86
-rw-r--r--src-qt5/desktop-utils/lumina-fm/TrayUI.h46
-rw-r--r--src-qt5/desktop-utils/lumina-fm/i18n/lumina-fm_de.ts520
-rw-r--r--src-qt5/desktop-utils/lumina-fm/lumina-fm.pro11
-rw-r--r--src-qt5/desktop-utils/lumina-fm/widgets/DirWidget.cpp1049
-rw-r--r--src-qt5/desktop-utils/lumina-fm/widgets/DirWidget.h184
-rw-r--r--src-qt5/desktop-utils/lumina-fm/widgets/DirWidget.ui527
-rw-r--r--src-qt5/desktop-utils/lumina-screenshot/i18n/l-screenshot_de.ts62
-rw-r--r--src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.desktop2
-rw-r--r--src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.pro2
-rw-r--r--src-qt5/desktop-utils/lumina-screenshot/main.cpp5
45 files changed, 1297 insertions, 2156 deletions
diff --git a/src-qt5/core-utils/lumina-config/PanelWidget.cpp b/src-qt5/core-utils/lumina-config/PanelWidget.cpp
index 8b38f407..aff7bda3 100644
--- a/src-qt5/core-utils/lumina-config/PanelWidget.cpp
+++ b/src-qt5/core-utils/lumina-config/PanelWidget.cpp
@@ -42,7 +42,8 @@ PanelWidget::~PanelWidget(){
void PanelWidget::LoadSettings(QSettings *settings, int Dnum, int Pnum){
pnum = Pnum; dnum = Dnum; //save these for later
ui->label->setText( QString(tr("Panel %1")).arg(QString::number(Pnum+1) ) );
- QString prefix = "panel"+QString::number(Dnum)+"."+QString::number(Pnum)+"/";
+ QString screenID = QApplication::screens().at(Dnum)->name();
+ QString prefix = "panel_"+screenID+"."+QString::number(Pnum)+"/";
qDebug() << "Loading Panel Settings:" << prefix;
//Now load the settings into the GUI
int tmp = ui->combo_align->findData( settings->value(prefix+"pinLocation","center").toString().toLower() );
@@ -78,7 +79,8 @@ void PanelWidget::LoadSettings(QSettings *settings, int Dnum, int Pnum){
}
void PanelWidget::SaveSettings(QSettings *settings){//save the current settings
- QString prefix = "panel"+QString::number(dnum)+"."+QString::number(pnum)+"/";
+ QString screenID = QApplication::screens().at(dnum)->name();
+ QString prefix = "panel_"+screenID+"."+QString::number(pnum)+"/";
qDebug() << "Saving panel settings:" << prefix;
settings->setValue(prefix+"location", ui->combo_edge->currentData().toString() );
settings->setValue(prefix+"pinLocation", ui->combo_align->currentData().toString() );
diff --git a/src-qt5/core-utils/lumina-config/pages/page_interface_desktop.cpp b/src-qt5/core-utils/lumina-config/pages/page_interface_desktop.cpp
index fdcde804..f467db36 100644
--- a/src-qt5/core-utils/lumina-config/pages/page_interface_desktop.cpp
+++ b/src-qt5/core-utils/lumina-config/pages/page_interface_desktop.cpp
@@ -31,7 +31,8 @@ page_interface_desktop::~page_interface_desktop(){
//================
void page_interface_desktop::SaveSettings(){
QSettings settings("lumina-desktop","desktopsettings");
- QString DPrefix = "desktop-"+QString::number(cscreen)+"/";
+ QString screenID = QApplication::screens().at(cscreen)->name();
+ QString DPrefix = "desktop-"+screenID+"/";
settings.setValue(DPrefix+"generateDesktopIcons", ui->check_desktop_autolaunchers->isChecked() );
QStringList plugs;
@@ -53,7 +54,8 @@ void page_interface_desktop::LoadSettings(int screennum){
emit HasPendingChanges(false);
emit ChangePageTitle( tr("Desktop Settings") );
QSettings settings("lumina-desktop","desktopsettings");
- QString DPrefix = "desktop-"+QString::number(cscreen)+"/";
+ QString screenID = QApplication::screens().at(cscreen)->name();
+ QString DPrefix = "desktop-"+screenID+"/";
ui->check_desktop_autolaunchers->setChecked(settings.value(DPrefix+"generateDesktopIcons",false).toBool() );
QStringList dplugs = settings.value(DPrefix+"pluginlist",QStringList()).toStringList();
diff --git a/src-qt5/core-utils/lumina-config/pages/page_interface_panels.cpp b/src-qt5/core-utils/lumina-config/pages/page_interface_panels.cpp
index 0e486bdd..7d0d3d8c 100644
--- a/src-qt5/core-utils/lumina-config/pages/page_interface_panels.cpp
+++ b/src-qt5/core-utils/lumina-config/pages/page_interface_panels.cpp
@@ -30,7 +30,8 @@ page_interface_panels::~page_interface_panels(){
// PUBLIC SLOTS
//================
void page_interface_panels::SaveSettings(){
- QString DPrefix = "desktop-"+QString::number(cscreen)+"/";
+ QString screenID = QApplication::screens().at(cscreen)->name();
+ QString DPrefix = "desktop-"+screenID+"/";
settings->setValue(DPrefix+"panels", PANELS.length());
for(int i=0; i<PANELS.length(); i++){
PANELS[i]->SaveSettings(settings);
@@ -48,7 +49,8 @@ void page_interface_panels::LoadSettings(int screennum){
loading = true;
emit HasPendingChanges(false);
emit ChangePageTitle( tr("Desktop Settings") );
- QString DPrefix = "desktop-"+QString::number(cscreen)+"/";
+ QString screenID = QApplication::screens().at(cscreen)->name();
+ QString DPrefix = "desktop-"+screenID+"/";
int panelnumber = settings->value(DPrefix+"panels",-1).toInt();
//First clean any current panels
diff --git a/src-qt5/core/libLumina/LuminaOS-FreeBSD.cpp b/src-qt5/core/libLumina/LuminaOS-FreeBSD.cpp
index 5cdf18bc..2bffb5a1 100644
--- a/src-qt5/core/libLumina/LuminaOS-FreeBSD.cpp
+++ b/src-qt5/core/libLumina/LuminaOS-FreeBSD.cpp
@@ -292,8 +292,10 @@ QString LOS::FileSystemCapacity(QString dir) { //Return: percentage capacity as
QStringList LOS::CPUTemperatures(){ //Returns: List containing the temperature of any CPU's ("50C" for example)
static QStringList vars = QStringList();
QStringList temps;
- if(vars.isEmpty()){ temps = LUtils::getCmdOutput("sysctl -i hw.").filter(".temperature:"); }
- else{ temps = LUtils::getCmdOutput("sysctl "+vars.join(" ")); vars.clear(); }
+ if(vars.isEmpty()){
+ temps = LUtils::getCmdOutput("sysctl -i dev.cpu").filter(".temperature:"); //try direct readings first
+ if(temps.isEmpty()){ temps = LUtils::getCmdOutput("sysctl -i hw.acpi").filter(".temperature:"); } // then try acpi values
+ }else{ temps = LUtils::getCmdOutput("sysctl "+vars.join(" ")); vars.clear(); }
temps.sort();
for(int i=0; i<temps.length(); i++){
diff --git a/src-qt5/core/libLumina/LuminaUtils.cpp b/src-qt5/core/libLumina/LuminaUtils.cpp
index db165cf2..9fc4e6b0 100644
--- a/src-qt5/core/libLumina/LuminaUtils.cpp
+++ b/src-qt5/core/libLumina/LuminaUtils.cpp
@@ -17,6 +17,7 @@
#include <QRegExp>
#include <QFuture>
#include <QtConcurrent>
+#include <QScreen>
#include <LuminaOS.h>
#include <LuminaThemes.h>
@@ -897,50 +898,31 @@ bool LUtils::checkUserFiles(QString lastversion){
if(newversion || newrelease){
LUtils::upgradeFavorites(oldversion);
}
- //Convert any "userbutton" and "appmenu" panel plugins to the new "systemstart" plugin (0.8.7)
- /*if(oldversion <= 8007 && (newversion || newrelease) && nversion < 8008){
- QSettings dset(QSettings::UserScope, "LuminaDE","desktopsettings");
- QStringList plugKeys = dset.allKeys().filter("panel").filter("/pluginlist");
- for(int i=0; i<plugKeys.length(); i++){
- QStringList plugs = dset.value(plugKeys[i],QStringList()).toStringList();
- //Do the appmenu/userbutton -> systemstart conversion
- plugs = plugs.join(";;;;").replace("userbutton","systemstart").replace("appmenu","systemstart").split(";;;;");
- //Remove any system dashboard plugins
- plugs.removeAll("systemdashboard");
- //Now save that back to the file
- dset.setValue(plugKeys[i], plugs);
- }
- //Also remove any "desktopview" desktop plugin and enable the automatic desktop icons instead
- plugKeys = dset.allKeys().filter("desktop-").filter("/pluginlist");
- for(int i=0; i<plugKeys.length(); i++){
- QStringList plugs = dset.value(plugKeys[i], QStringList()).toStringList();
- QStringList old = plugs.filter("desktopview");
- bool found = !old.isEmpty();
- for(int j=0; j<old.length(); j++){ plugs.removeAll(old[j]); }
- if(found){
- dset.setValue(plugKeys[i],plugs); //save the modified plugin list
- //Also set the auto-generate flag on this desktop
- dset.setValue(plugKeys[i].section("/",0,0)+"/generateDesktopIcons", true);
+ //Convert from the old desktop numbering system to the new one (change occured with 1.0.1)
+ if(oldversion<=1000001){
+ QStringList DS = LUtils::readFile(dset);
+ QList<QScreen*> screens = QApplication::screens();
+ for(int i=0; i<DS.length(); i++){
+ if(!DS[i].startsWith("[")){ continue; }
+ if(DS[i].startsWith("[desktop-")){
+ bool ok = false;
+ int num = DS[i].section("desktop-",-1).section("]",0,0).toInt(&ok);
+ if(num>=0 && ok && num< screens.length()){
+ //This one needs to be converted
+ DS[i] = "[desktop-"+screens[num]->name()+"]";
+ }
+ }else if(DS[i].startsWith("[panel")){
+ bool ok = false;
+ int num = DS[i].section("panel",-1).section(".",0,0).toInt(&ok);
+ if(num>=0 && ok && num< screens.length()){
+ //This one needs to be converted
+ QString rest = DS[i].section(".",1,-1); //everything after the desktop number in the current setting
+ DS[i] = "[panel_"+screens[num]->name()+"."+rest;
+ }
}
}
- dset.sync();
- //Due to the grid size change for desktop plugins, need to remove any old plugin geometries
- if(QFile::exists(QDir::homePath()+"/.lumina/pluginsettings/desktopsettings.conf")){
- QFile::remove(QDir::homePath()+"/.lumina/pluginsettings/desktopsettings.conf");
- }
- }*/
-
- //Convert to the XDG autostart spec as necessary (Change occured with 0.8.5)
- /*if(QFile::exists(QDir::homePath()+"/.lumina/startapps") ){
- QStringList cmds = LUtils::readFile(QDir::homePath()+"/.lumina/startapps");
- for(int i=0; i<cmds.length(); i++){
- cmds[i] = cmds[i].remove("lumina-open").simplified(); //remove the file opener
- if(cmds[i].startsWith("#") || cmds[i].isEmpty()){ continue; } //invalid line
-
- LXDG::setAutoStarted(true, cmds[i]);
- }
- QFile::remove(QDir::homePath()+"/.lumina/startapps"); //delete the old file
- }*/
+ LUtils::writeFile(dset, DS, true);
+ }
//Check the fluxbox configuration files
dset = QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/";
diff --git a/src-qt5/core/libLumina/LuminaXDG.cpp b/src-qt5/core/libLumina/LuminaXDG.cpp
index dbb70e43..8ae77ea6 100644
--- a/src-qt5/core/libLumina/LuminaXDG.cpp
+++ b/src-qt5/core/libLumina/LuminaXDG.cpp
@@ -568,6 +568,7 @@ QString LFileInfo::iconfile(){
// -- Check if this is an XDG desktop file
bool LFileInfo::isDesktopFile(){
+ if(desk==0){ return false; }
return (!desk->filePath.isEmpty());
}
diff --git a/src-qt5/core/lumina-desktop/LDesktop.cpp b/src-qt5/core/lumina-desktop/LDesktop.cpp
index 980b3e5e..8258dbb6 100644
--- a/src-qt5/core/lumina-desktop/LDesktop.cpp
+++ b/src-qt5/core/lumina-desktop/LDesktop.cpp
@@ -12,11 +12,13 @@
#include "LWinInfo.h"
#include "JsonMenu.h"
+#include <QScreen>
+
#define DEBUG 0
LDesktop::LDesktop(int deskNum, bool setdefault) : QObject(){
-
- DPREFIX = "desktop-"+QString::number(deskNum)+"/";
+ QString screenID = QApplication::screens().at(deskNum)->name();
+ DPREFIX = "desktop-"+screenID+"/";
desktopnumber = deskNum;
desktop = QApplication::desktop();
defaultdesktop = setdefault; //(desktop->screenGeometry(desktopnumber).x()==0);
diff --git a/src-qt5/core/lumina-desktop/LDesktopBackground.cpp b/src-qt5/core/lumina-desktop/LDesktopBackground.cpp
index dadbd848..3d33db71 100644
--- a/src-qt5/core/lumina-desktop/LDesktopBackground.cpp
+++ b/src-qt5/core/lumina-desktop/LDesktopBackground.cpp
@@ -38,7 +38,8 @@ void LDesktopBackground::setBackground(const QString& bgFile, const QString& for
} else {
mode = Qt::KeepAspectRatio;
}
- bgImage = bgImage.scaled(size(), mode);
+ if(bgImage.height() != this->height() && bgImage.width() != this->width() ){ bgImage = bgImage.scaled(size(), mode); }
+ //bgImage = bgImage.scaled(size(), mode);
}
// Calculate the offset
diff --git a/src-qt5/core/lumina-desktop/LDesktopPluginSpace.h b/src-qt5/core/lumina-desktop/LDesktopPluginSpace.h
index 92226680..44765029 100644
--- a/src-qt5/core/lumina-desktop/LDesktopPluginSpace.h
+++ b/src-qt5/core/lumina-desktop/LDesktopPluginSpace.h
@@ -183,6 +183,9 @@ private slots:
}
protected:
+ void paintEvent(QPaintEvent*){
+ //do nothing here - the main plugin area should *always* be invisible
+ }
//Need Drag and Drop functionality (internal movement)
void dragEnterEvent(QDragEnterEvent *ev){
if(ev->mimeData()->hasFormat(MIMETYPE) ){
diff --git a/src-qt5/core/lumina-desktop/LPanel.cpp b/src-qt5/core/lumina-desktop/LPanel.cpp
index bf063a31..b0abf498 100644
--- a/src-qt5/core/lumina-desktop/LPanel.cpp
+++ b/src-qt5/core/lumina-desktop/LPanel.cpp
@@ -6,6 +6,8 @@
//===========================================
#include "LPanel.h"
#include "LSession.h"
+#include <QScreen>
+
#include "panel-plugins/systemtray/LSysTray.h"
#define DEBUG 0
@@ -26,7 +28,8 @@ LPanel::LPanel(QSettings *file, int scr, int num, QWidget *parent) : QWidget(){
screennum = scr;
panelnum = num; //save for later
screen = LSession::desktop();
- PPREFIX = "panel"+QString::number(screennum)+"."+QString::number(num)+"/";
+ QString screenID = QApplication::screens().at(screennum)->name();
+ PPREFIX = "panel_"+screenID+"."+QString::number(num)+"/";
defaultpanel = (LSession::handle()->screenGeom(screennum).x()==0 && num==0);
horizontal=true; //use this by default initially
hidden = false; //use this by default
diff --git a/src-qt5/core/lumina-desktop/LSession.cpp b/src-qt5/core/lumina-desktop/LSession.cpp
index 434bfd2d..9a985b3f 100644
--- a/src-qt5/core/lumina-desktop/LSession.cpp
+++ b/src-qt5/core/lumina-desktop/LSession.cpp
@@ -70,11 +70,11 @@ LSession::~LSession(){
if(this->isPrimaryProcess()){
//WM->stopWM();
for(int i=0; i<DESKTOPS.length(); i++){
- delete DESKTOPS[i];
+ DESKTOPS[i]->deleteLater();
}
//delete WM;
- delete settingsmenu;
- delete appmenu;
+ settingsmenu->deleteLater();
+ appmenu->deleteLater();
delete currTranslator;
if(mediaObj!=0){delete mediaObj;}
}
@@ -207,7 +207,7 @@ void LSession::CleanupSession(){
}
evFilter->StopEventHandling();
//Stop the window manager
- qDebug() << " - Stopping the window manager";
+ //qDebug() << " - Stopping the window manager";
//WM->stopWM();
//Now close down the desktop
qDebug() << " - Closing down the desktop elements";
diff --git a/src-qt5/core/lumina-desktop/LXcbEventFilter.cpp b/src-qt5/core/lumina-desktop/LXcbEventFilter.cpp
index 3c92c050..ca7fb38d 100644
--- a/src-qt5/core/lumina-desktop/LXcbEventFilter.cpp
+++ b/src-qt5/core/lumina-desktop/LXcbEventFilter.cpp
@@ -48,7 +48,7 @@ bool XCBEventFilter::nativeEventFilter(const QByteArray &eventType, void *messag
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";
+ //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
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.cpp
index 69505705..545ba430 100644
--- a/src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.cpp
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.cpp
@@ -33,6 +33,12 @@ LDPlugin::LDPlugin(QWidget *parent, QString id) : QFrame(parent){
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();
@@ -54,4 +60,4 @@ void LDPlugin::setupMenu(){
}
//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());
-}*/ \ No newline at end of file
+}*/
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.h b/src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.h
index 27fcaa24..820880ed 100644
--- a/src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.h
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/LDPlugin.h
@@ -106,6 +106,7 @@ 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
diff --git a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp
index b74bbcb3..e9ef78cb 100644
--- a/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp
+++ b/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.cpp
@@ -19,6 +19,7 @@ AppLauncherPlugin::AppLauncherPlugin(QWidget* parent, QString ID) : LDPlugin(par
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.
QTimer::singleShot(200,this, SLOT(loadButton()) );
}
diff --git a/src-qt5/core/lumina-info/MainUI.ui b/src-qt5/core/lumina-info/MainUI.ui
index e1feab0a..ecb562b8 100644
--- a/src-qt5/core/lumina-info/MainUI.ui
+++ b/src-qt5/core/lumina-info/MainUI.ui
@@ -146,7 +146,7 @@
</sizepolicy>
</property>
<property name="whatsThis">
- <string notr="true">https://bugs.pcbsd.org/projects/pcbsd</string>
+ <string notr="true">https://github.com/trueos/lumina/issues</string>
</property>
<property name="text">
<string>Bug Reports</string>
@@ -270,7 +270,7 @@
</sizepolicy>
</property>
<property name="whatsThis">
- <string notr="true">https://webchat.freenode.net/?channels=%23lumina-desktop</string>
+ <string notr="true">https://gitter.im/trueos/lumina?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge</string>
</property>
<property name="text">
<string>Ask the Community</string>
diff --git a/src-qt5/core/lumina-info/main.cpp b/src-qt5/core/lumina-info/main.cpp
index b8eb0dce..8fe6a183 100644
--- a/src-qt5/core/lumina-info/main.cpp
+++ b/src-qt5/core/lumina-info/main.cpp
@@ -16,7 +16,7 @@ int main(int argc, char ** argv)
LSingleApplication a(argc, argv, "lumina-info"); //loads translations inside constructor
if( !a.isPrimaryProcess()){ return 0; }
//qDebug() << "Set Application Name";
- a.setApplicationName("About Lumina-DE");
+ a.setApplicationName("About Lumina");
//qDebug() << "Load Theme Engine";
LuminaThemeEngine themes(&a);
//qDebug() << "Start the UI";
diff --git a/src-qt5/core/lumina-session/main.cpp b/src-qt5/core/lumina-session/main.cpp
index 464302a7..77e553d4 100644
--- a/src-qt5/core/lumina-session/main.cpp
+++ b/src-qt5/core/lumina-session/main.cpp
@@ -33,8 +33,10 @@ int main(int argc, char ** argv)
QString disp = QString(getenv("DISPLAY")).simplified();
if(disp.isEmpty()){
//No X session found. Go ahead and re-init this binary within an xinit call
- QStringList args; args << QCoreApplication::applicationFilePath();
- if(LUtils::isValidBinary("x11vnc")){ args << "--" << "-listen" << "tcp"; } //need to be able to VNC into this session
+ QString prog = QString(argv[0]).section("/",-1);
+ LUtils::isValidBinary(prog); //will adjust the path to be absolute
+ QStringList args; args << prog;
+ //if(LUtils::isValidBinary("x11vnc")){ args << "--" << "-listen" << "tcp"; } //need to be able to VNC into this session
return QProcess::execute("xinit", args);
}
//Setup any initialization values
diff --git a/src-qt5/core/lumina-session/session.cpp b/src-qt5/core/lumina-session/session.cpp
index 937f05d0..2647e58d 100644
--- a/src-qt5/core/lumina-session/session.cpp
+++ b/src-qt5/core/lumina-session/session.cpp
@@ -11,6 +11,8 @@
#include <QProcessEnvironment>
#include <QDebug>
#include <QSettings>
+#include <QDir>
+
#include <LuminaUtils.h>
#include <LuminaOS.h>
@@ -34,7 +36,8 @@ void LSession::procFinished(){
stopped++;
if(!stopping){
//See if this process is the main desktop binary
- if(PROCS[i]->program().section("/",-1) == "lumina-desktop"){ stopall(); } //start closing down everything
+ if(PROCS[i]->objectName()=="runtime"){ stopall(); }
+ //if(PROCS[i]->program().section("/",-1) == "lumina-desktop"){ stopall(); } //start closing down everything
//else{ PROCS[i]->start(QIODevice::ReadOnly); } //restart the process
break;
}
@@ -56,6 +59,14 @@ void LSession::startProcess(QString ID, QString command, QStringList watchfiles)
proc->setProcessChannelMode(QProcess::MergedChannels);
proc->setProcessEnvironment( QProcessEnvironment::systemEnvironment() );
proc->setStandardOutputFile(logfile);
+ proc->setObjectName(ID);
+ if(ID=="runtime"){
+ //Bypass for a hidden dbus requirement for Qt itself (Qt 5.5.1)
+ QDir tmp = QDir::temp();
+ if( tmp.entryList(QStringList() << "dbus-*").isEmpty() && LUtils::isValidBinary("dbus-launch")){
+ command.prepend("dbus-launch --exit-with-session ");
+ }
+ }
proc->start(command, QIODevice::ReadOnly);
connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(procFinished()) );
PROCS << proc;
diff --git a/src-qt5/desktop-utils/lumina-calculator/lumina-calculator.pro b/src-qt5/desktop-utils/lumina-calculator/lumina-calculator.pro
new file mode 100644
index 00000000..8c36c516
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-calculator/lumina-calculator.pro
@@ -0,0 +1,92 @@
+include("$${PWD}/../../OS-detect.pri")
+
+QT += core gui widgets
+
+TARGET = lumina-calculator
+target.path = $${L_BINDIR}
+
+HEADERS += mainUI.h
+
+SOURCES += main.cpp \
+ mainUI.cpp
+
+FORMS += mainUI.ui
+
+LIBS += -lLuminaUtils
+
+DEPENDPATH += ../../libLumina
+
+TRANSLATIONS = i18n/l-calc_af.ts \
+ i18n/l-calc_ar.ts \
+ i18n/l-calc_az.ts \
+ i18n/l-calc_bg.ts \
+ i18n/l-calc_bn.ts \
+ i18n/l-calc_bs.ts \
+ i18n/l-calc_ca.ts \
+ i18n/l-calc_cs.ts \
+ i18n/l-calc_cy.ts \
+ i18n/l-calc_da.ts \
+ i18n/l-calc_de.ts \
+ i18n/l-calc_el.ts \
+ i18n/l-calc_en_GB.ts \
+ i18n/l-calc_en_ZA.ts \
+ i18n/l-calc_es.ts \
+ i18n/l-calc_et.ts \
+ i18n/l-calc_eu.ts \
+ i18n/l-calc_fa.ts \
+ i18n/l-calc_fi.ts \
+ i18n/l-calc_fr.ts \
+ i18n/l-calc_fr_CA.ts \
+ i18n/l-calc_gl.ts \
+ i18n/l-calc_he.ts \
+ i18n/l-calc_hi.ts \
+ i18n/l-calc_hr.ts \
+ i18n/l-calc_hu.ts \
+ i18n/l-calc_id.ts \
+ i18n/l-calc_is.ts \
+ i18n/l-calc_it.ts \
+ i18n/l-calc_ja.ts \
+ i18n/l-calc_ka.ts \
+ i18n/l-calc_ko.ts \
+ i18n/l-calc_lt.ts \
+ i18n/l-calc_lv.ts \
+ i18n/l-calc_mk.ts \
+ i18n/l-calc_mn.ts \
+ i18n/l-calc_ms.ts \
+ i18n/l-calc_mt.ts \
+ i18n/l-calc_nb.ts \
+ i18n/l-calc_nl.ts \
+ i18n/l-calc_pa.ts \
+ i18n/l-calc_pl.ts \
+ i18n/l-calc_pt.ts \
+ i18n/l-calc_pt_BR.ts \
+ i18n/l-calc_ro.ts \
+ i18n/l-calc_ru.ts \
+ i18n/l-calc_sk.ts \
+ i18n/l-calc_sl.ts \
+ i18n/l-calc_sr.ts \
+ i18n/l-calc_sv.ts \
+ i18n/l-calc_sw.ts \
+ i18n/l-calc_ta.ts \
+ i18n/l-calc_tg.ts \
+ i18n/l-calc_th.ts \
+ i18n/l-calc_tr.ts \
+ i18n/l-calc_uk.ts \
+ i18n/l-calc_uz.ts \
+ i18n/l-calc_vi.ts \
+ i18n/l-calc_zh_CN.ts \
+ i18n/l-calc_zh_HK.ts \
+ i18n/l-calc_zh_TW.ts \
+ i18n/l-calc_zu.ts
+
+dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/
+dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/
+
+#desktop.files=lumina-calculator.desktop
+#desktop.path=$${L_SHAREDIR}/applications/
+
+INSTALLS += target
+
+WITH_I18N{
+ INSTALLS += dotrans
+}
diff --git a/src-qt5/desktop-utils/lumina-calculator/main.cpp b/src-qt5/desktop-utils/lumina-calculator/main.cpp
new file mode 100644
index 00000000..af252cb3
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-calculator/main.cpp
@@ -0,0 +1,19 @@
+//===========================================
+// Lumina Desktop source code
+// Copyright (c) 2016, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include <QApplication>
+#include <QDebug>
+
+#include "mainUI.h"
+
+int main(int argc, char *argv[]) {
+ QApplication a(argc, argv);
+
+ //Now start the window
+ mainUI W;
+ W.show();
+ return a.exec();
+}
diff --git a/src-qt5/desktop-utils/lumina-calculator/mainUI.cpp b/src-qt5/desktop-utils/lumina-calculator/mainUI.cpp
new file mode 100644
index 00000000..244a7f3e
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-calculator/mainUI.cpp
@@ -0,0 +1,133 @@
+//===========================================
+// Lumina Desktop source code
+// Copyright (c) 2016, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "mainUI.h"
+#include "ui_mainUI.h"
+
+#include <QDebug>
+#include <LuminaXDG.h>
+
+#define VALIDSYMBOLS QString("+-*x/.")
+
+#include <math.h>
+#define BADVALUE NAN
+
+mainUI::mainUI() : QMainWindow(), ui(new Ui::mainUI()){
+ ui->setupUi(this);
+ connect(ui->tool_clear, SIGNAL(clicked()), this, SLOT(clear_calc()) );
+ connect(ui->line_eq, SIGNAL(returnPressed()), this, SLOT(start_calc()) );
+ connect(ui->button_1, SIGNAL (clicked()), this, SLOT (captureButton1()));
+ connect(ui->button_2, SIGNAL (clicked()), this, SLOT (captureButton2()));
+ connect(ui->button_3, SIGNAL (clicked()), this, SLOT (captureButton3()));
+ connect(ui->button_4, SIGNAL (clicked()), this, SLOT (captureButton4()));
+ connect(ui->button_5, SIGNAL (clicked()), this, SLOT (captureButton5()));
+ connect(ui->button_6, SIGNAL (clicked()), this, SLOT (captureButton6()));
+ connect(ui->button_7, SIGNAL (clicked()), this, SLOT (captureButton7()));
+ connect(ui->button_8, SIGNAL (clicked()), this, SLOT (captureButton8()));
+ connect(ui->button_9, SIGNAL (clicked()), this, SLOT (captureButton9()));
+ connect(ui->button_0, SIGNAL (clicked()), this, SLOT (captureButton0()));
+ connect(ui->button_Subtract, SIGNAL (clicked()), this, SLOT (captureButtonSubtract()));
+ connect(ui->button_Add, SIGNAL (clicked()), this, SLOT (captureButtonAdd()));
+ connect(ui->button_Divide, SIGNAL (clicked()), this, SLOT (captureButtonDivide()));
+ connect(ui->button_Multiply, SIGNAL (clicked()), this, SLOT (captureButtonMultiply()));
+ connect(ui->button_Decimal, SIGNAL (clicked()), this, SLOT (captureButtonDecimal()));
+ connect(ui->button_Equal, SIGNAL (clicked()), this, SLOT (start_calc()));
+
+ this->setWindowTitle(tr("Calculator"));
+ this->setWindowIcon( LXDG::findIcon("accessories-calculator","") );
+ ui->line_eq->setFocus();
+}
+
+mainUI::~mainUI(){
+}
+
+void mainUI::start_calc(){
+ if(ui->line_eq->text().isEmpty()){ return; } //nothing to do
+ double result = strToNumber(ui->line_eq->text());
+ if(result!=result){ return; } //bad calculation - NaN's values are special in that they don't equal itself
+ QString res = "%1 \t(%2)";
+ ui->list_results->addItem(res.arg(QString::number(result), ui->line_eq->text()));
+ ui->list_results->scrollToItem( ui->list_results->item( ui->list_results->count()-1) );
+ ui->line_eq->clear();
+}
+
+void mainUI::clear_calc(){
+ ui->line_eq->clear();
+ ui->line_eq->setFocus();
+}
+
+void mainUI::captureButton1(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_1->text()); }
+void mainUI::captureButton2(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_2->text()); }
+void mainUI::captureButton3(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_3->text()); }
+void mainUI::captureButton4(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_4->text()); }
+void mainUI::captureButton5(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_5->text()); }
+void mainUI::captureButton6(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_6->text()); }
+void mainUI::captureButton7(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_7->text()); }
+void mainUI::captureButton8(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_8->text()); }
+void mainUI::captureButton9(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_9->text()); }
+void mainUI::captureButton0(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_0->text()); }
+void mainUI::captureButtonSubtract(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_Subtract->text()); }
+void mainUI::captureButtonAdd(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_Add->text()); }
+void mainUI::captureButtonDivide(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_Divide->text()); }
+void mainUI::captureButtonMultiply(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_Multiply->text()); }
+//void mainUI::captureButtonEqual(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_Equal->text()); }
+void mainUI::captureButtonDecimal(){ ui->line_eq->setText(ui->line_eq->text() += ui->button_Decimal->text()); }
+
+double mainUI::performOperation(double LHS, double RHS, QChar symbol){
+ if(symbol== '+'){ return (LHS+RHS); }
+ else if(symbol== '-'){ return (LHS-RHS); }
+ else if(symbol== '*' || symbol=='x'){ return (LHS*RHS); }
+ else if(symbol== '/'){ return (LHS/RHS); }
+ //else if(symbol== '%'){ return (LHS%RHS); }
+ qDebug() << "Invalid Symbol:" << symbol;
+ return BADVALUE;
+}
+
+double mainUI::strToNumber(QString str){
+ //Look for perentheses first
+ //qDebug() << "String to Number: " << str;
+ if(str.indexOf("(")>=0){
+ //qDebug() << "Found Parenthesis";
+ int start = str.indexOf("(");
+ int need = 1;
+ int end = -1;
+ for(int i=start+1; i<str.length() && need>0; i++){
+ if(str[i]=='('){ need++; }
+ else if(str[i]==')'){ need--; }
+ //qDebug() << "Check char:" << str[i] << need;
+ if(need==0){ end = i; }
+ }
+ if(end<start){ return BADVALUE; }
+ //qDebug() << "Replace value:" << str << start << end << str.mid(start+1,end-start);
+ str.replace(start, end-start+1, QString::number( strToNumber( str.mid(start+1, end-start-1)) ) );
+ //qDebug() << "Replaced:" << str;
+ }
+ // -------------------------------------
+ // NOTE: the order of operations appears reversed here due to the recursive nature of the algorithm
+ // the first operation *found* is actually the last one *evaluated*
+ // --------------------------------------
+ //Now look for add/subtract
+ int sym = -1;
+ QStringList symbols; symbols << "+" << "-";
+ for(int i=0; i<symbols.length(); i++){
+ int tmp = str.indexOf(symbols[i]);
+ if(sym < tmp){ sym = tmp; }
+ }
+ if(sym>0){ return performOperation( strToNumber(str.left(sym)), strToNumber(str.right(str.length()-sym-1)), str[sym]); }
+ if(sym==0){ return BADVALUE; }
+ //Now look for multiply/divide
+ symbols.clear(); symbols << "x" << "*" << "/";
+ for(int i=0; i<symbols.length(); i++){
+ int tmp = str.indexOf(symbols[i]);
+ if(sym < tmp){ sym = tmp; }
+ }
+ if(sym>0){ return performOperation( strToNumber(str.left(sym)), strToNumber(str.right(str.length()-sym-1)), str[sym]); }
+ if(sym==0){ return BADVALUE; }
+
+ //Could not find any operations - must be a raw number
+ //qDebug() << "Found Number:" << str.toDouble();
+ return str.toDouble();
+}
diff --git a/src-qt5/desktop-utils/lumina-calculator/mainUI.h b/src-qt5/desktop-utils/lumina-calculator/mainUI.h
new file mode 100644
index 00000000..0d99c83a
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-calculator/mainUI.h
@@ -0,0 +1,50 @@
+//===========================================
+// Lumina Desktop source code
+// Copyright (c) 2016, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_CALCULATOR_MAIN_UI_H
+#define _LUMINA_CALCULATOR_MAIN_UI_H
+
+#include <QMainWindow>
+#include <QString>
+#include <QChar>
+
+namespace Ui{
+ class mainUI;
+};
+
+class mainUI : public QMainWindow{
+ Q_OBJECT
+public:
+ mainUI();
+ ~mainUI();
+
+private slots:
+ void start_calc();
+ void clear_calc();
+ void captureButton1();
+ void captureButton2();
+ void captureButton3();
+ void captureButton4();
+ void captureButton5();
+ void captureButton6();
+ void captureButton7();
+ void captureButton8();
+ void captureButton9();
+ void captureButton0();
+ void captureButtonSubtract();
+ void captureButtonAdd();
+ void captureButtonDivide();
+ void captureButtonMultiply();
+// void captureButtonEqual();
+ void captureButtonDecimal();
+
+
+private:
+ Ui::mainUI *ui;
+ double performOperation(double LHS, double RHS, QChar symbol);
+ double strToNumber(QString str); //this is highly-recursive
+};
+#endif
diff --git a/src-qt5/desktop-utils/lumina-calculator/mainUI.ui b/src-qt5/desktop-utils/lumina-calculator/mainUI.ui
new file mode 100644
index 00000000..2ca316ed
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-calculator/mainUI.ui
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>mainUI</class>
+ <widget class="QMainWindow" name="mainUI">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>255</width>
+ <height>376</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Calculator</string>
+ </property>
+ <widget class="QWidget" name="centralwidget">
+ <widget class="QSplitter" name="splitter">
+ <property name="geometry">
+ <rect>
+ <x>9</x>
+ <y>9</y>
+ <width>241</width>
+ <height>361</height>
+ </rect>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <widget class="QWidget" name="">
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QListWidget" name="list_results"/>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLineEdit" name="line_eq"/>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_clear">
+ <property name="text">
+ <string>C</string>
+ </property>
+ <property name="autoRaise">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="">
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QPushButton" name="button_7">
+ <property name="text">
+ <string>7</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QPushButton" name="button_8">
+ <property name="text">
+ <string>8</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QPushButton" name="button_9">
+ <property name="text">
+ <string>9</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QPushButton" name="button_Divide">
+ <property name="text">
+ <string>/</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QPushButton" name="button_4">
+ <property name="text">
+ <string>4</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QPushButton" name="button_5">
+ <property name="text">
+ <string>5</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QPushButton" name="button_6">
+ <property name="text">
+ <string>6</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QPushButton" name="button_Multiply">
+ <property name="text">
+ <string>*</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QPushButton" name="button_1">
+ <property name="text">
+ <string>1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QPushButton" name="button_2">
+ <property name="text">
+ <string>2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QPushButton" name="button_3">
+ <property name="text">
+ <string>3</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="QPushButton" name="button_Subtract">
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QPushButton" name="button_0">
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QPushButton" name="button_Decimal">
+ <property name="text">
+ <string>.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QPushButton" name="button_Equal">
+ <property name="text">
+ <string>=</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3">
+ <widget class="QPushButton" name="button_Add">
+ <property name="text">
+ <string>+</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ <zorder>list_results</zorder>
+ <zorder>button_7</zorder>
+ <zorder>button_8</zorder>
+ <zorder>button_9</zorder>
+ <zorder>button_Divide</zorder>
+ <zorder>button_4</zorder>
+ <zorder>button_5</zorder>
+ <zorder>button_6</zorder>
+ <zorder>button_Multiply</zorder>
+ <zorder>button_1</zorder>
+ <zorder>button_2</zorder>
+ <zorder>button_3</zorder>
+ <zorder>button_Subtract</zorder>
+ <zorder>button_0</zorder>
+ <zorder>button_Decimal</zorder>
+ <zorder>button_Equal</zorder>
+ <zorder>button_Add</zorder>
+ <zorder>line_eq</zorder>
+ </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/desktop-utils/lumina-fileinfo/MainUI.cpp b/src-qt5/desktop-utils/lumina-fileinfo/MainUI.cpp
index dfa1ec36..8a16f03f 100644
--- a/src-qt5/desktop-utils/lumina-fileinfo/MainUI.cpp
+++ b/src-qt5/desktop-utils/lumina-fileinfo/MainUI.cpp
@@ -41,8 +41,8 @@ void MainUI::LoadFile(QString path, QString type){
if(INFO->exists()){ canwrite = INFO->isWritable(); }
else if(!INFO->filePath().isEmpty()){
//See if the containing directory can be written
- QFileInfo chk(INFO->absolutePath());
- canwrite = (chk.isDir() && chk.isWritable());
+ //QFileInfo chk(INFO->absolutePath());
+ canwrite = (INFO->isDir() && INFO->isWritable());
}else{
canwrite = true; //no associated file yet
}
@@ -82,21 +82,29 @@ void MainUI::LoadFile(QString path, QString type){
ui->label_file_type->setText(ftype);
//Now load the icon for the file
if(INFO->isImage()){
- ui->label_file_icon->setPixmap( QPixmap(INFO->absoluteFilePath()).scaledToHeight(64) );
+ //qDebug() << "Set Image:";
+ QPixmap pix(INFO->absoluteFilePath());
+ ui->label_file_icon->setPixmap( pix.scaledToHeight(64) );
+ ui->label_file_size->setText( ui->label_file_size->text()+" ("+QString::number(pix.width())+" x "+QString::number(pix.height())+" px)" );
+ //qDebug() << " - done with image";
}else{
ui->label_file_icon->setPixmap( LXDG::findIcon( INFO->iconfile(), "unknown").pixmap(QSize(64,64)) );
}
//Now verify the tab is available in the widget
+ //qDebug() << "Check tab widget";
if(ui->tabWidget->indexOf(ui->tab_file)<0){
+ //qDebug() << "Add File Info Tab";
ui->tabWidget->addTab(ui->tab_file, tr("File Information"));
}
+ //qDebug() << "Done with Tab Check";
}else{
if(ui->tabWidget->indexOf(ui->tab_file)>=0){
ui->tabWidget->removeTab( ui->tabWidget->indexOf(ui->tab_file) );
}
}
//Now load the special XDG desktop info
- qDebug() << INFO->isDesktopFile() << type;
+ qDebug() << "Check XDG Info:" << type;
+ //qDebug() << INFO->isDesktopFile() << type;
if(INFO->isDesktopFile() || !type.isEmpty()){
if(INFO->XDG()->type == XDGDesktop::APP){
@@ -142,6 +150,7 @@ void MainUI::LoadFile(QString path, QString type){
//Setup the tab
if(type.isEmpty()){ ui->tabWidget->setCurrentIndex(0); }
else if(ui->tabWidget->count()>1){ ui->tabWidget->setCurrentIndex(1); }
+ qDebug() << "Done Loading File";
}
void MainUI::UpdateIcons(){
diff --git a/src-qt5/desktop-utils/lumina-fm/Browser.cpp b/src-qt5/desktop-utils/lumina-fm/Browser.cpp
index 7455e5ea..72920757 100644
--- a/src-qt5/desktop-utils/lumina-fm/Browser.cpp
+++ b/src-qt5/desktop-utils/lumina-fm/Browser.cpp
@@ -67,12 +67,14 @@ void Browser::loadItem(QString info){
// PRIVATE SLOTS
void Browser::fileChanged(QString file){
- if(file.startsWith(currentDir+"/")){ QtConcurrent::run(this, &Browser::loadItem, file ); }
- else if(file==currentDir){ QTimer::singleShot(0, this, SLOT(loadDirectory()) ); }
+ if(file.startsWith(currentDir+"/") ){
+ if(QFile::exists(file) ){ QtConcurrent::run(this, &Browser::loadItem, file ); } //file modified but not removed
+ else{ QTimer::singleShot(0, this, SLOT(loadDirectory()) ); } //file removed - need to update entire dir
+ }else if(file==currentDir){ QTimer::singleShot(0, this, SLOT(loadDirectory()) ); }
}
void Browser::dirChanged(QString dir){
- if(dir==currentDir){ QTimer::singleShot(0, this, SLOT(loadDirectory()) ); }
+ if(dir==currentDir){ QTimer::singleShot(500, this, SLOT(loadDirectory()) ); }
else if(dir.startsWith(currentDir)){ QtConcurrent::run(this, &Browser::loadItem, dir ); }
}
diff --git a/src-qt5/desktop-utils/lumina-fm/BrowserWidget.cpp b/src-qt5/desktop-utils/lumina-fm/BrowserWidget.cpp
index e007b974..1112f971 100644
--- a/src-qt5/desktop-utils/lumina-fm/BrowserWidget.cpp
+++ b/src-qt5/desktop-utils/lumina-fm/BrowserWidget.cpp
@@ -136,9 +136,9 @@ QStringList BrowserWidget::history(){
}
void BrowserWidget::setShowActive(bool show){
- if(!show){ this->setStyleSheet("QAbstractScrollArea{ background-color: rgba(10,10,10,10); }"); }
+ if(!show){ this->setStyleSheet("QAbstractScrollArea{ background-color: rgba(10,10,10,10); } QHeaderView{ background-color: lightgrey; }"); }
else{
- this->setStyleSheet( "QAbstractScrollArea{ background-color: white; }");
+ this->setStyleSheet( "");
}
}
diff --git a/src-qt5/desktop-utils/lumina-fm/FODialog.cpp b/src-qt5/desktop-utils/lumina-fm/FODialog.cpp
index b03f1b56..ee22f832 100644
--- a/src-qt5/desktop-utils/lumina-fm/FODialog.cpp
+++ b/src-qt5/desktop-utils/lumina-fm/FODialog.cpp
@@ -295,17 +295,17 @@ void FOWorker::slotStartOperations(){
if(isRM){ //only old files
olist << subfiles(ofiles[i], false); //dirs need to be last for removals
}else if(isCP || isRESTORE){
- if(nfiles[i] == ofiles[i] && overwrite==1){
- //Trying to copy a file/dir to itself - skip it
- continue;
- }
if(QFile::exists(nfiles[i])){
if(overwrite!=1){
qDebug() << " - Get New Filename:" << nfiles[i];
nfiles[i] = newFileName(nfiles[i]); //prompt for new file name up front before anything starts
- qDebug() << " -- nfiles[i]";
+ qDebug() << " -- " << nfiles[i];
}
}
+ if(nfiles[i] == ofiles[i] && overwrite==1){
+ //Trying to copy a file/dir to itself - skip it
+ continue;
+ }
QStringList subs = subfiles(ofiles[i], true); //dirs need to be first for additions
for(int s=0; s<subs.length(); s++){
olist << subs[s];
diff --git a/src-qt5/desktop-utils/lumina-fm/FODialog.h b/src-qt5/desktop-utils/lumina-fm/FODialog.h
index ef3ff57d..a595b9f2 100644
--- a/src-qt5/desktop-utils/lumina-fm/FODialog.h
+++ b/src-qt5/desktop-utils/lumina-fm/FODialog.h
@@ -23,10 +23,6 @@
#include <LuminaXDG.h>
#include <LuminaUtils.h>
-namespace Ui{
- class FODialog;
-};
-
class FOWorker : public QObject{
Q_OBJECT
public:
@@ -57,6 +53,10 @@ signals:
void finished(QStringList); //errors returned
};
+namespace Ui{
+ class FODialog;
+};
+
class FODialog : public QDialog{
Q_OBJECT
public:
diff --git a/src-qt5/desktop-utils/lumina-fm/MainUI.cpp b/src-qt5/desktop-utils/lumina-fm/MainUI.cpp
index bac365e1..02533271 100644
--- a/src-qt5/desktop-utils/lumina-fm/MainUI.cpp
+++ b/src-qt5/desktop-utils/lumina-fm/MainUI.cpp
@@ -105,6 +105,7 @@ QSize orig = settings->value("preferences/MainWindowSize", QSize()).toSize();
if(DEBUG){ qDebug() << " - Devices"; }
RebuildDeviceMenu();
//Make sure we start on the browser page
+ TRAY = new TrayUI(this);
if(DEBUG){ qDebug() << " - Done with init"; }
}
@@ -802,28 +803,30 @@ void MainUI::PasteFiles(QString dir, QStringList raw){
newcopy<< dir+raw[i].section("::::",1,50).section("/",-1);
}
}
- bool errs = false;
+ //bool errs = false;
//Perform the copy/move operations
- worker->pauseData = true; //pause any info requests
+ //worker->pauseData = true; //pause any info requests
if(!copy.isEmpty()){
qDebug() << "Paste Copy:" << copy << "->" << newcopy;
- FODialog dlg(this);
+ TRAY->StartOperation( TrayUI::COPY, copy, newcopy);
+ /*FODialog dlg(this);
if( !dlg.CopyFiles(copy, newcopy) ){ return; } //cancelled
dlg.show();
dlg.exec();
- errs = errs || !dlg.noerrors;
+ errs = errs || !dlg.noerrors;*/
}
if(!cut.isEmpty()){
qDebug() << "Paste Cut:" << cut << "->" << newcut;
- FODialog dlg(this);
+ TRAY->StartOperation(TrayUI::MOVE, cut, newcut);
+ /*FODialog dlg(this);
if(!dlg.MoveFiles(cut, newcut) ){ return; } //cancelled
dlg.show();
dlg.exec();
- errs = errs || !dlg.noerrors;
+ errs = errs || !dlg.noerrors;*/
}
- worker->pauseData = false; //resume info requests
+ //worker->pauseData = false; //resume info requests
//Modify the clipboard appropriately
- if(!errs && !cut.isEmpty()){
+ if(!cut.isEmpty()){
//Now clear the clipboard since those old file locations are now invalid
QApplication::clipboard()->clear();
if(!copy.isEmpty()){
@@ -876,11 +879,12 @@ void MainUI::RenameFiles(QStringList list){
//Now perform the move
//Don't pause the background worker for a simple rename - this operation is extremely fast
qDebug() << "Rename:" << path+fname << "->" << path+nname;
- FODialog dlg(this);
+ TRAY->StartOperation(TrayUI::MOVE, QStringList() << path+fname, QStringList() << path+nname);
+ /*FODialog dlg(this);
dlg.setOverwrite(overwrite);
dlg.MoveFiles(QStringList() << path+fname, QStringList() << path+nname);
dlg.show();
- dlg.exec();
+ dlg.exec();*/
} //end loop over list of files
}
@@ -901,11 +905,12 @@ void MainUI::RemoveFiles(QStringList list){
//Now remove the file/dir
qDebug() << " - Delete: "<<paths;
+ TRAY->StartOperation(TrayUI::DELETE, paths, QStringList());
//worker->pauseData = true; //pause any info requests
- FODialog dlg(this);
+ /*FODialog dlg(this);
dlg.RemoveFiles(paths);
dlg.show();
- dlg.exec();
+ dlg.exec();*/
//worker->pauseData = false; //resume info requests
//for(int i=0; i<DWLIST.length(); i++){ DWLIST[i]->refresh(); }
}
diff --git a/src-qt5/desktop-utils/lumina-fm/MainUI.h b/src-qt5/desktop-utils/lumina-fm/MainUI.h
index 94c6f6c2..0ed9c44b 100644
--- a/src-qt5/desktop-utils/lumina-fm/MainUI.h
+++ b/src-qt5/desktop-utils/lumina-fm/MainUI.h
@@ -49,7 +49,8 @@
#include <LuminaOS.h>
// Local includes
-#include "FODialog.h" //file operation dialog
+//#include "FODialog.h" //file operation dialog
+#include "TrayUI.h"
#include "BMMDialog.h" //bookmark manager dialog
#include "DirData.h"
@@ -86,7 +87,8 @@ private:
QList<DirWidget*> DWLIST;
MultimediaWidget *MW;
SlideshowWidget *SW;
-
+ TrayUI *TRAY;
+
QSettings *settings;
QShortcut *nextTabLShort, *nextTabRShort, *togglehiddenfilesShort, *focusDirWidgetShort;
//QCompleter *dirCompleter;
diff --git a/src-qt5/desktop-utils/lumina-fm/OPWidget.cpp b/src-qt5/desktop-utils/lumina-fm/OPWidget.cpp
new file mode 100644
index 00000000..3e842b90
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-fm/OPWidget.cpp
@@ -0,0 +1,108 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2016, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "OPWidget.h"
+#include "ui_OPWidget.h"
+
+OPWidget::OPWidget(QWidget *parent) : QWidget(parent), ui(new Ui::OPWidget()){
+ starttime = endtime = -1;
+ WA = new QWidgetAction(0);
+ WA->setDefaultWidget(this);
+ worker = 0;
+ workthread = 0;
+ //Now create the widget
+ ui->setupUi(this);
+ ui->tool_close->setIcon( LXDG::findIcon("dialog-close","view-close") );
+ ui->tool_showerrors->setIcon(LXDG::findIcon("view-search",""));
+ //connect the widget buttons
+ connect(ui->tool_close, SIGNAL(clicked()), this, SLOT(closeWidget()) );
+ connect(ui->tool_showerrors, SIGNAL(clicked()), this, SLOT(showErrors()) );
+}
+
+OPWidget::~OPWidget(){
+ if(worker!=0){ worker->stopped = true; worker->deleteLater(); }
+ if(workthread!=0){ workthread->quit(); workthread->wait(); delete workthread; }
+ WA->deleteLater();
+}
+
+QWidgetAction* OPWidget::widgetAction(){
+ return WA;
+}
+
+void OPWidget::setupOperation(QString optype, QStringList oldF, QStringList newF){
+ if(workthread==0){ workthread = new QThread(); }
+ if(worker==0){
+ worker = new FOWorker();
+ connect(worker, SIGNAL(startingItem(int,int,QString,QString)), this, SLOT(opUpdate(int,int,QString,QString)) );
+ connect(worker, SIGNAL(finished(QStringList)), this, SLOT(opFinished(QStringList)) );
+ worker->moveToThread(workthread);
+ }
+ workthread->start();
+ //Now setup the worker with the desired operation
+ optype = optype.toLower();
+ worker->ofiles = oldF;
+ worker->nfiles = newF;
+ if(optype=="move"){ worker->isMV = true; tract = tr("Move"); }
+ else if(optype=="copy"){ worker->isCP = true; tract = tr("Copy"); }
+ else if(optype=="delete"){ worker->isRM = true; tract = tr("Remove"); }
+
+}
+
+
+bool OPWidget::isDone(){
+ return (endtime>0);
+}
+
+bool OPWidget::hasErrors(){
+ return !Errors.isEmpty();
+}
+
+float OPWidget::duration(){
+ return ( (endtime-starttime)/1000.0); //convert from ms to s
+}
+
+
+QString OPWidget::finalStat(){
+ return ui->label->text();
+}
+
+
+//PUBLIC SLOTS
+void OPWidget::startOperation(){
+ starttime = QDateTime::currentMSecsSinceEpoch();
+ endtime = -1;
+ QTimer::singleShot(0, worker, SLOT(slotStartOperations()) );
+ emit starting(this->whatsThis());
+}
+
+
+// PRIVATE SLOTS
+void OPWidget::closeWidget(){
+ if(!isDone()){ worker->stopped = true; }
+ else{ emit closed(this->whatsThis()); }
+}
+
+void OPWidget::showErrors(){
+ qDebug() << "Errors:" << Errors;
+ //TODO
+}
+
+void OPWidget::opFinished(QStringList errors){
+ Errors = errors;
+ endtime = QDateTime::currentMSecsSinceEpoch();
+ emit finished(this->whatsThis());
+ ui->progressBar->setValue(ui->progressBar->maximum()); //last item finished
+ ui->tool_showerrors->setVisible(!Errors.isEmpty());
+ ui->label->setText( QString(tr("%1 Finished")).arg(tract) + (errors.isEmpty() ? "" : (" ("+tr("Errors Occured")+")") ) );
+}
+
+void OPWidget::opUpdate(int cur, int tot, QString ofile, QString nfile){ //current, total, old file, new file
+ ui->progressBar->setRange(0,tot);
+ ui->progressBar->setValue(cur);
+ QString txt = tract +": "+ofile.section("/",-1);
+ if(!nfile.isEmpty()){txt.append(" -> "+nfile.section("/",-1) ); }
+ ui->label->setText( txt);
+}
diff --git a/src-qt5/desktop-utils/lumina-fm/OPWidget.h b/src-qt5/desktop-utils/lumina-fm/OPWidget.h
new file mode 100644
index 00000000..600df4b7
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-fm/OPWidget.h
@@ -0,0 +1,59 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2016, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This is the system tray icon for queueing/running file operations
+//===========================================
+#ifndef _LUMINA_FILE_MANAGER_FILE_OP_OPWIDGET_H
+#define _LUMINA_FILE_MANAGER_FILE_OP_OPWIDGET_H
+
+#include "FODialog.h"
+namespace Ui{
+ class OPWidget;
+};
+
+class OPWidget : public QWidget{
+ Q_OBJECT
+public:
+ OPWidget(QWidget *parent = 0);
+ ~OPWidget();
+
+ QWidgetAction* widgetAction(); //for loading the widget into a menu
+
+ void setupOperation(QString optype, QStringList oldF, QStringList newF);
+
+ bool isDone();
+
+ //Status reporting after worker finishes
+ bool hasErrors();
+ float duration(); //in seconds
+ QString finalStat(); //Final status message
+
+public slots:
+ void startOperation();
+
+private:
+ Ui::OPWidget *ui;
+ //Main Objects
+ QWidgetAction *WA;
+ FOWorker *worker;
+ QThread *workthread;
+ //Bookkeeping items for statistics and such
+ qint64 starttime, endtime; //in ms
+ QStringList Errors;
+ QString tract; //translated action
+
+private slots:
+ void closeWidget();
+ void showErrors();
+ void opFinished(QStringList); //errors
+ void opUpdate(int, int, QString, QString); //current, total, old file, new file
+
+signals:
+ void starting(QString);
+ void finished(QString);
+ void closed(QString);
+};
+#endif
diff --git a/src-qt5/desktop-utils/lumina-fm/OPWidget.ui b/src-qt5/desktop-utils/lumina-fm/OPWidget.ui
new file mode 100644
index 00000000..3daafaf2
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-fm/OPWidget.ui
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>OPWidget</class>
+ <widget class="QWidget" name="OPWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>202</width>
+ <height>67</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <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 row="1" column="0">
+ <widget class="QProgressBar" name="progressBar">
+ <property name="maximum">
+ <number>0</number>
+ </property>
+ <property name="value">
+ <number>-1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QToolButton" name="tool_showerrors">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_close">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0" colspan="2">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Evaluating...</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/desktop-utils/lumina-fm/TrayUI.cpp b/src-qt5/desktop-utils/lumina-fm/TrayUI.cpp
new file mode 100644
index 00000000..8e796c68
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-fm/TrayUI.cpp
@@ -0,0 +1,86 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2016, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "TrayUI.h"
+
+#include <LuminaXDG.h>
+#include<QUuid>
+
+TrayUI::TrayUI(QObject *parent) : QSystemTrayIcon(parent){
+ this->setContextMenu( new QMenu() );
+ this->setIcon(LXDG::findIcon("Insight-FileManager",""));
+}
+
+TrayUI::~TrayUI(){
+ this->contextMenu()->deleteLater();
+}
+
+void TrayUI::StartOperation( FILEOP op, QStringList oldF, QStringList newF){
+ createOP(op, oldF, newF);
+ QTimer::singleShot(1000, this, SLOT(checkJobs()));
+}
+
+void TrayUI::createOP( FILEOP type, QStringList oldF, QStringList newF){
+ OPWidget *OP = new OPWidget();
+ if(type==MOVE){ OP->setupOperation("move", oldF, newF); }
+ else if(type==COPY){ OP->setupOperation("copy", oldF, newF); }
+ else if(type==DELETE){ OP->setupOperation("delete",oldF, QStringList()); }
+ else{ OP->deleteLater(); return; } //invalid type of operation
+ OP->setWhatsThis( QUuid::createUuid().toString() );
+ this->contextMenu()->addAction(OP->widgetAction());
+ OPS << OP;
+ connect(OP, SIGNAL(starting(QString)), this, SLOT(OperationStarted(QString)) );
+ connect(OP, SIGNAL(finished(QString)), this, SLOT(OperationFinished(QString)) );
+ connect(OP, SIGNAL(closed(QString)), this, SLOT(OperationClosed(QString)) );
+ QTimer::singleShot(0, OP, SLOT(startOperation()) );
+}
+
+//Operation Widget Responses
+void TrayUI::OperationClosed(QString ID){
+ for(int i=0; i<OPS.length(); i++){
+ if(OPS[i]->whatsThis()==ID){
+ //qDebug() << "Removing OPWidget:" << ID;
+ //this->contextMenu()->removeAction(OPS[i]->widgetAction());
+ OPS.takeAt(i)->deleteLater();
+ break;
+ }
+ }
+ QTimer::singleShot(1000, this, SLOT(checkJobs()) );
+}
+
+void TrayUI::OperationStarted(QString ID){
+ for(int i=0; i<OPS.length(); i++){
+ if(OPS[i]->whatsThis()==ID){
+ //NOTHING FOR NOW - ENABLE POPUPS LATER (if desired - they can get annoying for short operations)
+ }
+ }
+}
+
+void TrayUI::OperationFinished(QString ID){
+ //qDebug() << "Op Finished:" << ID;
+ for(int i=0; i<OPS.length(); i++){
+ if(OPS[i]->whatsThis()!=ID){ continue; }
+ //qDebug() << " - found widget";
+ bool err = OPS[i]->hasErrors();
+ //qDebug() << " -- Errors:" << err << "Duration:" << OPS[i]->duration();
+ //Assemble the notification (if more than 1 second to perform operation)
+ if(OPS[i]->duration()>1){
+ this->showMessage( tr("Finished"), err ? tr("Errors during operation. Click to view details") : tr("No Errors"), err ? QSystemTrayIcon::Warning : QSystemTrayIcon::Information);
+ }
+ //Close the widget if no errors
+ if(!err){ OperationClosed(ID); }
+ break;
+ }
+}
+
+void TrayUI::checkJobs(){
+ if(OPS.isEmpty()){
+ emit JobsFinished();
+ this->hide();
+ }else{
+ this->show();
+ }
+}
diff --git a/src-qt5/desktop-utils/lumina-fm/TrayUI.h b/src-qt5/desktop-utils/lumina-fm/TrayUI.h
new file mode 100644
index 00000000..38a99f7a
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-fm/TrayUI.h
@@ -0,0 +1,46 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2016, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This is the system tray icon for queueing/running file operations
+//===========================================
+#ifndef _LUMINA_FILE_MANAGER_FILE_OP_SYSTRAY_H
+#define _LUMINA_FILE_MANAGER_FILE_OP_SYSTRAY_H
+
+#include "OPWidget.h"
+
+#include <QSystemTrayIcon>
+#include <QMenu>
+
+class TrayUI : public QSystemTrayIcon{
+ Q_OBJECT
+public:
+ enum FILEOP{MOVE, COPY, DELETE}; //File Operations
+
+ TrayUI(QObject *parent = 0);
+ ~TrayUI();
+
+public slots:
+ void StartOperation( FILEOP op, QStringList oldF, QStringList newF);
+
+private:
+ QList<OPWidget*> OPS;
+
+ void createOP( FILEOP, QStringList oldF, QStringList newF);
+
+private slots:
+
+ //Operation Widget Responses
+ void OperationClosed(QString ID);
+ void OperationStarted(QString ID);
+ void OperationFinished(QString ID);
+
+ void checkJobs(); //see if any jobs are still active/visible, otherwise hide the tray icon
+
+signals:
+ void JobsFinished();
+
+};
+#endif
diff --git a/src-qt5/desktop-utils/lumina-fm/i18n/lumina-fm_de.ts b/src-qt5/desktop-utils/lumina-fm/i18n/lumina-fm_de.ts
index 50acc59f..ab57fe64 100644
--- a/src-qt5/desktop-utils/lumina-fm/i18n/lumina-fm_de.ts
+++ b/src-qt5/desktop-utils/lumina-fm/i18n/lumina-fm_de.ts
@@ -1,55 +1,55 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE TS>
<TS version="2.1" language="de">
<context>
<name>BMMDialog</name>
<message>
- <location filename="../BMMDialog.ui" line="14"/>
+ <location filename="../BMMDialog.ui" line="14"></location>
<source>Manage Bookmarks</source>
<translation>Lesezeichen verwalten</translation>
</message>
<message>
- <location filename="../BMMDialog.ui" line="35"/>
+ <location filename="../BMMDialog.ui" line="35"></location>
<source>Name</source>
<translation>Name</translation>
</message>
<message>
- <location filename="../BMMDialog.ui" line="40"/>
+ <location filename="../BMMDialog.ui" line="40"></location>
<source>Path</source>
<translation>Pfad</translation>
</message>
<message>
- <location filename="../BMMDialog.ui" line="52"/>
+ <location filename="../BMMDialog.ui" line="52"></location>
<source>Remove Bookmark</source>
<translation>Lesezeichen entfernen</translation>
</message>
<message>
- <location filename="../BMMDialog.ui" line="65"/>
+ <location filename="../BMMDialog.ui" line="65"></location>
<source>Rename BookMark</source>
<translation>Lesezeichen umbenennen</translation>
</message>
<message>
- <location filename="../BMMDialog.ui" line="91"/>
+ <location filename="../BMMDialog.ui" line="91"></location>
<source>Finished</source>
<translation>Abgeschlossen</translation>
</message>
<message>
- <location filename="../BMMDialog.cpp" line="58"/>
+ <location filename="../BMMDialog.cpp" line="58"></location>
<source>Rename Bookmark</source>
<translation>Lesezeichen umbenennen</translation>
</message>
<message>
- <location filename="../BMMDialog.cpp" line="58"/>
+ <location filename="../BMMDialog.cpp" line="58"></location>
<source>Name:</source>
<translation>Name:</translation>
</message>
<message>
- <location filename="../BMMDialog.cpp" line="64"/>
+ <location filename="../BMMDialog.cpp" line="64"></location>
<source>Invalid Name</source>
<translation>Ungültiger Name</translation>
</message>
<message>
- <location filename="../BMMDialog.cpp" line="64"/>
+ <location filename="../BMMDialog.cpp" line="64"></location>
<source>This bookmark name already exists. Please choose another.</source>
<translation>Der Name des Lesezeichens ist bereits vorhanden. Bitte einen anderen Namen wählen.</translation>
</message>
@@ -57,310 +57,310 @@
<context>
<name>DirWidget</name>
<message>
- <location filename="../widgets/DirWidget.ui" line="20"/>
+ <location filename="../widgets/DirWidget.ui" line="20"></location>
<source>Form</source>
<translatorcomment>Not sure what this relates to as the meaning would differ when put in different contexts</translatorcomment>
<translation>Form</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="246"/>
- <location filename="../widgets/DirWidget.ui" line="249"/>
+ <location filename="../widgets/DirWidget.ui" line="246"></location>
+ <location filename="../widgets/DirWidget.ui" line="249"></location>
<source>Open item</source>
<translation>Objekt öffnen</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="271"/>
- <location filename="../widgets/DirWidget.ui" line="274"/>
+ <location filename="../widgets/DirWidget.ui" line="271"></location>
+ <location filename="../widgets/DirWidget.ui" line="274"></location>
<source>Open item (select application)</source>
<translation>Objekt öffnen (Anwendung auswählen)</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="300"/>
- <location filename="../widgets/DirWidget.ui" line="303"/>
+ <location filename="../widgets/DirWidget.ui" line="300"></location>
+ <location filename="../widgets/DirWidget.ui" line="303"></location>
<source>Add item to personal favorites</source>
<translation>Füge Objekt den persönlichen Favoriten hinzu</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="322"/>
- <location filename="../widgets/DirWidget.ui" line="325"/>
+ <location filename="../widgets/DirWidget.ui" line="322"></location>
+ <location filename="../widgets/DirWidget.ui" line="325"></location>
<source>Rename item</source>
<translation>Objekt umbenennen</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="351"/>
+ <location filename="../widgets/DirWidget.ui" line="351"></location>
<source>Cut items</source>
<translation>Objekte ausschneiden</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="354"/>
+ <location filename="../widgets/DirWidget.ui" line="354"></location>
<source>Cut items (add to the clipboard)</source>
<translation>Objekte ausschneiden (zur Zwischenablage hinzufügen)</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="373"/>
+ <location filename="../widgets/DirWidget.ui" line="373"></location>
<source>Copy items</source>
<translation>Objekte kopieren</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="376"/>
+ <location filename="../widgets/DirWidget.ui" line="376"></location>
<source>Copy items to the clipboard</source>
<translation>Objekte in die Zwischenablage kopieren</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="395"/>
- <location filename="../widgets/DirWidget.ui" line="398"/>
+ <location filename="../widgets/DirWidget.ui" line="395"></location>
+ <location filename="../widgets/DirWidget.ui" line="398"></location>
<source>Paste items from clipboard</source>
<translation>Objekte aus der Zwischenablage einfügen</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="424"/>
- <location filename="../widgets/DirWidget.ui" line="427"/>
+ <location filename="../widgets/DirWidget.ui" line="424"></location>
+ <location filename="../widgets/DirWidget.ui" line="427"></location>
<source>Delete Items</source>
<translation>Objekte löschen</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="507"/>
+ <location filename="../widgets/DirWidget.ui" line="507"></location>
<source>Stop loading the directory</source>
<translation>Laden des Verzeichnisses abbrechen</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="90"/>
+ <location filename="../widgets/DirWidget.ui" line="90"></location>
<source>Add selected images to slideshow</source>
<translation>Füge ausgewählte Bilder der Präsentation hinzu</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="77"/>
+ <location filename="../widgets/DirWidget.ui" line="77"></location>
<source>Create a new directory</source>
<translation>Erstelle neues Verzeichnis</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="80"/>
+ <location filename="../widgets/DirWidget.ui" line="80"></location>
<source>New Dir</source>
<translation>Neues Verzeichnis</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="64"/>
+ <location filename="../widgets/DirWidget.ui" line="64"></location>
<source>Create a new file</source>
<translation>Erstelle neue Datei</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="67"/>
+ <location filename="../widgets/DirWidget.ui" line="67"></location>
<source>New File</source>
<translation>Neue Datei</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="93"/>
+ <location filename="../widgets/DirWidget.ui" line="93"></location>
<source>Slideshow</source>
<translation>Präsentation</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="109"/>
+ <location filename="../widgets/DirWidget.ui" line="109"></location>
<source>Enqueue selection in multimedia player</source>
<translation>reihe Auswahl in Wiedergabeliste ein</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="112"/>
+ <location filename="../widgets/DirWidget.ui" line="112"></location>
<source>Play</source>
<translation>Wiedergabe</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="465"/>
+ <location filename="../widgets/DirWidget.ui" line="465"></location>
<source>Back</source>
<translation>Zurück</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="468"/>
- <location filename="../widgets/DirWidget.ui" line="471"/>
+ <location filename="../widgets/DirWidget.ui" line="468"></location>
+ <location filename="../widgets/DirWidget.ui" line="471"></location>
<source>Go back to previous directory</source>
<translation>zurück zum vorhergehenden Verzeichnis</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="479"/>
+ <location filename="../widgets/DirWidget.ui" line="479"></location>
<source>Up</source>
<translation>hoch</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="482"/>
- <location filename="../widgets/DirWidget.ui" line="485"/>
+ <location filename="../widgets/DirWidget.ui" line="482"></location>
+ <location filename="../widgets/DirWidget.ui" line="485"></location>
<source>Go to parent directory</source>
<translation>Zum übergeordneten Verzeichnis wechseln</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="493"/>
+ <location filename="../widgets/DirWidget.ui" line="493"></location>
<source>Home</source>
<translation>Persönlicher Ordner</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="496"/>
- <location filename="../widgets/DirWidget.ui" line="499"/>
+ <location filename="../widgets/DirWidget.ui" line="496"></location>
+ <location filename="../widgets/DirWidget.ui" line="499"></location>
<source>Go to home directory</source>
<translation>Gehe zum persönlichen Verzeichnis</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.ui" line="518"/>
- <location filename="../widgets/DirWidget.ui" line="521"/>
+ <location filename="../widgets/DirWidget.ui" line="518"></location>
+ <location filename="../widgets/DirWidget.ui" line="521"></location>
<source>Close this browser</source>
<translation>Diesen Browser schließen</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="136"/>
+ <location filename="../widgets/DirWidget.cpp" line="136"></location>
<source>Name</source>
<translation>Name</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="140"/>
+ <location filename="../widgets/DirWidget.cpp" line="140"></location>
<source>Size</source>
<translation>Größe</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="143"/>
+ <location filename="../widgets/DirWidget.cpp" line="143"></location>
<source>Type</source>
<translation>Typ</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="147"/>
+ <location filename="../widgets/DirWidget.cpp" line="147"></location>
<source>Date Modified</source>
<translation>Änderungsdatum</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="150"/>
+ <location filename="../widgets/DirWidget.cpp" line="150"></location>
<source>Date Created</source>
<translation>Erstellungsdatum</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="207"/>
- <location filename="../widgets/DirWidget.cpp" line="484"/>
+ <location filename="../widgets/DirWidget.cpp" line="207"></location>
+ <location filename="../widgets/DirWidget.cpp" line="484"></location>
<source>(Limited Access) </source>
<translation>(Beschränkter Zugriff) </translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="469"/>
+ <location filename="../widgets/DirWidget.cpp" line="469"></location>
<source>Capacity: %1</source>
<translation>Kapazität: %1</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="474"/>
+ <location filename="../widgets/DirWidget.cpp" line="474"></location>
<source>Files: %1 (%2)</source>
<translation>Dateien: %1 (%2)</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="479"/>
+ <location filename="../widgets/DirWidget.cpp" line="479"></location>
<source>Dirs: %1</source>
<translation>Verzeichnisse: %1</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="781"/>
+ <location filename="../widgets/DirWidget.cpp" line="781"></location>
<source>New Document</source>
<translation>Neues Dokument</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="781"/>
- <location filename="../widgets/DirWidget.cpp" line="802"/>
+ <location filename="../widgets/DirWidget.cpp" line="781"></location>
+ <location filename="../widgets/DirWidget.cpp" line="802"></location>
<source>Name:</source>
<translation>Name:</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="792"/>
+ <location filename="../widgets/DirWidget.cpp" line="792"></location>
<source>Error Creating Document</source>
<translation>Fehler beim Erstellen des Dokuments</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="792"/>
+ <location filename="../widgets/DirWidget.cpp" line="792"></location>
<source>The document could not be created. Please ensure that you have the proper permissions.</source>
<translation>Das Dokument konnte nicht erstellt werden. Bitte stelle sicher, dass du die korrekten Dateirechte hast.</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="802"/>
+ <location filename="../widgets/DirWidget.cpp" line="802"></location>
<source>New Directory</source>
<translation>Neues Verzeichnis</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="812"/>
+ <location filename="../widgets/DirWidget.cpp" line="812"></location>
<source>Invalid Name</source>
<translation>Ungültiger Name</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="812"/>
+ <location filename="../widgets/DirWidget.cpp" line="812"></location>
<source>A file or directory with that name already exists! Please pick a different name.</source>
<translation>Eine Datei oder ein Ordner mit diesem Namen existiert bereits! Bitte einen neuen Namen auswählen.</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="816"/>
+ <location filename="../widgets/DirWidget.cpp" line="816"></location>
<source>Error Creating Directory</source>
<translation>Fehler beim Erstellen des Verzeichnisses</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="816"/>
+ <location filename="../widgets/DirWidget.cpp" line="816"></location>
<source>The directory could not be created. Please ensure that you have the proper permissions to modify the current directory.</source>
<translation>Das Verzeichnis konnte nicht erstellt werden. Bitte sicherstellen, dass du die nötigen Rechte zum modifizieren des Verzeichnisses hast.</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="839"/>
+ <location filename="../widgets/DirWidget.cpp" line="839"></location>
<source>Current</source>
<translation>Aktuell</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="949"/>
+ <location filename="../widgets/DirWidget.cpp" line="949"></location>
<source>File Checksums:</source>
<translation>Datei-Prüfsummen</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="966"/>
+ <location filename="../widgets/DirWidget.cpp" line="966"></location>
<source>Missing Utility</source>
<translation>Fehlendes Dienstprogramm</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="966"/>
- <source>The &quot;lumina-fileinfo&quot; utility could not be found on the system. Please install it first.</source>
- <translation>Das &quot;lumina-fileinfo&quot; Dienstprogramm konnte nicht gefunden werden. Bitte erst installieren.</translation>
+ <location filename="../widgets/DirWidget.cpp" line="966"></location>
+ <source>The "lumina-fileinfo" utility could not be found on the system. Please install it first.</source>
+ <translation>Das "lumina-fileinfo" Dienstprogramm konnte nicht gefunden werden. Bitte erst installieren.</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="984"/>
+ <location filename="../widgets/DirWidget.cpp" line="984"></location>
<source>Open</source>
<translation>Öffnen</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="985"/>
+ <location filename="../widgets/DirWidget.cpp" line="985"></location>
<source>Open With...</source>
<translation>Öffnen mit...</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="987"/>
+ <location filename="../widgets/DirWidget.cpp" line="987"></location>
<source>Rename...</source>
<translation>Umbenennen …</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="988"/>
+ <location filename="../widgets/DirWidget.cpp" line="988"></location>
<source>View Checksums...</source>
<translation>Prüfsummen anzeigen...</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="999"/>
+ <location filename="../widgets/DirWidget.cpp" line="999"></location>
<source>File Properties...</source>
<translation>Dateieigenschaften...</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="992"/>
+ <location filename="../widgets/DirWidget.cpp" line="992"></location>
<source>Cut Selection</source>
<translation>Auswahl ausschneiden</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="993"/>
+ <location filename="../widgets/DirWidget.cpp" line="993"></location>
<source>Copy Selection</source>
<translation>Auswahl kopieren</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="994"/>
+ <location filename="../widgets/DirWidget.cpp" line="994"></location>
<source>Paste</source>
<translation>Einfügen</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="996"/>
+ <location filename="../widgets/DirWidget.cpp" line="996"></location>
<source>Delete Selection</source>
<translation>Auswahl löschen</translation>
</message>
<message>
- <location filename="../widgets/DirWidget.cpp" line="1002"/>
+ <location filename="../widgets/DirWidget.cpp" line="1002"></location>
<source>Open Terminal here</source>
<translation>Terminal hier öffnen</translation>
</message>
@@ -368,82 +368,82 @@
<context>
<name>FODialog</name>
<message>
- <location filename="../FODialog.ui" line="14"/>
+ <location filename="../FODialog.ui" line="14"></location>
<source>Performing File Operations</source>
<translation>Dateioperationen ausführen</translation>
</message>
<message>
- <location filename="../FODialog.ui" line="39"/>
+ <location filename="../FODialog.ui" line="39"></location>
<source>%v/%m</source>
<translation>%v/%m</translation>
</message>
<message>
- <location filename="../FODialog.ui" line="74"/>
+ <location filename="../FODialog.ui" line="74"></location>
<source>Stop</source>
<translation>Anhalten</translation>
</message>
<message>
- <location filename="../FODialog.cpp" line="19"/>
+ <location filename="../FODialog.cpp" line="19"></location>
<source>Calculating</source>
<translation>Berechne</translation>
</message>
<message>
- <location filename="../FODialog.cpp" line="131"/>
+ <location filename="../FODialog.cpp" line="131"></location>
<source>Overwrite Files?</source>
<translation>Dateien überschreiben?</translation>
</message>
<message>
- <location filename="../FODialog.cpp" line="131"/>
+ <location filename="../FODialog.cpp" line="131"></location>
<source>Do you want to overwrite the existing files?</source>
<translation>Sollen diese Dateien überschrieben werden?</translation>
</message>
<message>
- <location filename="../FODialog.cpp" line="131"/>
+ <location filename="../FODialog.cpp" line="131"></location>
<source>Note: It will just add a number to the filename otherwise.</source>
<translation>Hinweis: Sonst wird nur eine Nummer an den Dateinamen angehängt.</translation>
</message>
<message>
- <location filename="../FODialog.cpp" line="148"/>
+ <location filename="../FODialog.cpp" line="148"></location>
<source>Removing: %1</source>
<translation>%1 wird entfernt</translation>
</message>
<message>
- <location filename="../FODialog.cpp" line="149"/>
+ <location filename="../FODialog.cpp" line="149"></location>
<source>Copying: %1 to %2</source>
<translation>%1 nach %2 kopieren</translation>
</message>
<message>
- <location filename="../FODialog.cpp" line="150"/>
+ <location filename="../FODialog.cpp" line="150"></location>
<source>Restoring: %1 as %2</source>
<translation>stelle %1 als %2 wieder her</translation>
</message>
<message>
- <location filename="../FODialog.cpp" line="151"/>
+ <location filename="../FODialog.cpp" line="151"></location>
<source>Moving: %1 to %2</source>
<translation>%1 nach %2 verschieben</translation>
</message>
<message>
- <location filename="../FODialog.cpp" line="164"/>
+ <location filename="../FODialog.cpp" line="164"></location>
<source>Could not remove these files:</source>
<translation>Diese Dateien lassen sich nicht löschen:</translation>
</message>
<message>
- <location filename="../FODialog.cpp" line="165"/>
+ <location filename="../FODialog.cpp" line="165"></location>
<source>Could not copy these files:</source>
<translation>Konnte diese Dateien nicht kopieren:</translation>
</message>
<message>
- <location filename="../FODialog.cpp" line="166"/>
+ <location filename="../FODialog.cpp" line="166"></location>
<source>Could not restore these files:</source>
- <translation>Diese Dateien konnte nicht wiederhergestellt werden:</translation>
+ <translation>Diese Dateien konnten nicht wiederhergestellt werden:</translation>
</message>
<message>
- <location filename="../FODialog.cpp" line="167"/>
+ <location filename="../FODialog.cpp" line="167"></location>
<source>Could not move these files:</source>
<translation>Diese Dateien konnten nicht verschoben werden:</translation>
</message>
<message>
- <location filename="../FODialog.cpp" line="169"/>
+ <location filename="../FODialog.cpp" line="169"></location>
<source>File Errors</source>
<translation>Dateifehler</translation>
</message>
@@ -451,12 +451,12 @@
<context>
<name>FOWorker</name>
<message>
- <location filename="../FODialog.cpp" line="320"/>
+ <location filename="../FODialog.cpp" line="320"></location>
<source>Invalid Move</source>
<translation>Ungültiger Zug</translation>
</message>
<message>
- <location filename="../FODialog.cpp" line="320"/>
+ <location filename="../FODialog.cpp" line="320"></location>
<source>It is not possible to move a directory into itself. Please make a copy of the directory instead.
Old Location: %1
@@ -470,501 +470,501 @@ Neue Position: %2</translation>
<context>
<name>GitWizard</name>
<message>
- <location filename="../gitWizard.ui" line="14"/>
+ <location filename="../gitWizard.ui" line="14"></location>
<source>Clone a Git Repository</source>
- <translation type="unfinished"></translation>
+ <translation>Ein Git Repository klonen</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="24"/>
+ <location filename="../gitWizard.ui" line="24"></location>
<source>Welcome!</source>
- <translation type="unfinished"></translation>
+ <translation>Willkommen!</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="27"/>
+ <location filename="../gitWizard.ui" line="27"></location>
<source>This wizard will guide you through the process of downloading a GIT repository from the internet.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Assistent wird Sie beim Herunterladen eines Git Repositorys aus dem Internet unterstützen.</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="46"/>
+ <location filename="../gitWizard.ui" line="46"></location>
<source>GitHub Repository Settings</source>
- <translation type="unfinished"></translation>
+ <translation>GitHub Repository Einstellungen</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="55"/>
+ <location filename="../gitWizard.ui" line="55"></location>
<source>Organization/User</source>
- <translation type="unfinished"></translation>
+ <translation>Organisation/Benutzer</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="65"/>
+ <location filename="../gitWizard.ui" line="65"></location>
<source>Repository Name</source>
- <translation type="unfinished"></translation>
+ <translation>Name des Repositorys</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="75"/>
+ <location filename="../gitWizard.ui" line="75"></location>
<source>Is Private Repository</source>
- <translation type="unfinished"></translation>
+ <translation>ist ein privates Repository</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="89"/>
+ <location filename="../gitWizard.ui" line="89"></location>
<source>Type of Access</source>
- <translation type="unfinished"></translation>
+ <translation>Zugriffstyp</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="95"/>
+ <location filename="../gitWizard.ui" line="95"></location>
<source>Use my SSH Key</source>
- <translation type="unfinished"></translation>
+ <translation>Meinen SSH Key benutzen</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="105"/>
+ <location filename="../gitWizard.ui" line="105"></location>
<source>Login to server</source>
- <translation type="unfinished"></translation>
+ <translation>An Server anmelden</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="114"/>
+ <location filename="../gitWizard.ui" line="114"></location>
<source>Username</source>
- <translation type="unfinished"></translation>
+ <translation>Benutzername</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="124"/>
+ <location filename="../gitWizard.ui" line="124"></location>
<source>Password</source>
- <translation type="unfinished"></translation>
+ <translation>Kennwort</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="133"/>
+ <location filename="../gitWizard.ui" line="133"></location>
<source>Anonymous (public repositories only)</source>
- <translation type="unfinished"></translation>
+ <translation>Anonym (nur öffentliche Repositorys)</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="143"/>
+ <location filename="../gitWizard.ui" line="143"></location>
<source>Optional SSH Password</source>
- <translation type="unfinished"></translation>
+ <translation>Optionales SSH Kennwort</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="153"/>
+ <location filename="../gitWizard.ui" line="153"></location>
<source>Advanced Options</source>
- <translation type="unfinished"></translation>
+ <translation>Erweiterte Einstellungen</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="159"/>
+ <location filename="../gitWizard.ui" line="159"></location>
<source>Custom Depth</source>
- <translation type="unfinished"></translation>
+ <translation>Benutzerdefinierter Wert für "depth"</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="166"/>
+ <location filename="../gitWizard.ui" line="166"></location>
<source>Single Branch</source>
- <translation type="unfinished"></translation>
+ <translation>Single Branch</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="175"/>
+ <location filename="../gitWizard.ui" line="175"></location>
<source>branch name</source>
- <translation type="unfinished"></translation>
+ <translation>Branch Name</translation>
</message>
<message>
- <location filename="../gitWizard.ui" line="232"/>
- <source>Click &quot;Next&quot; to start downloading the repository</source>
- <translation type="unfinished"></translation>
+ <location filename="../gitWizard.ui" line="232"></location>
+ <source>Click "Next" to start downloading the repository</source>
+ <translation>Auf "Weiter" klicken, um das Repository herunterzuladen</translation>
</message>
<message>
- <location filename="../gitWizard.h" line="57"/>
+ <location filename="../gitWizard.h" line="57"></location>
<source>Stop Download?</source>
- <translation type="unfinished"></translation>
+ <translation>Download beenden?</translation>
</message>
<message>
- <location filename="../gitWizard.h" line="57"/>
+ <location filename="../gitWizard.h" line="57"></location>
<source>Kill the current download?</source>
- <translation type="unfinished"></translation>
+ <translation>Den aktuellen Download zwangsweise beenden?</translation>
</message>
</context>
<context>
<name>MainUI</name>
<message>
- <location filename="../MainUI.ui" line="14"/>
+ <location filename="../MainUI.ui" line="14"></location>
<source>Insight</source>
<translation>Einsicht</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="98"/>
+ <location filename="../MainUI.cpp" line="98"></location>
<source>Shift+Left</source>
<translation>Umschalt+Links</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="99"/>
+ <location filename="../MainUI.cpp" line="99"></location>
<source>Shift+Right</source>
<translation>Umschalt+Rechts</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="114"/>
+ <location filename="../MainUI.ui" line="114"></location>
<source>File</source>
<translation>Datei</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="126"/>
+ <location filename="../MainUI.ui" line="126"></location>
<source>View</source>
<translation>Ansicht</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="130"/>
+ <location filename="../MainUI.ui" line="130"></location>
<source>View Mode</source>
<translation>Ansichtsmodus</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="136"/>
+ <location filename="../MainUI.ui" line="136"></location>
<source>Group Mode</source>
<translation>Gruppenmodus</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="154"/>
+ <location filename="../MainUI.ui" line="154"></location>
<source>Bookmarks</source>
<translation>Lesezeichen</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="162"/>
+ <location filename="../MainUI.ui" line="162"></location>
<source>External Devices</source>
<translation>Externe Geräte</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="169"/>
+ <location filename="../MainUI.ui" line="169"></location>
<source>Edit</source>
<translation>Bearbeiten</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="181"/>
+ <location filename="../MainUI.ui" line="181"></location>
<source>Git</source>
- <translation type="unfinished"></translation>
+ <translation>Git</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="196"/>
- <location filename="../MainUI.ui" line="199"/>
+ <location filename="../MainUI.ui" line="196"></location>
+ <location filename="../MainUI.ui" line="199"></location>
<source>New Browser</source>
<translation>neuer Browser</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="275"/>
+ <location filename="../MainUI.ui" line="275"></location>
<source>Search Directory...</source>
<translation>Suche im Verzeichnis...</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="308"/>
+ <location filename="../MainUI.ui" line="308"></location>
<source>Increase Icon Size</source>
<translation>Symbolgröße vergrößern</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="313"/>
+ <location filename="../MainUI.ui" line="313"></location>
<source>Decrease Icon Size</source>
<translation>Symbolgröße verkleinern</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="318"/>
+ <location filename="../MainUI.ui" line="318"></location>
<source>Larger Icons</source>
<translation>Größere Symbole</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="321"/>
+ <location filename="../MainUI.ui" line="321"></location>
<source>Ctrl++</source>
<translation>Strg++</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="329"/>
+ <location filename="../MainUI.ui" line="329"></location>
<source>Smaller Icons</source>
<translation>Kleinere Symbole</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="332"/>
+ <location filename="../MainUI.ui" line="332"></location>
<source>Ctrl+-</source>
<translation>Strg+-</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="340"/>
+ <location filename="../MainUI.ui" line="340"></location>
<source>New Window</source>
<translation>Neues Fenster</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="343"/>
+ <location filename="../MainUI.ui" line="343"></location>
<source>Ctrl+N</source>
<translation>Strg+N</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="351"/>
+ <location filename="../MainUI.ui" line="351"></location>
<source>Add Bookmark</source>
<translation>Lesezeichen hinzufügen</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="354"/>
+ <location filename="../MainUI.ui" line="354"></location>
<source>Ctrl+D</source>
<translation>Strg+D</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="406"/>
+ <location filename="../MainUI.ui" line="406"></location>
<source>Delete Selection</source>
<translation>Auswahl löschen</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="409"/>
+ <location filename="../MainUI.ui" line="409"></location>
<source>Del</source>
<translation>Entf</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="417"/>
+ <location filename="../MainUI.ui" line="417"></location>
<source>Refresh</source>
<translation>Aktualisieren</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="428"/>
+ <location filename="../MainUI.ui" line="428"></location>
<source>Close Browser</source>
<translation>Browser schließen</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="439"/>
+ <location filename="../MainUI.ui" line="439"></location>
<source>Repo Status</source>
- <translation type="unfinished"></translation>
+ <translation>Status des Repositorys</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="444"/>
+ <location filename="../MainUI.ui" line="444"></location>
<source>Clone Repository</source>
- <translation type="unfinished"></translation>
+ <translation>Repository klonen</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="202"/>
+ <location filename="../MainUI.ui" line="202"></location>
<source>Ctrl+T</source>
<translation>Strg+T</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="210"/>
+ <location filename="../MainUI.ui" line="210"></location>
<source>Exit</source>
<translation>Beenden</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="213"/>
+ <location filename="../MainUI.ui" line="213"></location>
<source>Ctrl+Q</source>
<translation>Strg+Q</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="221"/>
+ <location filename="../MainUI.ui" line="221"></location>
<source>&amp;Preferences</source>
<translation>&amp;Persönliche Einstellungen</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="232"/>
+ <location filename="../MainUI.ui" line="232"></location>
<source>Show Hidden Files</source>
<translation>Versteckte Dateien anzeigen</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="237"/>
+ <location filename="../MainUI.ui" line="237"></location>
<source>Scan for Devices</source>
<translation>Nach Geräten suchen</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="245"/>
+ <location filename="../MainUI.ui" line="245"></location>
<source>Manage Bookmarks</source>
<translation>Lesezeichen verwalten</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="259"/>
+ <location filename="../MainUI.ui" line="259"></location>
<source>Show Action Buttons</source>
<translation>Schaltknöpfe anzeigen</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="270"/>
+ <location filename="../MainUI.ui" line="270"></location>
<source>Load Thumbnails</source>
<translation>lade Vorschaubilder</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="278"/>
+ <location filename="../MainUI.ui" line="278"></location>
<source>Ctrl+F</source>
<translation>Strg+F</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="69"/>
+ <location filename="../MainUI.cpp" line="69"></location>
<source>Detailed List</source>
<translation>Detailansicht</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="70"/>
+ <location filename="../MainUI.cpp" line="70"></location>
<source>Basic List</source>
<translation>Einfache Liste</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="431"/>
+ <location filename="../MainUI.ui" line="431"></location>
<source>Ctrl+W</source>
<translation>Strg+W</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="71"/>
+ <location filename="../MainUI.cpp" line="71"></location>
<source>Prefer Tabs</source>
<translation>Tabs bevorzugen</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="72"/>
+ <location filename="../MainUI.cpp" line="72"></location>
<source>Prefer Columns</source>
<translation>Spalten bevorzugen</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="420"/>
+ <location filename="../MainUI.ui" line="420"></location>
<source>F5</source>
<translation>F5</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="387"/>
+ <location filename="../MainUI.ui" line="387"></location>
<source>Ctrl+C</source>
<translation>Strg+C</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="362"/>
+ <location filename="../MainUI.ui" line="362"></location>
<source>Rename...</source>
<translation>Umbenennen …</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="365"/>
+ <location filename="../MainUI.ui" line="365"></location>
<source>F2</source>
<translation>F2</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="373"/>
+ <location filename="../MainUI.ui" line="373"></location>
<source>Cut Selection</source>
<translation>Auswahl ausschneiden</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="384"/>
+ <location filename="../MainUI.ui" line="384"></location>
<source>Copy Selection</source>
<translation>Auswahl kopieren</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="395"/>
+ <location filename="../MainUI.ui" line="395"></location>
<source>Paste</source>
<translation>Einfügen</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="398"/>
+ <location filename="../MainUI.ui" line="398"></location>
<source>Ctrl+V</source>
<translation>Strg+V</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="376"/>
+ <location filename="../MainUI.ui" line="376"></location>
<source>Ctrl+X</source>
<translation>Strg+X</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="199"/>
+ <location filename="../MainUI.cpp" line="199"></location>
<source>Invalid Directories</source>
<translation>Ungültiges Verzeichnis</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="199"/>
+ <location filename="../MainUI.cpp" line="199"></location>
<source>The following directories are invalid and could not be opened:</source>
<translation>Die folgenden Verzeichnis sind ungültig und können nicht geöffnet werden:</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="342"/>
+ <location filename="../MainUI.cpp" line="342"></location>
<source>Root</source>
<translation>Basisverzeichnis</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="348"/>
+ <location filename="../MainUI.cpp" line="348"></location>
<source>%1 (Type: %2)</source>
<translation>%1 (Typ: %2)</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="352"/>
+ <location filename="../MainUI.cpp" line="352"></location>
<source>Filesystem: %1</source>
<translation>Dateisystem: %1</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="573"/>
+ <location filename="../MainUI.cpp" line="573"></location>
<source>Browser</source>
<translation>Browser</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="600"/>
+ <location filename="../MainUI.cpp" line="600"></location>
<source>New Bookmark</source>
<translation>Neues Lesezeichen</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="600"/>
+ <location filename="../MainUI.cpp" line="600"></location>
<source>Name:</source>
<translation>Name:</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="605"/>
+ <location filename="../MainUI.cpp" line="605"></location>
<source>Invalid Name</source>
<translation>Ungültiger Name</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="605"/>
+ <location filename="../MainUI.cpp" line="605"></location>
<source>This bookmark name already exists. Please choose another.</source>
<translation>Der Name des Lesezeichens ist bereits vorhanden. Bitte einen anderen Namen wählen.</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="626"/>
+ <location filename="../MainUI.cpp" line="626"></location>
<source>Git Repository Status</source>
- <translation type="unfinished"></translation>
+ <translation>Status des Git Repositorys</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="732"/>
+ <location filename="../MainUI.cpp" line="732"></location>
<source>Multimedia</source>
<translation>Multimedia</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="750"/>
+ <location filename="../MainUI.cpp" line="750"></location>
<source>Slideshow</source>
<translation>Präsentation</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="927"/>
+ <location filename="../MainUI.cpp" line="927"></location>
<source>Items to be removed:</source>
<translation>Elemente, welche entfernt werden sollen:</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="429"/>
+ <location filename="../MainUI.cpp" line="429"></location>
<source>Verify Quit</source>
<translation>Beenden bestätigen</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="100"/>
+ <location filename="../MainUI.cpp" line="100"></location>
<source>Ctrl+H</source>
<translation>Strg+H</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="101"/>
+ <location filename="../MainUI.cpp" line="101"></location>
<source>Ctrl+L</source>
<translation>Strg+L</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="429"/>
+ <location filename="../MainUI.cpp" line="429"></location>
<source>You have multiple tabs open. Are you sure you want to quit?</source>
<translation>Es sind mehrere Reiter offen. Soll wirklich beendet werden?</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="926"/>
+ <location filename="../MainUI.cpp" line="926"></location>
<source>Verify Removal</source>
<translation>Entfernen überprüfen</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="926"/>
+ <location filename="../MainUI.cpp" line="926"></location>
<source>WARNING: This will permanently delete the file(s) from the system!</source>
<translation>ACHTUNG: Dies wird die Datei(en) dauerhaft vom System entfernen!</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="926"/>
+ <location filename="../MainUI.cpp" line="926"></location>
<source>Are you sure you want to continue?</source>
<translation>Sind Sie sicher, dass Sie fortsetzen möchten?</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="887"/>
+ <location filename="../MainUI.cpp" line="887"></location>
<source>Rename File</source>
<translation>Datei umbenennen</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="887"/>
+ <location filename="../MainUI.cpp" line="887"></location>
<source>New Name:</source>
<translation>Neuer Name:</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="901"/>
+ <location filename="../MainUI.cpp" line="901"></location>
<source>Overwrite File?</source>
<translation>Datei überschreiben?</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="901"/>
+ <location filename="../MainUI.cpp" line="901"></location>
<source>An existing file with the same name will be replaced. Are you sure you want to proceed?</source>
<translation>Eine vorhandene Datei mit dem gleichen Namen wird ersetzt. Fortfahren?</translation>
</message>
@@ -972,37 +972,37 @@ Neue Position: %2</translation>
<context>
<name>MultimediaWidget</name>
<message>
- <location filename="../widgets/MultimediaWidget.ui" line="14"/>
+ <location filename="../widgets/MultimediaWidget.ui" line="14"></location>
<source>Form</source>
<translation>Form</translation>
</message>
<message>
- <location filename="../widgets/MultimediaWidget.ui" line="28"/>
+ <location filename="../widgets/MultimediaWidget.ui" line="28"></location>
<source>Go To Next</source>
<translation>Gehe zum Nächsten</translation>
</message>
<message>
- <location filename="../widgets/MultimediaWidget.ui" line="107"/>
+ <location filename="../widgets/MultimediaWidget.ui" line="107"></location>
<source>(No Running Video)</source>
<translation>(Kein laufendes Video)</translation>
</message>
<message>
- <location filename="../widgets/MultimediaWidget.cpp" line="124"/>
+ <location filename="../widgets/MultimediaWidget.cpp" line="124"></location>
<source>Playing:</source>
<translation>Wiedergabe:</translation>
</message>
<message>
- <location filename="../widgets/MultimediaWidget.cpp" line="130"/>
+ <location filename="../widgets/MultimediaWidget.cpp" line="130"></location>
<source>Stopped</source>
<translation>Angehalten</translation>
</message>
<message>
- <location filename="../widgets/MultimediaWidget.cpp" line="157"/>
+ <location filename="../widgets/MultimediaWidget.cpp" line="157"></location>
<source>Error Playing File: %1</source>
<translation>Fehler beim Abspielen der Datei: %1</translation>
</message>
<message>
- <location filename="../widgets/MultimediaWidget.cpp" line="168"/>
+ <location filename="../widgets/MultimediaWidget.cpp" line="168"></location>
<source>Finished</source>
<translation>Abgeschlossen</translation>
</message>
@@ -1010,102 +1010,102 @@ Neue Position: %2</translation>
<context>
<name>SlideshowWidget</name>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="14"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="14"></location>
<source>Form</source>
<translation>Form</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="36"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="36"></location>
<source>Delete this image file</source>
<translation>Diese Bilddatei löschen</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="56"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="56"></location>
<source>Rotate this image file counter-clockwise</source>
<translation>Dieses Bild gegen den Uhrzeigersinn drehen</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="69"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="69"></location>
<source>Rotate this image file clockwise</source>
<translation>Dieses Bild im Uhrzeigersinn drehen</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="89"/>
- <location filename="../widgets/SlideshowWidget.ui" line="92"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="89"></location>
+ <location filename="../widgets/SlideshowWidget.ui" line="92"></location>
<source>Zoom in</source>
<translation>Hineinzoomen</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="105"/>
- <location filename="../widgets/SlideshowWidget.ui" line="108"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="105"></location>
+ <location filename="../widgets/SlideshowWidget.ui" line="108"></location>
<source>Zoom out</source>
<translation>Herauszoomen</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="212"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="212"></location>
<source>Go to Beginning</source>
<translation>Gehe zum Anfang</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="215"/>
- <location filename="../widgets/SlideshowWidget.ui" line="231"/>
- <location filename="../widgets/SlideshowWidget.ui" line="304"/>
- <location filename="../widgets/SlideshowWidget.ui" line="320"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="215"></location>
+ <location filename="../widgets/SlideshowWidget.ui" line="231"></location>
+ <location filename="../widgets/SlideshowWidget.ui" line="304"></location>
+ <location filename="../widgets/SlideshowWidget.ui" line="320"></location>
<source>...</source>
<translation>...</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="218"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="218"></location>
<source>Shift+Left</source>
<translation>Umschalt+Links</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="228"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="228"></location>
<source>Go to Previous</source>
<translation>Gehe zum Vorherigen</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="234"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="234"></location>
<source>Left</source>
<translation>Links</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="267"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="267"></location>
<source>File Name</source>
<translation>Dateiname</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="301"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="301"></location>
<source>Go to Next</source>
<translation>Gehe zum Nächsten</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="307"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="307"></location>
<source>Right</source>
<translation>Rechts</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="317"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="317"></location>
<source>Go to End</source>
<translation>Gehe zum Ende</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.ui" line="323"/>
+ <location filename="../widgets/SlideshowWidget.ui" line="323"></location>
<source>Shift+Right</source>
<translation>Umschalt+Rechts</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.cpp" line="125"/>
+ <location filename="../widgets/SlideshowWidget.cpp" line="125"></location>
<source>Verify Removal</source>
<translation>Entfernen verifizieren</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.cpp" line="125"/>
+ <location filename="../widgets/SlideshowWidget.cpp" line="125"></location>
<source>WARNING: This will permanently delete the file from the system!</source>
<translation>ACHTUNG: Die Datei wird permanent vom System gelöscht!</translation>
</message>
<message>
- <location filename="../widgets/SlideshowWidget.cpp" line="125"/>
+ <location filename="../widgets/SlideshowWidget.cpp" line="125"></location>
<source>Are you sure you want to continue?</source>
<translation>Bist du sicher, dass Du fortsetzen möchtest?</translation>
</message>
diff --git a/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro b/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro
index 8fb482c7..92042ad7 100644
--- a/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro
+++ b/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro
@@ -19,7 +19,9 @@ SOURCES += main.cpp \
gitCompat.cpp \
gitWizard.cpp \
Browser.cpp \
- BrowserWidget.cpp
+ BrowserWidget.cpp \
+ TrayUI.cpp \
+ OPWidget.cpp
HEADERS += MainUI.h \
FODialog.h \
@@ -33,7 +35,9 @@ HEADERS += MainUI.h \
gitCompat.h \
gitWizard.h \
Browser.h \
- BrowserWidget.h
+ BrowserWidget.h \
+ TrayUI.h \
+ OPWidget.h
FORMS += MainUI.ui \
FODialog.ui \
@@ -41,7 +45,8 @@ FORMS += MainUI.ui \
widgets/MultimediaWidget.ui \
widgets/SlideshowWidget.ui \
widgets/DirWidget2.ui \
- gitWizard.ui
+ gitWizard.ui \
+ OPWidget.ui
icons.files = Insight-FileManager.png
icons.path = $${L_SHAREDIR}/pixmaps
diff --git a/src-qt5/desktop-utils/lumina-fm/widgets/DirWidget.cpp b/src-qt5/desktop-utils/lumina-fm/widgets/DirWidget.cpp
deleted file mode 100644
index d729d608..00000000
--- a/src-qt5/desktop-utils/lumina-fm/widgets/DirWidget.cpp
+++ /dev/null
@@ -1,1049 +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 "DirWidget.h"
-#include "ui_DirWidget.h"
-
-#include <QMessageBox>
-#include <QCursor>
-#include <QClipboard>
-#include <QMimeData>
-#include <QTimer>
-#include <QInputDialog>
-#include <QScrollBar>
-#include <QSettings>
-#include <QtConcurrent/QtConcurrentRun>
-
-#include <LuminaOS.h>
-#include <LuminaXDG.h>
-#include <LuminaUtils.h>
-
-#include "../ScrollDialog.h"
-
-#define DEBUG 0
-
-
-const QString sessionsettings_config_file = QDir::homePath() + "/.config/lumina-desktop/sessionsettings.conf";
-
-DirWidget::DirWidget(QString objID, QWidget *parent) : QWidget(parent), ui(new Ui::DirWidget){
- ui->setupUi(this); //load the designer file
- ID = objID;
- //Assemble the toolbar for the widget
- toolbar = new QToolBar(this);
- toolbar->setContextMenuPolicy(Qt::CustomContextMenu);
- toolbar->setFloatable(false);
- toolbar->setMovable(false);
- toolbar->setOrientation(Qt::Horizontal);
- toolbar->setToolButtonStyle(Qt::ToolButtonIconOnly);
- //toolbar->setIconSize(QSize(32,32));
- ui->toolbar_layout->addWidget(toolbar);
- // - Add the buttons to the toolbar
- toolbar->addAction(ui->actionBack);
- toolbar->addAction(ui->actionUp);
- toolbar->addAction(ui->actionHome);
- line_dir = new QLineEdit(this);
- toolbar->addWidget(line_dir);
- toolbar->addAction(ui->actionStopLoad);
- toolbar->addAction(ui->actionClose_Browser);
- //Add the browser widgets
- listWidget = new DDListWidget(this);
- treeWidget = new DDTreeWidget(this);
- ui->browser_layout->addWidget(listWidget);
- ui->browser_layout->addWidget(treeWidget);
- //Create the keyboard shortcuts
- /*copyFilesShort = new QShortcut( QKeySequence(tr("Ctrl+C")), this);
- pasteFilesShort = new QShortcut( QKeySequence(tr("Ctrl+V")), this);
- cutFilesShort = new QShortcut( QKeySequence(tr("Ctrl+X")), this);
- deleteFilesShort = new QShortcut( QKeySequence(tr("Delete")), this);*/
- //Create the filesystem watcher
- watcher = new QFileSystemWatcher(this);
- synctimer = new QTimer(this);
- synctimer->setInterval(300); // 300 millisecond pause (combine simultaneous signals from the watcher)
- synctimer->setSingleShot(true);
- //Now update the rest of the UI
- canmodify = false; //initial value
- contextMenu = new QMenu(this);
- setDateFormat();
- setShowDetails(true);
- setShowThumbnails(true);
- UpdateIcons();
- UpdateText();
- setupConnections();
-}
-
-DirWidget::~DirWidget(){
- stopload = true; //just in case another thread is still loading/running
-}
-
-void DirWidget::setFocusLineDir() {
- line_dir->setFocus();
- line_dir->selectAll();
-}
-
-void DirWidget::cleanup(){
- stopload = true; //just in case another thread is still loading/running
- if(thumbThread.isRunning()){ thumbThread.waitForFinished(); } //this will stop really quickly with the flag set
-}
-
-void DirWidget::ChangeDir(QString dirpath){
- stopload = true; //just in case it is still loading
- emit LoadDirectory(ID, dirpath);
-}
-
-void DirWidget::setDirCompleter(QCompleter *comp){
- //line_dir->setCompleter(comp);
-}
-
-QString DirWidget::id(){
- return ID;
-}
-
-QString DirWidget::currentDir(){
- return CDIR;
-}
-
-void DirWidget::setShowDetails(bool show){
- if(show!=showDetails){
- //View about to change - ensure the selection gets transferred too
- tmpSel = currentSelection();
- }
- showDetails = show;
- listWidget->setVisible(!showDetails);
- treeWidget->setVisible(showDetails);
- this->refresh();
-}
-
-void DirWidget::setShowSidebar(bool show){
- ui->group_actions->setVisible(show);
-}
-
-void DirWidget::setShowThumbnails(bool show){
- showThumbs = show;
- this->refresh();
-}
-
-void DirWidget::setDetails(QList<DETAILTYPES> list){
- listDetails = list;
- //Need to re-create the header item as well
- CQTreeWidgetItem *it = new CQTreeWidgetItem();
- int nmcol = -1; int typecol = -1;
- for(int t=0; t<listDetails.length(); t++){
- switch(listDetails[t]){
- case NAME:
- it->setText(t,tr("Name"));
- nmcol = t;
- break;
- case SIZE:
- it->setText(t,tr("Size"));
- break;
- case TYPE:
- it->setText(t, tr("Type"));
- typecol = t;
- break;
- case DATEMOD:
- it->setText(t, tr("Date Modified") );
- break;
- case DATECREATE:
- it->setText(t, tr("Date Created") );
- break;
- }
- }
- treeWidget->setHeaderItem(it);
- //Now reset the sorting (alphabetically, dirs first)
- if(nmcol>=0){ treeWidget->sortItems(nmcol, Qt::AscendingOrder); } // sort by name
- if(typecol>=0){ treeWidget->sortItems(typecol, Qt::AscendingOrder); } //sort by type first
-
- if(CDIR.isEmpty() || !showDetails){ return; } //don't need to reload dir if details are not visible
- this->refresh();
-}
-
-void DirWidget::setThumbnailSize(int px){
- bool larger = listWidget->iconSize().height() < px;
- listWidget->setIconSize(QSize(px,px));
- treeWidget->setIconSize(QSize(px,px));
- if(CDIR.isEmpty() || !larger ){ return; } //don't need to reload icons unless the new size is larger
- this->refresh();
-}
-
-void DirWidget::setShowCloseButton(bool show){
- ui->actionClose_Browser->setVisible(show);
-}
-
-QStringList DirWidget::getDateFormat() {
- return date_format;
-}
-
-// This function is only called if user changes sessionsettings. By doing so, operations like sorting by date
-// are faster because the date format is already stored in DirWidget::date_format static variable
-void DirWidget::setDateFormat() {
- if(!date_format.isEmpty())
- date_format.clear();
- QSettings settings("lumina-desktop","sessionsettings");
- // If value doesn't exist or is not setted, empty string is returned
- date_format << settings.value("DateFormat").toString();
- date_format << settings.value("TimeFormat").toString();
-}
-
-
-// ================
-// PUBLIC SLOTS
-// ================
-void DirWidget::LoadDir(QString dir, QList<LFileInfo> list){
- if(dir.isEmpty()){ return; } //nothing to do
- QTime time;
- if(DEBUG){time.start(); }
- qDebug() << "Load Dir:" << dir;
- QString lastdir = CDIR; //for some checks later
- QString lastbasedir = normalbasedir;
- CDIR = dir;
- if(CDIR.endsWith("/") && CDIR.length() > 1){ CDIR.chop(1); }
- CLIST = list; //save for later
- canmodify = QFileInfo(CDIR).isWritable();
- if(DEBUG){ qDebug() << "Clear UI:" <<time.elapsed(); }
- //Clear the status text
- if(!canmodify){ui->label_status->setText(tr("(Limited Access) ")); }
- else{ ui->label_status->setText(""); }
- //Hide the extra buttons for a moment
- ui->tool_goToPlayer->setVisible(false);
- ui->tool_goToImages->setVisible(false);
- ui->tool_new_dir->setVisible(canmodify);
- ui->tool_new_file->setVisible(canmodify);
- //Set the drag/drop info as appripriate
- if(canmodify){
- listWidget->setWhatsThis(CDIR);
- treeWidget->setWhatsThis(CDIR);
- }else{
- listWidget->setWhatsThis("");
- treeWidget->setWhatsThis("");
- }
- bool updateThumbs = (lastdir != CDIR);
- //Determine if this is an internal ZFS snapshot
- bool loadsnaps = false;
- if(DEBUG){ qDebug() << "Load Snap Info:" << time.elapsed(); }
- if( dir.contains(ZSNAPDIR) ){
- //This is a zfs snapshot - only update the saved paths necessary to rotate between snapshots/system
- snaprelpath = dir.section(ZSNAPDIR,1,1000).section("/",1,1000); //the relative path inside the snapshot
- if(snaprelpath.endsWith("/")){ snaprelpath.chop(1); }
- normalbasedir = dir.section(ZSNAPDIR,0,0)+"/"+snaprelpath; //Update the new base directory
- if(normalbasedir.endsWith("/")){ normalbasedir.chop(1); }
- line_dir->setText(normalbasedir);
- //See if this was a manual move to the directory, or an internal move
- QString tmp = dir.section(ZSNAPDIR,0,0);
- if(tmp != snapbasedir.section(ZSNAPDIR,0,0)){
- loadsnaps = true; //different snapshot loaded - need to update internally
- }
- }else{
- //This is a normal directory - prompt for snapshot information
- line_dir->setText(CDIR);
- normalbasedir = CDIR;
- if(!snapbasedir.isEmpty()){ watcher->removePath(snapbasedir); }
- snapbasedir.clear();
- loadsnaps = true;
- }
- if(loadsnaps){
- //kick this off while still loading the dir contents
- ui->group_snaps->setEnabled(false); //to prevent the snap updates to be automatically used
- ui->group_snaps->setVisible(false);
- ui->slider_snap->setRange(1,1);
- emit findSnaps(ID, normalbasedir);
- }
-
- if(DEBUG){ qDebug() << "Update History:" <<time.elapsed(); }
- //Now update the history for this browser
- //qDebug() << "History:" << history << normalbasedir << lastbasedir;
- if(!history.isEmpty() && history.last() == normalbasedir && lastbasedir!=normalbasedir ){
- //We went back one - remove this from the history
- history.takeLast();
- ui->actionBack->setEnabled(!history.isEmpty());
- //qDebug() << " - Duplicate: removed item";
- }else if(lastbasedir!=normalbasedir){ //not a refresh or internal snapshot change
- //qDebug() << " - New History Item:" << normalbasedir;
- history << normalbasedir;
- ui->actionBack->setEnabled(history.length()>1);
- }
- if(DEBUG){ qDebug() << "Update Watcher:" << time.elapsed(); }
- //Clear the current watcher
- if(!watcher->directories().isEmpty()){ watcher->removePaths(watcher->directories()); }
- if(!watcher->files().isEmpty()){ watcher->removePaths(watcher->files()); }
- watcher->addPath(CDIR);
- // add sessionsettings to watcher so date_format can be update based on user settings
- watcher->addPath(sessionsettings_config_file);
- ui->actionStopLoad->setVisible(true);
- stopload = false;
- //Clear the display widget (if a new directory)
- if(DEBUG){ qDebug() << "Clear Browser Widget:" << time.elapsed(); }
- double scrollpercent = -1;
- if(updateThumbs){ needThumbs.clear(); }
- if(lastbasedir != normalbasedir){
- if(showDetails){ treeWidget->clear(); }
- else{ listWidget->clear(); }
- QApplication::processEvents(); //make sure it is cleared right away
- }else{
- //Need to be smarter about which items need to be removed
- // - compare the old/new lists and remove any items not in the new listing (new items taken care of below)
- QStringList newfiles; //just the filenames
- for(int i=0; i<CLIST.length(); i++){ newfiles << CLIST[i].fileName(); }
- if(showDetails){
- for(int i=0; i<treeWidget->topLevelItemCount(); i++){
- if( !newfiles.contains(treeWidget->topLevelItem(i)->whatsThis(0).section("/",-1)) ){
- if(!updateThumbs){ needThumbs.removeAll( treeWidget->topLevelItem(i)->whatsThis(0).section("::::",1,50)); }
- delete treeWidget->takeTopLevelItem(i);
- i--;
- }
- }
- QApplication::processEvents(); //make sure the scrollbar is up to date after removals
- scrollpercent = treeWidget->verticalScrollBar()->value()/( (double) treeWidget->verticalScrollBar()->maximum());
- }else{
- for(int i=0; i<listWidget->count(); i++){
- if( !newfiles.contains(listWidget->item(i)->text()) ){
- if(!updateThumbs){ needThumbs.removeAll( listWidget->item(i)->whatsThis().section("::::",1,50)); }
- delete listWidget->takeItem(i);
- i--;
- }
- }
- QApplication::processEvents(); //make sure the scrollbar is up to date after removals
- scrollpercent = listWidget->horizontalScrollBar()->value()/( (double) listWidget->horizontalScrollBar()->maximum());
- }
- } //end check for CDIR reload
- //Now fill the display widget
- bool hasimages, hasmultimedia;
- hasimages = hasmultimedia = false;
- int numdirs = 0;
- qint64 filebytes = 0;
- //Setup the timer to see when we should process events
- /*QTimer updatetime;
- updatetime.setInterval(1000); //1 second updates
- updatetime.setSingleShot(true);
- updatetime.start();*/
- QTime updatetime = QTime::currentTime().addMSecs(500);
- if(DEBUG){ qDebug() << "Start Loop over items:" << time.elapsed(); }
- for(int i=0; i<list.length(); i++){
- if(stopload){ ui->actionStopLoad->setVisible(false); return; } //stop right now
- if(!hasimages && list[i].isImage()){ hasimages = true; ui->tool_goToImages->setVisible(true); }
- else if(!hasmultimedia && list[i].isAVFile()){ hasmultimedia = true; ui->tool_goToPlayer->setVisible(true); }
- //Update statistics
- if(list[i].isDir()){ numdirs++; }
- else{ filebytes += list[i].size(); }
- watcher->addPath(list[i].absoluteFilePath());
- if(showDetails){
- //Now create all the individual items for the details tree
- CQTreeWidgetItem *it;
- bool addnew = false;
- //See if an item already exists for this file
- QList<QTreeWidgetItem*> items = treeWidget->findItems(list[i].fileName(),Qt::MatchExactly,0); //NOTE: This requires column 0 to be the name
- if(items.isEmpty()){
- it = new CQTreeWidgetItem();
- addnew = true;
- }else{
- // Safe downcasting because CQTreeWidgetItem only redefines the virtual function bool opearot<. Not new methos added.
- it = static_cast<CQTreeWidgetItem *> (items.first());
- }
- //Now update the entry contents
- it->setWhatsThis(0, QString(canmodify ? "cut": "copy")+"::::"+list[i].absoluteFilePath());
- for(int t=0; t<listDetails.length(); t++){
- switch(listDetails[t]){
- case NAME:
- it->setText(t,list[i].fileName());
- it->setStatusTip(t, list[i].fileName());
- //Since the icon/image is based on the filename - only update this for a new item
- // (This is the slowest part of the routine)
- if(list[i].isImage()&& (addnew || updateThumbs)){
- if(showThumbs){
- it->setIcon(t, LXDG::findIcon("fileview-preview","image-x-generic") );
- needThumbs << list[i].absoluteFilePath();
- }else{ it->setIcon(t, LXDG::findIcon(list[i].iconfile(),"image-x-generic") ); }
- }else if(addnew){
- it->setIcon(t, LXDG::findIcon(list[i].iconfile(),"unknown") );
- }
- break;
- case SIZE:
- if(!list[i].isDir()){
- it->setText(t, LUtils::BytesToDisplaySize(list[i].size()) );
- }
- break;
- case TYPE:
- it->setText(t, list[i].mimetype());
- break;
- case DATEMOD:
- {
- QStringList datetime_format = getDateFormat();
- // Save datetime in WhatThis value. Lately will be used by CQTreeWidgetItem for sorting by date
- it->setWhatsThis(t, list[i].lastModified().toString("yyyyMMddhhmmsszzz"));
- // Default configurition. Fallback to Qt::DefaultLocaleShortDate for formats
- if(datetime_format.at(0).isEmpty() && datetime_format.at(1).isEmpty())
- it->setText(t, list[i].lastModified().toString(Qt::DefaultLocaleShortDate) );
- // Date is setted but time not. Time goes to default
- else if(!datetime_format.at(0).isEmpty() && datetime_format.at(1).isEmpty())
- it->setText(t, list[i].lastModified().date().toString(datetime_format.at(0)) + " " + list[i].lastModified().time().toString(Qt::DefaultLocaleShortDate));
- // Time is setted but date not. Date goes to default
- else if(datetime_format.at(0).isEmpty() && !datetime_format.at(1).isEmpty())
- it->setText(t, list[i].lastModified().date().toString(Qt::DefaultLocaleShortDate) + " " + list[i].lastModified().time().toString(datetime_format.at(1)));
- // Both time and date setted.
- else
- it->setText(t, list[i].lastModified().date().toString(datetime_format.at(0)) + " " + list[i].lastModified().time().toString(datetime_format.at(1)));
- break;
- }
- case DATECREATE:
- {
- QStringList datetime_format = getDateFormat();
- it->setWhatsThis(DATECREATE, list[i].lastModified().toString("yyyyMMddhhmmsszzz"));
- if(datetime_format.at(0).isEmpty() && datetime_format.at(1).isEmpty())
- it->setText(t, list[i].lastModified().toString(Qt::DefaultLocaleShortDate) );
- else if(!datetime_format.at(0).isEmpty() && datetime_format.at(1).isEmpty())
- it->setText(t, list[i].lastModified().date().toString(datetime_format.at(0)) + " " + list[i].lastModified().time().toString(Qt::DefaultLocaleShortDate));
- else if(datetime_format.at(0).isEmpty() && !datetime_format.at(1).isEmpty())
- it->setText(t, list[i].lastModified().date().toString(Qt::DefaultLocaleShortDate) + " " + list[i].lastModified().time().toString(datetime_format.at(1)));
- else
- it->setText(t, list[i].lastModified().date().toString(datetime_format.at(0)) + " " + list[i].lastModified().time().toString(datetime_format.at(1)));
- break;
- }
- }
- }
- if(addnew){ treeWidget->addTopLevelItem(it); }
- if(tmpSel.contains(list[i].absoluteFilePath())){ it->setSelected(true); }
- if(lastdir == CDIR+"/"+list[i].fileName()){
- treeWidget->setCurrentItem(it);
- treeWidget->scrollToItem(it);
- }
- }else{
- //Create all the individual items for the basic list
- QListWidgetItem *it;
- //See if there is an existing item to re-use
- bool addnew = false;
- QList<QListWidgetItem*> items = listWidget->findItems(list[i].fileName(), Qt::MatchExactly);
- if(items.isEmpty()){
- it = new QListWidgetItem();
- addnew = true;
- }else{ it = items.first(); }
-
- it->setWhatsThis( QString(canmodify ? "cut": "copy")+"::::"+list[i].absoluteFilePath()); //used for drag and drop
- it->setText(list[i].fileName());
- it->setStatusTip(list[i].fileName());
- //Since the icon/image is based on the filename - only update this for a new items (non-thumbnail)
- // (This is the slowest part of the routine)
- if(list[i].isImage() && (addnew || updateThumbs) ){
- if(showThumbs){
- it->setIcon(LXDG::findIcon("fileview-preview","image-x-generic") );
- needThumbs << list[i].absoluteFilePath();
- }else{ it->setIcon(LXDG::findIcon(list[i].iconfile(),"image-x-generic") ); }
- }else if(addnew){
- it->setIcon(LXDG::findIcon(list[i].iconfile(),"unknown") );
- }
- listWidget->addItem(it);
- if(tmpSel.contains(list[i].absoluteFilePath())){ it->setSelected(true); }
- if(lastdir == CDIR+"/"+list[i].fileName()){
- listWidget->setCurrentItem(it);
- listWidget->scrollToItem(it);
- }
- }
- if(QTime::currentTime() > updatetime){ QApplication::processEvents(); updatetime = QTime::currentTime().addMSecs(500); }//keep the UI snappy while loading a directory
- if(DEBUG){ qDebug() << " - item finished:" << i << time.elapsed(); }
- }
- tmpSel.clear();
- if(DEBUG){ qDebug() << "Done with item loop:" << time.elapsed() << list.length(); }
- ui->actionStopLoad->setVisible(false);
- //Another check to ensure the current item is visible (or return to the same scroll position)
- if(stopload){ return; } //stop right now
- if(scrollpercent<0){
- if(showDetails){
- for(int t=0; t<treeWidget->columnCount(); t++){treeWidget->resizeColumnToContents(t); }
- if(treeWidget->currentItem()!=0){ treeWidget->scrollToItem(treeWidget->currentItem()); }
- }else{
- if(listWidget->currentItem()!=0){ listWidget->scrollToItem(listWidget->currentItem()); }
- }
- }else{
- if(showDetails){
- treeWidget->verticalScrollBar()->setValue( qRound(treeWidget->verticalScrollBar()->maximum()*scrollpercent) );
- }else{
- listWidget->horizontalScrollBar()->setValue( qRound(listWidget->horizontalScrollBar()->maximum()*scrollpercent) );
- }
- }
-
-
- if(stopload){ return; } //stop right now
- if(DEBUG){ qDebug() << "Assemble Status Message:" << time.elapsed(); }
- //Assemble any status message
- QString stats = QString(tr("Capacity: %1")).arg(LOS::FileSystemCapacity(CDIR));
- if(list.length()>0){
- stats.prepend("\t");
- if(numdirs < list.length()){
- //Has Files
- stats.prepend( QString(tr("Files: %1 (%2)")).arg(QString::number(list.length()-numdirs), LUtils::BytesToDisplaySize(filebytes)) );
- }
- if(numdirs > 0){
- //Has Dirs
- if(numdirs<list.length()){ stats.prepend(" / "); }//has files output already
- stats.prepend( QString(tr("Dirs: %1")).arg(QString::number(numdirs)) );
- }
-
- }
- if(stopload){ return; } //stop right now
- if(!canmodify){ stats.prepend(tr("(Limited Access) ")); }
- ui->label_status->setText( stats.simplified() );
- if(DEBUG){ qDebug() << "DONE:" << time.elapsed(); }
- if(showThumbs){ thumbThread = QtConcurrent::run(this, &DirWidget::startLoadThumbs); }
-}
-
-void DirWidget::LoadSnaps(QString basedir, QStringList snaps){
- //Save these value internally for use later
- qDebug() << "ZFS Snapshots available:" << basedir << snaps;
- snapbasedir = basedir;
- snapshots = snaps;
- if(!snapbasedir.isEmpty()){ watcher->addPath(snapbasedir); } //add this to the watcher in case snapshots get created/removed
- //Now update the UI as necessary
- if(ui->tool_snap->menu()==0){
- ui->tool_snap->setMenu(new QMenu(this));
- connect(ui->tool_snap->menu(), SIGNAL(triggered(QAction*)), this, SLOT(direct_snap_selected(QAction*)) );
- }
- ui->tool_snap->menu()->clear();
- for(int i=0; i<snapshots.length(); i++){
- QAction *tmp = ui->tool_snap->menu()->addAction(snapshots[i]);
- tmp->setWhatsThis(snapshots[i]);
- }
- ui->slider_snap->setRange(0, snaps.length());
- if(CDIR.contains(ZSNAPDIR)){
- //The user was already within a snapshot - figure out which one and set the slider appropriately
- int index = snaps.indexOf( CDIR.section(ZSNAPDIR,1,1).section("/",0,0) );
- if(index < 0){ index = snaps.length(); } //unknown - load the system (should never happen)
- ui->slider_snap->setValue(index);
- }else{
- ui->slider_snap->setValue(snaps.length()); //last item (normal system)
- }
- on_slider_snap_valueChanged();
- QApplication::processEvents(); //let the slider changed signal get thrown away before we re-enable the widget
- ui->group_snaps->setEnabled(!snaps.isEmpty());
- ui->group_snaps->setVisible(!snaps.isEmpty());
- ui->tool_snap_newer->setEnabled(ui->slider_snap->value() < ui->slider_snap->maximum());
- ui->tool_snap_older->setEnabled(ui->slider_snap->value() > ui->slider_snap->minimum());
-}
-
-void DirWidget::refresh(){
- if(!CDIR.isEmpty() && ~ID.isEmpty()){
- stopload = true; //just in case it is still loading
- emit LoadDirectory(ID, CDIR);
- }
-}
-
-void DirWidget::refreshButtons(){
- SelectionChanged();
-}
-
-//Theme change functions
-void DirWidget::UpdateIcons(){
- //ui->tool_addNewFile->setIcon( LXDG::findIcon("document-new",""));
- //ui->tool_addToDir->setIcon( LXDG::findIcon("folder-new","") );
-
- //Snapshot buttons
- ui->tool_snap_newer->setIcon(LXDG::findIcon("go-next-view","") );
- ui->tool_snap_older->setIcon(LXDG::findIcon("go-previous-view","") );
- //Bottom-Action Buttons
- ui->tool_goToImages->setIcon( LXDG::findIcon("fileview-preview","") );
- ui->tool_goToPlayer->setIcon( LXDG::findIcon("applications-multimedia","") );
- ui->tool_new_file->setIcon( LXDG::findIcon("document-new","") );
- ui->tool_new_dir->setIcon( LXDG::findIcon("folder-new","") );
- //Side-Action Buttons
- ui->tool_act_run->setIcon( LXDG::findIcon("run-build-file","") );
- ui->tool_act_runwith->setIcon( LXDG::findIcon("run-build-configure","") );
- ui->tool_act_cut->setIcon( LXDG::findIcon("edit-cut","") );
- ui->tool_act_copy->setIcon( LXDG::findIcon("edit-copy","") );
- ui->tool_act_paste->setIcon( LXDG::findIcon("edit-paste","") );
- ui->tool_act_rename->setIcon( LXDG::findIcon("edit-rename","") );
- ui->tool_act_rm->setIcon( LXDG::findIcon("edit-delete","") );
- ui->tool_act_fav->setIcon( LXDG::findIcon("bookmark-toolbar","") );
- //ToolBar Buttons
- ui->actionBack->setIcon( LXDG::findIcon("go-previous","") );
- ui->actionUp->setIcon( LXDG::findIcon("go-up","") );
- ui->actionHome->setIcon( LXDG::findIcon("go-home","") );
- ui->actionStopLoad->setIcon( LXDG::findIcon("dialog-cancel","") );
- ui->actionClose_Browser->setIcon( LXDG::findIcon("dialog-close","") );
-}
-
-void DirWidget::UpdateText(){
- ui->retranslateUi(this);
-}
-
-void DirWidget::UpdateButtons(){
- SelectionChanged();
-}
-
-//Keyboard Shortcuts triggered
-void DirWidget::TryRenameSelection(){
- on_tool_act_rename_clicked();
-}
-
-void DirWidget::TryCutSelection(){
- on_tool_act_cut_clicked();
-}
-
-void DirWidget::TryCopySelection(){
- on_tool_act_copy_clicked();
-}
-
-void DirWidget::TryPasteSelection(){
- on_tool_act_paste_clicked();
-}
-
-void DirWidget::TryDeleteSelection(){
- on_tool_act_rm_clicked();
-}
-
-// =================
-// PRIVATE
-// =================
-void DirWidget::setupConnections(){
- //Info routines
- connect(treeWidget, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(OpenContextMenu()) );
- connect(listWidget, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(OpenContextMenu()) );
- connect(treeWidget, SIGNAL(itemSelectionChanged()), this, SLOT(SelectionChanged()) );
- connect(listWidget, SIGNAL(itemSelectionChanged()), this, SLOT(SelectionChanged()) );
-
- //Activation routines
- connect(treeWidget, SIGNAL(itemActivated(QTreeWidgetItem*,int)), this, SLOT(on_tool_act_run_clicked()) );
- connect(treeWidget, SIGNAL(DataDropped(QString, QStringList)), this, SIGNAL(PasteFiles(QString, QStringList)) );
- connect(listWidget, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(on_tool_act_run_clicked()) );
- connect(listWidget, SIGNAL(DataDropped(QString, QStringList)), this, SIGNAL(PasteFiles(QString, QStringList)) );
- connect(line_dir, SIGNAL(returnPressed()), this, SLOT(dir_changed()) );
-
- //Keyboard Shortcuts
- /*connect(copyFilesShort, SIGNAL(activated()), this, SLOT( on_tool_act_copy_clicked() ) );
- connect(cutFilesShort, SIGNAL(activated()), this, SLOT( on_tool_act_cut_clicked() ) );
- connect(pasteFilesShort, SIGNAL(activated()), this, SLOT( on_tool_act_paste_clicked() ) );
- connect(deleteFilesShort, SIGNAL(activated()), this, SLOT( on_tool_act_rm_clicked() ) );*/
-
- //Filesystem Watcher
- connect(watcher, SIGNAL(directoryChanged(const QString&)), this, SLOT(startSync(const QString &)) );
- connect(watcher, SIGNAL(fileChanged(const QString&)), this, SLOT(startSync(const QString &)) ); //just in case
- connect(synctimer, SIGNAL(timeout()), this, SLOT(refresh()) );
-
- //Thumbnail loader
- connect(this, SIGNAL(ThumbLoaded(QString, QIcon)), this, SLOT(showThumb(QString, QIcon)) );
-}
-
-QStringList DirWidget::currentSelection(){
- QStringList out;
- if(showDetails){
- QList<QTreeWidgetItem*> sel = treeWidget->selectedItems();
- for(int i=0; i<sel.length(); i++){
- out << sel[i]->whatsThis(0).section("::::",1,100); //absolute file path
- }
- }else{
- QList<QListWidgetItem*> sel = listWidget->selectedItems();
- for(int i=0; i<sel.length(); i++){
- out << sel[i]->whatsThis().section("::::",1,100); //absolute file path
- }
- }
- out.removeDuplicates();
- return out;
-}
-
-// =================
-// PRIVATE SLOTS
-// =================
-void DirWidget::startLoadThumbs(){
- //This just runs through the dir and loads all the thumbnails as needed
- if(DEBUG){ qDebug() << "Start Loading Thumbnails:" << needThumbs; }
- if(needThumbs.isEmpty()){ return; }
- needThumbs.removeDuplicates(); //just in case
- //QTime updatetime = QTime::currentTime().addMSecs(500);
- while(!needThumbs.isEmpty() && !stopload){
- QString file = needThumbs.takeFirst();
- QIcon ico(QPixmap(file).scaled(listWidget->iconSize(),Qt::IgnoreAspectRatio, Qt::FastTransformation) );
- emit ThumbLoaded(file, ico);
- }
-}
-
-void DirWidget::showThumb(QString file, QIcon ico){
- if(showDetails){
- //Use the tree widget
- QList<QTreeWidgetItem*> items = treeWidget->findItems(file.section("/",-1), Qt::MatchExactly);
- if(items.isEmpty() || stopload){ return; } //invalid item for some reason
- QTreeWidgetItem *it = items.first();
- it->setIcon(0, ico );
- }else{
- //Use the list widget
- QList<QListWidgetItem*> items = listWidget->findItems(file.section("/",-1), Qt::MatchExactly);
- if(items.isEmpty() || stopload){ return; } //invalid item for some reason
- if(stopload){ return; } //stop right now
- QListWidgetItem *it = items.first();
- it->setIcon(ico);
- }
-}
-
-//UI BUTTONS
-// -- Left Action Buttons
-void DirWidget::on_tool_act_cut_clicked(){
- QStringList sel = currentSelection();
- qDebug() << "Cutting Items to clipboard:" << sel;
- if(sel.isEmpty()){ return; }
- emit CutFiles(sel);
-}
-
-void DirWidget::on_tool_act_copy_clicked(){
- QStringList sel = currentSelection();
- if(sel.isEmpty()){ return; }
- qDebug() << "Copying Items to clipboard:" << sel;
- emit CopyFiles(sel);
-}
-
-void DirWidget::on_tool_act_fav_clicked(){
- QStringList sel = currentSelection();
- if(sel.isEmpty()){ return; }
-
- emit FavoriteFiles(sel);
-}
-
-void DirWidget::on_tool_act_paste_clicked(){
- qDebug() << "Pasting Items from clipboard:" << CDIR;
- emit PasteFiles(CDIR, QStringList()); //use the clipboard for pasting
-}
-
-void DirWidget::on_tool_act_rename_clicked(){
- QStringList sel = currentSelection();
- if(sel.isEmpty()){ return; }
- emit RenameFiles(sel);
-}
-
-void DirWidget::on_tool_act_rm_clicked(){
- QStringList sel = currentSelection();
- if(sel.isEmpty()){ return; }
- qDebug() << "Deleting selected Items:" << sel;
- emit RemoveFiles(sel);
-}
-
-void DirWidget::on_tool_act_run_clicked(){
- QStringList sel = currentSelection();
- if(sel.isEmpty()){ return; }
- QStringList dirs;
- for(int i=0; i<sel.length(); i++){
- if(QFileInfo(sel[i]).isDir()){
- dirs << sel[i];
- }else{
- QProcess::startDetached("lumina-open \""+sel[i]+"\"");
- }
- }
- if(!dirs.isEmpty()){
- stopload = true; //just in case it is still loading
- emit LoadDirectory(ID, dirs.takeFirst()); //load the first directory in this widget
- }
- if(!dirs.isEmpty()){
- emit OpenDirectories(dirs);
- }
-}
-
-void DirWidget::on_tool_act_runwith_clicked(){
- QStringList sel = currentSelection();
- if(sel.isEmpty()){ return; }
- for(int i=0; i<sel.length(); i++){
- QProcess::startDetached("lumina-open -select \""+sel[i]+"\""); //use absolute paths
- }
-}
-
-// -- Bottom Action Buttons
-void DirWidget::on_tool_goToImages_clicked(){
- QStringList sel = currentSelection();
- if(sel.isEmpty()){ emit ViewFiles(CLIST); }
- else{
- //Just use the files from the current selection
- LFileInfoList list;
- for(int i=0; i<CLIST.length(); i++){
- if(CLIST[i].isImage() && sel.contains(CLIST[i].absoluteFilePath()) ){
- list << CLIST[i]; //add to the list
- }
- }
- if(!list.isEmpty()){ emit ViewFiles(list); }
- else{ emit ViewFiles(CLIST); } //invalid file(s) selected - just do everything
- }
-}
-
-void DirWidget::on_tool_goToPlayer_clicked(){
- QStringList sel = currentSelection();
- if(sel.isEmpty()){ emit PlayFiles(CLIST); }
- else{
- //Just use the files from the current selection
- LFileInfoList list;
- for(int i=0; i<CLIST.length(); i++){
- if(CLIST[i].isAVFile() && sel.contains(CLIST[i].absoluteFilePath()) ){
- list << CLIST[i]; //add to the list
- }
- }
- if(!list.isEmpty()){ emit PlayFiles(list); }
- else{ emit PlayFiles(CLIST); } //invalid file(s) selected - just do everything
- }
-}
-
-void DirWidget::on_tool_new_file_clicked(){
- if(!canmodify){ return; } //cannot create anything here
- //Prompt for the new filename
- bool ok = false;
- QString newdocument = QInputDialog::getText(this, tr("New Document"), tr("Name:"), QLineEdit::Normal, "", \
- &ok, 0, Qt::ImhFormattedNumbersOnly | Qt::ImhUppercaseOnly | Qt::ImhLowercaseOnly);
- if(!ok || newdocument.isEmpty()){ return; }
- //Create the empty file
- QString full = CDIR;
- if(!full.endsWith("/")){ full.append("/"); }
- QFile file(full+newdocument);
- if(file.open(QIODevice::ReadWrite)){
- //If successfully opened, it has created a blank file
- file.close();
- }else{
- QMessageBox::warning(this, tr("Error Creating Document"), tr("The document could not be created. Please ensure that you have the proper permissions."));
- }
- //just in case the watcher does not work for this filesystem -queue up a sync
- if(!synctimer->isActive()){ synctimer->start(); }
-}
-
-void DirWidget::on_tool_new_dir_clicked(){
- if(!canmodify){ return; } //cannot create anything here
- //Prompt for the new dir name
- bool ok = false;
- QString newdir = QInputDialog::getText(this, tr("New Directory"), tr("Name:"), QLineEdit::Normal, "", \
- &ok, 0, Qt::ImhFormattedNumbersOnly | Qt::ImhUppercaseOnly | Qt::ImhLowercaseOnly);
- if(!ok || newdir.isEmpty()){ return; }
- //Now create the new dir
- QString full = CDIR;
- if(!full.endsWith("/")){ full.append("/"); }
- QDir dir(full); //open the current dir
- full.append(newdir); //append the new name to the current dir
- //Verify that the new dir does not already exist
- if(dir.exists(full)){
- QMessageBox::warning(this, tr("Invalid Name"), tr("A file or directory with that name already exists! Please pick a different name."));
- QTimer::singleShot(0,this, SLOT(on_tool_addToDir_clicked()) ); //repeat this function
- }else{
- if(!dir.mkdir(newdir) ){
- QMessageBox::warning(this, tr("Error Creating Directory"), tr("The directory could not be created. Please ensure that you have the proper permissions to modify the current directory."));
- }
- }
- //just in case the watcher does not work for this filesystem -queue up a sync
- if(!synctimer->isActive()){ synctimer->start(); }
-}
-
-// -- Top Snapshot Buttons
-void DirWidget::on_tool_snap_newer_clicked(){
- ui->slider_snap->setValue( ui->slider_snap->value()+1 );
-}
-
-void DirWidget::on_tool_snap_older_clicked(){
- ui->slider_snap->setValue( ui->slider_snap->value()-1 );
-}
-
-void DirWidget::on_slider_snap_valueChanged(int val){
- bool labelsonly = false;
- if(val==-1){ val = ui->slider_snap->value(); labelsonly=true; }
- //Update the snapshot interface
- ui->tool_snap_newer->setEnabled(val < ui->slider_snap->maximum());
- ui->tool_snap_older->setEnabled(val > ui->slider_snap->minimum());
- if(val >= snapshots.length() || val < 0){
- ui->tool_snap->setText(tr("Current"));
- }else if(QFile::exists(snapbasedir+snapshots[val])){
- ui->tool_snap->setText( QFileInfo(snapbasedir+snapshots[val]).lastModified().toString(Qt::DefaultLocaleShortDate) );
- }
- //Exit if a non-interactive snapshot change
- if(!ui->group_snaps->isEnabled() || labelsonly){ return; } //internal change - do not try to change the actual info
- //Determine which snapshot is now selected
- QString dir;
- if(DEBUG){ qDebug() << "Changing snapshot:" << CDIR << val << snapbasedir; }
- stopload = true; //stop any currently-loading procedures
- if(val >= snapshots.length() || val < 0){ //active system selected
- if(DEBUG){ qDebug() << " - Load Active system:" << normalbasedir; }
- dir = normalbasedir;
- }else{
- dir = snapbasedir+snapshots[val]+"/";
- if(!QFile::exists(dir)){
- //This snapshot must have been removed in the background by pruning tools
- // move to a newer snapshot or the current base dir as necessary
- qDebug() << "Snapshot no longer available:" << dir;
- qDebug() << " - Reloading available snapshots";
- emit findSnaps(ID, normalbasedir);
- return;
- }
- //if(snaprelpath.isEmpty()){
- //Need to figure out the relative path within the snapshot
- snaprelpath = normalbasedir.section(snapbasedir.section(ZSNAPDIR,0,0), 1,1000);
- if(DEBUG){ qDebug() << " - new snapshot-relative path:" << snaprelpath; }
- //}
- dir.append(snaprelpath);
- dir.replace("//","/"); //just in case any duplicate slashes from all the split/combining
- if(DEBUG){ qDebug() << " - Load Snapshot:" << dir; }
- }
- //Make sure this directory exists, and back up as necessary
- if(dir.isEmpty()){ return; }
- //Load the newly selected snapshot
- stopload = true; //just in case it is still loading
- emit LoadDirectory(ID, dir);
-}
-
-void DirWidget::direct_snap_selected(QAction *act){
- QString snap = act->whatsThis();
- int val = snapshots.indexOf(snap);
- if(val<0){ return; }
- else{ ui->slider_snap->setValue(val); }
-}
-
-//Top Toolbar buttons
-void DirWidget::on_actionBack_triggered(){
- if(history.isEmpty()){ return; } //cannot do anything
- QString dir = history.takeLast();
- //qDebug() << "Go Back:" << dir << normalbasedir << history.last();
- if(dir == normalbasedir){
- dir = history.takeLast();
- }
- stopload = true; //just in case it is still loading
- emit LoadDirectory(ID, dir);
-}
-
-void DirWidget::on_actionUp_triggered(){
- QString dir = CDIR.section("/",0,-2);
- if(dir.isEmpty())
- dir = "/";
- //Quick check to ensure the directory exists
- while(!QFile::exists(dir) && !dir.isEmpty()){
- dir = dir.section("/",0,-2); //back up one additional dir
- }
- stopload = true; //just in case it is still loading
- emit LoadDirectory(ID, dir);
-}
-
-void DirWidget::on_actionHome_triggered(){
- stopload = true; //just in case it is still loading
- emit LoadDirectory(ID, QDir::homePath());
-}
-
-void DirWidget::on_actionStopLoad_triggered(){
- stopload = true;
- ui->actionStopLoad->setVisible(false);
-}
-
-void DirWidget::dir_changed(){
- QString dir = line_dir->text().simplified();
- //Run the dir through the user-input checks
- dir = LUtils::PathToAbsolute(dir);
- qDebug() << "Dir:" << dir;
- //Quick check to ensure the directory exists
- while(!QFile::exists(dir) && !dir.isEmpty()){
- dir = dir.section("/",0,-2); //back up one additional dir
- }
- qDebug() << " - Now Dir:" << dir;
- stopload = true; //just in case it is still loading
- emit LoadDirectory(ID, dir);
-}
-
-void DirWidget::on_actionClose_Browser_triggered(){
- emit CloseBrowser(ID);
-}
-
-// - Other Actions without a specific button on the side
-void DirWidget::fileCheckSums(){
- QStringList files = currentSelection();
- if(files.isEmpty()){ return; }
- qDebug() << "Run Checksums:" << files;
- QStringList info = LOS::Checksums(files);
- qDebug() << " - Info:" << info;
- if(info.isEmpty() || (info.length() != files.length()) ){ return; }
- for(int i=0; i<info.length(); i++){
- info[i] = QString("%2\n\t(%1)").arg(files[i].section("/",-1), info[i]);
- }
- ScrollDialog dlg(this);
- dlg.setWindowTitle( tr("File Checksums:") );
- dlg.setWindowIcon( LXDG::findIcon("document-encrypted","") );
- dlg.setText(info.join("\n"));
- dlg.exec();
- /*QMessageBox dlg(this);
- dlg.setWindowFlags( Qt::Dialog );
- dlg.setWindowTitle( tr("File Checksums") );
- dlg.setDetailedText(info.join("\n"));
- dlg.exec();*/
- //QMessageBox::information(this, tr("File Checksums"), info.join("\n") );
-}
-
-void DirWidget::fileProperties(){
- QStringList sel = currentSelection();
- if(sel.isEmpty()){ return; }
- if(!LUtils::isValidBinary("lumina-fileinfo")){
- //It should never get to this point due to checks earlier - but just in case...
- QMessageBox::warning(this, tr("Missing Utility"), tr("The \"lumina-fileinfo\" utility could not be found on the system. Please install it first.") );
- return;
- }
- for(int i=0; i<sel.length(); i++){
- QProcess::startDetached("lumina-fileinfo \""+sel[i]+"\""); //use absolute paths
- }
-}
-
-void DirWidget::openTerminal(){
- emit LaunchTerminal(CDIR);
-}
-
-//Browser Functions
-void DirWidget::OpenContextMenu(){
- //First generate the context menu based on the selection
- QStringList sel = currentSelection();
- contextMenu->clear();
- if(!sel.isEmpty()){
- contextMenu->addAction(LXDG::findIcon("run-build-file",""), tr("Open"), this, SLOT(on_tool_act_run_clicked()) );
- contextMenu->addAction(LXDG::findIcon("run-build-configure",""), tr("Open With..."), this, SLOT(on_tool_act_runwith_clicked()) );
-
- contextMenu->addAction(LXDG::findIcon("edit-rename",""), tr("Rename..."), this, SLOT(on_tool_act_rename_clicked()) )->setEnabled(canmodify);
- contextMenu->addAction(LXDG::findIcon("document-encrypted",""), tr("View Checksums..."), this, SLOT(fileCheckSums()) );
- contextMenu->addSeparator();
- }
- //Now add the general selection options
- contextMenu->addAction(LXDG::findIcon("edit-cut",""), tr("Cut Selection"), this, SLOT(on_tool_act_cut_clicked()) )->setEnabled(canmodify && !sel.isEmpty());
- contextMenu->addAction(LXDG::findIcon("edit-copy",""), tr("Copy Selection"), this, SLOT(on_tool_act_copy_clicked()) )->setEnabled(!sel.isEmpty());
- contextMenu->addAction(LXDG::findIcon("edit-paste",""), tr("Paste"), this, SLOT(on_tool_act_paste_clicked()) )->setEnabled(QApplication::clipboard()->mimeData()->hasFormat("x-special/lumina-copied-files") && canmodify);
- contextMenu->addSeparator();
- contextMenu->addAction(LXDG::findIcon("edit-delete",""), tr("Delete Selection"), this, SLOT(on_tool_act_rm_clicked()) )->setEnabled(canmodify&&!sel.isEmpty());
- if(LUtils::isValidBinary("lumina-fileinfo")){
- contextMenu->addSeparator();
- contextMenu->addAction(LXDG::findIcon("edit-find-replace",""), tr("File Properties..."), this, SLOT(fileProperties()) )->setEnabled(!sel.isEmpty());
- }
- contextMenu->addSeparator();
- contextMenu->addAction(LXDG::findIcon("system-search",""), tr("Open Terminal here"), this, SLOT(openTerminal()));
-
- //Now open the menu at the current cursor location
- contextMenu->popup(QCursor::pos());
-}
-
-void DirWidget::SelectionChanged(){
- //Go through and enable/disable the buttons as necessary
- bool hasselection = !currentSelection().isEmpty();
- ui->tool_act_copy->setEnabled(hasselection);
- ui->tool_act_cut->setEnabled(hasselection && canmodify);
- ui->tool_act_fav->setEnabled(hasselection);
- ui->tool_act_paste->setEnabled(canmodify && QApplication::clipboard()->mimeData()->hasFormat("x-special/lumina-copied-files") );
- ui->tool_act_rename->setEnabled(hasselection && canmodify);
- ui->tool_act_rm->setEnabled(hasselection && canmodify);
- ui->tool_act_run->setEnabled(hasselection);
- ui->tool_act_runwith->setEnabled(hasselection);
-}
-
-void DirWidget::startSync(const QString &file){
- //Update date_format based on user settings
- if(file == sessionsettings_config_file){ setDateFormat(); }
- else if(file == snapbasedir){ emit findSnaps(ID, normalbasedir); } //snapshot list changed
- else if(file == normalbasedir){
- if(synctimer->isActive()){ synctimer->stop(); } //already starting a sync - restart the timer
- synctimer->start();
- }else{
- //Some file in the directory got changed - start the time for a dir reload
- // -- This prevents a directory from refreshing constantly if a file within the directory is changing all the time (such as a log file)
- if(!synctimer->isActive()){ synctimer->start(); }
- }
-}
-
-//====================
-// PROTECTED
-//====================
-void DirWidget::mouseReleaseEvent(QMouseEvent *ev){
- static Qt::MouseButtons backmap = Qt::BackButton | Qt::ExtraButton5;
- //qDebug() << "Mouse Click:" << ev->button();
- if(backmap.testFlag(ev->button())){
- ev->accept();
- on_actionBack_triggered();
- //}else if(ev->button()==Qt::ForwardButton()){
- //ev->accept();
- }else{
- ev->ignore(); //not handled here
- }
-}
diff --git a/src-qt5/desktop-utils/lumina-fm/widgets/DirWidget.h b/src-qt5/desktop-utils/lumina-fm/widgets/DirWidget.h
deleted file mode 100644
index fecd6180..00000000
--- a/src-qt5/desktop-utils/lumina-fm/widgets/DirWidget.h
+++ /dev/null
@@ -1,184 +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_FM_DIRECTORY_BROWSER_WIDGET_H
-#define _LUMINA_FM_DIRECTORY_BROWSER_WIDGET_H
-
-#include <QList>
-#include <QWidget>
-#include <QObject>
-#include <QMenu>
-#include <QToolBar>
-#include <QLineEdit>
-#include <QShortcut>
-#include <QFileSystemWatcher>
-#include <QTimer>
-#include <QFuture>
-
-#include "../DirData.h"
-#include "DDListWidgets.h"
-
-#define ZSNAPDIR QString("/.zfs/snapshot/")
-
-namespace Ui{
- class DirWidget;
-};
-
-class DirWidget : public QWidget{
- Q_OBJECT
-public:
- enum DETAILTYPES{ NAME, SIZE, TYPE, DATEMOD, DATECREATE};
- DirWidget(QString objID, QWidget *parent = 0); //needs a unique ID (to distinguish from other DirWidgets)
- ~DirWidget();
-
- void cleanup(); //called before the browser is closed down
-
- //Directory Managment
- void ChangeDir(QString dirpath);
- void setDirCompleter(QCompleter *comp);
-
- //Information
- QString id();
- QString currentDir();
-
- //View Settings
- void setShowDetails(bool show);
- void setShowSidebar(bool show);
- void setShowThumbnails(bool show);
- void setDetails(QList<DETAILTYPES> list); //Which details to show and in which order (L->R)
- void setThumbnailSize(int px);
- void setShowCloseButton(bool show);
- void setFocusLineDir();
-
- //Date format for show items
- QStringList getDateFormat();
- void setDateFormat();
-
-public slots:
- void LoadDir(QString dir, LFileInfoList list);
- void LoadSnaps(QString basedir, QStringList snaps);
-
- //Refresh options
- void refresh(); //Refresh current directory
- void refreshButtons(); //Refresh action buttons only
-
- //Theme change functions
- void UpdateIcons();
- void UpdateText();
-
- //Button updates
- void UpdateButtons();
-
- //Keyboard Shortcuts triggered
- void TryRenameSelection();
- void TryCutSelection();
- void TryCopySelection();
- void TryPasteSelection();
- void TryDeleteSelection();
-
-private:
- Ui::DirWidget *ui;
- QString ID, CDIR; //unique ID assigned by the parent and the current dir path
- LFileInfoList CLIST; //current item list (snap or not)
- QString normalbasedir, snapbasedir, snaprelpath; //for maintaining directory context while moving between snapshots
- QStringList snapshots, needThumbs, tmpSel;
- bool showDetails, showThumbs, canmodify, stopload; //which widget to use for showing items
- QList<DETAILTYPES> listDetails;
- QMenu *contextMenu;
- QFuture<void> thumbThread;
- //The Toolbar and associated items
- QToolBar *toolbar;
- QLineEdit *line_dir;
- QStringList history;
- //The drag and drop brower widgets
- DDListWidget *listWidget;
- DDTreeWidget *treeWidget;
-
- //Keyboard Shortcuts
- //QShortcut *copyFilesShort, *cutFilesShort, *pasteFilesShort, *deleteFilesShort;
- //Watcher to determine when the dir changes
- QFileSystemWatcher *watcher;
- QTimer *synctimer;
-
- //Functions for internal use
- void setupConnections();
- QStringList currentSelection();
- QStringList date_format;
-
-private slots:
- //Internal loading of thumbnails
- void startLoadThumbs();
- void showThumb(QString file, QIcon ico);
-
- //UI BUTTONS/Actions
- // -- Left Action Buttons
- void on_tool_act_copy_clicked();
- void on_tool_act_cut_clicked();
- void on_tool_act_fav_clicked();
- void on_tool_act_paste_clicked();
- void on_tool_act_rename_clicked();
- void on_tool_act_rm_clicked();
- void on_tool_act_run_clicked();
- void on_tool_act_runwith_clicked();
- // -- Bottom Action Buttons
- void on_tool_goToImages_clicked();
- void on_tool_goToPlayer_clicked();
- void on_tool_new_file_clicked();
- void on_tool_new_dir_clicked();
- // -- Top Snapshot Buttons
- void on_tool_snap_newer_clicked();
- void on_tool_snap_older_clicked();
- void on_slider_snap_valueChanged(int val = -1);
- void direct_snap_selected(QAction*);
-
- //Top Toolbar buttons
- void on_actionBack_triggered();
- void on_actionUp_triggered();
- void on_actionHome_triggered();
- void on_actionStopLoad_triggered();
- void dir_changed(); //user manually changed the directory
- void on_actionClose_Browser_triggered();
-
- // - Other Actions without a specific button on the side
- void fileCheckSums();
- void fileProperties();
- void openTerminal();
-
-
- //Browser Functions
- void OpenContextMenu();
- void SelectionChanged();
- void startSync(const QString &file); //used internally to collect/pause before updating the dir
-
-signals:
- //Directory loading/finding signals
- void OpenDirectories(QStringList); //Directories to open in other tabs/columns
- void LoadDirectory(QString, QString); //ID, dirpath (Directory to load here)
- void findSnaps(QString, QString); //ID, dirpath (Request snapshot information for a directory)
- void CloseBrowser(QString); //ID (Request that this browser be closed)
-
- //External App/Widget launching
- void PlayFiles(LFileInfoList); //open in multimedia player
- void ViewFiles(LFileInfoList); //open in slideshow
- void LaunchTerminal(QString); //dirpath
-
- //System Interactions
- void CutFiles(QStringList); //file selection
- void CopyFiles(QStringList); //file selection
- void PasteFiles(QString, QStringList); //current dir
- void FavoriteFiles(QStringList); //file selection
- void RenameFiles(QStringList); //file selection
- void RemoveFiles(QStringList); //file selection
-
- //Internal thumbnail loading system (multi-threaded)
- void ThumbLoaded(QString, QIcon);
-
-protected:
- void mouseReleaseEvent(QMouseEvent *);
-
-};
-
-#endif
diff --git a/src-qt5/desktop-utils/lumina-fm/widgets/DirWidget.ui b/src-qt5/desktop-utils/lumina-fm/widgets/DirWidget.ui
deleted file mode 100644
index c5bf12c3..00000000
--- a/src-qt5/desktop-utils/lumina-fm/widgets/DirWidget.ui
+++ /dev/null
@@ -1,527 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>DirWidget</class>
- <widget class="QWidget" name="DirWidget">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>400</width>
- <height>350</height>
- </rect>
- </property>
- <property name="minimumSize">
- <size>
- <width>350</width>
- <height>0</height>
- </size>
- </property>
- <property name="windowTitle">
- <string>Form</string>
- </property>
- <layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0" columnstretch="0,1">
- <property name="leftMargin">
- <number>0</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>0</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <property name="horizontalSpacing">
- <number>1</number>
- </property>
- <property name="verticalSpacing">
- <number>2</number>
- </property>
- <item row="0" column="0" rowspan="2" colspan="2">
- <layout class="QHBoxLayout" name="toolbar_layout"/>
- </item>
- <item row="3" column="0" colspan="2">
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <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_new_file">
- <property name="statusTip">
- <string>Create a new file</string>
- </property>
- <property name="text">
- <string>New File</string>
- </property>
- <property name="toolButtonStyle">
- <enum>Qt::ToolButtonTextBesideIcon</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="tool_new_dir">
- <property name="statusTip">
- <string>Create a new directory</string>
- </property>
- <property name="text">
- <string>New Dir</string>
- </property>
- <property name="toolButtonStyle">
- <enum>Qt::ToolButtonTextBesideIcon</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="tool_goToImages">
- <property name="statusTip">
- <string>Add selected images to slideshow</string>
- </property>
- <property name="text">
- <string>Slideshow</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_goToPlayer">
- <property name="statusTip">
- <string>Enqueue selection in multimedia player</string>
- </property>
- <property name="text">
- <string>Play</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="QLabel" name="label_status">
- <property name="text">
- <string notr="true">Status</string>
- </property>
- <property name="wordWrap">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="2" column="1">
- <layout class="QVBoxLayout" name="browser_layout">
- <property name="spacing">
- <number>1</number>
- </property>
- <item>
- <widget class="QFrame" name="group_snaps">
- <layout class="QHBoxLayout" name="horizontalLayout_3">
- <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="QToolButton" name="tool_snap">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="styleSheet">
- <string notr="true">padding-right: 5px;</string>
- </property>
- <property name="text">
- <string notr="true"/>
- </property>
- <property name="popupMode">
- <enum>QToolButton::InstantPopup</enum>
- </property>
- <property name="toolButtonStyle">
- <enum>Qt::ToolButtonTextOnly</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QSlider" name="slider_snap">
- <property name="minimum">
- <number>1</number>
- </property>
- <property name="value">
- <number>1</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="invertedAppearance">
- <bool>false</bool>
- </property>
- <property name="invertedControls">
- <bool>false</bool>
- </property>
- <property name="tickPosition">
- <enum>QSlider::TicksAbove</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="tool_snap_older">
- <property name="text">
- <string notr="true">...</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="tool_snap_newer">
- <property name="text">
- <string notr="true">...</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </item>
- <item row="2" column="0">
- <widget class="QFrame" name="group_actions">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <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_act_run">
- <property name="toolTip">
- <string>Open item</string>
- </property>
- <property name="statusTip">
- <string>Open item</string>
- </property>
- <property name="text">
- <string notr="true"/>
- </property>
- <property name="iconSize">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- <property name="toolButtonStyle">
- <enum>Qt::ToolButtonIconOnly</enum>
- </property>
- <property name="autoRaise">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="tool_act_runwith">
- <property name="toolTip">
- <string>Open item (select application)</string>
- </property>
- <property name="statusTip">
- <string>Open item (select application)</string>
- </property>
- <property name="text">
- <string notr="true"/>
- </property>
- <property name="iconSize">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- <property name="autoRaise">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="Line" name="line_5">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="tool_act_fav">
- <property name="toolTip">
- <string>Add item to personal favorites</string>
- </property>
- <property name="statusTip">
- <string>Add item to personal favorites</string>
- </property>
- <property name="text">
- <string notr="true"/>
- </property>
- <property name="iconSize">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- <property name="autoRaise">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="tool_act_rename">
- <property name="toolTip">
- <string>Rename item</string>
- </property>
- <property name="statusTip">
- <string>Rename item</string>
- </property>
- <property name="text">
- <string notr="true"/>
- </property>
- <property name="iconSize">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- <property name="autoRaise">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="Line" name="line_7">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="tool_act_cut">
- <property name="toolTip">
- <string>Cut items</string>
- </property>
- <property name="statusTip">
- <string>Cut items (add to the clipboard)</string>
- </property>
- <property name="text">
- <string notr="true"/>
- </property>
- <property name="iconSize">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- <property name="autoRaise">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="tool_act_copy">
- <property name="toolTip">
- <string>Copy items</string>
- </property>
- <property name="statusTip">
- <string>Copy items to the clipboard</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="iconSize">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- <property name="autoRaise">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="tool_act_paste">
- <property name="toolTip">
- <string>Paste items from clipboard</string>
- </property>
- <property name="statusTip">
- <string>Paste items from clipboard</string>
- </property>
- <property name="text">
- <string notr="true"/>
- </property>
- <property name="iconSize">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- <property name="autoRaise">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="Line" name="line_6">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="tool_act_rm">
- <property name="toolTip">
- <string>Delete Items</string>
- </property>
- <property name="statusTip">
- <string>Delete Items</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="iconSize">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- <property name="autoRaise">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- <action name="actionBack">
- <property name="text">
- <string notr="true">Back</string>
- </property>
- <property name="iconText">
- <string>Back</string>
- </property>
- <property name="toolTip">
- <string>Go back to previous directory</string>
- </property>
- <property name="statusTip">
- <string>Go back to previous directory</string>
- </property>
- </action>
- <action name="actionUp">
- <property name="text">
- <string notr="true">Up</string>
- </property>
- <property name="iconText">
- <string>Up</string>
- </property>
- <property name="toolTip">
- <string>Go to parent directory</string>
- </property>
- <property name="statusTip">
- <string>Go to parent directory</string>
- </property>
- </action>
- <action name="actionHome">
- <property name="text">
- <string notr="true">Home</string>
- </property>
- <property name="iconText">
- <string>Home</string>
- </property>
- <property name="toolTip">
- <string>Go to home directory</string>
- </property>
- <property name="statusTip">
- <string>Go to home directory</string>
- </property>
- </action>
- <action name="actionStopLoad">
- <property name="text">
- <string notr="true"/>
- </property>
- <property name="statusTip">
- <string>Stop loading the directory</string>
- </property>
- </action>
- <action name="actionClose_Browser">
- <property name="text">
- <string notr="true">Close Browser</string>
- </property>
- <property name="iconText">
- <string notr="true">Close Browser</string>
- </property>
- <property name="toolTip">
- <string>Close this browser</string>
- </property>
- <property name="statusTip">
- <string>Close this browser</string>
- </property>
- </action>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src-qt5/desktop-utils/lumina-screenshot/i18n/l-screenshot_de.ts b/src-qt5/desktop-utils/lumina-screenshot/i18n/l-screenshot_de.ts
index efda8a4c..13a8096e 100644
--- a/src-qt5/desktop-utils/lumina-screenshot/i18n/l-screenshot_de.ts
+++ b/src-qt5/desktop-utils/lumina-screenshot/i18n/l-screenshot_de.ts
@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE TS>
<TS version="2.1" language="de">
<context>
<name>ImageEditor</name>
<message>
- <location filename="../ImageEditor.cpp" line="14"/>
+ <location filename="../ImageEditor.cpp" line="14"></location>
<source>Zoom In</source>
<translation>Vergrößern</translation>
</message>
<message>
- <location filename="../ImageEditor.cpp" line="15"/>
+ <location filename="../ImageEditor.cpp" line="15"></location>
<source>Zoom Out</source>
<translation>Verkleinern</translation>
</message>
@@ -17,115 +17,115 @@
<context>
<name>MainUI</name>
<message>
- <location filename="../MainUI.ui" line="14"/>
- <location filename="../MainUI.ui" line="162"/>
- <location filename="../MainUI.ui" line="295"/>
+ <location filename="../MainUI.ui" line="14"></location>
+ <location filename="../MainUI.ui" line="162"></location>
+ <location filename="../MainUI.ui" line="295"></location>
<source>Take Screenshot</source>
<translation>Bildschirmfoto erstellen</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="37"/>
+ <location filename="../MainUI.ui" line="37"></location>
<source>New Screenshot</source>
<translation>Neues Bildschirmfoto</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="43"/>
+ <location filename="../MainUI.ui" line="43"></location>
<source>Settings</source>
<translation>Einstellungen</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="124"/>
+ <location filename="../MainUI.ui" line="124"></location>
<source>Include Borders</source>
<translation>Rahmen inkludieren</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="149"/>
+ <location filename="../MainUI.ui" line="149"></location>
<source> Seconds</source>
<translation> Sekunden</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="152"/>
+ <location filename="../MainUI.ui" line="152"></location>
<source>Delay </source>
<translation>Verzögerung </translation>
</message>
<message>
- <location filename="../MainUI.ui" line="172"/>
+ <location filename="../MainUI.ui" line="172"></location>
<source>View/Edit</source>
<translation>Ansicht/Bearbeiten</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="212"/>
- <location filename="../MainUI.ui" line="306"/>
+ <location filename="../MainUI.ui" line="212"></location>
+ <location filename="../MainUI.ui" line="306"></location>
<source>Save As</source>
<translation>Speichern unter</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="222"/>
+ <location filename="../MainUI.ui" line="222"></location>
<source>Launch Editor</source>
<translation>Editor starten</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="245"/>
+ <location filename="../MainUI.ui" line="245"></location>
<source>Crop</source>
<translation>Zuschneiden</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="255"/>
+ <location filename="../MainUI.ui" line="255"></location>
<source>Resize</source>
<translation>Größe ändern</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="282"/>
+ <location filename="../MainUI.ui" line="282"></location>
<source>File</source>
<translation>Datei</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="298"/>
+ <location filename="../MainUI.ui" line="298"></location>
<source>Ctrl+N</source>
<translation>Strg+N</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="322"/>
+ <location filename="../MainUI.ui" line="322"></location>
<source>Close</source>
<translation>Schließen</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="325"/>
+ <location filename="../MainUI.ui" line="325"></location>
<source>Esc</source>
<translation>Esc</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="67"/>
+ <location filename="../MainUI.ui" line="67"></location>
<source>Entire Session</source>
- <translation>vollständige Session</translation>
+ <translation>Vollständige Sitzung</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="81"/>
+ <location filename="../MainUI.ui" line="81"></location>
<source>Single Window</source>
- <translation>einzelnes Fenster</translation>
+ <translation>Einzelnes Fenster</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="74"/>
+ <location filename="../MainUI.ui" line="74"></location>
<source>Single Screen</source>
- <translation>einzelner Bildschirm</translation>
+ <translation>Einzelner Bildschirm</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="77"/>
+ <location filename="../MainUI.cpp" line="77"></location>
<source>Save Screenshot</source>
<translation>Bildschirmfoto speichern</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="309"/>
+ <location filename="../MainUI.ui" line="309"></location>
<source>Ctrl+S</source>
<translation>Strg+S</translation>
</message>
<message>
- <location filename="../MainUI.ui" line="317"/>
+ <location filename="../MainUI.ui" line="317"></location>
<source>Quick Save</source>
<translation>Schnellspeichern</translation>
</message>
<message>
- <location filename="../MainUI.cpp" line="77"/>
+ <location filename="../MainUI.cpp" line="77"></location>
<source>PNG Files (*.png);;AllFiles (*)</source>
<translation>PNG-Dateien (*.png);;Alle Dateien (*)</translation>
</message>
diff --git a/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.desktop b/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.desktop
index b1c386fc..c4678265 100644
--- a/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.desktop
+++ b/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.desktop
@@ -1,5 +1,5 @@
[Desktop Entry]
-Exec=lumina-screenshot
+Exec=lumina-screenshot -new-instance
Icon=camera-web
Terminal=false
Type=Application
diff --git a/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.pro b/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.pro
index 6f47f61f..a85b234c 100644
--- a/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.pro
+++ b/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.pro
@@ -1,6 +1,6 @@
include("$${PWD}/../../OS-detect.pri")
-QT += core gui
+QT += core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets x11extras
diff --git a/src-qt5/desktop-utils/lumina-screenshot/main.cpp b/src-qt5/desktop-utils/lumina-screenshot/main.cpp
index aee374b0..27e1f2ff 100644
--- a/src-qt5/desktop-utils/lumina-screenshot/main.cpp
+++ b/src-qt5/desktop-utils/lumina-screenshot/main.cpp
@@ -7,14 +7,15 @@
#include <LuminaOS.h>
#include <LuminaThemes.h>
#include <LuminaUtils.h>
+#include <LuminaSingleApplication.h>
int main(int argc, char ** argv)
{
LTHEME::LoadCustomEnvSettings();
- QApplication a(argc, argv);
+ LSingleApplication a(argc, argv, "l-screenshot");
LuminaThemeEngine theme(&a);
a.setApplicationName("Take Screenshot");
- LUtils::LoadTranslation(&a, "l-screenshot");
+ //LUtils::LoadTranslation(&a, "l-screenshot");
MainUI w;
QObject::connect(&theme,SIGNAL(updateIcons()), &w, SLOT(setupIcons()) );
bgstack15