mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Example implementation of C++ to Perl callbacks using wxWidgets command events.
This commit is contained in:
		
							parent
							
								
									ea8b3a5dc0
								
							
						
					
					
						commit
						1d10a2293a
					
				
					 6 changed files with 73 additions and 22 deletions
				
			
		| 
						 | 
				
			
			@ -11,13 +11,19 @@ use List::Util qw(min first);
 | 
			
		|||
use Slic3r::Geometry qw(X Y);
 | 
			
		||||
use Wx qw(:frame :bitmap :id :misc :notebook :panel :sizer :menu :dialog :filedialog
 | 
			
		||||
    :font :icon wxTheApp);
 | 
			
		||||
use Wx::Event qw(EVT_CLOSE EVT_MENU EVT_NOTEBOOK_PAGE_CHANGED);
 | 
			
		||||
use Wx::Event qw(EVT_CLOSE EVT_COMMAND EVT_MENU EVT_NOTEBOOK_PAGE_CHANGED);
 | 
			
		||||
use base 'Wx::Frame';
 | 
			
		||||
 | 
			
		||||
our $qs_last_input_file;
 | 
			
		||||
our $qs_last_output_file;
 | 
			
		||||
our $last_config;
 | 
			
		||||
 | 
			
		||||
# Events to be sent from a C++ Tab implementation:
 | 
			
		||||
# 1) To inform about a change of a configuration value.
 | 
			
		||||
our $VALUE_CHANGE_EVENT    = Wx::NewEventType;
 | 
			
		||||
# 2) To inform about a preset selection change or a "modified" status change.
 | 
			
		||||
our $PRESETS_CHANGED_EVENT = Wx::NewEventType;
 | 
			
		||||
 | 
			
		||||
