aboutsummaryrefslogtreecommitdiff
path: root/lumina-fm/MainUI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lumina-fm/MainUI.cpp')
-rw-r--r--lumina-fm/MainUI.cpp1575
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
bgstack15