mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-14 05:15:59 +08:00
Different handling of shortcut 'T' for emboss text
This commit is contained in:
parent
e0a133b442
commit
58e3143ad8
@ -140,13 +140,6 @@ GLGizmoEmboss::GLGizmoEmboss(GLCanvas3D &parent)
|
|||||||
// Private namespace with helper function for create volume
|
// Private namespace with helper function for create volume
|
||||||
namespace priv {
|
namespace priv {
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Check if volume type is possible use for new text volume
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="volume_type">Type</param>
|
|
||||||
/// <returns>True when allowed otherwise false</returns>
|
|
||||||
static bool is_valid(ModelVolumeType volume_type);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Prepare data for emboss
|
/// Prepare data for emboss
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -249,10 +242,9 @@ static bool apply_camera_dir(const Camera &camera, GLCanvas3D &canvas);
|
|||||||
|
|
||||||
void GLGizmoEmboss::create_volume(ModelVolumeType volume_type, const Vec2d& mouse_pos)
|
void GLGizmoEmboss::create_volume(ModelVolumeType volume_type, const Vec2d& mouse_pos)
|
||||||
{
|
{
|
||||||
if (!priv::is_valid(volume_type)) return;
|
if (!init_create(volume_type))
|
||||||
m_style_manager.discard_style_changes();
|
return;
|
||||||
set_default_text();
|
|
||||||
|
|
||||||
GLVolume *gl_volume = get_first_hovered_gl_volume(m_parent);
|
GLVolume *gl_volume = get_first_hovered_gl_volume(m_parent);
|
||||||
DataBase emboss_data = priv::create_emboss_data_base(m_text, m_style_manager, m_job_cancel);
|
DataBase emboss_data = priv::create_emboss_data_base(m_text, m_style_manager, m_job_cancel);
|
||||||
if (gl_volume != nullptr) {
|
if (gl_volume != nullptr) {
|
||||||
@ -271,9 +263,8 @@ void GLGizmoEmboss::create_volume(ModelVolumeType volume_type, const Vec2d& mous
|
|||||||
// Designed for create volume without information of mouse in scene
|
// Designed for create volume without information of mouse in scene
|
||||||
void GLGizmoEmboss::create_volume(ModelVolumeType volume_type)
|
void GLGizmoEmboss::create_volume(ModelVolumeType volume_type)
|
||||||
{
|
{
|
||||||
if (!priv::is_valid(volume_type)) return;
|
if (!init_create(volume_type))
|
||||||
m_style_manager.discard_style_changes();
|
return;
|
||||||
set_default_text();
|
|
||||||
|
|
||||||
// select position by camera position and view direction
|
// select position by camera position and view direction
|
||||||
const Selection &selection = m_parent.get_selection();
|
const Selection &selection = m_parent.get_selection();
|
||||||
@ -321,6 +312,28 @@ void GLGizmoEmboss::create_volume(ModelVolumeType volume_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GLGizmoEmboss::init_create(ModelVolumeType volume_type)
|
||||||
|
{
|
||||||
|
// check valid volume type
|
||||||
|
if (volume_type != ModelVolumeType::MODEL_PART &&
|
||||||
|
volume_type != ModelVolumeType::NEGATIVE_VOLUME &&
|
||||||
|
volume_type != ModelVolumeType::PARAMETER_MODIFIER){
|
||||||
|
BOOST_LOG_TRIVIAL(error) << "Can't create embossed volume with this type: " << (int) volume_type;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_activable()) {
|
||||||
|
BOOST_LOG_TRIVIAL(error) << "Can't create text. Gizmo is not activabled.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_style_manager.discard_style_changes();
|
||||||
|
|
||||||
|
// set default text
|
||||||
|
m_text = _u8L("Embossed text");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool GLGizmoEmboss::on_mouse_for_rotation(const wxMouseEvent &mouse_event)
|
bool GLGizmoEmboss::on_mouse_for_rotation(const wxMouseEvent &mouse_event)
|
||||||
{
|
{
|
||||||
if (mouse_event.Moving()) return false;
|
if (mouse_event.Moving()) return false;
|
||||||
@ -510,6 +523,8 @@ bool GLGizmoEmboss::on_init()
|
|||||||
m_rotate_gizmo.init();
|
m_rotate_gizmo.init();
|
||||||
ColorRGBA gray_color(.6f, .6f, .6f, .3f);
|
ColorRGBA gray_color(.6f, .6f, .6f, .3f);
|
||||||
m_rotate_gizmo.set_highlight_color(gray_color);
|
m_rotate_gizmo.set_highlight_color(gray_color);
|
||||||
|
|
||||||
|
// NOTE: It has special handling in GLGizmosManager::handle_shortcut
|
||||||
m_shortcut_key = WXK_CONTROL_T;
|
m_shortcut_key = WXK_CONTROL_T;
|
||||||
|
|
||||||
// initialize text styles
|
// initialize text styles
|
||||||
@ -520,6 +535,11 @@ bool GLGizmoEmboss::on_init()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GLGizmoEmboss::on_is_activable() const {
|
||||||
|
return wxGetApp().get_mode() != comSimple &&
|
||||||
|
!wxGetApp().obj_list()->has_selected_cut_object();
|
||||||
|
}
|
||||||
|
|
||||||
std::string GLGizmoEmboss::on_get_name() const { return _u8L("Emboss"); }
|
std::string GLGizmoEmboss::on_get_name() const { return _u8L("Emboss"); }
|
||||||
|
|
||||||
void GLGizmoEmboss::on_render() {
|
void GLGizmoEmboss::on_render() {
|
||||||
@ -729,34 +749,33 @@ void GLGizmoEmboss::on_set_state()
|
|||||||
{
|
{
|
||||||
// enable / disable bed from picking
|
// enable / disable bed from picking
|
||||||
// Rotation gizmo must work through bed
|
// Rotation gizmo must work through bed
|
||||||
m_parent.set_raycaster_gizmos_on_top(GLGizmoBase::m_state == GLGizmoBase::On);
|
m_parent.set_raycaster_gizmos_on_top(m_state == GLGizmoBase::On);
|
||||||
|
|
||||||
m_rotate_gizmo.set_state(GLGizmoBase::m_state);
|
m_rotate_gizmo.set_state(m_state);
|
||||||
|
|
||||||
// Closing gizmo. e.g. selecting another one
|
// Closing gizmo. e.g. selecting another one
|
||||||
if (GLGizmoBase::m_state == GLGizmoBase::Off) {
|
if (m_state == GLGizmoBase::Off) {
|
||||||
// refuse outgoing during text preview
|
// refuse outgoing during text preview
|
||||||
if (false) {
|
|
||||||
GLGizmoBase::m_state = GLGizmoBase::On;
|
|
||||||
auto notification_manager = wxGetApp().plater()->get_notification_manager();
|
|
||||||
notification_manager->push_notification(
|
|
||||||
NotificationType::CustomNotification,
|
|
||||||
NotificationManager::NotificationLevel::RegularNotificationLevel,
|
|
||||||
_u8L("ERROR: Wait until ends or Cancel process."));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
reset_volume();
|
reset_volume();
|
||||||
// Store order and last activ index into app.ini
|
// Store order and last activ index into app.ini
|
||||||
// TODO: what to do when can't store into file?
|
// TODO: what to do when can't store into file?
|
||||||
m_style_manager.store_styles_to_app_config(false);
|
m_style_manager.store_styles_to_app_config(false);
|
||||||
remove_notification_not_valid_font();
|
remove_notification_not_valid_font();
|
||||||
} else if (GLGizmoBase::m_state == GLGizmoBase::On) {
|
} else if (m_state == GLGizmoBase::On) {
|
||||||
// to reload fonts from system, when install new one
|
// to reload fonts from system, when install new one
|
||||||
wxFontEnumerator::InvalidateCache();
|
wxFontEnumerator::InvalidateCache();
|
||||||
|
|
||||||
// Immediately after set state On is called function data_changed(),
|
// Immediately after set state On is called function data_changed(),
|
||||||
// where one could distiguish undo/redo serialization from opening by letter 'T'
|
// where one could distiguish undo/redo serialization from opening by letter 'T'
|
||||||
//set_volume_by_selection();
|
set_volume_by_selection();
|
||||||
|
|
||||||
|
// when open window by "T" and no valid volume is selected, so Create new one
|
||||||
|
if (m_volume == nullptr) {
|
||||||
|
// reopen gizmo when new object is created
|
||||||
|
m_state = GLGizmoBase::Off;
|
||||||
|
// start creating new object
|
||||||
|
return;
|
||||||
|
}
|
||||||
m_is_just_opened = true;
|
m_is_just_opened = true;
|
||||||
|
|
||||||
// change position of just opened emboss window
|
// change position of just opened emboss window
|
||||||
@ -778,21 +797,7 @@ void GLGizmoEmboss::on_set_state()
|
|||||||
void GLGizmoEmboss::data_changed(bool is_serializing) {
|
void GLGizmoEmboss::data_changed(bool is_serializing) {
|
||||||
if (is_serializing)
|
if (is_serializing)
|
||||||
reset_volume();
|
reset_volume();
|
||||||
|
|
||||||
set_volume_by_selection();
|
set_volume_by_selection();
|
||||||
|
|
||||||
// when open window by "T" and no valid volume is selected, so Create new one
|
|
||||||
// this is only place where One could distiguish between serializing and open by shortcut T
|
|
||||||
if (!is_serializing && m_is_just_opened && m_volume == nullptr) {
|
|
||||||
// reopen gizmo when new object is created
|
|
||||||
close();
|
|
||||||
if (wxGetApp().get_mode() == comSimple || wxGetApp().obj_list()->has_selected_cut_object())
|
|
||||||
// It's unwanted to add a part in simple mode
|
|
||||||
return;
|
|
||||||
|
|
||||||
// start creating new object
|
|
||||||
create_volume(ModelVolumeType::MODEL_PART);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGizmoEmboss::on_start_dragging() { m_rotate_gizmo.start_dragging(); }
|
void GLGizmoEmboss::on_start_dragging() { m_rotate_gizmo.start_dragging(); }
|
||||||
@ -989,8 +994,6 @@ EmbossStyles GLGizmoEmboss::create_default_styles()
|
|||||||
return styles;
|
return styles;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGizmoEmboss::set_default_text(){ m_text = _u8L("Embossed text"); }
|
|
||||||
|
|
||||||
void GLGizmoEmboss::set_volume_by_selection()
|
void GLGizmoEmboss::set_volume_by_selection()
|
||||||
{
|
{
|
||||||
const Selection &selection = m_parent.get_selection();
|
const Selection &selection = m_parent.get_selection();
|
||||||
@ -3402,16 +3405,6 @@ bool priv::draw_button(const IconManager::VIcons &icons, IconType type, bool dis
|
|||||||
// priv namespace implementation
|
// priv namespace implementation
|
||||||
///////////////
|
///////////////
|
||||||
|
|
||||||
bool priv::is_valid(ModelVolumeType volume_type)
|
|
||||||
{
|
|
||||||
if (volume_type == ModelVolumeType::MODEL_PART || volume_type == ModelVolumeType::NEGATIVE_VOLUME ||
|
|
||||||
volume_type == ModelVolumeType::PARAMETER_MODIFIER)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(error) << "Can't create embossed volume with this type: " << (int) volume_type;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
DataBase priv::create_emboss_data_base(const std::string &text, StyleManager &style_manager, std::shared_ptr<std::atomic<bool>>& cancel)
|
DataBase priv::create_emboss_data_base(const std::string &text, StyleManager &style_manager, std::shared_ptr<std::atomic<bool>>& cancel)
|
||||||
{
|
{
|
||||||
// create volume_name
|
// create volume_name
|
||||||
@ -3421,9 +3414,12 @@ DataBase priv::create_emboss_data_base(const std::string &text, StyleManager &st
|
|||||||
// change enters to space
|
// change enters to space
|
||||||
std::replace(volume_name.begin(), volume_name.end(), '\n', ' ');
|
std::replace(volume_name.begin(), volume_name.end(), '\n', ' ');
|
||||||
|
|
||||||
if (!style_manager.is_active_font())
|
if (!style_manager.is_active_font()) {
|
||||||
style_manager.load_valid_style();
|
style_manager.load_valid_style();
|
||||||
assert(style_manager.is_active_font());
|
assert(style_manager.is_active_font());
|
||||||
|
if (!style_manager.is_active_font())
|
||||||
|
return {}; // no active font in style, should never happend !!!
|
||||||
|
}
|
||||||
|
|
||||||
const EmbossStyle &es = style_manager.get_style();
|
const EmbossStyle &es = style_manager.get_style();
|
||||||
// actualize font path - during changes in gui it could be corrupted
|
// actualize font path - during changes in gui it could be corrupted
|
||||||
|
@ -49,12 +49,12 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool on_init() override;
|
bool on_init() override;
|
||||||
|
bool on_is_activable() const override;
|
||||||
std::string on_get_name() const override;
|
std::string on_get_name() const override;
|
||||||
void on_render() override;
|
void on_render() override;
|
||||||
virtual void on_register_raycasters_for_picking() override;
|
void on_register_raycasters_for_picking() override;
|
||||||
virtual void on_unregister_raycasters_for_picking() override;
|
void on_unregister_raycasters_for_picking() override;
|
||||||
void on_render_input_window(float x, float y, float bottom_limit) override;
|
void on_render_input_window(float x, float y, float bottom_limit) override;
|
||||||
bool on_is_activable() const override { return true; }
|
|
||||||
bool on_is_selectable() const override { return false; }
|
bool on_is_selectable() const override { return false; }
|
||||||
void on_set_state() override;
|
void on_set_state() override;
|
||||||
void data_changed(bool is_serializing) override; // selection changed
|
void data_changed(bool is_serializing) override; // selection changed
|
||||||
@ -79,7 +79,7 @@ protected:
|
|||||||
private:
|
private:
|
||||||
static EmbossStyles create_default_styles();
|
static EmbossStyles create_default_styles();
|
||||||
// localized default text
|
// localized default text
|
||||||
void set_default_text();
|
bool init_create(ModelVolumeType volume_type);
|
||||||
|
|
||||||
void set_volume_by_selection();
|
void set_volume_by_selection();
|
||||||
void reset_volume();
|
void reset_volume();
|
||||||
|
@ -238,15 +238,24 @@ bool GLGizmosManager::is_running() const
|
|||||||
|
|
||||||
bool GLGizmosManager::handle_shortcut(int key)
|
bool GLGizmosManager::handle_shortcut(int key)
|
||||||
{
|
{
|
||||||
if (!m_enabled || m_parent.get_selection().is_empty())
|
if (!m_enabled)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto it = std::find_if(m_gizmos.begin(), m_gizmos.end(),
|
auto is_key = [pressed_key = key](int gizmo_key) { return (gizmo_key == pressed_key - 64) || (gizmo_key == pressed_key - 96); };
|
||||||
[key](const std::unique_ptr<GLGizmoBase>& gizmo) {
|
// allowe open shortcut even when selection is empty
|
||||||
int gizmo_key = gizmo->get_shortcut_key();
|
if (GLGizmoBase* gizmo_emboss = m_gizmos[Emboss].get();
|
||||||
return gizmo->is_activable()
|
is_key(gizmo_emboss->get_shortcut_key())) {
|
||||||
&& ((gizmo_key == key - 64) || (gizmo_key == key - 96));
|
dynamic_cast<GLGizmoEmboss *>(gizmo_emboss)->create_volume(ModelVolumeType::MODEL_PART);
|
||||||
});
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_parent.get_selection().is_empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
auto is_gizmo = [is_key](const std::unique_ptr<GLGizmoBase> &gizmo) {
|
||||||
|
return gizmo->is_activable() && is_key(gizmo->get_shortcut_key());
|
||||||
|
};
|
||||||
|
auto it = std::find_if(m_gizmos.begin(), m_gizmos.end(), is_gizmo);
|
||||||
|
|
||||||
if (it == m_gizmos.end())
|
if (it == m_gizmos.end())
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user