# HG changeset patch # User John W. Eaton # Date 1365096043 14400 # Node ID 5982d469f79bc21a9e1392751ea2573b58edff66 # Parent 1766d86550064657447fcd34f85c97dd6e4d6337 use signal for setting, appending to, and clearing history widget * history-dockwidget.h, history-dockwidget.cc (history_dock_widget::request_history_model_update, history_dock_widget::reset_model, history_dock_widget::update_history_callback): Delete. (history_dock_widget::set_history, history_dock_widget::append_history, history_dock_widget::clear_history): New functions. * main-window.h, main-window.cc (main_window::update_history): Delete. (main_window::construct): Delete connection from _octave_qt_event_listener::update_history_signal to main_window::update_history. Connect _octave_qt_link::set_history_signal to _history_dock_widget::set_history. Connect _octave_qt_link::append_history_signal to _history_dock_widget::append_history. Connect _octave_qt_link::clear_history_signal to _history_dock_widget::clear_history. (main_window::clear_history_callback): Call Fhistory instead of command_history::clear and _history_dock_widget->reset_model. * octave-main-thread.cc (octave_main_thread::run): Don't call octave_link::update_history. * octave-qt-event-listener.h, octave-qt-event-listener.cc (octave_qt_event_listener::update_history): Delete. (octave_qt_event_listener::update_history_signal): Delete. * octave-qt-link.h, octave-qt-link.cc (octave_qt_link::do_update_history): Delete. (octave_qt_link::do_set_history,octave_qt_link::do_append_history, octave_qt_link::do_clear_history): New functions. (octave_qt_link::do_post_input_event): Don't call do_update_history. (set_history_signal, append_history_signal, clear_history_signal): New signals. * octave-event-listener.h (octave_event_listener::update_history): Delete. * input.cc (octave_base_reader::octave_gets): Call command_history::add. * oct-hist.cc (do_history): New option, -c. Call octave_link history functions as needed. (initialize_history): Call octave_link::set_history. (octave_history_write_timestamp): Call octave_link::append_history. (Fedit_history): Document -c. * octave-link.h (octave_link::update_history, octave_link::do_update_history): Delete. (octave_link::set_history, octave_link::append_history, octave_link::clear_history, octave_link::do_set_history, octave_link::do_append_history, octave_link::do_clear_history, octave_link::do_pre_input_event, octave_link::do_post_input_event): New functions. diff --git a/libgui/src/history-dockwidget.cc b/libgui/src/history-dockwidget.cc --- a/libgui/src/history-dockwidget.cc +++ b/libgui/src/history-dockwidget.cc @@ -120,40 +120,24 @@ } void -history_dock_widget::request_history_model_update () +history_dock_widget::set_history (const QStringList& hist) { - octave_link::post_event (this, &history_dock_widget::update_history_callback); + _history_model->setStringList (hist); + _history_list_view->scrollToBottom (); } void -history_dock_widget::reset_model () +history_dock_widget::append_history (const QString& hist_entry) +{ + QStringList lst = _history_model->stringList (); + lst.append (hist_entry); + _history_model->setStringList (lst); + _history_list_view->scrollToBottom (); +} + +void +history_dock_widget::clear_history (void) { _history_model->setStringList (QStringList ()); } -void -history_dock_widget::update_history_callback (void) -{ - // Determine the client's (our) history length and the one of the server. - int clientHistoryLength = _history_model->rowCount (); - int serverHistoryLength = command_history::length (); - - // If were behind the server, iterate through all new entries and add - // them to our history. - if (clientHistoryLength < serverHistoryLength) - { - int elts_to_add = serverHistoryLength - clientHistoryLength; - - _history_model->insertRows (clientHistoryLength, elts_to_add); - - for (int i = clientHistoryLength; i < serverHistoryLength; i++) - { - std::string entry = command_history::get_entry (i); - - _history_model->setData (_history_model->index (i), - QString::fromUtf8 (entry.data (), entry.size ())); - } - - _history_list_view->scrollToBottom (); - } -} diff --git a/libgui/src/history-dockwidget.h b/libgui/src/history-dockwidget.h --- a/libgui/src/history-dockwidget.h +++ b/libgui/src/history-dockwidget.h @@ -35,11 +35,10 @@ public: history_dock_widget (QWidget *parent = 0); - void update_history_callback (void); - public slots: - void request_history_model_update (); - void reset_model (); + void set_history (const QStringList& hist); + void append_history (const QString& hist_entry); + void clear_history (void); signals: void information (const QString& message); diff --git a/libgui/src/main-window.cc b/libgui/src/main-window.cc --- a/libgui/src/main-window.cc +++ b/libgui/src/main-window.cc @@ -156,7 +156,7 @@ } void -main_window::handle_clear_history_request() +main_window::handle_clear_history_request (void) { octave_link::post_event (this, &main_window::clear_history_callback); } @@ -289,12 +289,6 @@ } void -main_window::update_history (void) -{ - _history_dock_widget->update_history_callback (); -} - -void main_window::change_current_working_directory () { QString directory = @@ -1145,11 +1139,6 @@ SLOT (update_workspace ())); connect (_octave_qt_event_listener, - SIGNAL (update_history_signal ()), - this, - SLOT (update_history ())); - - connect (_octave_qt_event_listener, SIGNAL (entered_debug_mode_signal ()), this, SLOT(handle_entered_debug_mode ())); @@ -1164,6 +1153,18 @@ _octave_qt_link = new octave_qt_link (); connect (_octave_qt_link, + SIGNAL (set_history_signal (const QStringList&)), + _history_dock_widget, SLOT (set_history (const QStringList&))); + + connect (_octave_qt_link, + SIGNAL (append_history_signal (const QString&)), + _history_dock_widget, SLOT (append_history (const QString&))); + + connect (_octave_qt_link, + SIGNAL (clear_history_signal (void)), + _history_dock_widget, SLOT (clear_history (void))); + + connect (_octave_qt_link, SIGNAL (update_dbstop_marker_signal (bool, const QString&, int)), _file_editor, SLOT (handle_update_dbstop_marker_request (bool, const QString&, int))); @@ -1209,9 +1210,7 @@ void main_window::clear_history_callback (void) { - command_history::clear (); - - _history_dock_widget->reset_model (); + Fhistory (ovl ("-c")); } void diff --git a/libgui/src/main-window.h b/libgui/src/main-window.h --- a/libgui/src/main-window.h +++ b/libgui/src/main-window.h @@ -71,7 +71,7 @@ void handle_save_workspace_request (); void handle_load_workspace_request (); void handle_clear_workspace_request (); - void handle_clear_history_request (); + void handle_clear_history_request (void); void handle_command_double_clicked (const QString& command); void new_file (); void open_file (); @@ -87,7 +87,6 @@ void reset_windows (); void current_working_directory_has_changed (const QString& directory); void update_workspace (void); - void update_history (void); void change_current_working_directory (); void set_current_working_directory (const QString& directory); void current_working_directory_up (); diff --git a/libgui/src/octave-main-thread.cc b/libgui/src/octave-main-thread.cc --- a/libgui/src/octave-main-thread.cc +++ b/libgui/src/octave-main-thread.cc @@ -50,8 +50,5 @@ octave_initialize_interpreter (octave_cmdline_argc, octave_cmdline_argv, octave_embedded); - // Prime the history list. - octave_link::update_history (); - octave_execute_interpreter (); } diff --git a/libgui/src/octave-qt-event-listener.cc b/libgui/src/octave-qt-event-listener.cc --- a/libgui/src/octave-qt-event-listener.cc +++ b/libgui/src/octave-qt-event-listener.cc @@ -48,12 +48,6 @@ } void -octave_qt_event_listener::update_history (void) -{ - emit update_history_signal (); -} - -void octave_qt_event_listener::about_to_exit () { qApp->quit (); diff --git a/libgui/src/octave-qt-event-listener.h b/libgui/src/octave-qt-event-listener.h --- a/libgui/src/octave-qt-event-listener.h +++ b/libgui/src/octave-qt-event-listener.h @@ -36,7 +36,6 @@ void current_directory_has_changed (const std::string& directory); void update_workspace (void); - void update_history (void); void about_to_exit (); void entered_debug_mode (); @@ -45,7 +44,6 @@ signals: void current_directory_has_changed_signal (const QString& directory); void update_workspace_signal (void); - void update_history_signal (void); void entered_debug_mode_signal (); void quit_debug_mode_signal (); }; diff --git a/libgui/src/octave-qt-link.cc b/libgui/src/octave-qt-link.cc --- a/libgui/src/octave-qt-link.cc +++ b/libgui/src/octave-qt-link.cc @@ -26,6 +26,10 @@ #include #endif +#include + +#include "str-vec.h" + #include "octave-qt-link.h" octave_qt_link::octave_qt_link (void) @@ -47,14 +51,26 @@ } void -octave_qt_link::do_update_history (void) +octave_qt_link::do_set_history (const string_vector& hist) { - if (event_listener) - { - event_listener->update_history (); + QStringList qt_hist; + + for (octave_idx_type i = 0; i < hist.length (); i++) + qt_hist.append (QString::fromStdString (hist[i])); + + emit set_history_signal (qt_hist); +} - do_process_events (); - } +void +octave_qt_link::do_append_history (const std::string& hist_entry) +{ + emit append_history_signal (QString::fromStdString (hist_entry)); +} + +void +octave_qt_link::do_clear_history (void) +{ + emit clear_history_signal (); } void @@ -66,7 +82,6 @@ void octave_qt_link::do_post_input_event (void) { - do_update_history (); } void diff --git a/libgui/src/octave-qt-link.h b/libgui/src/octave-qt-link.h --- a/libgui/src/octave-qt-link.h +++ b/libgui/src/octave-qt-link.h @@ -53,7 +53,9 @@ void do_update_workspace (void); - void do_update_history (void); + void do_set_history (const string_vector& hist); + void do_append_history (const std::string& hist_entry); + void do_clear_history (void); void do_pre_input_event (void); void do_post_input_event (void); @@ -82,6 +84,10 @@ signals: + void set_history_signal (const QStringList& hist); + void append_history_signal (const QString& hist_entry); + void clear_history_signal (void); + void update_dbstop_marker_signal (bool insert, const QString& file, int line); void edit_file_signal (const QString& file); diff --git a/libinterp/interp-core/octave-event-listener.h b/libinterp/interp-core/octave-event-listener.h --- a/libinterp/interp-core/octave-event-listener.h +++ b/libinterp/interp-core/octave-event-listener.h @@ -37,9 +37,6 @@ virtual void update_workspace (void) = 0; - virtual void - update_history (void) = 0; - virtual void about_to_exit () = 0; virtual void entered_debug_mode () = 0; diff --git a/libinterp/interpfcn/input.cc b/libinterp/interpfcn/input.cc --- a/libinterp/interpfcn/input.cc +++ b/libinterp/interpfcn/input.cc @@ -252,7 +252,12 @@ if (retval != "\n") { if (! history_skip_auto_repeated_debugging_command) - command_history::add (retval); + { + command_history::add (retval); + + if (! command_history::ignoring_entries ()) + octave_link::append_history (retval); + } octave_diary << retval; diff --git a/libinterp/interpfcn/oct-hist.cc b/libinterp/interpfcn/oct-hist.cc --- a/libinterp/interpfcn/oct-hist.cc +++ b/libinterp/interpfcn/oct-hist.cc @@ -48,6 +48,7 @@ #include "cmd-hist.h" #include "file-ops.h" #include "lo-mappers.h" +#include "octave-link.h" #include "oct-env.h" #include "oct-time.h" #include "str-vec.h" @@ -186,18 +187,29 @@ command_history::write (); else if (option == "-r") - // Read entire file. - command_history::read (); + { + // Read entire file. + command_history::read (); + octave_link::set_history (command_history::list ()); + } else if (option == "-n") - // Read 'new' history from file. - command_history::read_range (); + { + // Read 'new' history from file. + command_history::read_range (); + octave_link::set_history (command_history::list ()); + } else panic_impossible (); return hlist; } + else if (option == "-c") + { + command_history::clear (); + octave_link::clear_history (); + } else if (option == "-q") numbered_output = false; else if (option == "--") @@ -354,7 +366,10 @@ tmp.resize (len - 1); if (! tmp.empty ()) - command_history::add (tmp); + { + command_history::add (tmp); + octave_link::append_history (tmp); + } } } @@ -601,6 +616,8 @@ default_history_file (), default_history_size (), octave_env::getenv ("OCTAVE_HISTCONTROL")); + + octave_link::set_history (command_history::list ()); } void @@ -611,7 +628,10 @@ std::string timestamp = now.strftime (Vhistory_timestamp_format_string); if (! timestamp.empty ()) - command_history::add (timestamp); + { + command_history::add (timestamp); + octave_link::append_history (timestamp); + } } DEFUN (edit_history, args, , @@ -671,6 +691,9 @@ @itemx -@var{n}\n\ Display only the most recent @var{n} lines of history.\n\ \n\ +@item -c\n\ +Clear the history list.\n\ +\n\ @item -q\n\ Don't number the displayed lines of history. This is useful for cutting\n\ and pasting commands using the X Window System.\n\ diff --git a/libinterp/interpfcn/octave-link.h b/libinterp/interpfcn/octave-link.h --- a/libinterp/interpfcn/octave-link.h +++ b/libinterp/interpfcn/octave-link.h @@ -31,6 +31,7 @@ #include "octave-event-listener.h" class octave_mutex; +class string_vector; // \class OctaveLink // \brief Provides threadsafe access to octave. @@ -119,10 +120,22 @@ instance->do_update_workspace (); } - static void update_history (void) + static void set_history (const string_vector& hist) { if (instance_ok ()) - instance->do_update_history (); + instance->do_set_history (hist); + } + + static void append_history (const std::string& hist_entry) + { + if (instance_ok ()) + instance->do_append_history (hist_entry); + } + + static void clear_history (void) + { + if (instance_ok ()) + instance->do_clear_history (); } static void pre_input_event (void) @@ -225,7 +238,9 @@ virtual void do_update_workspace (void) = 0; - virtual void do_update_history (void) = 0; + virtual void do_set_history (const string_vector& hist) = 0; + virtual void do_append_history (const std::string& hist_entry) = 0; + virtual void do_clear_history (void) = 0; virtual void do_pre_input_event (void) = 0; virtual void do_post_input_event (void) = 0;