diff options
Diffstat (limited to 'lumina-fm/MainUI.cpp')
-rw-r--r-- | lumina-fm/MainUI.cpp | 1575 |
1 files changed, 393 insertions, 1182 deletions
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 |