diff --git a/Resources/InsaneWidget/XInsaneWidget.cpp b/Resources/InsaneWidget/XInsaneWidget.cpp index 4c823e7..bc58d3c 100644 --- a/Resources/InsaneWidget/XInsaneWidget.cpp +++ b/Resources/InsaneWidget/XInsaneWidget.cpp @@ -422,10 +422,9 @@ void XInsaneWidget::Setup(wxConfig * config, TimeredStatusBar * sb) btnScan->Enable(false); btnScan->Bind ( wxEVT_RIGHT_UP, &XInsaneWidget::OnBtnScanRightClick, this ); btnScan->Bind ( wxEVT_LEFT_UP, &XInsaneWidget::OnBtnScanClick, this ); - m_backgroundScannerDiscoveryEvh = std::make_unique(this); - BackgroundScannerDiscovery * backgroundDiscovery = new BackgroundScannerDiscovery ( m_scannerWidget.get(), - m_backgroundScannerDiscoveryEvh.get()); - backgroundDiscovery->Run(); + m_backgroundDiscovery = new BackgroundScannerDiscovery ( m_scannerWidget.get(), + new BackgroundScannerDiscoveryEVH(this)); // Takes ownership. + m_backgroundDiscovery->Run(); } @@ -581,5 +580,14 @@ void XInsaneWidget::CancelScanning() void XInsaneWidget::EnableScanButton(bool enable) { + // Called from BackgroundScannerDiscoveryEVH::Done() only; btnScan->Enable(enable); + m_backgroundDiscovery = nullptr; +} + +bool XInsaneWidget::IsScannerDiscoveryRunning() +{ + if (!m_backgroundDiscovery) + return false; + return m_backgroundDiscovery->IsRunning(); } diff --git a/Resources/InsaneWidget/XInsaneWidget.h b/Resources/InsaneWidget/XInsaneWidget.h index ca75455..69d2e0f 100644 --- a/Resources/InsaneWidget/XInsaneWidget.h +++ b/Resources/InsaneWidget/XInsaneWidget.h @@ -23,7 +23,7 @@ #include #include -class BackgroundScannerDiscoveryEVH; +class BackgroundScannerDiscovery; // Is a wxThread. class ScanProjectHandler; // An event handler extending InsaneWorkerEvent. class XStampWidget; struct StampDescriptor; @@ -66,6 +66,7 @@ public: void CancelScanning(); void EnableScanButton(bool enable); // For CallAfter. void Setup(wxConfig * config, TimeredStatusBar * sb); + bool IsScannerDiscoveryRunning(); private: wxConfig * m_config; wxWeakRef m_sb; @@ -81,7 +82,7 @@ private: // Available devices and minimal options. std::unique_ptr m_scannerWidget; std::unique_ptr m_insaneWorker; - std::unique_ptr m_backgroundScannerDiscoveryEvh; + BackgroundScannerDiscovery * m_backgroundDiscovery; std::unique_ptr m_scanProject; bool m_doubleSided = false; diff --git a/Resources/InsaneWidget/XScannerWidget.cpp b/Resources/InsaneWidget/XScannerWidget.cpp index 2abb0d2..ed93070 100644 --- a/Resources/InsaneWidget/XScannerWidget.cpp +++ b/Resources/InsaneWidget/XScannerWidget.cpp @@ -311,7 +311,10 @@ wxThread::ExitCode BackgroundScannerDiscovery::Entry() evt.SetShow ( true ); m_owner->OnActivated ( evt ); if (m_evh) + { m_evh->OnDone(); + wxDELETE(m_evh); + } } return ( wxThread::ExitCode ) 0; } @@ -321,3 +324,5 @@ wxThread::ExitCode BackgroundScannerDiscovery::Entry() void BackgroundScannerDiscoveryEvent::OnDone() {} +BackgroundScannerDiscoveryEvent::~BackgroundScannerDiscoveryEvent() = default; + diff --git a/Resources/InsaneWidget/XScannerWidget.h b/Resources/InsaneWidget/XScannerWidget.h index 55282a8..b6b6323 100644 --- a/Resources/InsaneWidget/XScannerWidget.h +++ b/Resources/InsaneWidget/XScannerWidget.h @@ -99,7 +99,7 @@ public: BackgroundScannerDiscovery ( XScannerWidget * owner, BackgroundScannerDiscoveryEvent * evh ) { m_owner = owner; - m_evh = evh; + m_evh = evh; // Owned here. } virtual ~BackgroundScannerDiscovery() {}; virtual ExitCode Entry(); @@ -112,6 +112,7 @@ class BackgroundScannerDiscoveryEvent { public: virtual void OnDone(); + virtual ~BackgroundScannerDiscoveryEvent(); }; diff --git a/XS7.cpp b/XS7.cpp index 26e2afa..d1501ce 100644 --- a/XS7.cpp +++ b/XS7.cpp @@ -49,6 +49,8 @@ void XS7::Setup(wxConfig * config) wxString fixedTip = _("'Shift + left' click to generate a new destination file name."); fixedTip += _T("\n") + m_insaneWidget->lblNewDoc->GetToolTipText(); m_insaneWidget->lblNewDoc->SetToolTip(fixedTip); + + Bind(wxEVT_CLOSE_WINDOW, &XS7::OnClose, this); } XS7::~XS7() @@ -57,6 +59,27 @@ XS7::~XS7() MiscTools::SaveSizePos(m_config, this, wxString("/") + _APPNAME_); } +void XS7::OnClose(wxCloseEvent& evt) +{ + if (!m_insaneWidget) + { + evt.Skip(); + return; + } + if (m_insaneWidget->IsScannerDiscoveryRunning()) + { + evt.Veto(); + TimeredStatusBar * sb = static_cast (GetStatusBar()); + if (sb) + sb->SetTransientText(_("Veto: scanner discovery is running.")); + evt.Skip(false); + return; + } + evt.Skip(); + +} + + void XS7::OnDpkRepositoryChange ( wxFileDirPickerEvent& evt ) { m_config->Write ( _T ( "/DocRoot" ), dpkDestination->GetPath() ); diff --git a/XS7.h b/XS7.h index 190871e..2154fa9 100644 --- a/XS7.h +++ b/XS7.h @@ -33,6 +33,7 @@ private: void OnDpkDoubleClick ( wxMouseEvent& evt ); void OnAppKeyPressed(wxKeyEvent& evt); void OnNewDocLeftClick ( wxMouseEvent& evt ); // wxStaticText in m_insaneWidget. + void OnClose(wxCloseEvent& evt); void OnAbout(wxMouseEvent& evt); };