Mercurial > hg > octave-lyh
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 +++ b/libgui/src/files-dockwidget.cc @@ -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 +++ b/libgui/src/files-dockwidget.h @@ -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 +++ b/libgui/src/m-editor/file-editor-tab.cc @@ -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 +++ b/libgui/src/main-window.cc @@ -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 +++ b/libgui/src/main-window.h @@ -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 +++ b/libgui/src/octave-qt-link.cc @@ -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 +++ b/libgui/src/octave-qt-link.h @@ -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 +++ b/libinterp/interp-core/octave-event-listener.h @@ -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 +++ b/libinterp/interpfcn/dirfns.cc @@ -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 +++ b/libinterp/interpfcn/octave-link.cc @@ -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 +++ b/libinterp/interpfcn/octave-link.h @@ -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;