diff options
-rw-r--r-- | lumina-fm/BackgroundWorker.cpp | 131 | ||||
-rw-r--r-- | lumina-fm/BackgroundWorker.h | 47 | ||||
-rw-r--r-- | lumina-fm/DDFileSystemModel.h | 36 | ||||
-rw-r--r-- | lumina-fm/DirData.h | 18 | ||||
-rw-r--r-- | lumina-fm/FODialog.cpp | 19 | ||||
-rw-r--r-- | lumina-fm/MainUI-old.cpp | 1597 | ||||
-rw-r--r-- | lumina-fm/MainUI-old.h | 238 | ||||
-rw-r--r-- | lumina-fm/MainUI-old.ui | 1315 | ||||
-rw-r--r-- | lumina-fm/MainUI.cpp | 1575 | ||||
-rw-r--r-- | lumina-fm/MainUI.h | 155 | ||||
-rw-r--r-- | lumina-fm/MainUI.ui | 1212 | ||||
-rw-r--r-- | lumina-fm/MimeIconProvider.h | 67 | ||||
-rw-r--r-- | lumina-fm/lumina-fm.pro | 4 | ||||
-rw-r--r-- | lumina-fm/main.cpp | 2 | ||||
-rw-r--r-- | lumina-fm/widgets/DirWidget.cpp | 269 | ||||
-rw-r--r-- | lumina-fm/widgets/DirWidget.h | 49 | ||||
-rw-r--r-- | lumina-fm/widgets/DirWidget.ui | 336 | ||||
-rw-r--r-- | lumina-fm/widgets/MultimediaWidget.cpp | 5 | ||||
-rw-r--r-- | lumina-fm/widgets/MultimediaWidget.h | 1 | ||||
-rw-r--r-- | lumina-fm/widgets/SlideshowWidget.cpp | 43 | ||||
-rw-r--r-- | lumina-fm/widgets/SlideshowWidget.h | 8 | ||||
-rw-r--r-- | lumina-fm/widgets/SlideshowWidget.ui | 115 |
22 files changed, 1155 insertions, 6087 deletions
diff --git a/lumina-fm/BackgroundWorker.cpp b/lumina-fm/BackgroundWorker.cpp deleted file mode 100644 index f8e036ac..00000000 --- a/lumina-fm/BackgroundWorker.cpp +++ /dev/null @@ -1,131 +0,0 @@ -#include "BackgroundWorker.h" - -#include <LuminaXDG.h> -#include <QMediaServiceSupportedFormatsInterface> -#include <QImageReader> -#include <QDir> -#include <QFileInfo> - -BackgroundWorker::BackgroundWorker() : QObject(){ - -} - -BackgroundWorker::~BackgroundWorker(){ - -} - -void BackgroundWorker::startDirChecks(QString path){ - QDir dir(path); - //Make sure to remove any symlinks or redundency in the path - if(dir.canonicalPath()!=path){ path = dir.canonicalPath(); dir.cd(path); } - qDebug() << "Starting Dir Checks:" << path; - //First check for image files - if(imgFilter.isEmpty()){ - //Initial Run - load supported image extensions - QList<QByteArray> fmt = QImageReader::supportedImageFormats(); - for(int i=0; i<fmt.length(); i++){ imgFilter << "*."+QString(fmt[i]).toLower(); } - qDebug() << "Supported Image Formats:" << imgFilter; - } - QStringList pics = dir.entryList(imgFilter, QDir::Files | QDir::NoDotAndDotDot, QDir::Name | QDir::IgnoreCase); - if(!pics.isEmpty() && !imgFilter.isEmpty()){ emit ImagesAvailable(pics); } - - //Now check for multimedia files - if(multiFilter.isEmpty()){ - //Initial Run - load supported multimedia extensions - // (Auto-detection of supported types broken in Qt5 - just use everythings for now) - multiFilter = LXDG::findAVFileExtensions(); - multiFilter.removeDuplicates(); - qDebug() << "Supported Multimedia Formats:" << multiFilter; - } - QStringList files = dir.entryList(multiFilter, QDir::Files | QDir::NoDotAndDotDot, QDir::Name | QDir::IgnoreCase); - if(!files.isEmpty() && !multiFilter.isEmpty()){ emit MultimediaAvailable(files); } - qDebug() << " - done with audio/multimedia checks"; - //Now check for ZFS snapshots of the directory - if(!QFileInfo(path).isWritable() ){ return; } //skip ZFS checks if can't restore to this dir - //cdir = path; - QStringList snapDirs; - QString baseSnapDir; - bool found = false; - qDebug() << " - start searching for base snapshot directory"; - if(cdir == path && QFile::exists(csnapdir) ){ - //no need to re-search for it - just found it recently - qDebug() << " -- Use previous dir:" << cdir << csnapdir; - baseSnapDir= csnapdir; found=true; - }else{ - while(dir.canonicalPath()!="/" && !found){ - qDebug() << " -- Checking for snapshot dir:" << dir.canonicalPath(); - if(dir.exists(".zfs/snapshot")){ - baseSnapDir = dir.canonicalPath()+"/.zfs/snapshot"; - found = true; - }else{ dir.cdUp(); } - } - } - qDebug() << " - done with base snapshot directory"; - cdir = path; csnapdir = baseSnapDir; - //Now find the snapshots that contain this directory and save them - if(found){ - qDebug() << " - start fetching snapshots"; - QString reldir = path; - reldir.remove(baseSnapDir.section("/.zfs/snapshot",0,0)); //convert to a relative path - dir.cd(baseSnapDir); - snapDirs = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Time); - //Check that the current directory exists in each snapshot - for(int i=0; i<snapDirs.length(); i++){ - if( !dir.exists(snapDirs[i]+"/"+reldir) ){ - snapDirs.removeAt(i); - i--; - }else{ - snapDirs[i] = QFileInfo(dir, snapDirs[i]+"/"+reldir).created().toString("yyyyMMddhhmmsszzz")+"::::"+snapDirs[i]; - } - } - qDebug() << " - done fetching snapshots"; - snapDirs.sort(); - //Sort the snapshots by time (newest last) and format them - for(int i=0; i<snapDirs.length(); i++){ - snapDirs[i] = dir.absolutePath()+"/"+snapDirs[i].section("::::",1,50)+"/"+reldir; - } - if(!snapDirs.isEmpty()){ emit SnapshotsAvailable(baseSnapDir, snapDirs); } - qDebug() << "Found snapshots"; - } -} - - -void BackgroundWorker::createStatusBarMsg(QFileInfoList fileList, QString path, QString messageFolders, QString messageFiles){ - - //collect some statistics of dir and display them in statusbar - //Get the total size of the items - double totalSizes = 0; - int numberFolders = 0; - int numberFiles = 0; - for(int i=0; i<fileList.length(); i++){ - if(!fileList[i].isDir()){ - numberFiles++; - totalSizes += fileList[i].size(); //in Bytes - } - else { numberFolders++; } - } - //Convert the size into display units - static QStringList units = QStringList() << tr("B") << tr("KB") << tr("MB") << tr("GB") << tr("TB"); - int cunit = 0; - while(cunit < units.length() && totalSizes > 1024){ - cunit++; - totalSizes = totalSizes/1024; - } - //Assemble the message - QString msgStatusBar = QString(tr("%1: %2 / %3: %4")).arg(messageFolders).arg(numberFolders).arg(messageFiles).arg(numberFiles); - - if(totalSizes > 0){ - totalSizes = qRound(totalSizes*100)/100.0; //round to 2 decimel places - msgStatusBar += " "+QString(tr("Total size: %1 %2")).arg(QString::number(totalSizes), units[cunit]); - } - //If a path given, get the total capacity of it (percantage) - if (!path.isEmpty()) { //path could be empty when fileList is based on user's selection - QString capacity = LOS::FileSystemCapacity(path) ; - if (msgStatusBar.isEmpty()) msgStatusBar += QString(tr("Capacity: %1")).arg(capacity); - else msgStatusBar += " "+QString(tr("Capacity: %1")).arg(capacity); - } - //Emit the signal to show this on the UI - if (!msgStatusBar.isEmpty()){ - emit Si_DisplayStatusBar(msgStatusBar); - } -} diff --git a/lumina-fm/BackgroundWorker.h b/lumina-fm/BackgroundWorker.h deleted file mode 100644 index 72060cad..00000000 --- a/lumina-fm/BackgroundWorker.h +++ /dev/null @@ -1,47 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2014, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This is the background class for running long-lived calculations -//=========================================== -#ifndef _LUMINA_FILE_MANAGER_BACKGROUND_WORKER_H -#define _LUMINA_FILE_MANAGER_BACKGROUND_WORKER_H - -#include <QObject> -#include <QStringList> -#include <QString> -#include <QFileInfo> -#include <QDir> -#include <QDateTime> - -#include <LuminaOS.h> - - -class BackgroundWorker : public QObject{ - Q_OBJECT -public: - BackgroundWorker(); - ~BackgroundWorker(); - -private: - QStringList multiFilter, imgFilter; - QString cdir, csnapdir; //last directory checked (and base snapshot dir found) - QString ItemsInstatusBar(QFileInfoList, QString); - -public slots: - //Kickoff processes with these slots - // and then listen for the appropriate signals when finished - void startDirChecks(QString path); - void createStatusBarMsg(QFileInfoList fileList, QString path, QString messageFolders, QString messageFiles); - -signals: - void ImagesAvailable(QStringList files); - void MultimediaAvailable(QStringList files); - void SnapshotsAvailable(QString basedir, QStringList snappaths); - void Si_DisplayStatusBar(QString); - -}; - -#endif diff --git a/lumina-fm/DDFileSystemModel.h b/lumina-fm/DDFileSystemModel.h deleted file mode 100644 index caa83b0e..00000000 --- a/lumina-fm/DDFileSystemModel.h +++ /dev/null @@ -1,36 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2014, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This is a simple subclassed QFileSystemModel to enable drag and drop -// (and moving) but disable all the other filesystem modifications -//=========================================== -#ifndef _LUMINA_FILE_MANAGER_DDFILESYSTEMMODEL_H -#define _LUMINA_FILE_MANAGER_DDFILESYSTEMMODEL_H - -#include <QFileSystemModel> -#include <QObject> - -class DDFileSystemModel : public QFileSystemModel{ - Q_OBJECT -public: - DDFileSystemModel(QObject *parent = 0) : QFileSystemModel(parent){ - this->setReadOnly(false); //need this to enable DnD - } - ~DDFileSystemModel(){} - - virtual Qt::ItemFlags flags(const QModelIndex &index) const { - //First get all the flags from the standard QFileSystemModel - Qt::ItemFlags defaultflags = QFileSystemModel::flags(index); - //Now if it has the "Editable" flag set - remove it - if(defaultflags & Qt::ItemIsEditable){ - defaultflags ^= Qt::ItemIsEditable; - } - - return defaultflags; - } -}; - -#endif
\ No newline at end of file diff --git a/lumina-fm/DirData.h b/lumina-fm/DirData.h index cbfa1855..bd2657e1 100644 --- a/lumina-fm/DirData.h +++ b/lumina-fm/DirData.h @@ -20,6 +20,8 @@ #define ZSNAPDIR QString("/.zfs/snapshot/") +#define DEBUG 0 + //Need some extra information not usually available by a QFileInfo class LFileInfo : public QFileInfo{ private: @@ -71,7 +73,8 @@ public: //Functions for accessing the extra information // -- Return the mimetype for the file QString mimetype(){ - return mime; + if(mime=="inode/directory"){ return ""; } + else{ return mime; } } // -- Return the icon to use for this file @@ -80,7 +83,9 @@ public: return icon; }else{ if(!mime.isEmpty()){ - return mime.replace("/","-"); + QString tmp = mime; + tmp.replace("/","-"); + return tmp; }else if(this->isExecutable()){ return "application-x-executable"; } @@ -109,6 +114,7 @@ public: return (mime.startsWith("audio/") || mime.startsWith("video/") ); } }; +typedef QList<LFileInfo> LFileInfoList; class LDirInfoList{ public: @@ -187,7 +193,7 @@ private: QHash<QString, LDirInfoList> HASH; //Where we cache any info for rapid access later signals: - void DirDataAvailable(QString, QString, QList<LFileInfo>); //[ID, Dirpath, DATA] + void DirDataAvailable(QString, QString, LFileInfoList); //[ID, Dirpath, DATA] void SnapshotDataAvailable(QString, QString, QStringList); //[ID, BaseSnapDir, SnapNames] public: @@ -204,6 +210,7 @@ public: public slots: void GetDirData(QString ID, QString dirpath){ + if(DEBUG){ qDebug() << "GetDirData:" << ID << dirpath; } //The ID is used when returning the info in a moment //Make sure to use the canonical path in the HASH search - don't use QString canon = QFileInfo(dirpath).canonicalFilePath(); @@ -218,10 +225,12 @@ public slots: HASH[canon].update(showHidden); } } + if(DEBUG){ qDebug() << " -- Dir Data Found:" << ID << dirpath << HASH.value(canon).list.length(); } emit DirDataAvailable(ID, dirpath, HASH.value(canon).list); } void GetSnapshotData(QString ID, QString dirpath){ + if(DEBUG){ qDebug() << "GetSnapshotData:" << ID << dirpath; } QString base; QStringList snaps; //Only check if ZFS is flagged as available if(zfsavailable){ @@ -239,11 +248,12 @@ public slots: //Good snapshot directory found - read off the current snapshots (can change regularly - don't cache this) base = HASH.value(dirpath).snapdir; QDir dir(base); - snaps = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Time); + snaps = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Time |QDir::Reversed ); //NOTE: snaps are sorted oldest -> newest } } + if(DEBUG){ qDebug() << " -- Snap Data Found:" << ID << base << snaps; } emit SnapshotDataAvailable(ID, base, snaps); } diff --git a/lumina-fm/FODialog.cpp b/lumina-fm/FODialog.cpp index d182ed06..a4d9afa7 100644 --- a/lumina-fm/FODialog.cpp +++ b/lumina-fm/FODialog.cpp @@ -10,6 +10,8 @@ #include <QApplication> #include <QFontMetrics> +#define DEBUG 1 + FODialog::FODialog(QWidget *parent) : QDialog(parent), ui(new Ui::FODialog){ ui->setupUi(this); //load the designer file ui->label->setText(tr("Calculating")); @@ -109,7 +111,8 @@ bool FODialog::CheckOverwrite(){ QMessageBox::StandardButton ans = QMessageBox::question(this, tr("Overwrite Files?"), tr("Do you want to overwrite the existing files?")+"\n"+tr("Note: It will just add a number to the filename otherwise.")+"\n\n"+existing.join(", "), QMessageBox::YesToAll | QMessageBox::NoToAll | QMessageBox::Cancel, QMessageBox::NoToAll); if(ans==QMessageBox::NoToAll){ Worker->overwrite = 0; } //don't overwrite else if(ans==QMessageBox::YesToAll){ Worker->overwrite = 1; } //overwrite - else{ ok = false; } //cancel operations + else{ qDebug() << " - Cancelled"; ok = false; } //cancel operations + if(DEBUG){ qDebug() << " - Overwrite:" << Worker->overwrite; } } } QApplication::processEvents(); @@ -242,7 +245,7 @@ QStringList FOWorker::copyItem(QString oldpath, QString newpath){ // ==== PRIVATE SLOTS ==== void FOWorker::slotStartOperations(){ - //qDebug() << "Start File operations" << isRM << isCP << isMV << ofiles << nfiles; + if(DEBUG){ qDebug() << "Start File operations" << isRM << isCP << isMV << ofiles << nfiles << overwrite; } //Now setup the UI /*ui->progressBar->setRange(0,ofiles.length()); ui->progressBar->setValue(0); @@ -269,13 +272,15 @@ 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]){ + 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){ + 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]"; } } QStringList subs = subfiles(ofiles[i], true); //dirs need to be first for additions @@ -294,7 +299,7 @@ void FOWorker::slotStartOperations(){ }else{ //Check for existance of the new name if(QFile::exists(nfiles[i])){ - if(!overwrite){ + if(overwrite!=1){ nfiles[i] = newFileName(nfiles[i]); //prompt for new file name up front before anything starts } } @@ -317,7 +322,7 @@ void FOWorker::slotStartOperations(){ QApplication::processEvents();*/ emit startingItem(i+1,olist.length(), olist[i],nlist[i]); if(QFile::exists(nlist[i])){ - if(overwrite){ + if(overwrite==1){ errlist << removeItem(nlist[i], true); //recursively remove the file/dir since we are supposed to overwrite it } } @@ -332,7 +337,7 @@ void FOWorker::slotStartOperations(){ emit startingItem(i+1,olist.length(), olist[i], nlist[i]); //Clean up any overwritten files/dirs if(QFile::exists(nlist[i])){ - if(overwrite){ + if(overwrite==1){ errlist << removeItem(nlist[i], true); //recursively remove the file/dir since we are supposed to overwrite it } } diff --git a/lumina-fm/MainUI-old.cpp b/lumina-fm/MainUI-old.cpp deleted file mode 100644 index 732554dd..00000000 --- a/lumina-fm/MainUI-old.cpp +++ /dev/null @@ -1,1597 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2014, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -#include "MainUI.h" -#include "ui_MainUI.h" - -#include <QImageWriter> -#include <QFileInfo> - -#define DEBUG 0 - -MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){ - //for Signal/slot we must register the Typedef of QFileInfoList - qRegisterMetaType<QFileInfoList>("QFileInfoList"); - ui->setupUi(this); - if(DEBUG){ qDebug() << "Initilization:"; } - //Be careful about the QSettings setup, it must match the lumina-desktop setup - QSettings::setPath(QSettings::NativeFormat, QSettings::UserScope, QDir::homePath()+"/.lumina"); - settings = new QSettings( QSettings::UserScope, "LuminaDE", "lumina-fm", this); - favdir = QDir::homePath()+"/.lumina/favorites/"; //save this for later - syncTimer = new QTimer(this); - syncTimer->setInterval(200); //1/5 second (collect as many signals/slots as necessary - syncTimer->setSingleShot(true); - //Reset the UI to the previously used size (if possible) - if(DEBUG){ qDebug() << " - Reset window size"; } - int height = settings->value("geometry/height",-1).toInt(); - if(height>100 && height <= QApplication::desktop()->availableGeometry(this).height()){ this->resize(this->width(), height); } - int width = settings->value("geometry/width",-1).toInt(); - if(width>100 && width <= QApplication::desktop()->availableGeometry(this).width()){ this->resize(width, this->height() ); } - //initialize the non-ui widgets - if(DEBUG){ qDebug() << " - Tab Bar Setup"; } - tabBar = new QTabBar(this); - tabBar->setTabsClosable(true); - tabBar->setMovable(true); //tabs are independant - so allow the user to sort them - tabBar->setShape(QTabBar::RoundedNorth); - tabBar->setFocusPolicy(Qt::NoFocus); - ui->verticalLayout_browser->insertWidget(0,tabBar); - currentDir = new QLineEdit(this); - ui->toolBar->insertWidget(ui->actionBookMark, currentDir); - currentDir->setFocusPolicy(Qt::StrongFocus); - if(DEBUG){ qDebug() << " - Threading"; } - workThread = new QThread; - workThread->setObjectName("Lumina-fm filesystem worker"); - worker = new BackgroundWorker; - worker->moveToThread(workThread); - if(DEBUG){ qDebug() << " - File System Model"; } - fsmod = new DDFileSystemModel(this); - fsmod->setRootPath("/"); - //fsmod->setReadOnly(false); //required for DnD, but also enables a lot of other stuff - //qDebug() << "DnD options:" << fsmod->supportedDropActions(); - ui->tree_dir_view->setModel(fsmod); - ui->tree_dir_view->sortByColumn(0, Qt::AscendingOrder); - ui->tree_dir_view->setColumnWidth(0,200); - ui->tree_dir_view->setColumnWidth(1,80); //size column should be small - ui->tree_dir_view->setColumnWidth(2,80); //type column should be small - ui->list_dir_view->setModel(fsmod); - dirCompleter = new QCompleter(fsmod, this); - dirCompleter->setModelSorting( QCompleter::CaseInsensitivelySortedModel ); - currentDir->setCompleter(dirCompleter); - snapmod = new QFileSystemModel(this); - ui->tree_zfs_dir->setModel(snapmod); - ui->tree_zfs_dir->sortByColumn(0, Qt::AscendingOrder); - if(DEBUG){ qDebug() << " - Icon Provider"; } - iconProv = new MimeIconProvider(); - fsmod->setIconProvider(iconProv); - snapmod->setIconProvider(iconProv); - if(DEBUG){ qDebug() << " - Context Menu"; } - contextMenu = new QMenu(this); - radio_view_details = new QRadioButton(tr("Detailed List"), this); - radio_view_list = new QRadioButton(tr("Basic List"), this); - radio_view_icons = new QRadioButton(tr("Icons"), this); - detWA = new QWidgetAction(this); - detWA->setDefaultWidget(radio_view_details); - listWA = new QWidgetAction(this); - listWA->setDefaultWidget(radio_view_list); - icoWA = new QWidgetAction(this); - icoWA->setDefaultWidget(radio_view_icons); - ui->menuView->addAction(detWA); - ui->menuView->addAction(listWA); - ui->menuView->addAction(icoWA); - //Setup the special Phonon widgets - if(DEBUG){ qDebug() << " - Multimedia Widgets"; } - mediaObj = new QMediaPlayer(this); - mediaObj->setVolume(100); - mediaObj->setNotifyInterval(500); //only every 1/2 second update - videoDisplay = new QVideoWidget(this); - videoDisplay->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - ui->videoLayout->addWidget(videoDisplay); - mediaObj->setVideoOutput(videoDisplay); - videoDisplay->setVisible(false); - playerSlider = new QSlider(this); - playerSlider->setOrientation(Qt::Horizontal); - ui->videoControlLayout->insertWidget(4, playerSlider); - ui->tool_player_stop->setEnabled(false); //nothing to stop yet - ui->tool_player_pause->setVisible(false); //nothing to pause yet - playerSlider->setEnabled(false); //nothing to seek yet - //Setup any specialty keyboard shortcuts - if(DEBUG){ qDebug() << " - Keyboard Shortcuts"; } - nextTabLShort = new QShortcut( QKeySequence(tr("Shift+Left")), this); - nextTabRShort = new QShortcut( QKeySequence(tr("Shift+Right")), this); - closeTabShort = new QShortcut( QKeySequence(tr("Ctrl+W")), this); - 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); - //Finish loading the interface - workThread->start(); - if(DEBUG){ qDebug() << " - Icons"; } - setupIcons(); - if(DEBUG){ qDebug() << " - Connections"; } - setupConnections(); - if(DEBUG){ qDebug() << " - Settings"; } - loadSettings(); - if(DEBUG){ qDebug() << " - Bookmarks"; } - RebuildBookmarksMenu(); - if(DEBUG){ qDebug() << " - Devices"; } - RebuildDeviceMenu(); - //Make sure we start on the browser page - if(DEBUG){ qDebug() << " - Load Browser Page"; } - goToBrowserPage(); - if(DEBUG){ qDebug() << " - Done with init"; } -} - -MainUI::~MainUI(){ - workThread->quit(); - workThread->wait(); -} - -void MainUI::OpenDirs(QStringList dirs){ - QStringList invalid; - for(int i=0; i<dirs.length(); i++){ - //Add this directory in a new tab - if(dirs[i].endsWith("/")){ dirs[i].chop(1); } - if(!QFile::exists(dirs[i])){ invalid << dirs[i]; continue; } - if(DEBUG){ qDebug() << "Open Directory:" << dirs[i]; } - int index = tabBar->addTab( dirs[i].section("/",-1) ); - tabBar->setTabWhatsThis( index, dirs[i] ); - if(index==0){ setCurrentDir(dirs[i]); }//display this as the current dir - } - tabBar->setVisible( tabBar->count() > 1 ); - if(!invalid.isEmpty()){ - QMessageBox::warning(this, tr("Invalid Directories"), tr("The following directories are invalid and could not be opened:")+"\n"+invalid.join(", ") ); - } -} - -//========== -// PRIVATE -//========== -void MainUI::setupIcons(){ - this->setWindowIcon( LXDG::findIcon("Insight-FileManager","") ); - - //Setup all the icons using libLumina - ui->actionClose->setIcon( LXDG::findIcon("application-exit","") ); - ui->actionNew_Tab->setIcon( LXDG::findIcon("tab-new-background","") ); - //ui->action_Preferences->setIcon( LXDG::findIcon("configure","") ); - ui->actionUpDir->setIcon( LXDG::findIcon("go-up","") ); - ui->actionBack->setIcon( LXDG::findIcon("go-previous","") ); - ui->actionHome->setIcon( LXDG::findIcon("go-home","") ); - ui->actionBookMark->setIcon( LXDG::findIcon("bookmarks","") ); - ui->actionBackToBrowser->setIcon( LXDG::findIcon("go-previous","") ); - ui->actionManage_Bookmarks->setIcon( LXDG::findIcon("bookmarks-organize","") ); - ui->actionScan->setIcon( LXDG::findIcon("system-search","") ); - ui->actionSearch->setIcon( LXDG::findIcon("edit-find","") ); - - //Browser page - ui->tool_addNewFile->setIcon( LXDG::findIcon("document-new","")); - ui->tool_addToDir->setIcon( LXDG::findIcon("folder-new","") ); - ui->tool_goToImages->setIcon( LXDG::findIcon("fileview-preview","") ); - ui->tool_goToPlayer->setIcon( LXDG::findIcon("applications-multimedia","") ); - ui->tool_goToRestore->setIcon( LXDG::findIcon("document-revert","") ); - 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","") ); - - //Multimedia Player page - ui->tool_player_next->setIcon( LXDG::findIcon("media-skip-forward","") ); - ui->tool_player_prev->setIcon( LXDG::findIcon("media-skip-backward","") ); - ui->tool_player_pause->setIcon( LXDG::findIcon("media-playback-pause","") ); - ui->tool_player_play->setIcon( LXDG::findIcon("media-playback-start","") ); - ui->tool_player_stop->setIcon( LXDG::findIcon("media-playback-stop","") ); - - //Slideshow page - ui->tool_image_goBegin->setIcon( LXDG::findIcon("go-first-view","") ); - ui->tool_image_goEnd->setIcon( LXDG::findIcon("go-last-view","") ); - ui->tool_image_goPrev->setIcon( LXDG::findIcon("go-previous-view","") ); - ui->tool_image_goNext->setIcon( LXDG::findIcon("go-next-view","") ); - ui->tool_image_remove->setIcon( LXDG::findIcon("edit-delete","") ); - ui->tool_image_rotateleft->setIcon( LXDG::findIcon("object-rotate-left","") ); - ui->tool_image_rotateright->setIcon( LXDG::findIcon("object-rotate-right","") ); - - //ZFS Restore page - ui->tool_zfs_nextSnap->setIcon( LXDG::findIcon("go-next-view","") ); - ui->tool_zfs_prevSnap->setIcon( LXDG::findIcon("go-previous-view","") ); - ui->tool_zfs_restoreItem->setIcon( LXDG::findIcon("document-revert","") ); -} - -void MainUI::setupConnections(){ - connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*, QWidget*)), this, SLOT(startEditDir(QWidget*, QWidget*)) ); - connect(tabBar, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int)) ); - connect(tabBar, SIGNAL(tabCloseRequested(int)), this, SLOT(tabClosed(int)) ); - connect(ui->menuBookmarks, SIGNAL(triggered(QAction*)), this, SLOT(goToBookmark(QAction*)) ); - connect(ui->menuExternal_Devices, SIGNAL(triggered(QAction*)), this, SLOT(goToDevice(QAction*)) ); - connect(currentDir, SIGNAL(returnPressed()), this, SLOT(goToDirectory())); - connect(radio_view_details, SIGNAL(toggled(bool)), this, SLOT(viewModeChanged(bool)) ); - connect(radio_view_list, SIGNAL(toggled(bool)), this, SLOT(viewModeChanged(bool)) ); - connect(radio_view_icons, SIGNAL(toggled(bool)), this, SLOT(viewModeChanged(bool)) ); - connect(fsmod, SIGNAL(directoryLoaded(QString)), this, SLOT(slotStartSyncTimer()) ); - connect(syncTimer, SIGNAL(timeout()), this, SLOT(currentDirectoryLoaded()) ); - //Background worker class - connect(this, SIGNAL(DirChanged(QString)), worker, SLOT(startDirChecks(QString)) ); - connect(worker, SIGNAL(ImagesAvailable(QStringList)), this, SLOT(AvailablePictures(QStringList)) ); - connect(worker, SIGNAL(MultimediaAvailable(QStringList)), this, SLOT(AvailableMultimediaFiles(QStringList)) ); - connect(worker, SIGNAL(SnapshotsAvailable(QString, QStringList)), this, SLOT(AvailableBackups(QString, QStringList)) ); - - //Background worker class for statusbar - connect(this, SIGNAL(Si_AdaptStatusBar(QFileInfoList, QString, QString, QString)), worker, SLOT(createStatusBarMsg(QFileInfoList, QString, QString, QString)) ); - connect(worker, SIGNAL(Si_DisplayStatusBar(QString)), this, SLOT(DisplayStatusBar(QString)) ); - - //Action buttons on browser page - connect(ui->tool_act_run, SIGNAL(clicked()), this, SLOT(OpenItem()) ); - connect(ui->tool_act_runwith, SIGNAL(clicked()), this, SLOT(OpenItemWith()) ); - connect(ui->tool_act_rm, SIGNAL(clicked()), this, SLOT(RemoveItem()) ); - connect(ui->tool_act_rename, SIGNAL(clicked()), this, SLOT(RenameItem()) ); - connect(ui->tool_act_paste, SIGNAL(clicked()), this, SLOT(PasteItems()) ); - connect(ui->tool_act_cut, SIGNAL(clicked()), this, SLOT(CutItems()) ); - connect(ui->tool_act_copy, SIGNAL(clicked()), this, SLOT(CopyItems()) ); - connect(ui->tool_act_fav, SIGNAL(clicked()), this, SLOT(FavoriteItem()) ); - - //Tree Widget interaction - connect(ui->tree_dir_view, SIGNAL(activated(const QModelIndex&)), this, SLOT(ItemRun(const QModelIndex&)) ); - connect(ui->list_dir_view, SIGNAL(activated(const QModelIndex&)), this, SLOT(ItemRun(const QModelIndex&)) ); - connect(ui->tree_dir_view, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(OpenContextMenu(const QPoint&)) ); - connect(ui->list_dir_view, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(OpenContextMenu(const QPoint&)) ); - connect(ui->tree_dir_view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(ItemSelectionChanged()) ); - connect(ui->list_dir_view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(ItemSelectionChanged()) ); - - //Page Switching - connect(ui->tool_goToPlayer, SIGNAL(clicked()), this, SLOT(goToMultimediaPage()) ); - connect(ui->tool_goToRestore, SIGNAL(clicked()), this, SLOT(goToRestorePage()) ); - connect(ui->tool_goToImages, SIGNAL(clicked()), this, SLOT(goToSlideshowPage()) ); - connect(ui->actionBackToBrowser, SIGNAL(triggered()), this, SLOT(goToBrowserPage()) ); - - //Slideshow page - connect(ui->combo_image_name, SIGNAL(currentIndexChanged(int)), this, SLOT(showNewPicture()) ); - connect(ui->tool_image_goBegin, SIGNAL(clicked()), this, SLOT(firstPicture()) ); - connect(ui->tool_image_goEnd, SIGNAL(clicked()), this, SLOT(lastPicture()) ); - connect(ui->tool_image_goNext, SIGNAL(clicked()), this, SLOT(nextPicture()) ); - connect(ui->tool_image_goPrev, SIGNAL(clicked()), this, SLOT(prevPicture()) ); - connect(ui->tool_image_remove, SIGNAL(clicked()), this, SLOT(removePicture()) ); - connect(ui->tool_image_rotateleft, SIGNAL(clicked()), this, SLOT(rotatePictureLeft()) ); - connect(ui->tool_image_rotateright, SIGNAL(clicked()), this, SLOT(rotatePictureRight()) ); - - //ZFS Restore page - connect(ui->slider_zfs_snapshot, SIGNAL(valueChanged(int)), this, SLOT(showSnapshot()) ); - connect(ui->tool_zfs_nextSnap, SIGNAL(clicked()), this, SLOT(nextSnapshot()) ); - connect(ui->tool_zfs_prevSnap, SIGNAL(clicked()), this, SLOT(prevSnapshot()) ); - connect(ui->tool_zfs_restoreItem, SIGNAL(clicked()), this, SLOT(restoreItems()) ); - - //Multimedia Player page - connect(ui->tool_player_next, SIGNAL(clicked()), this, SLOT(playerNext())); - connect(ui->tool_player_prev, SIGNAL(clicked()), this, SLOT(playerPrevious())); - connect(ui->tool_player_pause, SIGNAL(clicked()), this, SLOT(playerPause())); - connect(ui->tool_player_play, SIGNAL(clicked()), this, SLOT(playerStart())); - connect(ui->tool_player_stop, SIGNAL(clicked()), this, SLOT(playerStop())); - connect(ui->combo_player_list, SIGNAL(currentIndexChanged(int)), this, SLOT(playerFileChanged()) ); - connect(playerSlider, SIGNAL(sliderPressed()), this, SLOT(playerSliderHeld()) ); - connect(playerSlider, SIGNAL(sliderReleased()), this, SLOT(playerSliderChanged()) ); - connect(playerSlider, SIGNAL(valueChanged(int)), this, SLOT(playerSliderMoved(int)) ); - connect(mediaObj, SIGNAL(durationChanged(qint64)), this, SLOT(playerDurationChanged(qint64)) ); - connect(mediaObj, SIGNAL(seekableChanged(bool)), playerSlider, SLOT(setEnabled(bool)) ); - connect(mediaObj, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(playerStatusChanged(QMediaPlayer::MediaStatus)) ); - connect(mediaObj, SIGNAL(positionChanged(qint64)), this, SLOT(playerTimeChanged(qint64)) ); - connect(mediaObj, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(playerStateChanged(QMediaPlayer::State)) ); - connect(mediaObj, SIGNAL(videoAvailableChanged(bool)), this, SLOT(playerVideoAvailable(bool)) ); - connect(mediaObj, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(playerError()) ); - //Special Keyboard Shortcuts - connect(nextTabLShort, SIGNAL(activated()), this, SLOT( prevTab() ) ); - connect(nextTabRShort, SIGNAL(activated()), this, SLOT( nextTab() ) ); - connect(closeTabShort, SIGNAL(activated()), this, SLOT( tabClosed() ) ); - connect(copyFilesShort, SIGNAL(activated()), this, SLOT( CopyItems() ) ); - connect(cutFilesShort, SIGNAL(activated()), this, SLOT( CutItems() ) ); - connect(pasteFilesShort, SIGNAL(activated()), this, SLOT( PasteItems() ) ); - connect(deleteFilesShort, SIGNAL(activated()), this, SLOT( RemoveItem() ) ); -} - -void MainUI::loadSettings(){ - //Note: make sure this is run after all the UI elements are created and connected to slots - // but before the first directory gets loaded - ui->actionView_Hidden_Files->setChecked( settings->value("showhidden", false).toBool() ); - on_actionView_Hidden_Files_triggered(); //make sure to update the models too - ui->actionShow_Action_Buttons->setChecked(settings->value("showactions", true).toBool() ); - on_actionShow_Action_Buttons_triggered(); //make sure to update the UI - ui->actionShow_Thumbnails->setChecked( settings->value("showthumbnails", true).toBool() ); - iconProv->showthumbnails = ui->actionShow_Thumbnails->isChecked(); - QString view = settings->value("viewmode","details").toString(); - if(view=="icons"){ radio_view_icons->setChecked(true); } - else if(view=="list"){ radio_view_list->setChecked(true); } - else{ radio_view_details->setChecked(true); } -} - -void MainUI::RebuildBookmarksMenu(){ - //Create the bookmarks menu - ui->menuBookmarks->clear(); - ui->menuBookmarks->addAction(ui->actionManage_Bookmarks); - ui->menuBookmarks->addSeparator(); - QStringList BM = settings->value("bookmarks", QStringList()).toStringList(); - ui->menuBookmarks->clear(); - ui->menuBookmarks->addAction(ui->actionManage_Bookmarks); - ui->menuBookmarks->addSeparator(); - bool changed = false; - BM.sort(); //Sort alphabetically - for(int i=0; i<BM.length(); i++){ - if(QFile::exists(BM[i].section("::::",1,1)) ){ - QAction *act = new QAction(BM[i].section("::::",0,0),this); - act->setWhatsThis(BM[i].section("::::",1,1)); - ui->menuBookmarks->addAction(act); - }else{ - //Invalid directory - remove the bookmark - BM.removeAt(i); - i--; - changed = true; - } - } - if(changed){ settings->setValue("bookmarks",BM); } - ui->actionManage_Bookmarks->setEnabled(BM.length()>0); -} - -void MainUI::RebuildDeviceMenu(){ - //Create the External Devices Menu appropriately - ui->menuExternal_Devices->clear(); - ui->menuExternal_Devices->addAction( ui->actionScan ); - ui->menuExternal_Devices->addSeparator(); - //Scan for externally mounted devices - QStringList devs = LOS::ExternalDevicePaths(); - //Output Format: <type>::::<filesystem>::::<path> (6/24/14 - version 0.4.0 ) - // <type> = [USB, HDRIVE, SDCARD, DVD, LVM, UNKNOWN] - - //Now add them to the menu appropriately - for(int i=0; i<devs.length(); i++){ - //Skip hidden mount points (usually only for system usage - not user browsing) - QString label, path, fs; - //Format inputs as necesary - path = devs[i].section("::::",2,2); - fs = devs[i].section("::::",1,1); - if(path.endsWith("/") && path.length()>1 ){ path.chop(1); } - if(path == "/"){ label = tr("Root"); } - else{ label = path.section("/",-1).simplified(); } - if(label.startsWith(".") ){ continue; } //don't show hidden mountpoint (not usually user-browsable) - //Create entry for this device - if( !fs.simplified().isEmpty()){ - //Add filesystem type to the label - label = QString(tr("%1 (Type: %2)")).arg(label, fs); - } - QAction *act = new QAction(label,this); - act->setWhatsThis(path); //full path to mountpoint - act->setToolTip( QString(tr("Filesystem: %1")).arg( devs[i].section("::::",1,1) ) ); - //Now set the appropriate icon - QString type = devs[i].section("::::",0,0); - if(type=="USB"){ type = "drive-removable-media-usb"; } - else if(type=="HDRIVE" || type=="LVM"){ type = "drive-harddisk"; } - else if(type=="SDCARD"){ type = "media-flash-sd-mmc"; } - else if(type=="DVD"){ type = "media-optical"; } - else{ type = "drive-removable-media"; } - act->setIcon( LXDG::findIcon(type, "") ); - ui->menuExternal_Devices->addAction(act); - } -} - -bool MainUI::checkUserPerms(){ - if(!isUserWritable){ - QMessageBox::warning(this, tr("Invalid Permissions"), tr("You do not have permission to edit this directory!") ); - } - return isUserWritable; -} - -QString MainUI::msToText(qint64 ms){ - QString disp; - if(ms>3600000){ - disp.append( QString::number(ms/3600000)+":" ); - ms = ms%3600000; - } - if(ms>60000){ - disp.append( QString::number(ms/60000)+":" ); - ms = ms%60000; - }else{ - disp.append("0:"); - } - if(ms>1000){ - if(ms>=10000){ disp.append( QString::number(ms/1000) ); } - else{ disp.append( "0"+QString::number(ms/1000) ); } - }else{ - disp.append("00"); - } - return disp; -} - -QString MainUI::getCurrentDir(){ - return currentDir->whatsThis(); -} - -void MainUI::setCurrentDir(QString dir){ - if(dir.isEmpty()){ return; } - if(syncTimer->isActive()){ syncTimer->stop(); } //already loading the info - QFileInfo info(dir); - QString olddir = currentDir->whatsThis(); - if(!info.isDir() || !info.exists() ){ - qDebug() << "Invalid Directory:" << dir; - //Try to just go up the dir tree one level - dir.chop(dir.section("/",-1).length()); - if(!QFile::exists(dir)){ - //Still bad dir - try to return to previously shown dir - if(currentDir->whatsThis().isEmpty()){ return; } //nothing to return to - else{ dir = currentDir->whatsThis(); } - } - } - //qDebug() << "Show Directory:" << dir; - //qDebug() << "Dir Info:" << dir; - //qDebug() << " - RWXLOG:" << info.isReadable() << info.isWritable() << info.isExecutable() << info.isSymLink() << info.ownerId() << info.groupId(); - isUserWritable = info.isWritable(); - if(dir.endsWith("/") && dir!="/" ){ dir.chop(1); } - QString rawdir = dir; - //dir.replace(QDir::homePath()+"/", "~/"); - currentDir->setText(dir); - //Update the directory viewer and update the line edit - keepFocus = !currentDir->hasFocus(); - currentDir->setWhatsThis(dir); //save the full path internally - fsmod->setRootPath(rawdir); - if(radio_view_details->isChecked()){ - ui->tree_dir_view->setRootIndex(fsmod->index(dir)); - ui->tree_dir_view->selectionModel()->clearSelection(); - if(olddir.startsWith(rawdir)){ - ui->tree_dir_view->setCurrentIndex( fsmod->index(olddir)); - ui->tree_dir_view->scrollTo( fsmod->index(olddir), QAbstractItemView::PositionAtTop); - } - }else{ - ui->list_dir_view->setRootIndex(fsmod->index(dir)); - ui->list_dir_view->selectionModel()->clearSelection(); - if(olddir.startsWith(rawdir)){ - ui->list_dir_view->setCurrentIndex( fsmod->index(olddir)); - ui->list_dir_view->scrollTo( fsmod->index(olddir), QAbstractItemView::PositionAtTop); - } - } - //Adjust the tab data - tabBar->setTabWhatsThis( tabBar->currentIndex(), rawdir ); - if(dir!="/"){ tabBar->setTabText( tabBar->currentIndex(), dir.section("/",-1) ); } - else{ tabBar->setTabText( tabBar->currentIndex(), dir); } - QStringList history = tabBar->tabData(tabBar->currentIndex()).toStringList(); - if(history.isEmpty() || history.first()!=rawdir){ history.prepend(rawdir); history.removeAll(""); } - //qDebug() << "History:" << history; - tabBar->setTabData(tabBar->currentIndex(), history); - //Now adjust the items as necessary - if(rawdir != olddir){ - //The Filesystem model will need to load the new directory (triggering the background checks) - ui->tool_goToPlayer->setVisible(false); - ui->tool_goToRestore->setVisible(false); - ui->tool_goToImages->setVisible(false); - } - //Make sure the shortcut buttons are enabled as necessary - // If the dir is already loaded into the fsmodel cache it will not emit the directoryLoaded() signal - /*if(rawdir == olddir){ - emit DirChanged(rawdir); //This will be automatically run when a new dir is loaded - } - emit Si_AdaptStatusBar(fsmod->rootDirectory().entryInfoList(), rawdir, tr("Items"));*/ - if(isUserWritable){ ui->label_dir_stats->setText(""); } - else{ ui->label_dir_stats->setText(tr("Limited Access Directory")); - } - - ui->tool_addToDir->setVisible(isUserWritable); - ui->tool_addNewFile->setVisible(isUserWritable); - ui->actionUpDir->setEnabled(dir!="/"); - ui->actionBack->setEnabled(history.length() > 1); - ui->actionBookMark->setEnabled( rawdir!=QDir::homePath() && settings->value("bookmarks", QStringList()).toStringList().filter("::::"+rawdir).length()<1 ); - ItemSelectionChanged(); - RebuildDeviceMenu(); //keep this refreshed - -} - -QFileInfoList MainUI::getSelectedItems(){ - QFileInfoList out; - if(radio_view_details->isChecked()){ - QModelIndexList items = ui->tree_dir_view->selectionModel()->selectedIndexes(); - for(int i=0; i<items.length(); i++){ - if(!out.contains(fsmod->fileInfo(items[i]))){ - out << fsmod->fileInfo(items[i]); - } - } - }else{ - QModelIndexList items = ui->list_dir_view->selectionModel()->selectedIndexes(); - for(int i=0; i<items.length(); i++){ - if(!out.contains(fsmod->fileInfo(items[i]))){ - out << fsmod->fileInfo(items[i]); - } - } - } - return out; -} - -/*QModelIndexList MainUI::getVisibleItems(){ - QModelIndexList out; - if(radio_view_details->isChecked()){ - QModelIndex index = ui->tree_dir_view->indexAt(QPoint(0,0)); - while( index.isValid()){ - if(index.column()!=0){ - //move on - multiple index's per row when we only need one - }else if(ui->tree_dir_view->viewport()->rect().contains( ui->tree_dir_view->visualRect(index) ) ){ - //index within the viewport - add it to the list - out << index; - }else{ - break; //index not in the viewport - } - index = ui->tree_dir_view->indexBelow(index); //go to the next - if(out.contains(index)){ break; } //end of the list - } - - }else{ - QModelIndex index = ui->list_dir_view->indexAt(QPoint(0,0)); - while( index.isValid()){ - if(ui->list_dir_view->viewport()->rect().contains( ui->list_dir_view->visualRect(index) ) ){ - //index within the viewport - add it to the list - out << index; - }else{ - break; //index not in the viewport - } - index = ui->list_dir_view->indexBelow(index); //go to the next - if(out.contains(index)){ break; } //end of the list - } - - } - return out; -}*/ - -//============== -// PRIVATE SLOTS -//============== -void MainUI::slotStartSyncTimer(){ - if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } - if(syncTimer->isActive()){ syncTimer->stop(); } - syncTimer->start(); -} - -//General button check functions -void MainUI::AvailableMultimediaFiles(QStringList files){ - if(!files.isEmpty()){ - ui->combo_player_list->clear(); - ui->combo_player_list->addItems(files); - ui->tool_goToPlayer->setVisible(true); - }else{ - ui->tool_goToPlayer->setVisible(false); - } - -} - -void MainUI::AvailableBackups(QString basedir, QStringList snapdirs){ - snapmod->setRootPath(basedir); //set the base snapshot dir as the new root - snapDirs = snapdirs; - - //Now enable the button if any snapshots available - ui->tool_goToRestore->setVisible(!snapDirs.isEmpty()); -} - -void MainUI::DisplayStatusBar(QString msg){ - //qDebug() << "message to show in the status bar:" << msg; - ui->statusbar->showMessage(msg); -} - -void MainUI::AvailablePictures(QStringList pics){ - if(!pics.isEmpty()){ - QString citem = ui->combo_image_name->currentText(); - ui->combo_image_name->clear(); - ui->combo_image_name->addItems(pics); - if(pics.contains(citem)){ - ui->combo_image_name->setCurrentText(citem); - } - ui->tool_goToImages->setVisible(true); - } - -} - -//----------------------------------- -//General page switching -//----------------------------------- -void MainUI::goToMultimediaPage(){ - //Make toolbar items disappear appropriately - ui->actionBackToBrowser->setVisible(true); - ui->actionBack->setVisible(false); - ui->actionUpDir->setVisible(false); - ui->actionHome->setVisible(false); - ui->actionBookMark->setVisible(false); - currentDir->setEnabled(false); - //Disable all the UI elements specifically for the Browser side of things - ui->actionNew_Tab->setEnabled(false); - ui->menuView->setEnabled(false); - ui->menuBookmarks->setEnabled(false); - ui->menuExternal_Devices->setEnabled(false); - //Start the player on the first selected item - QFileInfoList sel = getSelectedItems(); - if(!sel.isEmpty()){ - QStringList names; - for(int i=0; i<sel.length(); i++){ names << sel[i].fileName(); } - //start the slideshow on the first selected picture - for(int i=0; i<ui->combo_player_list->count(); i++){ - if(names.contains( ui->combo_player_list->itemText(i) )){ ui->combo_player_list->setCurrentIndex(i); break; } - } - } - //Now go to the Multimedia player - ui->label_player_novideo->setText(tr("Click Play to Start")); - ui->stackedWidget->setCurrentWidget(ui->page_audioPlayer); -} - -void MainUI::goToRestorePage(){ - //Make toolbar items disappear appropriately - ui->actionBackToBrowser->setVisible(true); - ui->actionBack->setVisible(false); - ui->actionUpDir->setVisible(false); - ui->actionHome->setVisible(false); - ui->actionBookMark->setVisible(false); - currentDir->setEnabled(false); - //Disable all the UI elements specifically for the Browser side of things - ui->actionNew_Tab->setEnabled(false); - ui->menuView->setEnabled(false); - ui->menuBookmarks->setEnabled(false); - ui->menuExternal_Devices->setEnabled(false); - //Load all the info into the file restore page - ui->slider_zfs_snapshot->setRange(1,snapDirs.length()); - ui->slider_zfs_snapshot->setValue(snapDirs.length()); - //Now go to the file restore page - showSnapshot(); //Make sure it is updated for the current directory - ui->stackedWidget->setCurrentWidget(ui->page_zfs); -} - -void MainUI::goToSlideshowPage(){ - //Make toolbar items disappear appropriately - ui->actionBackToBrowser->setVisible(true); - ui->actionBack->setVisible(false); - ui->actionUpDir->setVisible(false); - ui->actionHome->setVisible(false); - ui->actionBookMark->setVisible(false); - currentDir->setEnabled(false); - //Disable all the UI elements specifically for the Browser side of things - ui->actionNew_Tab->setEnabled(false); - ui->menuView->setEnabled(false); - ui->menuBookmarks->setEnabled(false); - ui->menuExternal_Devices->setEnabled(false); - QFileInfoList sel = getSelectedItems(); - if(!sel.isEmpty()){ - QStringList names; - for(int i=0; i<sel.length(); i++){ names << sel[i].fileName(); } - //start the slideshow on the first selected picture - for(int i=0; i<ui->combo_image_name->count(); i++){ - if(names.contains( ui->combo_image_name->itemText(i) )){ ui->combo_image_name->setCurrentIndex(i); break; } - } - } - //Now go to the Slideshow player - ui->stackedWidget->setCurrentWidget(ui->page_image_view); - showNewPicture(); //make sure it is up to date with the widget size -} - -void MainUI::goToBrowserPage(){ - //Make toolbar items re-appear appropriately - ui->actionBackToBrowser->setVisible(false); - ui->actionBack->setVisible(true); - ui->actionUpDir->setVisible(true); - ui->actionHome->setVisible(true); - ui->actionBookMark->setVisible(true); - currentDir->setEnabled(true); - //Disable all the UI elements specifically for the Browser side of things - ui->actionNew_Tab->setEnabled(true); - ui->menuView->setEnabled(true); - ui->menuBookmarks->setEnabled(true); - ui->menuExternal_Devices->setEnabled(true); - //Now go to the browser - if(ui->stackedWidget->currentWidget()==ui->page_audioPlayer){ mediaObj->stop(); } - ui->stackedWidget->setCurrentWidget(ui->page_browser); - reloadDirectory(); -} - -//--------------------- -//Menu Actions -//--------------------- -void MainUI::on_actionNew_Tab_triggered(){ - OpenDirs(QStringList() << QDir::homePath()); - //Now go to that tab (always last) - tabBar->setCurrentIndex(tabBar->count()-1); -} - -void MainUI::on_actionSearch_triggered(){ - QProcess::startDetached("lumina-search -dir \""+getCurrentDir()+"\""); -} - -void MainUI::on_actionClose_triggered(){ - if(tabBar->count() > 1){ - if(QMessageBox::Yes != QMessageBox::question(this, tr("Verify Quit"), tr("You have multiple tabs open. Are you sure you want to quit?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ) ){ - return; - } - } - qDebug() << "Closing Down..."; - this->close(); -} - -void MainUI::on_actionView_Hidden_Files_triggered(){ - if(ui->actionView_Hidden_Files->isChecked()){ - fsmod->setFilter( QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Hidden ); - snapmod->setFilter( QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Hidden ); - }else{ - fsmod->setFilter( QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs ); - snapmod->setFilter( QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs ); - } - //Now save this setting for later - settings->setValue("showhidden", ui->actionView_Hidden_Files->isChecked()); - //Re-load the view widget - setCurrentDir(getCurrentDir()); -} - -void MainUI::on_actionShow_Action_Buttons_triggered(){ - ui->group_actions->setVisible(ui->actionShow_Action_Buttons->isChecked()); - settings->setValue("showactions", ui->actionShow_Action_Buttons->isChecked()); -} - -void MainUI::on_actionShow_Thumbnails_triggered(){ - //Now save this setting for later - settings->setValue("showthumbnails", ui->actionShow_Thumbnails->isChecked()); - //Set the value in the icon provider - iconProv->showthumbnails = ui->actionShow_Thumbnails->isChecked(); - //Now make sure the filesystem model knows to re-load the image data - fsmod->revert(); - //Re-load the view widget - setCurrentDir(getCurrentDir()); -} - -void MainUI::goToBookmark(QAction *act){ - if(act==ui->actionManage_Bookmarks){ - BMMDialog dlg(this); - dlg.loadSettings(settings); - dlg.exec(); - RebuildBookmarksMenu(); - }else{ - setCurrentDir(act->whatsThis()); - } -} - -void MainUI::goToDevice(QAction *act){ - if(act==ui->actionScan){ - RebuildDeviceMenu(); - }else{ - setCurrentDir(act->whatsThis()); - } -} - -void MainUI::viewModeChanged(bool active){ - if(!active){ return; } //on every view change, all 3 radio buttons will call this function - only run this once though - if(radio_view_details->isChecked()){ - ui->tree_dir_view->setVisible(true); - ui->list_dir_view->setVisible(false); - settings->setValue("viewmode","details"); - }else if(radio_view_list->isChecked()){ - ui->tree_dir_view->setVisible(false); - ui->list_dir_view->setVisible(true); - ui->list_dir_view->setViewMode( QListView::ListMode ); - ui->list_dir_view->setUniformItemSizes(false); - ui->list_dir_view->setIconSize( QSize(20,20) ); - settings->setValue("viewmode","list"); - }else{ //icons - ui->tree_dir_view->setVisible(false); - ui->list_dir_view->setVisible(true); - ui->list_dir_view->setViewMode( QListView::IconMode ); - ui->list_dir_view->setUniformItemSizes(true); - ui->list_dir_view->setIconSize( QSize(90,64) ); - settings->setValue("viewmode","icons"); - } - //Re-load the view widget - setCurrentDir(getCurrentDir()); - -} - -//----------------------- -//Toolbar Actions -//----------------------- -void MainUI::on_actionBack_triggered(){ - QStringList history = tabBar->tabData(tabBar->currentIndex()).toStringList(); - if(history.length() <= 1){ return; } //need the second item - history.removeAt(0); //remove the first item (the current dir) - tabBar->setTabData(tabBar->currentIndex(), history); //re-write the saved history - setCurrentDir(history.first()); //go to the previous entry in the history -} - -void MainUI::on_actionUpDir_triggered(){ - QString dir = getCurrentDir(); - dir.chop( dir.section("/",-1).length() ); - setCurrentDir(dir); -} - -void MainUI::on_actionHome_triggered(){ - setCurrentDir(QDir::homePath()); -} - -void MainUI::on_actionBookMark_triggered(){ - QString dir = getCurrentDir(); - bool ok = false; - QString name = QInputDialog::getText(this, tr("New Bookmark"), tr("Name:"), QLineEdit::Normal, dir, \ - &ok, 0, Qt::ImhFormattedNumbersOnly | Qt::ImhUppercaseOnly | Qt::ImhLowercaseOnly); - if(!ok || name.isEmpty()){ return; } //cancelled - QStringList BM = settings->value("bookmarks",QStringList()).toStringList(); - if(BM.filter(name+"::::").length() >0){ - QMessageBox::warning(this, tr("Invalid Name"), tr("This bookmark name already exists. Please choose another.") ); - QTimer::singleShot(0,this, SLOT(on_actionBookMark_triggered())); - return; - } - BM.append(name+"::::"+dir); - BM.sort(); //sort alphabetically by name - settings->setValue("bookmarks", BM); - //Now rebuild the bookmarks menu - RebuildBookmarksMenu(); - ui->actionBookMark->setEnabled(false); //already bookmarked -} - -//----------------------------- -//Browser Functions -//----------------------------- -void MainUI::startEditDir(QWidget *old, QWidget *now){ - if(now==currentDir){ - //The dir edit just got focus - QString dir = currentDir->text(); - dir.replace("~/", QDir::homePath()+"/"); - currentDir->setText(dir); - //Try to move to the end - currentDir->selectAll(); - }else if(old==currentDir){ - QString dir = currentDir->text(); - setCurrentDir(dir); - } -} - -void MainUI::goToDirectory(){ - QString dir = currentDir->text(); - dir.replace("~/",QDir::homePath()+"/"); - setCurrentDir(dir); -} - -void MainUI::reloadDirectory(){ - setCurrentDir( getCurrentDir() ); -} - -/*void MainUI::viewportChanged(){ - if( !ui->actionsShow_Thumbnails->isChecked()){ return; } - QModelIndexList list = getVisibleItems(); - for(int i=0; i<list.length(); i++){ - if( !ui->actionsShow_Thumbnails->isChecked()){ return; } //break out as necessary - if( imgFilter.contains("*."+fsmod->filePath(list[i]).section("/",-1).section(".",-1).toLower()){ - fmod-> - } - } -}*/ - -void MainUI::currentDirectoryLoaded(){ - //The directory was just loaded: refresh the action buttons as neccesary - // NOTE: This is only "caught" when a *new* directory is loaded into the model - ui->tool_goToPlayer->setVisible(false); - ui->tool_goToRestore->setVisible(false); - ui->tool_goToImages->setVisible(false); - emit DirChanged(getCurrentDir()); - emit Si_AdaptStatusBar(fsmod->rootDirectory().entryInfoList(), getCurrentDir(), tr("Folders"), tr("Files")); - ItemSelectionChanged(); -} - -void MainUI::on_tool_addToDir_clicked(){ - 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; } - QString full = getCurrentDir(); - 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.")); - } - } -} - -void MainUI::on_tool_addNewFile_clicked(){ - 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; } - QString full = getCurrentDir(); - 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.")); - } - -} - -void MainUI::tabChanged(int tab){ - //Load the directory contained in the new tab - qDebug() << "Change to Tab:" << tab << tabBar->tabText(tab); - QString dir = tabBar->tabWhatsThis(tab); //get the full directory - setCurrentDir(dir); //display this as the current dir -} - -void MainUI::tabClosed(int tab){ - if(tabBar->count()==1){ return; } //Can't close the only tab - if(tab < 0){ tab = tabBar->currentIndex(); } - //Remove the tab (will automatically move to a different one); - qDebug() << "Closing tab:" << tab << tabBar->tabText(tab); - tabBar->removeTab(tab); - tabBar->setVisible( tabBar->count() > 1 ); -} - -void MainUI::prevTab(){ - int cur = tabBar->currentIndex(); - if(cur == 0){ tabBar->setCurrentIndex( tabBar->count()-1 ); } - else{ tabBar->setCurrentIndex( cur-1 ); } -} - -void MainUI::nextTab(){ - int cur = tabBar->currentIndex(); - if(cur == (tabBar->count()-1) ){ tabBar->setCurrentIndex(0); } - else{ tabBar->setCurrentIndex( cur+1 ); } -} - -void MainUI::ItemRun(const QModelIndex &index){ - //This is called when the user double clicks a file/directory - QString val = fsmod->filePath(index).section("/",-1); - QString itemPath = getCurrentDir(); - if( !itemPath.endsWith("/")){ itemPath.append("/"); } - itemPath.append(val); - if(fsmod->isDir(index)){ - setCurrentDir( itemPath ); - }else{ - //Must be a file, try to run it - QProcess::startDetached("lumina-open \""+itemPath+"\""); - } -} - -void MainUI::OpenContextMenu(const QPoint &pt){ - QFileInfo info; - if(radio_view_details->isChecked()){ - QModelIndex it = ui->tree_dir_view->indexAt(pt); - if(!it.isValid()){ CItem.clear();} - else{ - info = fsmod->fileInfo(it); - CItem = info.absoluteFilePath(); - } - }else{ - QModelIndex it = ui->list_dir_view->indexAt(pt); - if(!it.isValid()){ CItem.clear();} - else{ - info = fsmod->fileInfo(it); - CItem = info.absoluteFilePath(); - } - } - //Create the context menu - contextMenu->clear(); - if(!CItem.isEmpty()){ - contextMenu->addAction(LXDG::findIcon("run-build-file",""), tr("Open"), this, SLOT(OpenItem()) ); - contextMenu->addAction(LXDG::findIcon("run-build-configure",""), tr("Open With..."), this, SLOT(OpenItemWith()) ); - - contextMenu->addAction(LXDG::findIcon("edit-rename",""), tr("Rename"), this, SLOT(RenameItem()) )->setEnabled(info.isWritable()); - contextMenu->addAction(LXDG::findIcon("document-encrypted",""), tr("View Checksums"), this, SLOT(ChecksumItems()) ); - contextMenu->addSeparator(); - } - bool hasSelection = !getSelectedItems().isEmpty(); - //Now add the general selection options - contextMenu->addAction(LXDG::findIcon("edit-cut",""), tr("Cut Selection"), this, SLOT(CutItems()) )->setEnabled(info.isWritable() && hasSelection); - contextMenu->addAction(LXDG::findIcon("edit-copy",""), tr("Copy Selection"), this, SLOT(CopyItems()) )->setEnabled(hasSelection); - contextMenu->addAction(LXDG::findIcon("edit-paste",""), tr("Paste"), this, SLOT(PasteItems()) )->setEnabled(QApplication::clipboard()->mimeData()->hasFormat("x-special/lumina-copied-files") && isUserWritable); - contextMenu->addSeparator(); - contextMenu->addAction(LXDG::findIcon("edit-delete",""), tr("Delete Selection"), this, SLOT(RemoveItem()) )->setEnabled(info.isWritable()&&hasSelection); - if(LUtils::isValidBinary("lumina-fileinfo")){ - contextMenu->addSeparator(); - contextMenu->addAction(LXDG::findIcon("edit-find-replace",""), tr("File Properties"), this, SLOT(ViewPropertiesItem()) )->setEnabled(hasSelection); - } - if (info.isDir() || CItem.isEmpty()) { - //in case the user click on a directory or click on the background - contextMenu->addSeparator(); - contextMenu->addAction(LXDG::findIcon("system-search",""), tr("Open Terminal here"), this, SLOT(openTerminal())); - } - //Now show the menu - if(radio_view_details->isChecked()){ - contextMenu->popup(ui->tree_dir_view->mapToGlobal(pt)); - }else{ - contextMenu->popup(ui->list_dir_view->mapToGlobal(pt)); - } -} - -void MainUI::ItemSelectionChanged(){ - //Enable/disable the action buttons - QFileInfoList sel = getSelectedItems(); - //display info related to files selected. - //TO CHECK: impact if filesystem is very slow - if(sel.size()>0){ emit Si_AdaptStatusBar(sel, "", tr("Selected Folders"), tr("Files"));} - else{ emit Si_AdaptStatusBar(fsmod->rootDirectory().entryInfoList(), getCurrentDir(), tr("Folders"), tr("Files")); } - - ui->tool_act_run->setEnabled(!sel.isEmpty()); - ui->tool_act_runwith->setEnabled(!sel.isEmpty()); - ui->tool_act_rm->setEnabled(!sel.isEmpty() && isUserWritable); - ui->tool_act_rename->setEnabled(sel.length()==1 && isUserWritable); - ui->tool_act_cut->setEnabled(!sel.isEmpty() && isUserWritable); - ui->tool_act_copy->setEnabled(!sel.isEmpty()); - ui->tool_act_paste->setEnabled(QApplication::clipboard()->mimeData()->hasFormat("x-special/lumina-copied-files") && isUserWritable); - if(ui->tool_act_paste->isEnabled()){ - ui->tool_act_paste->setToolTip( QString(tr("Currently on clipboard:\n%1")).arg( QString(QApplication::clipboard()->mimeData()->data("x-special/lumina-copied-files")).replace("::::",": ") ) ); - }else{ - ui->tool_act_paste->setToolTip(""); - } - QString itname; - if(sel.length()==1){ itname = sel[0].fileName(); } - bool ok = !itname.isEmpty() && (getCurrentDir()!=QDir::homePath()+"/Desktop"); - if(ok){ - ok = !LUtils::isFavorite(sel[0].canonicalFilePath()); - } - ui->tool_act_fav->setEnabled(ok); -} - -//------------------------------- -//Slideshow Functions -//------------------------------- -void MainUI::showNewPicture(){ - if( !ui->label_image->isVisible() ){ return; } //don't update if not visible - can cause strange resizing issues - QString file = getCurrentDir(); - if(!file.endsWith("/")){ file.append("/"); } - file.append(ui->combo_image_name->currentText()); - //qDebug() << "Show Image:" << file; - QPixmap pix(file); - if(pix.size().width() > ui->label_image->contentsRect().width() || pix.size().height() > ui->label_image->contentsRect().height()){ - pix = pix.scaled(ui->label_image->contentsRect().size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); - } - ui->label_image->setPixmap(pix); - //Now set/load the buttons - ui->tool_image_goBegin->setEnabled(ui->combo_image_name->currentIndex()>0); - ui->tool_image_goPrev->setEnabled(ui->combo_image_name->currentIndex()>0); - ui->tool_image_goEnd->setEnabled(ui->combo_image_name->currentIndex()<(ui->combo_image_name->count()-1)); - ui->tool_image_goNext->setEnabled(ui->combo_image_name->currentIndex()<(ui->combo_image_name->count()-1)); - ui->label_image_index->setText( QString::number(ui->combo_image_name->currentIndex()+1)+"/"+QString::number(ui->combo_image_name->count()) ); - static QList<QByteArray> writeableformats; - if(writeableformats.isEmpty()){ - writeableformats = QImageWriter::supportedImageFormats(); - qDebug() << "Writeable image formats:" << writeableformats; - } - bool canwrite = writeableformats.contains(file.section(".",-1).toLower().toLocal8Bit()); //compare the suffix with the list - ui->tool_image_remove->setEnabled(isUserWritable); - ui->tool_image_rotateleft->setEnabled(isUserWritable && canwrite); - ui->tool_image_rotateright->setEnabled(isUserWritable && canwrite); -} - -void MainUI::firstPicture(){ - ui->combo_image_name->setCurrentIndex(0); -} - -void MainUI::prevPicture(){ - ui->combo_image_name->setCurrentIndex( ui->combo_image_name->currentIndex()-1 ); -} - -void MainUI::nextPicture(){ - ui->combo_image_name->setCurrentIndex( ui->combo_image_name->currentIndex()+1 ); -} - -void MainUI::lastPicture(){ - ui->combo_image_name->setCurrentIndex( ui->combo_image_name->count()-1 ); -} - -void MainUI::removePicture(){ - QString file = getCurrentDir(); - if(!file.endsWith("/")){ file.append("/"); } - file.append(ui->combo_image_name->currentText()); - //Verify permanent removal of file/dir - if(QMessageBox::Yes != QMessageBox::question(this, tr("Verify Removal"), tr("WARNING: This will permanently delete the file from the system!")+"\n"+tr("Are you sure you want to continue?")+"\n\n"+file, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ){ - return; //cancelled - } - if( QFile::remove(file) ){ - int index = ui->combo_image_name->currentIndex(); - ui->combo_image_name->removeItem( index ); - } -} - -void MainUI::rotatePictureLeft(){ - //First load the file fresh (not the scaled version in the UI) - QString file = getCurrentDir(); - if(!file.endsWith("/")){ file.append("/"); } - file.append(ui->combo_image_name->currentText()); - QPixmap pix(file); - //Now rotate the image 90 degrees counter-clockwise - QTransform trans; - pix = pix.transformed( trans.rotate(-90) , Qt::SmoothTransformation); - //Now save the image back to the same file - pix.save(file); - //Now re-load the image in the UI - showNewPicture(); -} - -void MainUI::rotatePictureRight(){ - //First load the file fresh (not the scaled version in the UI) - QString file = getCurrentDir(); - if(!file.endsWith("/")){ file.append("/"); } - file.append(ui->combo_image_name->currentText()); - QPixmap pix(file); - //Now rotate the image 90 degrees counter-clockwise - QTransform trans; - pix = pix.transformed( trans.rotate(90) , Qt::SmoothTransformation); - //Now save the image back to the same file - pix.save(file); - //Now re-load the image in the UI - showNewPicture(); -} - -//---------------------------------- -//ZFS Restore Functions -//---------------------------------- -void MainUI::snapshotLoaded(){ - ui->tree_zfs_dir->resizeColumnToContents(0); -} - -void MainUI::showSnapshot(){ - ui->tool_zfs_prevSnap->setEnabled(ui->slider_zfs_snapshot->value()!=1); - ui->tool_zfs_nextSnap->setEnabled(ui->slider_zfs_snapshot->value()!=ui->slider_zfs_snapshot->maximum()); - ui->label_zfs_snap->setText( snapDirs[ui->slider_zfs_snapshot->value()-1].section("/.zfs/snapshot/",1,1).section("/",0,0) ); - //Load the dir contents - ui->tree_zfs_dir->setRootIndex(snapmod->index(snapDirs[ui->slider_zfs_snapshot->value()-1])); -} - -void MainUI::prevSnapshot(){ - ui->slider_zfs_snapshot->setValue(ui->slider_zfs_snapshot->value()-1); -} - -void MainUI::nextSnapshot(){ - ui->slider_zfs_snapshot->setValue(ui->slider_zfs_snapshot->value()+1); -} - -void MainUI::restoreItems(){ - //Get the selected items - QStringList sel; //= getSelectedItems(); - QModelIndexList items = ui->tree_zfs_dir->selectionModel()->selectedIndexes(); - for(int i=0; i<items.length(); i++){ - sel << snapmod->filePath(items[i]).section("/",-1); - } - sel.removeDuplicates(); - if(sel.isEmpty()){ return; } //nothing selected - if(!checkUserPerms()){ return; } - //Get the directories - QString snapdir = snapDirs[ui->slider_zfs_snapshot->value()-1]; - QString basedir = getCurrentDir(); - if(!basedir.endsWith("/")){ basedir.append("/"); } - if(!snapdir.endsWith("/")){ snapdir.append("/"); } - //Fill out the lists appropriately - QStringList resto; - qDebug() << "Items Selected:" << sel; - for(int i=0; i<sel.length(); i++){ - resto << basedir+sel[i]; - sel[i] = snapdir+sel[i]; - } - qDebug() << "Restore Items:" << sel << "\n" << resto; - //Restore the items - FODialog dlg(this); - dlg.setOverwrite(ui->check_zfs_overwrite->isChecked()); - dlg.RestoreFiles(sel, resto); - dlg.exec(); - if(dlg.noerrors){ - QMessageBox::information(this, tr("Success"), tr("Successfully restored selection") ); - } -} - -//---------------------------- -// Multimedia Player -//---------------------------- -void MainUI::playerStart(){ - if(ui->stackedWidget->currentWidget()!=ui->page_audioPlayer){ return; } //don't play if not in the player - - if(mediaObj->state()==QMediaPlayer::PausedState \ - && mediaObj->currentMedia().canonicalUrl().fileName()==ui->combo_player_list->currentText() ){ - mediaObj->play(); - }else{ - mediaObj->stop(); - //Get the selected file path - QString filePath = getCurrentDir(); - if(!filePath.endsWith("/")){ filePath.append("/"); } - filePath.append( ui->combo_player_list->currentText() ); - mediaObj->setMedia( QUrl::fromLocalFile(filePath) ); - playerTTime.clear(); - playerSlider->setEnabled(mediaObj->isSeekable()); - mediaObj->play(); - } -} - -void MainUI::playerError(){ - QString msg = QString(tr("Error Playing File: %1")); - msg = msg.arg( mediaObj->currentMedia().canonicalUrl().fileName() ); - msg.append("\n"+mediaObj->errorString()); - ui->label_player_novideo->setText(msg); -} - -void MainUI::playerStop(){ - mediaObj->stop(); -} - -void MainUI::playerPause(){ - mediaObj->pause(); -} - -void MainUI::playerNext(){ - ui->combo_player_list->setCurrentIndex( ui->combo_player_list->currentIndex()+1); - if(mediaObj->state()!=QMediaPlayer::StoppedState){ playerStart(); } -} - -void MainUI::playerPrevious(){ - ui->combo_player_list->setCurrentIndex( ui->combo_player_list->currentIndex()-1); - if(mediaObj->state()!=QMediaPlayer::StoppedState){ playerStart(); } -} - -void MainUI::playerFinished(){ - if(ui->combo_player_list->currentIndex()<(ui->combo_player_list->count()-1) && ui->check_player_gotonext->isChecked()){ - ui->combo_player_list->setCurrentIndex( ui->combo_player_list->currentIndex()+1 ); - QTimer::singleShot(0,this,SLOT(playerStart())); - }else{ - ui->label_player_novideo->setText(tr("Finished")); - } -} - -void MainUI::playerStatusChanged(QMediaPlayer::MediaStatus stat){ - //Only use this for end-of-file detection - use the state detection otherwise - if(stat == QMediaPlayer::EndOfMedia){ - if(!mediaObj->isMuted()){ playerFinished(); } //make sure it is not being seeked right now - } -} - -void MainUI::playerStateChanged(QMediaPlayer::State newstate){ - //This function keeps track of updating the visuals of the player - bool running = false; - bool showVideo = false; - QString msg; - switch(newstate){ - case QMediaPlayer::PlayingState: - running=true; - showVideo = mediaObj->isVideoAvailable(); - msg = "";//mediaObj->metaData(Phonon::TitleMetaData).join(" "); - if(msg.simplified().isEmpty()){ msg = ui->combo_player_list->currentText(); } - ui->label_player_novideo->setText(tr("Playing:")+"\n"+msg); - break; - case QMediaPlayer::PausedState: - showVideo=videoDisplay->isVisible(); //don't change the screen - break; - case QMediaPlayer::StoppedState: - ui->label_player_novideo->setText(tr("Stopped")); - break; - } - ui->tool_player_play->setVisible(!running); - ui->tool_player_pause->setVisible(running); - ui->tool_player_stop->setEnabled(running); - ui->label_player_novideo->setVisible(!showVideo); - videoDisplay->setVisible(showVideo); -} - -void MainUI::playerVideoAvailable(bool showVideo){ - ui->label_player_novideo->setVisible(!showVideo); - videoDisplay->setVisible(showVideo); -} - -void MainUI::playerDurationChanged(qint64 dur){ - if(dur < 0){ return; } //not ready yet - playerSlider->setMaximum(mediaObj->duration()); - playerTTime = msToText(dur); -} - -void MainUI::playerTimeChanged(qint64 ctime){ - if(mediaObj->isMuted() || playerTTime.isEmpty() ){ return; } //currently being moved - playerSlider->setSliderPosition(ctime); -} - -void MainUI::playerSliderMoved(int val){ - ui->label_player_runstats->setText( msToText(val)+"/"+playerTTime ); - if(mediaObj->isMuted()){ mediaObj->setPosition(playerSlider->value()); } //currently seeking -} - -void MainUI::playerSliderHeld(){ - mediaObj->setMuted(true); - mediaObj->pause(); -} -void MainUI::playerSliderChanged(){ - if(mediaObj->state()==QMediaPlayer::PausedState){ mediaObj->play(); } - mediaObj->setMuted(false); -} - -void MainUI::playerFileChanged(){ - ui->tool_player_next->setEnabled( ui->combo_player_list->count() > (ui->combo_player_list->currentIndex()+1) ); - ui->tool_player_prev->setEnabled( (ui->combo_player_list->currentIndex()-1) >= 0 ); -} - -//---------------------------------- -// Context Menu Actions -//---------------------------------- -void MainUI::OpenItem(){ - QFileInfoList sel = getSelectedItems(); - if(sel.isEmpty()){ return; } - - QStringList dirs; - for(int i=0; i<sel.length(); i++){ - if(sel[i].isDir()){ dirs << sel[i].absoluteFilePath(); } - else{ - qDebug() << "Opening File:" << sel[i].absoluteFilePath(); - QProcess::startDetached("lumina-open \""+sel[i].absoluteFilePath()+"\""); - } - } - if(!dirs.isEmpty()){ OpenDirs(dirs); } - CItem.clear(); -} - -void MainUI::OpenItemWith(){ - QFileInfoList sel = getSelectedItems(); - if(sel.isEmpty()){ return; } - for(int i=0; i<sel.length(); i++){ - qDebug() << "Opening File With:" << sel[i].absoluteFilePath(); - QProcess::startDetached("lumina-open -select \""+sel[i].absoluteFilePath()+"\""); - } - CItem.clear(); -} - -/*void MainUI::OpenDir(){ - if(CItem.isEmpty()){ - QFileInfoList sel = getSelectedItems(); - if(sel.isEmpty()){ return; } - else{ CItem = sel[0].absoluteFilePath(); } - } - OpenDirs(QStringList() << CItem); - CItem.clear(); -}*/ - -void MainUI::RemoveItem(){ - //Only let this run if viewing the browser page - if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } - if(!checkUserPerms()){ return; } - //Get the selected items - QStringList paths, names; - //if(CItem.isEmpty()){ - QFileInfoList sel = getSelectedItems(); - for(int i=0; i<sel.length(); i++){ - paths << sel[i].absoluteFilePath(); - names << sel[i].fileName(); - } - if(sel.isEmpty()){ return; } //nothing selected - /*}else{ - paths << CItem; - names << CItem.section("/",-1); - }*/ - //Verify permanent removal of file/dir - if(QMessageBox::Yes != QMessageBox::question(this, tr("Verify Removal"), tr("WARNING: This will permanently delete the file(s) from the system!")+"\n"+tr("Are you sure you want to continue?")+"\n\n"+names.join("\n"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ){ - return; //cancelled - } - //Now remove the file/dir - qDebug() << "Delete: "<<paths; - FODialog dlg(this); - dlg.RemoveFiles(paths); - dlg.show(); - dlg.exec(); - CItem.clear(); -} - -void MainUI::RenameItem(){ - //Only let this run if viewing the browser page - if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } - if(!checkUserPerms()){ return; } - if(CItem.isEmpty()){ - QFileInfoList sel = getSelectedItems(); - if(sel.isEmpty()){ return; } - else{ CItem = sel[0].absoluteFilePath(); } - } - QString fname = CItem; - QString path = fname; - fname = fname.section("/",-1); //turn this into just the file name - path.chop(fname.length()); //turn this into the base directory path (has a "/" at the end) - //Now prompt for the new filename - bool ok = false; - QString nname = QInputDialog::getText(this, tr("Rename File"),tr("New Name:"), QLineEdit::Normal, fname, &ok); - if(!ok || nname.isEmpty()){ CItem.clear(); return; } //cancelled - //Now check for a file extension and add it if necessary - QString oext = fname.section(".",-1); - if("."+oext == fname){ oext.clear(); } //hidden file without an extension - else if(oext==fname){ oext.clear(); } //no extension - QString next = nname.section(".",-1); - if(next==nname){ next.clear(); } //no extension - if(next.isEmpty() && !oext.isEmpty()){ - nname.append( "."+oext ); - } - //Check if this filename already exists - bool overwrite = QFile::exists(path+nname); - if(overwrite){ - if(QMessageBox::Yes != QMessageBox::question(this, tr("Overwrite File?"), tr("An existing file with the same name will be replaced. Are you sure you want to proceed?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ){ - CItem.clear(); return; //cancelled - } - } - //Now perform the move - qDebug() << "Rename:" << path+fname << "->" << path+nname; - FODialog dlg(this); - dlg.setOverwrite(overwrite); - dlg.MoveFiles(QStringList() << path+fname, QStringList() << path+nname); - dlg.show(); - dlg.exec(); - CItem.clear(); - - ItemSelectionChanged(); -} - -void MainUI::FavoriteItem(){ - if(CItem.isEmpty()){ - QFileInfoList sel = getSelectedItems(); - if(sel.isEmpty()){ return; } - else{ CItem = sel[0].canonicalFilePath(); } - } - //QString fname = CItem; - QString fullpath = CItem; - /*fname = fname.section("/",-1); //turn this into just the file name - if(QFile::exists(favdir+fname)){ QFile::remove(favdir+fname); } //remove the stale link - QFile::link(fullpath, favdir+fname);*/ - LUtils::addFavorite(fullpath); - CItem.clear(); - ItemSelectionChanged(); -} - -void MainUI::ViewPropertiesItem(){ - QFileInfoList sel = getSelectedItems(); - if(sel.isEmpty()){ return; } - for(int i=0; i<sel.length(); i++){ - QProcess::startDetached("lumina-fileinfo \""+sel[i].absoluteFilePath()+"\""); - } -} - -void MainUI::openTerminal(){ - QFileInfoList sel = getSelectedItems(); - QString shell; - //we get the shell has defined in the environment - if (getenv("SHELL")) shell = QString(getenv("SHELL")); - else shell = QString("/bin/sh"); - //we use the application defined as thate default terminal - QSettings *sessionsettings = new QSettings( QSettings::UserScope, "LuminaDE","sessionsettings", this); - //xterm remains the default - QString defTerminal = sessionsettings->value("default-terminal", "xterm").toString(); - if(defTerminal.endsWith(".desktop")){ - //Pull the binary name out of the shortcut - bool ok = false; - XDGDesktop DF = LXDG::loadDesktopFile(defTerminal,ok); - if(!ok){ defTerminal = "xterm"; } - else{ defTerminal = DF.exec.section(" ",0,0); } //only take the binary name - not any other flags - } - if( !LUtils::isValidBinary(defTerminal) ){ - //The binary does not exist or is invalid - defTerminal = "xterm"; - } - if(sel.isEmpty()){ - //-e is the parameter for most of the terminal appliction to execute an external command. - //In your case we start a shell in the selected directory - QProcess::startDetached(defTerminal + " -e \"cd " + getCurrentDir() + " && " + shell + " \" "); - } else { - QProcess::startDetached(defTerminal + " -e \"cd " + sel[0].absoluteFilePath() + " && " + shell + " \" "); - } -} - - -void MainUI::CutItems(){ - //Only let this run if viewing the browser page - if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } - if(!checkUserPerms()){ return; } - //Get all the selected Items - QFileInfoList sel = getSelectedItems(); - QStringList items; - if(sel.isEmpty()){ return; } //nothing selected - //Format the data string - for(int i=0; i<sel.length(); i++){ - items << "cut::::"+sel[i].absoluteFilePath(); - //sel[i] = sel[i].prepend("cut::::"); - } - - //Now save that data to the global clipboard - QMimeData *dat = new QMimeData; - dat->clear(); - dat->setData("x-special/lumina-copied-files", items.join("\n").toLocal8Bit()); - QApplication::clipboard()->clear(); - QApplication::clipboard()->setMimeData(dat); - ItemSelectionChanged(); -} - -void MainUI::CopyItems(){ - //Only let this run if viewing the browser page - if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } - //Get all the selected Items - QFileInfoList sel = getSelectedItems(); - QStringList items; - if(sel.isEmpty()){ return; } //nothing selected - //Format the data string - for(int i=0; i<sel.length(); i++){ - items << "copy::::"+sel[i].absoluteFilePath(); - //sel[i] = sel[i].prepend("copy::::"); - } - //Now save that data to the global clipboard - QMimeData *dat = new QMimeData; - dat->clear(); - dat->setData("x-special/lumina-copied-files", items.join("\n").toLocal8Bit()); - QApplication::clipboard()->clear(); - QApplication::clipboard()->setMimeData(dat); - ItemSelectionChanged(); -} - -void MainUI::PasteItems(){ - //Only let this run if viewing the browser page - if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } - const QMimeData *dat = QApplication::clipboard()->mimeData(); - if(!dat->hasFormat("x-special/lumina-copied-files")){ return; } //nothing to paste - if(!checkUserPerms()){ return; } - QStringList cut, copy, newcut, newcopy; - QStringList raw = QString(dat->data("x-special/lumina-copied-files")).split("\n"); - QString base = getCurrentDir(); - if(!base.endsWith("/")){ base.append("/"); } - for(int i=0; i<raw.length(); i++){ - if(raw[i].startsWith("cut::::")){ - cut << raw[i].section("::::",1,50); - newcut << base+raw[i].section("::::",1,50).section("/",-1); - } - else if(raw[i].startsWith("copy::::")){ - copy << raw[i].section("::::",1,50); - newcopy<< base+raw[i].section("::::",1,50).section("/",-1); - } - } - bool errs = false; - //Perform the copy/move operations - if(!copy.isEmpty()){ - qDebug() << "Paste Copy:" << copy << "->" << newcopy; - FODialog dlg(this); - dlg.CopyFiles(copy, newcopy); - dlg.show(); - dlg.exec(); - errs = errs || !dlg.noerrors; - } - if(!cut.isEmpty()){ - qDebug() << "Paste Cut:" << cut << "->" << newcut; - FODialog dlg(this); - dlg.MoveFiles(cut, newcut); - dlg.show(); - dlg.exec(); - errs = errs || !dlg.noerrors; - } - //Modify the clipboard appropriately - if(!errs && !cut.isEmpty()){ - //Now clear the clipboard since those old file locations are now invalid - QApplication::clipboard()->clear(); - if(!copy.isEmpty()){ - //There were also files copied: save those files back into the clipboard - QMimeData *dat = new QMimeData; - dat->clear(); - dat->setData("x-special/lumina-copied-files", raw.filter("copy::::").join("\n").toLocal8Bit()); - QApplication::clipboard()->setMimeData(dat); - } - } - ItemSelectionChanged(); -} - -void MainUI::ChecksumItems(){ - if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } - QFileInfoList sel = getSelectedItems(); - if(sel.isEmpty()){ return; } - QStringList info, files; - for(int i=0; i<sel.length(); i++){ - files << sel[i].absoluteFilePath(); - } - qDebug() << "Run Checksums:" << files; - 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 \t(%1)").arg(files[i].section("/",-1), info[i]); - } - /*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 MainUI::resizeEvent(QResizeEvent *event){ - //Save the new size internally - settings->setValue("geometry/height", event->size().height()); - settings->setValue("geometry/width", event->size().width()); -} diff --git a/lumina-fm/MainUI-old.h b/lumina-fm/MainUI-old.h deleted file mode 100644 index cf9669b1..00000000 --- a/lumina-fm/MainUI-old.h +++ /dev/null @@ -1,238 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2014, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This is the main interface for the Lumina File Manager (Insight) -//=========================================== -#ifndef _LUMINA_FILE_MANAGER_UI_H -#define _LUMINA_FILE_MANAGER_UI_H -// Qt includes -#include <QMainWindow> -#include <QTabBar> -#include <QLineEdit> -#include <QFileSystemModel> -#include <QStringList> -#include <QDebug> -#include <QAction> -#include <QProcess> -#include <QSettings> -#include <QInputDialog> -#include <QMessageBox> -#include <QDir> -#include <QTimer> -#include <QDateTime> -#include <QShortcut> -#include <QCompleter> -#include <QClipboard> -#include <QMimeData> -#include <QTreeWidgetItem> -#include <QListWidgetItem> -#include <QRadioButton> -#include <QWidgetAction> -#include <QImageReader> -#include <QScrollBar> -#include <QFileDialog> -#include <QResizeEvent> -#include <QDesktopWidget> -#include <QThread> -#include <QUrl> -#include <QThread> - -//Multimedia Widgets -#include <QVideoWidget> -#include <QMediaPlayer> - -// libLumina includes -#include <LuminaXDG.h> -#include <LuminaOS.h> - -// Local includes -#include "FODialog.h" //file operation dialog -#include "BMMDialog.h" //bookmark manager dialog -#include "MimeIconProvider.h" //icon provider for the view widgets -#include "BackgroundWorker.h" -#include "DDFileSystemModel.h" - -namespace Ui{ - class MainUI; -}; - -class MainUI : public QMainWindow{ - Q_OBJECT -public: - MainUI(); - ~MainUI(); - - void OpenDirs(QStringList); //called from the main.cpp after initialization - -public slots: - void setupIcons(); //used during initialization - -private: - Ui::MainUI *ui; - QThread *workThread; - BackgroundWorker *worker; - //Internal non-ui widgets - QTabBar *tabBar; - QLineEdit *currentDir; - DDFileSystemModel *fsmod; - QFileSystemModel *snapmod; - //QFileSystemWatcher *fswatcher; - MimeIconProvider *iconProv; - QMenu *contextMenu; - QRadioButton *radio_view_details, *radio_view_list, *radio_view_icons; - QWidgetAction *detWA, *listWA, *icoWA; - QString favdir; - - //Phonon Widgets for the multimedia player - QMediaPlayer *mediaObj; - QVideoWidget *videoDisplay; - QSlider *playerSlider; - QString playerTTime; //total time - to prevent recalculation every tick - - //Internal variables - QStringList snapDirs; //internal saved variable for the discovered zfs snapshot dirs - QString CItem; //the item that was right-clicked (for the context menu) - //QStringList imgFilter, multiFilter; //image/multimedia filters - QSettings *settings; - QShortcut *nextTabLShort, *nextTabRShort, *closeTabShort, *copyFilesShort, *cutFilesShort, *pasteFilesShort, *deleteFilesShort; - QCompleter *dirCompleter; - bool isUserWritable, keepFocus; - QTimer *syncTimer; - - //Simplification Functions - void setupConnections(); //used during initialization - void loadSettings(); //used during initialization - - void RebuildBookmarksMenu(); - void RebuildDeviceMenu(); - - bool checkUserPerms(); - QString msToText(qint64 ms); - - //Common functions for browser info/usage - QString getCurrentDir(); - void setCurrentDir(QString); - QFileInfoList getSelectedItems(); - //QModelIndexList getVisibleItems(); - -private slots: - void slotSingleInstance(QStringList in){ - this->show(); - this->raise(); - this->OpenDirs(in); - } - - void slotStartSyncTimer(); - - //General button check functions (started in a seperate thread!) - void AvailableMultimediaFiles(QStringList files); - void AvailableBackups(QString basedir, QStringList snapdirs); - void AvailablePictures(QStringList files); - - //General page switching - void goToMultimediaPage(); - void goToRestorePage(); - void goToSlideshowPage(); - void goToBrowserPage(); - - //Menu Actions - void on_actionNew_Tab_triggered(); - void on_actionSearch_triggered(); - void on_actionClose_triggered(); - void on_actionView_Hidden_Files_triggered(); - void on_actionShow_Action_Buttons_triggered(); - void on_actionShow_Thumbnails_triggered(); - void goToBookmark(QAction*); - void goToDevice(QAction*); - void viewModeChanged(bool); - - //Toolbar Actions - void on_actionBack_triggered(); - void on_actionUpDir_triggered(); - void on_actionHome_triggered(); - void on_actionBookMark_triggered(); - - //Browser Functions - void startEditDir(QWidget *old, QWidget *now); - void goToDirectory(); //go to a manually typed in directory - void reloadDirectory(); //Update the widget with the dir contents - void currentDirectoryLoaded(); //The file system model re-loaded the directory - void on_tool_addToDir_clicked(); - void on_tool_addNewFile_clicked(); - void tabChanged(int tab); - void tabClosed(int tab = -1); - void prevTab(); - void nextTab(); - void ItemRun( const QModelIndex&); - //void ItemRun(QTreeWidgetItem *item); - //void ItemRun(QListWidgetItem *item); - void OpenContextMenu(const QPoint&); - void ItemSelectionChanged(); - - //Slideshow Functions - void showNewPicture(); - void firstPicture(); - void prevPicture(); - void nextPicture(); - void lastPicture(); - void removePicture(); - void rotatePictureLeft(); - void rotatePictureRight(); - - //ZFS Restore Functions - void snapshotLoaded(); - void showSnapshot(); - void nextSnapshot(); - void prevSnapshot(); - void restoreItems(); - - //Multimedia Player Functions - void playerStart(); - void playerError(); - void playerStop(); - void playerPause(); - void playerNext(); - void playerPrevious(); - void playerFinished(); //automatically called by the media object - void playerStatusChanged(QMediaPlayer::MediaStatus stat); //automatically called - void playerStateChanged(QMediaPlayer::State newstate); //automatically called by the media object - void playerVideoAvailable(bool showVideo); //automatically called by the media object - void playerDurationChanged(qint64); - void playerTimeChanged(qint64 ctime); //automatically called by the media object - void playerSliderMoved(int); - void playerSliderHeld(); - void playerSliderChanged(); - void playerFileChanged(); - - //Context Menu Actions - void OpenItem(); //run "lumina-open" on it - void OpenItemWith(); //run "lumina-open -select" on it - //void OpenDir(); //open the dir in a new tab - void RemoveItem(); //Remove the item permanently - // - single item actions - void RenameItem(); - void FavoriteItem(); - // - full selection actions - void ViewPropertiesItem(); - void openTerminal(); - void CutItems(); - void CopyItems(); - void PasteItems(); - void ChecksumItems(); - - //file info in status bar - void DisplayStatusBar(QString); - -signals: - void DirChanged(QString path); - void Si_AdaptStatusBar(QFileInfoList fileList, QString path, QString messageFolders, QString messageFiles); - -protected: - void resizeEvent(QResizeEvent*); - -}; - -#endif diff --git a/lumina-fm/MainUI-old.ui b/lumina-fm/MainUI-old.ui deleted file mode 100644 index a978e871..00000000 --- a/lumina-fm/MainUI-old.ui +++ /dev/null @@ -1,1315 +0,0 @@ -<?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>567</width> - <height>415</height> - </rect> - </property> - <property name="windowTitle"> - <string>Insight</string> - </property> - <widget class="QWidget" name="centralwidget"> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <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="QStackedWidget" name="stackedWidget"> - <property name="currentIndex"> - <number>0</number> - </property> - <widget class="QWidget" name="page_browser"> - <layout class="QGridLayout" name="gridLayout"> - <property name="leftMargin"> - <number>1</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="rightMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <property name="spacing"> - <number>1</number> - </property> - <item row="0" column="1"> - <layout class="QVBoxLayout" name="verticalLayout_browser"> - <property name="spacing"> - <number>0</number> - </property> - <item> - <widget class="QListView" name="list_dir_view"> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="showDropIndicator" stdset="0"> - <bool>true</bool> - </property> - <property name="dragEnabled"> - <bool>true</bool> - </property> - <property name="dragDropMode"> - <enum>QAbstractItemView::InternalMove</enum> - </property> - <property name="defaultDropAction"> - <enum>Qt::MoveAction</enum> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::ExtendedSelection</enum> - </property> - <property name="textElideMode"> - <enum>Qt::ElideRight</enum> - </property> - <property name="isWrapping" stdset="0"> - <bool>true</bool> - </property> - <property name="resizeMode"> - <enum>QListView::Adjust</enum> - </property> - <property name="layoutMode"> - <enum>QListView::SinglePass</enum> - </property> - <property name="spacing"> - <number>1</number> - </property> - <property name="uniformItemSizes"> - <bool>false</bool> - </property> - <property name="batchSize"> - <number>10</number> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - <property name="selectionRectVisible"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QTreeView" name="tree_dir_view"> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Sunken</enum> - </property> - <property name="showDropIndicator" stdset="0"> - <bool>true</bool> - </property> - <property name="dragEnabled"> - <bool>true</bool> - </property> - <property name="dragDropMode"> - <enum>QAbstractItemView::InternalMove</enum> - </property> - <property name="defaultDropAction"> - <enum>Qt::MoveAction</enum> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::ExtendedSelection</enum> - </property> - <property name="indentation"> - <number>0</number> - </property> - <property name="rootIsDecorated"> - <bool>false</bool> - </property> - <property name="uniformRowHeights"> - <bool>true</bool> - </property> - <property name="itemsExpandable"> - <bool>false</bool> - </property> - <property name="sortingEnabled"> - <bool>true</bool> - </property> - <property name="expandsOnDoubleClick"> - <bool>false</bool> - </property> - <attribute name="headerCascadingSectionResizes"> - <bool>true</bool> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>30</number> - </attribute> - <attribute name="headerStretchLastSection"> - <bool>true</bool> - </attribute> - </widget> - </item> - </layout> - </item> - <item row="0" column="0"> - <widget class="QGroupBox" name="group_actions"> - <property name="title"> - <string/> - </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> - <item row="1" column="0" colspan="2"> - <layout class="QHBoxLayout" name="horizontalLayout_4"> - <property name="spacing"> - <number>0</number> - </property> - <item> - <widget class="QLabel" name="label_dir_stats"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string notr="true"/> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_addNewFile"> - <property name="statusTip"> - <string>Create a new file</string> - </property> - <property name="text"> - <string>New &file</string> - </property> - <property name="popupMode"> - <enum>QToolButton::InstantPopup</enum> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_addToDir"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="statusTip"> - <string>Create a new subdirectory</string> - </property> - <property name="text"> - <string notr="true">&New Dir</string> - </property> - <property name="shortcut"> - <string>Ctrl+N</string> - </property> - <property name="popupMode"> - <enum>QToolButton::InstantPopup</enum> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_goToPlayer"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="toolTip"> - <string>Open Multimedia Player</string> - </property> - <property name="statusTip"> - <string>Play any multimedia files in this directory</string> - </property> - <property name="text"> - <string>&Play</string> - </property> - <property name="shortcut"> - <string>Ctrl+P, Ctrl+S</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_goToImages"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="toolTip"> - <string>View Slideshow</string> - </property> - <property name="statusTip"> - <string>View all the images in this directory as a slideshow</string> - </property> - <property name="text"> - <string>&Slideshow</string> - </property> - <property name="shortcut"> - <string>Ctrl+S</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_goToRestore"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="toolTip"> - <string>Restore File(s)</string> - </property> - <property name="statusTip"> - <string>Restore old versions of files or directories</string> - </property> - <property name="text"> - <string>&Backups</string> - </property> - <property name="shortcut"> - <string>Ctrl+B</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_audioPlayer"> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QCheckBox" name="check_player_gotonext"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Go To Next</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line_3"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>30</width> - <height>0</height> - </size> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_player_prev"> - <property name="text"> - <string notr="true">prev</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="combo_player_list"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_player_next"> - <property name="text"> - <string notr="true">next</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="videoLayout"> - <item> - <widget class="QLabel" name="label_player_novideo"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <pointsize>13</pointsize> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="styleSheet"> - <string notr="true">background: black; color: white;</string> - </property> - <property name="text"> - <string>(No Running Video)</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="videoControlLayout"> - <item> - <widget class="QToolButton" name="tool_player_play"> - <property name="text"> - <string notr="true">play</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_player_pause"> - <property name="text"> - <string notr="true">pause</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_player_stop"> - <property name="text"> - <string notr="true">stop</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line_4"> - <property name="minimumSize"> - <size> - <width>30</width> - <height>0</height> - </size> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_player_runstats"> - <property name="text"> - <string notr="true">?/?</string> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_image_view"> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_5"> - <item> - <layout class="QVBoxLayout" name="verticalLayout_4"> - <item> - <widget class="QToolButton" name="tool_image_remove"> - <property name="toolTip"> - <string>Delete this image file</string> - </property> - <property name="text"> - <string notr="true">...</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line_8"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_image_rotateleft"> - <property name="toolTip"> - <string>Rotate this image file counter-clockwise</string> - </property> - <property name="text"> - <string notr="true">...</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_image_rotateright"> - <property name="toolTip"> - <string>Rotate this image file clockwise</string> - </property> - <property name="text"> - <string notr="true">...</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item> - <widget class="QLabel" name="label_image"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="styleSheet"> - <string notr="true">QLabel{ background: grey; }</string> - </property> - <property name="frameShape"> - <enum>QFrame::StyledPanel</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <property name="text"> - <string notr="true"/> - </property> - <property name="scaledContents"> - <bool>false</bool> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <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_image_goBegin"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="toolTip"> - <string>Go to Beginning</string> - </property> - <property name="text"> - <string>...</string> - </property> - <property name="shortcut"> - <string>Shift+Left</string> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_image_goPrev"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="toolTip"> - <string>Go to Previous</string> - </property> - <property name="text"> - <string>...</string> - </property> - <property name="shortcut"> - <string>Left</string> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="combo_image_name"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="focusPolicy"> - <enum>Qt::StrongFocus</enum> - </property> - <property name="frame"> - <bool>true</bool> - </property> - <item> - <property name="text"> - <string>File Name</string> - </property> - </item> - </widget> - </item> - <item> - <widget class="QLabel" name="label_image_index"> - <property name="text"> - <string notr="true">1/10</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_image_goNext"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="toolTip"> - <string>Go to Next</string> - </property> - <property name="text"> - <string>...</string> - </property> - <property name="shortcut"> - <string>Right</string> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_image_goEnd"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="toolTip"> - <string>Go to End</string> - </property> - <property name="text"> - <string>...</string> - </property> - <property name="shortcut"> - <string>Shift+Right</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_zfs"> - <layout class="QVBoxLayout" name="verticalLayout_6"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_7"> - <item> - <widget class="QToolButton" name="tool_zfs_prevSnap"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Older</string> - </property> - <property name="shortcut"> - <string>Left</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextUnderIcon</enum> - </property> - </widget> - </item> - <item> - <layout class="QVBoxLayout" name="verticalLayout_5"> - <item> - <widget class="QSlider" name="slider_zfs_snapshot"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="maximum"> - <number>20</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="tickPosition"> - <enum>QSlider::TicksAbove</enum> - </property> - <property name="tickInterval"> - <number>1</number> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_zfs_snap"> - <property name="text"> - <string notr="true">Snapshot</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QToolButton" name="tool_zfs_nextSnap"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Newer</string> - </property> - <property name="shortcut"> - <string>Right</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextUnderIcon</enum> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QTreeView" name="tree_zfs_dir"> - <property name="focusPolicy"> - <enum>Qt::StrongFocus</enum> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::ExtendedSelection</enum> - </property> - <property name="selectionBehavior"> - <enum>QAbstractItemView::SelectRows</enum> - </property> - <property name="rootIsDecorated"> - <bool>false</bool> - </property> - <property name="itemsExpandable"> - <bool>false</bool> - </property> - <property name="sortingEnabled"> - <bool>true</bool> - </property> - <property name="expandsOnDoubleClick"> - <bool>false</bool> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_8"> - <item> - <widget class="QToolButton" name="tool_zfs_restoreItem"> - <property name="toolTip"> - <string>Restore Selected Item</string> - </property> - <property name="text"> - <string>&Restore Selection</string> - </property> - <property name="shortcut"> - <string>Ctrl+R</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_3"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QCheckBox" name="check_zfs_overwrite"> - <property name="text"> - <string>&Overwrite Existing Files</string> - </property> - <property name="shortcut"> - <string>Ctrl+O</string> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - </widget> - </item> - </layout> - </widget> - <widget class="QMenuBar" name="menubar"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>567</width> - <height>20</height> - </rect> - </property> - <widget class="QMenu" name="menuFile"> - <property name="title"> - <string>File</string> - </property> - <addaction name="actionNew_Tab"/> - <addaction name="actionSearch"/> - <addaction name="separator"/> - <addaction name="actionClose"/> - </widget> - <widget class="QMenu" name="menuView"> - <property name="title"> - <string>View</string> - </property> - <addaction name="actionShow_Thumbnails"/> - <addaction name="actionView_Hidden_Files"/> - <addaction name="actionShow_Action_Buttons"/> - <addaction name="separator"/> - </widget> - <widget class="QMenu" name="menuBookmarks"> - <property name="title"> - <string>Bookmarks</string> - </property> - <addaction name="actionManage_Bookmarks"/> - </widget> - <widget class="QMenu" name="menuExternal_Devices"> - <property name="title"> - <string>External Devices</string> - </property> - <addaction name="actionScan"/> - <addaction name="separator"/> - </widget> - <addaction name="menuFile"/> - <addaction name="menuView"/> - <addaction name="menuBookmarks"/> - <addaction name="menuExternal_Devices"/> - </widget> - <widget class="QStatusBar" name="statusbar"/> - <widget class="QToolBar" name="toolBar"> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> - </property> - <property name="windowTitle"> - <string>toolBar</string> - </property> - <property name="movable"> - <bool>false</bool> - </property> - <property name="floatable"> - <bool>false</bool> - </property> - <attribute name="toolBarArea"> - <enum>TopToolBarArea</enum> - </attribute> - <attribute name="toolBarBreak"> - <bool>false</bool> - </attribute> - <addaction name="actionBackToBrowser"/> - <addaction name="actionBack"/> - <addaction name="actionUpDir"/> - <addaction name="actionHome"/> - <addaction name="actionBookMark"/> - </widget> - <action name="actionNew_Tab"> - <property name="text"> - <string>New &Tab</string> - </property> - <property name="shortcut"> - <string>Ctrl+T</string> - </property> - </action> - <action name="actionClose"> - <property name="text"> - <string>Exit</string> - </property> - <property name="shortcut"> - <string>Ctrl+Q</string> - </property> - <property name="shortcutContext"> - <enum>Qt::ApplicationShortcut</enum> - </property> - </action> - <action name="action_Preferences"> - <property name="text"> - <string>&Preferences</string> - </property> - </action> - <action name="actionUpDir"> - <property name="text"> - <string>UpDir</string> - </property> - <property name="toolTip"> - <string>Go up one directory</string> - </property> - <property name="shortcut"> - <string>Alt+Up</string> - </property> - </action> - <action name="actionHome"> - <property name="text"> - <string>&Home</string> - </property> - <property name="toolTip"> - <string>Go to your home directory</string> - </property> - <property name="shortcut"> - <string>Alt+H</string> - </property> - </action> - <action name="actionView_Hidden_Files"> - <property name="checkable"> - <bool>true</bool> - </property> - <property name="checked"> - <bool>true</bool> - </property> - <property name="text"> - <string>Show Hidden Files</string> - </property> - </action> - <action name="actionBack"> - <property name="text"> - <string>Back</string> - </property> - <property name="toolTip"> - <string>Back to directory</string> - </property> - <property name="shortcut"> - <string>Alt+Left</string> - </property> - </action> - <action name="actionBookMark"> - <property name="text"> - <string>Bookmark</string> - </property> - <property name="toolTip"> - <string>Bookmark this directory</string> - </property> - <property name="shortcut"> - <string>Ctrl+D</string> - </property> - </action> - <action name="actionScan"> - <property name="text"> - <string>Scan for Devices</string> - </property> - </action> - <action name="actionBackToBrowser"> - <property name="text"> - <string notr="true">BBack</string> - </property> - <property name="iconText"> - <string notr="true">BBack</string> - </property> - <property name="toolTip"> - <string>Back to the system</string> - </property> - <property name="shortcut"> - <string>Alt+Left</string> - </property> - </action> - <action name="actionManage_Bookmarks"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="text"> - <string>Manage Bookmarks</string> - </property> - <property name="whatsThis"> - <string notr="true"/> - </property> - </action> - <action name="actionShow_Action_Buttons"> - <property name="checkable"> - <bool>true</bool> - </property> - <property name="checked"> - <bool>true</bool> - </property> - <property name="text"> - <string>Show Action Buttons</string> - </property> - </action> - <action name="actionShow_Thumbnails"> - <property name="checkable"> - <bool>true</bool> - </property> - <property name="checked"> - <bool>true</bool> - </property> - <property name="text"> - <string>Load Thumbnails</string> - </property> - </action> - <action name="actionSearch"> - <property name="text"> - <string>Search Directory</string> - </property> - <property name="shortcut"> - <string>Ctrl+F</string> - </property> - </action> - </widget> - <resources/> - <connections/> -</ui> diff --git a/lumina-fm/MainUI.cpp b/lumina-fm/MainUI.cpp index 732554dd..15b0f93e 100644 --- a/lumina-fm/MainUI.cpp +++ b/lumina-fm/MainUI.cpp @@ -1,13 +1,12 @@ //=========================================== // Lumina-DE source code -// Copyright (c) 2014, Ken Moore +// Copyright (c) 2014-2015, Ken Moore // Available under the 3-clause BSD license // See the LICENSE file for full details //=========================================== #include "MainUI.h" #include "ui_MainUI.h" -#include <QImageWriter> #include <QFileInfo> #define DEBUG 0 @@ -15,15 +14,16 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){ //for Signal/slot we must register the Typedef of QFileInfoList qRegisterMetaType<QFileInfoList>("QFileInfoList"); + qRegisterMetaType< LFileInfoList >("LFileInfoList"); ui->setupUi(this); if(DEBUG){ qDebug() << "Initilization:"; } //Be careful about the QSettings setup, it must match the lumina-desktop setup QSettings::setPath(QSettings::NativeFormat, QSettings::UserScope, QDir::homePath()+"/.lumina"); settings = new QSettings( QSettings::UserScope, "LuminaDE", "lumina-fm", this); favdir = QDir::homePath()+"/.lumina/favorites/"; //save this for later - syncTimer = new QTimer(this); - syncTimer->setInterval(200); //1/5 second (collect as many signals/slots as necessary - syncTimer->setSingleShot(true); + //syncTimer = new QTimer(this); + //syncTimer->setInterval(200); //1/5 second (collect as many signals/slots as necessary + //syncTimer->setSingleShot(true); //Reset the UI to the previously used size (if possible) if(DEBUG){ qDebug() << " - Reset window size"; } int height = settings->value("geometry/height",-1).toInt(); @@ -37,75 +37,55 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){ tabBar->setMovable(true); //tabs are independant - so allow the user to sort them tabBar->setShape(QTabBar::RoundedNorth); tabBar->setFocusPolicy(Qt::NoFocus); - ui->verticalLayout_browser->insertWidget(0,tabBar); - currentDir = new QLineEdit(this); - ui->toolBar->insertWidget(ui->actionBookMark, currentDir); - currentDir->setFocusPolicy(Qt::StrongFocus); + static_cast<QBoxLayout*>(ui->centralwidget->layout())->insertWidget(0,tabBar); if(DEBUG){ qDebug() << " - Threading"; } workThread = new QThread; workThread->setObjectName("Lumina-fm filesystem worker"); - worker = new BackgroundWorker; + worker = new DirData(); + worker->zfsavailable = LUtils::isValidBinary("zfs"); + connect(worker, SIGNAL(DirDataAvailable(QString, QString, LFileInfoList)), this, SLOT(DirDataAvailable(QString, QString, LFileInfoList)) ); + connect(worker, SIGNAL(SnapshotDataAvailable(QString, QString, QStringList)), this, SLOT(SnapshotDataAvailable(QString, QString, QStringList)) ); worker->moveToThread(workThread); if(DEBUG){ qDebug() << " - File System Model"; } - fsmod = new DDFileSystemModel(this); - fsmod->setRootPath("/"); - //fsmod->setReadOnly(false); //required for DnD, but also enables a lot of other stuff - //qDebug() << "DnD options:" << fsmod->supportedDropActions(); - ui->tree_dir_view->setModel(fsmod); - ui->tree_dir_view->sortByColumn(0, Qt::AscendingOrder); - ui->tree_dir_view->setColumnWidth(0,200); - ui->tree_dir_view->setColumnWidth(1,80); //size column should be small - ui->tree_dir_view->setColumnWidth(2,80); //type column should be small - ui->list_dir_view->setModel(fsmod); + fsmod = new QFileSystemModel(this); + fsmod->setRootPath(QDir::homePath()); dirCompleter = new QCompleter(fsmod, this); dirCompleter->setModelSorting( QCompleter::CaseInsensitivelySortedModel ); - currentDir->setCompleter(dirCompleter); - snapmod = new QFileSystemModel(this); - ui->tree_zfs_dir->setModel(snapmod); - ui->tree_zfs_dir->sortByColumn(0, Qt::AscendingOrder); - if(DEBUG){ qDebug() << " - Icon Provider"; } - iconProv = new MimeIconProvider(); - fsmod->setIconProvider(iconProv); - snapmod->setIconProvider(iconProv); if(DEBUG){ qDebug() << " - Context Menu"; } contextMenu = new QMenu(this); radio_view_details = new QRadioButton(tr("Detailed List"), this); radio_view_list = new QRadioButton(tr("Basic List"), this); - radio_view_icons = new QRadioButton(tr("Icons"), this); + radio_view_tabs = new QRadioButton(tr("Prefer Tabs"), this); + radio_view_cols = new QRadioButton(tr("Prefer Columns"), this); + ui->menuView_Mode->clear(); + ui->menuGroup_Mode->clear(); detWA = new QWidgetAction(this); detWA->setDefaultWidget(radio_view_details); listWA = new QWidgetAction(this); listWA->setDefaultWidget(radio_view_list); - icoWA = new QWidgetAction(this); - icoWA->setDefaultWidget(radio_view_icons); - ui->menuView->addAction(detWA); - ui->menuView->addAction(listWA); - ui->menuView->addAction(icoWA); - //Setup the special Phonon widgets - if(DEBUG){ qDebug() << " - Multimedia Widgets"; } - mediaObj = new QMediaPlayer(this); - mediaObj->setVolume(100); - mediaObj->setNotifyInterval(500); //only every 1/2 second update - videoDisplay = new QVideoWidget(this); - videoDisplay->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - ui->videoLayout->addWidget(videoDisplay); - mediaObj->setVideoOutput(videoDisplay); - videoDisplay->setVisible(false); - playerSlider = new QSlider(this); - playerSlider->setOrientation(Qt::Horizontal); - ui->videoControlLayout->insertWidget(4, playerSlider); - ui->tool_player_stop->setEnabled(false); //nothing to stop yet - ui->tool_player_pause->setVisible(false); //nothing to pause yet - playerSlider->setEnabled(false); //nothing to seek yet + tabsWA = new QWidgetAction(this); + tabsWA->setDefaultWidget(radio_view_tabs); + colsWA = new QWidgetAction(this); + colsWA->setDefaultWidget(radio_view_cols); + ui->menuView_Mode->addAction(detWA); + ui->menuView_Mode->addAction(listWA); + ui->menuGroup_Mode->addAction(tabsWA); + ui->menuGroup_Mode->addAction(colsWA); + //Setup the pages + //ui->BrowserLayout->clear(); + ui->page_player->setLayout(new QVBoxLayout()); + ui->page_image->setLayout(new QVBoxLayout()); + MW = new MultimediaWidget(this); + SW = new SlideshowWidget(this); + ui->page_player->layout()->addWidget(MW); + ui->page_image->layout()->addWidget(SW); + //Setup any specialty keyboard shortcuts if(DEBUG){ qDebug() << " - Keyboard Shortcuts"; } nextTabLShort = new QShortcut( QKeySequence(tr("Shift+Left")), this); nextTabRShort = new QShortcut( QKeySequence(tr("Shift+Right")), this); closeTabShort = new QShortcut( QKeySequence(tr("Ctrl+W")), this); - 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); + //Finish loading the interface workThread->start(); if(DEBUG){ qDebug() << " - Icons"; } @@ -120,7 +100,7 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){ RebuildDeviceMenu(); //Make sure we start on the browser page if(DEBUG){ qDebug() << " - Load Browser Page"; } - goToBrowserPage(); + //goToBrowserPage(); if(DEBUG){ qDebug() << " - Done with init"; } } @@ -130,25 +110,67 @@ MainUI::~MainUI(){ } void MainUI::OpenDirs(QStringList dirs){ + if(dirs.isEmpty()){ dirs << QDir::homePath(); } QStringList invalid; for(int i=0; i<dirs.length(); i++){ - //Add this directory in a new tab + if(dirs[i].simplified().isEmpty()){ continue; } + //Open this directory in a viewer if(dirs[i].endsWith("/")){ dirs[i].chop(1); } if(!QFile::exists(dirs[i])){ invalid << dirs[i]; continue; } if(DEBUG){ qDebug() << "Open Directory:" << dirs[i]; } - int index = tabBar->addTab( dirs[i].section("/",-1) ); - tabBar->setTabWhatsThis( index, dirs[i] ); - if(index==0){ setCurrentDir(dirs[i]); }//display this as the current dir - } + ///Get a new Unique ID + int id = 0; + for(int j=0; j<DWLIST.length(); j++){ + if(DWLIST[j]->id().section("-",1,1).toInt() >= id){ id = DWLIST[j]->id().section("-",1,1).toInt()+1; } + } + //Create the new DirWidget + DirWidget *DW = new DirWidget("DW-"+QString::number(id), this); + ui->BrowserLayout->addWidget(DW); + DWLIST << DW; + //Connect the signals/slots for it + connect(DW, SIGNAL(OpenDirectories(QStringList)), this, SLOT(OpenDirs(QStringList)) ); + connect(DW, SIGNAL(LoadDirectory(QString, QString)), worker, SLOT(GetDirData(QString, QString)) ); + connect(DW, SIGNAL(findSnaps(QString, QString)), worker, SLOT(GetSnapshotData(QString, QString)) ); + connect(DW, SIGNAL(PlayFiles(LFileInfoList)), this, SLOT(OpenPlayer(LFileInfoList)) ); + connect(DW, SIGNAL(ViewFiles(LFileInfoList)), this, SLOT(OpenImages(LFileInfoList)) ); + connect(DW, SIGNAL(LaunchTerminal(QString)), this, SLOT(OpenTerminal(QString)) ); + connect(DW, SIGNAL(CutFiles(QStringList)), this, SLOT(CutFiles(QStringList)) ); + connect(DW, SIGNAL(CopyFiles(QStringList)), this, SLOT(CopyFiles(QStringList)) ); + connect(DW, SIGNAL(FavoriteFiles(QStringList)), this, SLOT(FavoriteFiles(QStringList)) ); + connect(DW, SIGNAL(RenameFiles(QStringList)), this, SLOT(RenameFiles(QStringList)) ); + connect(DW, SIGNAL(RemoveFiles(QStringList)), this, SLOT(RemoveFiles(QStringList)) ); + connect(DW, SIGNAL(PasteFiles(QString)), this, SLOT(PasteFiles(QString)) ); + connect(DW, SIGNAL(CloseBrowser(QString)), this, SLOT(CloseBrowser(QString)) ); + //Now create the tab for this + if(radio_view_tabs->isChecked()){ + int index = tabBar->addTab( LXDG::findIcon("folder-open",""), dirs[i].section("/",-1) ); + tabBar->setTabWhatsThis( index, "DW-"+QString::number(id) ); + tabBar->setCurrentIndex(index); + }else if(tabBar->count()<1){ + //Need to create the generic Browser tab + + } + + //Initialize the widget with the proper settings + DW->setShowDetails(radio_view_details->isChecked()); + DW->setShowSidebar(ui->actionShow_Action_Buttons->isChecked()); + QList<DirWidget::DETAILTYPES> details; details <<DirWidget::NAME << DirWidget::SIZE << DirWidget::TYPE << DirWidget::DATEMOD; + DW->setDetails(details); //Which details to show and in which order (L->R) + DW->setShowThumbnails(ui->actionShow_Thumbnails->isChecked()); + DW->setThumbnailSize(settings->value("iconsize", 32).toInt()); + DW->setDirCompleter(dirCompleter); + DW->setShowCloseButton(!radio_view_tabs->isChecked()); + //Now load the directory + DW->ChangeDir(dirs[i]); //kick off loading the directory info + } + //Update visibilities + tabChanged(tabBar->currentIndex()); tabBar->setVisible( tabBar->count() > 1 ); if(!invalid.isEmpty()){ QMessageBox::warning(this, tr("Invalid Directories"), tr("The following directories are invalid and could not be opened:")+"\n"+invalid.join(", ") ); } } -//========== -// PRIVATE -//========== void MainUI::setupIcons(){ this->setWindowIcon( LXDG::findIcon("Insight-FileManager","") ); @@ -156,139 +178,37 @@ void MainUI::setupIcons(){ ui->actionClose->setIcon( LXDG::findIcon("application-exit","") ); ui->actionNew_Tab->setIcon( LXDG::findIcon("tab-new-background","") ); //ui->action_Preferences->setIcon( LXDG::findIcon("configure","") ); - ui->actionUpDir->setIcon( LXDG::findIcon("go-up","") ); - ui->actionBack->setIcon( LXDG::findIcon("go-previous","") ); - ui->actionHome->setIcon( LXDG::findIcon("go-home","") ); - ui->actionBookMark->setIcon( LXDG::findIcon("bookmarks","") ); - ui->actionBackToBrowser->setIcon( LXDG::findIcon("go-previous","") ); ui->actionManage_Bookmarks->setIcon( LXDG::findIcon("bookmarks-organize","") ); ui->actionScan->setIcon( LXDG::findIcon("system-search","") ); ui->actionSearch->setIcon( LXDG::findIcon("edit-find","") ); - - //Browser page - ui->tool_addNewFile->setIcon( LXDG::findIcon("document-new","")); - ui->tool_addToDir->setIcon( LXDG::findIcon("folder-new","") ); - ui->tool_goToImages->setIcon( LXDG::findIcon("fileview-preview","") ); - ui->tool_goToPlayer->setIcon( LXDG::findIcon("applications-multimedia","") ); - ui->tool_goToRestore->setIcon( LXDG::findIcon("document-revert","") ); - 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","") ); - - //Multimedia Player page - ui->tool_player_next->setIcon( LXDG::findIcon("media-skip-forward","") ); - ui->tool_player_prev->setIcon( LXDG::findIcon("media-skip-backward","") ); - ui->tool_player_pause->setIcon( LXDG::findIcon("media-playback-pause","") ); - ui->tool_player_play->setIcon( LXDG::findIcon("media-playback-start","") ); - ui->tool_player_stop->setIcon( LXDG::findIcon("media-playback-stop","") ); - - //Slideshow page - ui->tool_image_goBegin->setIcon( LXDG::findIcon("go-first-view","") ); - ui->tool_image_goEnd->setIcon( LXDG::findIcon("go-last-view","") ); - ui->tool_image_goPrev->setIcon( LXDG::findIcon("go-previous-view","") ); - ui->tool_image_goNext->setIcon( LXDG::findIcon("go-next-view","") ); - ui->tool_image_remove->setIcon( LXDG::findIcon("edit-delete","") ); - ui->tool_image_rotateleft->setIcon( LXDG::findIcon("object-rotate-left","") ); - ui->tool_image_rotateright->setIcon( LXDG::findIcon("object-rotate-right","") ); + ui->actionLarger_Icons->setIcon( LXDG::findIcon("zoom-in","") ); + ui->actionSmaller_Icons->setIcon( LXDG::findIcon("zoom-out", "") ); + //Menu Icons + ui->menuView_Mode->setIcon( LXDG::findIcon("view-choose","") ); + ui->menuGroup_Mode->setIcon( LXDG::findIcon("tab-duplicate","") ); - //ZFS Restore page - ui->tool_zfs_nextSnap->setIcon( LXDG::findIcon("go-next-view","") ); - ui->tool_zfs_prevSnap->setIcon( LXDG::findIcon("go-previous-view","") ); - ui->tool_zfs_restoreItem->setIcon( LXDG::findIcon("document-revert","") ); } +//========== +// PRIVATE +//========== void MainUI::setupConnections(){ - connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*, QWidget*)), this, SLOT(startEditDir(QWidget*, QWidget*)) ); connect(tabBar, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int)) ); connect(tabBar, SIGNAL(tabCloseRequested(int)), this, SLOT(tabClosed(int)) ); connect(ui->menuBookmarks, SIGNAL(triggered(QAction*)), this, SLOT(goToBookmark(QAction*)) ); connect(ui->menuExternal_Devices, SIGNAL(triggered(QAction*)), this, SLOT(goToDevice(QAction*)) ); - connect(currentDir, SIGNAL(returnPressed()), this, SLOT(goToDirectory())); + + //Radio Buttons connect(radio_view_details, SIGNAL(toggled(bool)), this, SLOT(viewModeChanged(bool)) ); connect(radio_view_list, SIGNAL(toggled(bool)), this, SLOT(viewModeChanged(bool)) ); - connect(radio_view_icons, SIGNAL(toggled(bool)), this, SLOT(viewModeChanged(bool)) ); - connect(fsmod, SIGNAL(directoryLoaded(QString)), this, SLOT(slotStartSyncTimer()) ); - connect(syncTimer, SIGNAL(timeout()), this, SLOT(currentDirectoryLoaded()) ); - //Background worker class - connect(this, SIGNAL(DirChanged(QString)), worker, SLOT(startDirChecks(QString)) ); - connect(worker, SIGNAL(ImagesAvailable(QStringList)), this, SLOT(AvailablePictures(QStringList)) ); - connect(worker, SIGNAL(MultimediaAvailable(QStringList)), this, SLOT(AvailableMultimediaFiles(QStringList)) ); - connect(worker, SIGNAL(SnapshotsAvailable(QString, QStringList)), this, SLOT(AvailableBackups(QString, QStringList)) ); + connect(radio_view_tabs, SIGNAL(toggled(bool)), this, SLOT(groupModeChanged(bool)) ); + connect(radio_view_cols, SIGNAL(toggled(bool)), this, SLOT(groupModeChanged(bool)) ); - //Background worker class for statusbar - connect(this, SIGNAL(Si_AdaptStatusBar(QFileInfoList, QString, QString, QString)), worker, SLOT(createStatusBarMsg(QFileInfoList, QString, QString, QString)) ); - connect(worker, SIGNAL(Si_DisplayStatusBar(QString)), this, SLOT(DisplayStatusBar(QString)) ); - - //Action buttons on browser page - connect(ui->tool_act_run, SIGNAL(clicked()), this, SLOT(OpenItem()) ); - connect(ui->tool_act_runwith, SIGNAL(clicked()), this, SLOT(OpenItemWith()) ); - connect(ui->tool_act_rm, SIGNAL(clicked()), this, SLOT(RemoveItem()) ); - connect(ui->tool_act_rename, SIGNAL(clicked()), this, SLOT(RenameItem()) ); - connect(ui->tool_act_paste, SIGNAL(clicked()), this, SLOT(PasteItems()) ); - connect(ui->tool_act_cut, SIGNAL(clicked()), this, SLOT(CutItems()) ); - connect(ui->tool_act_copy, SIGNAL(clicked()), this, SLOT(CopyItems()) ); - connect(ui->tool_act_fav, SIGNAL(clicked()), this, SLOT(FavoriteItem()) ); - - //Tree Widget interaction - connect(ui->tree_dir_view, SIGNAL(activated(const QModelIndex&)), this, SLOT(ItemRun(const QModelIndex&)) ); - connect(ui->list_dir_view, SIGNAL(activated(const QModelIndex&)), this, SLOT(ItemRun(const QModelIndex&)) ); - connect(ui->tree_dir_view, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(OpenContextMenu(const QPoint&)) ); - connect(ui->list_dir_view, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(OpenContextMenu(const QPoint&)) ); - connect(ui->tree_dir_view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(ItemSelectionChanged()) ); - connect(ui->list_dir_view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(ItemSelectionChanged()) ); - - //Page Switching - connect(ui->tool_goToPlayer, SIGNAL(clicked()), this, SLOT(goToMultimediaPage()) ); - connect(ui->tool_goToRestore, SIGNAL(clicked()), this, SLOT(goToRestorePage()) ); - connect(ui->tool_goToImages, SIGNAL(clicked()), this, SLOT(goToSlideshowPage()) ); - connect(ui->actionBackToBrowser, SIGNAL(triggered()), this, SLOT(goToBrowserPage()) ); - - //Slideshow page - connect(ui->combo_image_name, SIGNAL(currentIndexChanged(int)), this, SLOT(showNewPicture()) ); - connect(ui->tool_image_goBegin, SIGNAL(clicked()), this, SLOT(firstPicture()) ); - connect(ui->tool_image_goEnd, SIGNAL(clicked()), this, SLOT(lastPicture()) ); - connect(ui->tool_image_goNext, SIGNAL(clicked()), this, SLOT(nextPicture()) ); - connect(ui->tool_image_goPrev, SIGNAL(clicked()), this, SLOT(prevPicture()) ); - connect(ui->tool_image_remove, SIGNAL(clicked()), this, SLOT(removePicture()) ); - connect(ui->tool_image_rotateleft, SIGNAL(clicked()), this, SLOT(rotatePictureLeft()) ); - connect(ui->tool_image_rotateright, SIGNAL(clicked()), this, SLOT(rotatePictureRight()) ); - - //ZFS Restore page - connect(ui->slider_zfs_snapshot, SIGNAL(valueChanged(int)), this, SLOT(showSnapshot()) ); - connect(ui->tool_zfs_nextSnap, SIGNAL(clicked()), this, SLOT(nextSnapshot()) ); - connect(ui->tool_zfs_prevSnap, SIGNAL(clicked()), this, SLOT(prevSnapshot()) ); - connect(ui->tool_zfs_restoreItem, SIGNAL(clicked()), this, SLOT(restoreItems()) ); - - //Multimedia Player page - connect(ui->tool_player_next, SIGNAL(clicked()), this, SLOT(playerNext())); - connect(ui->tool_player_prev, SIGNAL(clicked()), this, SLOT(playerPrevious())); - connect(ui->tool_player_pause, SIGNAL(clicked()), this, SLOT(playerPause())); - connect(ui->tool_player_play, SIGNAL(clicked()), this, SLOT(playerStart())); - connect(ui->tool_player_stop, SIGNAL(clicked()), this, SLOT(playerStop())); - connect(ui->combo_player_list, SIGNAL(currentIndexChanged(int)), this, SLOT(playerFileChanged()) ); - connect(playerSlider, SIGNAL(sliderPressed()), this, SLOT(playerSliderHeld()) ); - connect(playerSlider, SIGNAL(sliderReleased()), this, SLOT(playerSliderChanged()) ); - connect(playerSlider, SIGNAL(valueChanged(int)), this, SLOT(playerSliderMoved(int)) ); - connect(mediaObj, SIGNAL(durationChanged(qint64)), this, SLOT(playerDurationChanged(qint64)) ); - connect(mediaObj, SIGNAL(seekableChanged(bool)), playerSlider, SLOT(setEnabled(bool)) ); - connect(mediaObj, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(playerStatusChanged(QMediaPlayer::MediaStatus)) ); - connect(mediaObj, SIGNAL(positionChanged(qint64)), this, SLOT(playerTimeChanged(qint64)) ); - connect(mediaObj, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(playerStateChanged(QMediaPlayer::State)) ); - connect(mediaObj, SIGNAL(videoAvailableChanged(bool)), this, SLOT(playerVideoAvailable(bool)) ); - connect(mediaObj, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(playerError()) ); //Special Keyboard Shortcuts connect(nextTabLShort, SIGNAL(activated()), this, SLOT( prevTab() ) ); connect(nextTabRShort, SIGNAL(activated()), this, SLOT( nextTab() ) ); connect(closeTabShort, SIGNAL(activated()), this, SLOT( tabClosed() ) ); - connect(copyFilesShort, SIGNAL(activated()), this, SLOT( CopyItems() ) ); - connect(cutFilesShort, SIGNAL(activated()), this, SLOT( CutItems() ) ); - connect(pasteFilesShort, SIGNAL(activated()), this, SLOT( PasteItems() ) ); - connect(deleteFilesShort, SIGNAL(activated()), this, SLOT( RemoveItem() ) ); + } void MainUI::loadSettings(){ @@ -299,11 +219,15 @@ void MainUI::loadSettings(){ ui->actionShow_Action_Buttons->setChecked(settings->value("showactions", true).toBool() ); on_actionShow_Action_Buttons_triggered(); //make sure to update the UI ui->actionShow_Thumbnails->setChecked( settings->value("showthumbnails", true).toBool() ); - iconProv->showthumbnails = ui->actionShow_Thumbnails->isChecked(); - QString view = settings->value("viewmode","details").toString(); - if(view=="icons"){ radio_view_icons->setChecked(true); } - else if(view=="list"){ radio_view_list->setChecked(true); } - else{ radio_view_details->setChecked(true); } + //View Type + bool showDetails = (settings->value("viewmode","details").toString()=="details"); + if(showDetails){ radio_view_details->setChecked(true); } + else{ radio_view_list->setChecked(true); } + //Grouping type + bool usetabs = (settings->value("groupmode","tabs").toString()=="tabs"); + if(usetabs){ radio_view_tabs->setChecked(true); } + else{ radio_view_cols->setChecked(true); } + } void MainUI::RebuildBookmarksMenu(){ @@ -374,325 +298,36 @@ void MainUI::RebuildDeviceMenu(){ } } -bool MainUI::checkUserPerms(){ - if(!isUserWritable){ - QMessageBox::warning(this, tr("Invalid Permissions"), tr("You do not have permission to edit this directory!") ); - } - return isUserWritable; -} - -QString MainUI::msToText(qint64 ms){ - QString disp; - if(ms>3600000){ - disp.append( QString::number(ms/3600000)+":" ); - ms = ms%3600000; - } - if(ms>60000){ - disp.append( QString::number(ms/60000)+":" ); - ms = ms%60000; - }else{ - disp.append("0:"); - } - if(ms>1000){ - if(ms>=10000){ disp.append( QString::number(ms/1000) ); } - else{ disp.append( "0"+QString::number(ms/1000) ); } - }else{ - disp.append("00"); - } - return disp; -} - -QString MainUI::getCurrentDir(){ - return currentDir->whatsThis(); -} - -void MainUI::setCurrentDir(QString dir){ - if(dir.isEmpty()){ return; } - if(syncTimer->isActive()){ syncTimer->stop(); } //already loading the info - QFileInfo info(dir); - QString olddir = currentDir->whatsThis(); - if(!info.isDir() || !info.exists() ){ - qDebug() << "Invalid Directory:" << dir; - //Try to just go up the dir tree one level - dir.chop(dir.section("/",-1).length()); - if(!QFile::exists(dir)){ - //Still bad dir - try to return to previously shown dir - if(currentDir->whatsThis().isEmpty()){ return; } //nothing to return to - else{ dir = currentDir->whatsThis(); } - } - } - //qDebug() << "Show Directory:" << dir; - //qDebug() << "Dir Info:" << dir; - //qDebug() << " - RWXLOG:" << info.isReadable() << info.isWritable() << info.isExecutable() << info.isSymLink() << info.ownerId() << info.groupId(); - isUserWritable = info.isWritable(); - if(dir.endsWith("/") && dir!="/" ){ dir.chop(1); } - QString rawdir = dir; - //dir.replace(QDir::homePath()+"/", "~/"); - currentDir->setText(dir); - //Update the directory viewer and update the line edit - keepFocus = !currentDir->hasFocus(); - currentDir->setWhatsThis(dir); //save the full path internally - fsmod->setRootPath(rawdir); - if(radio_view_details->isChecked()){ - ui->tree_dir_view->setRootIndex(fsmod->index(dir)); - ui->tree_dir_view->selectionModel()->clearSelection(); - if(olddir.startsWith(rawdir)){ - ui->tree_dir_view->setCurrentIndex( fsmod->index(olddir)); - ui->tree_dir_view->scrollTo( fsmod->index(olddir), QAbstractItemView::PositionAtTop); - } - }else{ - ui->list_dir_view->setRootIndex(fsmod->index(dir)); - ui->list_dir_view->selectionModel()->clearSelection(); - if(olddir.startsWith(rawdir)){ - ui->list_dir_view->setCurrentIndex( fsmod->index(olddir)); - ui->list_dir_view->scrollTo( fsmod->index(olddir), QAbstractItemView::PositionAtTop); - } - } - //Adjust the tab data - tabBar->setTabWhatsThis( tabBar->currentIndex(), rawdir ); - if(dir!="/"){ tabBar->setTabText( tabBar->currentIndex(), dir.section("/",-1) ); } - else{ tabBar->setTabText( tabBar->currentIndex(), dir); } - QStringList history = tabBar->tabData(tabBar->currentIndex()).toStringList(); - if(history.isEmpty() || history.first()!=rawdir){ history.prepend(rawdir); history.removeAll(""); } - //qDebug() << "History:" << history; - tabBar->setTabData(tabBar->currentIndex(), history); - //Now adjust the items as necessary - if(rawdir != olddir){ - //The Filesystem model will need to load the new directory (triggering the background checks) - ui->tool_goToPlayer->setVisible(false); - ui->tool_goToRestore->setVisible(false); - ui->tool_goToImages->setVisible(false); - } - //Make sure the shortcut buttons are enabled as necessary - // If the dir is already loaded into the fsmodel cache it will not emit the directoryLoaded() signal - /*if(rawdir == olddir){ - emit DirChanged(rawdir); //This will be automatically run when a new dir is loaded - } - emit Si_AdaptStatusBar(fsmod->rootDirectory().entryInfoList(), rawdir, tr("Items"));*/ - if(isUserWritable){ ui->label_dir_stats->setText(""); } - else{ ui->label_dir_stats->setText(tr("Limited Access Directory")); - } - - ui->tool_addToDir->setVisible(isUserWritable); - ui->tool_addNewFile->setVisible(isUserWritable); - ui->actionUpDir->setEnabled(dir!="/"); - ui->actionBack->setEnabled(history.length() > 1); - ui->actionBookMark->setEnabled( rawdir!=QDir::homePath() && settings->value("bookmarks", QStringList()).toStringList().filter("::::"+rawdir).length()<1 ); - ItemSelectionChanged(); - RebuildDeviceMenu(); //keep this refreshed - -} - -QFileInfoList MainUI::getSelectedItems(){ - QFileInfoList out; - if(radio_view_details->isChecked()){ - QModelIndexList items = ui->tree_dir_view->selectionModel()->selectedIndexes(); - for(int i=0; i<items.length(); i++){ - if(!out.contains(fsmod->fileInfo(items[i]))){ - out << fsmod->fileInfo(items[i]); - } - } - }else{ - QModelIndexList items = ui->list_dir_view->selectionModel()->selectedIndexes(); - for(int i=0; i<items.length(); i++){ - if(!out.contains(fsmod->fileInfo(items[i]))){ - out << fsmod->fileInfo(items[i]); - } - } - } - return out; -} -/*QModelIndexList MainUI::getVisibleItems(){ - QModelIndexList out; - if(radio_view_details->isChecked()){ - QModelIndex index = ui->tree_dir_view->indexAt(QPoint(0,0)); - while( index.isValid()){ - if(index.column()!=0){ - //move on - multiple index's per row when we only need one - }else if(ui->tree_dir_view->viewport()->rect().contains( ui->tree_dir_view->visualRect(index) ) ){ - //index within the viewport - add it to the list - out << index; - }else{ - break; //index not in the viewport - } - index = ui->tree_dir_view->indexBelow(index); //go to the next - if(out.contains(index)){ break; } //end of the list - } - - }else{ - QModelIndex index = ui->list_dir_view->indexAt(QPoint(0,0)); - while( index.isValid()){ - if(ui->list_dir_view->viewport()->rect().contains( ui->list_dir_view->visualRect(index) ) ){ - //index within the viewport - add it to the list - out << index; - }else{ - break; //index not in the viewport - } - index = ui->list_dir_view->indexBelow(index); //go to the next - if(out.contains(index)){ break; } //end of the list - } - - } - return out; -}*/ //============== // PRIVATE SLOTS //============== -void MainUI::slotStartSyncTimer(){ - if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } - if(syncTimer->isActive()){ syncTimer->stop(); } - syncTimer->start(); -} - -//General button check functions -void MainUI::AvailableMultimediaFiles(QStringList files){ - if(!files.isEmpty()){ - ui->combo_player_list->clear(); - ui->combo_player_list->addItems(files); - ui->tool_goToPlayer->setVisible(true); - }else{ - ui->tool_goToPlayer->setVisible(false); - } - -} - -void MainUI::AvailableBackups(QString basedir, QStringList snapdirs){ - snapmod->setRootPath(basedir); //set the base snapshot dir as the new root - snapDirs = snapdirs; - - //Now enable the button if any snapshots available - ui->tool_goToRestore->setVisible(!snapDirs.isEmpty()); -} - void MainUI::DisplayStatusBar(QString msg){ //qDebug() << "message to show in the status bar:" << msg; ui->statusbar->showMessage(msg); } - -void MainUI::AvailablePictures(QStringList pics){ - if(!pics.isEmpty()){ - QString citem = ui->combo_image_name->currentText(); - ui->combo_image_name->clear(); - ui->combo_image_name->addItems(pics); - if(pics.contains(citem)){ - ui->combo_image_name->setCurrentText(citem); - } - ui->tool_goToImages->setVisible(true); - } - -} - -//----------------------------------- -//General page switching -//----------------------------------- -void MainUI::goToMultimediaPage(){ - //Make toolbar items disappear appropriately - ui->actionBackToBrowser->setVisible(true); - ui->actionBack->setVisible(false); - ui->actionUpDir->setVisible(false); - ui->actionHome->setVisible(false); - ui->actionBookMark->setVisible(false); - currentDir->setEnabled(false); - //Disable all the UI elements specifically for the Browser side of things - ui->actionNew_Tab->setEnabled(false); - ui->menuView->setEnabled(false); - ui->menuBookmarks->setEnabled(false); - ui->menuExternal_Devices->setEnabled(false); - //Start the player on the first selected item - QFileInfoList sel = getSelectedItems(); - if(!sel.isEmpty()){ - QStringList names; - for(int i=0; i<sel.length(); i++){ names << sel[i].fileName(); } - //start the slideshow on the first selected picture - for(int i=0; i<ui->combo_player_list->count(); i++){ - if(names.contains( ui->combo_player_list->itemText(i) )){ ui->combo_player_list->setCurrentIndex(i); break; } - } - } - //Now go to the Multimedia player - ui->label_player_novideo->setText(tr("Click Play to Start")); - ui->stackedWidget->setCurrentWidget(ui->page_audioPlayer); -} - -void MainUI::goToRestorePage(){ - //Make toolbar items disappear appropriately - ui->actionBackToBrowser->setVisible(true); - ui->actionBack->setVisible(false); - ui->actionUpDir->setVisible(false); - ui->actionHome->setVisible(false); - ui->actionBookMark->setVisible(false); - currentDir->setEnabled(false); - //Disable all the UI elements specifically for the Browser side of things - ui->actionNew_Tab->setEnabled(false); - ui->menuView->setEnabled(false); - ui->menuBookmarks->setEnabled(false); - ui->menuExternal_Devices->setEnabled(false); - //Load all the info into the file restore page - ui->slider_zfs_snapshot->setRange(1,snapDirs.length()); - ui->slider_zfs_snapshot->setValue(snapDirs.length()); - //Now go to the file restore page - showSnapshot(); //Make sure it is updated for the current directory - ui->stackedWidget->setCurrentWidget(ui->page_zfs); -} - -void MainUI::goToSlideshowPage(){ - //Make toolbar items disappear appropriately - ui->actionBackToBrowser->setVisible(true); - ui->actionBack->setVisible(false); - ui->actionUpDir->setVisible(false); - ui->actionHome->setVisible(false); - ui->actionBookMark->setVisible(false); - currentDir->setEnabled(false); - //Disable all the UI elements specifically for the Browser side of things - ui->actionNew_Tab->setEnabled(false); - ui->menuView->setEnabled(false); - ui->menuBookmarks->setEnabled(false); - ui->menuExternal_Devices->setEnabled(false); - QFileInfoList sel = getSelectedItems(); - if(!sel.isEmpty()){ - QStringList names; - for(int i=0; i<sel.length(); i++){ names << sel[i].fileName(); } - //start the slideshow on the first selected picture - for(int i=0; i<ui->combo_image_name->count(); i++){ - if(names.contains( ui->combo_image_name->itemText(i) )){ ui->combo_image_name->setCurrentIndex(i); break; } - } - } - //Now go to the Slideshow player - ui->stackedWidget->setCurrentWidget(ui->page_image_view); - showNewPicture(); //make sure it is up to date with the widget size -} - -void MainUI::goToBrowserPage(){ - //Make toolbar items re-appear appropriately - ui->actionBackToBrowser->setVisible(false); - ui->actionBack->setVisible(true); - ui->actionUpDir->setVisible(true); - ui->actionHome->setVisible(true); - ui->actionBookMark->setVisible(true); - currentDir->setEnabled(true); - //Disable all the UI elements specifically for the Browser side of things - ui->actionNew_Tab->setEnabled(true); - ui->menuView->setEnabled(true); - ui->menuBookmarks->setEnabled(true); - ui->menuExternal_Devices->setEnabled(true); - //Now go to the browser - if(ui->stackedWidget->currentWidget()==ui->page_audioPlayer){ mediaObj->stop(); } - ui->stackedWidget->setCurrentWidget(ui->page_browser); - reloadDirectory(); -} //--------------------- //Menu Actions //--------------------- void MainUI::on_actionNew_Tab_triggered(){ OpenDirs(QStringList() << QDir::homePath()); - //Now go to that tab (always last) - tabBar->setCurrentIndex(tabBar->count()-1); } void MainUI::on_actionSearch_triggered(){ - QProcess::startDetached("lumina-search -dir \""+getCurrentDir()+"\""); + //Find the current directory + QString cur = tabBar->tabWhatsThis(tabBar->currentIndex()); + if(cur.startsWith("#")){ cur.clear(); } //multimedia/player tab open + else{ + for(int i=0; i<DWLIST.length(); i++){ + if(DWLIST[i]->id()==cur){ + //Found the current browser - load it here + QProcess::startDetached("lumina-search -dir \""+DWLIST[i]->currentDir()+"\""); + return; + } + } + } } void MainUI::on_actionClose_triggered(){ @@ -706,33 +341,26 @@ void MainUI::on_actionClose_triggered(){ } void MainUI::on_actionView_Hidden_Files_triggered(){ - if(ui->actionView_Hidden_Files->isChecked()){ - fsmod->setFilter( QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Hidden ); - snapmod->setFilter( QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Hidden ); - }else{ - fsmod->setFilter( QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs ); - snapmod->setFilter( QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs ); - } + worker->showHidden = ui->actionView_Hidden_Files->isChecked(); //Now save this setting for later settings->setValue("showhidden", ui->actionView_Hidden_Files->isChecked()); - //Re-load the view widget - setCurrentDir(getCurrentDir()); + worker->showHidden = ui->actionView_Hidden_Files->isChecked(); + //Re-load the current browsers + for(int i=0; i<DWLIST.length(); i++){ DWLIST[i]->refresh(); } + } void MainUI::on_actionShow_Action_Buttons_triggered(){ - ui->group_actions->setVisible(ui->actionShow_Action_Buttons->isChecked()); - settings->setValue("showactions", ui->actionShow_Action_Buttons->isChecked()); + bool show = ui->actionShow_Action_Buttons->isChecked(); + settings->setValue("showactions", show); + for(int i=0; i<DWLIST.length(); i++){ DWLIST[i]->setShowSidebar(show); } } void MainUI::on_actionShow_Thumbnails_triggered(){ //Now save this setting for later - settings->setValue("showthumbnails", ui->actionShow_Thumbnails->isChecked()); - //Set the value in the icon provider - iconProv->showthumbnails = ui->actionShow_Thumbnails->isChecked(); - //Now make sure the filesystem model knows to re-load the image data - fsmod->revert(); - //Re-load the view widget - setCurrentDir(getCurrentDir()); + bool show = ui->actionShow_Thumbnails->isChecked(); + settings->setValue("showthumbnails", show); + for(int i=0; i<DWLIST.length(); i++){ DWLIST[i]->setShowThumbnails(show); } } void MainUI::goToBookmark(QAction *act){ @@ -742,7 +370,20 @@ void MainUI::goToBookmark(QAction *act){ dlg.exec(); RebuildBookmarksMenu(); }else{ - setCurrentDir(act->whatsThis()); + //Find the current directory + QString cur = tabBar->tabWhatsThis(tabBar->currentIndex()); + if(cur.startsWith("#")){ cur.clear(); } //multimedia/player tab open + else{ + for(int i=0; i<DWLIST.length(); i++){ + if(DWLIST[i]->id()==cur){ + //Found the current browser - load it here + DWLIST[i]->ChangeDir(act->whatsThis()); + return; + } + } + } + //If no current dir could be found - open a new tab/column + OpenDirs(QStringList() << act->whatsThis() ); } } @@ -750,58 +391,79 @@ void MainUI::goToDevice(QAction *act){ if(act==ui->actionScan){ RebuildDeviceMenu(); }else{ - setCurrentDir(act->whatsThis()); + //setCurrentDir(act->whatsThis()); } } void MainUI::viewModeChanged(bool active){ - if(!active){ return; } //on every view change, all 3 radio buttons will call this function - only run this once though - if(radio_view_details->isChecked()){ - ui->tree_dir_view->setVisible(true); - ui->list_dir_view->setVisible(false); - settings->setValue("viewmode","details"); - }else if(radio_view_list->isChecked()){ - ui->tree_dir_view->setVisible(false); - ui->list_dir_view->setVisible(true); - ui->list_dir_view->setViewMode( QListView::ListMode ); - ui->list_dir_view->setUniformItemSizes(false); - ui->list_dir_view->setIconSize( QSize(20,20) ); - settings->setValue("viewmode","list"); - }else{ //icons - ui->tree_dir_view->setVisible(false); - ui->list_dir_view->setVisible(true); - ui->list_dir_view->setViewMode( QListView::IconMode ); - ui->list_dir_view->setUniformItemSizes(true); - ui->list_dir_view->setIconSize( QSize(90,64) ); - settings->setValue("viewmode","icons"); + if(!active){ return; } //on every view change, all radio buttons will call this function - only run this once though + bool showDetails = radio_view_details->isChecked(); + if(showDetails){ settings->setValue("viewmode","details"); } + else{ settings->setValue("viewmode","list"); } + + //Re-load the view widgets + for(int i=0; i<DWLIST.length(); i++){ + DWLIST[i]->setShowDetails(showDetails); } - //Re-load the view widget - setCurrentDir(getCurrentDir()); } -//----------------------- -//Toolbar Actions -//----------------------- -void MainUI::on_actionBack_triggered(){ - QStringList history = tabBar->tabData(tabBar->currentIndex()).toStringList(); - if(history.length() <= 1){ return; } //need the second item - history.removeAt(0); //remove the first item (the current dir) - tabBar->setTabData(tabBar->currentIndex(), history); //re-write the saved history - setCurrentDir(history.first()); //go to the previous entry in the history +void MainUI::groupModeChanged(bool active){ + if(!active){ return; } //on every change, all radio buttons will call this function - only run this once though + bool usetabs = radio_view_tabs->isChecked(); + if(usetabs){ + settings->setValue("groupmode","tabs"); + //Now clean up all the tabs (remove the generic one and add the specific ones) + for(int i=0; i<tabBar->count(); i++){ + //Remove all the browser tabs + if( !tabBar->tabWhatsThis(i).startsWith("#") ){ + tabBar->removeTab(i); + i--; //go back one to ensure nothing is missed + } + } + //Create all the specific browser tabs for open browsers + for(int i=0; i<DWLIST.length(); i++){ + qDebug() << "Add specific tab:" << DWLIST[i]->currentDir() << DWLIST[i]->id(); + int tab = tabBar->addTab( LXDG::findIcon("folder-open",""), DWLIST[i]->currentDir().section("/",-1) ); + tabBar->setTabWhatsThis(tab, DWLIST[i]->id() ); + DWLIST[i]->setShowCloseButton(false); + } + }else{ + settings->setValue("groupmode","columns"); + //Now clean up the tabs (remove the specific ones and add a generic one) + for(int i=0; i<tabBar->count(); i++){ + //Remove all the browser tabs + if( !tabBar->tabWhatsThis(i).startsWith("#") ){ + tabBar->removeTab(i); + i--; //go back one to ensure nothing is missed + } + } + //Now create the generic "browser" tab + int tab = tabBar->addTab( LXDG::findIcon("folder-open",""), tr("Browser") ); + tabBar->setTabWhatsThis(tab, "Browser" ); + for(int i=0; i<DWLIST.length(); i++){ DWLIST[i]->setShowCloseButton(true); } + } + if(tabBar->currentIndex()<0){ tabBar->setCurrentIndex(0); } + tabBar->setVisible( tabBar->count() > 1 ); + QTimer::singleShot(20, this, SLOT(tabChanged()) ); } -void MainUI::on_actionUpDir_triggered(){ - QString dir = getCurrentDir(); - dir.chop( dir.section("/",-1).length() ); - setCurrentDir(dir); +void MainUI::on_actionLarger_Icons_triggered(){ + int size = settings->value("iconsize", 32).toInt(); + size += 16; + for(int i=0; i<DWLIST.length(); i++){ DWLIST[i]->setThumbnailSize(size); } + settings->setValue("iconsize", size); } -void MainUI::on_actionHome_triggered(){ - setCurrentDir(QDir::homePath()); +void MainUI::on_actionSmaller_Icons_triggered(){ + int size = settings->value("iconsize", 32).toInt(); + if(size <= 16){ return; } + size -= 16; + for(int i=0; i<DWLIST.length(); i++){ DWLIST[i]->setThumbnailSize(size); } + settings->setValue("iconsize", size); } -void MainUI::on_actionBookMark_triggered(){ +/*void MainUI::on_actionBookMark_triggered(){ QString dir = getCurrentDir(); bool ok = false; QString name = QInputDialog::getText(this, tr("New Bookmark"), tr("Name:"), QLineEdit::Normal, dir, \ @@ -819,104 +481,47 @@ void MainUI::on_actionBookMark_triggered(){ //Now rebuild the bookmarks menu RebuildBookmarksMenu(); ui->actionBookMark->setEnabled(false); //already bookmarked -} - -//----------------------------- -//Browser Functions -//----------------------------- -void MainUI::startEditDir(QWidget *old, QWidget *now){ - if(now==currentDir){ - //The dir edit just got focus - QString dir = currentDir->text(); - dir.replace("~/", QDir::homePath()+"/"); - currentDir->setText(dir); - //Try to move to the end - currentDir->selectAll(); - }else if(old==currentDir){ - QString dir = currentDir->text(); - setCurrentDir(dir); - } -} - -void MainUI::goToDirectory(){ - QString dir = currentDir->text(); - dir.replace("~/",QDir::homePath()+"/"); - setCurrentDir(dir); -} - -void MainUI::reloadDirectory(){ - setCurrentDir( getCurrentDir() ); -} - -/*void MainUI::viewportChanged(){ - if( !ui->actionsShow_Thumbnails->isChecked()){ return; } - QModelIndexList list = getVisibleItems(); - for(int i=0; i<list.length(); i++){ - if( !ui->actionsShow_Thumbnails->isChecked()){ return; } //break out as necessary - if( imgFilter.contains("*."+fsmod->filePath(list[i]).section("/",-1).section(".",-1).toLower()){ - fmod-> - } - } }*/ -void MainUI::currentDirectoryLoaded(){ - //The directory was just loaded: refresh the action buttons as neccesary - // NOTE: This is only "caught" when a *new* directory is loaded into the model - ui->tool_goToPlayer->setVisible(false); - ui->tool_goToRestore->setVisible(false); - ui->tool_goToImages->setVisible(false); - emit DirChanged(getCurrentDir()); - emit Si_AdaptStatusBar(fsmod->rootDirectory().entryInfoList(), getCurrentDir(), tr("Folders"), tr("Files")); - ItemSelectionChanged(); -} - -void MainUI::on_tool_addToDir_clicked(){ - 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; } - QString full = getCurrentDir(); - 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.")); - } - } -} - -void MainUI::on_tool_addNewFile_clicked(){ - 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; } - QString full = getCurrentDir(); - 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.")); - } - -} - void MainUI::tabChanged(int tab){ + if(tab<0){ tab = tabBar->currentIndex(); } + if(tab < 0){ return; } //Load the directory contained in the new tab - qDebug() << "Change to Tab:" << tab << tabBar->tabText(tab); - QString dir = tabBar->tabWhatsThis(tab); //get the full directory - setCurrentDir(dir); //display this as the current dir + QString info = tabBar->tabWhatsThis(tab); //get the full directory + if(info.isEmpty()){ return; } //unknown tab (this happens while we are in the middle of making changes to tabs - just ignore it) + //qDebug() << "Change to Tab:" << tab << tabBar->tabText(tab); + //qDebug() << " -- ID:" << info; + if(info=="#MW"){ ui->stackedWidget->setCurrentWidget(ui->page_player); } + else if(info=="#SW"){ ui->stackedWidget->setCurrentWidget(ui->page_image); } + else{ + ui->stackedWidget->setCurrentWidget(ui->page_browser); + if(radio_view_tabs->isChecked()){ + for(int i=0; i<DWLIST.length(); i++){ + DWLIST[i]->setVisible(DWLIST[i]->id()==info); + } + }else{ + //For columns, all widgets need to be visible + for(int i=0; i<DWLIST.length(); i++){ + DWLIST[i]->setVisible(true); + } + } + } + tabBar->setVisible( tabBar->count() > 1 ); } void MainUI::tabClosed(int tab){ if(tabBar->count()==1){ return; } //Can't close the only tab if(tab < 0){ tab = tabBar->currentIndex(); } + QString info = tabBar->tabWhatsThis(tab); + if(!info.startsWith("#")){ + if(DWLIST.length()<2){ return; } + for(int i=0; i<DWLIST.length(); i++){ + if(info == DWLIST[i]->id()){ + delete DWLIST.takeAt(i); + break; + } + } + } //Remove the tab (will automatically move to a different one); qDebug() << "Closing tab:" << tab << tabBar->tabText(tab); tabBar->removeTab(tab); @@ -935,512 +540,72 @@ void MainUI::nextTab(){ else{ tabBar->setCurrentIndex( cur+1 ); } } -void MainUI::ItemRun(const QModelIndex &index){ - //This is called when the user double clicks a file/directory - QString val = fsmod->filePath(index).section("/",-1); - QString itemPath = getCurrentDir(); - if( !itemPath.endsWith("/")){ itemPath.append("/"); } - itemPath.append(val); - if(fsmod->isDir(index)){ - setCurrentDir( itemPath ); - }else{ - //Must be a file, try to run it - QProcess::startDetached("lumina-open \""+itemPath+"\""); - } -} - -void MainUI::OpenContextMenu(const QPoint &pt){ - QFileInfo info; - if(radio_view_details->isChecked()){ - QModelIndex it = ui->tree_dir_view->indexAt(pt); - if(!it.isValid()){ CItem.clear();} - else{ - info = fsmod->fileInfo(it); - CItem = info.absoluteFilePath(); - } - }else{ - QModelIndex it = ui->list_dir_view->indexAt(pt); - if(!it.isValid()){ CItem.clear();} - else{ - info = fsmod->fileInfo(it); - CItem = info.absoluteFilePath(); +void MainUI::DirDataAvailable(QString id, QString dir, LFileInfoList list){ + for(int i=0; i<DWLIST.length(); i++){ + if(id == DWLIST[i]->id()){ + DWLIST[i]->LoadDir(dir, list); + break; } } - //Create the context menu - contextMenu->clear(); - if(!CItem.isEmpty()){ - contextMenu->addAction(LXDG::findIcon("run-build-file",""), tr("Open"), this, SLOT(OpenItem()) ); - contextMenu->addAction(LXDG::findIcon("run-build-configure",""), tr("Open With..."), this, SLOT(OpenItemWith()) ); - - contextMenu->addAction(LXDG::findIcon("edit-rename",""), tr("Rename"), this, SLOT(RenameItem()) )->setEnabled(info.isWritable()); - contextMenu->addAction(LXDG::findIcon("document-encrypted",""), tr("View Checksums"), this, SLOT(ChecksumItems()) ); - contextMenu->addSeparator(); - } - bool hasSelection = !getSelectedItems().isEmpty(); - //Now add the general selection options - contextMenu->addAction(LXDG::findIcon("edit-cut",""), tr("Cut Selection"), this, SLOT(CutItems()) )->setEnabled(info.isWritable() && hasSelection); - contextMenu->addAction(LXDG::findIcon("edit-copy",""), tr("Copy Selection"), this, SLOT(CopyItems()) )->setEnabled(hasSelection); - contextMenu->addAction(LXDG::findIcon("edit-paste",""), tr("Paste"), this, SLOT(PasteItems()) )->setEnabled(QApplication::clipboard()->mimeData()->hasFormat("x-special/lumina-copied-files") && isUserWritable); - contextMenu->addSeparator(); - contextMenu->addAction(LXDG::findIcon("edit-delete",""), tr("Delete Selection"), this, SLOT(RemoveItem()) )->setEnabled(info.isWritable()&&hasSelection); - if(LUtils::isValidBinary("lumina-fileinfo")){ - contextMenu->addSeparator(); - contextMenu->addAction(LXDG::findIcon("edit-find-replace",""), tr("File Properties"), this, SLOT(ViewPropertiesItem()) )->setEnabled(hasSelection); - } - if (info.isDir() || CItem.isEmpty()) { - //in case the user click on a directory or click on the background - contextMenu->addSeparator(); - contextMenu->addAction(LXDG::findIcon("system-search",""), tr("Open Terminal here"), this, SLOT(openTerminal())); - } - //Now show the menu - if(radio_view_details->isChecked()){ - contextMenu->popup(ui->tree_dir_view->mapToGlobal(pt)); - }else{ - contextMenu->popup(ui->list_dir_view->mapToGlobal(pt)); - } -} - -void MainUI::ItemSelectionChanged(){ - //Enable/disable the action buttons - QFileInfoList sel = getSelectedItems(); - //display info related to files selected. - //TO CHECK: impact if filesystem is very slow - if(sel.size()>0){ emit Si_AdaptStatusBar(sel, "", tr("Selected Folders"), tr("Files"));} - else{ emit Si_AdaptStatusBar(fsmod->rootDirectory().entryInfoList(), getCurrentDir(), tr("Folders"), tr("Files")); } - - ui->tool_act_run->setEnabled(!sel.isEmpty()); - ui->tool_act_runwith->setEnabled(!sel.isEmpty()); - ui->tool_act_rm->setEnabled(!sel.isEmpty() && isUserWritable); - ui->tool_act_rename->setEnabled(sel.length()==1 && isUserWritable); - ui->tool_act_cut->setEnabled(!sel.isEmpty() && isUserWritable); - ui->tool_act_copy->setEnabled(!sel.isEmpty()); - ui->tool_act_paste->setEnabled(QApplication::clipboard()->mimeData()->hasFormat("x-special/lumina-copied-files") && isUserWritable); - if(ui->tool_act_paste->isEnabled()){ - ui->tool_act_paste->setToolTip( QString(tr("Currently on clipboard:\n%1")).arg( QString(QApplication::clipboard()->mimeData()->data("x-special/lumina-copied-files")).replace("::::",": ") ) ); - }else{ - ui->tool_act_paste->setToolTip(""); - } - QString itname; - if(sel.length()==1){ itname = sel[0].fileName(); } - bool ok = !itname.isEmpty() && (getCurrentDir()!=QDir::homePath()+"/Desktop"); - if(ok){ - ok = !LUtils::isFavorite(sel[0].canonicalFilePath()); - } - ui->tool_act_fav->setEnabled(ok); -} - -//------------------------------- -//Slideshow Functions -//------------------------------- -void MainUI::showNewPicture(){ - if( !ui->label_image->isVisible() ){ return; } //don't update if not visible - can cause strange resizing issues - QString file = getCurrentDir(); - if(!file.endsWith("/")){ file.append("/"); } - file.append(ui->combo_image_name->currentText()); - //qDebug() << "Show Image:" << file; - QPixmap pix(file); - if(pix.size().width() > ui->label_image->contentsRect().width() || pix.size().height() > ui->label_image->contentsRect().height()){ - pix = pix.scaled(ui->label_image->contentsRect().size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); - } - ui->label_image->setPixmap(pix); - //Now set/load the buttons - ui->tool_image_goBegin->setEnabled(ui->combo_image_name->currentIndex()>0); - ui->tool_image_goPrev->setEnabled(ui->combo_image_name->currentIndex()>0); - ui->tool_image_goEnd->setEnabled(ui->combo_image_name->currentIndex()<(ui->combo_image_name->count()-1)); - ui->tool_image_goNext->setEnabled(ui->combo_image_name->currentIndex()<(ui->combo_image_name->count()-1)); - ui->label_image_index->setText( QString::number(ui->combo_image_name->currentIndex()+1)+"/"+QString::number(ui->combo_image_name->count()) ); - static QList<QByteArray> writeableformats; - if(writeableformats.isEmpty()){ - writeableformats = QImageWriter::supportedImageFormats(); - qDebug() << "Writeable image formats:" << writeableformats; - } - bool canwrite = writeableformats.contains(file.section(".",-1).toLower().toLocal8Bit()); //compare the suffix with the list - ui->tool_image_remove->setEnabled(isUserWritable); - ui->tool_image_rotateleft->setEnabled(isUserWritable && canwrite); - ui->tool_image_rotateright->setEnabled(isUserWritable && canwrite); -} - -void MainUI::firstPicture(){ - ui->combo_image_name->setCurrentIndex(0); -} - -void MainUI::prevPicture(){ - ui->combo_image_name->setCurrentIndex( ui->combo_image_name->currentIndex()-1 ); -} - -void MainUI::nextPicture(){ - ui->combo_image_name->setCurrentIndex( ui->combo_image_name->currentIndex()+1 ); -} - -void MainUI::lastPicture(){ - ui->combo_image_name->setCurrentIndex( ui->combo_image_name->count()-1 ); -} - -void MainUI::removePicture(){ - QString file = getCurrentDir(); - if(!file.endsWith("/")){ file.append("/"); } - file.append(ui->combo_image_name->currentText()); - //Verify permanent removal of file/dir - if(QMessageBox::Yes != QMessageBox::question(this, tr("Verify Removal"), tr("WARNING: This will permanently delete the file from the system!")+"\n"+tr("Are you sure you want to continue?")+"\n\n"+file, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ){ - return; //cancelled - } - if( QFile::remove(file) ){ - int index = ui->combo_image_name->currentIndex(); - ui->combo_image_name->removeItem( index ); - } -} - -void MainUI::rotatePictureLeft(){ - //First load the file fresh (not the scaled version in the UI) - QString file = getCurrentDir(); - if(!file.endsWith("/")){ file.append("/"); } - file.append(ui->combo_image_name->currentText()); - QPixmap pix(file); - //Now rotate the image 90 degrees counter-clockwise - QTransform trans; - pix = pix.transformed( trans.rotate(-90) , Qt::SmoothTransformation); - //Now save the image back to the same file - pix.save(file); - //Now re-load the image in the UI - showNewPicture(); -} - -void MainUI::rotatePictureRight(){ - //First load the file fresh (not the scaled version in the UI) - QString file = getCurrentDir(); - if(!file.endsWith("/")){ file.append("/"); } - file.append(ui->combo_image_name->currentText()); - QPixmap pix(file); - //Now rotate the image 90 degrees counter-clockwise - QTransform trans; - pix = pix.transformed( trans.rotate(90) , Qt::SmoothTransformation); - //Now save the image back to the same file - pix.save(file); - //Now re-load the image in the UI - showNewPicture(); -} - -//---------------------------------- -//ZFS Restore Functions -//---------------------------------- -void MainUI::snapshotLoaded(){ - ui->tree_zfs_dir->resizeColumnToContents(0); -} - -void MainUI::showSnapshot(){ - ui->tool_zfs_prevSnap->setEnabled(ui->slider_zfs_snapshot->value()!=1); - ui->tool_zfs_nextSnap->setEnabled(ui->slider_zfs_snapshot->value()!=ui->slider_zfs_snapshot->maximum()); - ui->label_zfs_snap->setText( snapDirs[ui->slider_zfs_snapshot->value()-1].section("/.zfs/snapshot/",1,1).section("/",0,0) ); - //Load the dir contents - ui->tree_zfs_dir->setRootIndex(snapmod->index(snapDirs[ui->slider_zfs_snapshot->value()-1])); -} - -void MainUI::prevSnapshot(){ - ui->slider_zfs_snapshot->setValue(ui->slider_zfs_snapshot->value()-1); -} - -void MainUI::nextSnapshot(){ - ui->slider_zfs_snapshot->setValue(ui->slider_zfs_snapshot->value()+1); -} - -void MainUI::restoreItems(){ - //Get the selected items - QStringList sel; //= getSelectedItems(); - QModelIndexList items = ui->tree_zfs_dir->selectionModel()->selectedIndexes(); - for(int i=0; i<items.length(); i++){ - sel << snapmod->filePath(items[i]).section("/",-1); - } - sel.removeDuplicates(); - if(sel.isEmpty()){ return; } //nothing selected - if(!checkUserPerms()){ return; } - //Get the directories - QString snapdir = snapDirs[ui->slider_zfs_snapshot->value()-1]; - QString basedir = getCurrentDir(); - if(!basedir.endsWith("/")){ basedir.append("/"); } - if(!snapdir.endsWith("/")){ snapdir.append("/"); } - //Fill out the lists appropriately - QStringList resto; - qDebug() << "Items Selected:" << sel; - for(int i=0; i<sel.length(); i++){ - resto << basedir+sel[i]; - sel[i] = snapdir+sel[i]; - } - qDebug() << "Restore Items:" << sel << "\n" << resto; - //Restore the items - FODialog dlg(this); - dlg.setOverwrite(ui->check_zfs_overwrite->isChecked()); - dlg.RestoreFiles(sel, resto); - dlg.exec(); - if(dlg.noerrors){ - QMessageBox::information(this, tr("Success"), tr("Successfully restored selection") ); - } -} - -//---------------------------- -// Multimedia Player -//---------------------------- -void MainUI::playerStart(){ - if(ui->stackedWidget->currentWidget()!=ui->page_audioPlayer){ return; } //don't play if not in the player - - if(mediaObj->state()==QMediaPlayer::PausedState \ - && mediaObj->currentMedia().canonicalUrl().fileName()==ui->combo_player_list->currentText() ){ - mediaObj->play(); - }else{ - mediaObj->stop(); - //Get the selected file path - QString filePath = getCurrentDir(); - if(!filePath.endsWith("/")){ filePath.append("/"); } - filePath.append( ui->combo_player_list->currentText() ); - mediaObj->setMedia( QUrl::fromLocalFile(filePath) ); - playerTTime.clear(); - playerSlider->setEnabled(mediaObj->isSeekable()); - mediaObj->play(); - } -} - -void MainUI::playerError(){ - QString msg = QString(tr("Error Playing File: %1")); - msg = msg.arg( mediaObj->currentMedia().canonicalUrl().fileName() ); - msg.append("\n"+mediaObj->errorString()); - ui->label_player_novideo->setText(msg); -} - -void MainUI::playerStop(){ - mediaObj->stop(); -} - -void MainUI::playerPause(){ - mediaObj->pause(); -} - -void MainUI::playerNext(){ - ui->combo_player_list->setCurrentIndex( ui->combo_player_list->currentIndex()+1); - if(mediaObj->state()!=QMediaPlayer::StoppedState){ playerStart(); } -} - -void MainUI::playerPrevious(){ - ui->combo_player_list->setCurrentIndex( ui->combo_player_list->currentIndex()-1); - if(mediaObj->state()!=QMediaPlayer::StoppedState){ playerStart(); } -} - -void MainUI::playerFinished(){ - if(ui->combo_player_list->currentIndex()<(ui->combo_player_list->count()-1) && ui->check_player_gotonext->isChecked()){ - ui->combo_player_list->setCurrentIndex( ui->combo_player_list->currentIndex()+1 ); - QTimer::singleShot(0,this,SLOT(playerStart())); - }else{ - ui->label_player_novideo->setText(tr("Finished")); - } -} - -void MainUI::playerStatusChanged(QMediaPlayer::MediaStatus stat){ - //Only use this for end-of-file detection - use the state detection otherwise - if(stat == QMediaPlayer::EndOfMedia){ - if(!mediaObj->isMuted()){ playerFinished(); } //make sure it is not being seeked right now - } -} - -void MainUI::playerStateChanged(QMediaPlayer::State newstate){ - //This function keeps track of updating the visuals of the player - bool running = false; - bool showVideo = false; - QString msg; - switch(newstate){ - case QMediaPlayer::PlayingState: - running=true; - showVideo = mediaObj->isVideoAvailable(); - msg = "";//mediaObj->metaData(Phonon::TitleMetaData).join(" "); - if(msg.simplified().isEmpty()){ msg = ui->combo_player_list->currentText(); } - ui->label_player_novideo->setText(tr("Playing:")+"\n"+msg); - break; - case QMediaPlayer::PausedState: - showVideo=videoDisplay->isVisible(); //don't change the screen - break; - case QMediaPlayer::StoppedState: - ui->label_player_novideo->setText(tr("Stopped")); - break; - } - ui->tool_player_play->setVisible(!running); - ui->tool_player_pause->setVisible(running); - ui->tool_player_stop->setEnabled(running); - ui->label_player_novideo->setVisible(!showVideo); - videoDisplay->setVisible(showVideo); -} - -void MainUI::playerVideoAvailable(bool showVideo){ - ui->label_player_novideo->setVisible(!showVideo); - videoDisplay->setVisible(showVideo); -} - -void MainUI::playerDurationChanged(qint64 dur){ - if(dur < 0){ return; } //not ready yet - playerSlider->setMaximum(mediaObj->duration()); - playerTTime = msToText(dur); -} - -void MainUI::playerTimeChanged(qint64 ctime){ - if(mediaObj->isMuted() || playerTTime.isEmpty() ){ return; } //currently being moved - playerSlider->setSliderPosition(ctime); -} - -void MainUI::playerSliderMoved(int val){ - ui->label_player_runstats->setText( msToText(val)+"/"+playerTTime ); - if(mediaObj->isMuted()){ mediaObj->setPosition(playerSlider->value()); } //currently seeking -} - -void MainUI::playerSliderHeld(){ - mediaObj->setMuted(true); - mediaObj->pause(); -} -void MainUI::playerSliderChanged(){ - if(mediaObj->state()==QMediaPlayer::PausedState){ mediaObj->play(); } - mediaObj->setMuted(false); -} - -void MainUI::playerFileChanged(){ - ui->tool_player_next->setEnabled( ui->combo_player_list->count() > (ui->combo_player_list->currentIndex()+1) ); - ui->tool_player_prev->setEnabled( (ui->combo_player_list->currentIndex()-1) >= 0 ); -} - -//---------------------------------- -// Context Menu Actions -//---------------------------------- -void MainUI::OpenItem(){ - QFileInfoList sel = getSelectedItems(); - if(sel.isEmpty()){ return; } - - QStringList dirs; - for(int i=0; i<sel.length(); i++){ - if(sel[i].isDir()){ dirs << sel[i].absoluteFilePath(); } - else{ - qDebug() << "Opening File:" << sel[i].absoluteFilePath(); - QProcess::startDetached("lumina-open \""+sel[i].absoluteFilePath()+"\""); + if(radio_view_tabs->isChecked()){ + //Need to update the text for the tab so it corresponds to the current directory loaded + for(int i=0; i<tabBar->count(); i++){ + if(tabBar->tabWhatsThis(i)==id){ + tabBar->setTabText(i, dir.section("/",-1)); + } } } - if(!dirs.isEmpty()){ OpenDirs(dirs); } - CItem.clear(); } -void MainUI::OpenItemWith(){ - QFileInfoList sel = getSelectedItems(); - if(sel.isEmpty()){ return; } - for(int i=0; i<sel.length(); i++){ - qDebug() << "Opening File With:" << sel[i].absoluteFilePath(); - QProcess::startDetached("lumina-open -select \""+sel[i].absoluteFilePath()+"\""); +void MainUI::SnapshotDataAvailable(QString id , QString dir, QStringList list){ + for(int i=0; i<DWLIST.length(); i++){ + if(id == DWLIST[i]->id()){ + DWLIST[i]->LoadSnaps(dir, list); + break; + } } - CItem.clear(); } -/*void MainUI::OpenDir(){ - if(CItem.isEmpty()){ - QFileInfoList sel = getSelectedItems(); - if(sel.isEmpty()){ return; } - else{ CItem = sel[0].absoluteFilePath(); } +void MainUI::OpenPlayer(LFileInfoList list){ + //See if the tab is available for the multimedia player + int tab = -1; + for(int i=0; i<tabBar->count(); i++){ + if(tabBar->tabWhatsThis(i)=="#MW"){ tab=i; break;} } - OpenDirs(QStringList() << CItem); - CItem.clear(); -}*/ - -void MainUI::RemoveItem(){ - //Only let this run if viewing the browser page - if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } - if(!checkUserPerms()){ return; } - //Get the selected items - QStringList paths, names; - //if(CItem.isEmpty()){ - QFileInfoList sel = getSelectedItems(); - for(int i=0; i<sel.length(); i++){ - paths << sel[i].absoluteFilePath(); - names << sel[i].fileName(); - } - if(sel.isEmpty()){ return; } //nothing selected - /*}else{ - paths << CItem; - names << CItem.section("/",-1); - }*/ - //Verify permanent removal of file/dir - if(QMessageBox::Yes != QMessageBox::question(this, tr("Verify Removal"), tr("WARNING: This will permanently delete the file(s) from the system!")+"\n"+tr("Are you sure you want to continue?")+"\n\n"+names.join("\n"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ){ - return; //cancelled + if(tab<0){ + //Need to create a new tab + tab = tabBar->addTab(LXDG::findIcon("media-playback-start",""), tr("Multimedia")); + tabBar->setTabWhatsThis(tab,"#MW"); + //Also clear the info in the player + MW->ClearPlaylist(); } - //Now remove the file/dir - qDebug() << "Delete: "<<paths; - FODialog dlg(this); - dlg.RemoveFiles(paths); - dlg.show(); - dlg.exec(); - CItem.clear(); + //Load the data into the player + MW->LoadMultimedia(list); + //Switch to the player tab + tabBar->setCurrentIndex(tab); } -void MainUI::RenameItem(){ - //Only let this run if viewing the browser page - if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } - if(!checkUserPerms()){ return; } - if(CItem.isEmpty()){ - QFileInfoList sel = getSelectedItems(); - if(sel.isEmpty()){ return; } - else{ CItem = sel[0].absoluteFilePath(); } +void MainUI::OpenImages(LFileInfoList list){ + int tab = -1; + for(int i=0; i<tabBar->count(); i++){ + if(tabBar->tabWhatsThis(i)=="#SW"){ tab=i; break;} } - QString fname = CItem; - QString path = fname; - fname = fname.section("/",-1); //turn this into just the file name - path.chop(fname.length()); //turn this into the base directory path (has a "/" at the end) - //Now prompt for the new filename - bool ok = false; - QString nname = QInputDialog::getText(this, tr("Rename File"),tr("New Name:"), QLineEdit::Normal, fname, &ok); - if(!ok || nname.isEmpty()){ CItem.clear(); return; } //cancelled - //Now check for a file extension and add it if necessary - QString oext = fname.section(".",-1); - if("."+oext == fname){ oext.clear(); } //hidden file without an extension - else if(oext==fname){ oext.clear(); } //no extension - QString next = nname.section(".",-1); - if(next==nname){ next.clear(); } //no extension - if(next.isEmpty() && !oext.isEmpty()){ - nname.append( "."+oext ); - } - //Check if this filename already exists - bool overwrite = QFile::exists(path+nname); - if(overwrite){ - if(QMessageBox::Yes != QMessageBox::question(this, tr("Overwrite File?"), tr("An existing file with the same name will be replaced. Are you sure you want to proceed?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ){ - CItem.clear(); return; //cancelled - } + if(tab<0){ + //Need to create a new tab + tab = tabBar->addTab(LXDG::findIcon("fileview-preview",""), tr("Slideshow")); + tabBar->setTabWhatsThis(tab,"#SW"); + //Also clear the info in the viewer + SW->ClearImages(); } - //Now perform the move - qDebug() << "Rename:" << path+fname << "->" << path+nname; - FODialog dlg(this); - dlg.setOverwrite(overwrite); - dlg.MoveFiles(QStringList() << path+fname, QStringList() << path+nname); - dlg.show(); - dlg.exec(); - CItem.clear(); - - ItemSelectionChanged(); + //Load the data into the viewer + SW->LoadImages(list); + //Switch to the player tab + tabBar->setCurrentIndex(tab); + QTimer::singleShot(20, SW, SLOT(refresh()) ); } -void MainUI::FavoriteItem(){ - if(CItem.isEmpty()){ - QFileInfoList sel = getSelectedItems(); - if(sel.isEmpty()){ return; } - else{ CItem = sel[0].canonicalFilePath(); } - } - //QString fname = CItem; - QString fullpath = CItem; - /*fname = fname.section("/",-1); //turn this into just the file name - if(QFile::exists(favdir+fname)){ QFile::remove(favdir+fname); } //remove the stale link - QFile::link(fullpath, favdir+fname);*/ - LUtils::addFavorite(fullpath); - CItem.clear(); - ItemSelectionChanged(); -} - -void MainUI::ViewPropertiesItem(){ - QFileInfoList sel = getSelectedItems(); - if(sel.isEmpty()){ return; } - for(int i=0; i<sel.length(); i++){ - QProcess::startDetached("lumina-fileinfo \""+sel[i].absoluteFilePath()+"\""); - } -} - -void MainUI::openTerminal(){ - QFileInfoList sel = getSelectedItems(); +void MainUI::OpenTerminal(QString dirpath){ + //QFileInfoList sel = getSelectedItems(); QString shell; //we get the shell has defined in the environment if (getenv("SHELL")) shell = QString(getenv("SHELL")); @@ -1460,78 +625,61 @@ void MainUI::openTerminal(){ //The binary does not exist or is invalid defTerminal = "xterm"; } - if(sel.isEmpty()){ + //-e is the parameter for most of the terminal appliction to execute an external command. //In your case we start a shell in the selected directory - QProcess::startDetached(defTerminal + " -e \"cd " + getCurrentDir() + " && " + shell + " \" "); - } else { - QProcess::startDetached(defTerminal + " -e \"cd " + sel[0].absoluteFilePath() + " && " + shell + " \" "); - } -} + QProcess::startDetached(defTerminal + " -e \"cd " + dirpath + " && " + shell + " \" "); +} -void MainUI::CutItems(){ - //Only let this run if viewing the browser page - if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } - if(!checkUserPerms()){ return; } - //Get all the selected Items - QFileInfoList sel = getSelectedItems(); - QStringList items; - if(sel.isEmpty()){ return; } //nothing selected +void MainUI::CutFiles(QStringList list){ + qDebug() << "Cut Files:" << list; + if(list.isEmpty()){ return; } //nothing selected //Format the data string - for(int i=0; i<sel.length(); i++){ - items << "cut::::"+sel[i].absoluteFilePath(); - //sel[i] = sel[i].prepend("cut::::"); + for(int i=0; i<list.length(); i++){ + list[i] = list[i].prepend("cut::::"); } - //Now save that data to the global clipboard QMimeData *dat = new QMimeData; dat->clear(); - dat->setData("x-special/lumina-copied-files", items.join("\n").toLocal8Bit()); + dat->setData("x-special/lumina-copied-files", list.join("\n").toLocal8Bit()); QApplication::clipboard()->clear(); QApplication::clipboard()->setMimeData(dat); - ItemSelectionChanged(); + //Update all the buttons to account for clipboard change + for(int i=0; i<DWLIST.length(); i++){ DWLIST[i]->refreshButtons(); } } -void MainUI::CopyItems(){ - //Only let this run if viewing the browser page - if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } - //Get all the selected Items - QFileInfoList sel = getSelectedItems(); - QStringList items; - if(sel.isEmpty()){ return; } //nothing selected +void MainUI::CopyFiles(QStringList list){ + qDebug() << "Copy Files:" << list; + if(list.isEmpty()){ return; } //nothing selected //Format the data string - for(int i=0; i<sel.length(); i++){ - items << "copy::::"+sel[i].absoluteFilePath(); - //sel[i] = sel[i].prepend("copy::::"); + for(int i=0; i<list.length(); i++){ + list[i] = list[i].prepend("copy::::"); } //Now save that data to the global clipboard QMimeData *dat = new QMimeData; dat->clear(); - dat->setData("x-special/lumina-copied-files", items.join("\n").toLocal8Bit()); + dat->setData("x-special/lumina-copied-files", list.join("\n").toLocal8Bit()); QApplication::clipboard()->clear(); - QApplication::clipboard()->setMimeData(dat); - ItemSelectionChanged(); + QApplication::clipboard()->setMimeData(dat); + //Update all the buttons to account for clipboard change + for(int i=0; i<DWLIST.length(); i++){ DWLIST[i]->refreshButtons(); } } -void MainUI::PasteItems(){ - //Only let this run if viewing the browser page - if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } - const QMimeData *dat = QApplication::clipboard()->mimeData(); - if(!dat->hasFormat("x-special/lumina-copied-files")){ return; } //nothing to paste - if(!checkUserPerms()){ return; } +void MainUI::PasteFiles(QString dir){ + qDebug() << "Paste Files:" << dir; QStringList cut, copy, newcut, newcopy; + const QMimeData *dat = QApplication::clipboard()->mimeData(); QStringList raw = QString(dat->data("x-special/lumina-copied-files")).split("\n"); - QString base = getCurrentDir(); - if(!base.endsWith("/")){ base.append("/"); } + if(!dir.endsWith("/")){ dir.append("/"); } for(int i=0; i<raw.length(); i++){ if(raw[i].startsWith("cut::::")){ cut << raw[i].section("::::",1,50); - newcut << base+raw[i].section("::::",1,50).section("/",-1); + newcut << dir+raw[i].section("::::",1,50).section("/",-1); } else if(raw[i].startsWith("copy::::")){ copy << raw[i].section("::::",1,50); - newcopy<< base+raw[i].section("::::",1,50).section("/",-1); + newcopy<< dir+raw[i].section("::::",1,50).section("/",-1); } } bool errs = false; @@ -1564,31 +712,94 @@ void MainUI::PasteItems(){ QApplication::clipboard()->setMimeData(dat); } } - ItemSelectionChanged(); + //Update all the buttons to account for clipboard change + for(int i=0; i<DWLIST.length(); i++){ DWLIST[i]->refreshButtons(); } +} + +void MainUI::FavoriteFiles(QStringList list){ + qDebug() << "Favorite Files:" << list; + for(int i=0; i<list.length(); i++){ + LUtils::addFavorite(list[i]); + } + //Might want to make this a "toggle" instead of an add later on... +} + +void MainUI::RenameFiles(QStringList list){ + qDebug() << "Rename Files:" << list; + for(int i=0; i<list.length(); i++){ + QString fname = list[i]; + QString path = fname; + fname = fname.section("/",-1); //turn this into just the file name + path.chop(fname.length()); //turn this into the base directory path (has a "/" at the end) + //Now prompt for the new filename + bool ok = false; + QString nname = QInputDialog::getText(this, tr("Rename File"),tr("New Name:"), QLineEdit::Normal, fname, &ok); + if(!ok || nname.isEmpty()){ return; } //cancelled + //Now check for a file extension and add it if necessary + QString oext = fname.section(".",-1); + if("."+oext == fname){ oext.clear(); } //hidden file without an extension + else if(oext==fname){ oext.clear(); } //no extension + QString next = nname.section(".",-1); + if(next==nname){ next.clear(); } //no extension + if(next.isEmpty() && !oext.isEmpty()){ + nname.append( "."+oext ); + } + //Check if this filename already exists + bool overwrite = QFile::exists(path+nname); + if(overwrite){ + if(QMessageBox::Yes != QMessageBox::question(this, tr("Overwrite File?"), tr("An existing file with the same name will be replaced. Are you sure you want to proceed?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ){ + return; //cancelled + } + } + //Now perform the move + qDebug() << "Rename:" << path+fname << "->" << path+nname; + FODialog dlg(this); + dlg.setOverwrite(overwrite); + dlg.MoveFiles(QStringList() << path+fname, QStringList() << path+nname); + dlg.show(); + dlg.exec(); + } //end loop over list of files +} + +void MainUI::RemoveFiles(QStringList list){ + if(list.isEmpty()){ return; } //nothing selected + qDebug() << "Remove Files:" << list; + QStringList paths, names; + for(int i=0; i<list.length(); i++){ + paths << list[i]; + names << list[i].section("/",-1); + } + + //Verify permanent removal of file/dir + if(QMessageBox::Yes != QMessageBox::question(this, tr("Verify Removal"), tr("WARNING: This will permanently delete the file(s) from the system!")+"\n"+tr("Are you sure you want to continue?")+"\n\n"+names.join("\n"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ){ + return; //cancelled + } + //Now remove the file/dir + qDebug() << " - Delete: "<<paths; + FODialog dlg(this); + dlg.RemoveFiles(paths); + dlg.show(); + dlg.exec(); } -void MainUI::ChecksumItems(){ - if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } - QFileInfoList sel = getSelectedItems(); - if(sel.isEmpty()){ return; } - QStringList info, files; - for(int i=0; i<sel.length(); i++){ - files << sel[i].absoluteFilePath(); +void MainUI::CloseBrowser(QString ID){ + if(DWLIST.length()<2){ return; } //cannot close the last browser + //Find the tab associated with this browser first + for(int i=0; i<tabBar->count(); i++){ + if(tabBar->tabWhatsThis(i)==ID){ + tabBar->removeTab(i); + break; + } } - qDebug() << "Run Checksums:" << files; - 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 \t(%1)").arg(files[i].section("/",-1), info[i]); + //Now remove the browser itself + for(int i=0; i<DWLIST.length(); i++){ + if(DWLIST[i]->id()==ID){ + delete DWLIST.takeAt(i); + break; + } } - /*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 MainUI::resizeEvent(QResizeEvent *event){ //Save the new size internally diff --git a/lumina-fm/MainUI.h b/lumina-fm/MainUI.h index 6847f6f6..80582af6 100644 --- a/lumina-fm/MainUI.h +++ b/lumina-fm/MainUI.h @@ -1,6 +1,6 @@ //=========================================== // Lumina-DE source code -// Copyright (c) 2014, Ken Moore +// Copyright (c) 2014-2015, Ken Moore // Available under the 3-clause BSD license // See the LICENSE file for full details //=========================================== @@ -51,13 +51,11 @@ // Local includes #include "FODialog.h" //file operation dialog #include "BMMDialog.h" //bookmark manager dialog -#include "MimeIconProvider.h" //icon provider for the view widgets -#include "BackgroundWorker.h" -#include "DDFileSystemModel.h" #include "DirData.h" #include "widgets/MultimediaWidget.h" #include "widgets/SlideshowWidget.h" +#include "widgets/DirWidget.h" namespace Ui{ class MainUI; @@ -69,42 +67,29 @@ public: MainUI(); ~MainUI(); - void OpenDirs(QStringList); //called from the main.cpp after initialization - public slots: + void OpenDirs(QStringList); //also called from the main.cpp after initialization void setupIcons(); //used during initialization private: Ui::MainUI *ui; QThread *workThread; - BackgroundWorker *worker; + DirData *worker; //Internal non-ui widgets QTabBar *tabBar; - QLineEdit *currentDir; - DDFileSystemModel *fsmod; - QFileSystemModel *snapmod; - //QFileSystemWatcher *fswatcher; - MimeIconProvider *iconProv; + QFileSystemModel *fsmod; QMenu *contextMenu; - QRadioButton *radio_view_details, *radio_view_list, *radio_view_icons; - QWidgetAction *detWA, *listWA, *icoWA; + QRadioButton *radio_view_details, *radio_view_list, *radio_view_tabs, *radio_view_cols; + QWidgetAction *detWA, *listWA, *tabsWA, *colsWA; QString favdir; - - //Phonon Widgets for the multimedia player - QMediaPlayer *mediaObj; - QVideoWidget *videoDisplay; - QSlider *playerSlider; - QString playerTTime; //total time - to prevent recalculation every tick - - //Internal variables - QStringList snapDirs; //internal saved variable for the discovered zfs snapshot dirs - QString CItem; //the item that was right-clicked (for the context menu) - //QStringList imgFilter, multiFilter; //image/multimedia filters + //UI Widgets + QList<DirWidget*> DWLIST; + MultimediaWidget *MW; + SlideshowWidget *SW; + QSettings *settings; - QShortcut *nextTabLShort, *nextTabRShort, *closeTabShort, *copyFilesShort, *cutFilesShort, *pasteFilesShort, *deleteFilesShort; + QShortcut *nextTabLShort, *nextTabRShort, *closeTabShort; QCompleter *dirCompleter; - bool isUserWritable, keepFocus; - QTimer *syncTimer; //Simplification Functions void setupConnections(); //used during initialization @@ -113,15 +98,6 @@ private: void RebuildBookmarksMenu(); void RebuildDeviceMenu(); - bool checkUserPerms(); - QString msToText(qint64 ms); - - //Common functions for browser info/usage - QString getCurrentDir(); - void setCurrentDir(QString); - QFileInfoList getSelectedItems(); - //QModelIndexList getVisibleItems(); - private slots: void slotSingleInstance(QStringList in){ this->show(); @@ -129,18 +105,7 @@ private slots: this->OpenDirs(in); } - void slotStartSyncTimer(); - - //General button check functions (started in a seperate thread!) - void AvailableMultimediaFiles(QStringList files); - void AvailableBackups(QString basedir, QStringList snapdirs); - void AvailablePictures(QStringList files); - - //General page switching - void goToMultimediaPage(); - void goToRestorePage(); - void goToSlideshowPage(); - void goToBrowserPage(); + //void slotStartSyncTimer(); //Menu Actions void on_actionNew_Tab_triggered(); @@ -152,86 +117,36 @@ private slots: void goToBookmark(QAction*); void goToDevice(QAction*); void viewModeChanged(bool); - - //Toolbar Actions - void on_actionBack_triggered(); - void on_actionUpDir_triggered(); - void on_actionHome_triggered(); - void on_actionBookMark_triggered(); + void groupModeChanged(bool); + void on_actionLarger_Icons_triggered(); + void on_actionSmaller_Icons_triggered(); - //Browser Functions - void startEditDir(QWidget *old, QWidget *now); - void goToDirectory(); //go to a manually typed in directory - void reloadDirectory(); //Update the widget with the dir contents - void currentDirectoryLoaded(); //The file system model re-loaded the directory - void on_tool_addToDir_clicked(); - void on_tool_addNewFile_clicked(); - void tabChanged(int tab); + //Tab interactions + void tabChanged(int tab = -1); void tabClosed(int tab = -1); - void prevTab(); - void nextTab(); - void ItemRun( const QModelIndex&); - //void ItemRun(QTreeWidgetItem *item); - //void ItemRun(QListWidgetItem *item); - void OpenContextMenu(const QPoint&); - void ItemSelectionChanged(); - - //Slideshow Functions - void showNewPicture(); - void firstPicture(); - void prevPicture(); - void nextPicture(); - void lastPicture(); - void removePicture(); - void rotatePictureLeft(); - void rotatePictureRight(); - - //ZFS Restore Functions - void snapshotLoaded(); - void showSnapshot(); - void nextSnapshot(); - void prevSnapshot(); - void restoreItems(); + void nextTab(); //For keyboard shortcuts + void prevTab(); //For keyboard shortcuts - //Multimedia Player Functions - void playerStart(); - void playerError(); - void playerStop(); - void playerPause(); - void playerNext(); - void playerPrevious(); - void playerFinished(); //automatically called by the media object - void playerStatusChanged(QMediaPlayer::MediaStatus stat); //automatically called - void playerStateChanged(QMediaPlayer::State newstate); //automatically called by the media object - void playerVideoAvailable(bool showVideo); //automatically called by the media object - void playerDurationChanged(qint64); - void playerTimeChanged(qint64 ctime); //automatically called by the media object - void playerSliderMoved(int); - void playerSliderHeld(); - void playerSliderChanged(); - void playerFileChanged(); + //Backend Info passing + void DirDataAvailable(QString, QString, LFileInfoList); + void SnapshotDataAvailable(QString, QString, QStringList); - //Context Menu Actions - void OpenItem(); //run "lumina-open" on it - void OpenItemWith(); //run "lumina-open -select" on it - //void OpenDir(); //open the dir in a new tab - void RemoveItem(); //Remove the item permanently - // - single item actions - void RenameItem(); - void FavoriteItem(); - // - full selection actions - void ViewPropertiesItem(); - void openTerminal(); - void CutItems(); - void CopyItems(); - void PasteItems(); - void ChecksumItems(); + //Dir Browser Interactions + void OpenPlayer(LFileInfoList); + void OpenImages(LFileInfoList); + void OpenTerminal(QString dirpath); + void CutFiles(QStringList); //file selection + void CopyFiles(QStringList); //file selection + void PasteFiles(QString); //current dir + void FavoriteFiles(QStringList); //file selection + void RenameFiles(QStringList); //file selection + void RemoveFiles(QStringList); //file selection + void CloseBrowser(QString); //ID //file info in status bar void DisplayStatusBar(QString); signals: - void DirChanged(QString path); void Si_AdaptStatusBar(QFileInfoList fileList, QString path, QString messageFolders, QString messageFiles); protected: diff --git a/lumina-fm/MainUI.ui b/lumina-fm/MainUI.ui index a978e871..184df872 100644 --- a/lumina-fm/MainUI.ui +++ b/lumina-fm/MainUI.ui @@ -14,18 +14,18 @@ <string>Insight</string> </property> <widget class="QWidget" name="centralwidget"> - <layout class="QHBoxLayout" name="horizontalLayout_2"> + <layout class="QVBoxLayout" name="verticalLayout_3"> <property name="leftMargin"> - <number>1</number> + <number>0</number> </property> <property name="topMargin"> - <number>1</number> + <number>0</number> </property> <property name="rightMargin"> - <number>1</number> + <number>0</number> </property> <property name="bottomMargin"> - <number>1</number> + <number>0</number> </property> <item> <widget class="QStackedWidget" name="stackedWidget"> @@ -33,1068 +33,26 @@ <number>0</number> </property> <widget class="QWidget" name="page_browser"> - <layout class="QGridLayout" name="gridLayout"> + <layout class="QHBoxLayout" name="BrowserLayout"> + <property name="spacing"> + <number>0</number> + </property> <property name="leftMargin"> - <number>1</number> + <number>0</number> </property> <property name="topMargin"> - <number>2</number> + <number>0</number> </property> <property name="rightMargin"> - <number>2</number> + <number>0</number> </property> <property name="bottomMargin"> <number>0</number> </property> - <property name="spacing"> - <number>1</number> - </property> - <item row="0" column="1"> - <layout class="QVBoxLayout" name="verticalLayout_browser"> - <property name="spacing"> - <number>0</number> - </property> - <item> - <widget class="QListView" name="list_dir_view"> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="showDropIndicator" stdset="0"> - <bool>true</bool> - </property> - <property name="dragEnabled"> - <bool>true</bool> - </property> - <property name="dragDropMode"> - <enum>QAbstractItemView::InternalMove</enum> - </property> - <property name="defaultDropAction"> - <enum>Qt::MoveAction</enum> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::ExtendedSelection</enum> - </property> - <property name="textElideMode"> - <enum>Qt::ElideRight</enum> - </property> - <property name="isWrapping" stdset="0"> - <bool>true</bool> - </property> - <property name="resizeMode"> - <enum>QListView::Adjust</enum> - </property> - <property name="layoutMode"> - <enum>QListView::SinglePass</enum> - </property> - <property name="spacing"> - <number>1</number> - </property> - <property name="uniformItemSizes"> - <bool>false</bool> - </property> - <property name="batchSize"> - <number>10</number> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - <property name="selectionRectVisible"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QTreeView" name="tree_dir_view"> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Sunken</enum> - </property> - <property name="showDropIndicator" stdset="0"> - <bool>true</bool> - </property> - <property name="dragEnabled"> - <bool>true</bool> - </property> - <property name="dragDropMode"> - <enum>QAbstractItemView::InternalMove</enum> - </property> - <property name="defaultDropAction"> - <enum>Qt::MoveAction</enum> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::ExtendedSelection</enum> - </property> - <property name="indentation"> - <number>0</number> - </property> - <property name="rootIsDecorated"> - <bool>false</bool> - </property> - <property name="uniformRowHeights"> - <bool>true</bool> - </property> - <property name="itemsExpandable"> - <bool>false</bool> - </property> - <property name="sortingEnabled"> - <bool>true</bool> - </property> - <property name="expandsOnDoubleClick"> - <bool>false</bool> - </property> - <attribute name="headerCascadingSectionResizes"> - <bool>true</bool> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>30</number> - </attribute> - <attribute name="headerStretchLastSection"> - <bool>true</bool> - </attribute> - </widget> - </item> - </layout> - </item> - <item row="0" column="0"> - <widget class="QGroupBox" name="group_actions"> - <property name="title"> - <string/> - </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> - <item row="1" column="0" colspan="2"> - <layout class="QHBoxLayout" name="horizontalLayout_4"> - <property name="spacing"> - <number>0</number> - </property> - <item> - <widget class="QLabel" name="label_dir_stats"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string notr="true"/> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_addNewFile"> - <property name="statusTip"> - <string>Create a new file</string> - </property> - <property name="text"> - <string>New &file</string> - </property> - <property name="popupMode"> - <enum>QToolButton::InstantPopup</enum> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_addToDir"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="statusTip"> - <string>Create a new subdirectory</string> - </property> - <property name="text"> - <string notr="true">&New Dir</string> - </property> - <property name="shortcut"> - <string>Ctrl+N</string> - </property> - <property name="popupMode"> - <enum>QToolButton::InstantPopup</enum> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_goToPlayer"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="toolTip"> - <string>Open Multimedia Player</string> - </property> - <property name="statusTip"> - <string>Play any multimedia files in this directory</string> - </property> - <property name="text"> - <string>&Play</string> - </property> - <property name="shortcut"> - <string>Ctrl+P, Ctrl+S</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_goToImages"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="toolTip"> - <string>View Slideshow</string> - </property> - <property name="statusTip"> - <string>View all the images in this directory as a slideshow</string> - </property> - <property name="text"> - <string>&Slideshow</string> - </property> - <property name="shortcut"> - <string>Ctrl+S</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_goToRestore"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="toolTip"> - <string>Restore File(s)</string> - </property> - <property name="statusTip"> - <string>Restore old versions of files or directories</string> - </property> - <property name="text"> - <string>&Backups</string> - </property> - <property name="shortcut"> - <string>Ctrl+B</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_audioPlayer"> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QCheckBox" name="check_player_gotonext"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Go To Next</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line_3"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>30</width> - <height>0</height> - </size> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_player_prev"> - <property name="text"> - <string notr="true">prev</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="combo_player_list"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_player_next"> - <property name="text"> - <string notr="true">next</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="videoLayout"> - <item> - <widget class="QLabel" name="label_player_novideo"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <pointsize>13</pointsize> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="styleSheet"> - <string notr="true">background: black; color: white;</string> - </property> - <property name="text"> - <string>(No Running Video)</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="videoControlLayout"> - <item> - <widget class="QToolButton" name="tool_player_play"> - <property name="text"> - <string notr="true">play</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_player_pause"> - <property name="text"> - <string notr="true">pause</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_player_stop"> - <property name="text"> - <string notr="true">stop</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line_4"> - <property name="minimumSize"> - <size> - <width>30</width> - <height>0</height> - </size> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_player_runstats"> - <property name="text"> - <string notr="true">?/?</string> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_image_view"> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_5"> - <item> - <layout class="QVBoxLayout" name="verticalLayout_4"> - <item> - <widget class="QToolButton" name="tool_image_remove"> - <property name="toolTip"> - <string>Delete this image file</string> - </property> - <property name="text"> - <string notr="true">...</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line_8"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_image_rotateleft"> - <property name="toolTip"> - <string>Rotate this image file counter-clockwise</string> - </property> - <property name="text"> - <string notr="true">...</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_image_rotateright"> - <property name="toolTip"> - <string>Rotate this image file clockwise</string> - </property> - <property name="text"> - <string notr="true">...</string> - </property> - <property name="autoRaise"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item> - <widget class="QLabel" name="label_image"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="styleSheet"> - <string notr="true">QLabel{ background: grey; }</string> - </property> - <property name="frameShape"> - <enum>QFrame::StyledPanel</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <property name="text"> - <string notr="true"/> - </property> - <property name="scaledContents"> - <bool>false</bool> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <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_image_goBegin"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="toolTip"> - <string>Go to Beginning</string> - </property> - <property name="text"> - <string>...</string> - </property> - <property name="shortcut"> - <string>Shift+Left</string> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_image_goPrev"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="toolTip"> - <string>Go to Previous</string> - </property> - <property name="text"> - <string>...</string> - </property> - <property name="shortcut"> - <string>Left</string> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="combo_image_name"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="focusPolicy"> - <enum>Qt::StrongFocus</enum> - </property> - <property name="frame"> - <bool>true</bool> - </property> - <item> - <property name="text"> - <string>File Name</string> - </property> - </item> - </widget> - </item> - <item> - <widget class="QLabel" name="label_image_index"> - <property name="text"> - <string notr="true">1/10</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_image_goNext"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="toolTip"> - <string>Go to Next</string> - </property> - <property name="text"> - <string>...</string> - </property> - <property name="shortcut"> - <string>Right</string> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="tool_image_goEnd"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="toolTip"> - <string>Go to End</string> - </property> - <property name="text"> - <string>...</string> - </property> - <property name="shortcut"> - <string>Shift+Right</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - </layout> - </widget> - <widget class="QWidget" name="page_zfs"> - <layout class="QVBoxLayout" name="verticalLayout_6"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_7"> - <item> - <widget class="QToolButton" name="tool_zfs_prevSnap"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Older</string> - </property> - <property name="shortcut"> - <string>Left</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextUnderIcon</enum> - </property> - </widget> - </item> - <item> - <layout class="QVBoxLayout" name="verticalLayout_5"> - <item> - <widget class="QSlider" name="slider_zfs_snapshot"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="maximum"> - <number>20</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="tickPosition"> - <enum>QSlider::TicksAbove</enum> - </property> - <property name="tickInterval"> - <number>1</number> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_zfs_snap"> - <property name="text"> - <string notr="true">Snapshot</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QToolButton" name="tool_zfs_nextSnap"> - <property name="focusPolicy"> - <enum>Qt::NoFocus</enum> - </property> - <property name="text"> - <string>Newer</string> - </property> - <property name="shortcut"> - <string>Right</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextUnderIcon</enum> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QTreeView" name="tree_zfs_dir"> - <property name="focusPolicy"> - <enum>Qt::StrongFocus</enum> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::ExtendedSelection</enum> - </property> - <property name="selectionBehavior"> - <enum>QAbstractItemView::SelectRows</enum> - </property> - <property name="rootIsDecorated"> - <bool>false</bool> - </property> - <property name="itemsExpandable"> - <bool>false</bool> - </property> - <property name="sortingEnabled"> - <bool>true</bool> - </property> - <property name="expandsOnDoubleClick"> - <bool>false</bool> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_8"> - <item> - <widget class="QToolButton" name="tool_zfs_restoreItem"> - <property name="toolTip"> - <string>Restore Selected Item</string> - </property> - <property name="text"> - <string>&Restore Selection</string> - </property> - <property name="shortcut"> - <string>Ctrl+R</string> - </property> - <property name="toolButtonStyle"> - <enum>Qt::ToolButtonTextBesideIcon</enum> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_3"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QCheckBox" name="check_zfs_overwrite"> - <property name="text"> - <string>&Overwrite Existing Files</string> - </property> - <property name="shortcut"> - <string>Ctrl+O</string> - </property> - </widget> - </item> - </layout> - </item> </layout> </widget> + <widget class="QWidget" name="page_player"/> + <widget class="QWidget" name="page_image"/> </widget> </item> </layout> @@ -1121,10 +79,27 @@ <property name="title"> <string>View</string> </property> + <widget class="QMenu" name="menuView_Mode"> + <property name="title"> + <string>View Mode</string> + </property> + <addaction name="actionTabs"/> + </widget> + <widget class="QMenu" name="menuGroup_Mode"> + <property name="title"> + <string>Group Mode</string> + </property> + <addaction name="actionTabs_2"/> + </widget> <addaction name="actionShow_Thumbnails"/> <addaction name="actionView_Hidden_Files"/> <addaction name="actionShow_Action_Buttons"/> <addaction name="separator"/> + <addaction name="menuView_Mode"/> + <addaction name="menuGroup_Mode"/> + <addaction name="separator"/> + <addaction name="actionLarger_Icons"/> + <addaction name="actionSmaller_Icons"/> </widget> <widget class="QMenu" name="menuBookmarks"> <property name="title"> @@ -1145,31 +120,6 @@ <addaction name="menuExternal_Devices"/> </widget> <widget class="QStatusBar" name="statusbar"/> - <widget class="QToolBar" name="toolBar"> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> - </property> - <property name="windowTitle"> - <string>toolBar</string> - </property> - <property name="movable"> - <bool>false</bool> - </property> - <property name="floatable"> - <bool>false</bool> - </property> - <attribute name="toolBarArea"> - <enum>TopToolBarArea</enum> - </attribute> - <attribute name="toolBarBreak"> - <bool>false</bool> - </attribute> - <addaction name="actionBackToBrowser"/> - <addaction name="actionBack"/> - <addaction name="actionUpDir"/> - <addaction name="actionHome"/> - <addaction name="actionBookMark"/> - </widget> <action name="actionNew_Tab"> <property name="text"> <string>New &Tab</string> @@ -1194,28 +144,6 @@ <string>&Preferences</string> </property> </action> - <action name="actionUpDir"> - <property name="text"> - <string>UpDir</string> - </property> - <property name="toolTip"> - <string>Go up one directory</string> - </property> - <property name="shortcut"> - <string>Alt+Up</string> - </property> - </action> - <action name="actionHome"> - <property name="text"> - <string>&Home</string> - </property> - <property name="toolTip"> - <string>Go to your home directory</string> - </property> - <property name="shortcut"> - <string>Alt+H</string> - </property> - </action> <action name="actionView_Hidden_Files"> <property name="checkable"> <bool>true</bool> @@ -1227,47 +155,11 @@ <string>Show Hidden Files</string> </property> </action> - <action name="actionBack"> - <property name="text"> - <string>Back</string> - </property> - <property name="toolTip"> - <string>Back to directory</string> - </property> - <property name="shortcut"> - <string>Alt+Left</string> - </property> - </action> - <action name="actionBookMark"> - <property name="text"> - <string>Bookmark</string> - </property> - <property name="toolTip"> - <string>Bookmark this directory</string> - </property> - <property name="shortcut"> - <string>Ctrl+D</string> - </property> - </action> <action name="actionScan"> <property name="text"> <string>Scan for Devices</string> </property> </action> - <action name="actionBackToBrowser"> - <property name="text"> - <string notr="true">BBack</string> - </property> - <property name="iconText"> - <string notr="true">BBack</string> - </property> - <property name="toolTip"> - <string>Back to the system</string> - </property> - <property name="shortcut"> - <string>Alt+Left</string> - </property> - </action> <action name="actionManage_Bookmarks"> <property name="enabled"> <bool>true</bool> @@ -1309,6 +201,48 @@ <string>Ctrl+F</string> </property> </action> + <action name="actionTabs"> + <property name="text"> + <string notr="true">details</string> + </property> + <property name="iconText"> + <string notr="true">details</string> + </property> + <property name="toolTip"> + <string notr="true">details</string> + </property> + </action> + <action name="actionTabs_2"> + <property name="text"> + <string notr="true">tabs</string> + </property> + <property name="iconText"> + <string notr="true">tabs</string> + </property> + <property name="toolTip"> + <string notr="true">tabs</string> + </property> + </action> + <action name="actionIncrease_Icon_Size"> + <property name="text"> + <string>Increase Icon Size</string> + </property> + </action> + <action name="actionDecrease_Icon_Size"> + <property name="text"> + <string>Decrease Icon Size</string> + </property> + </action> + <action name="actionLarger_Icons"> + <property name="text"> + <string>Larger Icons</string> + </property> + </action> + <action name="actionSmaller_Icons"> + <property name="text"> + <string>Smaller Icons</string> + </property> + </action> </widget> <resources/> <connections/> diff --git a/lumina-fm/MimeIconProvider.h b/lumina-fm/MimeIconProvider.h deleted file mode 100644 index 0c9ba98e..00000000 --- a/lumina-fm/MimeIconProvider.h +++ /dev/null @@ -1,67 +0,0 @@ -//=========================================== -// Lumina-DE source code -// Copyright (c) 2014, Ken Moore -// Available under the 3-clause BSD license -// See the LICENSE file for full details -//=========================================== -// This is the Icon provider for files based on mime types -//=========================================== -#ifndef _LUMINA_FILE_MANAGER_ICON_PROVIDER_H -#define _LUMINA_FILE_MANAGER_ICON_PROVIDER_H - -#include <QFileIconProvider> -#include <QIcon> -#include <QString> -#include <QFileInfo> - -#include <LuminaXDG.h> - -class MimeIconProvider : public QFileIconProvider{ - -public: - bool showthumbnails; - MimeIconProvider() : QFileIconProvider(){ - showthumbnails = false; - } - ~MimeIconProvider(){} - - - - QIcon icon(const QFileInfo &info) const{ - if(info.isDir()){ - return LXDG::findIcon("folder",""); - }else if(info.isFile()){ - if(showthumbnails && (info.suffix().toLower()=="png" || info.suffix().toLower()=="jpg") ){ - //make sure to only load small versions of the files into memory: could have hundreds of them... - return QIcon( QPixmap(info.absoluteFilePath()).scaledToHeight(64) ); - }else if(info.fileName().endsWith(".desktop") ){ - bool ok = false; - XDGDesktop desk = LXDG::loadDesktopFile(info.absoluteFilePath(), ok); - if(ok){ - return LXDG::findIcon(desk.icon, "unknown"); - }else{ - return LXDG::findMimeIcon(info.fileName()); - } - }else{ - return LXDG::findMimeIcon(info.fileName()); - } - }else{ - return LXDG::findIcon("unknown",""); - } - } - - QString type(const QFileInfo &info) const{ - if(info.isDir()){ - return QObject::tr("Directory"); - }else if(info.completeBaseName().isEmpty() || info.suffix().isEmpty() ){ - return QObject::tr("Unknown"); //hidden file without an extension - }else if(info.suffix()=="desktop"){ - return QObject::tr("Application"); - }else{ - return info.suffix().toUpper(); - } - } - -}; - -#endif diff --git a/lumina-fm/lumina-fm.pro b/lumina-fm/lumina-fm.pro index 2a7d0b80..8dddd1d1 100644 --- a/lumina-fm/lumina-fm.pro +++ b/lumina-fm/lumina-fm.pro @@ -18,7 +18,6 @@ SOURCES += main.cpp \ MainUI.cpp \ FODialog.cpp \ BMMDialog.cpp \ - BackgroundWorker.cpp \ widgets/MultimediaWidget.cpp \ widgets/SlideshowWidget.cpp \ widgets/DirWidget.cpp @@ -26,9 +25,6 @@ SOURCES += main.cpp \ HEADERS += MainUI.h \ FODialog.h \ BMMDialog.h \ - MimeIconProvider.h \ - BackgroundWorker.h \ - DDFileSystemModel.h \ DirData.h \ widgets/MultimediaWidget.h \ widgets/SlideshowWidget.h \ diff --git a/lumina-fm/main.cpp b/lumina-fm/main.cpp index 24fd231c..b05c4016 100644 --- a/lumina-fm/main.cpp +++ b/lumina-fm/main.cpp @@ -3,7 +3,7 @@ #include <QFile> #include <QStringList> -#include "MainUI-old.h" +#include "MainUI.h" #include <LuminaOS.h> #include <LuminaThemes.h> #include <LuminaUtils.h> diff --git a/lumina-fm/widgets/DirWidget.cpp b/lumina-fm/widgets/DirWidget.cpp index b32e5c20..775a252b 100644 --- a/lumina-fm/widgets/DirWidget.cpp +++ b/lumina-fm/widgets/DirWidget.cpp @@ -19,9 +19,36 @@ 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); + //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); + refreshShort = new QShortcut( QKeySequence(tr("F5")), this); + //Create the filesystem watcher + watcher = new QFileSystemWatcher(this); + //Now update the rest of the UI canmodify = false; //initial value contextMenu = new QMenu(this); setShowDetails(true); + setShowThumbnails(true); UpdateIcons(); UpdateText(); setupConnections(); @@ -31,24 +58,71 @@ DirWidget::~DirWidget(){ } +void DirWidget::ChangeDir(QString dirpath){ + 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){ showDetails = show; ui->listWidget->setVisible(!showDetails); ui->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 + QTreeWidgetItem *it = new QTreeWidgetItem(); + 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; + } + } + ui->treeWidget->setHeaderItem(it); + //Now reset the sorting (alphabetically, dirs first) + if(nmcol>=0){ ui->treeWidget->sortItems(nmcol, Qt::AscendingOrder); } // sort by name + if(typecol>=0){ ui->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 - emit LoadDirectory(ID, CDIR); + this->refresh(); } void DirWidget::setThumbnailSize(int px){ @@ -56,17 +130,25 @@ void DirWidget::setThumbnailSize(int px){ ui->listWidget->setIconSize(QSize(px,px)); ui->treeWidget->setIconSize(QSize(px,px)); if(CDIR.isEmpty() || !larger ){ return; } //don't need to reload icons unless the new size is larger - emit LoadDirectory(ID, CDIR); + this->refresh(); +} + +void DirWidget::setShowCloseButton(bool show){ + ui->actionClose_Browser->setVisible(show); } + // ================ // PUBLIC SLOTS // ================ void DirWidget::LoadDir(QString dir, QList<LFileInfo> list){ if(dir.isEmpty()){ return; } //nothing to do + qDebug() << "Load Dir:" << dir; QString lastdir = CDIR; //for some checks later - canmodify = QFileInfo(CDIR).isWritable(); - CLIST = list; //save for later + QString lastbasedir = normalbasedir; CDIR = dir; + if(CDIR.endsWith("/")){ CDIR.chop(1); } + CLIST = list; //save for laterr + canmodify = QFileInfo(CDIR).isWritable(); //Hide the extra buttons for a moment ui->tool_goToPlayer->setVisible(false); ui->tool_goToImages->setVisible(false); @@ -75,7 +157,10 @@ void DirWidget::LoadDir(QString dir, QList<LFileInfo> list){ 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)){ @@ -83,7 +168,8 @@ void DirWidget::LoadDir(QString dir, QList<LFileInfo> list){ } }else{ //This is a normal directory - prompt for snapshot information - normalbasedir = dir; + line_dir->setText(CDIR); + normalbasedir = CDIR; snapbasedir.clear(); loadsnaps = true; } @@ -94,37 +180,32 @@ void DirWidget::LoadDir(QString dir, QList<LFileInfo> list){ ui->slider_snap->setRange(1,1); emit findSnaps(ID, normalbasedir); } + //Now update the history for this browser + if(!history.isEmpty() && history.last() == normalbasedir && lastbasedir!=normalbasedir ){ + //We went back one - remove this from the history + history.takeLast(); + ui->actionBack->setEnabled(!history.isEmpty()); + }else if(lastbasedir!=normalbasedir){ //not a refresh or internal snapshot change + history << normalbasedir; + ui->actionBack->setEnabled(history.length()>1); + } + //Clear the current watcher + if(!watcher->directories().isEmpty()){ watcher->removePaths(watcher->directories()); } + if(!watcher->files().isEmpty()){ watcher->removePaths(watcher->files()); } + watcher->addPath(CDIR); + ui->actionStopLoad->setVisible(true); + stopload = false; //Clear the display widget - if(showDetails){ - ui->treeWidget->clear(); - //Need to re-create the header item as well - QTreeWidgetItem *it = new QTreeWidgetItem(); - for(int t=0; t<listDetails.length(); t++){ - switch(listDetails[t]){ - case NAME: - it->setText(t,tr("Name")); - break; - case SIZE: - it->setText(t,tr("Size")); - break; - case TYPE: - it->setText(t, tr("Type")); - case DATEMOD: - it->setText(t, tr("Date Modified") ); - break; - case DATECREATE: - it->setText(t, tr("Date Created") ); - break; - } - } - ui->treeWidget->setHeaderItem(it); - }else{ ui->listWidget->clear(); } + if(showDetails){ ui->treeWidget->clear(); } + else{ ui->listWidget->clear(); } //Now fill the display widget bool hasimages, hasmultimedia; hasimages = hasmultimedia = false; for(int i=0; i<list.length(); i++){ + if(stopload){ ui->actionStopLoad->setVisible(false); return; } //stop right now hasimages = hasimages || list[i].isImage(); hasmultimedia = hasmultimedia || list[i].isAVFile(); + //watcher->addPath(list[i].absoluteFilePath()); if(showDetails){ //Now create all the individual items for the details tree QTreeWidgetItem *it = new QTreeWidgetItem(); @@ -133,8 +214,10 @@ void DirWidget::LoadDir(QString dir, QList<LFileInfo> list){ switch(listDetails[t]){ case NAME: it->setText(t,list[i].fileName()); + it->setStatusTip(t, list[i].fileName()); if(list[i].isImage()){ - it->setIcon(t, QIcon( QPixmap(list[i].absoluteFilePath()).scaledToHeight(ui->treeWidget->iconSize().height()) ) ); + if(showThumbs){ it->setIcon(t, QIcon( QPixmap(list[i].absoluteFilePath()).scaledToHeight(ui->treeWidget->iconSize().height()) ) ); } + else{ it->setIcon(t, LXDG::findIcon(list[i].iconfile(),"image-x-generic") ); } }else{ it->setIcon(t, LXDG::findIcon(list[i].iconfile(),"unknown") ); } @@ -146,6 +229,7 @@ void DirWidget::LoadDir(QString dir, QList<LFileInfo> list){ break; case TYPE: it->setText(t, list[i].mimetype()); + break; case DATEMOD: it->setText(t, list[i].lastModified().toString(Qt::DefaultLocaleShortDate) ); break; @@ -164,8 +248,10 @@ void DirWidget::LoadDir(QString dir, QList<LFileInfo> list){ QListWidgetItem *it = new QListWidgetItem(); it->setWhatsThis(list[i].fileName()); it->setText(list[i].fileName()); + it->setStatusTip(list[i].fileName()); if(list[i].isImage()){ - it->setIcon(QIcon( QPixmap(list[i].absoluteFilePath()).scaledToHeight(ui->listWidget->iconSize().height()) ) ); + if(showThumbs){ it->setIcon(QIcon( QPixmap(list[i].absoluteFilePath()).scaledToHeight(ui->treeWidget->iconSize().height()) ) ); } + else{ it->setIcon(LXDG::findIcon(list[i].iconfile(),"image-x-generic") ); } }else{ it->setIcon(LXDG::findIcon(list[i].iconfile(),"unknown") ); } @@ -177,15 +263,19 @@ void DirWidget::LoadDir(QString dir, QList<LFileInfo> list){ } QApplication::processEvents(); //keep the UI snappy while loading a directory } + ui->actionStopLoad->setVisible(false); //Another check to ensure the current item is visible if(showDetails){ if(ui->treeWidget->currentItem()!=0){ ui->treeWidget->scrollToItem(ui->treeWidget->currentItem()); } + for(int t=0; t<ui->treeWidget->columnCount(); t++){ui->treeWidget->resizeColumnToContents(t); } }else{ if(ui->listWidget->currentItem()!=0){ ui->listWidget->scrollToItem(ui->listWidget->currentItem()); } } //Now Re-enable buttons as necessary - ui->tool_goToPlayer->setVisible(hasimages); - ui->tool_goToImages->setVisible(hasmultimedia); + ui->tool_goToPlayer->setVisible(hasmultimedia); + ui->tool_goToImages->setVisible(hasimages); + if(canmodify){ ui->label_status->setText(""); } + else{ ui->label_status->setText(tr("Restricted Access")); } } void DirWidget::LoadSnaps(QString basedir, QStringList snaps){ @@ -211,6 +301,17 @@ void DirWidget::LoadSnaps(QString basedir, QStringList snaps){ } +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","")); @@ -231,6 +332,12 @@ void DirWidget::UpdateIcons(){ 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(){ @@ -252,13 +359,19 @@ void DirWidget::setupConnections(){ connect(ui->listWidget, SIGNAL(itemSelectionChanged()), this, SLOT(SelectionChanged()) ); //Activation routines - connect(ui->treeWidget, SIGNAL(itemActivated(QTreeWidgetItem*)), this, SLOT(on_tool_act_run_clicked()) ); + connect(ui->treeWidget, SIGNAL(itemActivated(QTreeWidgetItem*,int)), this, SLOT(on_tool_act_run_clicked()) ); connect(ui->listWidget, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(on_tool_act_run_clicked()) ); - connect(ui->treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*)), this, SLOT(on_tool_act_run_clicked()) ); - connect(ui->listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(on_tool_act_run_clicked()) ); + 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() ) ); + connect(refreshShort, SIGNAL(activated()), this, SLOT( refresh()) ); + //Filesystem Watcher + connect(watcher, SIGNAL(directoryChanged(const QString&)), this, SLOT(refresh()) ); + connect(watcher, SIGNAL(fileChanged(const QString&)), this, SLOT(refresh()) ); //just in case } QStringList DirWidget::currentSelection(){ @@ -352,11 +465,33 @@ void DirWidget::on_tool_act_runwith_clicked(){ // -- Bottom Action Buttons void DirWidget::on_tool_goToImages_clicked(){ - emit ViewFiles(CLIST); + 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].fileName()) ){ + list << CLIST[i]; //add to the list + } + } + if(!list.isEmpty()){ emit ViewFiles(list); } + } } void DirWidget::on_tool_goToPlayer_clicked(){ - emit PlayFiles(CLIST); + 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].fileName()) ){ + list << CLIST[i]; //add to the list + } + } + if(!list.isEmpty()){ emit PlayFiles(list); } + } } // -- Top Snapshot Buttons @@ -381,29 +516,73 @@ void DirWidget::on_slider_snap_valueChanged(int val){ if(!ui->group_snaps->isEnabled()){ return; } //internal change - do not try to change the actual info //Determine which snapshot is now selected QString dir; - qDebug() << "Changing snapshot:" << CDIR << val; + //qDebug() << "Changing snapshot:" << CDIR << val; + stopload = true; //stop any currently-loading procedures if(val >= snapshots.length() || val < 0){ //active system selected - qDebug() << " - Load Active system:" << normalbasedir; + //qDebug() << " - Load Active system:" << normalbasedir; dir = normalbasedir; }else{ dir = snapbasedir+snapshots[val]+"/"; if(snaprelpath.isEmpty()){ //Need to figure out the relative path within the snapshot snaprelpath = CDIR.section(snapbasedir.section(ZSNAPDIR,0,0), 1,1000); - qDebug() << " - new snapshot-relative path:" << snaprelpath; + //qDebug() << " - new snapshot-relative path:" << snaprelpath; } dir.append(snaprelpath); - qDebug() << " - Load Snapshot:" << dir; + dir.replace("//","/"); //just in case any duplicate slashes from all the split/combining + //qDebug() << " - Load Snapshot:" << dir; } //Make sure this directory exists, and back up as necessary + while(!QFile::exists(dir) && !dir.isEmpty()){ - dir = dir.section("/",0,-1); //back up one dir + dir = dir.section("/",0,-2); //back up one dir } if(dir.isEmpty()){ return; } //Load the newly selected snapshot emit LoadDirectory(ID, dir); } +//Top Toolbar buttons +void DirWidget::on_actionBack_triggered(){ + if(history.isEmpty()){ return; } //cannot do anything + QString dir = history.takeLast(); + if(dir == normalbasedir){ + dir = history.last(); + } + emit LoadDirectory(ID, dir); +} + +void DirWidget::on_actionUp_triggered(){ + QString dir = CDIR.section("/",0,-2); + //Quick check to ensure the directory exists + while(!QFile::exists(dir) && !dir.isEmpty()){ + dir = dir.section("/",0,-2); //back up one additional dir + } + emit LoadDirectory(ID, dir); +} + +void DirWidget::on_actionHome_triggered(){ + 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(); + //Quick check to ensure the directory exists + while(!QFile::exists(dir) && !dir.isEmpty()){ + dir = dir.section("/",0,-2); //back up one additional dir + } + 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(); diff --git a/lumina-fm/widgets/DirWidget.h b/lumina-fm/widgets/DirWidget.h index 646df309..193d1789 100644 --- a/lumina-fm/widgets/DirWidget.h +++ b/lumina-fm/widgets/DirWidget.h @@ -11,6 +11,11 @@ #include <QWidget> #include <QObject> #include <QMenu> +#include <QToolBar> +#include <QLineEdit> +#include <QShortcut> +#include <QFileSystemWatcher> + #include "../DirData.h" @@ -26,16 +31,30 @@ public: enum DETAILTYPES{ NAME, SIZE, TYPE, DATEMOD, DATECREATE}; DirWidget(QString objID, QWidget *parent = 0); //needs a unique ID (to distinguish from other DirWidgets) ~DirWidget(); - + + //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); public slots: - void LoadDir(QString dir, QList<LFileInfo> list); + 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(); @@ -47,13 +66,22 @@ public slots: private: Ui::DirWidget *ui; QString ID, CDIR; //unique ID assigned by the parent and the current dir path - QList<LFileInfo> CLIST; //current item list (snap or not) + LFileInfoList CLIST; //current item list (snap or not) QString normalbasedir, snapbasedir, snaprelpath; //for maintaining direcoty context while moving between snapshots QStringList snapshots; - bool showDetails, canmodify; //which widget to use for showing items + bool showDetails, showThumbs, canmodify, stopload; //which widget to use for showing items QList<DETAILTYPES> listDetails; QMenu *contextMenu; + //The Toolbar and associated items + QToolBar *toolbar; + QLineEdit *line_dir; + QStringList history; + //Keyboard Shortcuts + QShortcut *copyFilesShort, *cutFilesShort, *pasteFilesShort, *deleteFilesShort, *refreshShort; + //Watcher to determine when the dir changes + QFileSystemWatcher *watcher; + //Functions for internal use void setupConnections(); QStringList currentSelection(); @@ -75,6 +103,14 @@ private slots: void on_tool_snap_newer_clicked(); void on_tool_snap_older_clicked(); void on_slider_snap_valueChanged(int); + //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(); @@ -91,10 +127,11 @@ 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(QList<LFileInfo>); //open in multimedia player - void ViewFiles(QList<LFileInfo>); //open in slideshow + void PlayFiles(LFileInfoList); //open in multimedia player + void ViewFiles(LFileInfoList); //open in slideshow void LaunchTerminal(QString); //dirpath //System Interactions diff --git a/lumina-fm/widgets/DirWidget.ui b/lumina-fm/widgets/DirWidget.ui index 2be5515d..9355d21e 100644 --- a/lumina-fm/widgets/DirWidget.ui +++ b/lumina-fm/widgets/DirWidget.ui @@ -7,29 +7,155 @@ <x>0</x> <y>0</y> <width>400</width> - <height>333</height> + <height>334</height> </rect> </property> <property name="windowTitle"> <string>Form</string> </property> - <layout class="QGridLayout" name="gridLayout" columnstretch="0,1"> + <layout class="QGridLayout" name="gridLayout"> <property name="leftMargin"> - <number>1</number> + <number>0</number> </property> <property name="topMargin"> - <number>1</number> + <number>0</number> </property> <property name="rightMargin"> - <number>1</number> + <number>0</number> </property> <property name="bottomMargin"> + <number>0</number> + </property> + <property name="horizontalSpacing"> <number>1</number> </property> - <property name="spacing"> + <property name="verticalSpacing"> <number>2</number> </property> - <item row="0" column="0"> + <item row="0" column="0" rowspan="2" colspan="2"> + <layout class="QHBoxLayout" name="toolbar_layout"/> + </item> + <item row="1" column="1" rowspan="2"> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <property name="spacing"> + <number>1</number> + </property> + <item> + <widget class="QGroupBox" name="group_snaps"> + <property name="title"> + <string notr="true"/> + </property> + <property name="flat"> + <bool>true</bool> + </property> + <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="QLabel" name="label_snap"> + <property name="text"> + <string notr="true">Snap</string> + </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> + <item> + <widget class="QTreeWidget" name="treeWidget"> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::ExtendedSelection</enum> + </property> + <property name="indentation"> + <number>0</number> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + <property name="allColumnsShowFocus"> + <bool>true</bool> + </property> + <attribute name="headerMinimumSectionSize"> + <number>30</number> + </attribute> + <column> + <property name="text"> + <string notr="true">1</string> + </property> + </column> + </widget> + </item> + <item> + <widget class="QListWidget" name="listWidget"> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::ExtendedSelection</enum> + </property> + <property name="selectionBehavior"> + <enum>QAbstractItemView::SelectItems</enum> + </property> + <property name="flow"> + <enum>QListView::TopToBottom</enum> + </property> + <property name="isWrapping" stdset="0"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + <item row="2" column="0"> <widget class="QGroupBox" name="group_actions"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> @@ -269,109 +395,7 @@ </layout> </widget> </item> - <item row="0" column="1"> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <property name="spacing"> - <number>1</number> - </property> - <item> - <widget class="QGroupBox" name="group_snaps"> - <property name="title"> - <string>Snapshots Available</string> - </property> - <property name="flat"> - <bool>true</bool> - </property> - <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="QLabel" name="label_snap"> - <property name="text"> - <string notr="true">Snap</string> - </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> - <item> - <widget class="QTreeWidget" name="treeWidget"> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::ExtendedSelection</enum> - </property> - <column> - <property name="text"> - <string notr="true">1</string> - </property> - </column> - </widget> - </item> - <item> - <widget class="QListWidget" name="listWidget"> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> - </property> - <property name="selectionMode"> - <enum>QAbstractItemView::ExtendedSelection</enum> - </property> - <property name="selectionBehavior"> - <enum>QAbstractItemView::SelectItems</enum> - </property> - </widget> - </item> - </layout> - </item> - <item row="1" column="0" colspan="2"> + <item row="3" column="0" colspan="2"> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QLabel" name="label_status"> @@ -382,21 +406,109 @@ </item> <item> <widget class="QToolButton" name="tool_goToImages"> + <property name="statusTip"> + <string>Add selected images to slideshow</string> + </property> <property name="text"> - <string notr="true">img</string> + <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 notr="true">play</string> + <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> </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>Stopl 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/> diff --git a/lumina-fm/widgets/MultimediaWidget.cpp b/lumina-fm/widgets/MultimediaWidget.cpp index 9622a97b..406f9098 100644 --- a/lumina-fm/widgets/MultimediaWidget.cpp +++ b/lumina-fm/widgets/MultimediaWidget.cpp @@ -47,9 +47,12 @@ MultimediaWidget::~MultimediaWidget(){ // ================ // PUBLIC SLOTS // ================ -void MultimediaWidget::LoadMultimedia(QList<LFileInfo> list){ +void MultimediaWidget::ClearPlaylist(){ mediaObj->stop(); ui->combo_player_list->clear(); +} + +void MultimediaWidget::LoadMultimedia(QList<LFileInfo> list){ for(int i=0; i<list.length(); i++){ if(list[i].isAVFile()){ ui->combo_player_list->addItem(list[i].fileName(), list[i].absoluteFilePath() ); } } diff --git a/lumina-fm/widgets/MultimediaWidget.h b/lumina-fm/widgets/MultimediaWidget.h index 65769d77..4dc92e39 100644 --- a/lumina-fm/widgets/MultimediaWidget.h +++ b/lumina-fm/widgets/MultimediaWidget.h @@ -27,6 +27,7 @@ public: ~MultimediaWidget(); public slots: + void ClearPlaylist(); void LoadMultimedia(QList<LFileInfo> list); //Theme change functions diff --git a/lumina-fm/widgets/SlideshowWidget.cpp b/lumina-fm/widgets/SlideshowWidget.cpp index ff7113b6..a9028d2b 100644 --- a/lumina-fm/widgets/SlideshowWidget.cpp +++ b/lumina-fm/widgets/SlideshowWidget.cpp @@ -12,7 +12,7 @@ SlideshowWidget::SlideshowWidget(QWidget *parent) : QWidget(parent), ui(new Ui::SlideshowWidget){ ui->setupUi(this); //load the designer file - + zoom = 1; UpdateIcons(); UpdateText(); } @@ -24,11 +24,21 @@ SlideshowWidget::~SlideshowWidget(){ // ================ // PUBLIC SLOTS // ================ +void SlideshowWidget::ClearImages(){ + ui->combo_image_name->clear(); +} + void SlideshowWidget::LoadImages(QList<LFileInfo> list){ - ui->combo_image_name->clear(); + int cmax = ui->combo_image_name->count(); //current number of items for(int i=0; i<list.length(); i++){ if(list[i].isImage()){ ui->combo_image_name->addItem(list[i].fileName(), list[i].absoluteFilePath() ); } } + //Now automatically show the first item from the batch of new ones + if(cmax < ui->combo_image_name->count()){ ui->combo_image_name->setCurrentIndex(cmax); } +} + +void SlideshowWidget::refresh(){ + UpdateImage(); } //Theme change functions @@ -40,6 +50,8 @@ void SlideshowWidget::UpdateIcons(){ ui->tool_image_remove->setIcon( LXDG::findIcon("edit-delete","") ); ui->tool_image_rotateleft->setIcon( LXDG::findIcon("object-rotate-left","") ); ui->tool_image_rotateright->setIcon( LXDG::findIcon("object-rotate-right","") ); + ui->tool_image_zoomin->setIcon( LXDG::findIcon("zoom-in","") ); + ui->tool_image_zoomout->setIcon( LXDG::findIcon("zoom-out","") ); } void SlideshowWidget::UpdateText(){ @@ -51,15 +63,12 @@ void SlideshowWidget::UpdateText(){ // PRIVATE // ================= void SlideshowWidget::UpdateImage(){ - if( !ui->label_image->isVisible() ){ return; } //don't update if not visible - can cause strange resizing issues QString file = ui->combo_image_name->currentData().toString(); - /*if(!file.endsWith("/")){ file.append("/"); } - file.append(ui->combo_image_name->currentText());*/ - //qDebug() << "Show Image:" << file; + qDebug() << "Show Image:" << file << "Zoom:" << zoom; QPixmap pix(file); - if(pix.size().width() > ui->label_image->contentsRect().width() || pix.size().height() > ui->label_image->contentsRect().height()){ - pix = pix.scaled(ui->label_image->contentsRect().size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); - } + QSize sz = ui->scrollArea->contentsRect().size(); + if( sz.width()>pix.size().width() || sz.height()>pix.size().height()){ sz = pix.size(); } //100% size already - apply zoom after this + pix = pix.scaled(sz*zoom, Qt::KeepAspectRatio, Qt::SmoothTransformation); ui->label_image->setPixmap(pix); //Now set/load the buttons ui->tool_image_goBegin->setEnabled(ui->combo_image_name->currentIndex()>0); @@ -77,6 +86,8 @@ void SlideshowWidget::UpdateImage(){ ui->tool_image_remove->setEnabled(isUserWritable); ui->tool_image_rotateleft->setEnabled(isUserWritable && canwrite); ui->tool_image_rotateright->setEnabled(isUserWritable && canwrite); + ui->tool_image_zoomin->setEnabled(zoom<2); + ui->tool_image_zoomout->setEnabled(zoom>0.25); } @@ -84,8 +95,9 @@ void SlideshowWidget::UpdateImage(){ // PRIVATE SLOTS // ================= // Picture rotation options -void SlideshowWidget::on_combo_image_name_indexChanged(int index){ +void SlideshowWidget::on_combo_image_name_currentIndexChanged(int index){ if(index>=0 && !ui->combo_image_name->currentData().toString().isEmpty()){ + zoom = 1; //always reset the zoom level when changing images UpdateImage(); } } @@ -144,3 +156,14 @@ void SlideshowWidget::on_tool_image_rotateright_clicked(){ //Now re-load the image in the UI UpdateImage(); } + +void SlideshowWidget::on_tool_image_zoomin_clicked(){ + zoom+=0.25; //change 25% every time + UpdateImage(); +} + +void SlideshowWidget::on_tool_image_zoomout_clicked(){ + zoom-=0.25; //change 25% every time + UpdateImage(); +} + diff --git a/lumina-fm/widgets/SlideshowWidget.h b/lumina-fm/widgets/SlideshowWidget.h index bd8a671d..3b9c70fd 100644 --- a/lumina-fm/widgets/SlideshowWidget.h +++ b/lumina-fm/widgets/SlideshowWidget.h @@ -24,8 +24,11 @@ public: ~SlideshowWidget(); public slots: + void ClearImages(); void LoadImages(QList<LFileInfo> list); + void refresh(); //Note: This should be called right after the widget becomes visible + //Theme change functions void UpdateIcons(); void UpdateText(); @@ -33,10 +36,11 @@ public slots: private: Ui::SlideshowWidget *ui; void UpdateImage(); + double zoom; private slots: // Picture rotation options - void on_combo_image_name_indexChanged(int index); + void on_combo_image_name_currentIndexChanged(int index); void on_tool_image_goEnd_clicked(); void on_tool_image_goNext_clicked(); void on_tool_image_goPrev_clicked(); @@ -46,6 +50,8 @@ private slots: void on_tool_image_remove_clicked(); void on_tool_image_rotateleft_clicked(); void on_tool_image_rotateright_clicked(); + void on_tool_image_zoomin_clicked(); + void on_tool_image_zoomout_clicked(); }; #endif
\ No newline at end of file diff --git a/lumina-fm/widgets/SlideshowWidget.ui b/lumina-fm/widgets/SlideshowWidget.ui index 82e203fd..d262d5ec 100644 --- a/lumina-fm/widgets/SlideshowWidget.ui +++ b/lumina-fm/widgets/SlideshowWidget.ui @@ -65,6 +65,45 @@ </widget> </item> <item> + <widget class="Line" name="line_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_image_zoomin"> + <property name="toolTip"> + <string>Zoom in</string> + </property> + <property name="statusTip"> + <string>Zoom in</string> + </property> + <property name="text"> + <string notr="true">...</string> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_image_zoomout"> + <property name="toolTip"> + <string>Zoom out</string> + </property> + <property name="statusTip"> + <string>Zoom out</string> + </property> + <property name="text"> + <string notr="true">...</string> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> <spacer name="verticalSpacer_2"> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -80,31 +119,59 @@ </layout> </item> <item> - <widget class="QLabel" name="label_image"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="styleSheet"> - <string notr="true">QLabel{ background: grey; }</string> - </property> - <property name="frameShape"> - <enum>QFrame::StyledPanel</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <property name="text"> - <string notr="true"/> - </property> - <property name="scaledContents"> - <bool>false</bool> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> + <widget class="QScrollArea" name="scrollArea"> + <property name="widgetResizable"> + <bool>true</bool> </property> + <widget class="QWidget" name="scrollAreaWidgetContents"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>350</width> + <height>250</height> + </rect> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="label_image"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <property name="text"> + <string notr="true"/> + </property> + <property name="scaledContents"> + <bool>false</bool> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + </layout> + </widget> </widget> </item> </layout> |