changeset 16437:919796a440c6

use signal for changing directory * files-dockwidget.cc (files_dock_widget::files_dock_widget): Set title to "File Browser", not "Current Directory". * files-dockwidget.h, files-dockwidget.cc (files_dock_widget::change_directory_up): Rename from files_dock_widget::do_up_directory. Change all uses. (files_dock_widget::_last_current_directory): Delete variable and all uses. (files_dock_widget::accept_directory_line_edit): Rename from handle_directory_entered. Change all uses. (files_dock_widget::item_double_clicked): Call set_current_directory instead of display_directory. (files_dock_widget::set_current_directory): Also emit displayed_directory_changed signal. (files_dock_widget::display_directory): Sort list. Don't emit displayed_directory_changed. private: * file-editor-tab.cc (file_editor_tab::run_file): Delete unused local variable current_path. * main-window.h, main-window.cc (main_window::current_working_directory_has_changed): Delete function and all uses. (main_window::browse_for_directory): Rename from main_window::change_current_working_directory. Change all uses. (main_window::change_directory): Rename from main_window::set_current_working_directory. Change all uses. Update display. (main_window::change_directory_up): Rename from main_window::current_working_directory_up. Change all uses. Use absolute path for ".." directory. (main_window::accept_directory_line_edit): Rename from main_window::current_working_directory_entered. Change all uses. (main_window::construct): Set initial working directory to current directory at startup. * octave-qt-link.h, octave-qt-link.cc (octave_qt_link::do_change_directory): New function. (octave_qt_link::change_directory_signal): New signal. * octave-event-listener.h (octave_event_listener::current_directory_has_changed): Delete. * dirfns.cc (octave_change_to_directory): Also call octave_link::change_directory. * octave-link.h, octave-link.cc (octave_link::last_cwd): Delete variable and all uses. (octave_link::do_generate_events): Don't track current directory or post directory changed event. (octave_link::last_working_directory, octave_link::do_last_working_directory): Delete. (octave_link::do_change_directory): Rename from octave_link::do_last_working_directory.
author John W. Eaton <jwe@octave.org>
date Fri, 05 Apr 2013 00:40:12 -0400
parents 39847dcd2568
children a971d8bdaadc
files libgui/src/files-dockwidget.cc libgui/src/files-dockwidget.h libgui/src/m-editor/file-editor-tab.cc libgui/src/main-window.cc libgui/src/main-window.h libgui/src/octave-qt-link.cc libgui/src/octave-qt-link.h libinterp/interp-core/octave-event-listener.h libinterp/interpfcn/dirfns.cc libinterp/interpfcn/octave-link.cc libinterp/interpfcn/octave-link.h
diffstat 11 files changed, 110 insertions(+), 108 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/files-dockwidget.cc	Thu Apr 04 17:18:16 2013 -0400
+++ b/libgui/src/files-dockwidget.cc	Fri Apr 05 00:40:12 2013 -0400
@@ -40,7 +40,7 @@
 {
   setObjectName ("FilesDockWidget");
   setWindowIcon (QIcon(":/actions/icons/logo.png"));
-  setWindowTitle (tr ("Current Directory"));
+  setWindowTitle (tr ("File Browser"));
   setWidget (new QWidget (this));
 
   // Create a toolbar
@@ -53,14 +53,13 @@
   _directory_up_action = new QAction (_directory_icon, "", _navigation_tool_bar);
   _directory_up_action->setStatusTip (tr ("Move up one directory."));
 
-  _last_current_directory = "";
   _current_directory = new QLineEdit (_navigation_tool_bar);
   _current_directory->setStatusTip (tr ("Enter the path or filename."));
 
   _navigation_tool_bar->addAction (_directory_up_action);
   _navigation_tool_bar->addWidget (_current_directory);
   connect (_directory_up_action, SIGNAL (triggered ()), this,
-           SLOT (do_up_directory ()));
+           SLOT (change_directory_up ()));
 
   // TODO: Add other buttons for creating directories
 
@@ -105,7 +104,7 @@
   // TODO: Add right-click contextual menus for copying, pasting, deleting files (and others)
 
   connect (_current_directory, SIGNAL (returnPressed ()),
-           this, SLOT (handle_directory_entered ()));
+           this, SLOT (accept_directory_line_edit ()));
 
   QCompleter *
     completer = new QCompleter (_file_system_model, this);
