mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 12:41:20 -06:00 
			
		
		
		
	notifications: avoid collision with gizmos on same position by moving to left
This commit is contained in:
		
							parent
							
								
									ec6599da98
								
							
						
					
					
						commit
						092a9f80b6
					
				
					 5 changed files with 50 additions and 10 deletions
				
			
		|  | @ -215,6 +215,8 @@ void GLCanvas3D::LayersEditing::set_enabled(bool enabled) | |||
|     m_enabled = is_allowed() && enabled; | ||||
| } | ||||
| 
 | ||||
| float GLCanvas3D::LayersEditing::s_overelay_window_width; | ||||
| 
 | ||||
| void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) const | ||||
| { | ||||
|     if (!m_enabled) | ||||
|  | @ -297,6 +299,7 @@ void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) const | |||
|     if (imgui.button(_L("Reset"))) | ||||
|         wxPostEvent((wxEvtHandler*)canvas.get_wxglcanvas(), SimpleEvent(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE)); | ||||
| 
 | ||||
|     GLCanvas3D::LayersEditing::s_overelay_window_width = ImGui::GetWindowSize().x /*+ (float)m_layers_texture.width/4*/; | ||||
|     imgui.end(); | ||||
| 
 | ||||
|     const Rect& bar_rect = get_bar_rect_viewport(canvas); | ||||
|  | @ -1426,6 +1429,16 @@ void GLCanvas3D::Tooltip::render(const Vec2d& mouse_position, GLCanvas3D& canvas | |||
| } | ||||
| 
 | ||||
| #if ENABLE_SLOPE_RENDERING | ||||
| 
 | ||||
| float GLCanvas3D::Slope::s_window_width; | ||||
| 
 | ||||
| void GLCanvas3D::Slope::show_dialog(bool show) { | ||||
|     if (show && is_used())  | ||||
|         return; use(show);  | ||||
|     m_dialog_shown = show; | ||||
|     wxGetApp().plater()->get_notification_manager()->set_move_from_slope(show); | ||||
| } | ||||
| 
 | ||||
