changeset 16503:c1ff738d606d

allow files to be renamed or deleted using the file browser * libgui/src/files-dock-widget.cc, libgui/src/files-dock-widget.h (files_dock_widget::files_dock_widget): Add connect/setup for context menu. (files_dock_widget::contextmenu_requested): New function. (files_dock_widget::contextmenu_open): New function. (files_dock_widget::contextmenu_rename): New function. (files_dock_widget::contextmenu_delete): New function. (files_dock_widget::contextmenu_newfile): New function. (files_dock_widget::contextmenu_newdir): New function.
author John Donoghue <john.donoghue@ieee.org>
date Fri, 12 Apr 2013 14:51:39 -0400
parents 45ae1038ee89
children 49b059bf27c7
files libgui/src/files-dock-widget.cc libgui/src/files-dock-widget.h
diffstat 2 files changed, 182 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/files-dock-widget.cc	Fri Apr 12 14:50:56 2013 -0400
+++ b/libgui/src/files-dock-widget.cc	Fri Apr 12 14:51:39 2013 -0400
@@ -36,6 +36,9 @@
 #include <QHeaderView>
 #include <QLineEdit>
 #include <QSizePolicy>
+#include <QMenu>
+#include <QInputDialog>
+#include <QMessageBox>
 
 files_dock_widget::files_dock_widget (QWidget *p)
   : octave_dock_widget (p)
@@ -135,6 +138,11 @@
   connect (_file_tree_view, SIGNAL (doubleClicked (const QModelIndex &)),
            this, SLOT (item_double_clicked (const QModelIndex &)));
 
+  // add context menu to tree_view
+  _file_tree_view->setContextMenuPolicy(Qt::CustomContextMenu);
+  connect(_file_tree_view, SIGNAL(customContextMenuRequested(const QPoint &)), 
+           this, SLOT(contextmenu_requested(const QPoint &)));
+
   // Layout the widgets vertically with the toolbar on top
   QVBoxLayout *vbox_layout = new QVBoxLayout ();
   vbox_layout->setSpacing (0);
@@ -261,6 +269,169 @@
     }
 }
 
