mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	DoubleSlider: SingleExtruder mode: Implemented editing of color from colored band, using RightMouseClick on it. And added corresponding tooltip
This commit is contained in:
		
							parent
							
								
									450e21d457
								
							
						
					
					
						commit
						de4c2fc2e0
					
				
					 2 changed files with 62 additions and 14 deletions
				
			
		| 
						 | 
				
			
			@ -603,21 +603,24 @@ std::string Control::get_color_for_color_change_tick(std::set<TickCode>::const_i
 | 
			
		|||
    return "";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Control::draw_colored_band(wxDC& dc)
 | 
			
		||||
wxRect Control::get_colored_band_rect()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_is_enabled_tick_manipulation)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    int height, width;
 | 
			
		||||
    get_size(&width, &height);
 | 
			
		||||
 | 
			
		||||
    const wxCoord mid = is_horizontal() ? 0.5 * height : 0.5 * width;
 | 
			
		||||
 | 
			
		||||
    wxRect main_band = is_horizontal() ?
 | 
			
		||||
                       wxRect(SLIDER_MARGIN, lround(mid - 0.375 * m_thumb_size.y), 
 | 
			
		||||
                              width - 2 * SLIDER_MARGIN + 1, lround(0.75 * m_thumb_size.y)) :
 | 
			
		||||
                       wxRect(lround(mid - 0.375 * m_thumb_size.x), SLIDER_MARGIN, 
 | 
			
		||||
                              lround(0.75 * m_thumb_size.x), height - 2 * SLIDER_MARGIN + 1);
 | 
			
		||||
    return is_horizontal() ?
 | 
			
		||||
           wxRect(SLIDER_MARGIN, lround(mid - 0.375 * m_thumb_size.y), 
 | 
			
		||||
                  width - 2 * SLIDER_MARGIN + 1, lround(0.75 * m_thumb_size.y)) :
 | 
			
		||||
           wxRect(lround(mid - 0.375 * m_thumb_size.x), SLIDER_MARGIN, 
 | 
			
		||||
                  lround(0.75 * m_thumb_size.x), height - 2 * SLIDER_MARGIN + 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Control::draw_colored_band(wxDC& dc)
 | 
			
		||||
{
 | 
			
		||||
    if (!m_is_enabled_tick_manipulation)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    auto draw_band = [](wxDC& dc, const wxColour& clr, const wxRect& band_rc) 
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -626,6 +629,8 @@ void Control::draw_colored_band(wxDC& dc)
 | 
			
		|||
        dc.DrawRectangle(band_rc);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    wxRect main_band = get_colored_band_rect();
 | 
			
		||||
 | 
			
		||||
    // don't color a band for MultiExtruder mode
 | 
			
		||||
    if (m_ticks.empty() || m_mode == t_mode::MultiExtruder)
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -887,7 +892,7 @@ wxString Control::get_tooltip(FocusItem focused_item, int tick/*=-1*/)
 | 
			
		|||
        return _(L("Set extruder sequence for whole print"));
 | 
			
		||||
    if (focused_item == fiColorBand)
 | 
			
		||||
        return m_mode != t_mode::SingleExtruder ? "" :
 | 
			
		||||
               _(L("For edit current color use Right(Double) mouse click on colored band"));
 | 
			
		||||
               _(L("For edit current color use right mouse button click on colored band"));
 | 
			
		||||
 | 
			
		||||
    wxString tooltip;
 | 
			
		||||
    const auto tick_code_it = m_ticks.ticks.find(TickCode{tick});
 | 
			
		||||
| 
						 | 
				
			
			@ -961,6 +966,23 @@ wxString Control::get_tooltip(FocusItem focused_item, int tick/*=-1*/)
 | 
			
		|||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Control::get_edited_tick_for_position(const wxPoint pos, const std::string& gcode /*= ColorChangeCode*/)
 | 
			
		||||
{
 | 
			
		||||
    if (m_ticks.empty())
 | 
			
		||||
        return -1;
 | 
			
		||||
 | 
			
		||||
    int tick = get_value_from_position(pos);
 | 
			
		||||
    auto it = std::lower_bound(m_ticks.ticks.begin(), m_ticks.ticks.end(), TickCode{ tick });
 | 
			
		||||
 | 
			
		||||
    while (it != m_ticks.ticks.begin()) {
 | 
			
		||||
        --it;
 | 
			
		||||
        if (it->gcode == gcode)
 | 
			
		||||
            return it->tick;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Control::OnMotion(wxMouseEvent& event)
 | 
			
		||||
{
 | 
			
		||||
    bool action = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -985,6 +1007,9 @@ void Control::OnMotion(wxMouseEvent& event)
 | 
			
		|||
            focused_item = fiRevertIcon;
 | 
			
		||||
        else if (is_point_in_rect(pos, m_rect_cog_icon))
 | 
			
		||||
            focused_item = fiCogIcon;
 | 
			
		||||
        else if (m_mode == t_mode::SingleExtruder && is_point_in_rect(pos, get_colored_band_rect()) &&
 | 
			
		||||
                 get_edited_tick_for_position(pos) >= 0 )
 | 
			
		||||
            focused_item = fiColorBand;
 | 
			
		||||
        else {
 | 
			
		||||
            focused_item = fiTick;
 | 
			
		||||
            tick = get_tick_near_point(pos);
 | 
			
		||||
| 
						 | 
				
			
			@ -1242,7 +1267,7 @@ void Control::OnRightDown(wxMouseEvent& event)
 | 
			
		|||
    const wxClientDC dc(this);
 | 
			
		||||
 | 
			
		||||
    wxPoint pos = event.GetLogicalPosition(dc);
 | 
			
		||||
    if (is_point_in_rect(pos, m_rect_tick_action) && m_is_enabled_tick_manipulation)
 | 
			
		||||
    if (m_is_enabled_tick_manipulation && is_point_in_rect(pos, m_rect_tick_action))
 | 
			
		||||
    {
 | 
			
		||||
        const int tick = m_selection == ssLower ? m_lower_value : m_higher_value;
 | 
			
		||||
        if (m_ticks.ticks.find(TickCode{ tick }) == m_ticks.ticks.end())   // if on this Z doesn't exist tick
 | 
			
		||||
| 
						 | 
				
			
			@ -1254,6 +1279,13 @@ void Control::OnRightDown(wxMouseEvent& event)
 | 
			
		|||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (m_is_enabled_tick_manipulation && m_mode == t_mode::SingleExtruder && 
 | 
			
		||||
        is_point_in_rect(pos, get_colored_band_rect()))
 | 
			
		||||
    {
 | 
			
		||||
        m_force_color_edit = true;
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    detect_selected_slider(event.GetLogicalPosition(dc));
 | 
			
		||||
    if (!m_selection)
 | 
			
		||||
        return;
 | 
			
		||||
| 
						 | 
				
			
			@ -1424,6 +1456,17 @@ void Control::OnRightUp(wxMouseEvent& event)
 | 
			
		|||
 | 
			
		||||
        m_show_edit_menu = false;
 | 
			
		||||
    }
 | 
			
		||||
    else if (m_force_color_edit)
 | 
			
		||||
    {
 | 
			
		||||
        const wxClientDC dc(this);
 | 
			
		||||
        wxPoint pos = event.GetLogicalPosition(dc);
 | 
			
		||||
 | 
			
		||||
        int edited_tick = get_edited_tick_for_position(pos);
 | 
			
		||||
        if (edited_tick >= 0)
 | 
			
		||||
            edit_tick(edited_tick);
 | 
			
		||||
 | 
			
		||||
        m_force_color_edit = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Refresh();
 | 
			
		||||
    Update();
 | 
			
		||||
| 
						 | 
				
			
			@ -1587,9 +1630,10 @@ void Control::delete_current_tick()
 | 
			
		|||
    post_ticks_changed_event(code);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Control::edit_tick()
 | 
			
		||||
void Control::edit_tick(int tick/* = -1*/)
 | 
			
		||||
{
 | 
			
		||||
    const int tick = m_selection == ssLower ? m_lower_value : m_higher_value;
 | 
			
		||||
    if (tick < 0)
 | 
			
		||||
        tick = m_selection == ssLower ? m_lower_value : m_higher_value;
 | 
			
		||||
    const std::set<TickCode>::iterator it = m_ticks.ticks.find(TickCode{ tick });
 | 
			
		||||
 | 
			
		||||
    if (it == m_ticks.ticks.end() ||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -225,7 +225,7 @@ public:
 | 
			
		|||
    void add_current_tick(bool call_from_keyboard = false);
 | 
			
		||||
    // delete current tick, when press "-"
 | 
			
		||||
    void delete_current_tick();
 | 
			
		||||
    void edit_tick();
 | 
			
		||||
    void edit_tick(int tick = -1);
 | 
			
		||||
    void edit_extruder_sequence();
 | 
			
		||||
 | 
			
		||||
    ExtrudersSequence m_extruders_sequence;
 | 
			
		||||
| 
						 | 
				
			
			@ -263,14 +263,17 @@ private:
 | 
			
		|||
    wxString    get_label(const SelectedSlider& selection) const;
 | 
			
		||||
    void        get_lower_and_higher_position(int& lower_pos, int& higher_pos);
 | 
			
		||||
    int         get_value_from_position(const wxCoord x, const wxCoord y);
 | 
			
		||||
    int         get_value_from_position(const wxPoint pos) { return get_value_from_position(pos.x, pos.y); }
 | 
			
		||||
    wxCoord     get_position_from_value(const int value);
 | 
			
		||||
    wxSize      get_size();
 | 
			
		||||
    void        get_size(int *w, int *h);
 | 
			
		||||
    double      get_double_value(const SelectedSlider& selection);
 | 
			
		||||
    wxString    get_tooltip(FocusItem focused_item, int tick = -1);
 | 
			
		||||
    int         get_edited_tick_for_position(wxPoint pos, const std::string& gcode = ColorChangeCode);
 | 
			
		||||
 | 
			
		||||
    std::string get_color_for_tool_change_tick(std::set<TickCode>::const_iterator it) const;
 | 
			
		||||
    std::string get_color_for_color_change_tick(std::set<TickCode>::const_iterator it) const;
 | 
			
		||||
    wxRect      get_colored_band_rect();
 | 
			
		||||
 | 
			
		||||
    // Get active extruders for tick. 
 | 
			
		||||
    // Means one current extruder for not existing tick OR 
 | 
			
		||||
| 
						 | 
				
			
			@ -316,6 +319,7 @@ private:
 | 
			
		|||
    bool        m_force_mode_apply = true;
 | 
			
		||||
    bool        m_force_add_tick    = false;
 | 
			
		||||
    bool        m_force_delete_tick = false;
 | 
			
		||||
    bool        m_force_color_edit  = false;
 | 
			
		||||
    t_mode      m_mode = t_mode::SingleExtruder;
 | 
			
		||||
    int         m_only_extruder = -1;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue