mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-29 19:53:44 -06:00 
			
		
		
		
	NEW:DailyTips
Change-Id: I510e96652c9a0c9fe422546b09b2d035d9e46a23
This commit is contained in:
		
							parent
							
								
									c9499b7401
								
							
						
					
					
						commit
						81da77d1e0
					
				
					 9 changed files with 1366 additions and 5 deletions
				
			
		|  | @ -1050,9 +1050,9 @@ void GUI_App::post_init() | |||
|     }*/ | ||||
| 
 | ||||
|     // BBS: to be checked
 | ||||
| #if SUPPORT_SHOW_HINTS | ||||
| #if 1 | ||||
|     // show "Did you know" notification
 | ||||
|     if (app_config->get("show_hints") == "1" && ! is_gcode_viewer()) | ||||
|     if (app_config->get("show_hints") == "true" && ! is_gcode_viewer()) | ||||
|         plater_->get_notification_manager()->push_hint_notification(true); | ||||
| #endif | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										1085
									
								
								src/slic3r/GUI/HintNotification.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1085
									
								
								src/slic3r/GUI/HintNotification.cpp
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										122
									
								
								src/slic3r/GUI/HintNotification.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								src/slic3r/GUI/HintNotification.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,122 @@ | |||
| #ifndef slic3r_GUI_HintNotification_hpp_ | ||||
| #define slic3r_GUI_HintNotification_hpp_ | ||||
| 
 | ||||
| #include "NotificationManager.hpp" | ||||
| 
 | ||||