@@ -126,27 +125,30 @@
 }
 
 void
-files_dock_widget::item_double_clicked (const QModelIndex & index)
+files_dock_widget::item_double_clicked (const QModelIndex& index)
 {
   // Retrieve the file info associated with the model index.
   QFileInfo fileInfo = _file_system_model->fileInfo (index);
-  display_directory (fileInfo.absoluteFilePath ());
+
+  set_current_directory (fileInfo.absoluteFilePath ());
 }
 
 void
-files_dock_widget::set_current_directory (const QString& currentDirectory)
+files_dock_widget::set_current_directory (const QString& dir)
 {
-  display_directory (currentDirectory);
+  display_directory (dir);
+
+  emit displayed_directory_changed (dir);
 }
 
 void
-files_dock_widget::handle_directory_entered ()
+files_dock_widget::accept_directory_line_edit (void)
 {
   display_directory (_current_directory->text ());
 }
 
 void
-files_dock_widget::do_up_directory ()
+files_dock_widget::change_directory_up (void)
 {
   QDir dir = QDir (_file_system_model->filePath (_file_tree_view->rootIndex ()));
   dir.cdUp ();
@@ -154,9 +156,9 @@
 }
 
 void
-files_dock_widget::display_directory (const QString& directory)
+files_dock_widget::display_directory (const QString& dir)
 {
-  QFileInfo fileInfo (directory);
+  QFileInfo fileInfo (dir);
   if (fileInfo.exists ())
     {
       if (fileInfo.isDir ())
@@ -164,14 +166,8 @@
           _file_tree_view->setRootIndex (_file_system_model->
                                          index (fileInfo.absoluteFilePath ()));
           _file_system_model->setRootPath (fileInfo.absoluteFilePath ());
+          _file_system_model->sort (0, Qt::AscendingOrder);
           _current_directory->setText (fileInfo.absoluteFilePath ());
-
-          if (_last_current_directory != fileInfo.absoluteFilePath ())
-            {
-              emit displayed_directory_changed (fileInfo.absoluteFilePath ());
-            }
-
-          _last_current_directory = fileInfo.absoluteFilePath ();
         }
       else
         {
--- a/libgui/src/files-dockwidget.h	Thu Apr 04 17:18:16 2013 -0400
+++ b/libgui/src/files-dockwidget.h	Fri Apr 05 00:40:12 2013 -0400
@@ -57,15 +57,15 @@
   void item_double_clicked (const QModelIndex & index);
 
   /** Slot for handling the up-directory button in the toolbar. */
-  void do_up_directory ();
+  void change_directory_up ();
 
   /** Sets the current directory being displayed. */
-  void set_current_directory (const QString& currentDirectory);
+  void set_current_directory (const QString& dir);
 
   /** Accepts user input a the line edit for the current directory. */
-  void handle_directory_entered ();
+  void accept_directory_line_edit ();
 
-  void display_directory (const QString& directory);
+  void display_directory (const QString& dir);
 
   /** Tells the widget to react on changed settings. */
   void notice_settings (const QSettings *settings);
@@ -75,15 +75,13 @@
   void open_file (const QString& fileName);
 
   /** Emitted, whenever the currently displayed directory changed. */
-  void displayed_directory_changed (const QString& directory);
+  void displayed_directory_changed (const QString& dir);
 
 protected:
 
 private:
   // TODO: Add toolbar with buttons for navigating the path, creating dirs, etc
 
-  QString           _last_current_directory;
-
   /** Toolbar for file and directory manipulation. */
   QToolBar *        _navigation_tool_bar;
 
--- a/libgui/src/m-editor/file-editor-tab.cc	Thu Apr 04 17:18:16 2013 -0400
+++ b/libgui/src/m-editor/file-editor-tab.cc	Fri Apr 05 00:40:12 2013 -0400
@@ -348,8 +348,6 @@
 
   QFileInfo file_info (_file_name);
   QString path = file_info.absolutePath ();
-  QString current_path
-    = QString::fromStdString (octave_link::last_working_directory ());
   QString function_name = file_info.fileName ();
 
   // We have to cut off the suffix, because octave appends it.
--- a/libgui/src/main-window.cc	Thu Apr 04 17:18:16 2013 -0400
+++ b/libgui/src/main-window.cc	Fri Apr 05 00:40:12 2013 -0400
@@ -270,65 +270,80 @@
 }
 
 void
-main_window::current_working_directory_has_changed (const QString& directory)
-{
-  int index = _current_directory_combo_box->findText (directory);
-  if ( index >= 0 )  // directory already in list -> remove it
-    { 
-      _current_directory_combo_box->removeItem (index);
-    }
-  _current_directory_combo_box->insertItem (0,directory);  // add (on top)
-  _current_directory_combo_box->setCurrentIndex (0);  // top is actual
-  _files_dock_widget->set_current_directory (directory);
-}
-
-void
 main_window::update_workspace (void)
 {
   _workspace_view->model_changed ();
 }
 
 void
-main_window::change_current_working_directory ()
+main_window::change_directory (const QString& dir)
 {
-  QString directory =
-    QFileDialog::getExistingDirectory(this, tr ("Set working direcotry"));
+  // Remove existing entry, if any, then add new directory at top and
+  // mark it as the current directory.  Finally, update the file list
+  // widget.
+
+  int index = _current_directory_combo_box->findText (dir);
+
+  if (index >= 0)
+    _current_directory_combo_box->removeItem (index);
+
+  _current_directory_combo_box->insertItem (0, dir);
+  _current_directory_combo_box->setCurrentIndex (0);
 
-  if (!directory.isEmpty ())
-    {
-      std::string dir = directory.toUtf8 ().data ();
-      octave_link::post_event (this, &main_window::change_directory_callback,dir);
-    }
+  _files_dock_widget->display_directory (dir);
+}
+
+void
+main_window::browse_for_directory (void)
+{
+  QString dir =
+    QFileDialog::getExistingDirectory (this, tr ("Set working directory"));
+
+  if (! dir.isEmpty ())
+    octave_link::post_event (this,
+                             &main_window::change_directory_callback,
+                             dir.toStdString ());
 }
 
 void
-main_window::set_current_working_directory (const QString& directory)
+main_window::set_current_working_directory (const QString& dir)
 {
-  QFileInfo fileInfo (directory);  // check whether this is an existing dir
-  if (fileInfo.exists () && fileInfo.isDir ())   // is dir and exists
-    {
-      std::string dir = directory.toUtf8 ().data ();
-      octave_link::post_event (this, &main_window::change_directory_callback,dir);
-    }
+  // Change to dir if it is an existing directory.
+
+  QString xdir = dir.isEmpty () ? "." : dir;
+    
+  QFileInfo fileInfo (xdir);
+
+  if (fileInfo.exists () && fileInfo.isDir ())
+    octave_link::post_event (this, &main_window::change_directory_callback,
+                             xdir.toStdString ());
 }
 
 void
-main_window::current_working_directory_up ()
+main_window::change_directory_up (void)
 {
-  set_current_working_directory ("..");
+  QDir dir ("..");
+
+  set_current_working_directory (dir.absolutePath ());
 }
 
-// Slot that is called if return is pressed in the line edit of the combobox
-// -> a new or a directory that is already in the drop down list was entered
+// Slot that is called if return is pressed in the line edit of the
+// combobox to change to a new directory or a directory that is already
+// in the drop down list.
+
 void
-main_window::current_working_directory_entered ()
+main_window::accept_directory_line_edit (void)
 {
-  QString dir = _current_directory_line_edit->text ();  // get new directory
-  int index = _current_directory_combo_box->findText (dir);  // already in list?
-  if ( index < 0 )  // directory not yet in list -> set directory
+  // Get new directory name, and change to it if it is new.  Otherwise,
+  // the combo box will triggers the "activated" signal to change to the
+  // directory.
+
+  QString dir = _current_directory_line_edit->text ();
+
+  int index = _current_directory_combo_box->findText (dir);
+
+  if (index < 0)
     set_current_working_directory (dir);
-  // if directory already in list, combobox triggers signal activated ()
-  // to change directory
 }
 
 void
@@ -1078,9 +1093,9 @@
   connect (clear_workspace_action,      SIGNAL (triggered ()),
            this,                        SLOT   (handle_clear_workspace_request ()));
   connect (current_directory_tool_button, SIGNAL (clicked ()),
-           this,                        SLOT   (change_current_working_directory ()));
+           this,                        SLOT   (browse_for_directory ()));
   connect (current_directory_up_tool_button, SIGNAL (clicked ()),
-           this,                        SLOT   (current_working_directory_up()));
+           this,                        SLOT   (change_directory_up ()));
   connect (copy_action,                 SIGNAL (triggered()),
            terminal,                    SLOT   (copyClipboard ()));
   connect (paste_action,                SIGNAL (triggered()),
@@ -1088,7 +1103,7 @@
   connect (_current_directory_combo_box, SIGNAL (activated (QString)),
            this,                        SLOT (set_current_working_directory (QString)));
   connect (_current_directory_line_edit, SIGNAL (returnPressed ()),
-           this,                        SLOT (current_working_directory_entered ()));
+           this,                        SLOT (accept_directory_line_edit ()));
   connect (_debug_continue,             SIGNAL (triggered ()),
            this,                        SLOT (debug_continue ()));
   connect (_debug_step_into,            SIGNAL (triggered ()),
@@ -1129,11 +1144,6 @@
   _octave_qt_event_listener = new octave_qt_event_listener ();
 
   connect (_octave_qt_event_listener,
-           SIGNAL (current_directory_has_changed_signal (QString)),
-           this,
-           SLOT (current_working_directory_has_changed (QString)));
-
-  connect (_octave_qt_event_listener,
            SIGNAL (update_workspace_signal ()),
            this,
            SLOT (update_workspace ()));
@@ -1152,6 +1162,9 @@
 
   _octave_qt_link = new octave_qt_link ();
 
+  connect (_octave_qt_link, SIGNAL (change_directory_signal (QString)),
+           this, SLOT (change_directory (QString)));
+
   connect (_octave_qt_link,
            SIGNAL (set_history_signal (const QStringList&)),
            _history_dock_widget, SLOT (set_history (const QStringList&)));
@@ -1189,6 +1202,9 @@
   octave_link::connect_link (_octave_qt_link);
 
   octave_link::register_event_listener (_octave_qt_event_listener);
+
+  QDir curr_dir;
+  set_current_working_directory (curr_dir.absolutePath ());
 }
 
 void
