NEW:add "Fade out" effect for BaseTransparentDPIFrame

jira: none
Change-Id: Ied2fd3a07c213c3518183865169728a87a7d5b1a
This commit is contained in:
zhou.xu 2025-01-21 09:36:24 +08:00 committed by lane.wei
parent dd15d0772f
commit c5406570bc
5 changed files with 175 additions and 31 deletions

View File

@ -21,14 +21,14 @@ using namespace Slic3r;
using namespace Slic3r::GUI; using namespace Slic3r::GUI;
namespace Slic3r { namespace GUI { namespace Slic3r { namespace GUI {
#define ANIMATION_REFRESH_INTERVAL 15 #define ANIMATION_REFRESH_INTERVAL 20
BaseTransparentDPIFrame::BaseTransparentDPIFrame( BaseTransparentDPIFrame::BaseTransparentDPIFrame(
wxWindow *parent, int win_width, wxPoint dialog_pos, int ok_button_width, wxString win_text, wxString ok_text, wxString cancel_text, DisappearanceMode disappearance_mode) wxWindow *parent, int win_width, wxPoint dialog_pos, int ok_button_width, wxString win_text, wxString ok_text, wxString cancel_text, DisappearanceMode disappearance_mode)
: DPIFrame(static_cast<wxWindow *>(wxGetApp().mainframe), wxID_ANY, "", wxDefaultPosition, wxDefaultSize, !wxCAPTION | !wxCLOSE_BOX | wxBORDER_NONE) : DPIFrame(static_cast<wxWindow *>(wxGetApp().mainframe), wxID_ANY, "", wxDefaultPosition, wxDefaultSize, !wxCAPTION | !wxCLOSE_BOX | wxBORDER_NONE)
, m_timed_disappearance_mode(disappearance_mode) , m_timed_disappearance_mode(disappearance_mode)
{ {
// SetBackgroundStyle(wxBackgroundStyle::wxBG_STYLE_TRANSPARENT); // SetBackgroundStyle(wxBackgroundStyle::wxBG_STYLE_TRANSPARENT);
SetTransparent(220); SetTransparent(m_init_transparent);
SetBackgroundColour(wxColour(23, 25, 22, 128)); SetBackgroundColour(wxColour(23, 25, 22, 128));
SetMinSize(wxSize(FromDIP(win_width), -1)); SetMinSize(wxSize(FromDIP(win_width), -1));
SetMaxSize(wxSize(FromDIP(win_width), -1)); SetMaxSize(wxSize(FromDIP(win_width), -1));
@ -87,7 +87,9 @@ BaseTransparentDPIFrame::BaseTransparentDPIFrame(
m_sizer_main->Add(bSizer_button, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, FromDIP(20)); m_sizer_main->Add(bSizer_button, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, FromDIP(20));
Bind(wxEVT_CLOSE_WINDOW, [this](auto &e) { this->on_hide(); }); Bind(wxEVT_CLOSE_WINDOW, [this](auto &e) {
on_hide();
});
SetSizer(m_sizer_main); SetSizer(m_sizer_main);
Layout(); Layout();
Fit(); Fit();
@ -96,11 +98,17 @@ BaseTransparentDPIFrame::BaseTransparentDPIFrame(
init_timer(); init_timer();
Bind(wxEVT_TIMER, &BaseTransparentDPIFrame::on_timer, this); Bind(wxEVT_TIMER, &BaseTransparentDPIFrame::on_timer, this);
Bind(wxEVT_ENTER_WINDOW, [this](auto &e) { Bind(wxEVT_ENTER_WINDOW, [this](auto &e) {
clear_timer_count(); if (m_enter_window_valid) {
m_refresh_timer->Stop(); clear_timer_count();
m_display_stage = 0;
m_refresh_timer->Stop();
SetTransparent(m_init_transparent);
}
}); });
Bind(wxEVT_LEAVE_WINDOW, [this](auto &e) { Bind(wxEVT_LEAVE_WINDOW, [this](auto &e) {
m_refresh_timer->Start(ANIMATION_REFRESH_INTERVAL); if (m_enter_window_valid) {
m_refresh_timer->Start(ANIMATION_REFRESH_INTERVAL);
}
}); });
} }
} }
@ -137,13 +145,17 @@ void BaseTransparentDPIFrame::on_show() {
void BaseTransparentDPIFrame::on_hide() void BaseTransparentDPIFrame::on_hide()
{ {
this->Hide(); if (m_refresh_timer) {
m_refresh_timer->Stop();
}
Hide();
if (wxGetApp().mainframe != nullptr) { if (wxGetApp().mainframe != nullptr) {
wxGetApp().mainframe->Show(); wxGetApp().mainframe->Show();
wxGetApp().mainframe->Raise(); wxGetApp().mainframe->Raise();
} }
} }
void BaseTransparentDPIFrame::clear_timer_count() { void BaseTransparentDPIFrame::clear_timer_count() {
m_timer_count = 0; m_timer_count = 0;
} }
@ -154,17 +166,115 @@ void BaseTransparentDPIFrame::init_timer()
m_refresh_timer->SetOwner(this); m_refresh_timer->SetOwner(this);
} }
void BaseTransparentDPIFrame::on_timer(wxTimerEvent &event) { void BaseTransparentDPIFrame::calc_step_transparent() {
m_timer_count++; m_max_size = GetSize();
if (m_timed_disappearance_mode == DisappearanceMode::TimedDisappearance) { m_step_size.x = GetSize().x / m_time_gradual_and_scale;
m_step_size.y = GetSize().y / m_time_gradual_and_scale;
m_step_transparent = m_init_transparent / m_time_gradual_and_scale;
}
void BaseTransparentDPIFrame::on_close() {
Destroy();
}
void BaseTransparentDPIFrame::on_timer(wxTimerEvent &event)
{
if (m_timed_disappearance_mode == DisappearanceMode::TimedDisappearance && m_display_stage == 0) {
auto cur_time = ANIMATION_REFRESH_INTERVAL * m_timer_count; auto cur_time = ANIMATION_REFRESH_INTERVAL * m_timer_count;
if (cur_time > m_disappearance_second) { if (cur_time > m_disappearance_second) {
start_gradual_disappearance();
m_display_stage++;
}
}
if (m_display_stage == 1) {
if (m_move_to_target_gradual_disappearance) {
begin_move_to_target_and_gradual_disappearance();
}
else {
begin_gradual_disappearance();
}
}
m_timer_count++;
}
void BaseTransparentDPIFrame::call_start_gradual_disappearance()//for ok or cancel button
{
m_enter_window_valid = false;
m_display_stage = 1;
m_refresh_timer->Start(ANIMATION_REFRESH_INTERVAL);
start_gradual_disappearance();
}
void BaseTransparentDPIFrame::start_gradual_disappearance()
{
clear_timer_count();
//hide_all();
calc_step_transparent();
}
void BaseTransparentDPIFrame::set_target_pos_and_gradual_disappearance(wxPoint pos)
{
m_move_to_target_gradual_disappearance = true;
m_target_pos = pos;
m_start_pos = GetScreenPosition();
m_step_pos.x = (m_target_pos.x - m_start_pos.x) / m_time_move;
m_step_pos.y = (m_target_pos.y - m_start_pos.y) / m_time_move;
}
void BaseTransparentDPIFrame::begin_gradual_disappearance()
{
if (m_timer_count <= m_time_gradual_and_scale - 1) {
auto transparent = m_init_transparent - m_timer_count * m_step_transparent;
SetTransparent(transparent < 0 ? 0 : transparent);
} else {
on_hide();
return;
}
m_timer_count++;
}
void BaseTransparentDPIFrame::begin_move_to_target_and_gradual_disappearance()
{
if (m_timer_count <= m_time_move) {
if (m_timer_count <= m_time_move - 1) {
auto pos = wxPoint(m_start_pos.x + m_timer_count * m_step_pos.x, m_start_pos.y + m_timer_count * m_step_pos.y);
SetPosition(pos);
} else {
SetPosition(m_target_pos);
}
Refresh();
} else {
SetPosition(m_target_pos);
if (m_timer_count <= m_time_move + m_time_gradual_and_scale - 1) {
auto size = wxSize(m_max_size.x - m_timer_count * m_step_size.x, m_max_size.y - m_timer_count * m_step_size.y);
SetSize(size);
SetTransparent(m_init_transparent - m_timer_count * m_step_transparent);
} else {
on_hide(); on_hide();
return;
}
}
m_timer_count++;
}
void BaseTransparentDPIFrame::show_sizer(wxSizer *sizer, bool show)
{
wxSizerItemList items = sizer->GetChildren();
for (wxSizerItemList::iterator it = items.begin(); it != items.end(); ++it) {
wxSizerItem *item = *it;
if (wxWindow *window = item->GetWindow()) {
window->Show(show);
}
if (wxSizer *son_sizer = item->GetSizer()) {
show_sizer(son_sizer, show);
} }
} }
} }
void BaseTransparentDPIFrame::deal_ok(){} void BaseTransparentDPIFrame::hide_all() {
show_sizer(m_sizer_main, false);
}
void BaseTransparentDPIFrame::deal_ok() {}
void BaseTransparentDPIFrame::deal_cancel(){} void BaseTransparentDPIFrame::deal_cancel(){}

View File

@ -16,8 +16,7 @@ class BaseTransparentDPIFrame : public Slic3r::GUI::DPIFrame
public: public:
enum DisappearanceMode { enum DisappearanceMode {
None, None,
TimedDisappearance,//defalut 7 second TimedDisappearance // unit: second
QuickDisappearance
}; };
BaseTransparentDPIFrame(wxWindow * parent, BaseTransparentDPIFrame(wxWindow * parent,
@ -26,33 +25,54 @@ public:
int ok_button_width, int ok_button_width,
wxString win_text, wxString win_text,
wxString ok_text, wxString ok_text,
wxString cancel_text = "", wxString cancel_text = "",
DisappearanceMode disappearance_mode = DisappearanceMode::None); DisappearanceMode disappearance_mode = DisappearanceMode::None);
~BaseTransparentDPIFrame() override; ~BaseTransparentDPIFrame() override;
void on_dpi_changed(const wxRect &suggested_rect) override; void on_dpi_changed(const wxRect &suggested_rect) override;
void on_show(); void on_show();
void on_hide(); void on_hide();
void clear_timer_count(); void clear_timer_count();
bool Show(bool show =true) override; bool Show(bool show = true) override;
virtual void deal_ok(); virtual void deal_ok();
virtual void deal_cancel(); virtual void deal_cancel();
virtual void on_timer(wxTimerEvent &event); virtual void on_timer(wxTimerEvent &event);
void set_target_pos_and_gradual_disappearance(wxPoint pos);
void call_start_gradual_disappearance();
protected: protected:
Button * m_button_ok = nullptr; Button *m_button_ok = nullptr;
Button * m_button_cancel = nullptr; Button *m_button_cancel = nullptr;
DisappearanceMode m_timed_disappearance_mode; DisappearanceMode m_timed_disappearance_mode;
float m_timer_count = 0; float m_timer_count = 0;
wxTimer *m_refresh_timer{nullptr}; wxTimer * m_refresh_timer{nullptr};
int m_disappearance_second = 2500;//unit ms: mean 5s int m_disappearance_second = 1500; // unit ms: mean 5s
bool m_move_to_target_gradual_disappearance = false;
wxPoint m_target_pos;
private: private:
wxBoxSizer *m_sizer_main{nullptr}; wxBoxSizer *m_sizer_main{nullptr};
wxSize m_max_size;
wxSize m_step_size;
wxPoint m_step_pos;
wxPoint m_start_pos;
float m_time_move{6.0f};
float m_time_gradual_and_scale{100.0f};
int m_init_transparent{220};
int m_step_transparent;
int m_display_stage = 0;//0 normal //1 gradual
bool m_enter_window_valid{true};
private: private:
void init_timer(); void start_gradual_disappearance();
void init_timer();
void calc_step_transparent();
void on_close();
void show_sizer(wxSizer *sizer, bool show);
void hide_all();
void begin_gradual_disappearance();
void begin_move_to_target_and_gradual_disappearance();
}; };
}} // namespace Slic3r::GUI }} // namespace Slic3r::GUI
#endif // _STEP_MESH_DIALOG_H_ #endif // _STEP_MESH_DIALOG_H_

