From eab3139268c1d499b0c1123586b9bc76743a8c9f Mon Sep 17 00:00:00 2001 From: yw4z Date: Wed, 11 Mar 2026 06:56:03 +0300 Subject: [PATCH] update --- src/slic3r/GUI/BBLTopbar.cpp | 104 +++++++++++++++++++++++++---------- src/slic3r/GUI/BBLTopbar.hpp | 18 +++++- 2 files changed, 92 insertions(+), 30 deletions(-) diff --git a/src/slic3r/GUI/BBLTopbar.cpp b/src/slic3r/GUI/BBLTopbar.cpp index 59b490c4cb..b729ba2dc3 100644 --- a/src/slic3r/GUI/BBLTopbar.cpp +++ b/src/slic3r/GUI/BBLTopbar.cpp @@ -36,14 +36,69 @@ enum CUSTOM_ID ID_AMS_NOTEBOOK, }; +CenteredTitle::CenteredTitle(wxWindow* parent) + : wxControl() +{ + SetBackgroundStyle(wxBG_STYLE_PAINT); + Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); + Bind(wxEVT_PAINT, [this](wxPaintEvent& e) { + wxBufferedPaintDC dc(this); + dc.SetBackground(wxBrush(wxColour(38, 46, 48))); + dc.Clear(); + + dc.SetFont(GetFont()); + dc.SetTextForeground(*wxWHITE); + + wxFontMetrics fm = dc.GetFontMetrics(); + int textHeight = fm.ascent + fm.descent; + + wxString text = wxControl::Ellipsize(m_title, dc, wxELLIPSIZE_END, GetClientSize().GetWidth() - FromDIP(8)); + + wxRect rect = GetClientRect(); + int y = rect.y + (rect.height - textHeight) / 2; + + dc.DrawText(text, rect.x + (rect.width - dc.GetTextExtent(text).GetWidth()) / 2, y); + }); + + // repaint for Ellipsize + Bind(wxEVT_SIZE, [this](wxSizeEvent& e) { + Refresh(); + e.Skip(); + }); + + Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { + e.SetPosition(GetParent()->ScreenToClient(ClientToScreen(e.GetPosition()))); + GetParent()->GetEventHandler()->ProcessEvent(e); + }); + + Bind(wxEVT_LEFT_DCLICK, [this](wxMouseEvent& e) { + e.SetPosition(GetParent()->ScreenToClient(ClientToScreen(e.GetPosition()))); + GetParent()->GetEventHandler()->ProcessEvent(e); + }); +} + +void CenteredTitle::SetTitle(const wxString& title) { + m_title = title; + RefreshRect(GetClientRect()); + Update(); +} + +// required for proper height +wxSize CenteredTitle::DoGetBestSize() const +{ + return wxSize(10, FromDIP(30)); +} + + class BBLTopbarArt : public wxAuiDefaultToolBarArt { public: - virtual void DrawLabel(wxDC& dc, wxWindow* wnd, const wxAuiToolBarItem& item, const wxRect& rect) wxOVERRIDE; + //virtual void DrawLabel(wxDC& dc, wxWindow* wnd, const wxAuiToolBarItem& item, const wxRect& rect) wxOVERRIDE; virtual void DrawBackground(wxDC& dc, wxWindow* wnd, const wxRect& rect) wxOVERRIDE; virtual void DrawButton(wxDC& dc, wxWindow* wnd, const wxAuiToolBarItem& item, const wxRect& rect) wxOVERRIDE; }; +/* void BBLTopbarArt::DrawLabel(wxDC& dc, wxWindow* wnd, const wxAuiToolBarItem& item, const wxRect& rect) { dc.SetFont(m_font); @@ -71,6 +126,7 @@ void BBLTopbarArt::DrawLabel(wxDC& dc, wxWindow* wnd, const wxAuiToolBarItem& it dc.DrawText(item.GetLabel(), textX, textY); dc.DestroyClippingRegion(); } +*/ void BBLTopbarArt::DrawBackground(wxDC& dc, wxWindow* wnd, const wxRect& rect) { @@ -257,23 +313,15 @@ void BBLTopbar::Init(wxFrame* parent) m_calib_item = this->AddTool(ID_CALIB, _L("Calibration"), calib_bitmap); m_calib_item->SetDisabledBitmap(calib_bitmap_inactive); - this->AddSpacer(FromDIP(10)); - this->AddStretchSpacer(1); + this->AddSpacer(FromDIP(25)); + //this->AddStretchSpacer(1); - m_title_item = this->AddLabel(ID_TITLE, "", FromDIP(TOPBAR_TITLE_WIDTH)); - m_title_item->SetAlignment(wxALIGN_CENTRE); + m_title_ctrl = new CenteredTitle(this); + wxAuiToolBarItem* title_item = this->AddControl(m_title_ctrl, ""); + title_item->SetProportion(1); - this->Bind(wxEVT_SIZE, [this](wxSizeEvent& e) { - if(m_title_item){ - m_title_item->SetMinSize(wxSize(FromDIP(e.GetSize().GetWidth() > FromDIP(700) ? TOPBAR_TITLE_WIDTH : 200), -1)); - SetTitle(m_title_item->GetLabel()); - Refresh(); - } - e.Skip(); - }); - - this->AddSpacer(FromDIP(10)); - this->AddStretchSpacer(1); + this->AddSpacer(FromDIP(25)); + //this->AddStretchSpacer(1); //m_publish_bitmap = create_scaled_bitmap("topbar_publish", nullptr, TOPBAR_ICON_SIZE); //m_publish_item = this->AddTool(ID_PUBLISH, "", m_publish_bitmap); @@ -455,12 +503,9 @@ wxMenu* BBLTopbar::GetCalibMenu() void BBLTopbar::SetTitle(wxString title) { - wxGCDC dc(this); - title = wxControl::Ellipsize(title, dc, wxELLIPSIZE_END, m_title_item->GetMinSize().GetWidth()); - - m_title_item->SetLabel(title); - m_title_item->SetAlignment(wxALIGN_CENTRE); - this->Refresh(); + m_titleText = title; + if (m_title_ctrl) + m_title_ctrl->SetTitle(title); } void BBLTopbar::SetMaximizedSize() @@ -509,7 +554,8 @@ void BBLTopbar::Rescale() { item->SetBitmap(create_scaled_bitmap("calib_sf", this, TOPBAR_ICON_SIZE)); item->SetDisabledBitmap(create_scaled_bitmap("calib_sf_inactive", this, TOPBAR_ICON_SIZE)); - item = this->FindTool(ID_TITLE); + if (m_title_ctrl) + m_title_ctrl->SetTitle(m_titleText); /*item = this->FindTool(ID_PUBLISH); item->SetBitmap(create_scaled_bitmap("topbar_publish", this, TOPBAR_ICON_SIZE)); @@ -574,9 +620,9 @@ void BBLTopbar::OnCloseFrame(wxAuiToolBarEvent& event) void BBLTopbar::OnMouseLeftDClock(wxMouseEvent& mouse) { wxPoint mouse_pos = ::wxGetMousePosition(); + wxAuiToolBarItem* item = this->FindToolByCurrentPosition(); // check whether mouse is not on any tool item - if (this->FindToolByCurrentPosition() != NULL && - this->FindToolByCurrentPosition() != m_title_item) { + if (item != NULL && item->GetWindow() != m_title_ctrl) { mouse.Skip(); return; } @@ -644,10 +690,10 @@ void BBLTopbar::OnMouseLeftDown(wxMouseEvent& event) { wxPoint mouse_pos = ::wxGetMousePosition(); wxPoint frame_pos = m_frame->GetScreenPosition(); + wxAuiToolBarItem* item = this->FindToolByCurrentPosition(); m_delta = mouse_pos - frame_pos; - if (FindToolByCurrentPosition() == NULL - || this->FindToolByCurrentPosition() == m_title_item) + if (item == NULL || item->GetWindow() == m_title_ctrl) { #ifdef __WXMSW__ CaptureMouse(); @@ -737,8 +783,8 @@ WXLRESULT BBLTopbar::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam { switch (nMsg) { case WM_NCHITTEST: { - const wxAuiToolBarItem* current_item = this->FindToolByCurrentPosition(); - if (current_item != nullptr && current_item != m_title_item) { + wxAuiToolBarItem* item = this->FindToolByCurrentPosition(); + if (item != NULL && item->GetWindow() != m_title_ctrl) { break; } diff --git a/src/slic3r/GUI/BBLTopbar.hpp b/src/slic3r/GUI/BBLTopbar.hpp index b5f4673a44..bb3218f5bd 100644 --- a/src/slic3r/GUI/BBLTopbar.hpp +++ b/src/slic3r/GUI/BBLTopbar.hpp @@ -6,9 +6,22 @@ #include "SelectMachine.hpp" #include "DeviceManager.hpp" +#include using namespace Slic3r::GUI; +class CenteredTitle : public wxControl +{ +public: + CenteredTitle(wxWindow* parent); + void SetTitle(const wxString& title); + + wxSize DoGetBestSize() const override; + +private: + wxString m_title; +}; + class BBLTopbar : public wxAuiToolBar { public: @@ -70,7 +83,10 @@ private: wxMenu m_top_menu; wxMenu* m_file_menu; wxMenu m_calib_menu; - wxAuiToolBarItem* m_title_item; + + CenteredTitle* m_title_ctrl { nullptr }; + wxString m_titleText; + wxAuiToolBarItem* m_account_item; wxAuiToolBarItem* m_model_store_item;