| namespace Slic3r {namespace GUI { | ||||
| 
 | ||||
| // Database of hints updatable
 | ||||
| struct HintData | ||||
| { | ||||
| 	std::string        id_string; | ||||
| 	std::string        text; | ||||
| 	size_t			   weight; | ||||
| 	bool               was_displayed; | ||||
| 	std::string        hypertext; | ||||
| 	std::string		   follow_text; | ||||
| 	std::string		   disabled_tags; | ||||
| 	std::string        enabled_tags; | ||||
| 	bool               runtime_disable; // if true - hyperlink will check before every click if not in disabled mode
 | ||||
| 	std::string        documentation_link; | ||||
| 	std::function<void(void)> callback{ nullptr }; | ||||
| }; | ||||
| 
 | ||||
| class HintDatabase | ||||
| { | ||||
| public: | ||||
| 	static HintDatabase& get_instance() | ||||
| 	{ | ||||
| 		static HintDatabase    instance; // Guaranteed to be destroyed.
 | ||||
| 											// Instantiated on first use.
 | ||||
| 		return instance; | ||||
| 	} | ||||
| private: | ||||
| 	HintDatabase() | ||||
| 		: m_hint_id(0) | ||||
| 	{} | ||||
| public: | ||||
| 	~HintDatabase(); | ||||
| 	HintDatabase(HintDatabase const&) = delete; | ||||
| 	void operator=(HintDatabase const&) = delete; | ||||
| 
 | ||||
| 	// return true if HintData filled;
 | ||||
| 	HintData* get_hint(bool new_hint = true); | ||||
| 	size_t    get_count() { | ||||
| 		if (!m_initialized) | ||||
| 			return 0; | ||||
| 		return m_loaded_hints.size(); | ||||
| 	} | ||||
| 	// resets m_initiailized to false and writes used if was initialized
 | ||||
| 	// used when reloading in runtime - like change language
 | ||||
| 	void    uninit(); | ||||
| private: | ||||
| 	void	init(); | ||||
| 	void	load_hints_from_file(const boost::filesystem::path& path); | ||||
| 	bool    is_used(const std::string& id); | ||||
| 	void    set_used(const std::string& id); | ||||
| 	void    clear_used(); | ||||
| 	// Returns position in m_loaded_hints with next hint chosed randomly with weights
 | ||||
| 	size_t  get_next(); | ||||
| 	size_t						m_hint_id; | ||||
| 	bool						m_initialized{ false }; | ||||
| 	std::vector<HintData>       m_loaded_hints; | ||||
| 	bool						m_sorted_hints{ false }; | ||||
| 	std::vector<std::string>    m_used_ids; | ||||
| 	bool                        m_used_ids_loaded{ false }; | ||||
| }; | ||||
| // Notification class - shows current Hint ("Did you know") 
 | ||||
| class NotificationManager::HintNotification : public NotificationManager::PopNotification | ||||
| { | ||||
| public: | ||||
| 	HintNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler, bool new_hint) | ||||
| 		: PopNotification(n, id_provider, evt_handler) | ||||
| 	{ | ||||
| 		retrieve_data(new_hint); | ||||
| 	} | ||||
| 	virtual void	init() override; | ||||
| 	void			open_next() { retrieve_data(); } | ||||
| protected: | ||||
| 	virtual void	set_next_window_size(ImGuiWrapper& imgui) override; | ||||
| 	virtual void	count_spaces() override; | ||||
| 	virtual void	count_lines() override; | ||||
| 	virtual bool	on_text_click() override; | ||||
| 	virtual void	render_text(ImGuiWrapper& imgui, | ||||
| 		const float win_size_x, const float win_size_y, | ||||
| 		const float win_pos_x, const float win_pos_y) override; | ||||
| 	virtual void	render_close_button(ImGuiWrapper& imgui, | ||||
| 		const float win_size_x, const float win_size_y, | ||||
| 		const float win_pos_x, const float win_pos_y) override; | ||||
| 	virtual void	render_minimize_button(ImGuiWrapper& imgui, | ||||
| 		const float win_pos_x, const float win_pos_y) override {} | ||||
| 	void			render_preferences_button(ImGuiWrapper& imgui, | ||||
| 		const float win_pos_x, const float win_pos_y); | ||||
| 	void			render_right_arrow_button(ImGuiWrapper& imgui, | ||||
| 		const float win_size_x, const float win_size_y, | ||||
| 		const float win_pos_x, const float win_pos_y); | ||||
| 	void			render_documentation_button(ImGuiWrapper& imgui, | ||||
| 		const float win_size_x, const float win_size_y, | ||||
| 		const float win_pos_x, const float win_pos_y); | ||||
| 	void			render_logo(ImGuiWrapper& imgui, | ||||
| 		const float win_size_x, const float win_size_y, | ||||
| 		const float win_pos_x, const float win_pos_y); | ||||
| 	// recursion counter -1 tells to retrieve same hint as last time
 | ||||
| 	void			retrieve_data(bool new_hint = true); | ||||
| 	void			open_documentation(); | ||||
| 
 | ||||
| 	bool						m_has_hint_data{ false }; | ||||
| 	std::function<void(void)>	m_hypertext_callback; | ||||
| 	std::string					m_disabled_tags; | ||||
| 	std::string					m_enabled_tags; | ||||
| 	bool                        m_runtime_disable; | ||||
| 	std::string                 m_documentation_link; | ||||
| 	float						m_close_b_y{ 0 }; | ||||
| 	float						m_close_b_w{ 0 }; | ||||
| 	// hover of buttons
 | ||||
| 	long                      m_docu_hover_time{ 0 }; | ||||
| 	long                      m_prefe_hover_time{ 0 }; | ||||
| }; | ||||
| 
 | ||||
| } //namespace Slic3r 
 | ||||
| } //namespace GUI 
 | ||||
| 
 | ||||
| #endif //slic3r_GUI_HintNotification_hpp_
 | ||||
|  | @ -1635,6 +1635,10 @@ static wxMenu* generate_help_menu() | |||
|     append_menu_item(helpMenu, wxID_ANY, about_title, about_title, | ||||
|             [](wxCommandEvent&) { Slic3r::GUI::about(); }); | ||||
| #endif | ||||
|     append_menu_item(helpMenu, wxID_ANY, _L("Show Tip of the Day"), _L("Show Tip of the Day"), [](wxCommandEvent&) { | ||||
|         wxGetApp().plater()->get_notification_manager()->push_hint_notification(false); | ||||
|         wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); | ||||
|         }); | ||||
| 
 | ||||