--- a/libgui/src/main-window.h	Thu Apr 04 17:18:16 2013 -0400
+++ b/libgui/src/main-window.h	Fri Apr 05 00:40:12 2013 -0400
@@ -85,12 +85,13 @@
   void notice_settings (const QSettings *settings);
   void prepare_for_quit ();
   void reset_windows ();
-  void current_working_directory_has_changed (const QString& directory);
   void update_workspace (void);
-  void change_current_working_directory ();
-  void set_current_working_directory (const QString& directory);
-  void current_working_directory_up ();
-  void current_working_directory_entered ();
+
+  void change_directory (const QString& dir);
+  void browse_for_directory (void);
+  void set_current_working_directory (const QString& dir);
+  void change_directory_up (void);
+  void accept_directory_line_edit (void);
 
   void focus_command_window ();
   void focus_command_history ();
--- a/libgui/src/octave-qt-link.cc	Thu Apr 04 17:18:16 2013 -0400
+++ b/libgui/src/octave-qt-link.cc	Fri Apr 05 00:40:12 2013 -0400
@@ -44,6 +44,12 @@
 }
 
 void
+octave_qt_link::do_change_directory (const std::string& dir)
+{
+  emit change_directory_signal (QString::fromStdString (dir));
+}
+
+void
 octave_qt_link::do_update_workspace (void)
 {
   if (event_listener)
--- a/libgui/src/octave-qt-link.h	Thu Apr 04 17:18:16 2013 -0400
+++ b/libgui/src/octave-qt-link.h	Fri Apr 05 00:40:12 2013 -0400
@@ -53,6 +53,8 @@
 
   void execute_interpreter (void);
 
+  void do_change_directory (const std::string& dir);
+
   void do_update_workspace (void);
 
   void do_set_history (const string_vector& hist);
@@ -86,6 +88,8 @@
 
 signals:
 
+  void change_directory_signal (const QString& dir);
+
   void set_history_signal (const QStringList& hist);
   void append_history_signal (const QString& hist_entry);
   void clear_history_signal (void);
--- a/libinterp/interp-core/octave-event-listener.h	Thu Apr 04 17:18:16 2013 -0400
+++ b/libinterp/interp-core/octave-event-listener.h	Fri Apr 05 00:40:12 2013 -0400
@@ -32,9 +32,6 @@
     virtual ~octave_event_listener () { }
 
     virtual void
-    current_directory_has_changed (const std::string& directory) = 0;
-
-    virtual void
     update_workspace (void) = 0;
 
     virtual void about_to_exit () = 0;
--- a/libinterp/interpfcn/dirfns.cc	Thu Apr 04 17:18:16 2013 -0400
+++ b/libinterp/interpfcn/dirfns.cc	Fri Apr 05 00:40:12 2013 -0400
@@ -51,6 +51,7 @@
 #include "gripes.h"
 #include "input.h"
 #include "load-path.h"
+#include "octave-link.h"
 #include "oct-obj.h"
 #include "pager.h"
 #include "procstream.h"
@@ -70,16 +71,20 @@
 static int
 octave_change_to_directory (const std::string& newdir)
 {
-  int cd_ok = octave_env::chdir (file_ops::tilde_expand (newdir));
+  std::string xdir = file_ops::tilde_expand (newdir);
+
+  int cd_ok = octave_env::chdir (xdir);
 
   if (cd_ok)
     {
       Vlast_chdir_time.stamp ();
 
-      // FIXME -- should this be handled as a list of functions
+      // FIXME -- should these actions be handled as a list of functions
       // to call so users can add their own chdir handlers?
 
       load_path::update ();
+
+      octave_link::change_directory (xdir);
     }
   else
     error ("%s: %s", newdir.c_str (), gnulib::strerror (errno));
--- a/libinterp/interpfcn/octave-link.cc	Thu Apr 04 17:18:16 2013 -0400
+++ b/libinterp/interpfcn/octave-link.cc	Fri Apr 05 00:40:12 2013 -0400
@@ -57,7 +57,7 @@
 
 octave_link::octave_link (void)
   : event_listener (0), event_queue_mutex (new octave_mutex ()),
-    gui_event_queue (), last_cwd (), debugging (false)
+    gui_event_queue (), debugging (false)
 {
   command_editor::add_event_hook (octave_readline_hook);
 
@@ -86,16 +86,6 @@
 void
 octave_link::do_generate_events (void)
 {
-  std::string current_working_directory = octave_env::get_current_directory ();
-
-  if (current_working_directory != last_cwd)
-    {
-      last_cwd = current_working_directory;
-
-      if (event_listener)
-        event_listener->current_directory_has_changed (last_cwd);
-    }
-
   if (debugging != Vdebugging)
     {
       debugging = Vdebugging;
@@ -133,12 +123,6 @@
     event_listener->about_to_exit ();
 }
 
-std::string
-octave_link::do_last_working_directory (void)
-{
-  return last_cwd;
-}
-
 bool
 octave_link::instance_ok (void)
 {
--- a/libinterp/interpfcn/octave-link.h	Thu Apr 04 17:18:16 2013 -0400
+++ b/libinterp/interpfcn/octave-link.h	Fri Apr 05 00:40:12 2013 -0400
@@ -108,10 +108,10 @@
       instance->do_finished_readline_hook ();
   }
 
-  static std::string last_working_directory (void)
+  static void change_directory (const std::string& dir)
   {
-    return instance_ok ()
-      ? instance->do_last_working_directory () : std::string ();
+    if (instance_ok ())
+      instance->do_change_directory (dir);
   }
 
   static void update_workspace (void)
@@ -201,9 +201,6 @@
   // Event Queue.
   event_queue gui_event_queue;
 
-  // Stores the last known current working directory of octave.
-  std::string last_cwd;
-
   bool debugging;
 
   void do_register_event_listener (octave_event_listener *oel);
@@ -234,7 +231,7 @@
   void do_entered_readline_hook (void) { }
   void do_finished_readline_hook (void) { }
 
-  std::string do_last_working_directory (void);
+  virtual void do_change_directory (const std::string& dir) = 0;
 
   virtual void do_update_workspace (void) = 0;