mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-10-11 09:51:06 +00:00
Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7369674d8f | ||
|
|
70da7e89bb | ||
|
|
a671bf605d | ||
|
|
bae8f64b8b |
File diff suppressed because it is too large
Load Diff
@@ -379,14 +379,24 @@ void FilamentGroupPopup::OnTimer(wxTimerEvent &event)
|
|||||||
// leaving event got triggered. So the timer is stopped first, then started
|
// leaving event got triggered. So the timer is stopped first, then started
|
||||||
// again, causing the popup being dismissed immediately.
|
// again, causing the popup being dismissed immediately.
|
||||||
// To fix this, we check if cursor is still inside the popup window before
|
// To fix this, we check if cursor is still inside the popup window before
|
||||||
// dismissing.
|
// dismissing, and keep checking while it is: a leave event is not guaranteed
|
||||||
|
// to follow, and a popup left open keeps grabbing the mouse capture.
|
||||||
wxPoint pos = this->ScreenToClient(wxGetMousePosition());
|
wxPoint pos = this->ScreenToClient(wxGetMousePosition());
|
||||||
if (this->GetClientRect().Contains(pos)) return;
|
if (this->GetClientRect().Contains(pos)) {
|
||||||
|
StartTimer();
|
||||||
|
return;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Dismiss();
|
Dismiss();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FilamentGroupPopup::~FilamentGroupPopup()
|
||||||
|
{
|
||||||
|
m_timer->Stop();
|
||||||
|
delete m_timer;
|
||||||
|
}
|
||||||
|
|
||||||
void FilamentGroupPopup::Dismiss() {
|
void FilamentGroupPopup::Dismiss() {
|
||||||
m_active = false;
|
m_active = false;
|
||||||
PopupWindow::Dismiss();
|
PopupWindow::Dismiss();
|
||||||
@@ -405,7 +415,10 @@ void FilamentGroupPopup::OnEnterWindow(wxMouseEvent &)
|
|||||||
// Ignore spurious ENTER synthesized by PopupWindow::OnMouseEvent2 on macOS.
|
// Ignore spurious ENTER synthesized by PopupWindow::OnMouseEvent2 on macOS.
|
||||||
wxPoint pos = this->ScreenToClient(wxGetMousePosition());
|
wxPoint pos = this->ScreenToClient(wxGetMousePosition());
|
||||||
if (!this->GetClientRect().Contains(pos)) return;
|
if (!this->GetClientRect().Contains(pos)) return;
|
||||||
|
// On macOS the timer keeps running instead, and OnTimer closes the popup once the cursor has left it.
|
||||||
|
#ifndef __APPLE__
|
||||||
ResetTimer();
|
ResetTimer();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void FilamentGroupPopup::UpdateButtonStatus(int hover_idx)
|
void FilamentGroupPopup::UpdateButtonStatus(int hover_idx)
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ class FilamentGroupPopup : public PopupWindow
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FilamentGroupPopup(wxWindow *parent);
|
FilamentGroupPopup(wxWindow *parent);
|
||||||
|
~FilamentGroupPopup() override;
|
||||||
void tryPopup(Plater* plater,PartPlate* plate, bool slice_all);
|
void tryPopup(Plater* plater,PartPlate* plate, bool slice_all);
|
||||||
void tryClose();
|
void tryClose();
|
||||||
void Dismiss() override;
|
void Dismiss() override;
|
||||||
|
|||||||
@@ -20,6 +20,8 @@
|
|||||||
#include <wx/gdicmn.h>
|
#include <wx/gdicmn.h>
|
||||||
#include <wx/dialog.h>
|
#include <wx/dialog.h>
|
||||||
#include "slic3r/GUI/FilamentMapPanel.hpp"
|
#include "slic3r/GUI/FilamentMapPanel.hpp"
|
||||||
|
#include "slic3r/GUI/FilamentGroupPopup.hpp"
|
||||||
|
#include "slic3r/GUI/MainFrame.hpp"
|
||||||
|
|
||||||
namespace Slic3r { namespace GUI {
|
namespace Slic3r { namespace GUI {
|
||||||
|
|
||||||
@@ -377,6 +379,13 @@ FilamentMapMode FilamentMapDialog::get_mode()
|
|||||||
|
|
||||||
int FilamentMapDialog::ShowModal()
|
int FilamentMapDialog::ShowModal()
|
||||||
{
|
{
|
||||||
|
// The Slice-plate hover popup is a transient popup that keeps grabbing the mouse
|
||||||
|
// capture while shown. Left behind this modal dialog it would starve the dialog of
|
||||||
|
// mouse events, so close it synchronously first, whichever path opened the dialog.
|
||||||
|
if (MainFrame* frame = wxGetApp().mainframe;
|
||||||
|
frame && frame->m_filament_group_popup && frame->m_filament_group_popup->IsShown())
|
||||||
|
frame->m_filament_group_popup->Dismiss();
|
||||||
|
|
||||||
update_panel_status(m_page_type);
|
update_panel_status(m_page_type);
|
||||||
return wxDialog::ShowModal();
|
return wxDialog::ShowModal();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2309,12 +2309,6 @@ wxBoxSizer* MainFrame::create_side_tools()
|
|||||||
|
|
||||||
bool slice = true;
|
bool slice = true;
|
||||||
|
|
||||||
// The Slice-plate hover popup is a transient popup that keeps grabbing
|
|
||||||
// the mouse capture while shown. Left behind the modal grouping dialog it
|
|
||||||
// would starve that dialog of mouse events, so close it synchronously first.
|
|
||||||
if (m_filament_group_popup)
|
|
||||||
m_filament_group_popup->Dismiss();
|
|
||||||
|
|
||||||
auto curr_plate = m_plater->get_partplate_list().get_curr_plate();
|
auto curr_plate = m_plater->get_partplate_list().get_curr_plate();
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
PresetBundle* preset = wxGetApp().preset_bundle;
|
PresetBundle* preset = wxGetApp().preset_bundle;
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
BEGIN_EVENT_TABLE(SideButton, wxWindow)
|
BEGIN_EVENT_TABLE(SideButton, wxWindow)
|
||||||
EVT_LEFT_DOWN(SideButton::mouseDown)
|
EVT_LEFT_DOWN(SideButton::mouseDown)
|
||||||
EVT_LEFT_UP(SideButton::mouseReleased)
|
EVT_LEFT_UP(SideButton::mouseReleased)
|
||||||
|
EVT_MOUSE_CAPTURE_LOST(SideButton::mouseCaptureLost)
|
||||||
EVT_PAINT(SideButton::paintEvent)
|
EVT_PAINT(SideButton::paintEvent)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
@@ -331,20 +332,30 @@ void SideButton::mouseDown(wxMouseEvent& event)
|
|||||||
event.Skip();
|
event.Skip();
|
||||||
pressedDown = true;
|
pressedDown = true;
|
||||||
SetFocus();
|
SetFocus();
|
||||||
CaptureMouse();
|
// Capturing twice pushes this button onto the capture stack twice, and the
|
||||||
|
// release would then hand the capture straight back to it.
|
||||||
|
if (!HasCapture())
|
||||||
|
CaptureMouse();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SideButton::mouseReleased(wxMouseEvent& event)
|
void SideButton::mouseReleased(wxMouseEvent& event)
|
||||||
{
|
{
|
||||||
event.Skip();
|
event.Skip();
|
||||||
|
// A press whose release went elsewhere still holds the capture.
|
||||||
|
if (HasCapture())
|
||||||
|
ReleaseMouse();
|
||||||
if (pressedDown) {
|
if (pressedDown) {
|
||||||
pressedDown = false;
|
pressedDown = false;
|
||||||
ReleaseMouse();
|
|
||||||
if (wxRect({0, 0}, GetSize()).Contains(event.GetPosition()))
|
if (wxRect({0, 0}, GetSize()).Contains(event.GetPosition()))
|
||||||
sendButtonEvent();
|
sendButtonEvent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SideButton::mouseCaptureLost(wxMouseCaptureLostEvent&)
|
||||||
|
{
|
||||||
|
pressedDown = false;
|
||||||
|
}
|
||||||
|
|
||||||
void SideButton::sendButtonEvent()
|
void SideButton::sendButtonEvent()
|
||||||
{
|
{
|
||||||
wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, GetId());
|
wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, GetId());
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ private:
|
|||||||
|
|
||||||
void mouseDown(wxMouseEvent& event);
|
void mouseDown(wxMouseEvent& event);
|
||||||
void mouseReleased(wxMouseEvent& event);
|
void mouseReleased(wxMouseEvent& event);
|
||||||
|
void mouseCaptureLost(wxMouseCaptureLostEvent& event);
|
||||||
|
|
||||||
void sendButtonEvent();
|
void sendButtonEvent();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user