|     append_menu_item(helpMenu, wxID_ANY, _L("Open Network Test"), _L("Open Network Test"), [](wxCommandEvent&) { | ||||
|             NetworkTestDialog dlg(wxGetApp().mainframe); | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| #include "NotificationManager.hpp" | ||||
| 
 | ||||
| #include "HintNotification.hpp" | ||||
| #include "GUI.hpp" | ||||
| #include "ImGuiWrapper.hpp" | ||||
| #include "wxExtensions.hpp" | ||||
|  | @ -1787,7 +1788,27 @@ int  NotificationManager::progress_indicator_get_range() const | |||
| 
 | ||||
| void NotificationManager::push_hint_notification(bool open_next) | ||||
| { | ||||
| 	return; | ||||
| 	for (std::unique_ptr<PopNotification>& notification : m_pop_notifications) { | ||||
| 		if (notification->get_type() == NotificationType::DidYouKnowHint) { | ||||
| 			(dynamic_cast<HintNotification*>(notification.get()))->open_next(); | ||||
| 			return; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	NotificationData data{ NotificationType::DidYouKnowHint, NotificationLevel::HintNotificationLevel, 300, "" }; | ||||
| 	// from user - open now
 | ||||
| 	if (!open_next) { | ||||
| 		push_notification_data(std::make_unique<NotificationManager::HintNotification>(data, m_id_provider, m_evt_handler, open_next), 0); | ||||
| 		stop_delayed_notifications_of_type(NotificationType::DidYouKnowHint); | ||||
| 		// at startup - delay for half a second to let other notification pop up, than try every 30 seconds
 | ||||
| 		// show only if no notifications are shown
 | ||||
| 	} | ||||
| 	else { | ||||
| 		auto condition = [&self = std::as_const(*this)]() { | ||||
| 			return self.get_notification_count() == 0; | ||||
| 		}; | ||||
| 		push_delayed_notification_data(std::make_unique<NotificationManager::HintNotification>(data, m_id_provider, m_evt_handler, open_next), condition, 500, 30000); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| bool NotificationManager::is_hint_notification_open() | ||||
|  |  | |||
|  | @ -688,6 +688,8 @@ wxWindow* PreferencesDialog::create_general_page() | |||
|     std::vector<wxString> Units         = {_L("Metric"), _L("Imperial")}; | ||||
|     auto item_currency = create_item_combobox(_L("Units"), page, _L("Units"), "use_inches", Units); | ||||
| 
 | ||||
|     auto item_hints = create_item_checkbox(_L("Show \"Tip of the day\" notification after start"), page, _L("If enabled, useful hints are displayed at startup."), 50, "show_hints"); | ||||
| 
 | ||||
|     auto title_sync_settings = create_item_title(_L("User sync"), page, _L("User sync")); | ||||
|     auto item_user_sync        = create_item_checkbox(_L("Auto sync user presets(Printer/Filament/Process)"), page, _L("User Sync"), 50, "sync_user_preset"); | ||||
| 
 | ||||
|  | @ -713,6 +715,7 @@ wxWindow* PreferencesDialog::create_general_page() | |||
|     sizer_page->Add(item_language, 0, wxTOP, FromDIP(3)); | ||||
|     sizer_page->Add(item_region, 0, wxTOP, FromDIP(3)); | ||||
|     sizer_page->Add(item_currency, 0, wxTOP, FromDIP(3)); | ||||
|     sizer_page->Add(item_hints, 0, wxTOP, FromDIP(3)); | ||||
|     sizer_page->Add(title_sync_settings, 0, wxTOP | wxEXPAND, FromDIP(20)); | ||||
|     sizer_page->Add(item_user_sync, 0, wxTOP, FromDIP(3)); | ||||
| #ifdef _WIN32 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 liz.li
						liz.li