diff options
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&utm_medium=badge&utm_campaign=pr-badge&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 "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> + <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 "Next" 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>&Preferences</source> <translation>&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()) ); |