mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	OnActivate handler to:
1) Process delayed error messages from background processing 2) Set keyboard focus to the 3D scene if no wx window has keyboard focus.
This commit is contained in:
		
							parent
							
								
									35b4777e0e
								
							
						
					
					
						commit
						435b5394f7
					
				
					 4 changed files with 43 additions and 5 deletions
				
			
		|  | @ -65,9 +65,9 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt | |||
| 
 | ||||
|     auto *sizer = new wxBoxSizer(wxVERTICAL); | ||||
| 
 | ||||
|     const auto font_title = GetFont().MakeBold().Scaled(1.3); | ||||
|     const auto font_title = GetFont().MakeBold().Scaled(1.3f); | ||||
|     const auto font_name = GetFont().MakeBold(); | ||||
|     const auto font_alt_nozzle = GetFont().Scaled(0.9); | ||||
|     const auto font_alt_nozzle = GetFont().Scaled(0.9f); | ||||
| 
 | ||||
|     // wxGrid appends widgets by rows, but we need to construct them in columns.
 | ||||
|     // These vectors are used to hold the elements so that they can be appended in the right order.
 | ||||
|  | @ -789,7 +789,7 @@ void ConfigWizardIndex::on_mouse_move(wxMouseEvent &evt) | |||
| 
 | ||||
|     const ssize_t item_hover_new = pos.y / item_height(); | ||||
| 
 | ||||
|     if (item_hover_new < items.size() && item_hover_new != item_hover) { | ||||
| 	if (item_hover_new < ssize_t(items.size()) && item_hover_new != item_hover) { | ||||
|         item_hover = item_hover_new; | ||||
|         Refresh(); | ||||
|     } | ||||
|  |  | |||
|  | @ -105,6 +105,11 @@ wxFrame(NULL, wxID_ANY, SLIC3R_BUILD, wxDefaultPosition, wxDefaultSize, wxDEFAUL | |||
|         event.Skip(); | ||||
|     }); | ||||
| 
 | ||||
|     Bind(wxEVT_ACTIVATE, [this](wxActivateEvent& event) { | ||||
|         if (m_plater != nullptr && event.GetActive()) | ||||
|             m_plater->on_activate(); | ||||
|     }); | ||||
| 
 | ||||
|     wxGetApp().persist_window_geometry(this); | ||||
| 
 | ||||
|     update_ui_from_settings();    // FIXME (?)
 | ||||
|  |  | |||
|  | @ -962,6 +962,7 @@ struct Plater::priv | |||
|     std::atomic<bool>           arranging; | ||||
|     std::atomic<bool>           rotoptimizing; | ||||
|     bool                        delayed_scene_refresh; | ||||
|     std::string                 delayed_error_message; | ||||
| 
 | ||||
|     wxTimer                     background_process_timer; | ||||
| 
 | ||||
|  | @ -1947,6 +1948,8 @@ unsigned int Plater::priv::update_background_process(bool force_validation) | |||
|     this->background_process_timer.Stop(); | ||||
|     // Update the "out of print bed" state of ModelInstances.
 | ||||
|     this->update_print_volume_state(); | ||||
|     // The delayed error message is no more valid.
 | ||||
|     this->delayed_error_message.clear(); | ||||
|     // Apply new config to the possibly running background task.
 | ||||
|     bool               was_running = this->background_process.running(); | ||||
|     Print::ApplyStatus invalidated = this->background_process.apply(this->q->model(), wxGetApp().preset_bundle->full_config()); | ||||
|  | @ -1985,8 +1988,18 @@ unsigned int Plater::priv::update_background_process(bool force_validation) | |||
|                 return_state |= UPDATE_BACKGROUND_PROCESS_RESTART; | ||||
|         } else { | ||||
|             // The print is not valid.
 | ||||
|             // The error returned from the Print needs to be translated into the local language.
 | ||||
|             GUI::show_error(this->q, _(err)); | ||||
|             // Only show the error message immediately, if the top level parent of this window is active.
 | ||||
|             auto p = dynamic_cast<wxWindow*>(this->q); | ||||
|             while (p->GetParent()) | ||||
|                 p = p->GetParent(); | ||||
|             auto *top_level_wnd = dynamic_cast<wxTopLevelWindow*>(p); | ||||
|             if (top_level_wnd && top_level_wnd->IsActive()) { | ||||
|                 // The error returned from the Print needs to be translated into the local language.
 | ||||
|                 GUI::show_error(this->q, _(err)); | ||||
|             } else { | ||||
|                 // Show the error message once the main window gets activated.
 | ||||
|                 this->delayed_error_message = _(err); | ||||
|             } | ||||
|             return_state |= UPDATE_BACKGROUND_PROCESS_INVALID; | ||||
|         } | ||||
|     } | ||||
|  | @ -3095,6 +3108,24 @@ void Plater::on_config_change(const DynamicPrintConfig &config) | |||
|         this->p->schedule_background_process(); | ||||
| } | ||||
| 
 | ||||
| void Plater::on_activate() | ||||
| { | ||||
|     wxWindow *focus_window = wxWindow::FindFocus(); | ||||
|     if (focus_window == nullptr) { | ||||
| 		// Activating the main frame, and no window has keyboard focus.
 | ||||
| 		// Set the keyboard focus to the visible Canvas3D.
 | ||||
|         if (this->p->view3D->IsShown()) | ||||
| 			this->p->view3D->get_wxglcanvas()->SetFocus(); | ||||
| 		else if (this->p->preview->IsShown()) | ||||
| 			this->p->preview->get_wxglcanvas()->SetFocus(); | ||||
|     } | ||||
|     if (! this->p->delayed_error_message.empty()) { | ||||
| 		std::string msg = std::move(this->p->delayed_error_message); | ||||
| 		this->p->delayed_error_message.clear(); | ||||
|         GUI::show_error(this, msg); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| const wxString& Plater::get_project_filename() const | ||||
| { | ||||
|     return p->project_filename; | ||||
|  |  | |||
|  | @ -151,6 +151,8 @@ public: | |||
| 
 | ||||
|     void on_extruders_change(int extruders_count); | ||||
|     void on_config_change(const DynamicPrintConfig &config); | ||||
|     // On activating the parent window.
 | ||||
|     void on_activate(); | ||||
| 
 | ||||
|     void update_object_menu(); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bubnikv
						bubnikv