View File

@ -3028,6 +3028,7 @@ void Sidebar::sync_ams_list(bool is_from_big_sync_btn)
auto same_dialog_pos_x = get_sidebar_pos_right_x() + FromDIP(5); auto same_dialog_pos_x = get_sidebar_pos_right_x() + FromDIP(5);
temp_fsa_info.dialog_pos.x = same_dialog_pos_x; temp_fsa_info.dialog_pos.x = same_dialog_pos_x;
temp_fsa_info.dialog_pos.y = small_btn_pt.y; temp_fsa_info.dialog_pos.y = small_btn_pt.y;
temp_fsa_info.ams_btn_pos = small_btn_pt + wxPoint(small_btn_size.x / 2, small_btn_size.y/2);
if (m_fna_dialog) { if (m_fna_dialog) {
if (m_sna_dialog) { if (m_sna_dialog) {
m_sna_dialog->on_hide(); m_sna_dialog->on_hide();
@ -3035,8 +3036,7 @@ void Sidebar::sync_ams_list(bool is_from_big_sync_btn)
m_fna_dialog.reset(); m_fna_dialog.reset();
} }
m_fna_dialog = std::make_shared<FinishSyncAmsDialog>(temp_fsa_info); m_fna_dialog = std::make_shared<FinishSyncAmsDialog>(temp_fsa_info);
m_fna_dialog->Show(); m_fna_dialog->on_show();
m_fna_dialog->Raise();
} }
PlaterPresetComboBox* Sidebar::printer_combox() PlaterPresetComboBox* Sidebar::printer_combox()
@ -3134,6 +3134,12 @@ void Sidebar::pop_sync_nozzle_and_ams_ialog() {
int same_dialog_pos_x = get_sidebar_pos_right_x() + FromDIP(5); int same_dialog_pos_x = get_sidebar_pos_right_x() + FromDIP(5);
temp_na_info.dialog_pos.x = same_dialog_pos_x; temp_na_info.dialog_pos.x = same_dialog_pos_x;
temp_na_info.dialog_pos.y += FromDIP(2); temp_na_info.dialog_pos.y += FromDIP(2);
wxPoint small_btn_pt;
wxSize small_btn_size;
get_small_btn_sync_pos_size(small_btn_pt, small_btn_size);
temp_na_info.ams_btn_pos = small_btn_pt + wxPoint(small_btn_size.x / 2, small_btn_size.y / 2);
if (m_sna_dialog) { if (m_sna_dialog) {
if (m_fna_dialog) { if (m_fna_dialog) {
m_fna_dialog->on_hide(); m_fna_dialog->on_hide();
@ -3141,8 +3147,7 @@ void Sidebar::pop_sync_nozzle_and_ams_ialog() {
m_sna_dialog.reset(); m_sna_dialog.reset();
} }
m_sna_dialog = std::make_shared<SyncNozzleAndAmsDialog>(temp_na_info); m_sna_dialog = std::make_shared<SyncNozzleAndAmsDialog>(temp_na_info);
m_sna_dialog->Show(); m_sna_dialog->on_show();
m_sna_dialog->Raise();
} }
static std::vector<Search::InputInfo> get_search_inputs(ConfigOptionMode mode) static std::vector<Search::InputInfo> get_search_inputs(ConfigOptionMode mode)

View File

@ -4379,6 +4379,8 @@ SyncNozzleAndAmsDialog::SyncNozzleAndAmsDialog(InputInfo &input_info)
DisappearanceMode::TimedDisappearance) DisappearanceMode::TimedDisappearance)
, m_input_info(input_info) , m_input_info(input_info)
{ {
/* set_target_pos_and_gradual_disappearance(input_info.ams_btn_pos);
m_move_to_target_gradual_disappearance = false;*/
} }
SyncNozzleAndAmsDialog::~SyncNozzleAndAmsDialog() {} SyncNozzleAndAmsDialog::~SyncNozzleAndAmsDialog() {}
@ -4388,8 +4390,10 @@ void SyncNozzleAndAmsDialog::deal_ok() {
wxGetApp().plater()->sidebar().sync_ams_list(true); wxGetApp().plater()->sidebar().sync_ams_list(true);
} }
void SyncNozzleAndAmsDialog::deal_cancel() { void SyncNozzleAndAmsDialog::deal_cancel()
on_hide(); {
//m_move_to_target_gradual_disappearance = true;
call_start_gradual_disappearance();
} }
FinishSyncAmsDialog::FinishSyncAmsDialog(InputInfo &input_info) FinishSyncAmsDialog::FinishSyncAmsDialog(InputInfo &input_info)
@ -4404,10 +4408,13 @@ FinishSyncAmsDialog::FinishSyncAmsDialog(InputInfo &input_info)
, m_input_info(input_info) , m_input_info(input_info)
{ {
m_button_cancel->Hide(); m_button_cancel->Hide();
//set_target_pos_and_gradual_disappearance(input_info.ams_btn_pos);
} }
FinishSyncAmsDialog::~FinishSyncAmsDialog() {} FinishSyncAmsDialog::~FinishSyncAmsDialog() {}
void FinishSyncAmsDialog::deal_ok() { on_hide(); } void FinishSyncAmsDialog::deal_ok() {
call_start_gradual_disappearance();
}
}} // namespace Slic3r }} // namespace Slic3r

View File

@ -362,6 +362,7 @@ public:
struct InputInfo struct InputInfo
{ {
wxPoint dialog_pos{wxPoint(400, 200)}; wxPoint dialog_pos{wxPoint(400, 200)};
wxPoint ams_btn_pos{wxPoint(400, 200)};
}; };
SyncNozzleAndAmsDialog(InputInfo &input_info); SyncNozzleAndAmsDialog(InputInfo &input_info);
~SyncNozzleAndAmsDialog() override; ~SyncNozzleAndAmsDialog() override;
@ -377,6 +378,7 @@ public:
struct InputInfo struct InputInfo
{ {
wxPoint dialog_pos{wxPoint(400, 200)}; wxPoint dialog_pos{wxPoint(400, 200)};
wxPoint ams_btn_pos{wxPoint(400, 200)};
}; };
FinishSyncAmsDialog(InputInfo &input_info); FinishSyncAmsDialog(InputInfo &input_info);
~FinishSyncAmsDialog() override; ~FinishSyncAmsDialog() override;