# HG changeset patch # User John W. Eaton # Date 1558618029 14400 # Node ID 04867eba64284858afa3234f199f20ffb94e8326 # Parent 1b575145197e7116977158d0e6f2355c1dd63956 function objects and signals/slots for errors and results diff -r 1b575145197e -r 04867eba6428 gui-main.cpp --- a/gui-main.cpp Thu May 23 07:41:18 2019 -0400 +++ b/gui-main.cpp Thu May 23 09:27:09 2019 -0400 @@ -42,7 +42,7 @@ static void redisplay (void) { if (calc_interaction_window) - calc_interaction_window->redisplay (); + emit calc_interaction_window->redisplay_signal (); } static void prep_term (int) @@ -74,7 +74,7 @@ calc_interaction_window->insert_at_end (buf.str ()); - calc_interaction_window->redisplay (); + emit calc_interaction_window->redisplay_signal (); } } @@ -108,12 +108,18 @@ setDocument (m_buffer); - connect (this, SIGNAL (result_available (double)), + connect (m_interpreter, SIGNAL (result_ready (double)), this, SLOT (handle_result (double))); + connect (m_interpreter, SIGNAL (error_signal (const QString&)), + this, SLOT (handle_error (const QString&))); + connect (this, SIGNAL (input_char_available (int)), this, SLOT (handle_input_char (int))); + connect (this, SIGNAL (redisplay_signal (void)), + this, SLOT (redisplay (void))); + connect (this, SIGNAL (accept_line_signal (const QString&)), m_interpreter, SLOT (accept_input_line (const QString&))); @@ -149,6 +155,26 @@ } } + void command_window::insert_at_end (const std::string& text) + { + scroll_to_bottom (); + + insert_at_cursor (text); + } + + void command_window::handle_error (const QString& msg) + { + insert_at_end ("parse error: " + msg.toStdString () + "\n"); + + rl_abort (0, 0); + } + + // FIXME: do we really need this extra function? + void command_window::handle_result (double value) + { + insert_result (value); + } + // Redisplay current command line. void command_window::redisplay (void) @@ -169,31 +195,6 @@ setTextCursor (cursor); } - void command_window::insert_at_end (const std::string& text) - { - scroll_to_bottom (); - - insert_at_cursor (text); - } - - void command_window::emit_error (const std::string& msg) - { - insert_at_end ("parse error: " + msg); - - rl_abort (0, 0); - } - - void command_window::emit_result (double value) - { - emit result_available (value); - } - - // FIXME: do we really need this extra function? - void command_window::handle_result (double value) - { - insert_result (value); - } - void command_window::keyPressEvent (QKeyEvent *event) { if (! event) @@ -391,16 +392,6 @@ return status; } - - void emit_error (const std::string& msg) - { - calc_interaction_window->emit_error (msg); - } - - void emit_result (double value) - { - calc_interaction_window->emit_result (value); - } } // -- Variable: rl_getc_func_t * rl_getc_function diff -r 1b575145197e -r 04867eba6428 gui-main.h --- a/gui-main.h Thu May 23 07:41:18 2019 -0400 +++ b/gui-main.h Thu May 23 09:27:09 2019 -0400 @@ -32,8 +32,6 @@ // Redisplay current command line. - void redisplay (void); - void insert_at_end (const std::string& text); void emit_error (const std::string& msg); @@ -44,16 +42,20 @@ void input_char_available (int key); - void result_available (double value); + void accept_line_signal (const QString& line); - void accept_line_signal (const QString& line); + void redisplay_signal (void); public slots: void handle_input_char (int key); + void handle_error (const QString& msg); + void handle_result (double value); + void redisplay (void); + protected: void keyPressEvent (QKeyEvent *event); @@ -88,10 +90,6 @@ }; extern int main (int argc, char **argv); - - extern void emit_error (const std::string& msg); - - extern void emit_result (double value); } #endif diff -r 1b575145197e -r 04867eba6428 interpreter.cpp --- a/interpreter.cpp Thu May 23 07:41:18 2019 -0400 +++ b/interpreter.cpp Thu May 23 09:27:09 2019 -0400 @@ -15,6 +15,10 @@ interpreter *interpreter::the_interpreter = nullptr; interpreter::interpreter (void) + : m_error_handler ([] (const char *msg) + { std::cerr << "error: " << msg << std::endl; }), + m_result_handler ([] (double value) + { std::cout << value << std::endl; }) { if (the_interpreter) { @@ -42,17 +46,11 @@ // Simulate a delay in calculation. sleep (1); - if (calc::tty_mode) - tty::emit_result (value); - else - gui::emit_result (value); + m_result_handler (value); } void interpreter::emit_error (const char *msg) { - if (calc::tty_mode) - tty::emit_error (msg); - else - gui::emit_error (msg); + m_error_handler (msg); } } diff -r 1b575145197e -r 04867eba6428 interpreter.h --- a/interpreter.h Thu May 23 07:41:18 2019 -0400 +++ b/interpreter.h Thu May 23 09:27:09 2019 -0400 @@ -1,6 +1,8 @@ #if ! defined (calc_interpreter_h) #define calc_interpreter_h 1 +#include + namespace calc { class interpreter @@ -19,11 +21,30 @@ int parse_and_execute (const std::string& line); + std::function + set_error_handler (const std::function& error_handler) + { + std::function tmp = m_error_handler; + m_error_handler = error_handler; + return tmp; + } + + std::function + set_result_handler (const std::function& result_handler) + { + std::function tmp = m_result_handler; + m_result_handler = result_handler; + return tmp; + } + void emit_error (const char *msg); void emit_result (double value); private: + + std::function m_error_handler; + std::function m_result_handler; }; } diff -r 1b575145197e -r 04867eba6428 qt-interpreter.cpp --- a/qt-interpreter.cpp Thu May 23 07:41:18 2019 -0400 +++ b/qt-interpreter.cpp Thu May 23 09:27:09 2019 -0400 @@ -1,3 +1,4 @@ +#include #include #include @@ -13,7 +14,13 @@ { qt_interpreter::qt_interpreter (void) : m_interpreter () - { } + { + m_interpreter.set_error_handler ([this] (const char *msg) + { emit this->error_signal (msg); }); + + m_interpreter.set_result_handler ([this] (double value) + { emit this->result_ready (value); }); + } void qt_interpreter::execute (void) { diff -r 1b575145197e -r 04867eba6428 qt-interpreter.h --- a/qt-interpreter.h Thu May 23 07:41:18 2019 -0400 +++ b/qt-interpreter.h Thu May 23 09:27:09 2019 -0400 @@ -22,6 +22,12 @@ qt_interpreter& operator = (const qt_interpreter&) = delete; + signals: + + void result_ready (double); + + void error_signal (const QString&); + public slots: void execute (void);