216 lines
6.3 KiB
C++
216 lines
6.3 KiB
C++
|
#include "SideTools.hpp"
|
||
|
#include <wx/dcmemory.h>
|
||
|
#include <wx/dcgraph.h>
|
||
|
#include "Label.hpp"
|
||
|
#include "../wxExtensions.hpp"
|
||
|
#include "../I18N.hpp"
|
||
|
#include "../GUI.hpp"
|
||
|
|
||
|
namespace Slic3r { namespace GUI {
|
||
|
SideTools::SideTools(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size)
|
||
|
{
|
||
|
wxPanel::Create(parent, id, pos, wxSize(0, FromDIP(50)));
|
||
|
Bind(wxEVT_PAINT, &SideTools::OnPaint, this);
|
||
|
|
||
|
SetBackgroundColour(*wxWHITE);
|
||
|
|
||
|
m_printing_img = create_scaled_bitmap("printer", nullptr, 16);
|
||
|
m_arrow_img = create_scaled_bitmap("monitor_arrow", nullptr, 14);
|
||
|
|
||
|
m_none_printing_img = create_scaled_bitmap("tab_monitor_active", nullptr, 24);
|
||
|
m_none_arrow_img = create_scaled_bitmap("monitor_none_arrow", nullptr, 14);
|
||
|
m_none_add_img = create_scaled_bitmap("monitor_none_add", nullptr, 14);
|
||
|
|
||
|
m_wifi_none_img = create_scaled_bitmap("monitor_signal_no", nullptr, 18);
|
||
|
m_wifi_weak_img = create_scaled_bitmap("monitor_signal_weak", nullptr, 18);
|
||
|
m_wifi_middle_img = create_scaled_bitmap("monitor_signal_middle", nullptr, 18);
|
||
|
m_wifi_strong_img = create_scaled_bitmap("monitor_signal_strong", nullptr, 18);
|
||
|
|
||
|
m_intetval_timer = new wxTimer();
|
||
|
m_intetval_timer->SetOwner(this);
|
||
|
|
||
|
this->Bind(wxEVT_TIMER, &SideTools::stop_interval, this);
|
||
|
this->Bind(wxEVT_ENTER_WINDOW, &SideTools::on_mouse_enter, this);
|
||
|
this->Bind(wxEVT_LEAVE_WINDOW, &SideTools::on_mouse_leave, this);
|
||
|
this->Bind(wxEVT_LEFT_DOWN, &SideTools::on_mouse_left_down, this);
|
||
|
this->Bind(wxEVT_LEFT_UP, &SideTools::on_mouse_left_up, this);
|
||
|
}
|
||
|
|
||
|
SideTools::~SideTools() {}
|
||
|
|
||
|
void SideTools::set_none_printer_mode()
|
||
|
{
|
||
|
m_none_printer = true;
|
||
|
Refresh();
|
||
|
}
|
||
|
|
||
|
void SideTools::on_timer(wxTimerEvent &event)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void SideTools::set_current_printer_name(std::string dev_name)
|
||
|
{
|
||
|
m_none_printer = false;
|
||
|
m_dev_name = from_u8(dev_name);
|
||
|
Refresh();
|
||
|
}
|
||
|
|
||
|
void SideTools::set_current_printer_signal(WifiSignal sign)
|
||
|
{
|
||
|
if (last_printer_signal == sign) return;
|
||
|
|
||
|
last_printer_signal = sign;
|
||
|
m_none_printer = false;
|
||
|
m_wifi_type = sign;
|
||
|
Refresh();
|
||
|
}
|
||
|
|
||
|
void SideTools::start_interval()
|
||
|
{
|
||
|
m_intetval_timer->Start(SIDE_TOOL_CLICK_INTERVAL);
|
||
|
m_is_in_interval = true;
|
||
|
}
|
||
|
|
||
|
void SideTools::stop_interval(wxTimerEvent& event)
|
||
|
{
|
||
|
m_is_in_interval = false;
|
||
|
m_intetval_timer->Stop();
|
||
|
}
|
||
|
|
||
|
|
||
|
bool SideTools::is_in_interval()
|
||
|
{
|
||
|
return m_is_in_interval;
|
||
|
}
|
||
|
|
||
|
void SideTools::msw_rescale()
|
||
|
{
|
||
|
Refresh();
|
||
|
}
|
||
|
|
||
|
void SideTools::OnPaint(wxPaintEvent &event)
|
||
|
{
|
||
|
wxPaintDC dc(this);
|
||
|
doRender(dc);
|
||
|
}
|
||
|
|
||
|
void SideTools::render(wxDC &dc)
|
||
|
{
|
||
|
#ifdef __WXMSW__
|
||
|
wxSize size = GetSize();
|
||
|
wxMemoryDC memdc;
|
||
|
wxBitmap bmp(size.x, size.y);
|
||
|
memdc.SelectObject(bmp);
|
||
|
memdc.Blit({0, 0}, size, &dc, {0, 0});
|
||
|
|
||
|
{
|
||
|
wxGCDC dc2(memdc);
|
||
|
doRender(dc2);
|
||
|
}
|
||
|
|
||
|
memdc.SelectObject(wxNullBitmap);
|
||
|
dc.DrawBitmap(bmp, 0, 0);
|
||
|
#else
|
||
|
doRender(dc);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void SideTools::doRender(wxDC &dc)
|
||
|
{
|
||
|
auto left = FromDIP(15);
|
||
|
wxSize size = GetSize();
|
||
|
|
||
|
//if (m_none_printer) {
|
||
|
// dc.SetPen(SIDE_TOOLS_LIGHT_GREEN);
|
||
|
// dc.SetBrush(SIDE_TOOLS_LIGHT_GREEN);
|
||
|
// dc.DrawRectangle(0, 0, size.x, size.y);
|
||
|
//}
|
||
|
|
||
|
if (m_none_printer) {
|
||
|
dc.SetPen(SIDE_TOOLS_BRAND);
|
||
|
dc.SetBrush(SIDE_TOOLS_BRAND);
|
||
|
dc.DrawRectangle(0, 0, size.x, size.y);
|
||
|
|
||
|
dc.DrawBitmap(m_none_printing_img, left, (size.y - m_none_printing_img.GetSize().y) / 2);
|
||
|
|
||
|
left += (m_none_printing_img.GetSize().x + FromDIP(15));
|
||
|
dc.DrawBitmap(m_none_arrow_img, left, (size.y - m_none_arrow_img.GetSize().y) / 2);
|
||
|
|
||
|
left += (m_none_arrow_img.GetSize().x + FromDIP(6));
|
||
|
dc.SetFont(::Label::Body_14);
|
||
|
dc.SetBackgroundMode(wxTRANSPARENT);
|
||
|
dc.SetTextForeground(*wxWHITE);
|
||
|
|
||
|
auto sizet = dc.GetTextExtent(_L("No printer"));
|
||
|
dc.DrawText(_L("No printer"), wxPoint(left, (size.y - sizet.y) / 2));
|
||
|
|
||
|
left = size.x - FromDIP(30) - m_wifi_none_img.GetSize().x;
|
||
|
dc.DrawBitmap(m_none_add_img, left, (size.y - m_none_add_img.GetSize().y) / 2);
|
||
|
} else {
|
||
|
dc.DrawBitmap(m_printing_img, left, (size.y - m_printing_img.GetSize().y) / 2);
|
||
|
|
||
|
left += (m_printing_img.GetSize().x + FromDIP(5));
|
||
|
dc.DrawBitmap(m_arrow_img, left, (size.y - m_arrow_img.GetSize().y) / 2);
|
||
|
|
||
|
left += (m_arrow_img.GetSize().x + FromDIP(6));
|
||
|
dc.SetFont(::Label::Body_14);
|
||
|
dc.SetBackgroundMode(wxTRANSPARENT);
|
||
|
dc.SetTextForeground(SIDE_TOOLS_GREY900);
|
||
|
|
||
|
auto sizet = dc.GetTextExtent(m_dev_name);
|
||
|
auto text_end = size.x - m_wifi_none_img.GetSize().x - 20;
|
||
|
|
||
|
std::string finally_name = m_dev_name.ToStdString();
|
||
|
if (sizet.x > (text_end - left)) {
|
||
|
auto limit_width = text_end - left - dc.GetTextExtent("...").x - 20;
|
||
|
for (auto i = 0; i < m_dev_name.length(); i++) {
|
||
|
auto curr_width = dc.GetTextExtent(m_dev_name.substr(0, i));
|
||
|
if (curr_width.x >= limit_width) {
|
||
|
finally_name = (m_dev_name.substr(0, i) + wxString("...")).ToStdString();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
dc.DrawText(finally_name, wxPoint(left, (size.y - sizet.y) / 2));
|
||
|
|
||
|
left = size.x - FromDIP(18) - m_wifi_none_img.GetSize().x;
|
||
|
if (m_wifi_type == WifiSignal::NONE) dc.DrawBitmap(m_wifi_none_img, left, (size.y - m_wifi_none_img.GetSize().y) / 2);
|
||
|
if (m_wifi_type == WifiSignal::WEAK) dc.DrawBitmap(m_wifi_weak_img, left, (size.y - m_wifi_weak_img.GetSize().y) / 2);
|
||
|
if (m_wifi_type == WifiSignal::MIDDLE) dc.DrawBitmap(m_wifi_middle_img, left, (size.y - m_wifi_middle_img.GetSize().y) / 2);
|
||
|
if (m_wifi_type == WifiSignal::STRONG) dc.DrawBitmap(m_wifi_strong_img, left, (size.y - m_wifi_strong_img.GetSize().y) / 2);
|
||
|
}
|
||
|
|
||
|
if (m_hover) {
|
||
|
dc.SetPen(SIDE_TOOLS_BRAND);
|
||
|
dc.SetBrush(*wxTRANSPARENT_BRUSH);
|
||
|
dc.DrawRectangle(0, 0, size.x, size.y);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void SideTools::on_mouse_left_down(wxMouseEvent &evt)
|
||
|
{
|
||
|
m_click = true;
|
||
|
Refresh();
|
||
|
}
|
||
|
|
||
|
void SideTools::on_mouse_left_up(wxMouseEvent &evt)
|
||
|
{
|
||
|
m_click = false;
|
||
|
Refresh();
|
||
|
}
|
||
|
|
||
|
void SideTools::on_mouse_enter(wxMouseEvent &evt)
|
||
|
{
|
||
|
m_hover = true;
|
||
|
Refresh();
|
||
|
}
|
||
|
|
||
|
void SideTools::on_mouse_leave(wxMouseEvent &evt)
|
||
|
{
|
||
|
m_hover = false;
|
||
|
Refresh();
|
||
|
}
|
||
|
}}
|