| void GLCanvas3D::Slope::render() const | ||||
| { | ||||
|     if (m_dialog_shown) { | ||||
|  | @ -1482,6 +1495,8 @@ void GLCanvas3D::Slope::render() const | |||
|         if (ImGui::GetWindowContentRegionWidth() + 2.0f * ImGui::GetStyle().WindowPadding.x != ImGui::CalcWindowExpectedSize(ImGui::GetCurrentWindow()).x) | ||||
|             m_canvas.request_extra_frame(); | ||||
| 
 | ||||
|         s_window_width = ImGui::GetWindowSize().x; | ||||
| 
 | ||||
|         imgui.end(); | ||||
| 
 | ||||
|         if (modified) | ||||
|  | @ -2151,7 +2166,7 @@ void GLCanvas3D::render() | |||
| 
 | ||||
|     wxGetApp().plater()->get_mouse3d_controller().render_settings_dialog(*this); | ||||
| 	 | ||||
| 	wxGetApp().plater()->get_notification_manager()->render_notifications(*this); | ||||
| 	wxGetApp().plater()->get_notification_manager()->render_notifications(*this, get_overelay_window_width(), get_slope_window_width()); | ||||
| 
 | ||||
|     wxGetApp().imgui()->render(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -186,6 +186,8 @@ private: | |||
| 
 | ||||
|         mutable float               m_adaptive_quality; | ||||
|         mutable HeightProfileSmoothingParams m_smooth_params; | ||||
|          | ||||
|         static float                s_overelay_window_width; | ||||
| 
 | ||||
|         class LayersTexture | ||||
|         { | ||||
|  | @ -241,6 +243,7 @@ private: | |||
|         static bool bar_rect_contains(const GLCanvas3D& canvas, float x, float y); | ||||
|         static Rect get_bar_rect_screen(const GLCanvas3D& canvas); | ||||
|         static Rect get_bar_rect_viewport(const GLCanvas3D& canvas); | ||||
|         static float get_overelay_window_width() { return LayersEditing::s_overelay_window_width; } | ||||
| 
 | ||||
|         float object_max_z() const { return m_object_max_z; } | ||||
| 
 | ||||
|  | @ -254,6 +257,7 @@ private: | |||
|         void update_slicing_parameters(); | ||||
| 
 | ||||
|         static float thickness_bar_width(const GLCanvas3D &canvas); | ||||
|          | ||||
|     }; | ||||
| 
 | ||||
|     struct Mouse | ||||
|  | @ -425,7 +429,7 @@ private: | |||
|         bool m_dialog_shown{ false }; | ||||
|         GLCanvas3D& m_canvas; | ||||
|         GLVolumeCollection& m_volumes; | ||||
| 
 | ||||
|         static float s_window_width; | ||||
|     public: | ||||
|         Slope(GLCanvas3D& canvas, GLVolumeCollection& volumes) : m_canvas(canvas), m_volumes(volumes) {} | ||||
| 
 | ||||
|  | @ -433,12 +437,13 @@ private: | |||
|         bool is_enabled() const { return m_enabled; } | ||||
|         void use(bool use) { m_volumes.set_slope_active(m_enabled ? use : false); } | ||||
|         bool is_used() const { return m_volumes.is_slope_active(); } | ||||
|         void show_dialog(bool show) { if (show && is_used()) return; use(show); m_dialog_shown = show; } | ||||
|         void show_dialog(bool show); | ||||
|         bool is_dialog_shown() const { return m_dialog_shown; } | ||||
|         void render() const; | ||||
|         void set_range(const std::array<float, 2>& range) const { | ||||
|             m_volumes.set_slope_z_range({ -::cos(Geometry::deg2rad(90.0f - range[0])), -::cos(Geometry::deg2rad(90.0f - range[1])) }); | ||||
|         } | ||||
|         static float get_window_width() { return s_window_width; }; | ||||
|     }; | ||||
| #endif // ENABLE_SLOPE_RENDERING
 | ||||
| 
 | ||||
|  | @ -772,6 +777,8 @@ public: | |||
|     void set_slope_range(const std::array<float, 2>& range) { m_slope.set_range(range); } | ||||
| #endif // ENABLE_SLOPE_RENDERING
 | ||||
| 
 | ||||
|     | ||||
| 
 | ||||
| private: | ||||
|     bool _is_shown_on_screen() const; | ||||
| 
 | ||||
|  | @ -892,6 +899,15 @@ private: | |||
|     bool _activate_search_toolbar_item(); | ||||
|     bool _deactivate_collapse_toolbar_items(); | ||||
| 
 | ||||
|     float get_overelay_window_width() { return LayersEditing::get_overelay_window_width(); } | ||||
|     float get_slope_window_width()    { | ||||
| #if ENABLE_SLOPE_RENDERING | ||||
|         return Slope::get_window_width();  | ||||
| #else | ||||
|         return 0.0f; | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     static std::vector<float> _parse_colors(const std::vector<std::string>& colors); | ||||
| 
 | ||||
| public: | ||||
|  |  | |||
|  | @ -54,7 +54,7 @@ NotificationManager::PopNotification::PopNotification(const NotificationData &n, | |||
| NotificationManager::PopNotification::~PopNotification() | ||||
| { | ||||
| } | ||||
| NotificationManager::PopNotification::RenderResult NotificationManager::PopNotification::render(GLCanvas3D& canvas, const float& initial_y) | ||||
| NotificationManager::PopNotification::RenderResult NotificationManager::PopNotification::render(GLCanvas3D& canvas, const float& initial_y, bool move_from_overlay, float overlay_width, bool move_from_slope, float slope_width) | ||||
| { | ||||
| 	if (!m_initialized) { | ||||
| 		init(); | ||||
|  | @ -76,6 +76,7 @@ NotificationManager::PopNotification::RenderResult NotificationManager::PopNotif | |||
| 	bool            shown = true; | ||||
| 	std::string     name; | ||||
| 	ImVec2          mouse_pos = ImGui::GetMousePos(); | ||||
| 	float           right_gap = SPACE_RIGHT_PANEL + (move_from_overlay ? overlay_width + m_line_height * 5 : (move_from_slope ? slope_width /*+ m_line_height * 0.3f*/ : 0)); | ||||
| 
 | ||||
| 	if (m_line_height != ImGui::CalcTextSize("A").y) | ||||
| 		init(); | ||||
|  | @ -85,10 +86,11 @@ NotificationManager::PopNotification::RenderResult NotificationManager::PopNotif | |||
| 	//top y of window
 | ||||
| 	m_top_y = initial_y + m_window_height; | ||||
| 	//top right position
 | ||||
| 	ImVec2 win_pos(1.0f * (float)cnv_size.get_width() - SPACE_RIGHT_PANEL, 1.0f * (float)cnv_size.get_height() - m_top_y); | ||||
| 
 | ||||
| 	ImVec2 win_pos(1.0f * (float)cnv_size.get_width() - right_gap, 1.0f * (float)cnv_size.get_height() - m_top_y); | ||||
| 	imgui.set_next_window_pos(win_pos.x, win_pos.y, ImGuiCond_Always, 1.0f, 0.0f); | ||||
| 	imgui.set_next_window_size(m_window_width, m_window_height, ImGuiCond_Always); | ||||
| 
 | ||||
| 	 | ||||
| 	//find if hovered
 | ||||
| 	if (mouse_pos.x < win_pos.x && mouse_pos.x > win_pos.x - m_window_width && mouse_pos.y > win_pos.y&& mouse_pos.y < win_pos.y + m_window_height) | ||||
| 	{ | ||||
|  | @ -820,7 +822,7 @@ bool NotificationManager::push_notification_data(NotificationManager::PopNotific | |||
| 		return false; | ||||
| 	} | ||||
| } | ||||
| void NotificationManager::render_notifications(GLCanvas3D& canvas) | ||||
| void NotificationManager::render_notifications(GLCanvas3D& canvas, float overlay_width, float slope_width) | ||||
| { | ||||
| 	float    last_x = 0.0f; | ||||
| 	float    current_height = 0.0f; | ||||
|  | @ -835,7 +837,7 @@ void NotificationManager::render_notifications(GLCanvas3D& canvas) | |||
| 			it = m_pop_notifications.erase(it); | ||||
| 		} else { | ||||
| 			(*it)->set_paused(m_hovered); | ||||
| 			PopNotification::RenderResult res = (*it)->render(canvas, last_x); | ||||
| 			PopNotification::RenderResult res = (*it)->render(canvas, last_x, m_move_from_overlay, overlay_width, m_move_from_slope, slope_width); | ||||
| 			if (res != PopNotification::RenderResult::Finished) { | ||||
| 				last_x = (*it)->get_top() + GAP_WIDTH; | ||||
| 				current_height = std::max(current_height, (*it)->get_current_top()); | ||||
|  |  | |||
|  | @ -76,7 +76,7 @@ public: | |||
| 		}; | ||||
| 		 PopNotification(const NotificationData &n, const int id, wxEvtHandler* evt_handler); | ||||
| 		virtual ~PopNotification(); | ||||
| 		RenderResult           render(GLCanvas3D& canvas, const float& initial_y); | ||||
| 		RenderResult           render(GLCanvas3D& canvas, const float& initial_y, bool move_from_overlay, float overlay_width, bool move_from_slope, float slope_width); | ||||
| 		// close will dissapear notification on next render
 | ||||
| 		void                   close() { m_close_pending = true; } | ||||
| 		// data from newer notification of same type
 | ||||
|  | @ -229,11 +229,15 @@ public: | |||
| 	void set_slicing_complete_print_time(std::string info); | ||||
| 	void set_slicing_complete_large(bool large); | ||||
| 	// renders notifications in queue and deletes expired ones
 | ||||
| 	void render_notifications(GLCanvas3D& canvas); | ||||
| 	void render_notifications(GLCanvas3D& canvas, float overlay_width, float slope_width); | ||||
| 	// finds and closes all notifications of given type
 | ||||
| 	void close_notification_of_type(const NotificationType type); | ||||
| 	void dpi_changed(); | ||||
|     void set_in_preview(bool preview); | ||||
| 	// Move to left to avoid colision with variable layer height gizmo
 | ||||
| 	void set_move_from_overlay(bool move) { m_move_from_overlay = move; } | ||||
| 	// or slope visualization gizmo
 | ||||
| 	void set_move_from_slope (bool move) { m_move_from_slope = move; } | ||||
| private: | ||||
| 	//pushes notification into the queue of notifications that are rendered
 | ||||
| 	//can be used to create custom notification
 | ||||
|  | @ -252,6 +256,8 @@ private: | |||
| 	//timestamps used for slining finished - notification could be gone so it needs to be stored here
 | ||||
| 	std::unordered_set<int>      m_used_timestamps; | ||||
| 	bool                         m_in_preview { false }; | ||||
| 	bool                         m_move_from_overlay { false }; | ||||
| 	bool                         m_move_from_slope{ false }; | ||||
| 
 | ||||
| 	//prepared (basic) notifications
 | ||||
| 	const std::vector<NotificationData> basic_notifications = { | ||||
|  |  | |||
|  | @ -3625,6 +3625,7 @@ void Plater::priv::on_action_split_volumes(SimpleEvent&) | |||
| void Plater::priv::on_action_layersediting(SimpleEvent&) | ||||
| { | ||||
|     view3D->enable_layers_editing(!view3D->is_layers_editing_enabled()); | ||||
|     notification_manager->set_move_from_overlay(view3D->is_layers_editing_enabled()); | ||||
| } | ||||
| 
 | ||||
| void Plater::priv::on_object_select(SimpleEvent& evt) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 David Kocik
						David Kocik