aboutsummaryrefslogtreecommitdiff
path: root/lumina-fm/MainUI-old.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lumina-fm/MainUI-old.cpp')
-rw-r--r--lumina-fm/MainUI-old.cpp1597
1 files changed, 1597 insertions, 0 deletions
diff --git a/lumina-fm/MainUI-old.cpp b/lumina-fm/MainUI-old.cpp
new file mode 100644
index 00000000..732554dd
--- /dev/null
+++ b/lumina-fm/MainUI-old.cpp
@@ -0,0 +1,1597 @@
+//===========================================
+// 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());
+}
bgstack15