Fixed crash of build under OSX and Linux.
+ Added flag to control if application rescale is possible
This commit is contained in:
parent
fc63a28481
commit
3b9803ba6e
8 changed files with 54 additions and 23 deletions
|
@ -846,7 +846,7 @@ void Choice::rescale()
|
||||||
|
|
||||||
wxBitmapComboBox* field = dynamic_cast<wxBitmapComboBox*>(window);
|
wxBitmapComboBox* field = dynamic_cast<wxBitmapComboBox*>(window);
|
||||||
|
|
||||||
const wxString selection = field->GetStringSelection();
|
const wxString selection = field->GetString(field->GetSelection());
|
||||||
|
|
||||||
/* To correct scaling (set new controll size) of a wxBitmapCombobox
|
/* To correct scaling (set new controll size) of a wxBitmapCombobox
|
||||||
* we need to refill control with new bitmaps. So, in our case :
|
* we need to refill control with new bitmaps. So, in our case :
|
||||||
|
|
|
@ -325,7 +325,7 @@ void GUI_App::init_fonts()
|
||||||
#endif /*__WXMAC__*/
|
#endif /*__WXMAC__*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI_App::scale_fonts(const float scale_f)
|
void GUI_App::scale_default_fonts(const float scale_f)
|
||||||
{
|
{
|
||||||
m_small_font = m_small_font.Scaled(scale_f);
|
m_small_font = m_small_font.Scaled(scale_f);
|
||||||
m_bold_font = m_bold_font.Scaled(scale_f);
|
m_bold_font = m_bold_font.Scaled(scale_f);
|
||||||
|
|
|
@ -98,7 +98,7 @@ public:
|
||||||
void init_label_colours();
|
void init_label_colours();
|
||||||
void update_label_colours_from_appconfig();
|
void update_label_colours_from_appconfig();
|
||||||
void init_fonts();
|
void init_fonts();
|
||||||
void scale_fonts(const float scale_f);
|
void scale_default_fonts(const float scale_f);
|
||||||
void set_label_clr_modified(const wxColour& clr);
|
void set_label_clr_modified(const wxColour& clr);
|
||||||
void set_label_clr_sys(const wxColour& clr);
|
void set_label_clr_sys(const wxColour& clr);
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,8 @@ public:
|
||||||
|
|
||||||
this->Bind(EVT_DPI_CHANGED, [this](const DpiChangedEvent &evt) {
|
this->Bind(EVT_DPI_CHANGED, [this](const DpiChangedEvent &evt) {
|
||||||
// ->-
|
// ->-
|
||||||
m_prev_scale_factor = m_scale_factor;
|
if (m_prev_scale_factor < 0)
|
||||||
|
reset_prev_scale_factor();
|
||||||
// -<-
|
// -<-
|
||||||
|
|
||||||
m_scale_factor = (float)evt.dpi / (float)DPI_DEFAULT;
|
m_scale_factor = (float)evt.dpi / (float)DPI_DEFAULT;
|
||||||
|
@ -77,10 +78,11 @@ public:
|
||||||
|
|
||||||
virtual ~DPIAware() {}
|
virtual ~DPIAware() {}
|
||||||
|
|
||||||
float scale_factor() const { return m_scale_factor; }
|
float scale_factor() const { return m_scale_factor; }
|
||||||
float prev_scale_factor() const { return m_prev_scale_factor; }
|
float prev_scale_factor() const { return m_prev_scale_factor; }
|
||||||
int em_unit() const { return m_em_unit; }
|
void reset_prev_scale_factor() { m_prev_scale_factor = m_scale_factor; }
|
||||||
int font_size() const { return m_font_size; }
|
int em_unit() const { return m_em_unit; }
|
||||||
|
int font_size() const { return m_font_size; }
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -129,6 +129,30 @@ DPIFrame(NULL, wxID_ANY, SLIC3R_BUILD, wxDefaultPosition, wxDefaultSize, wxDEFAU
|
||||||
event.Skip();
|
event.Skip();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Bind(wxEVT_MOVE_START, [this](wxMoveEvent& event)
|
||||||
|
{
|
||||||
|
event.Skip();
|
||||||
|
|
||||||
|
// Suppress application rescaling, when a MainFrame moving is not ended
|
||||||
|
m_can_rescale_application = false;
|
||||||
|
// Cash scale factor value before a MainFrame moving
|
||||||
|
m_scale_factor_cache = scale_factor();
|
||||||
|
});
|
||||||
|
|
||||||
|
Bind(wxEVT_MOVE_END, [this](wxMoveEvent& event)
|
||||||
|
{
|
||||||
|
event.Skip();
|
||||||
|
|
||||||
|
// If scale factor is different after moving of MainFrame ...
|
||||||
|
m_can_rescale_application = fabs(m_scale_factor_cache - scale_factor()) > 0.0001;
|
||||||
|
|
||||||
|
// ... rescale application
|
||||||
|
on_dpi_changed(event.GetRect());
|
||||||
|
|
||||||
|
// set value to _true_ in purpose of possibility of a display dpi changing from System Settings
|
||||||
|
m_can_rescale_application = true;
|
||||||
|
});
|
||||||
|
|
||||||
wxGetApp().persist_window_geometry(this);
|
wxGetApp().persist_window_geometry(this);
|
||||||
|
|
||||||
update_ui_from_settings(); // FIXME (?)
|
update_ui_from_settings(); // FIXME (?)
|
||||||
|
@ -257,37 +281,38 @@ bool MainFrame::can_delete_all() const
|
||||||
}
|
}
|
||||||
|
|
||||||
// scale font for existing controls
|
// scale font for existing controls
|
||||||
static void scale(wxWindow *window, const float scale_f)
|
static void scale_controls_fonts(wxWindow *window, const float scale_f)
|
||||||
{
|
{
|
||||||
auto children = window->GetChildren();
|
auto children = window->GetChildren();
|
||||||
|
|
||||||
for (auto child : children)
|
for (auto child : children)
|
||||||
{
|
{
|
||||||
scale(child, scale_f);
|
scale_controls_fonts(child, scale_f);
|
||||||
|
|
||||||
child->SetFont(child->GetFont().Scaled(scale_f));
|
child->SetFont(child->GetFont().Scaled(scale_f));
|
||||||
|
|
||||||
// const wxSize& sz = child->GetSize();
|
|
||||||
// if (sz != wxDefaultSize)
|
|
||||||
// child->SetSize(sz*scale_f);
|
|
||||||
}
|
}
|
||||||
window->Layout();
|
window->Layout();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainFrame::on_dpi_changed(const wxRect &suggested_rect)
|
void MainFrame::on_dpi_changed(const wxRect &suggested_rect)
|
||||||
{
|
{
|
||||||
|
if (!m_can_rescale_application)
|
||||||
|
return;
|
||||||
|
|
||||||
printf("WM_DPICHANGED: %.2f\n", scale_factor());
|
printf("WM_DPICHANGED: %.2f\n", scale_factor());
|
||||||
|
|
||||||
// ->-
|
|
||||||
const float old_sc_factor = prev_scale_factor();
|
const float old_sc_factor = prev_scale_factor();
|
||||||
const float new_sc_factor = scale_factor();
|
const float new_sc_factor = scale_factor();
|
||||||
|
|
||||||
if (fabs(old_sc_factor - new_sc_factor) > 0.001)
|
if (fabs(old_sc_factor - new_sc_factor) > 0.001)
|
||||||
{
|
{
|
||||||
|
printf("\told_sc_factor: %.2f\n", old_sc_factor);
|
||||||
|
printf("\tnew_sc_factor: %.2f\n", new_sc_factor);
|
||||||
|
|
||||||
Freeze();
|
Freeze();
|
||||||
|
|
||||||
scale(this, new_sc_factor / old_sc_factor);
|
scale_controls_fonts(this, new_sc_factor / old_sc_factor);
|
||||||
wxGetApp().scale_fonts(new_sc_factor / old_sc_factor);
|
wxGetApp().scale_default_fonts(new_sc_factor / old_sc_factor);
|
||||||
|
|
||||||
const auto new_em_unit = wxGetApp().em_unit()*new_sc_factor / old_sc_factor;
|
const auto new_em_unit = wxGetApp().em_unit()*new_sc_factor / old_sc_factor;
|
||||||
wxGetApp().set_em_unit(std::max<size_t>(10, new_em_unit));
|
wxGetApp().set_em_unit(std::max<size_t>(10, new_em_unit));
|
||||||
|
@ -309,8 +334,8 @@ void MainFrame::on_dpi_changed(const wxRect &suggested_rect)
|
||||||
Thaw();
|
Thaw();
|
||||||
|
|
||||||
Refresh();
|
Refresh();
|
||||||
}
|
reset_prev_scale_factor();
|
||||||
// -<-
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainFrame::init_menubar()
|
void MainFrame::init_menubar()
|
||||||
|
|
|
@ -44,6 +44,8 @@ struct PresetTab {
|
||||||
class MainFrame : public DPIFrame
|
class MainFrame : public DPIFrame
|
||||||
{
|
{
|
||||||
bool m_loaded {false};
|
bool m_loaded {false};
|
||||||
|
bool m_can_rescale_application {true};
|
||||||
|
float m_scale_factor_cache;
|
||||||
|
|
||||||
wxString m_qs_last_input_file = wxEmptyString;
|
wxString m_qs_last_input_file = wxEmptyString;
|
||||||
wxString m_qs_last_output_file = wxEmptyString;
|
wxString m_qs_last_output_file = wxEmptyString;
|
||||||
|
|
|
@ -728,7 +728,8 @@ Sidebar::Sidebar(Plater *parent)
|
||||||
// Buttons underneath the scrolled area
|
// Buttons underneath the scrolled area
|
||||||
|
|
||||||
auto init_btn = [this](wxButton **btn, wxString label) {
|
auto init_btn = [this](wxButton **btn, wxString label) {
|
||||||
*btn = new wxButton(this, wxID_ANY, label);
|
*btn = new wxButton(this, wxID_ANY, label, wxDefaultPosition,
|
||||||
|
wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER);
|
||||||
(*btn)->SetFont(wxGetApp().bold_font());
|
(*btn)->SetFont(wxGetApp().bold_font());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -3203,10 +3203,11 @@ ConfigOptionsGroupShp Page::new_optgroup(const wxString& title, int noncommon_la
|
||||||
// mode == comAdvanced ? "mode_middle_.png" : "mode_simple_.png";
|
// mode == comAdvanced ? "mode_middle_.png" : "mode_simple_.png";
|
||||||
// }
|
// }
|
||||||
// auto bmp = new wxStaticBitmap(parent, wxID_ANY, bmp_name.empty() ? wxNullBitmap : create_scaled_bitmap(parent, bmp_name));
|
// auto bmp = new wxStaticBitmap(parent, wxID_ANY, bmp_name.empty() ? wxNullBitmap : create_scaled_bitmap(parent, bmp_name));
|
||||||
|
int mode_id = int(options[0].opt.mode);
|
||||||
const wxBitmap& bitmap = options.size() == 0 || options[0].opt.gui_type == "legend" ? wxNullBitmap :
|
const wxBitmap& bitmap = options.size() == 0 || options[0].opt.gui_type == "legend" ? wxNullBitmap :
|
||||||
m_mode_bitmap_cache[int(options[0].opt.mode)].bmp();
|
m_mode_bitmap_cache[mode_id].bmp();
|
||||||
auto bmp = new wxStaticBitmap(parent, wxID_ANY, bitmap);
|
auto bmp = new wxStaticBitmap(parent, wxID_ANY, bitmap);
|
||||||
bmp->SetClientData((void*)options[0].opt.mode);
|
bmp->SetClientData((void*)&m_mode_bitmap_cache[mode_id]);
|
||||||
|
|
||||||
bmp->SetBackgroundStyle(wxBG_STYLE_PAINT);
|
bmp->SetBackgroundStyle(wxBG_STYLE_PAINT);
|
||||||
return bmp;
|
return bmp;
|
||||||
|
@ -3251,7 +3252,7 @@ ConfigOptionsGroupShp Page::new_optgroup(const wxString& title, int noncommon_la
|
||||||
if (ctrl == nullptr)
|
if (ctrl == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ctrl->SetBitmap(m_mode_bitmap_cache[reinterpret_cast<int>(ctrl->GetClientData())].bmp());
|
ctrl->SetBitmap(reinterpret_cast<PrusaBitmap*>(ctrl->GetClientData())->bmp());
|
||||||
};
|
};
|
||||||
|
|
||||||
vsizer()->Add(optgroup->sizer, 0, wxEXPAND | wxALL, 10);
|
vsizer()->Add(optgroup->sizer, 0, wxEXPAND | wxALL, 10);
|
||||||
|
|
Loading…
Add table
Reference in a new issue