+void 
+files_dock_widget::contextmenu_requested (const QPoint& mpos)
+{
+
+  QMenu menu(this);
+
+  QModelIndex index = _file_tree_view->indexAt (mpos);
+  //QAbstractItemModel *m = _file_tree_view->model ();
+
+  if (index.isValid())
+    { 
+      QFileInfo info = _file_system_model->fileInfo(index);
+
+      menu.addAction(tr("Open"), this, SLOT(contextmenu_open(bool)));
+      menu.addSeparator();
+      menu.addAction(tr("Rename"), this, SLOT(contextmenu_rename(bool)));
+      menu.addAction(tr("Delete"), this, SLOT(contextmenu_delete(bool)));
+
+      if(info.isDir())
+        {
+          menu.addSeparator();
+          menu.addAction(tr("New File"), this, SLOT(contextmenu_newfile(bool)));
+          menu.addAction(tr("New Directory"), this, SLOT(contextmenu_newdir(bool)));
+        }
+
+      menu.exec(_file_tree_view->mapToGlobal(mpos));
+
+    }
+}
+
+void 
+files_dock_widget::contextmenu_open (bool)
+{
+
+  QItemSelectionModel *m = _file_tree_view->selectionModel ();
+  QModelIndexList rows = m->selectedRows ();
+
+  for( QModelIndexList::iterator it = rows.begin (); it != rows.end (); it++)
+    {
+      item_double_clicked(*it);
+    }
+}
+
+void 
+files_dock_widget::contextmenu_rename (bool)
+{
+  QItemSelectionModel *m = _file_tree_view->selectionModel ();
+  QModelIndexList rows = m->selectedRows ();
+  if(rows.size() > 0)
+    {
+      QModelIndex index = rows[0];
+
+      QFileInfo info = _file_system_model->fileInfo(index);
+      QDir path = info.absoluteDir();
+      QString old_name = info.fileName();
+      bool ok;
+
+      QString new_name = QInputDialog::getText (this, tr("Rename file/directory"), 
+                                                tr("Rename file/directory:\n") + old_name + tr("\n to: "),
+                                                QLineEdit::Normal, old_name, &ok);
+      if(ok && new_name.length()>0)
+        {
+          new_name = path.absolutePath() + "/" + new_name;
+          old_name = path.absolutePath() + "/" + old_name;
+          path.rename(old_name, new_name);
+          _file_system_model->revert();
+        }
+    }
+
+}
+
+void 
+files_dock_widget::contextmenu_delete (bool)
+{
+  QItemSelectionModel *m = _file_tree_view->selectionModel ();
+  QModelIndexList rows = m->selectedRows ();
+
+  for( QModelIndexList::iterator it = rows.begin (); it != rows.end (); it++)
+    {
+      QModelIndex index = *it;
+
+      QFileInfo info = _file_system_model->fileInfo(index);
+
+      if(QMessageBox::question(this, tr("Delete file/directory"), 
+                               tr("Are you sre you want to delete\n") + info.filePath(),
+                               QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes) 
+        {
+           if(info.isDir())
+             {
+               // see if direcory is empty
+               QDir path(info.absoluteFilePath());
+               QList<QFileInfo> fileLst = path.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot);
+
+               if(fileLst.count() != 0)
+                 QMessageBox::warning(this, tr("Delete file/directory"),
+                                      tr("Can not delete a directory that is not empty"));
+               else
+                 _file_system_model->rmdir(index);
+             }
+           else
+             {
+               _file_system_model->remove(index);
+             }
+
+           _file_system_model->revert();
+
+        }
+    }
+}
+
+void 
+files_dock_widget::contextmenu_newfile (bool)
+{
+  QItemSelectionModel *m = _file_tree_view->selectionModel ();
+  QModelIndexList rows = m->selectedRows ();
+
+  if(rows.size() > 0)
+    {
+      QModelIndex index = rows[0];
+
+      QFileInfo info = _file_system_model->fileInfo(index);
+      QString parent_dir = info.filePath();
+      bool ok;
+
+      QString name = QInputDialog::getText (this, tr("Create File"), tr("Create file in\n") + parent_dir,
+                                       QLineEdit::Normal, "New File.txt", &ok);
+      if(ok && name.length()>0)
+        {
+          name = parent_dir + "/" + name;
+
+          QFile file(name);
+          file.open(QIODevice::WriteOnly);
+          _file_system_model->revert();
+        }
+    }
+}
+
+void 
+files_dock_widget::contextmenu_newdir (bool)
+{
+  QItemSelectionModel *m = _file_tree_view->selectionModel ();
+  QModelIndexList rows = m->selectedRows ();
+
+  if(rows.size() > 0)
+    {
+      QModelIndex index = rows[0];
+
+      QFileInfo info = _file_system_model->fileInfo(index);
+      QString parent_dir = info.filePath();
+      bool ok;
+
+      QString name = QInputDialog::getText (this, tr("Create Directory"), tr("Create folder in\n") + parent_dir,
+                                       QLineEdit::Normal, "New Directory", &ok);
+      if(ok && name.length()>0)
+        {
+          _file_system_model->mkdir(index, name);
+        }
+    }
+}
+
+
+
+
 void
 files_dock_widget::notice_settings (const QSettings *settings)
 {
--- a/libgui/src/files-dock-widget.h	Fri Apr 12 14:50:56 2013 -0400
+++ b/libgui/src/files-dock-widget.h	Fri Apr 12 14:51:39 2013 -0400
@@ -79,6 +79,17 @@
   /** Tells the widget to react on changed settings. */
   void notice_settings (const QSettings *settings);
 
+private slots:
+  /** context menu wanted */
+  void contextmenu_requested (const QPoint& pos);
+
+  /* context menu actions */
+  void contextmenu_open (bool);
+  void contextmenu_rename (bool);
+  void contextmenu_delete (bool);
+  void contextmenu_newfile (bool);
+  void contextmenu_newdir (bool);
+
 signals:
 
   /** Emitted, whenever the user requested to open a file. */