From 53d752b6065421f6169febd88185d056556d002e Mon Sep 17 00:00:00 2001 From: Ocraftyone Date: Thu, 21 Dec 2023 03:27:02 -0500 Subject: [PATCH] Fix wx issues from upgrade (#3032) * fix top bar resizing * Attempt to fix bitmap bundle scaling issues * Revert "Attempt to fix bitmap bundle scaling issues" This reverts commit e94ba58d907b1b2da5a9e27ad552e1d7f1288c18. * Fix AboutDialog and partially fix SwitchButton * Fix switch button scaling on windows * Fix dropdown icon size * fixed sdcard/recording/timelapse icon size in device page * Set use_legacy_bmp to true by default to it's back compatible --------- Co-authored-by: Noisyfox Co-authored-by: SoftFever --- src/slic3r/GUI/AboutDialog.cpp | 2 +- src/slic3r/GUI/BBLTopbar.cpp | 89 ++++++++++++++----------- src/slic3r/GUI/BBLTopbar.hpp | 8 +-- src/slic3r/GUI/StatusPanel.cpp | 36 +++++----- src/slic3r/GUI/Widgets/SwitchButton.cpp | 8 ++- src/slic3r/GUI/Widgets/TextInput.cpp | 43 ++++++++---- src/slic3r/GUI/Widgets/TextInput.hpp | 5 +- src/slic3r/GUI/wxExtensions.cpp | 35 +++++++--- src/slic3r/GUI/wxExtensions.hpp | 15 +++-- 9 files changed, 148 insertions(+), 93 deletions(-) diff --git a/src/slic3r/GUI/AboutDialog.cpp b/src/slic3r/GUI/AboutDialog.cpp index de4aca579..0b3b36086 100644 --- a/src/slic3r/GUI/AboutDialog.cpp +++ b/src/slic3r/GUI/AboutDialog.cpp @@ -232,7 +232,7 @@ AboutDialog::AboutDialog() main_sizer->Add(ver_sizer, 0, wxEXPAND | wxALL, 0); // logo - m_logo_bitmap = ScalableBitmap(this, "OrcaSlicer_about", 250); + m_logo_bitmap = ScalableBitmap(this, "OrcaSlicer_about", {562,250}); m_logo = new wxStaticBitmap(this, wxID_ANY, m_logo_bitmap.bmp(), wxDefaultPosition,wxDefaultSize, 0); m_logo->SetSizer(vesizer); diff --git a/src/slic3r/GUI/BBLTopbar.cpp b/src/slic3r/GUI/BBLTopbar.cpp index 99a0e70d5..654cdca15 100644 --- a/src/slic3r/GUI/BBLTopbar.cpp +++ b/src/slic3r/GUI/BBLTopbar.cpp @@ -29,6 +29,11 @@ enum CUSTOM_ID ID_AMS_NOTEBOOK, }; +static bool IsThemeDark() +{ + return wxSystemSettings::GetAppearance().IsDark(); +} + class BBLTopbarArt : public wxAuiDefaultToolBarArt { public: @@ -130,18 +135,18 @@ void BBLTopbarArt::DrawButton(wxDC& dc, wxWindow* wnd, const wxAuiToolBarItem& i if (item.GetState() & wxAUI_BUTTON_STATE_PRESSED) { dc.SetPen(wxPen(m_highlightColour)); - dc.SetBrush(wxBrush(m_highlightColour.ChangeLightness(20))); + dc.SetBrush(wxBrush(m_highlightColour.ChangeLightness(IsThemeDark() ? 20 : 150))); dc.DrawRectangle(rect); } else if ((item.GetState() & wxAUI_BUTTON_STATE_HOVER) || item.IsSticky()) { dc.SetPen(wxPen(m_highlightColour)); - dc.SetBrush(wxBrush(m_highlightColour.ChangeLightness(40))); + dc.SetBrush(wxBrush(m_highlightColour.ChangeLightness(IsThemeDark() ? 40 : 170))); // draw an even lighter background for checked item hovers (since // the hover background is the same color as the check background) if (item.GetState() & wxAUI_BUTTON_STATE_CHECKED) - dc.SetBrush(wxBrush(m_highlightColour.ChangeLightness(50))); + dc.SetBrush(wxBrush(m_highlightColour.ChangeLightness(IsThemeDark() ? 50 : 180))); dc.DrawRectangle(rect); } @@ -150,7 +155,7 @@ void BBLTopbarArt::DrawButton(wxDC& dc, wxWindow* wnd, const wxAuiToolBarItem& i // it's important to put this code in an else statement after the // hover, otherwise hovers won't draw properly for checked items dc.SetPen(wxPen(m_highlightColour)); - dc.SetBrush(wxBrush(m_highlightColour.ChangeLightness(40))); + dc.SetBrush(wxBrush(m_highlightColour.ChangeLightness(IsThemeDark() ? 40 : 170))); dc.DrawRectangle(rect); } } @@ -195,23 +200,25 @@ void BBLTopbar::Init(wxFrame* parent) m_skip_popup_dropdown_menu = false; m_skip_popup_calib_menu = false; + m_font.Scale(parent->GetDPIScaleFactor()); + wxInitAllImageHandlers(); this->AddSpacer(5); - /*wxBitmap logo_bitmap = create_scaled_bitmap("topbar_logo", nullptr, TOPBAR_ICON_SIZE); + /*wxBitmap logo_bitmap = *get_bmp_bundle("topbar_logo", TOPBAR_ICON_SIZE); wxAuiToolBarItem* logo_item = this->AddTool(ID_LOGO, "", logo_bitmap); logo_item->SetHoverBitmap(logo_bitmap); logo_item->SetActive(false);*/ - wxBitmap file_bitmap = create_scaled_bitmap("topbar_file", nullptr, TOPBAR_ICON_SIZE); + wxBitmapBundle file_bitmap = *get_bmp_bundle("topbar_file", TOPBAR_ICON_SIZE); m_file_menu_item = this->AddTool(ID_TOP_FILE_MENU, _L("File"), file_bitmap, wxEmptyString, wxITEM_NORMAL); this->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); this->AddSpacer(FromDIP(5)); - wxBitmap dropdown_bitmap = create_scaled_bitmap("topbar_dropdown", nullptr, TOPBAR_ICON_SIZE); + wxBitmapBundle dropdown_bitmap = *get_bmp_bundle("topbar_dropdown", TOPBAR_ICON_SIZE); m_dropdown_menu_item = this->AddTool(ID_TOP_DROPDOWN_MENU, "", dropdown_bitmap, wxEmptyString); @@ -219,32 +226,32 @@ void BBLTopbar::Init(wxFrame* parent) this->AddSeparator(); this->AddSpacer(FromDIP(5)); - //wxBitmap open_bitmap = create_scaled_bitmap("topbar_open", nullptr, TOPBAR_ICON_SIZE); + //wxBitmap open_bitmap = *get_bmp_bundle("topbar_open", TOPBAR_ICON_SIZE); //wxAuiToolBarItem* tool_item = this->AddTool(wxID_OPEN, "", open_bitmap); this->AddSpacer(FromDIP(10)); - wxBitmap save_bitmap = create_scaled_bitmap("topbar_save", nullptr, TOPBAR_ICON_SIZE); + wxBitmapBundle save_bitmap = *get_bmp_bundle("topbar_save", TOPBAR_ICON_SIZE); wxAuiToolBarItem* save_btn = this->AddTool(wxID_SAVE, "", save_bitmap); this->AddSpacer(FromDIP(10)); - wxBitmap undo_bitmap = create_scaled_bitmap("topbar_undo", nullptr, TOPBAR_ICON_SIZE); + wxBitmapBundle undo_bitmap = *get_bmp_bundle("topbar_undo", TOPBAR_ICON_SIZE); m_undo_item = this->AddTool(wxID_UNDO, "", undo_bitmap); - wxBitmap undo_inactive_bitmap = create_scaled_bitmap("topbar_undo_inactive", nullptr, TOPBAR_ICON_SIZE); + wxBitmapBundle undo_inactive_bitmap = *get_bmp_bundle("topbar_undo_inactive", TOPBAR_ICON_SIZE); m_undo_item->SetDisabledBitmap(undo_inactive_bitmap); this->AddSpacer(FromDIP(10)); - wxBitmap redo_bitmap = create_scaled_bitmap("topbar_redo", nullptr, TOPBAR_ICON_SIZE); + wxBitmapBundle redo_bitmap = *get_bmp_bundle("topbar_redo", TOPBAR_ICON_SIZE); m_redo_item = this->AddTool(wxID_REDO, "", redo_bitmap); - wxBitmap redo_inactive_bitmap = create_scaled_bitmap("topbar_redo_inactive", nullptr, TOPBAR_ICON_SIZE); + wxBitmapBundle redo_inactive_bitmap = *get_bmp_bundle("topbar_redo_inactive", TOPBAR_ICON_SIZE); m_redo_item->SetDisabledBitmap(redo_inactive_bitmap); this->AddSpacer(FromDIP(10)); - wxBitmap calib_bitmap = create_scaled_bitmap("calib_sf", nullptr, TOPBAR_ICON_SIZE); - wxBitmap calib_bitmap_inactive = create_scaled_bitmap("calib_sf_inactive", nullptr, TOPBAR_ICON_SIZE); + wxBitmapBundle calib_bitmap = *get_bmp_bundle("calib_sf", TOPBAR_ICON_SIZE); + wxBitmapBundle calib_bitmap_inactive = *get_bmp_bundle("calib_sf_inactive", TOPBAR_ICON_SIZE); m_calib_item = this->AddTool(ID_CALIB, _L("Calibration"), calib_bitmap); m_calib_item->SetDisabledBitmap(calib_bitmap_inactive); @@ -257,14 +264,14 @@ void BBLTopbar::Init(wxFrame* parent) this->AddSpacer(FromDIP(10)); this->AddStretchSpacer(1); - m_publish_bitmap = create_scaled_bitmap("topbar_publish", nullptr, TOPBAR_ICON_SIZE); + m_publish_bitmap = *get_bmp_bundle("topbar_publish", TOPBAR_ICON_SIZE); m_publish_item = this->AddTool(ID_PUBLISH, "", m_publish_bitmap); - m_publish_disable_bitmap = create_scaled_bitmap("topbar_publish_disable", nullptr, TOPBAR_ICON_SIZE); + m_publish_disable_bitmap = *get_bmp_bundle("topbar_publish_disable", TOPBAR_ICON_SIZE); m_publish_item->SetDisabledBitmap(m_publish_disable_bitmap); this->EnableTool(m_publish_item->GetId(), false); this->AddSpacer(FromDIP(4)); - /*wxBitmap model_store_bitmap = create_scaled_bitmap("topbar_store", nullptr, TOPBAR_ICON_SIZE); + /*wxBitmap model_store_bitmap = *get_bmp_bundle("topbar_store", TOPBAR_ICON_SIZE); m_model_store_item = this->AddTool(ID_MODEL_STORE, "", model_store_bitmap); this->AddSpacer(12); */ @@ -272,13 +279,13 @@ void BBLTopbar::Init(wxFrame* parent) //this->AddSeparator(); this->AddSpacer(FromDIP(4)); - wxBitmap iconize_bitmap = create_scaled_bitmap("topbar_min", nullptr, TOPBAR_ICON_SIZE); + wxBitmapBundle iconize_bitmap = *get_bmp_bundle("topbar_min", TOPBAR_ICON_SIZE); wxAuiToolBarItem* iconize_btn = this->AddTool(wxID_ICONIZE_FRAME, "", iconize_bitmap); this->AddSpacer(FromDIP(4)); - maximize_bitmap = create_scaled_bitmap("topbar_max", nullptr, TOPBAR_ICON_SIZE); - window_bitmap = create_scaled_bitmap("topbar_win", nullptr, TOPBAR_ICON_SIZE); + maximize_bitmap = *get_bmp_bundle("topbar_max", TOPBAR_ICON_SIZE); + window_bitmap = *get_bmp_bundle("topbar_win", TOPBAR_ICON_SIZE); if (m_frame->IsMaximized()) { maximize_btn = this->AddTool(wxID_MAXIMIZE_FRAME, "", window_bitmap); } @@ -288,7 +295,7 @@ void BBLTopbar::Init(wxFrame* parent) this->AddSpacer(FromDIP(4)); - wxBitmap close_bitmap = create_scaled_bitmap("topbar_close", nullptr, TOPBAR_ICON_SIZE); + wxBitmapBundle close_bitmap = *get_bmp_bundle("topbar_close", TOPBAR_ICON_SIZE); wxAuiToolBarItem* close_btn = this->AddTool(wxID_CLOSE_FRAME, "", close_bitmap); Realize(); @@ -464,49 +471,51 @@ void BBLTopbar::Rescale() { int em = em_unit(this); wxAuiToolBarItem* item; + m_font.Scale(m_frame->GetDPIScaleFactor()); + /*item = this->FindTool(ID_LOGO); - item->SetBitmap(create_scaled_bitmap("topbar_logo", nullptr, TOPBAR_ICON_SIZE));*/ + item->SetBitmap(*get_bmp_bundle("topbar_logo", TOPBAR_ICON_SIZE));*/ item = this->FindTool(ID_TOP_FILE_MENU); - item->SetBitmap(create_scaled_bitmap("topbar_file", this, TOPBAR_ICON_SIZE)); + item->SetBitmap(*get_bmp_bundle("topbar_file", TOPBAR_ICON_SIZE)); item = this->FindTool(ID_TOP_DROPDOWN_MENU); - item->SetBitmap(create_scaled_bitmap("topbar_dropdown", this, TOPBAR_ICON_SIZE)); + item->SetBitmap(*get_bmp_bundle("topbar_dropdown", TOPBAR_ICON_SIZE)); //item = this->FindTool(wxID_OPEN); - //item->SetBitmap(create_scaled_bitmap("topbar_open", nullptr, TOPBAR_ICON_SIZE)); + //item->SetBitmap(*get_bmp_bundle("topbar_open", nullptr, TOPBAR_ICON_SIZE)); item = this->FindTool(wxID_SAVE); - item->SetBitmap(create_scaled_bitmap("topbar_save", this, TOPBAR_ICON_SIZE)); + item->SetBitmap(*get_bmp_bundle("topbar_save", TOPBAR_ICON_SIZE)); item = this->FindTool(wxID_UNDO); - item->SetBitmap(create_scaled_bitmap("topbar_undo", this, TOPBAR_ICON_SIZE)); - item->SetDisabledBitmap(create_scaled_bitmap("topbar_undo_inactive", nullptr, TOPBAR_ICON_SIZE)); + item->SetBitmap(*get_bmp_bundle("topbar_undo", TOPBAR_ICON_SIZE)); + item->SetDisabledBitmap(*get_bmp_bundle("topbar_undo_inactive", TOPBAR_ICON_SIZE)); item = this->FindTool(wxID_REDO); - item->SetBitmap(create_scaled_bitmap("topbar_redo", this, TOPBAR_ICON_SIZE)); - item->SetDisabledBitmap(create_scaled_bitmap("topbar_redo_inactive", nullptr, TOPBAR_ICON_SIZE)); + item->SetBitmap(*get_bmp_bundle("topbar_redo", TOPBAR_ICON_SIZE)); + item->SetDisabledBitmap(*get_bmp_bundle("topbar_redo_inactive", TOPBAR_ICON_SIZE)); item = this->FindTool(ID_CALIB); - item->SetBitmap(create_scaled_bitmap("calib_sf", nullptr, TOPBAR_ICON_SIZE)); - item->SetDisabledBitmap(create_scaled_bitmap("calib_sf_inactive", nullptr, TOPBAR_ICON_SIZE)); + item->SetBitmap(*get_bmp_bundle("calib_sf", TOPBAR_ICON_SIZE)); + item->SetDisabledBitmap(*get_bmp_bundle("calib_sf_inactive", TOPBAR_ICON_SIZE)); item = this->FindTool(ID_TITLE); /*item = this->FindTool(ID_PUBLISH); - item->SetBitmap(create_scaled_bitmap("topbar_publish", this, TOPBAR_ICON_SIZE)); - item->SetDisabledBitmap(create_scaled_bitmap("topbar_publish_disable", nullptr, TOPBAR_ICON_SIZE));*/ + item->SetBitmap(*get_bmp_bundle("topbar_publish", TOPBAR_ICON_SIZE)); + item->SetDisabledBitmap(*get_bmp_bundle("topbar_publish_disable", TOPBAR_ICON_SIZE));*/ /*item = this->FindTool(ID_MODEL_STORE); - item->SetBitmap(create_scaled_bitmap("topbar_store", this, TOPBAR_ICON_SIZE)); + item->SetBitmap(*get_bmp_bundle("topbar_store", TOPBAR_ICON_SIZE)); */ item = this->FindTool(wxID_ICONIZE_FRAME); - item->SetBitmap(create_scaled_bitmap("topbar_min", this, TOPBAR_ICON_SIZE)); + item->SetBitmap(*get_bmp_bundle("topbar_min", TOPBAR_ICON_SIZE)); item = this->FindTool(wxID_MAXIMIZE_FRAME); - maximize_bitmap = create_scaled_bitmap("topbar_max", this, TOPBAR_ICON_SIZE); - window_bitmap = create_scaled_bitmap("topbar_win", this, TOPBAR_ICON_SIZE); + maximize_bitmap = *get_bmp_bundle("topbar_max", TOPBAR_ICON_SIZE); + window_bitmap = *get_bmp_bundle("topbar_win", TOPBAR_ICON_SIZE); if (m_frame->IsMaximized()) { item->SetBitmap(window_bitmap); } @@ -515,7 +524,7 @@ void BBLTopbar::Rescale() { } item = this->FindTool(wxID_CLOSE_FRAME); - item->SetBitmap(create_scaled_bitmap("topbar_close", this, TOPBAR_ICON_SIZE)); + item->SetBitmap(*get_bmp_bundle("topbar_close", TOPBAR_ICON_SIZE)); Realize(); } diff --git a/src/slic3r/GUI/BBLTopbar.hpp b/src/slic3r/GUI/BBLTopbar.hpp index 78820813a..3311c0011 100644 --- a/src/slic3r/GUI/BBLTopbar.hpp +++ b/src/slic3r/GUI/BBLTopbar.hpp @@ -75,11 +75,11 @@ private: wxAuiToolBarItem* m_calib_item; wxAuiToolBarItem* maximize_btn; - wxBitmap m_publish_bitmap; - wxBitmap m_publish_disable_bitmap; + wxBitmapBundle m_publish_bitmap; + wxBitmapBundle m_publish_disable_bitmap; - wxBitmap maximize_bitmap; - wxBitmap window_bitmap; + wxBitmapBundle maximize_bitmap; + wxBitmapBundle window_bitmap; int m_toolbar_h; bool m_skip_popup_file_menu; diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 6a92a1c30..33f307cfe 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -913,15 +913,15 @@ void StatusBasePanel::init_bitmaps() m_bitmap_extruder_empty_unload = *cache.load_png("monitor_extruder_empty_unload", FromDIP(28), FromDIP(70), false, false); m_bitmap_extruder_filled_unload = *cache.load_png("monitor_extruder_filled_unload", FromDIP(28), FromDIP(70), false, false); - m_bitmap_sdcard_state_abnormal = ScalableBitmap(this, wxGetApp().dark_mode() ? "sdcard_state_abnormal_dark" : "sdcard_state_abnormal", 20); - m_bitmap_sdcard_state_normal = ScalableBitmap(this, wxGetApp().dark_mode() ? "sdcard_state_normal_dark" : "sdcard_state_normal", 20); - m_bitmap_sdcard_state_no = ScalableBitmap(this, wxGetApp().dark_mode() ? "sdcard_state_no_dark" : "sdcard_state_no", 20); - m_bitmap_recording_on = ScalableBitmap(this, wxGetApp().dark_mode() ? "monitor_recording_on_dark" : "monitor_recording_on", 20); - m_bitmap_recording_off = ScalableBitmap(this, wxGetApp().dark_mode() ? "monitor_recording_off_dark" : "monitor_recording_off", 20); - m_bitmap_timelapse_on = ScalableBitmap(this, wxGetApp().dark_mode() ? "monitor_timelapse_on_dark" : "monitor_timelapse_on", 20); - m_bitmap_timelapse_off = ScalableBitmap(this, wxGetApp().dark_mode() ? "monitor_timelapse_off_dark" : "monitor_timelapse_off", 20); - m_bitmap_vcamera_on = ScalableBitmap(this, wxGetApp().dark_mode() ? "monitor_vcamera_on_dark" : "monitor_vcamera_on", 20); - m_bitmap_vcamera_off = ScalableBitmap(this, wxGetApp().dark_mode() ? "monitor_vcamera_off_dark" : "monitor_vcamera_off", 20); + m_bitmap_sdcard_state_abnormal = ScalableBitmap(this, wxGetApp().dark_mode() ? "sdcard_state_abnormal_dark" : "sdcard_state_abnormal",{38, 20}); + m_bitmap_sdcard_state_normal = ScalableBitmap(this, wxGetApp().dark_mode() ? "sdcard_state_normal_dark" : "sdcard_state_normal", {38, 20}); + m_bitmap_sdcard_state_no = ScalableBitmap(this, wxGetApp().dark_mode() ? "sdcard_state_no_dark" : "sdcard_state_no", {38, 20}); + m_bitmap_recording_on = ScalableBitmap(this, wxGetApp().dark_mode() ? "monitor_recording_on_dark" : "monitor_recording_on", {38, 20}); + m_bitmap_recording_off = ScalableBitmap(this, wxGetApp().dark_mode() ? "monitor_recording_off_dark" : "monitor_recording_off", {38, 20}); + m_bitmap_timelapse_on = ScalableBitmap(this, wxGetApp().dark_mode() ? "monitor_timelapse_on_dark" : "monitor_timelapse_on", {38, 20}); + m_bitmap_timelapse_off = ScalableBitmap(this, wxGetApp().dark_mode() ? "monitor_timelapse_off_dark" : "monitor_timelapse_off", {38, 20}); + m_bitmap_vcamera_on = ScalableBitmap(this, wxGetApp().dark_mode() ? "monitor_vcamera_on_dark" : "monitor_vcamera_on", {38, 20}); + m_bitmap_vcamera_off = ScalableBitmap(this, wxGetApp().dark_mode() ? "monitor_vcamera_off_dark" : "monitor_vcamera_off", {38, 20}); } @@ -4001,15 +4001,15 @@ void StatusPanel::rescale_camera_icons() m_setting_button->msw_rescale(); - m_bitmap_sdcard_state_abnormal = ScalableBitmap(this, wxGetApp().dark_mode()?"sdcard_state_abnormal_dark":"sdcard_state_abnormal", 20); - m_bitmap_sdcard_state_normal = ScalableBitmap(this, wxGetApp().dark_mode()?"sdcard_state_normal_dark":"sdcard_state_normal", 20); - m_bitmap_sdcard_state_no = ScalableBitmap(this, wxGetApp().dark_mode()?"sdcard_state_no_dark":"sdcard_state_no", 20); - m_bitmap_recording_on = ScalableBitmap(this, wxGetApp().dark_mode()?"monitor_recording_on_dark":"monitor_recording_on", 20); - m_bitmap_recording_off = ScalableBitmap(this, wxGetApp().dark_mode()?"monitor_recording_off_dark":"monitor_recording_off", 20); - m_bitmap_timelapse_on = ScalableBitmap(this, wxGetApp().dark_mode()?"monitor_timelapse_on_dark":"monitor_timelapse_on", 20); - m_bitmap_timelapse_off = ScalableBitmap(this, wxGetApp().dark_mode()?"monitor_timelapse_off_dark":"monitor_timelapse_off", 20); - m_bitmap_vcamera_on = ScalableBitmap(this, wxGetApp().dark_mode()?"monitor_vcamera_on_dark":"monitor_vcamera_on", 20); - m_bitmap_vcamera_off = ScalableBitmap(this, wxGetApp().dark_mode()?"monitor_vcamera_off_dark":"monitor_vcamera_off", 20); + m_bitmap_sdcard_state_abnormal = ScalableBitmap(this, wxGetApp().dark_mode()?"sdcard_state_abnormal_dark":"sdcard_state_abnormal", {38, 20}); + m_bitmap_sdcard_state_normal = ScalableBitmap(this, wxGetApp().dark_mode()?"sdcard_state_normal_dark":"sdcard_state_normal", {38, 20}); + m_bitmap_sdcard_state_no = ScalableBitmap(this, wxGetApp().dark_mode()?"sdcard_state_no_dark":"sdcard_state_no", {38, 20}); + m_bitmap_recording_on = ScalableBitmap(this, wxGetApp().dark_mode()?"monitor_recording_on_dark":"monitor_recording_on", {38, 20}); + m_bitmap_recording_off = ScalableBitmap(this, wxGetApp().dark_mode()?"monitor_recording_off_dark":"monitor_recording_off", {38, 20}); + m_bitmap_timelapse_on = ScalableBitmap(this, wxGetApp().dark_mode()?"monitor_timelapse_on_dark":"monitor_timelapse_on", {38, 20}); + m_bitmap_timelapse_off = ScalableBitmap(this, wxGetApp().dark_mode()?"monitor_timelapse_off_dark":"monitor_timelapse_off", {38, 20}); + m_bitmap_vcamera_on = ScalableBitmap(this, wxGetApp().dark_mode()?"monitor_vcamera_on_dark":"monitor_vcamera_on", {38, 20}); + m_bitmap_vcamera_off = ScalableBitmap(this, wxGetApp().dark_mode()?"monitor_vcamera_off_dark":"monitor_vcamera_off", {38, 20}); if (m_media_play_ctrl->IsStreaming()) { m_bitmap_vcamera_img->SetBitmap(m_bitmap_vcamera_on.bmp()); diff --git a/src/slic3r/GUI/Widgets/SwitchButton.cpp b/src/slic3r/GUI/Widgets/SwitchButton.cpp index 67aa42457..c44f48812 100644 --- a/src/slic3r/GUI/Widgets/SwitchButton.cpp +++ b/src/slic3r/GUI/Widgets/SwitchButton.cpp @@ -9,8 +9,8 @@ SwitchButton::SwitchButton(wxWindow* parent, wxWindowID id) : wxBitmapToggleButton(parent, id, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE | wxBU_EXACTFIT) - , m_on(this, "toggle_on", 16, false, false, true) - , m_off(this, "toggle_off", 16, false, false, true) + , m_on(this, "toggle_on", {28, 16}) + , m_off(this, "toggle_off", {28, 16}) , text_color(std::pair{0xfffffe, (int) StateColor::Checked}, std::pair{0x6B6B6B, (int) StateColor::Normal}) , track_color(0xD9D9D9) , thumb_color(std::pair{0x009688, (int) StateColor::Checked}, std::pair{0xD9D9D9, (int) StateColor::Normal}) @@ -101,7 +101,8 @@ void SwitchButton::Rescale() for (int i = 0; i < 2; ++i) { wxMemoryDC memdc(&dc); #ifdef __WXMSW__ - wxBitmap bmp(trackSize.x, trackSize.y); + wxBitmap bmp; + bmp.CreateWithDIPSize(ToDIP(trackSize), GetDPIScaleFactor()); memdc.SelectObject(bmp); memdc.SetBackground(wxBrush(GetBackgroundColour())); memdc.Clear(); @@ -145,4 +146,5 @@ void SwitchButton::Rescale() void SwitchButton::update() { SetBitmap((GetValue() ? m_on : m_off).bmp()); + } diff --git a/src/slic3r/GUI/Widgets/TextInput.cpp b/src/slic3r/GUI/Widgets/TextInput.cpp index 229101091..428a5dcea 100644 --- a/src/slic3r/GUI/Widgets/TextInput.cpp +++ b/src/slic3r/GUI/Widgets/TextInput.cpp @@ -76,7 +76,7 @@ void TextInput::Create(wxWindow * parent, }); text_ctrl->Bind(wxEVT_RIGHT_DOWN, [this](auto &e) {}); // disable context menu if (!icon.IsEmpty()) { - this->icon = ScalableBitmap(this, icon.ToStdString(), 16); + this->drop_down_icon = ScalableBitmap(this, icon.ToStdString(), 16); } messureSize(); } @@ -96,9 +96,7 @@ void TextInput::SetLabel(const wxString& label) void TextInput::SetIcon(const wxBitmapBundle &icon_in) { - this->icon = ScalableBitmap(); - this->icon.bmp() = icon_in; - Rescale(); + icon = icon_in; } void TextInput::SetLabelColor(StateColor const &color) @@ -115,8 +113,9 @@ void TextInput::SetTextColor(StateColor const& color) void TextInput::Rescale() { - if (!this->icon.name().empty()) - this->icon.sys_color_changed(); + if (text_ctrl) + text_ctrl->SetInitialSize(text_ctrl->GetBestSize()); + messureSize(); Refresh(); } @@ -152,16 +151,22 @@ void TextInput::DoSetSize(int x, int y, int width, int height, int sizeFlags) if (sizeFlags & wxSIZE_USE_EXISTING) return; wxSize size = GetSize(); wxPoint textPos = {5, 0}; - if (this->icon.bmp().IsOk()) { - wxSize szIcon = this->icon.GetSize(); + if (this->icon.IsOk()) { + wxSize szIcon = get_preferred_size(icon, m_parent); textPos.x += szIcon.x; } + wxSize dd_icon_size = wxSize(0,0); + if (this->drop_down_icon.bmp().IsOk()) + dd_icon_size = this->drop_down_icon.GetSize(); + bool align_right = GetWindowStyle() & wxRIGHT; if (align_right) textPos.x += labelSize.x; if (text_ctrl) { wxSize textSize = text_ctrl->GetSize(); - textSize.x = size.x - textPos.x - labelSize.x - 10; + wxClientDC dc(this); + const int r_shift = int((dd_icon_size.x == 0 ? 3. : 2.) * dc.GetContentScaleFactor()); + textSize.x = size.x - textPos.x - labelSize.x - dd_icon_size.x - r_shift; text_ctrl->SetSize(textSize); text_ctrl->SetPosition({textPos.x, (size.y - textSize.y) / 2}); } @@ -193,12 +198,26 @@ void TextInput::render(wxDC& dc) bool align_right = GetWindowStyle() & wxRIGHT; // start draw wxPoint pt = {5, 0}; - if (icon.bmp().IsOk()) { - wxSize szIcon = get_preferred_size(icon.bmp(), m_parent); + if (icon.IsOk()) { + wxSize szIcon = get_preferred_size(icon, m_parent); pt.y = (size.y - szIcon.y) / 2; - dc.DrawBitmap(icon.get_bitmap(), pt); +#ifdef __WXGTK3__ + dc.DrawBitmap(icon.GetBitmap(szIcon), pt); +#else + dc.DrawBitmap(icon.GetBitmapFor(m_parent), pt); +#endif pt.x += szIcon.x + 0; } + + // drop_down_icon draw + wxPoint pt_r = {size.x, 0}; + if (drop_down_icon.bmp().IsOk()) { + wxSize szIcon = drop_down_icon.GetSize(); + pt_r.x -= szIcon.x + 2; + pt_r.y = (size.y - szIcon.y) / 2; + dc.DrawBitmap(drop_down_icon.get_bitmap(), pt_r); + } + auto text = wxWindow::GetLabel(); if (!text.IsEmpty()) { wxSize textSize = text_ctrl->GetSize(); diff --git a/src/slic3r/GUI/Widgets/TextInput.hpp b/src/slic3r/GUI/Widgets/TextInput.hpp index fdd5bbf52..4a90bb060 100644 --- a/src/slic3r/GUI/Widgets/TextInput.hpp +++ b/src/slic3r/GUI/Widgets/TextInput.hpp @@ -8,10 +8,11 @@ class TextInput : public wxNavigationEnabled { wxSize labelSize; - ScalableBitmap icon; + wxBitmapBundle icon; + ScalableBitmap drop_down_icon; StateColor label_color; StateColor text_color; - wxTextCtrl * text_ctrl; + wxTextCtrl* text_ctrl{nullptr}; static const int TextInputWidth = 200; static const int TextInputHeight = 50; diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index dc9bf65e1..be95f0903 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -413,17 +413,26 @@ static int scale() } #endif // __WXGTK2__ -wxBitmapBundle* get_bmp_bundle(const std::string& bmp_name_in, int px_cnt/* = 16*/) +wxBitmapBundle* get_bmp_bundle(const std::string& bmp_name_in, int width/* = 16*/, int height/* = -1*/) { +#ifdef __WXGTK2__ + width *= scale(); + if (height > 0) + height *= scale(); +#endif // __WXGTK2__ + static Slic3r::GUI::BitmapCache cache; std::string bmp_name = bmp_name_in; boost::replace_last(bmp_name, ".png", ""); + if (height < 0) + height = width; + // Try loading an SVG first, then PNG if SVG is not found: - wxBitmapBundle* bmp = cache.from_svg(bmp_name, px_cnt, px_cnt, Slic3r::GUI::wxGetApp().dark_mode()); + wxBitmapBundle* bmp = cache.from_svg(bmp_name, width, height, Slic3r::GUI::wxGetApp().dark_mode()); if (bmp == nullptr) { - bmp = cache.from_png(bmp_name, px_cnt, px_cnt); + bmp = cache.from_png(bmp_name, width, height); if (!bmp) // Neither SVG nor PNG has been found, raise error throw Slic3r::RuntimeError("Could not load bitmap: " + bmp_name); @@ -887,7 +896,7 @@ ScalableBitmap::ScalableBitmap( wxWindow *parent, const bool resize/* = false*/, const bool use_legacy_bmp/* = false*/): m_parent(parent), m_icon_name(icon_name), m_legacy_bmp(use_legacy_bmp), - m_px_cnt(px_cnt), m_grayscale(grayscale), m_resize(resize) // BBS: support resize by fill border + m_size({px_cnt, px_cnt}), m_grayscale(grayscale), m_resize(resize) // BBS: support resize by fill border { // Orca: there is currently an issue causing the advanced SwitchButton to not scale properly // when using get_bmp_bundle. This allows for the older method of getting a scaled bitmap to be @@ -895,8 +904,8 @@ ScalableBitmap::ScalableBitmap( wxWindow *parent, if (m_legacy_bmp) { m_bmp = create_scaled_bitmap(icon_name, parent, px_cnt, m_grayscale, std::string(), false, resize); if (px_cnt == 0) { - m_px_cnt = GetHeight(); // scale - unsigned int height = (unsigned int) (parent->FromDIP(m_px_cnt) + 0.5f); + m_size.x = m_size.y = GetHeight(); // scale + unsigned int height = (unsigned int) (parent->FromDIP(px_cnt) + 0.5f); if (height != GetHeight()) sys_color_changed(); } @@ -905,14 +914,24 @@ ScalableBitmap::ScalableBitmap( wxWindow *parent, } } +ScalableBitmap::ScalableBitmap( wxWindow *parent, + const std::string& icon_name, + const wxSize size, + const bool grayscale/* = false*/, + const bool resize/* = false*/): + m_parent(parent), m_icon_name(icon_name), + m_size(size), m_grayscale(grayscale), m_resize(resize) // BBS: support resize by fill border +{ + m_bmp = *get_bmp_bundle(icon_name, size.x, size.y); +} void ScalableBitmap::sys_color_changed() { if (m_legacy_bmp) { // BBS: support resize by fill border - m_bmp = create_scaled_bitmap(m_icon_name, m_parent, m_px_cnt, m_grayscale, std::string(), false, m_resize); + m_bmp = create_scaled_bitmap(m_icon_name, m_parent, m_size.x, m_grayscale, std::string(), false, m_resize); } else - m_bmp = *get_bmp_bundle(m_icon_name, m_px_cnt); + m_bmp = *get_bmp_bundle(m_icon_name, m_size.x, m_size.y); } // ---------------------------------------------------------------------------- diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index b2e2eebc8..d45eea8c4 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -55,7 +55,7 @@ void msw_buttons_rescale(wxDialog* dlg, const int em_unit, const std::vector< int em_unit(wxWindow* win); int mode_icon_px_size(); -wxBitmapBundle* get_bmp_bundle(const std::string& bmp_name, int px_cnt = 16); +wxBitmapBundle* get_bmp_bundle(const std::string& bmp_name, int width = 16, int height = -1); wxBitmapBundle* get_empty_bmp_bundle(int width, int height); wxBitmapBundle* get_solid_bmp_bundle(int width, int height, const std::string& color); @@ -169,8 +169,13 @@ public: const std::string& icon_name = "", const int px_cnt = 16, const bool grayscale = false, - const bool resize = false, // BBS: support resize by fill border - const bool use_legacy_bmp = false); + const bool resize = false, + const bool use_legacy_bmp = true); + ScalableBitmap( wxWindow *parent, + const std::string& icon_name, + const wxSize size, + const bool grayscale = false, + const bool resize = false); ~ScalableBitmap() {} @@ -183,7 +188,7 @@ public: wxBitmap get_bitmap() const { return m_bmp.GetBitmapFor(m_parent); } wxWindow* parent() const { return m_parent;} const std::string& name() const{ return m_icon_name; } - int px_cnt() const { return m_px_cnt; } + int px_cnt() const { return m_size.x; } wxSize GetSize() const { #ifdef __WIN32__ @@ -199,7 +204,7 @@ private: wxWindow* m_parent{ nullptr }; wxBitmapBundle m_bmp = wxBitmapBundle(); std::string m_icon_name = ""; - int m_px_cnt {16}; + wxSize m_size {16, 16}; bool m_grayscale{ false }; bool m_resize{ false }; bool m_legacy_bmp{ false };