From a233a037540b965d2c3b8be0b75bf021a0a9a795 Mon Sep 17 00:00:00 2001 From: Ken Moore Date: Thu, 20 Aug 2015 17:04:12 -0400 Subject: Another checkpoint in the lumina-fm backend overhaul - still not tied into the general build/use yet. --- lumina-fm/MainUI.cpp | 4 +- lumina-fm/lumina-fm.pro | 11 +- lumina-fm/widgets/DirWidget.cpp | 336 ++++++++++++++++++++-- lumina-fm/widgets/DirWidget.h | 46 ++- lumina-fm/widgets/DirWidget.ui | 600 ++++++++++++++++------------------------ 5 files changed, 604 insertions(+), 393 deletions(-) (limited to 'lumina-fm') diff --git a/lumina-fm/MainUI.cpp b/lumina-fm/MainUI.cpp index fe9be78b..732554dd 100644 --- a/lumina-fm/MainUI.cpp +++ b/lumina-fm/MainUI.cpp @@ -1580,12 +1580,12 @@ void MainUI::ChecksumItems(){ qDebug() << " - Info:" << info; if(info.isEmpty() || (info.length() != files.length()) ){ return; } for(int i=0; i +#include +#include +#include + +#include +#include +#include + DirWidget::DirWidget(QString objID, QWidget *parent) : QWidget(parent), ui(new Ui::DirWidget){ ui->setupUi(this); //load the designer file + ID = objID; + canmodify = false; //initial value + contextMenu = new QMenu(this); setShowDetails(true); UpdateIcons(); UpdateText(); @@ -30,12 +42,12 @@ void DirWidget::setShowDetails(bool show){ } void DirWidget::setShowSidebar(bool show){ - this->stacked_actions->setVisible(show); + ui->group_actions->setVisible(show); } void DirWidget::setDetails(QList list){ listDetails = list; - LoadDir(CDIR, CLIST); //just refresh the UI + emit LoadDirectory(ID, CDIR); } // ================ @@ -43,15 +55,19 @@ void DirWidget::setDetails(QList list){ // ================ void DirWidget::LoadDir(QString dir, QList list){ if(dir.isEmpty()){ return; } //nothing to do + QString lastdir = CDIR; //for some checks later + canmodify = QFileInfo(CDIR).isWritable(); CLIST = list; //save for later CDIR = dir; + //Hide the extra buttons for a moment + ui->tool_goToPlayer->setVisible(false); + ui->tool_goToImages->setVisible(false); //Determine if this is an internal ZFS snapshot bool loadsnaps = false; if( dir.contains(ZSNAPDIR) ){ //This is a zfs snapshot - only update the saved paths necessary to rotate between snapshots/system snaprelpath = dir.section(ZSNAPDIR,1,1000).section("/",1,1000); //the relative path inside the snapshot normalbasedir = dir.section(ZSNAPDIR,0,0)+"/"+snaprelpath; //Update the new base directory - ui->stacked_actions->setCurrentWidget(ui->page_restore); //See if this was a manual move to the directory, or an internal move QString tmp = dir.section(ZSNAPDIR,0,0); if(tmp != snapbasedir.section(ZSNAPDIR,0,0)){ @@ -61,7 +77,6 @@ void DirWidget::LoadDir(QString dir, QList list){ //This is a normal directory - prompt for snapshot information normalbasedir = dir; snapbasedir.clear(); - ui->stacked_actions->setCurrentWidget(ui->page_dir); loadsnaps = true; } if(loadsnaps){ @@ -77,22 +92,41 @@ void DirWidget::LoadDir(QString dir, QList list){ //Need to re-create the header item as well QTreeWidgetItem *it = new QTreeWidgetItem(); for(int t=0; t + switch(listDetails[t]){ + case NAME: + it->setText(t,tr("Name")); + break; + case SIZE: + it->setText(t,tr("Size")); + break; + case TYPE: + it->setText(t, tr("Type")); + case DATEMOD: + it->setText(t, tr("Date Modified") ); + break; + case DATECREATE: + it->setText(t, tr("Date Created") ); + break; + } } ui->treeWidget->setHeaderItem(it); }else{ ui->listWidget->clear(); } //Now fill the display widget + bool hasimages, hasmultimedia; + hasimages = hasmultimedia = false; for(int i=0; isetWhatsThis(list[i].fileName()); + it->setWhatsThis(0, list[i].fileName()); for(int t=0; tsetText(t,list[i].fileName()); if(list[i].isImage()){ - it->setIcon(t, QIcon( QPixmap(list[i].absoluteFilePath()).scaledToHeight(64) ) ); + it->setIcon(t, QIcon( QPixmap(list[i].absoluteFilePath()).scaledToHeight(ui->treeWidget->iconSize().height()) ) ); }else{ it->setIcon(t, LXDG::findIcon(list[i].iconfile(),"unknown") ); } @@ -105,19 +139,45 @@ void DirWidget::LoadDir(QString dir, QList list){ case TYPE: it->setText(t, list[i].mimetype()); case DATEMOD: - it->setText(t, list[i].lastModified().toString(Qt:DefaultLocaleShortDate); + it->setText(t, list[i].lastModified().toString(Qt::DefaultLocaleShortDate) ); break; case DATECREATE: - it->setText(t, list[i].created().toString(Qt:DefaultLocaleShortDate); + it->setText(t, list[i].created().toString(Qt::DefaultLocaleShortDate) ); break; } } ui->treeWidget->addTopLevelItem(it); + if(lastdir == CDIR+"/"+it->whatsThis(0)){ + ui->treeWidget->setCurrentItem(it); + ui->treeWidget->scrollToItem(it); + } }else{ - + //Create all the individual items for the basic list + QListWidgetItem *it = new QListWidgetItem(); + it->setWhatsThis(list[i].fileName()); + it->setText(list[i].fileName()); + if(list[i].isImage()){ + it->setIcon(QIcon( QPixmap(list[i].absoluteFilePath()).scaledToHeight(ui->listWidget->iconSize().height()) ) ); + }else{ + it->setIcon(LXDG::findIcon(list[i].iconfile(),"unknown") ); + } + ui->listWidget->addItem(it); + if(lastdir == CDIR+"/"+it->whatsThis()){ + ui->listWidget->setCurrentItem(it); + ui->listWidget->scrollToItem(it); + } } QApplication::processEvents(); //keep the UI snappy while loading a directory } + //Another check to ensure the current item is visible + if(showDetails){ + if(ui->treeWidget->currentItem()!=0){ ui->treeWidget->scrollToItem(ui->treeWidget->currentItem()); } + }else{ + if(ui->listWidget->currentItem()!=0){ ui->listWidget->scrollToItem(ui->listWidget->currentItem()); } + } + //Now Re-enable buttons as necessary + ui->tool_goToPlayer->setVisible(hasimages); + ui->tool_goToImages->setVisible(hasmultimedia); } void DirWidget::LoadSnaps(QString basedir, QStringList snaps){ @@ -126,12 +186,12 @@ void DirWidget::LoadSnaps(QString basedir, QStringList snaps){ snapshots = snaps; //Now update the UI as necessary - ui->slider_snap->setRange(1, snaps.length()+1); + ui->slider_snap->setRange(0, snaps.length()); if(CDIR.contains(ZSNAPDIR)){ //The user was already within a snapshot - figure out which one and set the slider appropriately int index = snaps.indexOf( CDIR.section(ZSNAPDIR,1,1).section("/",0,0) ); if(index < 0){ index = snaps.length()+1; } //unknown - load the system (should never happen) - ui->slider_snap_setValue(index); + ui->slider_snap->setValue(index); }else{ ui->slider_snap->setValue(snaps.length()+1); //last item (normal system) } @@ -151,7 +211,7 @@ void DirWidget::UpdateIcons(){ //Snapshot buttons ui->tool_snap_newer->setIcon(LXDG::findIcon("go-next-view","") ); ui->tool_snap_older->setIcon(LXDG::findIcon("go-previous-view","") ); - //Botton-Action Buttons + //Bottom-Action Buttons ui->tool_goToImages->setIcon( LXDG::findIcon("fileview-preview","") ); ui->tool_goToPlayer->setIcon( LXDG::findIcon("applications-multimedia","") ); //Side-Action Buttons @@ -163,29 +223,261 @@ void DirWidget::UpdateIcons(){ ui->tool_act_rename->setIcon( LXDG::findIcon("edit-rename","") ); ui->tool_act_rm->setIcon( LXDG::findIcon("edit-delete","") ); ui->tool_act_fav->setIcon( LXDG::findIcon("bookmark-toolbar","") ); - //Restore-Action Buttons - ui->tool_restore->setIcon( LXDG::findIcon("document-revert","") ); - ui->tool_restore_over->setIcon( LXDG::findIcon("document-revert","") ); } void DirWidget::UpdateText(){ ui->retranslateUi(this); } +void DirWidget::UpdateButtons(){ + SelectionChanged(); +} // ================= // PRIVATE // ================= void DirWidget::setupConnections(){ //Tree Widget interaction - connect(ui->tree_dir_view, SIGNAL(activated(const QModelIndex&)), this, SLOT(ItemRun(const QModelIndex&)) ); + 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, 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()) ); + connect(ui->list_dir_view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection, const QItemSelection)), this, SLOT(ItemSelectionChanged()) );*/ + + +} + +QStringList DirWidget::currentSelection(){ + QStringList out; + if(showDetails){ + QList sel = ui->treeWidget->selectedItems(); + for(int i=0; iwhatsThis(0); + } + }else{ + QList sel = ui->listWidget->selectedItems(); + for(int i=0; iwhatsThis(); + } + } + out.removeDuplicates(); + return out; } // ================= // PRIVATE SLOTS -// ================= \ No newline at end of file +// ================= +//UI BUTTONS +// -- Left Action Buttons +void DirWidget::on_tool_act_cut_clicked(){ + QStringList sel = currentSelection(); + if(sel.isEmpty()){ return; } + for(int i=0; islider_snap->setValue( ui->slider_snap->value()+1 ); +} + +void DirWidget::on_tool_snap_older_clicked(){ + ui->slider_snap->setValue( ui->slider_snap->value()-1 ); +} + +void DirWidget::on_slider_snap_valueChanged(int val){ + //Update the snapshot interface + ui->tool_snap_newer->setEnabled(val < ui->slider_snap->maximum()); + ui->tool_snap_older->setEnabled(val > ui->slider_snap->minimum()); + if(val >= snapshots.length() || val < 0){ + ui->label_snap->setText(tr("Current")); + }else{ + ui->label_snap->setText( QFileInfo(snapbasedir+snapshots[val]).created().toString(Qt::DefaultLocaleShortDate) ); + } + //Exit if a non-interactive snapshot change + if(!ui->group_snaps->isEnabled()){ return; } //internal change - do not try to change the actual info + //Determine which snapshot is now selected + QString dir; + qDebug() << "Changing snapshot:" << CDIR << val; + if(val >= snapshots.length() || val < 0){ //active system selected + qDebug() << " - Load Active system:" << normalbasedir; + dir = normalbasedir; + }else{ + dir = snapbasedir+snapshots[val]+"/"; + if(snaprelpath.isEmpty()){ + //Need to figure out the relative path within the snapshot + snaprelpath = CDIR.section(snapbasedir.section(ZSNAPDIR,0,0), 1,1000); + qDebug() << " - new snapshot-relative path:" << snaprelpath; + } + dir.append(snaprelpath); + qDebug() << " - Load Snapshot:" << dir; + } + //Make sure this directory exists, and back up as necessary + while(!QFile::exists(dir) && !dir.isEmpty()){ + dir = dir.section("/",0,-1); //back up one dir + } + if(dir.isEmpty()){ return; } + //Load the newly selected snapshot + emit LoadDirectory(ID, dir); +} + +// - Other Actions without a specific button on the side +void DirWidget::fileCheckSums(){ + QStringList files = currentSelection(); + if(files.isEmpty()){ return; } + for(int i=0; iclear(); + if(!sel.isEmpty()){ + contextMenu->addAction(LXDG::findIcon("run-build-file",""), tr("Open"), this, SLOT(on_tool_act_run_clicked()) ); + contextMenu->addAction(LXDG::findIcon("run-build-configure",""), tr("Open With..."), this, SLOT(on_tool_act_runwith_clicked()) ); + + contextMenu->addAction(LXDG::findIcon("edit-rename",""), tr("Rename"), this, SLOT(on_tool_act_rename_clicked()) )->setEnabled(canmodify); + contextMenu->addAction(LXDG::findIcon("document-encrypted",""), tr("View Checksums"), this, SLOT(fileCheckSums()) ); + contextMenu->addSeparator(); + } + //Now add the general selection options + contextMenu->addAction(LXDG::findIcon("edit-cut",""), tr("Cut Selection"), this, SLOT(on_tool_act_cut_clicked()) )->setEnabled(canmodify && !sel.isEmpty()); + contextMenu->addAction(LXDG::findIcon("edit-copy",""), tr("Copy Selection"), this, SLOT(on_tool_act_copy_clicked()) )->setEnabled(!sel.isEmpty()); + contextMenu->addAction(LXDG::findIcon("edit-paste",""), tr("Paste"), this, SLOT(on_tool_act_paste_clicked()) )->setEnabled(QApplication::clipboard()->mimeData()->hasFormat("x-special/lumina-copied-files") && canmodify); + contextMenu->addSeparator(); + contextMenu->addAction(LXDG::findIcon("edit-delete",""), tr("Delete Selection"), this, SLOT(on_tool_act_rm_clicked()) )->setEnabled(canmodify&&!sel.isEmpty()); + if(LUtils::isValidBinary("lumina-fileinfo")){ + contextMenu->addSeparator(); + contextMenu->addAction(LXDG::findIcon("edit-find-replace",""), tr("File Properties"), this, SLOT(fileProperties()) )->setEnabled(!sel.isEmpty()); + } + contextMenu->addSeparator(); + contextMenu->addAction(LXDG::findIcon("system-search",""), tr("Open Terminal here"), this, SLOT(openTerminal())); + + //Now open the menu at the current cursor location + contextMenu->popup(QCursor::pos()); +} + +void DirWidget::SelectionChanged(){ + //Go through and enable/disable the buttons as necessary + bool hasselection = !currentSelection().isEmpty(); + ui->tool_act_copy->setEnabled(hasselection); + ui->tool_act_cut->setEnabled(hasselection && canmodify); + ui->tool_act_fav->setEnabled(hasselection); + ui->tool_act_paste->setEnabled(canmodify && QApplication::clipboard()->mimeData()->hasFormat("x-special/lumina-copied-files") ); + ui->tool_act_rename->setEnabled(hasselection && canmodify); + ui->tool_act_rm->setEnabled(hasselection && canmodify); + ui->tool_act_run->setEnabled(hasselection); + ui->tool_act_runwith->setEnabled(hasselection); +} diff --git a/lumina-fm/widgets/DirWidget.h b/lumina-fm/widgets/DirWidget.h index 49e59454..272aba8e 100644 --- a/lumina-fm/widgets/DirWidget.h +++ b/lumina-fm/widgets/DirWidget.h @@ -10,6 +10,7 @@ #include #include #include +#include #include "../DirData.h" @@ -39,19 +40,24 @@ public slots: void UpdateIcons(); void UpdateText(); + //Button updates + void UpdateButtons(); + private: Ui::DirWidget *ui; QString ID, CDIR; //unique ID assigned by the parent and the current dir path QList CLIST; //current item list (snap or not) QString normalbasedir, snapbasedir, snaprelpath; //for maintaining direcoty context while moving between snapshots QStringList snapshots; - bool showDetails; //which widget to use for showing items + bool showDetails, canmodify; //which widget to use for showing items QList listDetails; + QMenu *contextMenu; void setupConnections(); - + QStringList currentSelection(); + private slots: - //UI BUTTONS + //UI BUTTONS/Actions // -- Left Action Buttons void on_tool_act_copy_clicked(); void on_tool_act_cut_clicked(); @@ -61,9 +67,6 @@ private slots: void on_tool_act_rm_clicked(); void on_tool_act_run_clicked(); void on_tool_act_runwith_clicked(); - // -- Left Restore Buttons - void on_tool_restore_clicked(); - void on_tool_restore_over_clicked(); // -- Bottom Action Buttons void on_tool_goToImages_clicked(); void on_tool_goToPlayer_clicked(); @@ -71,8 +74,35 @@ private slots: void on_tool_snap_newer_clicked(); void on_tool_snap_older_clicked(); void on_slider_snap_valueChanged(int); + // - Other Actions without a specific button on the side + void fileCheckSums(); + void fileProperties(); + void openTerminal(); + void NewFile(); + void NewDir(); + + //Browser Functions + void OpenContextMenu(); + void SelectionChanged(); + signals: - void LoadDirectory(QString, QString); //ID, dirpath - void findSnaps(QString, QString); //ID, dirpath + //Directory loading/finding signals + void OpenDirectories(QStringList); //Directories to open in other tabs/columns + void LoadDirectory(QString, QString); //ID, dirpath (Directory to load here) + void findSnaps(QString, QString); //ID, dirpath (Request snapshot information for a directory) + + //External App/Widget launching + void PlayFiles(QList); //open in multimedia player + void ViewFiles(QList); //open in slideshow + void LaunchTerminal(QString); //dirpath + + //System Interactions + void CutFiles(QStringList); //file selection + void CopyFiles(QStringList); //file selection + void PasteFiles(QString); //current dir + void FavoriteFiles(QStringList); //file selection + void RenameFiles(QStringList); //file selection + void RemoveFiles(QStringList); //file selection + }; #endif \ No newline at end of file diff --git a/lumina-fm/widgets/DirWidget.ui b/lumina-fm/widgets/DirWidget.ui index 9c0a73a1..2be5515d 100644 --- a/lumina-fm/widgets/DirWidget.ui +++ b/lumina-fm/widgets/DirWidget.ui @@ -1,7 +1,7 @@ - DirView - + DirWidget + 0 @@ -15,378 +15,258 @@ - 0 + 1 - 0 + 1 - 0 + 1 - 0 + 1 + + + 2 - + 0 0 - - 0 + + - - - - 0 - 0 - + + + 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Open item - - - Open item - - - - - - - 20 - 20 - - - - Qt::ToolButtonIconOnly - - - true - - - - - - - Open item (select application) - - - Open item (select application) - - - - - - - 20 - 20 - - - - true - - - - - - - Qt::Horizontal - - - - - - - Add item to personal favorites - - - Add item to personal favorites - - - - - - - 20 - 20 - - - - true - - - - - - - Rename item - - - Rename item - - - - - - - 20 - 20 - - - - true - - - - - - - Qt::Horizontal - - - - - - - Cut items - - - Cut items (add to the clipboard) - - - - - - - 20 - 20 - - - - true - - - - - - - Copy items - - - Copy items to the clipboard - - - - - - - 20 - 20 - - - - true - - - - - - - Paste items from clipboard - - - Paste items from clipboard - - - - - - - 20 - 20 - - - - true - - - - - - - Qt::Horizontal - - - - - - - Delete Items - - - Delete Items - - - - - - - 20 - 20 - - - - true - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - 0 - 0 - + + 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Restore File(s) - - - ... - - - true - - - - - - - Restore Files(s) (Overwrite any conflicting files) - - - ... - - - true - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - + + 0 + + + 0 + + + + + Open item + + + Open item + + + + + + + 20 + 20 + + + + Qt::ToolButtonIconOnly + + + true + + + + + + + Open item (select application) + + + Open item (select application) + + + + + + + 20 + 20 + + + + true + + + + + + + Qt::Horizontal + + + + + + + Add item to personal favorites + + + Add item to personal favorites + + + + + + + 20 + 20 + + + + true + + + + + + + Rename item + + + Rename item + + + + + + + 20 + 20 + + + + true + + + + + + + Qt::Horizontal + + + + + + + Cut items + + + Cut items (add to the clipboard) + + + + + + + 20 + 20 + + + + true + + + + + + + Copy items + + + Copy items to the clipboard + + + + + + + 20 + 20 + + + + true + + + + + + + Paste items from clipboard + + + Paste items from clipboard + + + + + + + 20 + 20 + + + + true + + + + + + + Qt::Horizontal + + + + + + + Delete Items + + + Delete Items + + + + + + + 20 + 20 + + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + @@ -463,6 +343,9 @@ + + Qt::CustomContextMenu + QAbstractItemView::ExtendedSelection @@ -475,6 +358,9 @@ + + Qt::CustomContextMenu + QAbstractItemView::ExtendedSelection -- cgit