Mercurial > hg > octave-nkf
view libgui/src/dialog.h @ 16570:d5ae5aa80d42
preserve pending command line input when running commands from GUI actions
* QTerminal.h, QTerminal.cc (QTerminal::relay_command): Delete.
* file-editor-tab.cc (file_editor_tab::run_file_callback): New
argument, bp_info. Save pending command line input and execute
command.
(file_editor_tab::run_file): Use octave_link to execute file.
* main-window.h, main-window.cc
(main_window::execute_command_in_terminal): Rename from
main_window::handle_command_double_clicked. Post event through
octave_link to execute command.
(main_window::construct_octave_qt_link): Connect
_octave_qt_link::execute_command_in_terminal_signal to
main_window::execute_command_in_terminal.
(main_window::execute_command_callback): New function.
(main_window::relay_command_signal): Delete signal. Remove all uses.
* octave-qt-link.h, octave-qt-link.cc
(octave_qt_link::do_execute_command_in_terminal): New function.
(octave_qt_link::execute_command_in_terminal_signal): New signal.
* terminal-dock-widget.h, terminal-dock-widget.cc
(terminal_dock_widget::relay_command_signal): Delete signal. Remove
all uses.
* octave-link.h (octave_link::execute_command_in_terminal,
octave_link::do_execute_command_in_terminal): New functions.
* cmd-edit.h, cmd-edit.cc
(command_editor::pre_input_hook_set): New variable.
(gnu_readline::previous_pre_input_hook,
command_editor::intial_input): New member variables.
(command_editor::restore_pre_input_hook,
command_editor::do_get_current_line,
command_editor::do_replace_line, command_editor::set_pre_input_hook,
gnu_readline::do_get_current_line, gnu_readline::do_replace_line,
gnu_readline::set_pre_input_hook, command_editor::set_initial_input,
gnu_readline::restore_pre_input_hook,
default_command_editor::do_get_current_line,
default_command_editor::do_replace_line,
command_editor::insert_initial_input,
command_editor::pre_input_handler, command_editor::get_current_line,
command_editor::replace_line, command_editor::add_pre_input_hook,
command_editor::do_insert_initial_input,
command_editor::set_pre_input_hook,
command_editor::restore_pre_input_hook): New functions.
(command_editor::readline): Handle initial input.
(command_editor::interrupt): Give argument a default value.
* oct-rl-edit.h, oct-rl-edit.c (octave_rl_copy_line,
octave_rl_replace_line, octave_rl_set_pre_input_hook,
octave_rl_get_pre_input_hook): New functions.
(rl_pre_input_hook_fcn_ptr): New typedef.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 25 Apr 2013 17:57:55 -0400 |
parents | e4b94abfeb96 |
children | 7f8db1942dc0 |
line wrap: on
line source
/* Copyright (C) 2013 John W. Eaton Copyright (C) 2013 Daniel J. Sebald This file is part of Octave. Octave is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Octave is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Octave; see the file COPYING. If not, see <http://www.gnu.org/licenses/>. */ #if !defined (octave_guifcn_dialog_h) #define octave_guifcn_dialog_h 1 #include <QMutex> #include <QWaitCondition> #include <QAbstractButton> #include <QList> #include <QItemSelectionModel> #include <QDialog> #include <QMessageBox> #include <QLineEdit> // Defined for purposes of sending QList<int> as part of signal. typedef QList<int> QIntList; // Defined for purposes of sending QList<float> as part of signal. typedef QList<float> QFloatList; class QUIWidgetCreator : public QObject { Q_OBJECT public: QUIWidgetCreator (void); ~QUIWidgetCreator (void); public: void signal_dialog (const QString& message, const QString& title, const QString& icon, const QStringList& button, const QString& defbutton, const QStringList& role) { // Use the last button in the list as the reject result, i.e., when no // button is pressed such as in the case of the upper right close tab. if (!button.isEmpty ()) dialog_button = button.last (); QString xicon = icon; if (xicon.isEmpty ()) xicon = "none"; emit create_dialog (message, title, xicon, button, defbutton, role); }; int get_dialog_result (void) { return dialog_result; } QString get_dialog_button (void) { return dialog_button; } bool signal_listview (const QStringList& list, const QString& mode, int wd, int ht, const QList<int>& initial, const QString& name, const QStringList& prompt, const QString& ok_string, const QString& cancel_string) { if (list.isEmpty ()) return false; emit create_listview (list, mode, wd, ht, initial, name, prompt, ok_string, cancel_string); return true; }; const QIntList *get_list_index (void) { return list_index; } bool signal_inputlayout (const QStringList& prompt, const QString& title, const QFloatList& nr, const QFloatList& nc, const QStringList& defaults) { if (prompt.isEmpty ()) return false; emit create_inputlayout (prompt, title, nr, nc, defaults); return true; }; const QStringList *get_string_list (void) { return string_list; } void wait (void) { // Wait while the user is responding to message box. waitcondition.wait (&mutex); } signals: void create_dialog (const QString&, const QString&, const QString&, const QStringList&, const QString&, const QStringList&); void create_listview (const QStringList&, const QString&, int, int, const QIntList&, const QString&, const QStringList&, const QString&, const QString&); void create_inputlayout (const QStringList&, const QString&, const QFloatList&, const QFloatList&, const QStringList&); public slots: void dialog_button_clicked (QAbstractButton *button); void list_select_finished (const QIntList& selected, const int button_pressed); void input_finished (const QStringList& input, const int button_pressed); private: int dialog_result; QString dialog_button; // The list could conceivably be big. Not sure how things are // stored internally, so keep off of the stack. QStringList *string_list; QIntList *list_index; // GUI objects cannot be accessed in the non-GUI thread. However, // signals can be sent to slots across threads with proper // synchronization. Hence, the use of QWaitCondition. QMutex mutex; QWaitCondition waitcondition; }; extern QUIWidgetCreator uiwidget_creator; class MessageDialog : public QMessageBox { Q_OBJECT public: explicit MessageDialog (const QString& message, const QString& title, const QString& icon, const QStringList& button, const QString& defbutton, const QStringList& role); private: void closeEvent (QCloseEvent *) { // Reroute the close tab to a button click so there is only a single // route to waking the wait condition. emit buttonClicked (0); } }; class ListDialog : public QDialog { Q_OBJECT QItemSelectionModel *selector; public: explicit ListDialog (const QStringList& list, const QString& mode, int width, int height, const QList<int>& initial, const QString& name, const QStringList& prompt, const QString& ok_string, const QString& cancel_string); signals: void finish_selection (const QIntList&, const int); public slots: void buttonOk_clicked (void); void buttonCancel_clicked (void); void reject (void); }; class InputDialog : public QDialog { Q_OBJECT QList<QLineEdit *> input_line; public: explicit InputDialog (const QStringList& prompt, const QString& title, const QFloatList& nr, const QFloatList& nc, const QStringList& defaults); signals: void finish_input (const QStringList&, const int); public slots: void buttonOk_clicked (void); void buttonCancel_clicked (void); void reject (void); }; #endif