@@ -73,7 +73,7 @@ NotebookWindow::NotebookWindow(Cadabra *c, bool ro, std::string geometry, std::s
7373 , tex_running(false ), tex_need_width(0 )
7474 , last_find_location(doc.end(), std::string::npos)
7575 , is_configured(false )
76-
76+ , run_all_after_restart( false )
7777 {
7878 }
7979
@@ -287,6 +287,7 @@ void NotebookWindow::on_realize()
287287
288288 // Kernel menu actions.
289289 actiongroup->add_action ( " KernelRestart" , sigc::mem_fun (*this , &NotebookWindow::on_kernel_restart) );
290+ actiongroup->add_action ( " KernelRestartRun" , sigc::mem_fun (*this , &NotebookWindow::on_kernel_restart_and_run_all) );
290291
291292 // Tools menu actions.
292293 actiongroup->add_action ( " CompareFile" , sigc::mem_fun (*this , &NotebookWindow::compare_to_file) );
@@ -579,6 +580,10 @@ void NotebookWindow::on_realize()
579580 " <attribute name='label'>Restart kernel</attribute>"
580581 " <attribute name='action'>cdb.KernelRestart</attribute>"
581582 " </item>"
583+ " <item>"
584+ " <attribute name='label'>Restart kernel and run notebook</attribute>"
585+ " <attribute name='action'>cdb.KernelRestartRun</attribute>"
586+ " </item>"
582587 " </section>"
583588 " </submenu>"
584589 " <submenu>"
@@ -708,6 +713,13 @@ void NotebookWindow::on_realize()
708713 false ));
709714 tool_restart.get_accessible ()->set_name (" Restart kernel" );
710715
716+ // Restart-and-run-all button.
717+ tool_restart_and_run_all.add (*Gtk::make_managed<ImageArea>(
718+ 40 /display_scale, display_scale,
719+ install_prefix ()+" /share/cadabra2/cdb-icons/cdb-restart-and-run-all" +ICONEXT ,
720+ false ));
721+ tool_restart_and_run_all.get_accessible ()->set_name (" Restart kernel and run notebook" );
722+
711723 // Open button.
712724 tool_open.add (*Gtk::make_managed<ImageArea>(
713725 40 /display_scale, display_scale,
@@ -732,13 +744,15 @@ void NotebookWindow::on_realize()
732744 tool_stop.set_size_request (70 /display_scale, 70 /display_scale);
733745 tool_run.set_size_request (70 /display_scale, 70 /display_scale);
734746 tool_restart.set_size_request (70 /display_scale, 70 /display_scale);
747+ tool_restart_and_run_all.set_size_request (70 /display_scale, 70 /display_scale);
735748 tool_open.set_size_request (70 /display_scale, 70 /display_scale);
736749 tool_save.set_size_request (70 /display_scale, 70 /display_scale);
737750 tool_save_as.set_size_request (70 /display_scale, 70 /display_scale);
738751
739752 tool_run.set_tooltip_text (" Execute all cells" );
740753 tool_stop.set_tooltip_text (" Stop execution" );
741754 tool_restart.set_tooltip_text (" Restart kernel" );
755+ tool_restart_and_run_all.set_tooltip_text (" Restart kernel and run entire notebook" );
742756 tool_open.set_tooltip_text (" Open notebook..." );
743757 tool_save.set_tooltip_text (" Save notebook" );
744758 tool_save_as.set_tooltip_text (" Save notebook as..." );
@@ -750,6 +764,7 @@ void NotebookWindow::on_realize()
750764 toolbar.pack_start (tool_run, Gtk::PACK_SHRINK );
751765 toolbar.pack_start (tool_stop, Gtk::PACK_SHRINK );
752766 toolbar.pack_start (tool_restart, Gtk::PACK_SHRINK );
767+ toolbar.pack_start (tool_restart_and_run_all, Gtk::PACK_SHRINK );
753768 toolbar.pack_start (top_label);
754769 toolbar.pack_end (kernel_spinner, Gtk::PACK_SHRINK );
755770 kernel_spinner.set_size_request (50 /display_scale, 50 /display_scale);
@@ -766,6 +781,7 @@ void NotebookWindow::on_realize()
766781 tool_run.signal_clicked ().connect (sigc::mem_fun (*this , &NotebookWindow::run_all_cells));
767782 tool_stop.signal_clicked ().connect (sigc::mem_fun (*this , &NotebookWindow::on_run_stop));
768783 tool_restart.signal_clicked ().connect (sigc::mem_fun (*this , &NotebookWindow::on_kernel_restart));
784+ tool_restart_and_run_all.signal_clicked ().connect (sigc::mem_fun (*this , &NotebookWindow::on_kernel_restart_and_run_all));
769785
770786//
771787// Gtk::Widget *toolbar=0;
@@ -1144,16 +1160,19 @@ void NotebookWindow::set_stop_sensitive(bool s)
11441160
11451161void NotebookWindow::process_data ()
11461162 {
1163+ // std::cerr << "process_data() called" << std::endl;
11471164 dispatcher.emit ();
11481165 }
11491166
11501167
11511168void NotebookWindow::on_connect ()
11521169 {
1170+ // std::cerr << "kernel connected" << std::endl;
1171+
11531172 std::lock_guard<std::mutex> guard (status_mutex);
11541173 kernel_string = " connected" ;
11551174 progress_string = " Idle" ;
1156- dispatcher.emit ();
1175+ // dispatcher.emit();
11571176 dispatch_update_status.emit ();
11581177 console.initialize ();
11591178 // prefs.python_path might end in a backslash which will raise an EOF syntax error, so we add a
@@ -1163,10 +1182,17 @@ void NotebookWindow::on_connect()
11631182 if (!name.empty ()) {
11641183 console.send_input (" sys.path.insert(0, '''" + escape_backslashes (name.substr (0 , name.find_last_of (" \\ /" ))) + " ''')" );
11651184 }
1185+
1186+ if (run_all_after_restart) {
1187+ run_all_after_restart=false ;
1188+ std::shared_ptr<ActionBase> action = std::make_shared<ActionRunCell>();
1189+ queue_action (action);
1190+ }
11661191 }
11671192
11681193void NotebookWindow::on_disconnect (const std::string& reason)
11691194 {
1195+ // std::cerr << "***** kernel disconnected" << std::endl;
11701196 std::lock_guard<std::mutex> guard (status_mutex);
11711197 kernel_string = reason;
11721198 dispatcher.emit ();
@@ -1191,6 +1217,7 @@ void NotebookWindow::on_kernel_runstatus(bool running)
11911217 follow_last_cell=doc.end ();
11921218 }
11931219 }
1220+ // FIXME: WHY would we need to process the queue here?
11941221 dispatcher.emit ();
11951222 }
11961223
@@ -1251,6 +1278,8 @@ void NotebookWindow::process_todo_queue()
12511278 {
12521279 static bool running=false ;
12531280
1281+ // std::cerr << "process_todo_queue, running=" << running << std::endl;
1282+
12541283 // Prevent from re-entering this from the process_action_queue entered below.
12551284 if (running) return ;
12561285 running=true ;
@@ -1631,6 +1660,7 @@ void NotebookWindow::set_progress(const std::string& msg, int cur_step, int tota
16311660void NotebookWindow::update_status ()
16321661 {
16331662 // This should only be called from dispatch_update_status!
1663+ // This will then run on the GUI thread, as it should.
16341664
16351665 // Update status and progress, kernel status is taken card of in process_action_queue
16361666 std::lock_guard<std::mutex> guard (status_mutex);
@@ -2831,6 +2861,8 @@ void NotebookWindow::on_run_stop()
28312861void NotebookWindow::on_kernel_restart ()
28322862 {
28332863 // FIXME: add warnings
2864+ kernel_string = " restarting" ;
2865+ update_status ();
28342866 follow_last_cell=doc.end ();
28352867
28362868 compute->restart_kernel ();
@@ -2844,6 +2876,13 @@ void NotebookWindow::on_kernel_restart()
28442876 dispatch_update_status.emit ();
28452877 }
28462878
2879+ void NotebookWindow::on_kernel_restart_and_run_all ()
2880+ {
2881+ // Run all cells after the restart has completed.
2882+ run_all_after_restart=true ;
2883+ on_kernel_restart ();
2884+ }
2885+
28472886void NotebookWindow::on_help () const
28482887 {
28492888 if (current_cell==doc.end ()) return ;
0 commit comments