diff options
Diffstat (limited to 'lumina-fm')
-rw-r--r-- | lumina-fm/MainUI-old.cpp | 1597 | ||||
-rw-r--r-- | lumina-fm/MainUI-old.h | 238 | ||||
-rw-r--r-- | lumina-fm/MainUI-old.ui | 1315 | ||||
-rw-r--r-- | lumina-fm/main.cpp | 2 | ||||
-rw-r--r-- | lumina-fm/widgets/DirWidget.cpp | 22 | ||||
-rw-r--r-- | lumina-fm/widgets/DirWidget.h | 3 |
6 files changed, 3169 insertions, 8 deletions
diff --git a/lumina-fm/MainUI-old.cpp b/lumina-fm/MainUI-old.cpp new file mode 100644 index 00000000..732554dd --- /dev/null +++ b/lumina-fm/MainUI-old.cpp @@ -0,0 +1,1597 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2014, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "MainUI.h" +#include "ui_MainUI.h" + +#include <QImageWriter> +#include <QFileInfo> + +#define DEBUG 0 + +MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){ + //for Signal/slot we must register the Typedef of QFileInfoList + qRegisterMetaType<QFileInfoList>("QFileInfoList"); + ui->setupUi(this); + if(DEBUG){ qDebug() << "Initilization:"; } + //Be careful about the QSettings setup, it must match the lumina-desktop setup + QSettings::setPath(QSettings::NativeFormat, QSettings::UserScope, QDir::homePath()+"/.lumina"); + settings = new QSettings( QSettings::UserScope, "LuminaDE", "lumina-fm", this); + favdir = QDir::homePath()+"/.lumina/favorites/"; //save this for later + syncTimer = new QTimer(this); + syncTimer->setInterval(200); //1/5 second (collect as many signals/slots as necessary + syncTimer->setSingleShot(true); + //Reset the UI to the previously used size (if possible) + if(DEBUG){ qDebug() << " - Reset window size"; } + int height = settings->value("geometry/height",-1).toInt(); + if(height>100 && height <= QApplication::desktop()->availableGeometry(this).height()){ this->resize(this->width(), height); } + int width = settings->value("geometry/width",-1).toInt(); + if(width>100 && width <= QApplication::desktop()->availableGeometry(this).width()){ this->resize(width, this->height() ); } + //initialize the non-ui widgets + if(DEBUG){ qDebug() << " - Tab Bar Setup"; } + tabBar = new QTabBar(this); + tabBar->setTabsClosable(true); + tabBar->setMovable(true); //tabs are independant - so allow the user to sort them + tabBar->setShape(QTabBar::RoundedNorth); + tabBar->setFocusPolicy(Qt::NoFocus); + ui->verticalLayout_browser->insertWidget(0,tabBar); + currentDir = new QLineEdit(this); + ui->toolBar->insertWidget(ui->actionBookMark, currentDir); + currentDir->setFocusPolicy(Qt::StrongFocus); + if(DEBUG){ qDebug() << " - Threading"; } + workThread = new QThread; + workThread->setObjectName("Lumina-fm filesystem worker"); + worker = new BackgroundWorker; + worker->moveToThread(workThread); + if(DEBUG){ qDebug() << " - File System Model"; } + fsmod = new DDFileSystemModel(this); + fsmod->setRootPath("/"); + //fsmod->setReadOnly(false); //required for DnD, but also enables a lot of other stuff + //qDebug() << "DnD options:" << fsmod->supportedDropActions(); + ui->tree_dir_view->setModel(fsmod); + ui->tree_dir_view->sortByColumn(0, Qt::AscendingOrder); + ui->tree_dir_view->setColumnWidth(0,200); + ui->tree_dir_view->setColumnWidth(1,80); //size column should be small + ui->tree_dir_view->setColumnWidth(2,80); //type column should be small + ui->list_dir_view->setModel(fsmod); + dirCompleter = new QCompleter(fsmod, this); + dirCompleter->setModelSorting( QCompleter::CaseInsensitivelySortedModel ); + currentDir->setCompleter(dirCompleter); + snapmod = new QFileSystemModel(this); + ui->tree_zfs_dir->setModel(snapmod); + ui->tree_zfs_dir->sortByColumn(0, Qt::AscendingOrder); + if(DEBUG){ qDebug() << " - Icon Provider"; } + iconProv = new MimeIconProvider(); + fsmod->setIconProvider(iconProv); + snapmod->setIconProvider(iconProv); + if(DEBUG){ qDebug() << " - Context Menu"; } + contextMenu = new QMenu(this); + radio_view_details = new QRadioButton(tr("Detailed List"), this); + radio_view_list = new QRadioButton(tr("Basic List"), this); + radio_view_icons = new QRadioButton(tr("Icons"), this); + detWA = new QWidgetAction(this); + detWA->setDefaultWidget(radio_view_details); + listWA = new QWidgetAction(this); + listWA->setDefaultWidget(radio_view_list); + icoWA = new QWidgetAction(this); + icoWA->setDefaultWidget(radio_view_icons); + ui->menuView->addAction(detWA); + ui->menuView->addAction(listWA); + ui->menuView->addAction(icoWA); + //Setup the special Phonon widgets + if(DEBUG){ qDebug() << " - Multimedia Widgets"; } + mediaObj = new QMediaPlayer(this); + mediaObj->setVolume(100); + mediaObj->setNotifyInterval(500); //only every 1/2 second update + videoDisplay = new QVideoWidget(this); + videoDisplay->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + ui->videoLayout->addWidget(videoDisplay); + mediaObj->setVideoOutput(videoDisplay); + videoDisplay->setVisible(false); + playerSlider = new QSlider(this); + playerSlider->setOrientation(Qt::Horizontal); + ui->videoControlLayout->insertWidget(4, playerSlider); + ui->tool_player_stop->setEnabled(false); //nothing to stop yet + ui->tool_player_pause->setVisible(false); //nothing to pause yet + playerSlider->setEnabled(false); //nothing to seek yet + //Setup any specialty keyboard shortcuts + if(DEBUG){ qDebug() << " - Keyboard Shortcuts"; } + nextTabLShort = new QShortcut( QKeySequence(tr("Shift+Left")), this); + nextTabRShort = new QShortcut( QKeySequence(tr("Shift+Right")), this); + closeTabShort = new QShortcut( QKeySequence(tr("Ctrl+W")), this); + copyFilesShort = new QShortcut( QKeySequence(tr("Ctrl+C")), this); + pasteFilesShort = new QShortcut( QKeySequence(tr("Ctrl+V")), this); + cutFilesShort = new QShortcut( QKeySequence(tr("Ctrl+X")), this); + deleteFilesShort = new QShortcut( QKeySequence(tr("Delete")), this); + //Finish loading the interface + workThread->start(); + if(DEBUG){ qDebug() << " - Icons"; } + setupIcons(); + if(DEBUG){ qDebug() << " - Connections"; } + setupConnections(); + if(DEBUG){ qDebug() << " - Settings"; } + loadSettings(); + if(DEBUG){ qDebug() << " - Bookmarks"; } + RebuildBookmarksMenu(); + if(DEBUG){ qDebug() << " - Devices"; } + RebuildDeviceMenu(); + //Make sure we start on the browser page + if(DEBUG){ qDebug() << " - Load Browser Page"; } + goToBrowserPage(); + if(DEBUG){ qDebug() << " - Done with init"; } +} + +MainUI::~MainUI(){ + workThread->quit(); + workThread->wait(); +} + +void MainUI::OpenDirs(QStringList dirs){ + QStringList invalid; + for(int i=0; i<dirs.length(); i++){ + //Add this directory in a new tab + if(dirs[i].endsWith("/")){ dirs[i].chop(1); } + if(!QFile::exists(dirs[i])){ invalid << dirs[i]; continue; } + if(DEBUG){ qDebug() << "Open Directory:" << dirs[i]; } + int index = tabBar->addTab( dirs[i].section("/",-1) ); + tabBar->setTabWhatsThis( index, dirs[i] ); + if(index==0){ setCurrentDir(dirs[i]); }//display this as the current dir + } + tabBar->setVisible( tabBar->count() > 1 ); + if(!invalid.isEmpty()){ + QMessageBox::warning(this, tr("Invalid Directories"), tr("The following directories are invalid and could not be opened:")+"\n"+invalid.join(", ") ); + } +} + +//========== +// PRIVATE +//========== +void MainUI::setupIcons(){ + this->setWindowIcon( LXDG::findIcon("Insight-FileManager","") ); + + //Setup all the icons using libLumina + ui->actionClose->setIcon( LXDG::findIcon("application-exit","") ); + ui->actionNew_Tab->setIcon( LXDG::findIcon("tab-new-background","") ); + //ui->action_Preferences->setIcon( LXDG::findIcon("configure","") ); + ui->actionUpDir->setIcon( LXDG::findIcon("go-up","") ); + ui->actionBack->setIcon( LXDG::findIcon("go-previous","") ); + ui->actionHome->setIcon( LXDG::findIcon("go-home","") ); + ui->actionBookMark->setIcon( LXDG::findIcon("bookmarks","") ); + ui->actionBackToBrowser->setIcon( LXDG::findIcon("go-previous","") ); + ui->actionManage_Bookmarks->setIcon( LXDG::findIcon("bookmarks-organize","") ); + ui->actionScan->setIcon( LXDG::findIcon("system-search","") ); + ui->actionSearch->setIcon( LXDG::findIcon("edit-find","") ); + + //Browser page + ui->tool_addNewFile->setIcon( LXDG::findIcon("document-new","")); + ui->tool_addToDir->setIcon( LXDG::findIcon("folder-new","") ); + ui->tool_goToImages->setIcon( LXDG::findIcon("fileview-preview","") ); + ui->tool_goToPlayer->setIcon( LXDG::findIcon("applications-multimedia","") ); + ui->tool_goToRestore->setIcon( LXDG::findIcon("document-revert","") ); + ui->tool_act_run->setIcon( LXDG::findIcon("run-build-file","") ); + ui->tool_act_runwith->setIcon( LXDG::findIcon("run-build-configure","") ); + ui->tool_act_cut->setIcon( LXDG::findIcon("edit-cut","") ); + ui->tool_act_copy->setIcon( LXDG::findIcon("edit-copy","") ); + ui->tool_act_paste->setIcon( LXDG::findIcon("edit-paste","") ); + ui->tool_act_rename->setIcon( LXDG::findIcon("edit-rename","") ); + ui->tool_act_rm->setIcon( LXDG::findIcon("edit-delete","") ); + ui->tool_act_fav->setIcon( LXDG::findIcon("bookmark-toolbar","") ); + + //Multimedia Player page + ui->tool_player_next->setIcon( LXDG::findIcon("media-skip-forward","") ); + ui->tool_player_prev->setIcon( LXDG::findIcon("media-skip-backward","") ); + ui->tool_player_pause->setIcon( LXDG::findIcon("media-playback-pause","") ); + ui->tool_player_play->setIcon( LXDG::findIcon("media-playback-start","") ); + ui->tool_player_stop->setIcon( LXDG::findIcon("media-playback-stop","") ); + + //Slideshow page + ui->tool_image_goBegin->setIcon( LXDG::findIcon("go-first-view","") ); + ui->tool_image_goEnd->setIcon( LXDG::findIcon("go-last-view","") ); + ui->tool_image_goPrev->setIcon( LXDG::findIcon("go-previous-view","") ); + ui->tool_image_goNext->setIcon( LXDG::findIcon("go-next-view","") ); + ui->tool_image_remove->setIcon( LXDG::findIcon("edit-delete","") ); + ui->tool_image_rotateleft->setIcon( LXDG::findIcon("object-rotate-left","") ); + ui->tool_image_rotateright->setIcon( LXDG::findIcon("object-rotate-right","") ); + + //ZFS Restore page + ui->tool_zfs_nextSnap->setIcon( LXDG::findIcon("go-next-view","") ); + ui->tool_zfs_prevSnap->setIcon( LXDG::findIcon("go-previous-view","") ); + ui->tool_zfs_restoreItem->setIcon( LXDG::findIcon("document-revert","") ); +} + +void MainUI::setupConnections(){ + connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*, QWidget*)), this, SLOT(startEditDir(QWidget*, QWidget*)) ); + connect(tabBar, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int)) ); + connect(tabBar, SIGNAL(tabCloseRequested(int)), this, SLOT(tabClosed(int)) ); + connect(ui->menuBookmarks, SIGNAL(triggered(QAction*)), this, SLOT(goToBookmark(QAction*)) ); + connect(ui->menuExternal_Devices, SIGNAL(triggered(QAction*)), this, SLOT(goToDevice(QAction*)) ); + connect(currentDir, SIGNAL(returnPressed()), this, SLOT(goToDirectory())); + connect(radio_view_details, SIGNAL(toggled(bool)), this, SLOT(viewModeChanged(bool)) ); + connect(radio_view_list, SIGNAL(toggled(bool)), this, SLOT(viewModeChanged(bool)) ); + connect(radio_view_icons, SIGNAL(toggled(bool)), this, SLOT(viewModeChanged(bool)) ); + connect(fsmod, SIGNAL(directoryLoaded(QString)), this, SLOT(slotStartSyncTimer()) ); + connect(syncTimer, SIGNAL(timeout()), this, SLOT(currentDirectoryLoaded()) ); + //Background worker class + connect(this, SIGNAL(DirChanged(QString)), worker, SLOT(startDirChecks(QString)) ); + connect(worker, SIGNAL(ImagesAvailable(QStringList)), this, SLOT(AvailablePictures(QStringList)) ); + connect(worker, SIGNAL(MultimediaAvailable(QStringList)), this, SLOT(AvailableMultimediaFiles(QStringList)) ); + connect(worker, SIGNAL(SnapshotsAvailable(QString, QStringList)), this, SLOT(AvailableBackups(QString, QStringList)) ); + + //Background worker class for statusbar + connect(this, SIGNAL(Si_AdaptStatusBar(QFileInfoList, QString, QString, QString)), worker, SLOT(createStatusBarMsg(QFileInfoList, QString, QString, QString)) ); + connect(worker, SIGNAL(Si_DisplayStatusBar(QString)), this, SLOT(DisplayStatusBar(QString)) ); + + //Action buttons on browser page + connect(ui->tool_act_run, SIGNAL(clicked()), this, SLOT(OpenItem()) ); + connect(ui->tool_act_runwith, SIGNAL(clicked()), this, SLOT(OpenItemWith()) ); + connect(ui->tool_act_rm, SIGNAL(clicked()), this, SLOT(RemoveItem()) ); + connect(ui->tool_act_rename, SIGNAL(clicked()), this, SLOT(RenameItem()) ); + connect(ui->tool_act_paste, SIGNAL(clicked()), this, SLOT(PasteItems()) ); + connect(ui->tool_act_cut, SIGNAL(clicked()), this, SLOT(CutItems()) ); + connect(ui->tool_act_copy, SIGNAL(clicked()), this, SLOT(CopyItems()) ); + connect(ui->tool_act_fav, SIGNAL(clicked()), this, SLOT(FavoriteItem()) ); + + //Tree Widget interaction + connect(ui->tree_dir_view, SIGNAL(activated(const QModelIndex&)), this, SLOT(ItemRun(const QModelIndex&)) ); + connect(ui->list_dir_view, SIGNAL(activated(const QModelIndex&)), this, SLOT(ItemRun(const QModelIndex&)) ); + connect(ui->tree_dir_view, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(OpenContextMenu(const QPoint&)) ); + connect(ui->list_dir_view, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(OpenContextMenu(const QPoint&)) ); + connect(ui->tree_dir_view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(ItemSelectionChanged()) ); + connect(ui->list_dir_view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(ItemSelectionChanged()) ); + + //Page Switching + connect(ui->tool_goToPlayer, SIGNAL(clicked()), this, SLOT(goToMultimediaPage()) ); + connect(ui->tool_goToRestore, SIGNAL(clicked()), this, SLOT(goToRestorePage()) ); + connect(ui->tool_goToImages, SIGNAL(clicked()), this, SLOT(goToSlideshowPage()) ); + connect(ui->actionBackToBrowser, SIGNAL(triggered()), this, SLOT(goToBrowserPage()) ); + + //Slideshow page + connect(ui->combo_image_name, SIGNAL(currentIndexChanged(int)), this, SLOT(showNewPicture()) ); + connect(ui->tool_image_goBegin, SIGNAL(clicked()), this, SLOT(firstPicture()) ); + connect(ui->tool_image_goEnd, SIGNAL(clicked()), this, SLOT(lastPicture()) ); + connect(ui->tool_image_goNext, SIGNAL(clicked()), this, SLOT(nextPicture()) ); + connect(ui->tool_image_goPrev, SIGNAL(clicked()), this, SLOT(prevPicture()) ); + connect(ui->tool_image_remove, SIGNAL(clicked()), this, SLOT(removePicture()) ); + connect(ui->tool_image_rotateleft, SIGNAL(clicked()), this, SLOT(rotatePictureLeft()) ); + connect(ui->tool_image_rotateright, SIGNAL(clicked()), this, SLOT(rotatePictureRight()) ); + + //ZFS Restore page + connect(ui->slider_zfs_snapshot, SIGNAL(valueChanged(int)), this, SLOT(showSnapshot()) ); + connect(ui->tool_zfs_nextSnap, SIGNAL(clicked()), this, SLOT(nextSnapshot()) ); + connect(ui->tool_zfs_prevSnap, SIGNAL(clicked()), this, SLOT(prevSnapshot()) ); + connect(ui->tool_zfs_restoreItem, SIGNAL(clicked()), this, SLOT(restoreItems()) ); + + //Multimedia Player page + connect(ui->tool_player_next, SIGNAL(clicked()), this, SLOT(playerNext())); + connect(ui->tool_player_prev, SIGNAL(clicked()), this, SLOT(playerPrevious())); + connect(ui->tool_player_pause, SIGNAL(clicked()), this, SLOT(playerPause())); + connect(ui->tool_player_play, SIGNAL(clicked()), this, SLOT(playerStart())); + connect(ui->tool_player_stop, SIGNAL(clicked()), this, SLOT(playerStop())); + connect(ui->combo_player_list, SIGNAL(currentIndexChanged(int)), this, SLOT(playerFileChanged()) ); + connect(playerSlider, SIGNAL(sliderPressed()), this, SLOT(playerSliderHeld()) ); + connect(playerSlider, SIGNAL(sliderReleased()), this, SLOT(playerSliderChanged()) ); + connect(playerSlider, SIGNAL(valueChanged(int)), this, SLOT(playerSliderMoved(int)) ); + connect(mediaObj, SIGNAL(durationChanged(qint64)), this, SLOT(playerDurationChanged(qint64)) ); + connect(mediaObj, SIGNAL(seekableChanged(bool)), playerSlider, SLOT(setEnabled(bool)) ); + connect(mediaObj, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(playerStatusChanged(QMediaPlayer::MediaStatus)) ); + connect(mediaObj, SIGNAL(positionChanged(qint64)), this, SLOT(playerTimeChanged(qint64)) ); + connect(mediaObj, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(playerStateChanged(QMediaPlayer::State)) ); + connect(mediaObj, SIGNAL(videoAvailableChanged(bool)), this, SLOT(playerVideoAvailable(bool)) ); + connect(mediaObj, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(playerError()) ); + //Special Keyboard Shortcuts + connect(nextTabLShort, SIGNAL(activated()), this, SLOT( prevTab() ) ); + connect(nextTabRShort, SIGNAL(activated()), this, SLOT( nextTab() ) ); + connect(closeTabShort, SIGNAL(activated()), this, SLOT( tabClosed() ) ); + connect(copyFilesShort, SIGNAL(activated()), this, SLOT( CopyItems() ) ); + connect(cutFilesShort, SIGNAL(activated()), this, SLOT( CutItems() ) ); + connect(pasteFilesShort, SIGNAL(activated()), this, SLOT( PasteItems() ) ); + connect(deleteFilesShort, SIGNAL(activated()), this, SLOT( RemoveItem() ) ); +} + +void MainUI::loadSettings(){ + //Note: make sure this is run after all the UI elements are created and connected to slots + // but before the first directory gets loaded + ui->actionView_Hidden_Files->setChecked( settings->value("showhidden", false).toBool() ); + on_actionView_Hidden_Files_triggered(); //make sure to update the models too + ui->actionShow_Action_Buttons->setChecked(settings->value("showactions", true).toBool() ); + on_actionShow_Action_Buttons_triggered(); //make sure to update the UI + ui->actionShow_Thumbnails->setChecked( settings->value("showthumbnails", true).toBool() ); + iconProv->showthumbnails = ui->actionShow_Thumbnails->isChecked(); + QString view = settings->value("viewmode","details").toString(); + if(view=="icons"){ radio_view_icons->setChecked(true); } + else if(view=="list"){ radio_view_list->setChecked(true); } + else{ radio_view_details->setChecked(true); } +} + +void MainUI::RebuildBookmarksMenu(){ + //Create the bookmarks menu + ui->menuBookmarks->clear(); + ui->menuBookmarks->addAction(ui->actionManage_Bookmarks); + ui->menuBookmarks->addSeparator(); + QStringList BM = settings->value("bookmarks", QStringList()).toStringList(); + ui->menuBookmarks->clear(); + ui->menuBookmarks->addAction(ui->actionManage_Bookmarks); + ui->menuBookmarks->addSeparator(); + bool changed = false; + BM.sort(); //Sort alphabetically + for(int i=0; i<BM.length(); i++){ + if(QFile::exists(BM[i].section("::::",1,1)) ){ + QAction *act = new QAction(BM[i].section("::::",0,0),this); + act->setWhatsThis(BM[i].section("::::",1,1)); + ui->menuBookmarks->addAction(act); + }else{ + //Invalid directory - remove the bookmark + BM.removeAt(i); + i--; + changed = true; + } + } + if(changed){ settings->setValue("bookmarks",BM); } + ui->actionManage_Bookmarks->setEnabled(BM.length()>0); +} + +void MainUI::RebuildDeviceMenu(){ + //Create the External Devices Menu appropriately + ui->menuExternal_Devices->clear(); + ui->menuExternal_Devices->addAction( ui->actionScan ); + ui->menuExternal_Devices->addSeparator(); + //Scan for externally mounted devices + QStringList devs = LOS::ExternalDevicePaths(); + //Output Format: <type>::::<filesystem>::::<path> (6/24/14 - version 0.4.0 ) + // <type> = [USB, HDRIVE, SDCARD, DVD, LVM, UNKNOWN] + + //Now add them to the menu appropriately + for(int i=0; i<devs.length(); i++){ + //Skip hidden mount points (usually only for system usage - not user browsing) + QString label, path, fs; + //Format inputs as necesary + path = devs[i].section("::::",2,2); + fs = devs[i].section("::::",1,1); + if(path.endsWith("/") && path.length()>1 ){ path.chop(1); } + if(path == "/"){ label = tr("Root"); } + else{ label = path.section("/",-1).simplified(); } + if(label.startsWith(".") ){ continue; } //don't show hidden mountpoint (not usually user-browsable) + //Create entry for this device + if( !fs.simplified().isEmpty()){ + //Add filesystem type to the label + label = QString(tr("%1 (Type: %2)")).arg(label, fs); + } + QAction *act = new QAction(label,this); + act->setWhatsThis(path); //full path to mountpoint + act->setToolTip( QString(tr("Filesystem: %1")).arg( devs[i].section("::::",1,1) ) ); + //Now set the appropriate icon + QString type = devs[i].section("::::",0,0); + if(type=="USB"){ type = "drive-removable-media-usb"; } + else if(type=="HDRIVE" || type=="LVM"){ type = "drive-harddisk"; } + else if(type=="SDCARD"){ type = "media-flash-sd-mmc"; } + else if(type=="DVD"){ type = "media-optical"; } + else{ type = "drive-removable-media"; } + act->setIcon( LXDG::findIcon(type, "") ); + ui->menuExternal_Devices->addAction(act); + } +} + +bool MainUI::checkUserPerms(){ + if(!isUserWritable){ + QMessageBox::warning(this, tr("Invalid Permissions"), tr("You do not have permission to edit this directory!") ); + } + return isUserWritable; +} + +QString MainUI::msToText(qint64 ms){ + QString disp; + if(ms>3600000){ + disp.append( QString::number(ms/3600000)+":" ); + ms = ms%3600000; + } + if(ms>60000){ + disp.append( QString::number(ms/60000)+":" ); + ms = ms%60000; + }else{ + disp.append("0:"); + } + if(ms>1000){ + if(ms>=10000){ disp.append( QString::number(ms/1000) ); } + else{ disp.append( "0"+QString::number(ms/1000) ); } + }else{ + disp.append("00"); + } + return disp; +} + +QString MainUI::getCurrentDir(){ + return currentDir->whatsThis(); +} + +void MainUI::setCurrentDir(QString dir){ + if(dir.isEmpty()){ return; } + if(syncTimer->isActive()){ syncTimer->stop(); } //already loading the info + QFileInfo info(dir); + QString olddir = currentDir->whatsThis(); + if(!info.isDir() || !info.exists() ){ + qDebug() << "Invalid Directory:" << dir; + //Try to just go up the dir tree one level + dir.chop(dir.section("/",-1).length()); + if(!QFile::exists(dir)){ + //Still bad dir - try to return to previously shown dir + if(currentDir->whatsThis().isEmpty()){ return; } //nothing to return to + else{ dir = currentDir->whatsThis(); } + } + } + //qDebug() << "Show Directory:" << dir; + //qDebug() << "Dir Info:" << dir; + //qDebug() << " - RWXLOG:" << info.isReadable() << info.isWritable() << info.isExecutable() << info.isSymLink() << info.ownerId() << info.groupId(); + isUserWritable = info.isWritable(); + if(dir.endsWith("/") && dir!="/" ){ dir.chop(1); } + QString rawdir = dir; + //dir.replace(QDir::homePath()+"/", "~/"); + currentDir->setText(dir); + //Update the directory viewer and update the line edit + keepFocus = !currentDir->hasFocus(); + currentDir->setWhatsThis(dir); //save the full path internally + fsmod->setRootPath(rawdir); + if(radio_view_details->isChecked()){ + ui->tree_dir_view->setRootIndex(fsmod->index(dir)); + ui->tree_dir_view->selectionModel()->clearSelection(); + if(olddir.startsWith(rawdir)){ + ui->tree_dir_view->setCurrentIndex( fsmod->index(olddir)); + ui->tree_dir_view->scrollTo( fsmod->index(olddir), QAbstractItemView::PositionAtTop); + } + }else{ + ui->list_dir_view->setRootIndex(fsmod->index(dir)); + ui->list_dir_view->selectionModel()->clearSelection(); + if(olddir.startsWith(rawdir)){ + ui->list_dir_view->setCurrentIndex( fsmod->index(olddir)); + ui->list_dir_view->scrollTo( fsmod->index(olddir), QAbstractItemView::PositionAtTop); + } + } + //Adjust the tab data + tabBar->setTabWhatsThis( tabBar->currentIndex(), rawdir ); + if(dir!="/"){ tabBar->setTabText( tabBar->currentIndex(), dir.section("/",-1) ); } + else{ tabBar->setTabText( tabBar->currentIndex(), dir); } + QStringList history = tabBar->tabData(tabBar->currentIndex()).toStringList(); + if(history.isEmpty() || history.first()!=rawdir){ history.prepend(rawdir); history.removeAll(""); } + //qDebug() << "History:" << history; + tabBar->setTabData(tabBar->currentIndex(), history); + //Now adjust the items as necessary + if(rawdir != olddir){ + //The Filesystem model will need to load the new directory (triggering the background checks) + ui->tool_goToPlayer->setVisible(false); + ui->tool_goToRestore->setVisible(false); + ui->tool_goToImages->setVisible(false); + } + //Make sure the shortcut buttons are enabled as necessary + // If the dir is already loaded into the fsmodel cache it will not emit the directoryLoaded() signal + /*if(rawdir == olddir){ + emit DirChanged(rawdir); //This will be automatically run when a new dir is loaded + } + emit Si_AdaptStatusBar(fsmod->rootDirectory().entryInfoList(), rawdir, tr("Items"));*/ + if(isUserWritable){ ui->label_dir_stats->setText(""); } + else{ ui->label_dir_stats->setText(tr("Limited Access Directory")); + } + + ui->tool_addToDir->setVisible(isUserWritable); + ui->tool_addNewFile->setVisible(isUserWritable); + ui->actionUpDir->setEnabled(dir!="/"); + ui->actionBack->setEnabled(history.length() > 1); + ui->actionBookMark->setEnabled( rawdir!=QDir::homePath() && settings->value("bookmarks", QStringList()).toStringList().filter("::::"+rawdir).length()<1 ); + ItemSelectionChanged(); + RebuildDeviceMenu(); //keep this refreshed + +} + +QFileInfoList MainUI::getSelectedItems(){ + QFileInfoList out; + if(radio_view_details->isChecked()){ + QModelIndexList items = ui->tree_dir_view->selectionModel()->selectedIndexes(); + for(int i=0; i<items.length(); i++){ + if(!out.contains(fsmod->fileInfo(items[i]))){ + out << fsmod->fileInfo(items[i]); + } + } + }else{ + QModelIndexList items = ui->list_dir_view->selectionModel()->selectedIndexes(); + for(int i=0; i<items.length(); i++){ + if(!out.contains(fsmod->fileInfo(items[i]))){ + out << fsmod->fileInfo(items[i]); + } + } + } + return out; +} + +/*QModelIndexList MainUI::getVisibleItems(){ + QModelIndexList out; + if(radio_view_details->isChecked()){ + QModelIndex index = ui->tree_dir_view->indexAt(QPoint(0,0)); + while( index.isValid()){ + if(index.column()!=0){ + //move on - multiple index's per row when we only need one + }else if(ui->tree_dir_view->viewport()->rect().contains( ui->tree_dir_view->visualRect(index) ) ){ + //index within the viewport - add it to the list + out << index; + }else{ + break; //index not in the viewport + } + index = ui->tree_dir_view->indexBelow(index); //go to the next + if(out.contains(index)){ break; } //end of the list + } + + }else{ + QModelIndex index = ui->list_dir_view->indexAt(QPoint(0,0)); + while( index.isValid()){ + if(ui->list_dir_view->viewport()->rect().contains( ui->list_dir_view->visualRect(index) ) ){ + //index within the viewport - add it to the list + out << index; + }else{ + break; //index not in the viewport + } + index = ui->list_dir_view->indexBelow(index); //go to the next + if(out.contains(index)){ break; } //end of the list + } + + } + return out; +}*/ + +//============== +// PRIVATE SLOTS +//============== +void MainUI::slotStartSyncTimer(){ + if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } + if(syncTimer->isActive()){ syncTimer->stop(); } + syncTimer->start(); +} + +//General button check functions +void MainUI::AvailableMultimediaFiles(QStringList files){ + if(!files.isEmpty()){ + ui->combo_player_list->clear(); + ui->combo_player_list->addItems(files); + ui->tool_goToPlayer->setVisible(true); + }else{ + ui->tool_goToPlayer->setVisible(false); + } + +} + +void MainUI::AvailableBackups(QString basedir, QStringList snapdirs){ + snapmod->setRootPath(basedir); //set the base snapshot dir as the new root + snapDirs = snapdirs; + + //Now enable the button if any snapshots available + ui->tool_goToRestore->setVisible(!snapDirs.isEmpty()); +} + +void MainUI::DisplayStatusBar(QString msg){ + //qDebug() << "message to show in the status bar:" << msg; + ui->statusbar->showMessage(msg); +} + +void MainUI::AvailablePictures(QStringList pics){ + if(!pics.isEmpty()){ + QString citem = ui->combo_image_name->currentText(); + ui->combo_image_name->clear(); + ui->combo_image_name->addItems(pics); + if(pics.contains(citem)){ + ui->combo_image_name->setCurrentText(citem); + } + ui->tool_goToImages->setVisible(true); + } + +} + +//----------------------------------- +//General page switching +//----------------------------------- +void MainUI::goToMultimediaPage(){ + //Make toolbar items disappear appropriately + ui->actionBackToBrowser->setVisible(true); + ui->actionBack->setVisible(false); + ui->actionUpDir->setVisible(false); + ui->actionHome->setVisible(false); + ui->actionBookMark->setVisible(false); + currentDir->setEnabled(false); + //Disable all the UI elements specifically for the Browser side of things + ui->actionNew_Tab->setEnabled(false); + ui->menuView->setEnabled(false); + ui->menuBookmarks->setEnabled(false); + ui->menuExternal_Devices->setEnabled(false); + //Start the player on the first selected item + QFileInfoList sel = getSelectedItems(); + if(!sel.isEmpty()){ + QStringList names; + for(int i=0; i<sel.length(); i++){ names << sel[i].fileName(); } + //start the slideshow on the first selected picture + for(int i=0; i<ui->combo_player_list->count(); i++){ + if(names.contains( ui->combo_player_list->itemText(i) )){ ui->combo_player_list->setCurrentIndex(i); break; } + } + } + //Now go to the Multimedia player + ui->label_player_novideo->setText(tr("Click Play to Start")); + ui->stackedWidget->setCurrentWidget(ui->page_audioPlayer); +} + +void MainUI::goToRestorePage(){ + //Make toolbar items disappear appropriately + ui->actionBackToBrowser->setVisible(true); + ui->actionBack->setVisible(false); + ui->actionUpDir->setVisible(false); + ui->actionHome->setVisible(false); + ui->actionBookMark->setVisible(false); + currentDir->setEnabled(false); + //Disable all the UI elements specifically for the Browser side of things + ui->actionNew_Tab->setEnabled(false); + ui->menuView->setEnabled(false); + ui->menuBookmarks->setEnabled(false); + ui->menuExternal_Devices->setEnabled(false); + //Load all the info into the file restore page + ui->slider_zfs_snapshot->setRange(1,snapDirs.length()); + ui->slider_zfs_snapshot->setValue(snapDirs.length()); + //Now go to the file restore page + showSnapshot(); //Make sure it is updated for the current directory + ui->stackedWidget->setCurrentWidget(ui->page_zfs); +} + +void MainUI::goToSlideshowPage(){ + //Make toolbar items disappear appropriately + ui->actionBackToBrowser->setVisible(true); + ui->actionBack->setVisible(false); + ui->actionUpDir->setVisible(false); + ui->actionHome->setVisible(false); + ui->actionBookMark->setVisible(false); + currentDir->setEnabled(false); + //Disable all the UI elements specifically for the Browser side of things + ui->actionNew_Tab->setEnabled(false); + ui->menuView->setEnabled(false); + ui->menuBookmarks->setEnabled(false); + ui->menuExternal_Devices->setEnabled(false); + QFileInfoList sel = getSelectedItems(); + if(!sel.isEmpty()){ + QStringList names; + for(int i=0; i<sel.length(); i++){ names << sel[i].fileName(); } + //start the slideshow on the first selected picture + for(int i=0; i<ui->combo_image_name->count(); i++){ + if(names.contains( ui->combo_image_name->itemText(i) )){ ui->combo_image_name->setCurrentIndex(i); break; } + } + } + //Now go to the Slideshow player + ui->stackedWidget->setCurrentWidget(ui->page_image_view); + showNewPicture(); //make sure it is up to date with the widget size +} + +void MainUI::goToBrowserPage(){ + //Make toolbar items re-appear appropriately + ui->actionBackToBrowser->setVisible(false); + ui->actionBack->setVisible(true); + ui->actionUpDir->setVisible(true); + ui->actionHome->setVisible(true); + ui->actionBookMark->setVisible(true); + currentDir->setEnabled(true); + //Disable all the UI elements specifically for the Browser side of things + ui->actionNew_Tab->setEnabled(true); + ui->menuView->setEnabled(true); + ui->menuBookmarks->setEnabled(true); + ui->menuExternal_Devices->setEnabled(true); + //Now go to the browser + if(ui->stackedWidget->currentWidget()==ui->page_audioPlayer){ mediaObj->stop(); } + ui->stackedWidget->setCurrentWidget(ui->page_browser); + reloadDirectory(); +} + +//--------------------- +//Menu Actions +//--------------------- +void MainUI::on_actionNew_Tab_triggered(){ + OpenDirs(QStringList() << QDir::homePath()); + //Now go to that tab (always last) + tabBar->setCurrentIndex(tabBar->count()-1); +} + +void MainUI::on_actionSearch_triggered(){ + QProcess::startDetached("lumina-search -dir \""+getCurrentDir()+"\""); +} + +void MainUI::on_actionClose_triggered(){ + if(tabBar->count() > 1){ + if(QMessageBox::Yes != QMessageBox::question(this, tr("Verify Quit"), tr("You have multiple tabs open. Are you sure you want to quit?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ) ){ + return; + } + } + qDebug() << "Closing Down..."; + this->close(); +} + +void MainUI::on_actionView_Hidden_Files_triggered(){ + if(ui->actionView_Hidden_Files->isChecked()){ + fsmod->setFilter( QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Hidden ); + snapmod->setFilter( QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Hidden ); + }else{ + fsmod->setFilter( QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs ); + snapmod->setFilter( QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs ); + } + //Now save this setting for later + settings->setValue("showhidden", ui->actionView_Hidden_Files->isChecked()); + //Re-load the view widget + setCurrentDir(getCurrentDir()); +} + +void MainUI::on_actionShow_Action_Buttons_triggered(){ + ui->group_actions->setVisible(ui->actionShow_Action_Buttons->isChecked()); + settings->setValue("showactions", ui->actionShow_Action_Buttons->isChecked()); +} + +void MainUI::on_actionShow_Thumbnails_triggered(){ + //Now save this setting for later + settings->setValue("showthumbnails", ui->actionShow_Thumbnails->isChecked()); + //Set the value in the icon provider + iconProv->showthumbnails = ui->actionShow_Thumbnails->isChecked(); + //Now make sure the filesystem model knows to re-load the image data + fsmod->revert(); + //Re-load the view widget + setCurrentDir(getCurrentDir()); +} + +void MainUI::goToBookmark(QAction *act){ + if(act==ui->actionManage_Bookmarks){ + BMMDialog dlg(this); + dlg.loadSettings(settings); + dlg.exec(); + RebuildBookmarksMenu(); + }else{ + setCurrentDir(act->whatsThis()); + } +} + +void MainUI::goToDevice(QAction *act){ + if(act==ui->actionScan){ + RebuildDeviceMenu(); + }else{ + setCurrentDir(act->whatsThis()); + } +} + +void MainUI::viewModeChanged(bool active){ + if(!active){ return; } //on every view change, all 3 radio buttons will call this function - only run this once though + if(radio_view_details->isChecked()){ + ui->tree_dir_view->setVisible(true); + ui->list_dir_view->setVisible(false); + settings->setValue("viewmode","details"); + }else if(radio_view_list->isChecked()){ + ui->tree_dir_view->setVisible(false); + ui->list_dir_view->setVisible(true); + ui->list_dir_view->setViewMode( QListView::ListMode ); + ui->list_dir_view->setUniformItemSizes(false); + ui->list_dir_view->setIconSize( QSize(20,20) ); + settings->setValue("viewmode","list"); + }else{ //icons + ui->tree_dir_view->setVisible(false); + ui->list_dir_view->setVisible(true); + ui->list_dir_view->setViewMode( QListView::IconMode ); + ui->list_dir_view->setUniformItemSizes(true); + ui->list_dir_view->setIconSize( QSize(90,64) ); + settings->setValue("viewmode","icons"); + } + //Re-load the view widget + setCurrentDir(getCurrentDir()); + +} + +//----------------------- +//Toolbar Actions +//----------------------- +void MainUI::on_actionBack_triggered(){ + QStringList history = tabBar->tabData(tabBar->currentIndex()).toStringList(); + if(history.length() <= 1){ return; } //need the second item + history.removeAt(0); //remove the first item (the current dir) + tabBar->setTabData(tabBar->currentIndex(), history); //re-write the saved history + setCurrentDir(history.first()); //go to the previous entry in the history +} + +void MainUI::on_actionUpDir_triggered(){ + QString dir = getCurrentDir(); + dir.chop( dir.section("/",-1).length() ); + setCurrentDir(dir); +} + +void MainUI::on_actionHome_triggered(){ + setCurrentDir(QDir::homePath()); +} + +void MainUI::on_actionBookMark_triggered(){ + QString dir = getCurrentDir(); + bool ok = false; + QString name = QInputDialog::getText(this, tr("New Bookmark"), tr("Name:"), QLineEdit::Normal, dir, \ + &ok, 0, Qt::ImhFormattedNumbersOnly | Qt::ImhUppercaseOnly | Qt::ImhLowercaseOnly); + if(!ok || name.isEmpty()){ return; } //cancelled + QStringList BM = settings->value("bookmarks",QStringList()).toStringList(); + if(BM.filter(name+"::::").length() >0){ + QMessageBox::warning(this, tr("Invalid Name"), tr("This bookmark name already exists. Please choose another.") ); + QTimer::singleShot(0,this, SLOT(on_actionBookMark_triggered())); + return; + } + BM.append(name+"::::"+dir); + BM.sort(); //sort alphabetically by name + settings->setValue("bookmarks", BM); + //Now rebuild the bookmarks menu + RebuildBookmarksMenu(); + ui->actionBookMark->setEnabled(false); //already bookmarked +} + +//----------------------------- +//Browser Functions +//----------------------------- +void MainUI::startEditDir(QWidget *old, QWidget *now){ + if(now==currentDir){ + //The dir edit just got focus + QString dir = currentDir->text(); + dir.replace("~/", QDir::homePath()+"/"); + currentDir->setText(dir); + //Try to move to the end + currentDir->selectAll(); + }else if(old==currentDir){ + QString dir = currentDir->text(); + setCurrentDir(dir); + } +} + +void MainUI::goToDirectory(){ + QString dir = currentDir->text(); + dir.replace("~/",QDir::homePath()+"/"); + setCurrentDir(dir); +} + +void MainUI::reloadDirectory(){ + setCurrentDir( getCurrentDir() ); +} + +/*void MainUI::viewportChanged(){ + if( !ui->actionsShow_Thumbnails->isChecked()){ return; } + QModelIndexList list = getVisibleItems(); + for(int i=0; i<list.length(); i++){ + if( !ui->actionsShow_Thumbnails->isChecked()){ return; } //break out as necessary + if( imgFilter.contains("*."+fsmod->filePath(list[i]).section("/",-1).section(".",-1).toLower()){ + fmod-> + } + } +}*/ + +void MainUI::currentDirectoryLoaded(){ + //The directory was just loaded: refresh the action buttons as neccesary + // NOTE: This is only "caught" when a *new* directory is loaded into the model + ui->tool_goToPlayer->setVisible(false); + ui->tool_goToRestore->setVisible(false); + ui->tool_goToImages->setVisible(false); + emit DirChanged(getCurrentDir()); + emit Si_AdaptStatusBar(fsmod->rootDirectory().entryInfoList(), getCurrentDir(), tr("Folders"), tr("Files")); + ItemSelectionChanged(); +} + +void MainUI::on_tool_addToDir_clicked(){ + bool ok = false; + QString newdir = QInputDialog::getText(this, tr("New Directory"), tr("Name:"), QLineEdit::Normal, "", \ + &ok, 0, Qt::ImhFormattedNumbersOnly | Qt::ImhUppercaseOnly | Qt::ImhLowercaseOnly); + if(!ok || newdir.isEmpty()){ return; } + QString full = getCurrentDir(); + if(!full.endsWith("/")){ full.append("/"); } + QDir dir(full); //open the current dir + full.append(newdir); //append the new name to the current dir + //Verify that the new dir does not already exist + if(dir.exists(full)){ + QMessageBox::warning(this, tr("Invalid Name"), tr("A file or directory with that name already exists! Please pick a different name.")); + QTimer::singleShot(0,this, SLOT(on_tool_addToDir_clicked()) ); //repeat this function + }else{ + if(!dir.mkdir(newdir) ){ + QMessageBox::warning(this, tr("Error Creating Directory"), tr("The directory could not be created. Please ensure that you have the proper permissions to modify the current directory.")); + } + } +} + +void MainUI::on_tool_addNewFile_clicked(){ + bool ok = false; + QString newdocument = QInputDialog::getText(this, tr("New Document"), tr("Name:"), QLineEdit::Normal, "", \ + &ok, 0, Qt::ImhFormattedNumbersOnly | Qt::ImhUppercaseOnly | Qt::ImhLowercaseOnly); + if(!ok || newdocument.isEmpty()){ return; } + QString full = getCurrentDir(); + if(!full.endsWith("/")){ full.append("/"); } + QFile file(full+newdocument); + if(file.open(QIODevice::ReadWrite)){ + //If successfully opened, it has created a blank file + file.close(); + }else{ + QMessageBox::warning(this, tr("Error Creating Document"), tr("The document could not be created. Please ensure that you have the proper permissions.")); + } + +} + +void MainUI::tabChanged(int tab){ + //Load the directory contained in the new tab + qDebug() << "Change to Tab:" << tab << tabBar->tabText(tab); + QString dir = tabBar->tabWhatsThis(tab); //get the full directory + setCurrentDir(dir); //display this as the current dir +} + +void MainUI::tabClosed(int tab){ + if(tabBar->count()==1){ return; } //Can't close the only tab + if(tab < 0){ tab = tabBar->currentIndex(); } + //Remove the tab (will automatically move to a different one); + qDebug() << "Closing tab:" << tab << tabBar->tabText(tab); + tabBar->removeTab(tab); + tabBar->setVisible( tabBar->count() > 1 ); +} + +void MainUI::prevTab(){ + int cur = tabBar->currentIndex(); + if(cur == 0){ tabBar->setCurrentIndex( tabBar->count()-1 ); } + else{ tabBar->setCurrentIndex( cur-1 ); } +} + +void MainUI::nextTab(){ + int cur = tabBar->currentIndex(); + if(cur == (tabBar->count()-1) ){ tabBar->setCurrentIndex(0); } + else{ tabBar->setCurrentIndex( cur+1 ); } +} + +void MainUI::ItemRun(const QModelIndex &index){ + //This is called when the user double clicks a file/directory + QString val = fsmod->filePath(index).section("/",-1); + QString itemPath = getCurrentDir(); + if( !itemPath.endsWith("/")){ itemPath.append("/"); } + itemPath.append(val); + if(fsmod->isDir(index)){ + setCurrentDir( itemPath ); + }else{ + //Must be a file, try to run it + QProcess::startDetached("lumina-open \""+itemPath+"\""); + } +} + +void MainUI::OpenContextMenu(const QPoint &pt){ + QFileInfo info; + if(radio_view_details->isChecked()){ + QModelIndex it = ui->tree_dir_view->indexAt(pt); + if(!it.isValid()){ CItem.clear();} + else{ + info = fsmod->fileInfo(it); + CItem = info.absoluteFilePath(); + } + }else{ + QModelIndex it = ui->list_dir_view->indexAt(pt); + if(!it.isValid()){ CItem.clear();} + else{ + info = fsmod->fileInfo(it); + CItem = info.absoluteFilePath(); + } + } + //Create the context menu + contextMenu->clear(); + if(!CItem.isEmpty()){ + contextMenu->addAction(LXDG::findIcon("run-build-file",""), tr("Open"), this, SLOT(OpenItem()) ); + contextMenu->addAction(LXDG::findIcon("run-build-configure",""), tr("Open With..."), this, SLOT(OpenItemWith()) ); + + contextMenu->addAction(LXDG::findIcon("edit-rename",""), tr("Rename"), this, SLOT(RenameItem()) )->setEnabled(info.isWritable()); + contextMenu->addAction(LXDG::findIcon("document-encrypted",""), tr("View Checksums"), this, SLOT(ChecksumItems()) ); + contextMenu->addSeparator(); + } + bool hasSelection = !getSelectedItems().isEmpty(); + //Now add the general selection options + contextMenu->addAction(LXDG::findIcon("edit-cut",""), tr("Cut Selection"), this, SLOT(CutItems()) )->setEnabled(info.isWritable() && hasSelection); + contextMenu->addAction(LXDG::findIcon("edit-copy",""), tr("Copy Selection"), this, SLOT(CopyItems()) )->setEnabled(hasSelection); + contextMenu->addAction(LXDG::findIcon("edit-paste",""), tr("Paste"), this, SLOT(PasteItems()) )->setEnabled(QApplication::clipboard()->mimeData()->hasFormat("x-special/lumina-copied-files") && isUserWritable); + contextMenu->addSeparator(); + contextMenu->addAction(LXDG::findIcon("edit-delete",""), tr("Delete Selection"), this, SLOT(RemoveItem()) )->setEnabled(info.isWritable()&&hasSelection); + if(LUtils::isValidBinary("lumina-fileinfo")){ + contextMenu->addSeparator(); + contextMenu->addAction(LXDG::findIcon("edit-find-replace",""), tr("File Properties"), this, SLOT(ViewPropertiesItem()) )->setEnabled(hasSelection); + } + if (info.isDir() || CItem.isEmpty()) { + //in case the user click on a directory or click on the background + contextMenu->addSeparator(); + contextMenu->addAction(LXDG::findIcon("system-search",""), tr("Open Terminal here"), this, SLOT(openTerminal())); + } + //Now show the menu + if(radio_view_details->isChecked()){ + contextMenu->popup(ui->tree_dir_view->mapToGlobal(pt)); + }else{ + contextMenu->popup(ui->list_dir_view->mapToGlobal(pt)); + } +} + +void MainUI::ItemSelectionChanged(){ + //Enable/disable the action buttons + QFileInfoList sel = getSelectedItems(); + //display info related to files selected. + //TO CHECK: impact if filesystem is very slow + if(sel.size()>0){ emit Si_AdaptStatusBar(sel, "", tr("Selected Folders"), tr("Files"));} + else{ emit Si_AdaptStatusBar(fsmod->rootDirectory().entryInfoList(), getCurrentDir(), tr("Folders"), tr("Files")); } + + ui->tool_act_run->setEnabled(!sel.isEmpty()); + ui->tool_act_runwith->setEnabled(!sel.isEmpty()); + ui->tool_act_rm->setEnabled(!sel.isEmpty() && isUserWritable); + ui->tool_act_rename->setEnabled(sel.length()==1 && isUserWritable); + ui->tool_act_cut->setEnabled(!sel.isEmpty() && isUserWritable); + ui->tool_act_copy->setEnabled(!sel.isEmpty()); + ui->tool_act_paste->setEnabled(QApplication::clipboard()->mimeData()->hasFormat("x-special/lumina-copied-files") && isUserWritable); + if(ui->tool_act_paste->isEnabled()){ + ui->tool_act_paste->setToolTip( QString(tr("Currently on clipboard:\n%1")).arg( QString(QApplication::clipboard()->mimeData()->data("x-special/lumina-copied-files")).replace("::::",": ") ) ); + }else{ + ui->tool_act_paste->setToolTip(""); + } + QString itname; + if(sel.length()==1){ itname = sel[0].fileName(); } + bool ok = !itname.isEmpty() && (getCurrentDir()!=QDir::homePath()+"/Desktop"); + if(ok){ + ok = !LUtils::isFavorite(sel[0].canonicalFilePath()); + } + ui->tool_act_fav->setEnabled(ok); +} + +//------------------------------- +//Slideshow Functions +//------------------------------- +void MainUI::showNewPicture(){ + if( !ui->label_image->isVisible() ){ return; } //don't update if not visible - can cause strange resizing issues + QString file = getCurrentDir(); + if(!file.endsWith("/")){ file.append("/"); } + file.append(ui->combo_image_name->currentText()); + //qDebug() << "Show Image:" << file; + QPixmap pix(file); + if(pix.size().width() > ui->label_image->contentsRect().width() || pix.size().height() > ui->label_image->contentsRect().height()){ + pix = pix.scaled(ui->label_image->contentsRect().size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); + } + ui->label_image->setPixmap(pix); + //Now set/load the buttons + ui->tool_image_goBegin->setEnabled(ui->combo_image_name->currentIndex()>0); + ui->tool_image_goPrev->setEnabled(ui->combo_image_name->currentIndex()>0); + ui->tool_image_goEnd->setEnabled(ui->combo_image_name->currentIndex()<(ui->combo_image_name->count()-1)); + ui->tool_image_goNext->setEnabled(ui->combo_image_name->currentIndex()<(ui->combo_image_name->count()-1)); + ui->label_image_index->setText( QString::number(ui->combo_image_name->currentIndex()+1)+"/"+QString::number(ui->combo_image_name->count()) ); + static QList<QByteArray> writeableformats; + if(writeableformats.isEmpty()){ + writeableformats = QImageWriter::supportedImageFormats(); + qDebug() << "Writeable image formats:" << writeableformats; + } + bool canwrite = writeableformats.contains(file.section(".",-1).toLower().toLocal8Bit()); //compare the suffix with the list + ui->tool_image_remove->setEnabled(isUserWritable); + ui->tool_image_rotateleft->setEnabled(isUserWritable && canwrite); + ui->tool_image_rotateright->setEnabled(isUserWritable && canwrite); +} + +void MainUI::firstPicture(){ + ui->combo_image_name->setCurrentIndex(0); +} + +void MainUI::prevPicture(){ + ui->combo_image_name->setCurrentIndex( ui->combo_image_name->currentIndex()-1 ); +} + +void MainUI::nextPicture(){ + ui->combo_image_name->setCurrentIndex( ui->combo_image_name->currentIndex()+1 ); +} + +void MainUI::lastPicture(){ + ui->combo_image_name->setCurrentIndex( ui->combo_image_name->count()-1 ); +} + +void MainUI::removePicture(){ + QString file = getCurrentDir(); + if(!file.endsWith("/")){ file.append("/"); } + file.append(ui->combo_image_name->currentText()); + //Verify permanent removal of file/dir + if(QMessageBox::Yes != QMessageBox::question(this, tr("Verify Removal"), tr("WARNING: This will permanently delete the file from the system!")+"\n"+tr("Are you sure you want to continue?")+"\n\n"+file, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ){ + return; //cancelled + } + if( QFile::remove(file) ){ + int index = ui->combo_image_name->currentIndex(); + ui->combo_image_name->removeItem( index ); + } +} + +void MainUI::rotatePictureLeft(){ + //First load the file fresh (not the scaled version in the UI) + QString file = getCurrentDir(); + if(!file.endsWith("/")){ file.append("/"); } + file.append(ui->combo_image_name->currentText()); + QPixmap pix(file); + //Now rotate the image 90 degrees counter-clockwise + QTransform trans; + pix = pix.transformed( trans.rotate(-90) , Qt::SmoothTransformation); + //Now save the image back to the same file + pix.save(file); + //Now re-load the image in the UI + showNewPicture(); +} + +void MainUI::rotatePictureRight(){ + //First load the file fresh (not the scaled version in the UI) + QString file = getCurrentDir(); + if(!file.endsWith("/")){ file.append("/"); } + file.append(ui->combo_image_name->currentText()); + QPixmap pix(file); + //Now rotate the image 90 degrees counter-clockwise + QTransform trans; + pix = pix.transformed( trans.rotate(90) , Qt::SmoothTransformation); + //Now save the image back to the same file + pix.save(file); + //Now re-load the image in the UI + showNewPicture(); +} + +//---------------------------------- +//ZFS Restore Functions +//---------------------------------- +void MainUI::snapshotLoaded(){ + ui->tree_zfs_dir->resizeColumnToContents(0); +} + +void MainUI::showSnapshot(){ + ui->tool_zfs_prevSnap->setEnabled(ui->slider_zfs_snapshot->value()!=1); + ui->tool_zfs_nextSnap->setEnabled(ui->slider_zfs_snapshot->value()!=ui->slider_zfs_snapshot->maximum()); + ui->label_zfs_snap->setText( snapDirs[ui->slider_zfs_snapshot->value()-1].section("/.zfs/snapshot/",1,1).section("/",0,0) ); + //Load the dir contents + ui->tree_zfs_dir->setRootIndex(snapmod->index(snapDirs[ui->slider_zfs_snapshot->value()-1])); +} + +void MainUI::prevSnapshot(){ + ui->slider_zfs_snapshot->setValue(ui->slider_zfs_snapshot->value()-1); +} + +void MainUI::nextSnapshot(){ + ui->slider_zfs_snapshot->setValue(ui->slider_zfs_snapshot->value()+1); +} + +void MainUI::restoreItems(){ + //Get the selected items + QStringList sel; //= getSelectedItems(); + QModelIndexList items = ui->tree_zfs_dir->selectionModel()->selectedIndexes(); + for(int i=0; i<items.length(); i++){ + sel << snapmod->filePath(items[i]).section("/",-1); + } + sel.removeDuplicates(); + if(sel.isEmpty()){ return; } //nothing selected + if(!checkUserPerms()){ return; } + //Get the directories + QString snapdir = snapDirs[ui->slider_zfs_snapshot->value()-1]; + QString basedir = getCurrentDir(); + if(!basedir.endsWith("/")){ basedir.append("/"); } + if(!snapdir.endsWith("/")){ snapdir.append("/"); } + //Fill out the lists appropriately + QStringList resto; + qDebug() << "Items Selected:" << sel; + for(int i=0; i<sel.length(); i++){ + resto << basedir+sel[i]; + sel[i] = snapdir+sel[i]; + } + qDebug() << "Restore Items:" << sel << "\n" << resto; + //Restore the items + FODialog dlg(this); + dlg.setOverwrite(ui->check_zfs_overwrite->isChecked()); + dlg.RestoreFiles(sel, resto); + dlg.exec(); + if(dlg.noerrors){ + QMessageBox::information(this, tr("Success"), tr("Successfully restored selection") ); + } +} + +//---------------------------- +// Multimedia Player +//---------------------------- +void MainUI::playerStart(){ + if(ui->stackedWidget->currentWidget()!=ui->page_audioPlayer){ return; } //don't play if not in the player + + if(mediaObj->state()==QMediaPlayer::PausedState \ + && mediaObj->currentMedia().canonicalUrl().fileName()==ui->combo_player_list->currentText() ){ + mediaObj->play(); + }else{ + mediaObj->stop(); + //Get the selected file path + QString filePath = getCurrentDir(); + if(!filePath.endsWith("/")){ filePath.append("/"); } + filePath.append( ui->combo_player_list->currentText() ); + mediaObj->setMedia( QUrl::fromLocalFile(filePath) ); + playerTTime.clear(); + playerSlider->setEnabled(mediaObj->isSeekable()); + mediaObj->play(); + } +} + +void MainUI::playerError(){ + QString msg = QString(tr("Error Playing File: %1")); + msg = msg.arg( mediaObj->currentMedia().canonicalUrl().fileName() ); + msg.append("\n"+mediaObj->errorString()); + ui->label_player_novideo->setText(msg); +} + +void MainUI::playerStop(){ + mediaObj->stop(); +} + +void MainUI::playerPause(){ + mediaObj->pause(); +} + +void MainUI::playerNext(){ + ui->combo_player_list->setCurrentIndex( ui->combo_player_list->currentIndex()+1); + if(mediaObj->state()!=QMediaPlayer::StoppedState){ playerStart(); } +} + +void MainUI::playerPrevious(){ + ui->combo_player_list->setCurrentIndex( ui->combo_player_list->currentIndex()-1); + if(mediaObj->state()!=QMediaPlayer::StoppedState){ playerStart(); } +} + +void MainUI::playerFinished(){ + if(ui->combo_player_list->currentIndex()<(ui->combo_player_list->count()-1) && ui->check_player_gotonext->isChecked()){ + ui->combo_player_list->setCurrentIndex( ui->combo_player_list->currentIndex()+1 ); + QTimer::singleShot(0,this,SLOT(playerStart())); + }else{ + ui->label_player_novideo->setText(tr("Finished")); + } +} + +void MainUI::playerStatusChanged(QMediaPlayer::MediaStatus stat){ + //Only use this for end-of-file detection - use the state detection otherwise + if(stat == QMediaPlayer::EndOfMedia){ + if(!mediaObj->isMuted()){ playerFinished(); } //make sure it is not being seeked right now + } +} + +void MainUI::playerStateChanged(QMediaPlayer::State newstate){ + //This function keeps track of updating the visuals of the player + bool running = false; + bool showVideo = false; + QString msg; + switch(newstate){ + case QMediaPlayer::PlayingState: + running=true; + showVideo = mediaObj->isVideoAvailable(); + msg = "";//mediaObj->metaData(Phonon::TitleMetaData).join(" "); + if(msg.simplified().isEmpty()){ msg = ui->combo_player_list->currentText(); } + ui->label_player_novideo->setText(tr("Playing:")+"\n"+msg); + break; + case QMediaPlayer::PausedState: + showVideo=videoDisplay->isVisible(); //don't change the screen + break; + case QMediaPlayer::StoppedState: + ui->label_player_novideo->setText(tr("Stopped")); + break; + } + ui->tool_player_play->setVisible(!running); + ui->tool_player_pause->setVisible(running); + ui->tool_player_stop->setEnabled(running); + ui->label_player_novideo->setVisible(!showVideo); + videoDisplay->setVisible(showVideo); +} + +void MainUI::playerVideoAvailable(bool showVideo){ + ui->label_player_novideo->setVisible(!showVideo); + videoDisplay->setVisible(showVideo); +} + +void MainUI::playerDurationChanged(qint64 dur){ + if(dur < 0){ return; } //not ready yet + playerSlider->setMaximum(mediaObj->duration()); + playerTTime = msToText(dur); +} + +void MainUI::playerTimeChanged(qint64 ctime){ + if(mediaObj->isMuted() || playerTTime.isEmpty() ){ return; } //currently being moved + playerSlider->setSliderPosition(ctime); +} + +void MainUI::playerSliderMoved(int val){ + ui->label_player_runstats->setText( msToText(val)+"/"+playerTTime ); + if(mediaObj->isMuted()){ mediaObj->setPosition(playerSlider->value()); } //currently seeking +} + +void MainUI::playerSliderHeld(){ + mediaObj->setMuted(true); + mediaObj->pause(); +} +void MainUI::playerSliderChanged(){ + if(mediaObj->state()==QMediaPlayer::PausedState){ mediaObj->play(); } + mediaObj->setMuted(false); +} + +void MainUI::playerFileChanged(){ + ui->tool_player_next->setEnabled( ui->combo_player_list->count() > (ui->combo_player_list->currentIndex()+1) ); + ui->tool_player_prev->setEnabled( (ui->combo_player_list->currentIndex()-1) >= 0 ); +} + +//---------------------------------- +// Context Menu Actions +//---------------------------------- +void MainUI::OpenItem(){ + QFileInfoList sel = getSelectedItems(); + if(sel.isEmpty()){ return; } + + QStringList dirs; + for(int i=0; i<sel.length(); i++){ + if(sel[i].isDir()){ dirs << sel[i].absoluteFilePath(); } + else{ + qDebug() << "Opening File:" << sel[i].absoluteFilePath(); + QProcess::startDetached("lumina-open \""+sel[i].absoluteFilePath()+"\""); + } + } + if(!dirs.isEmpty()){ OpenDirs(dirs); } + CItem.clear(); +} + +void MainUI::OpenItemWith(){ + QFileInfoList sel = getSelectedItems(); + if(sel.isEmpty()){ return; } + for(int i=0; i<sel.length(); i++){ + qDebug() << "Opening File With:" << sel[i].absoluteFilePath(); + QProcess::startDetached("lumina-open -select \""+sel[i].absoluteFilePath()+"\""); + } + CItem.clear(); +} + +/*void MainUI::OpenDir(){ + if(CItem.isEmpty()){ + QFileInfoList sel = getSelectedItems(); + if(sel.isEmpty()){ return; } + else{ CItem = sel[0].absoluteFilePath(); } + } + OpenDirs(QStringList() << CItem); + CItem.clear(); +}*/ + +void MainUI::RemoveItem(){ + //Only let this run if viewing the browser page + if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } + if(!checkUserPerms()){ return; } + //Get the selected items + QStringList paths, names; + //if(CItem.isEmpty()){ + QFileInfoList sel = getSelectedItems(); + for(int i=0; i<sel.length(); i++){ + paths << sel[i].absoluteFilePath(); + names << sel[i].fileName(); + } + if(sel.isEmpty()){ return; } //nothing selected + /*}else{ + paths << CItem; + names << CItem.section("/",-1); + }*/ + //Verify permanent removal of file/dir + if(QMessageBox::Yes != QMessageBox::question(this, tr("Verify Removal"), tr("WARNING: This will permanently delete the file(s) from the system!")+"\n"+tr("Are you sure you want to continue?")+"\n\n"+names.join("\n"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ){ + return; //cancelled + } + //Now remove the file/dir + qDebug() << "Delete: "<<paths; + FODialog dlg(this); + dlg.RemoveFiles(paths); + dlg.show(); + dlg.exec(); + CItem.clear(); +} + +void MainUI::RenameItem(){ + //Only let this run if viewing the browser page + if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } + if(!checkUserPerms()){ return; } + if(CItem.isEmpty()){ + QFileInfoList sel = getSelectedItems(); + if(sel.isEmpty()){ return; } + else{ CItem = sel[0].absoluteFilePath(); } + } + QString fname = CItem; + QString path = fname; + fname = fname.section("/",-1); //turn this into just the file name + path.chop(fname.length()); //turn this into the base directory path (has a "/" at the end) + //Now prompt for the new filename + bool ok = false; + QString nname = QInputDialog::getText(this, tr("Rename File"),tr("New Name:"), QLineEdit::Normal, fname, &ok); + if(!ok || nname.isEmpty()){ CItem.clear(); return; } //cancelled + //Now check for a file extension and add it if necessary + QString oext = fname.section(".",-1); + if("."+oext == fname){ oext.clear(); } //hidden file without an extension + else if(oext==fname){ oext.clear(); } //no extension + QString next = nname.section(".",-1); + if(next==nname){ next.clear(); } //no extension + if(next.isEmpty() && !oext.isEmpty()){ + nname.append( "."+oext ); + } + //Check if this filename already exists + bool overwrite = QFile::exists(path+nname); + if(overwrite){ + if(QMessageBox::Yes != QMessageBox::question(this, tr("Overwrite File?"), tr("An existing file with the same name will be replaced. Are you sure you want to proceed?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ){ + CItem.clear(); return; //cancelled + } + } + //Now perform the move + qDebug() << "Rename:" << path+fname << "->" << path+nname; + FODialog dlg(this); + dlg.setOverwrite(overwrite); + dlg.MoveFiles(QStringList() << path+fname, QStringList() << path+nname); + dlg.show(); + dlg.exec(); + CItem.clear(); + + ItemSelectionChanged(); +} + +void MainUI::FavoriteItem(){ + if(CItem.isEmpty()){ + QFileInfoList sel = getSelectedItems(); + if(sel.isEmpty()){ return; } + else{ CItem = sel[0].canonicalFilePath(); } + } + //QString fname = CItem; + QString fullpath = CItem; + /*fname = fname.section("/",-1); //turn this into just the file name + if(QFile::exists(favdir+fname)){ QFile::remove(favdir+fname); } //remove the stale link + QFile::link(fullpath, favdir+fname);*/ + LUtils::addFavorite(fullpath); + CItem.clear(); + ItemSelectionChanged(); +} + +void MainUI::ViewPropertiesItem(){ + QFileInfoList sel = getSelectedItems(); + if(sel.isEmpty()){ return; } + for(int i=0; i<sel.length(); i++){ + QProcess::startDetached("lumina-fileinfo \""+sel[i].absoluteFilePath()+"\""); + } +} + +void MainUI::openTerminal(){ + QFileInfoList sel = getSelectedItems(); + QString shell; + //we get the shell has defined in the environment + if (getenv("SHELL")) shell = QString(getenv("SHELL")); + else shell = QString("/bin/sh"); + //we use the application defined as thate default terminal + QSettings *sessionsettings = new QSettings( QSettings::UserScope, "LuminaDE","sessionsettings", this); + //xterm remains the default + QString defTerminal = sessionsettings->value("default-terminal", "xterm").toString(); + if(defTerminal.endsWith(".desktop")){ + //Pull the binary name out of the shortcut + bool ok = false; + XDGDesktop DF = LXDG::loadDesktopFile(defTerminal,ok); + if(!ok){ defTerminal = "xterm"; } + else{ defTerminal = DF.exec.section(" ",0,0); } //only take the binary name - not any other flags + } + if( !LUtils::isValidBinary(defTerminal) ){ + //The binary does not exist or is invalid + defTerminal = "xterm"; + } + if(sel.isEmpty()){ + //-e is the parameter for most of the terminal appliction to execute an external command. + //In your case we start a shell in the selected directory + QProcess::startDetached(defTerminal + " -e \"cd " + getCurrentDir() + " && " + shell + " \" "); + } else { + QProcess::startDetached(defTerminal + " -e \"cd " + sel[0].absoluteFilePath() + " && " + shell + " \" "); + } +} + + +void MainUI::CutItems(){ + //Only let this run if viewing the browser page + if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } + if(!checkUserPerms()){ return; } + //Get all the selected Items + QFileInfoList sel = getSelectedItems(); + QStringList items; + if(sel.isEmpty()){ return; } //nothing selected + //Format the data string + for(int i=0; i<sel.length(); i++){ + items << "cut::::"+sel[i].absoluteFilePath(); + //sel[i] = sel[i].prepend("cut::::"); + } + + //Now save that data to the global clipboard + QMimeData *dat = new QMimeData; + dat->clear(); + dat->setData("x-special/lumina-copied-files", items.join("\n").toLocal8Bit()); + QApplication::clipboard()->clear(); + QApplication::clipboard()->setMimeData(dat); + ItemSelectionChanged(); +} + +void MainUI::CopyItems(){ + //Only let this run if viewing the browser page + if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } + //Get all the selected Items + QFileInfoList sel = getSelectedItems(); + QStringList items; + if(sel.isEmpty()){ return; } //nothing selected + //Format the data string + for(int i=0; i<sel.length(); i++){ + items << "copy::::"+sel[i].absoluteFilePath(); + //sel[i] = sel[i].prepend("copy::::"); + } + //Now save that data to the global clipboard + QMimeData *dat = new QMimeData; + dat->clear(); + dat->setData("x-special/lumina-copied-files", items.join("\n").toLocal8Bit()); + QApplication::clipboard()->clear(); + QApplication::clipboard()->setMimeData(dat); + ItemSelectionChanged(); +} + +void MainUI::PasteItems(){ + //Only let this run if viewing the browser page + if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } + const QMimeData *dat = QApplication::clipboard()->mimeData(); + if(!dat->hasFormat("x-special/lumina-copied-files")){ return; } //nothing to paste + if(!checkUserPerms()){ return; } + QStringList cut, copy, newcut, newcopy; + QStringList raw = QString(dat->data("x-special/lumina-copied-files")).split("\n"); + QString base = getCurrentDir(); + if(!base.endsWith("/")){ base.append("/"); } + for(int i=0; i<raw.length(); i++){ + if(raw[i].startsWith("cut::::")){ + cut << raw[i].section("::::",1,50); + newcut << base+raw[i].section("::::",1,50).section("/",-1); + } + else if(raw[i].startsWith("copy::::")){ + copy << raw[i].section("::::",1,50); + newcopy<< base+raw[i].section("::::",1,50).section("/",-1); + } + } + bool errs = false; + //Perform the copy/move operations + if(!copy.isEmpty()){ + qDebug() << "Paste Copy:" << copy << "->" << newcopy; + FODialog dlg(this); + dlg.CopyFiles(copy, newcopy); + dlg.show(); + dlg.exec(); + errs = errs || !dlg.noerrors; + } + if(!cut.isEmpty()){ + qDebug() << "Paste Cut:" << cut << "->" << newcut; + FODialog dlg(this); + dlg.MoveFiles(cut, newcut); + dlg.show(); + dlg.exec(); + errs = errs || !dlg.noerrors; + } + //Modify the clipboard appropriately + if(!errs && !cut.isEmpty()){ + //Now clear the clipboard since those old file locations are now invalid + QApplication::clipboard()->clear(); + if(!copy.isEmpty()){ + //There were also files copied: save those files back into the clipboard + QMimeData *dat = new QMimeData; + dat->clear(); + dat->setData("x-special/lumina-copied-files", raw.filter("copy::::").join("\n").toLocal8Bit()); + QApplication::clipboard()->setMimeData(dat); + } + } + ItemSelectionChanged(); +} + +void MainUI::ChecksumItems(){ + if(ui->stackedWidget->currentWidget()!=ui->page_browser){ return; } + QFileInfoList sel = getSelectedItems(); + if(sel.isEmpty()){ return; } + QStringList info, files; + for(int i=0; i<sel.length(); i++){ + files << sel[i].absoluteFilePath(); + } + qDebug() << "Run Checksums:" << files; + info = LOS::Checksums(files); + qDebug() << " - Info:" << info; + if(info.isEmpty() || (info.length() != files.length()) ){ return; } + for(int i=0; i<info.length(); i++){ + info[i] = QString("%2 \t(%1)").arg(files[i].section("/",-1), info[i]); + } + /*QMessageBox dlg(this); + dlg.setWindowFlags( Qt::Dialog ); + dlg.setWindowTitle( tr("File Checksums") ); + dlg.setDetailedText(info.join("\n")); + dlg.exec();*/ + QMessageBox::information(this, tr("File Checksums"), info.join("\n") ); +} + +void MainUI::resizeEvent(QResizeEvent *event){ + //Save the new size internally + settings->setValue("geometry/height", event->size().height()); + settings->setValue("geometry/width", event->size().width()); +} diff --git a/lumina-fm/MainUI-old.h b/lumina-fm/MainUI-old.h new file mode 100644 index 00000000..cf9669b1 --- /dev/null +++ b/lumina-fm/MainUI-old.h @@ -0,0 +1,238 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2014, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +// This is the main interface for the Lumina File Manager (Insight) +//=========================================== +#ifndef _LUMINA_FILE_MANAGER_UI_H +#define _LUMINA_FILE_MANAGER_UI_H +// Qt includes +#include <QMainWindow> +#include <QTabBar> +#include <QLineEdit> +#include <QFileSystemModel> +#include <QStringList> +#include <QDebug> +#include <QAction> +#include <QProcess> +#include <QSettings> +#include <QInputDialog> +#include <QMessageBox> +#include <QDir> +#include <QTimer> +#include <QDateTime> +#include <QShortcut> +#include <QCompleter> +#include <QClipboard> +#include <QMimeData> +#include <QTreeWidgetItem> +#include <QListWidgetItem> +#include <QRadioButton> +#include <QWidgetAction> +#include <QImageReader> +#include <QScrollBar> +#include <QFileDialog> +#include <QResizeEvent> +#include <QDesktopWidget> +#include <QThread> +#include <QUrl> +#include <QThread> + +//Multimedia Widgets +#include <QVideoWidget> +#include <QMediaPlayer> + +// libLumina includes +#include <LuminaXDG.h> +#include <LuminaOS.h> + +// Local includes +#include "FODialog.h" //file operation dialog +#include "BMMDialog.h" //bookmark manager dialog +#include "MimeIconProvider.h" //icon provider for the view widgets +#include "BackgroundWorker.h" +#include "DDFileSystemModel.h" + +namespace Ui{ + class MainUI; +}; + +class MainUI : public QMainWindow{ + Q_OBJECT +public: + MainUI(); + ~MainUI(); + + void OpenDirs(QStringList); //called from the main.cpp after initialization + +public slots: + void setupIcons(); //used during initialization + +private: + Ui::MainUI *ui; + QThread *workThread; + BackgroundWorker *worker; + //Internal non-ui widgets + QTabBar *tabBar; + QLineEdit *currentDir; + DDFileSystemModel *fsmod; + QFileSystemModel *snapmod; + //QFileSystemWatcher *fswatcher; + MimeIconProvider *iconProv; + QMenu *contextMenu; + QRadioButton *radio_view_details, *radio_view_list, *radio_view_icons; + QWidgetAction *detWA, *listWA, *icoWA; + QString favdir; + + //Phonon Widgets for the multimedia player + QMediaPlayer *mediaObj; + QVideoWidget *videoDisplay; + QSlider *playerSlider; + QString playerTTime; //total time - to prevent recalculation every tick + + //Internal variables + QStringList snapDirs; //internal saved variable for the discovered zfs snapshot dirs + QString CItem; //the item that was right-clicked (for the context menu) + //QStringList imgFilter, multiFilter; //image/multimedia filters + QSettings *settings; + QShortcut *nextTabLShort, *nextTabRShort, *closeTabShort, *copyFilesShort, *cutFilesShort, *pasteFilesShort, *deleteFilesShort; + QCompleter *dirCompleter; + bool isUserWritable, keepFocus; + QTimer *syncTimer; + + //Simplification Functions + void setupConnections(); //used during initialization + void loadSettings(); //used during initialization + + void RebuildBookmarksMenu(); + void RebuildDeviceMenu(); + + bool checkUserPerms(); + QString msToText(qint64 ms); + + //Common functions for browser info/usage + QString getCurrentDir(); + void setCurrentDir(QString); + QFileInfoList getSelectedItems(); + //QModelIndexList getVisibleItems(); + +private slots: + void slotSingleInstance(QStringList in){ + this->show(); + this->raise(); + this->OpenDirs(in); + } + + void slotStartSyncTimer(); + + //General button check functions (started in a seperate thread!) + void AvailableMultimediaFiles(QStringList files); + void AvailableBackups(QString basedir, QStringList snapdirs); + void AvailablePictures(QStringList files); + + //General page switching + void goToMultimediaPage(); + void goToRestorePage(); + void goToSlideshowPage(); + void goToBrowserPage(); + + //Menu Actions + void on_actionNew_Tab_triggered(); + void on_actionSearch_triggered(); + void on_actionClose_triggered(); + void on_actionView_Hidden_Files_triggered(); + void on_actionShow_Action_Buttons_triggered(); + void on_actionShow_Thumbnails_triggered(); + void goToBookmark(QAction*); + void goToDevice(QAction*); + void viewModeChanged(bool); + + //Toolbar Actions + void on_actionBack_triggered(); + void on_actionUpDir_triggered(); + void on_actionHome_triggered(); + void on_actionBookMark_triggered(); + + //Browser Functions + void startEditDir(QWidget *old, QWidget *now); + void goToDirectory(); //go to a manually typed in directory + void reloadDirectory(); //Update the widget with the dir contents + void currentDirectoryLoaded(); //The file system model re-loaded the directory + void on_tool_addToDir_clicked(); + void on_tool_addNewFile_clicked(); + void tabChanged(int tab); + void tabClosed(int tab = -1); + void prevTab(); + void nextTab(); + void ItemRun( const QModelIndex&); + //void ItemRun(QTreeWidgetItem *item); + //void ItemRun(QListWidgetItem *item); + void OpenContextMenu(const QPoint&); + void ItemSelectionChanged(); + + //Slideshow Functions + void showNewPicture(); + void firstPicture(); + void prevPicture(); + void nextPicture(); + void lastPicture(); + void removePicture(); + void rotatePictureLeft(); + void rotatePictureRight(); + + //ZFS Restore Functions + void snapshotLoaded(); + void showSnapshot(); + void nextSnapshot(); + void prevSnapshot(); + void restoreItems(); + + //Multimedia Player Functions + void playerStart(); + void playerError(); + void playerStop(); + void playerPause(); + void playerNext(); + void playerPrevious(); + void playerFinished(); //automatically called by the media object + void playerStatusChanged(QMediaPlayer::MediaStatus stat); //automatically called + void playerStateChanged(QMediaPlayer::State newstate); //automatically called by the media object + void playerVideoAvailable(bool showVideo); //automatically called by the media object + void playerDurationChanged(qint64); + void playerTimeChanged(qint64 ctime); //automatically called by the media object + void playerSliderMoved(int); + void playerSliderHeld(); + void playerSliderChanged(); + void playerFileChanged(); + + //Context Menu Actions + void OpenItem(); //run "lumina-open" on it + void OpenItemWith(); //run "lumina-open -select" on it + //void OpenDir(); //open the dir in a new tab + void RemoveItem(); //Remove the item permanently + // - single item actions + void RenameItem(); + void FavoriteItem(); + // - full selection actions + void ViewPropertiesItem(); + void openTerminal(); + void CutItems(); + void CopyItems(); + void PasteItems(); + void ChecksumItems(); + + //file info in status bar + void DisplayStatusBar(QString); + +signals: + void DirChanged(QString path); + void Si_AdaptStatusBar(QFileInfoList fileList, QString path, QString messageFolders, QString messageFiles); + +protected: + void resizeEvent(QResizeEvent*); + +}; + +#endif diff --git a/lumina-fm/MainUI-old.ui b/lumina-fm/MainUI-old.ui new file mode 100644 index 00000000..a978e871 --- /dev/null +++ b/lumina-fm/MainUI-old.ui @@ -0,0 +1,1315 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>MainUI</class> + <widget class="QMainWindow" name="MainUI"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>567</width> + <height>415</height> + </rect> + </property> + <property name="windowTitle"> + <string>Insight</string> + </property> + <widget class="QWidget" name="centralwidget"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <property name="leftMargin"> + <number>1</number> + </property> + <property name="topMargin"> + <number>1</number> + </property> + <property name="rightMargin"> + <number>1</number> + </property> + <property name="bottomMargin"> + <number>1</number> + </property> + <item> + <widget class="QStackedWidget" name="stackedWidget"> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="page_browser"> + <layout class="QGridLayout" name="gridLayout"> + <property name="leftMargin"> + <number>1</number> + </property> + <property name="topMargin"> + <number>2</number> + </property> + <property name="rightMargin"> + <number>2</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <property name="spacing"> + <number>1</number> + </property> + <item row="0" column="1"> + <layout class="QVBoxLayout" name="verticalLayout_browser"> + <property name="spacing"> + <number>0</number> + </property> + <item> + <widget class="QListView" name="list_dir_view"> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> + <property name="showDropIndicator" stdset="0"> + <bool>true</bool> + </property> + <property name="dragEnabled"> + <bool>true</bool> + </property> + <property name="dragDropMode"> + <enum>QAbstractItemView::InternalMove</enum> + </property> + <property name="defaultDropAction"> + <enum>Qt::MoveAction</enum> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::ExtendedSelection</enum> + </property> + <property name="textElideMode"> + <enum>Qt::ElideRight</enum> + </property> + <property name="isWrapping" stdset="0"> + <bool>true</bool> + </property> + <property name="resizeMode"> + <enum>QListView::Adjust</enum> + </property> + <property name="layoutMode"> + <enum>QListView::SinglePass</enum> + </property> + <property name="spacing"> + <number>1</number> + </property> + <property name="uniformItemSizes"> + <bool>false</bool> + </property> + <property name="batchSize"> + <number>10</number> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + <property name="selectionRectVisible"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QTreeView" name="tree_dir_view"> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Sunken</enum> + </property> + <property name="showDropIndicator" stdset="0"> + <bool>true</bool> + </property> + <property name="dragEnabled"> + <bool>true</bool> + </property> + <property name="dragDropMode"> + <enum>QAbstractItemView::InternalMove</enum> + </property> + <property name="defaultDropAction"> + <enum>Qt::MoveAction</enum> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::ExtendedSelection</enum> + </property> + <property name="indentation"> + <number>0</number> + </property> + <property name="rootIsDecorated"> + <bool>false</bool> + </property> + <property name="uniformRowHeights"> + <bool>true</bool> + </property> + <property name="itemsExpandable"> + <bool>false</bool> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + <property name="expandsOnDoubleClick"> + <bool>false</bool> + </property> + <attribute name="headerCascadingSectionResizes"> + <bool>true</bool> + </attribute> + <attribute name="headerMinimumSectionSize"> + <number>30</number> + </attribute> + <attribute name="headerStretchLastSection"> + <bool>true</bool> + </attribute> + </widget> + </item> + </layout> + </item> + <item row="0" column="0"> + <widget class="QGroupBox" name="group_actions"> + <property name="title"> + <string/> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QToolButton" name="tool_act_run"> + <property name="toolTip"> + <string>Open item</string> + </property> + <property name="statusTip"> + <string>Open item</string> + </property> + <property name="text"> + <string notr="true"/> + </property> + <property name="iconSize"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + <property name="toolButtonStyle"> + <enum>Qt::ToolButtonIconOnly</enum> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_act_runwith"> + <property name="toolTip"> + <string>Open item (select application)</string> + </property> + <property name="statusTip"> + <string>Open item (select application)</string> + </property> + <property name="text"> + <string notr="true"/> + </property> + <property name="iconSize"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line_5"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_act_fav"> + <property name="toolTip"> + <string>Add item to personal favorites</string> + </property> + <property name="statusTip"> + <string>Add item to personal favorites</string> + </property> + <property name="text"> + <string notr="true"/> + </property> + <property name="iconSize"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_act_rename"> + <property name="toolTip"> + <string>Rename item</string> + </property> + <property name="statusTip"> + <string>Rename item</string> + </property> + <property name="text"> + <string notr="true"/> + </property> + <property name="iconSize"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line_7"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_act_cut"> + <property name="toolTip"> + <string>Cut items</string> + </property> + <property name="statusTip"> + <string>Cut items (add to the clipboard)</string> + </property> + <property name="text"> + <string notr="true"/> + </property> + <property name="iconSize"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_act_copy"> + <property name="toolTip"> + <string>Copy items</string> + </property> + <property name="statusTip"> + <string>Copy items to the clipboard</string> + </property> + <property name="text"> + <string/> + </property> + <property name="iconSize"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_act_paste"> + <property name="toolTip"> + <string>Paste items from clipboard</string> + </property> + <property name="statusTip"> + <string>Paste items from clipboard</string> + </property> + <property name="text"> + <string notr="true"/> + </property> + <property name="iconSize"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line_6"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_act_rm"> + <property name="toolTip"> + <string>Delete Items</string> + </property> + <property name="statusTip"> + <string>Delete Items</string> + </property> + <property name="text"> + <string/> + </property> + <property name="iconSize"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + <item row="1" column="0" colspan="2"> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <property name="spacing"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="label_dir_stats"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string notr="true"/> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_addNewFile"> + <property name="statusTip"> + <string>Create a new file</string> + </property> + <property name="text"> + <string>New &file</string> + </property> + <property name="popupMode"> + <enum>QToolButton::InstantPopup</enum> + </property> + <property name="toolButtonStyle"> + <enum>Qt::ToolButtonTextBesideIcon</enum> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_addToDir"> + <property name="focusPolicy"> + <enum>Qt::NoFocus</enum> + </property> + <property name="statusTip"> + <string>Create a new subdirectory</string> + </property> + <property name="text"> + <string notr="true">&New Dir</string> + </property> + <property name="shortcut"> + <string>Ctrl+N</string> + </property> + <property name="popupMode"> + <enum>QToolButton::InstantPopup</enum> + </property> + <property name="toolButtonStyle"> + <enum>Qt::ToolButtonTextBesideIcon</enum> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_goToPlayer"> + <property name="focusPolicy"> + <enum>Qt::NoFocus</enum> + </property> + <property name="toolTip"> + <string>Open Multimedia Player</string> + </property> + <property name="statusTip"> + <string>Play any multimedia files in this directory</string> + </property> + <property name="text"> + <string>&Play</string> + </property> + <property name="shortcut"> + <string>Ctrl+P, Ctrl+S</string> + </property> + <property name="toolButtonStyle"> + <enum>Qt::ToolButtonTextBesideIcon</enum> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_goToImages"> + <property name="focusPolicy"> + <enum>Qt::NoFocus</enum> + </property> + <property name="toolTip"> + <string>View Slideshow</string> + </property> + <property name="statusTip"> + <string>View all the images in this directory as a slideshow</string> + </property> + <property name="text"> + <string>&Slideshow</string> + </property> + <property name="shortcut"> + <string>Ctrl+S</string> + </property> + <property name="toolButtonStyle"> + <enum>Qt::ToolButtonTextBesideIcon</enum> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_goToRestore"> + <property name="focusPolicy"> + <enum>Qt::NoFocus</enum> + </property> + <property name="toolTip"> + <string>Restore File(s)</string> + </property> + <property name="statusTip"> + <string>Restore old versions of files or directories</string> + </property> + <property name="text"> + <string>&Backups</string> + </property> + <property name="shortcut"> + <string>Ctrl+B</string> + </property> + <property name="toolButtonStyle"> + <enum>Qt::ToolButtonTextBesideIcon</enum> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QWidget" name="page_audioPlayer"> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QCheckBox" name="check_player_gotonext"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Go To Next</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line_3"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>30</width> + <height>0</height> + </size> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_player_prev"> + <property name="text"> + <string notr="true">prev</string> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="combo_player_list"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_player_next"> + <property name="text"> + <string notr="true">next</string> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="videoLayout"> + <item> + <widget class="QLabel" name="label_player_novideo"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <pointsize>13</pointsize> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="styleSheet"> + <string notr="true">background: black; color: white;</string> + </property> + <property name="text"> + <string>(No Running Video)</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="videoControlLayout"> + <item> + <widget class="QToolButton" name="tool_player_play"> + <property name="text"> + <string notr="true">play</string> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_player_pause"> + <property name="text"> + <string notr="true">pause</string> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_player_stop"> + <property name="text"> + <string notr="true">stop</string> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line_4"> + <property name="minimumSize"> + <size> + <width>30</width> + <height>0</height> + </size> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_player_runstats"> + <property name="text"> + <string notr="true">?/?</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QWidget" name="page_image_view"> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_5"> + <item> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> + <widget class="QToolButton" name="tool_image_remove"> + <property name="toolTip"> + <string>Delete this image file</string> + </property> + <property name="text"> + <string notr="true">...</string> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line_8"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_image_rotateleft"> + <property name="toolTip"> + <string>Rotate this image file counter-clockwise</string> + </property> + <property name="text"> + <string notr="true">...</string> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_image_rotateright"> + <property name="toolTip"> + <string>Rotate this image file clockwise</string> + </property> + <property name="text"> + <string notr="true">...</string> + </property> + <property name="autoRaise"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <widget class="QLabel" name="label_image"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="styleSheet"> + <string notr="true">QLabel{ background: grey; }</string> + </property> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <property name="text"> + <string notr="true"/> + </property> + <property name="scaledContents"> + <bool>false</bool> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QToolButton" name="tool_image_goBegin"> + <property name="focusPolicy"> + <enum>Qt::NoFocus</enum> + </property> + <property name="toolTip"> + <string>Go to Beginning</string> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="shortcut"> + <string>Shift+Left</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_image_goPrev"> + <property name="focusPolicy"> + <enum>Qt::NoFocus</enum> + </property> + <property name="toolTip"> + <string>Go to Previous</string> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="shortcut"> + <string>Left</string> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="combo_image_name"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="focusPolicy"> + <enum>Qt::StrongFocus</enum> + </property> + <property name="frame"> + <bool>true</bool> + </property> + <item> + <property name="text"> + <string>File Name</string> + </property> + </item> + </widget> + </item> + <item> + <widget class="QLabel" name="label_image_index"> + <property name="text"> + <string notr="true">1/10</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_image_goNext"> + <property name="focusPolicy"> + <enum>Qt::NoFocus</enum> + </property> + <property name="toolTip"> + <string>Go to Next</string> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="shortcut"> + <string>Right</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="tool_image_goEnd"> + <property name="focusPolicy"> + <enum>Qt::NoFocus</enum> + </property> + <property name="toolTip"> + <string>Go to End</string> + </property> + <property name="text"> + <string>...</string> + </property> + <property name="shortcut"> + <string>Shift+Right</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QWidget" name="page_zfs"> + <layout class="QVBoxLayout" name="verticalLayout_6"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_7"> + <item> + <widget class="QToolButton" name="tool_zfs_prevSnap"> + <property name="focusPolicy"> + <enum>Qt::NoFocus</enum> + </property> + <property name="text"> + <string>Older</string> + </property> + <property name="shortcut"> + <string>Left</string> + </property> + <property name="toolButtonStyle"> + <enum>Qt::ToolButtonTextUnderIcon</enum> + </property> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout_5"> + <item> + <widget class="QSlider" name="slider_zfs_snapshot"> + <property name="focusPolicy"> + <enum>Qt::NoFocus</enum> + </property> + <property name="maximum"> + <number>20</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="tickPosition"> + <enum>QSlider::TicksAbove</enum> + </property> + <property name="tickInterval"> + <number>1</number> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_zfs_snap"> + <property name="text"> + <string notr="true">Snapshot</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QToolButton" name="tool_zfs_nextSnap"> + <property name="focusPolicy"> + <enum>Qt::NoFocus</enum> + </property> + <property name="text"> + <string>Newer</string> + </property> + <property name="shortcut"> + <string>Right</string> + </property> + <property name="toolButtonStyle"> + <enum>Qt::ToolButtonTextUnderIcon</enum> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QTreeView" name="tree_zfs_dir"> + <property name="focusPolicy"> + <enum>Qt::StrongFocus</enum> + </property> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::ExtendedSelection</enum> + </property> + <property name="selectionBehavior"> + <enum>QAbstractItemView::SelectRows</enum> + </property> + <property name="rootIsDecorated"> + <bool>false</bool> + </property> + <property name="itemsExpandable"> + <bool>false</bool> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + <property name="expandsOnDoubleClick"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_8"> + <item> + <widget class="QToolButton" name="tool_zfs_restoreItem"> + <property name="toolTip"> + <string>Restore Selected Item</string> + </property> + <property name="text"> + <string>&Restore Selection</string> + </property> + <property name="shortcut"> + <string>Ctrl+R</string> + </property> + <property name="toolButtonStyle"> + <enum>Qt::ToolButtonTextBesideIcon</enum> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="check_zfs_overwrite"> + <property name="text"> + <string>&Overwrite Existing Files</string> + </property> + <property name="shortcut"> + <string>Ctrl+O</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </widget> + </item> + </layout> + </widget> + <widget class="QMenuBar" name="menubar"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>567</width> + <height>20</height> + </rect> + </property> + <widget class="QMenu" name="menuFile"> + <property name="title"> + <string>File</string> + </property> + <addaction name="actionNew_Tab"/> + <addaction name="actionSearch"/> + <addaction name="separator"/> + <addaction name="actionClose"/> + </widget> + <widget class="QMenu" name="menuView"> + <property name="title"> + <string>View</string> + </property> + <addaction name="actionShow_Thumbnails"/> + <addaction name="actionView_Hidden_Files"/> + <addaction name="actionShow_Action_Buttons"/> + <addaction name="separator"/> + </widget> + <widget class="QMenu" name="menuBookmarks"> + <property name="title"> + <string>Bookmarks</string> + </property> + <addaction name="actionManage_Bookmarks"/> + </widget> + <widget class="QMenu" name="menuExternal_Devices"> + <property name="title"> + <string>External Devices</string> + </property> + <addaction name="actionScan"/> + <addaction name="separator"/> + </widget> + <addaction name="menuFile"/> + <addaction name="menuView"/> + <addaction name="menuBookmarks"/> + <addaction name="menuExternal_Devices"/> + </widget> + <widget class="QStatusBar" name="statusbar"/> + <widget class="QToolBar" name="toolBar"> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> + <property name="windowTitle"> + <string>toolBar</string> + </property> + <property name="movable"> + <bool>false</bool> + </property> + <property name="floatable"> + <bool>false</bool> + </property> + <attribute name="toolBarArea"> + <enum>TopToolBarArea</enum> + </attribute> + <attribute name="toolBarBreak"> + <bool>false</bool> + </attribute> + <addaction name="actionBackToBrowser"/> + <addaction name="actionBack"/> + <addaction name="actionUpDir"/> + <addaction name="actionHome"/> + <addaction name="actionBookMark"/> + </widget> + <action name="actionNew_Tab"> + <property name="text"> + <string>New &Tab</string> + </property> + <property name="shortcut"> + <string>Ctrl+T</string> + </property> + </action> + <action name="actionClose"> + <property name="text"> + <string>Exit</string> + </property> + <property name="shortcut"> + <string>Ctrl+Q</string> + </property> + <property name="shortcutContext"> + <enum>Qt::ApplicationShortcut</enum> + </property> + </action> + <action name="action_Preferences"> + <property name="text"> + <string>&Preferences</string> + </property> + </action> + <action name="actionUpDir"> + <property name="text"> + <string>UpDir</string> + </property> + <property name="toolTip"> + <string>Go up one directory</string> + </property> + <property name="shortcut"> + <string>Alt+Up</string> + </property> + </action> + <action name="actionHome"> + <property name="text"> + <string>&Home</string> + </property> + <property name="toolTip"> + <string>Go to your home directory</string> + </property> + <property name="shortcut"> + <string>Alt+H</string> + </property> + </action> + <action name="actionView_Hidden_Files"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>Show Hidden Files</string> + </property> + </action> + <action name="actionBack"> + <property name="text"> + <string>Back</string> + </property> + <property name="toolTip"> + <string>Back to directory</string> + </property> + <property name="shortcut"> + <string>Alt+Left</string> + </property> + </action> + <action name="actionBookMark"> + <property name="text"> + <string>Bookmark</string> + </property> + <property name="toolTip"> + <string>Bookmark this directory</string> + </property> + <property name="shortcut"> + <string>Ctrl+D</string> + </property> + </action> + <action name="actionScan"> + <property name="text"> + <string>Scan for Devices</string> + </property> + </action> + <action name="actionBackToBrowser"> + <property name="text"> + <string notr="true">BBack</string> + </property> + <property name="iconText"> + <string notr="true">BBack</string> + </property> + <property name="toolTip"> + <string>Back to the system</string> + </property> + <property name="shortcut"> + <string>Alt+Left</string> + </property> + </action> + <action name="actionManage_Bookmarks"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Manage Bookmarks</string> + </property> + <property name="whatsThis"> + <string notr="true"/> + </property> + </action> + <action name="actionShow_Action_Buttons"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>Show Action Buttons</string> + </property> + </action> + <action name="actionShow_Thumbnails"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>Load Thumbnails</string> + </property> + </action> + <action name="actionSearch"> + <property name="text"> + <string>Search Directory</string> + </property> + <property name="shortcut"> + <string>Ctrl+F</string> + </property> + </action> + </widget> + <resources/> + <connections/> +</ui> diff --git a/lumina-fm/main.cpp b/lumina-fm/main.cpp index b05c4016..24fd231c 100644 --- a/lumina-fm/main.cpp +++ b/lumina-fm/main.cpp @@ -3,7 +3,7 @@ #include <QFile> #include <QStringList> -#include "MainUI.h" +#include "MainUI-old.h" #include <LuminaOS.h> #include <LuminaThemes.h> #include <LuminaUtils.h> diff --git a/lumina-fm/widgets/DirWidget.cpp b/lumina-fm/widgets/DirWidget.cpp index 8e7e3b0e..b32e5c20 100644 --- a/lumina-fm/widgets/DirWidget.cpp +++ b/lumina-fm/widgets/DirWidget.cpp @@ -47,9 +47,17 @@ void DirWidget::setShowSidebar(bool show){ void DirWidget::setDetails(QList<DETAILTYPES> list){ listDetails = list; + if(CDIR.isEmpty() || !showDetails){ return; } //don't need to reload dir if details are not visible emit LoadDirectory(ID, CDIR); } +void DirWidget::setThumbnailSize(int px){ + bool larger = ui->listWidget->iconSize().height() < px; + ui->listWidget->setIconSize(QSize(px,px)); + ui->treeWidget->setIconSize(QSize(px,px)); + if(CDIR.isEmpty() || !larger ){ return; } //don't need to reload icons unless the new size is larger + emit LoadDirectory(ID, CDIR); +} // ================ // PUBLIC SLOTS // ================ @@ -237,16 +245,18 @@ void DirWidget::UpdateButtons(){ // PRIVATE // ================= void DirWidget::setupConnections(){ - //Tree Widget interaction + //Info routines connect(ui->treeWidget, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(OpenContextMenu()) ); connect(ui->listWidget, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(OpenContextMenu()) ); connect(ui->treeWidget, SIGNAL(itemSelectionChanged()), this, SLOT(SelectionChanged()) ); connect(ui->listWidget, SIGNAL(itemSelectionChanged()), this, SLOT(SelectionChanged()) ); - - /*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->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()) );*/ + + //Activation routines + connect(ui->treeWidget, SIGNAL(itemActivated(QTreeWidgetItem*)), this, SLOT(on_tool_act_run_clicked()) ); + connect(ui->listWidget, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(on_tool_act_run_clicked()) ); + connect(ui->treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*)), this, SLOT(on_tool_act_run_clicked()) ); + connect(ui->listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(on_tool_act_run_clicked()) ); + } diff --git a/lumina-fm/widgets/DirWidget.h b/lumina-fm/widgets/DirWidget.h index 272aba8e..646df309 100644 --- a/lumina-fm/widgets/DirWidget.h +++ b/lumina-fm/widgets/DirWidget.h @@ -30,7 +30,8 @@ public: QString id(); void setShowDetails(bool show); void setShowSidebar(bool show); - void setDetails(QList<DETAILTYPES> list); + void setDetails(QList<DETAILTYPES> list); //Which details to show and in which order (L->R) + void setThumbnailSize(int px); public slots: void LoadDir(QString dir, QList<LFileInfo> list); |