sub new {
 | 
			
		||||
    my ($class, %params) = @_;
 | 
			
		||||
    
 | 
			
		||||
| 
						 | 
				
			
			@ -151,8 +157,19 @@ sub _init_tabpanel {
 | 
			
		|||
        $panel->AddPage($tab, $tab->title);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#TODO this is an example of a Slic3r XS interface call to add a new preset editor page to the main view.
 | 
			
		||||
    Slic3r::GUI::create_preset_tabs(wxTheApp->{preset_bundle}, wxTheApp->{app_config});
 | 
			
		||||
    #TODO this is an example of a Slic3r XS interface call to add a new preset editor page to the main view.
 | 
			
		||||
    # The following event is emited by the C++ Tab implementation on config value change.
 | 
			
		||||
    EVT_COMMAND($self, -1, $VALUE_CHANGE_EVENT, sub {
 | 
			
		||||
        my ($self, $event) = @_;
 | 
			
		||||
        print "VALUE_CHANGE_EVENT: ", $event->GetString, "\n";
 | 
			
		||||
    });
 | 
			
		||||
    # The following event is emited by the C++ Tab implementation on preset selection,
 | 
			
		||||
    # or when the preset's "modified" status changes.
 | 
			
		||||
    EVT_COMMAND($self, -1, $PRESETS_CHANGED_EVENT, sub {
 | 
			
		||||
        my ($self, $event) = @_;
 | 
			
		||||
        print "PRESETS_CHANGED_EVENT: ", $event->GetString, "\n";
 | 
			
		||||
    });
 | 
			
		||||
    Slic3r::GUI::create_preset_tabs(wxTheApp->{preset_bundle}, wxTheApp->{app_config}, $VALUE_CHANGE_EVENT, $PRESETS_CHANGED_EVENT);
 | 
			
		||||
    
 | 
			
		||||
    if ($self->{plater}) {
 | 
			
		||||
        $self->{plater}->on_select_preset(sub {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -185,7 +185,7 @@ void add_debug_menu(wxMenuBar *menu)
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void create_preset_tabs(PresetBundle *preset_bundle, AppConfig *app_config)
 | 
			
		||||
void create_preset_tabs(PresetBundle *preset_bundle, AppConfig *app_config, int event_value_change, int event_presets_changed)
 | 
			
		||||
{	
 | 
			
		||||
	add_created_tab(new TabPrint   (g_wxTabPanel, "Print"),    preset_bundle, app_config);
 | 
			
		||||
	add_created_tab(new TabFilament(g_wxTabPanel, "Filament"), preset_bundle, app_config);
 | 
			
		||||
| 
						 | 
				
			
			@ -196,6 +196,13 @@ void create_preset_tabs(PresetBundle *preset_bundle, AppConfig *app_config)
 | 
			
		|||
			panel->GetName().compare("Filament") == 0)
 | 
			
		||||
			panel->OnActivate();
 | 
			
		||||
	}), g_wxTabPanel->GetId() );
 | 
			
		||||
	for (size_t i = 0; i < g_wxTabPanel->GetPageCount(); ++ i) {
 | 
			
		||||
		Tab *tab = dynamic_cast<Tab*>(g_wxTabPanel->GetPage(i));
 | 
			
		||||
		if (! tab)
 | 
			
		||||
			continue;
 | 
			
		||||
		tab->set_event_value_change(wxEventType(event_value_change));
 | 
			
		||||
		tab->set_event_presets_changed(wxEventType(event_presets_changed));
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void change_opt_value(DynamicPrintConfig& config, t_config_option_key opt_key, boost::any value)
 | 
			
		||||
| 
						 | 
				
			
			@ -282,7 +289,7 @@ void add_created_tab(Tab* panel, PresetBundle *preset_bundle, AppConfig *app_con
 | 
			
		|||
	panel->m_show_btn_incompatible_presets = app_config->get("show_incompatible_presets").empty();
 | 
			
		||||
	panel->create_preset_tab(preset_bundle);
 | 
			
		||||
	// Callback to be executed after any of the configuration fields(Perl class Slic3r::GUI::OptionsGroup::Field) change their value.
 | 
			
		||||
	panel->m_on_value_change = [/*this*/](std::string opt_key, boost::any value){
 | 
			
		||||
//	panel->m_on_value_change = [/*this*/](std::string opt_key, boost::any value){
 | 
			
		||||
	//! plater & loaded - variables of MainFrame
 | 
			
		||||
// 		if (plater) {
 | 
			
		||||
// 			plater->on_config_change(m_config); //# propagate config change events to the plater
 | 
			
		||||
| 
						 | 
				
			
			@ -290,11 +297,11 @@ void add_created_tab(Tab* panel, PresetBundle *preset_bundle, AppConfig *app_con
 | 
			
		|||
// 		}
 | 
			
		||||
		// don't save while loading for the first time
 | 
			
		||||
//		if (loaded && Slic3r::GUI::autosave) m_config->save(Slic3r::GUI::autosave) ;
 | 
			
		||||
	};
 | 
			
		||||
//	};
 | 
			
		||||
 | 
			
		||||
	// Install a callback for the tab to update the platter and print controller presets, when
 | 
			
		||||
	// a preset changes at Slic3r::GUI::Tab.
 | 
			
		||||
	panel->m_on_presets_changed = [](){
 | 
			
		||||
//	panel->m_on_presets_changed = [](){
 | 
			
		||||
// 		if ($self->{plater}) {
 | 
			
		||||
// 			# Update preset combo boxes(Print settings, Filament, Printer) from their respective tabs.
 | 
			
		||||
// 			$self->{plater}->update_presets($tab_name, @_);
 | 
			
		||||
| 
						 | 
				
			
			@ -313,7 +320,7 @@ void add_created_tab(Tab* panel, PresetBundle *preset_bundle, AppConfig *app_con
 | 
			
		|||
// 			}
 | 
			
		||||
// 			$self->{plater}->on_config_change($tab->{presets}->get_current_preset->config);
 | 
			
		||||
// 		}
 | 
			
		||||
	};
 | 
			
		||||
//	};
 | 
			
		||||
 | 
			
		||||
	// Load the currently selected preset into the GUI, update the preset selection box.
 | 
			
		||||
	panel->load_current_preset();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,7 +35,7 @@ void set_tab_panel(wxNotebook *tab_panel);
 | 
			
		|||
 | 
			
		||||
void add_debug_menu(wxMenuBar *menu);
 | 
			
		||||
// Create a new preset tab (print, filament and printer),
 | 
			
		||||
void create_preset_tabs(PresetBundle *preset_bundle, AppConfig *app_config);
 | 
			
		||||
void create_preset_tabs(PresetBundle *preset_bundle, AppConfig *app_config, int event_value_change, int event_presets_changed);
 | 
			
		||||
// add it at the end of the tab panel.
 | 
			
		||||
void add_created_tab(Tab* panel, PresetBundle *preset_bundle, AppConfig *app_config);
 | 
			
		||||
// Change option value in config
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -269,14 +269,34 @@ void Tab::load_key_value(std::string opt_key, boost::any value)
 | 
			
		|||
	update();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
extern wxFrame *g_wxMainFrame;
 | 
			
		||||
 | 
			
		||||
void Tab::on_value_change(std::string opt_key, boost::any value)
 | 
			
		||||
{
 | 
			
		||||
//	if (m_on_value_change != nullptr)
 | 
			
		||||
//		m_on_value_change(opt_key, value);
 | 
			
		||||
	if (m_event_value_change > 0) {
 | 
			
		||||
		wxCommandEvent event(m_event_value_change);
 | 
			
		||||
		event.SetString(opt_key);
 | 
			
		||||
		g_wxMainFrame->ProcessWindowEvent(event);
 | 
			
		||||
	}
 | 
			
		||||
	update();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Call a callback to update the selection of presets on the platter:
 | 
			
		||||
// To update the content of the selection boxes,
 | 
			
		||||
// to update the filament colors of the selection boxes,
 | 
			
		||||
// to update the "dirty" flags of the selection boxes,
 | 
			
		||||
// to uddate number of "filament" selection boxes when the number of extruders change.
 | 
			
		||||
void Tab::on_presets_changed(/*std::vector<std::string> reload_dependent_tabs*/){
 | 
			
		||||
	if (m_on_presets_changed != nullptr)
 | 
			
		||||
		m_on_presets_changed(/*m_presets, reload_dependent_tabs*/);
 | 
			
		||||
void Tab::on_presets_changed(/*std::vector<std::string> reload_dependent_tabs*/)
 | 
			
		||||
{
 | 
			
		||||
//	if (m_on_presets_changed != nullptr)
 | 
			
		||||
//		m_on_presets_changed(/*m_presets, reload_dependent_tabs*/);
 | 
			
		||||
	if (m_event_presets_changed > 0) {
 | 
			
		||||
		wxCommandEvent event(m_event_presets_changed);
 | 
			
		||||
		//event.SetString(opt_key);
 | 
			
		||||
		g_wxMainFrame->ProcessWindowEvent(event);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Tab::reload_compatible_printers_widget()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -98,14 +98,18 @@ protected:
 | 
			
		|||
 | 
			
		||||
	std::vector<std::string>	m_reload_dependent_tabs = {};
 | 
			
		||||
 | 
			
		||||
	// The two following two event IDs are generated at Plater.pm by calling Wx::NewEventType.
 | 
			
		||||
	wxEventType			m_event_value_change = 0;
 | 
			
		||||
	wxEventType 		m_event_presets_changed = 0;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	PresetBundle*		m_preset_bundle;
 | 
			
		||||
	bool				m_no_controller;
 | 
			
		||||
	bool				m_show_btn_incompatible_presets;
 | 
			
		||||
	PresetCollection*	m_presets;
 | 
			
		||||
	DynamicPrintConfig*	m_config;
 | 
			
		||||
	t_change			m_on_value_change{ nullptr };
 | 
			
		||||
	std::function<void()>	m_on_presets_changed{ nullptr };
 | 
			
		||||
//	t_change			m_on_value_change{ nullptr };
 | 
			
		||||
//	std::function<void()>	m_on_presets_changed{ nullptr };
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	Tab() {}
 | 
			
		||||
| 
						 | 
				
			
			@ -116,13 +120,12 @@ public:
 | 
			
		|||
 | 
			
		||||
	wxWindow*	parent() const { return m_parent; }
 | 
			
		||||
	wxString	title()	 const { return m_title; }
 | 
			
		||||
 | 
			
		||||
	// Set the events to the callbacks posted to the main frame window (currently implemented in Perl).
 | 
			
		||||
	void 		set_event_value_change(wxEventType evt) { m_event_value_change = evt; }
 | 
			
		||||
	void 		set_event_presets_changed(wxEventType evt) { m_event_presets_changed = evt; }
 | 
			
		||||
	
 | 
			
		||||
	void		create_preset_tab(PresetBundle *preset_bundle);
 | 
			
		||||
	void		on_value_change(std::string opt_key, boost::any value){
 | 
			
		||||
		if (m_on_value_change != nullptr)
 | 
			
		||||
			m_on_value_change(opt_key, value);
 | 
			
		||||
		update();
 | 
			
		||||
	};
 | 
			
		||||
	void		load_current_preset();
 | 
			
		||||
	void		rebuild_page_tree();
 | 
			
		||||
	void		select_preset(wxString preset_name = "");
 | 
			
		||||
| 
						 | 
				
			
			@ -130,7 +133,6 @@ public:
 | 
			
		|||
	wxSizer*	compatible_printers_widget(wxWindow* parent, wxCheckBox** checkbox, wxButton** btn);
 | 
			
		||||
 | 
			
		||||
	void		load_key_value(std::string opt_key, boost::any value);
 | 
			
		||||
	void		on_presets_changed();
 | 
			
		||||
	void		reload_compatible_printers_widget();
 | 
			
		||||
 | 
			
		||||
	void		OnTreeSelChange(wxTreeEvent& event);
 | 
			
		||||
| 
						 | 
				
			
			@ -155,6 +157,11 @@ public:
 | 
			
		|||
	Field*			get_field(t_config_option_key opt_key, int opt_index = -1) const;
 | 
			
		||||
	bool			set_value(t_config_option_key opt_key, boost::any value);
 | 
			
		||||
	wxSizer*		description_line_widget(wxWindow* parent, ogStaticText** StaticText);
 | 
			
		||||
 | 
			
		||||
	void			on_value_change(std::string opt_key, boost::any value);
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
	void			on_presets_changed();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//Slic3r::GUI::Tab::Print;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,5 +35,5 @@ void set_tab_panel(SV *ui)
 | 
			
		|||
void add_debug_menu(SV *ui)
 | 
			
		||||
    %code%{ Slic3r::GUI::add_debug_menu((wxMenuBar*)wxPli_sv_2_object(aTHX_ ui, "Wx::MenuBar")); %};
 | 
			
		||||
 | 
			
		||||
void create_preset_tabs(PresetBundle *preset_bundle, AppConfig *app_config)
 | 
			
		||||
    %code%{ Slic3r::GUI::create_preset_tabs(preset_bundle, app_config); %};
 | 
			
		||||
void create_preset_tabs(PresetBundle *preset_bundle, AppConfig *app_config, int event_value_change, int event_presets_changed)
 | 
			
		||||
    %code%{ Slic3r::GUI::create_preset_tabs(preset_bundle, app_config, event_value_change, event_presets_changed); %};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue