WIP (NewUI with fonts): Next improvements for fonts.

* Fixed new font applying for TreeCtrl and DataViewCtrl
* Fixed update of the em_unit in respect to the new font size
+ MSW specific: Fixed re-scaling of the non-standard buttons
This commit is contained in:
YuSanka 2023-07-21 16:59:18 +02:00 committed by Lukas Matena
parent a4767695ea
commit f27ad88d55
7 changed files with 37 additions and 47 deletions

View File

@ -154,7 +154,14 @@ bool BitmapTextRenderer::Render(wxRect rect, wxDC *dc, int state)
// workaround for Windows DarkMode : Don't respect to the state & wxDATAVIEW_CELL_SELECTED to avoid update of the text color
RenderText(m_value.GetText(), xoffset, rect, dc, state & wxDATAVIEW_CELL_SELECTED ? 0 :state);
#else
{
wxDataViewCtrl* const view = GetView();
if (GetAttr().HasFont())
dc->SetFont(GetAttr().GetEffectiveFont(view->GetFont()));
else
dc->SetFont(view->GetFont());
RenderText(m_value.GetText(), xoffset, rect, dc, state);
}
#endif
return true;
@ -165,22 +172,22 @@ wxSize BitmapTextRenderer::GetSize() const
if (!m_value.GetText().empty())
{
wxSize size;
wxDataViewCtrl* const view = GetView();
wxClientDC dc(view);
if (GetAttr().HasFont())
dc.SetFont(GetAttr().GetEffectiveFont(view->GetFont()));
else
dc.SetFont(view->GetFont());
#if defined(SUPPORTS_MARKUP) && defined(wxHAS_GENERIC_DATAVIEWCTRL)
if (m_markupText)
{
wxDataViewCtrl* const view = GetView();
wxClientDC dc(view);
if (GetAttr().HasFont())
dc.SetFont(GetAttr().GetEffectiveFont(view->GetFont()));
size = m_markupText->Measure(dc);
int lines = m_value.GetText().Freq('\n') + 1;
size.SetHeight(size.GetHeight() * lines);
}
else
#endif // SUPPORTS_MARKUP && wxHAS_GENERIC_DATAVIEWCTRL
size = GetTextExtent(m_value.GetText());
size = dc.GetTextExtent(m_value.GetText());
int lines = m_value.GetText().Freq('\n') + 1;
size.SetHeight(size.GetHeight() * lines);
if (m_value.GetBitmap().IsOk())
size.x += m_value.GetBitmap().GetWidth() + 4;

View File

@ -94,17 +94,13 @@ public:
m_prev_scale_factor = m_scale_factor;
m_normal_font = get_default_font_for_dpi(this, dpi);
if (font_point_size > 0) {
m_font_size = font_point_size;
if (font_point_size > 0)
m_normal_font.SetPointSize(font_point_size);
}
/* Because of default window font is a primary display font,
* We should set correct font for window before getting em_unit value.
*/
#ifndef __WXOSX__ // Don't call SetFont under OSX to avoid name cutting in ObjectList
this->SetFont(m_normal_font);
#endif
this->CenterOnParent();
#ifdef _WIN32
update_dark_ui(this);
@ -113,7 +109,13 @@ public:
// Linux specific issue : get_dpi_for_window(this) still doesn't responce to the Display's scale in new wxWidgets(3.1.3).
// So, calculate the m_em_unit value from the font size, as before
#if !defined(__WXGTK__)
m_em_unit = std::max<size_t>(10/*m_font_size*/, int(m_scale_factor * m_font_size));
#ifdef _WIN32
const double font_to_em_koef = 10./9.;// Default font point size on Windows is 9 pt
#else // ifdef __WXOSX__
const double font_to_em_koef = 10./11.;// Default font point size on OSX is 11 pt
#endif
m_em_unit_from_font_size = int(font_to_em_koef * m_normal_font.GetPointSize());
m_em_unit = std::max<int>(10, int(m_scale_factor * m_em_unit_from_font_size));
#else
// initialize default width_unit according to the width of the one symbol ("m") of the currently active font of this window.
m_em_unit = std::max<size_t>(10, this->GetTextExtent("m").x - 1);
@ -198,7 +200,7 @@ protected:
private:
float m_scale_factor;
int m_em_unit;
int m_font_size {10};
int m_em_unit_from_font_size {10};
wxFont m_normal_font;
float m_prev_scale_factor;
@ -247,7 +249,7 @@ private:
m_normal_font = this->GetFont();
// update em_unit value for new window font
m_em_unit = std::max<int>(m_font_size, int(m_scale_factor * m_font_size));
m_em_unit = std::max<int>(10, int(m_scale_factor * m_em_unit_from_font_size));
// rescale missed controls sizes and images
on_dpi_changed(suggested_rect);

View File

@ -2305,15 +2305,7 @@ SettingsDialog::SettingsDialog(MainFrame* mainframe)
if (wxGetApp().is_gcode_viewer())
return;
#if defined(__WXMSW__)
// ys_FIXME! temporary workaround for correct font scaling
// Because of from wxWidgets 3.1.3 auto rescaling is implemented for the Fonts,
// From the very beginning set dialog font to the wxSYS_DEFAULT_GUI_FONT
this->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
#else
this->SetFont(wxGetApp().normal_font());
// this->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
#endif // __WXMSW__
// this->SetFont(wxGetApp().normal_font());
// Load the icon either from the exe, or from the ico file.
#if _WIN32

View File

@ -3712,6 +3712,7 @@ void Tab::rebuild_page_tree()
continue;
auto itemId = m_treectrl->AppendItem(rootItem, translate_category(p->title(), m_type), p->iconID());
m_treectrl->SetItemTextColour(itemId, p->get_item_colour());
m_treectrl->SetItemFont(itemId, wxGetApp().normal_font());
if (translate_category(p->title(), m_type) == selected)
item = itemId;
}

View File

@ -839,13 +839,7 @@ UnsavedChangesDialog::UnsavedChangesDialog(Preset::Type type, PresetCollection*
void UnsavedChangesDialog::build(Preset::Type type, PresetCollection* dependent_presets, const std::string& new_selected_preset, const wxString& header)
{
#if defined(__WXMSW__)
// ys_FIXME! temporary workaround for correct font scaling
// Because of from wxWidgets 3.1.3 auto rescaling is implemented for the Fonts,
// From the very beginning set dialog font to the wxSYS_DEFAULT_GUI_FONT
// this->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
this->SetFont(wxGetApp().normal_font());
#endif // __WXMSW__
int border = 10;
int em = em_unit();
@ -1338,7 +1332,7 @@ void UnsavedChangesDialog::on_dpi_changed(const wxRect& suggested_rect)
{
int em = em_unit();
msw_buttons_rescale(this, em, { wxID_CANCEL, m_save_btn_id, m_move_btn_id, m_continue_btn_id });
msw_buttons_rescale(this, em, { wxID_CANCEL, m_save_btn_id, m_move_btn_id, m_continue_btn_id }, 1.5);
const wxSize& size = wxSize(70 * em, 30 * em);
SetMinSize(size);
@ -1485,6 +1479,7 @@ void DiffPresetDialog::create_presets_sizer()
auto add_preset_combobox = [collection, sizer, new_type, this](PresetComboBox** cb_, PresetBundle* preset_bundle) {
*cb_ = new PresetComboBox(this, new_type, wxSize(em_unit() * 35, -1), preset_bundle);
PresetComboBox*cb = (*cb_);
cb->SetFont(this->GetFont());
cb->show_modif_preset_separately();
cb->set_selection_changed_function([this, new_type, preset_bundle, cb](int selection) {
std::string preset_name = Preset::remove_suffix_modified(cb->GetString(selection).ToUTF8().data());
@ -1549,6 +1544,7 @@ void DiffPresetDialog::create_info_lines()
void DiffPresetDialog::create_tree()
{
m_tree = new DiffViewCtrl(this, wxSize(em_unit() * 65, em_unit() * 40));
m_tree->SetFont(this->GetFont());
m_tree->AppendToggleColumn_(L"\u2714", DiffModel::colToggle, wxLinux ? 9 : 6);
m_tree->AppendBmpTextColumn("", DiffModel::colIconText, 35);
m_tree->AppendBmpTextColumn(_L("Left Preset Value"), DiffModel::colOldValue, 15);
@ -1670,17 +1666,9 @@ void DiffPresetDialog::complete_dialog_creation()
}
DiffPresetDialog::DiffPresetDialog(MainFrame* mainframe)
: DPIDialog(mainframe, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER),
: DPIDialog(mainframe, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER, "diff_presets_dialog", mainframe->normal_font().GetPointSize()),
m_pr_technology(wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology())
{
#if defined(__WXMSW__)
// ys_FIXME! temporary workaround for correct font scaling
// Because of from wxWidgets 3.1.3 auto rescaling is implemented for the Fonts,
// From the very beginning set dialog font to the wxSYS_DEFAULT_GUI_FONT
// this->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
this->SetFont(mainframe->normal_font());
#endif // __WXMSW__
// Init bundles
assert(wxGetApp().preset_bundle);

View File

@ -372,9 +372,9 @@ void edit_tooltip(wxString& tooltip)
/* Function for rescale of buttons in Dialog under MSW if dpi is changed.
* btn_ids - vector of buttons identifiers
*/
void msw_buttons_rescale(wxDialog* dlg, const int em_unit, const std::vector<int>& btn_ids)
void msw_buttons_rescale(wxDialog* dlg, const int em_unit, const std::vector<int>& btn_ids, double height_koef/* = 1.*/)
{
const wxSize& btn_size = wxSize(-1, int(2.5f * em_unit + 0.5f));
const wxSize& btn_size = wxSize(-1, int(2.5 * em_unit * height_koef + 0.5f));
for (int btn_id : btn_ids) {
// There is a case [FirmwareDialog], when we have wxControl instead of wxButton

View File

@ -50,7 +50,7 @@ void enable_menu_item(wxUpdateUIEvent& evt, std::function<bool()> const cb_condi
class wxDialog;
void edit_tooltip(wxString& tooltip);
void msw_buttons_rescale(wxDialog* dlg, const int em_unit, const std::vector<int>& btn_ids);
void msw_buttons_rescale(wxDialog* dlg, const int em_unit, const std::vector<int>& btn_ids, double height_koef = 1.);
int em_unit(wxWindow* win);
int mode_icon_px_size();