This commit is contained in:
yw4z
2026-03-11 06:56:03 +03:00
parent d48585c715
commit eab3139268
2 changed files with 92 additions and 30 deletions

View File

@@ -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;
}

View File

@@ -6,9 +6,22 @@
#include "SelectMachine.hpp"
#include "DeviceManager.hpp"
#include <wx/control.h>
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;