Veto window closure during scanner discovery in the background.

This commit is contained in:
Saleem Edah-Tally
2025-07-13 20:24:50 +02:00
parent 0f286efe4c
commit c10aac922d
6 changed files with 46 additions and 7 deletions

View File

@@ -422,10 +422,9 @@ void XInsaneWidget::Setup(wxConfig * config, TimeredStatusBar * sb)
btnScan->Enable(false); btnScan->Enable(false);
btnScan->Bind ( wxEVT_RIGHT_UP, &XInsaneWidget::OnBtnScanRightClick, this ); btnScan->Bind ( wxEVT_RIGHT_UP, &XInsaneWidget::OnBtnScanRightClick, this );
btnScan->Bind ( wxEVT_LEFT_UP, &XInsaneWidget::OnBtnScanClick, this ); btnScan->Bind ( wxEVT_LEFT_UP, &XInsaneWidget::OnBtnScanClick, this );
m_backgroundScannerDiscoveryEvh = std::make_unique<BackgroundScannerDiscoveryEVH>(this); m_backgroundDiscovery = new BackgroundScannerDiscovery ( m_scannerWidget.get(),
BackgroundScannerDiscovery * backgroundDiscovery = new BackgroundScannerDiscovery ( m_scannerWidget.get(), new BackgroundScannerDiscoveryEVH(this)); // Takes ownership.
m_backgroundScannerDiscoveryEvh.get()); m_backgroundDiscovery->Run();
backgroundDiscovery->Run();
} }
@@ -581,5 +580,14 @@ void XInsaneWidget::CancelScanning()
void XInsaneWidget::EnableScanButton(bool enable) void XInsaneWidget::EnableScanButton(bool enable)
{ {
// Called from BackgroundScannerDiscoveryEVH::Done() only;
btnScan->Enable(enable); btnScan->Enable(enable);
m_backgroundDiscovery = nullptr;
}
bool XInsaneWidget::IsScannerDiscoveryRunning()
{
if (!m_backgroundDiscovery)
return false;
return m_backgroundDiscovery->IsRunning();
} }

View File

@@ -23,7 +23,7 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
class BackgroundScannerDiscoveryEVH; class BackgroundScannerDiscovery; // Is a wxThread.
class ScanProjectHandler; // An event handler extending InsaneWorkerEvent. class ScanProjectHandler; // An event handler extending InsaneWorkerEvent.
class XStampWidget; class XStampWidget;
struct StampDescriptor; struct StampDescriptor;
@@ -66,6 +66,7 @@ public:
void CancelScanning(); void CancelScanning();
void EnableScanButton(bool enable); // For CallAfter. void EnableScanButton(bool enable); // For CallAfter.
void Setup(wxConfig * config, TimeredStatusBar * sb); void Setup(wxConfig * config, TimeredStatusBar * sb);
bool IsScannerDiscoveryRunning();
private: private:
wxConfig * m_config; wxConfig * m_config;
wxWeakRef<TimeredStatusBar> m_sb; wxWeakRef<TimeredStatusBar> m_sb;
@@ -81,7 +82,7 @@ private:
// Available devices and minimal options. // Available devices and minimal options.
std::unique_ptr<XScannerWidget> m_scannerWidget; std::unique_ptr<XScannerWidget> m_scannerWidget;
std::unique_ptr<InsaneWorker> m_insaneWorker; std::unique_ptr<InsaneWorker> m_insaneWorker;
std::unique_ptr<BackgroundScannerDiscoveryEVH> m_backgroundScannerDiscoveryEvh; BackgroundScannerDiscovery * m_backgroundDiscovery;
std::unique_ptr<ScanProjectHandler> m_scanProject; std::unique_ptr<ScanProjectHandler> m_scanProject;
bool m_doubleSided = false; bool m_doubleSided = false;

View File

@@ -311,7 +311,10 @@ wxThread::ExitCode BackgroundScannerDiscovery::Entry()
evt.SetShow ( true ); evt.SetShow ( true );
m_owner->OnActivated ( evt ); m_owner->OnActivated ( evt );
if (m_evh) if (m_evh)
{
m_evh->OnDone(); m_evh->OnDone();
wxDELETE(m_evh);
}
} }
return ( wxThread::ExitCode ) 0; return ( wxThread::ExitCode ) 0;
} }
@@ -321,3 +324,5 @@ wxThread::ExitCode BackgroundScannerDiscovery::Entry()
void BackgroundScannerDiscoveryEvent::OnDone() void BackgroundScannerDiscoveryEvent::OnDone()
{} {}
BackgroundScannerDiscoveryEvent::~BackgroundScannerDiscoveryEvent() = default;

View File

@@ -99,7 +99,7 @@ public:
BackgroundScannerDiscovery ( XScannerWidget * owner, BackgroundScannerDiscoveryEvent * evh ) BackgroundScannerDiscovery ( XScannerWidget * owner, BackgroundScannerDiscoveryEvent * evh )
{ {
m_owner = owner; m_owner = owner;
m_evh = evh; m_evh = evh; // Owned here.
} }
virtual ~BackgroundScannerDiscovery() {}; virtual ~BackgroundScannerDiscovery() {};
virtual ExitCode Entry(); virtual ExitCode Entry();
@@ -112,6 +112,7 @@ class BackgroundScannerDiscoveryEvent
{ {
public: public:
virtual void OnDone(); virtual void OnDone();
virtual ~BackgroundScannerDiscoveryEvent();
}; };

23
XS7.cpp
View File

@@ -49,6 +49,8 @@ void XS7::Setup(wxConfig * config)
wxString fixedTip = _("'Shift + left' click to generate a new destination file name."); wxString fixedTip = _("'Shift + left' click to generate a new destination file name.");
fixedTip += _T("\n") + m_insaneWidget->lblNewDoc->GetToolTipText(); fixedTip += _T("\n") + m_insaneWidget->lblNewDoc->GetToolTipText();
m_insaneWidget->lblNewDoc->SetToolTip(fixedTip); m_insaneWidget->lblNewDoc->SetToolTip(fixedTip);
Bind(wxEVT_CLOSE_WINDOW, &XS7::OnClose, this);
} }
XS7::~XS7() XS7::~XS7()
@@ -57,6 +59,27 @@ XS7::~XS7()
MiscTools::SaveSizePos(m_config, this, wxString("/") + _APPNAME_); 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<TimeredStatusBar*> (GetStatusBar());
if (sb)
sb->SetTransientText(_("Veto: scanner discovery is running."));
evt.Skip(false);
return;
}
evt.Skip();
}
void XS7::OnDpkRepositoryChange ( wxFileDirPickerEvent& evt ) void XS7::OnDpkRepositoryChange ( wxFileDirPickerEvent& evt )
{ {
m_config->Write ( _T ( "/DocRoot" ), dpkDestination->GetPath() ); m_config->Write ( _T ( "/DocRoot" ), dpkDestination->GetPath() );

1
XS7.h
View File

@@ -33,6 +33,7 @@ private:
void OnDpkDoubleClick ( wxMouseEvent& evt ); void OnDpkDoubleClick ( wxMouseEvent& evt );
void OnAppKeyPressed(wxKeyEvent& evt); void OnAppKeyPressed(wxKeyEvent& evt);
void OnNewDocLeftClick ( wxMouseEvent& evt ); // wxStaticText in m_insaneWidget. void OnNewDocLeftClick ( wxMouseEvent& evt ); // wxStaticText in m_insaneWidget.
void OnClose(wxCloseEvent& evt);
void OnAbout(wxMouseEvent& evt); void OnAbout(wxMouseEvent& evt);
}; };