解决三方扫描时不关闭设置界面,禁用界面的使用

This commit is contained in:
yangjiaxuan 2023-11-29 14:39:11 +08:00
parent f4d01ab5a8
commit bc80b1ea74
6 changed files with 95 additions and 14 deletions

View File

@ -15,7 +15,8 @@ extern Manager* g_manager;
Manager::Manager() Manager::Manager()
: QObject(nullptr) : QObject(nullptr)
, m_progressUiCallback(std::function<void(ui_result)>()) , m_progressUiCallback(std::function<void(ui_result)>())
, m_notify(nullptr) , m_progNotify(nullptr)
, m_settingNotify(nullptr)
, m_settingUiCallback(std::function<void(ui_result)>()) , m_settingUiCallback(std::function<void(ui_result)>())
, m_settingUi(nullptr) , m_settingUi(nullptr)
, m_progressUi(nullptr) , m_progressUi(nullptr)
@ -72,7 +73,7 @@ int Manager::showDeviceSelect(const std::vector<DEVQUEUI>& devs)
return m_DeviceSelectResult; return m_DeviceSelectResult;
} }
int Manager::showSettingUi(SANE_Handle device, HWND parent, LPSANEAPI api, const char * devName, gb::scanner_cfg* cfg, bool with_scan, std::function<void (ui_result)> callback) int Manager::showSettingUi(SANE_Handle device, HWND parent, LPSANEAPI api, const char * devName, gb::scanner_cfg* cfg, bool with_scan, std::function<void (ui_result)> callback, std::function<void(int, void*, int)>* notify)
{ {
// param // param
m_device = device; m_device = device;
@ -82,6 +83,7 @@ int Manager::showSettingUi(SANE_Handle device, HWND parent, LPSANEAPI api, const
m_devName = devName; m_devName = devName;
m_with_scan = with_scan; m_with_scan = with_scan;
m_settingUiCallback = callback; m_settingUiCallback = callback;
m_settingNotify = notify;
void *hStopEvent = nullptr; void *hStopEvent = nullptr;
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
@ -93,6 +95,15 @@ int Manager::showSettingUi(SANE_Handle device, HWND parent, LPSANEAPI api, const
emit createSettingUi(hStopEvent); emit createSettingUi(hStopEvent);
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "[Manager::showSettingUi] emit createSettingUi(ThreadId)"); HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "[Manager::showSettingUi] emit createSettingUi(ThreadId)");
#ifdef HG_CMP_MSC
if (nullptr != hStopEvent)
{
msgLoop(hStopEvent);
CloseHandle(hStopEvent);
}
#endif
return 0; return 0;
} }
@ -101,7 +112,7 @@ int Manager::showProgressUi(HWND parent, std::function<void (ui_result)> callbac
// param // param
m_progressUiparent = (HGWindow)parent; m_progressUiparent = (HGWindow)parent;
m_progressUiCallback = callback; m_progressUiCallback = callback;
m_notify = notify; m_progNotify = notify;
void *hStopEvent = nullptr; void *hStopEvent = nullptr;
#ifdef HG_CMP_MSC #ifdef HG_CMP_MSC
@ -324,7 +335,8 @@ void Manager::clear_functions(void)
{ {
m_settingUiCallback = std::function<void(ui_result)>(); m_settingUiCallback = std::function<void(ui_result)>();
m_progressUiCallback = std::function<void(ui_result)>(); m_progressUiCallback = std::function<void(ui_result)>();
m_notify = nullptr; m_progNotify = nullptr;
m_settingNotify = nullptr;
if (m_progressUi) if (m_progressUi)
m_progressUi->clear_callback(); m_progressUi->clear_callback();
if (m_settingUi) if (m_settingUi)
@ -418,11 +430,17 @@ void Manager::on_createSettingUi(void *hEvent)
if (m_settingUi != nullptr) if (m_settingUi != nullptr)
delete m_settingUi; delete m_settingUi;
m_settingUi = new hg_settingdialog(this, m_device, &m_api, m_with_scan, m_devName.c_str(), scanner_cfg_, close_prog, qParent); m_settingUi = new hg_settingdialog(this, m_device, &m_api, m_with_scan, m_devName.c_str(), scanner_cfg_, close_prog, m_settingNotify, qParent);
m_settingUi->setModal(true); m_settingUi->setModal(true);
m_settingUi->show(); m_settingUi->show();
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "[Manager::on_createSettingUi] m_settingUi->show()"); HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "[Manager::on_createSettingUi] m_settingUi->show()");
#ifdef HG_CMP_MSC
if (nullptr != hEvent)
{
SetEvent((HANDLE)hEvent);
}
#endif
} }
void Manager::on_createProgressUi(void *hEvent) void Manager::on_createProgressUi(void *hEvent)
@ -453,7 +471,7 @@ void Manager::on_createProgressUi(void *hEvent)
}; };
if (m_progressUi != nullptr) if (m_progressUi != nullptr)
delete m_progressUi; delete m_progressUi;
m_progressUi = new Dialog_progress_ui(this, close_prog, m_notify, qParent); m_progressUi = new Dialog_progress_ui(this, close_prog, m_progNotify, qParent);
m_progressUi->setModal(true); m_progressUi->setModal(true);
m_progressUi->show(); m_progressUi->show();
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "[Manager::on_createProgressUi] m_progressUi->show()"); HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "[Manager::on_createProgressUi] m_progressUi->show()");

View File

@ -18,7 +18,7 @@ public:
~Manager(); ~Manager();
int showDeviceSelect(const std::vector<DEVQUEUI>& devs); int showDeviceSelect(const std::vector<DEVQUEUI>& devs);
int showSettingUi(SANE_Handle device, HWND settingUiParent, LPSANEAPI api, const char * devName, gb::scanner_cfg* cfg, bool with_scan, std::function<void(ui_result)> callback); int showSettingUi(SANE_Handle device, HWND settingUiParent, LPSANEAPI api, const char * devName, gb::scanner_cfg* cfg, bool with_scan, std::function<void(ui_result)> callback, std::function<void(int, void*, int)>* notify);
int showProgressUi(HWND parent, std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify); int showProgressUi(HWND parent, std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify);
int showMessageBoxUi(HWND parent, int event, void *msg, int flag); int showMessageBoxUi(HWND parent, int event, void *msg, int flag);
int showTwainSrcUi(const TW_IDENTITY *vds, HGUInt count, const char* defDevName, HGWindow parent, TW_IDENTITY *ds); int showTwainSrcUi(const TW_IDENTITY *vds, HGUInt count, const char* defDevName, HGWindow parent, TW_IDENTITY *ds);
@ -79,11 +79,12 @@ public:
bool m_with_scan; bool m_with_scan;
gb::scanner_cfg* scanner_cfg_; gb::scanner_cfg* scanner_cfg_;
std::function<void(ui_result)> m_settingUiCallback; std::function<void(ui_result)> m_settingUiCallback;
std::function<void(int, void*, int)>* m_settingNotify;
Dialog_progress_ui *m_progressUi; Dialog_progress_ui *m_progressUi;
HGWindow m_progressUiparent; HGWindow m_progressUiparent;
std::function<void (ui_result)> m_progressUiCallback; std::function<void (ui_result)> m_progressUiCallback;
std::function<void (int, void *, int)> *m_notify; std::function<void (int, void *, int)> * m_progNotify;
HGWindow m_messageBoxUiParent; HGWindow m_messageBoxUiParent;
int m_notifyEvent; int m_notifyEvent;

View File

@ -21,8 +21,10 @@
std::string hg_settingdialog::property_combox_data_type_ = "combox_value_type"; std::string hg_settingdialog::property_combox_data_type_ = "combox_value_type";
static int m_customCutAreaUnit = 0; static int m_customCutAreaUnit = 0;
extern Manager* g_manager;
hg_settingdialog::hg_settingdialog(class Manager *mgr, SANE_Handle handle, const SANEAPI* saneApi, bool showScan, const char* devName, gb::scanner_cfg* cfg, hg_settingdialog::hg_settingdialog(class Manager *mgr, SANE_Handle handle, const SANEAPI* saneApi, bool showScan, const char* devName, gb::scanner_cfg* cfg,
std::function<void(ui_result)> callback, QWidget *parent) std::function<void(ui_result)> callback, std::function<void(int, void*, int)>* notify, QWidget *parent)
: QDialog(parent) : QDialog(parent)
, save_(false) , save_(false)
, btn_cut_area_(nullptr), btn_gamma_(nullptr), clicked_gamma_(false) , btn_cut_area_(nullptr), btn_gamma_(nullptr), clicked_gamma_(false)
@ -35,6 +37,7 @@ hg_settingdialog::hg_settingdialog(class Manager *mgr, SANE_Handle handle, const
, changed_count_(0) , changed_count_(0)
, cur_cfg_(cfg) , cur_cfg_(cfg)
, m_isMultiOutMode(false) , m_isMultiOutMode(false)
, m_isScanning(false)
{ {
m_mgr = mgr; m_mgr = mgr;
@ -80,6 +83,10 @@ hg_settingdialog::hg_settingdialog(class Manager *mgr, SANE_Handle handle, const
m_originGammaData = m_gammaData; m_originGammaData = m_gammaData;
connect(comb_, SIGNAL(currentTextChanged(const QString)), this, SLOT(on_current_scheme_changed())); connect(comb_, SIGNAL(currentTextChanged(const QString)), this, SLOT(on_current_scheme_changed()));
connect(this, SIGNAL(scan_start()),this, SLOT(on_scan_start()), Qt::QueuedConnection);
connect(this, SIGNAL(scan_finish()), this, SLOT(on_scan_finish()), Qt::QueuedConnection);
*notify = FuncNotify;
} }
hg_settingdialog::~hg_settingdialog() hg_settingdialog::~hg_settingdialog()
@ -172,6 +179,30 @@ void hg_settingdialog::apply_scheme(SANE_Handle dev, LPSANEAPI api, gb::sane_con
} }
} }
void hg_settingdialog::FuncNotify(int event, void* msg, int flag)
{
hg_settingdialog* p = (hg_settingdialog*)g_manager->m_settingUi;
if (nullptr == p)
{
return;
}
switch (event)
{
case SANE_EVENT_WORKING:
{
emit p->scan_start();
}
break;
case SANE_EVENT_SCAN_FINISHED:
{
emit p->scan_finish();
}
break;
}
}
void hg_settingdialog::initUi() void hg_settingdialog::initUi()
{ {
update_opt_value_from_driver(); update_opt_value_from_driver();
@ -1169,6 +1200,20 @@ void hg_settingdialog::updateUIStatus()
} }
} }
void hg_settingdialog::on_scan_start()
{
m_isScanning = true;
this->setEnabled(false);
setAttribute(Qt::WA_DeleteOnClose, false);
}
void hg_settingdialog::on_scan_finish()
{
m_isScanning = false;
this->setEnabled(true);
setAttribute(Qt::WA_DeleteOnClose, true);
}
void hg_settingdialog::slot_checkedClicked() void hg_settingdialog::slot_checkedClicked()
{ {
QCheckBox *checkBox = qobject_cast<QCheckBox*>(sender()); QCheckBox *checkBox = qobject_cast<QCheckBox*>(sender());
@ -2053,6 +2098,13 @@ void hg_settingdialog::closeEvent(QCloseEvent* e)
// 3、点击确定按钮后如果当前方案非用户模板则保存进默认配置如果为用户模板则更新当前方案索引 // 3、点击确定按钮后如果当前方案非用户模板则保存进默认配置如果为用户模板则更新当前方案索引
// 4、点出取消按钮恢复驱动值至该对话框初始化状态不对配置作变更 // 4、点出取消按钮恢复驱动值至该对话框初始化状态不对配置作变更
// //
if (m_isScanning)
{
e->ignore();
return;
}
int index = comb_->currentIndex(); int index = comb_->currentIndex();
if (m_closeButton == closeButtonOk) if (m_closeButton == closeButtonOk)
{ {

View File

@ -51,10 +51,11 @@ class hg_settingdialog : public QDialog
public: public:
explicit hg_settingdialog(class Manager *mgr, SANE_Handle handle, const SANEAPI* saneApi, bool showScan, const char* devName, gb::scanner_cfg* cfg, explicit hg_settingdialog(class Manager *mgr, SANE_Handle handle, const SANEAPI* saneApi, bool showScan, const char* devName, gb::scanner_cfg* cfg,
std::function<void(ui_result)> callback, QWidget *parent = nullptr); std::function<void(ui_result)> callback, std::function<void(int, void*, int)>* notify, QWidget *parent = nullptr);
~hg_settingdialog(); ~hg_settingdialog();
static void apply_scheme(SANE_Handle dev, LPSANEAPI api, gb::sane_config_schm* schm); static void apply_scheme(SANE_Handle dev, LPSANEAPI api, gb::sane_config_schm* schm);
static void FuncNotify(int event, void* msg, int flag);
public: public:
void initUi(); void initUi();
@ -135,6 +136,14 @@ private:
QVector<std::string> m_list_deviceNames; QVector<std::string> m_list_deviceNames;
QVector<QWidget*> m_list_widgets; QVector<QWidget*> m_list_widgets;
signals:
void scan_start();
void scan_finish();
private slots:
void on_scan_start();
void on_scan_finish();
private slots: private slots:
void slot_checkedClicked(); void slot_checkedClicked();
void slot_sliderClicked(int value); void slot_sliderClicked(int value);
@ -179,6 +188,7 @@ private:
bool m_isRefreshUi; bool m_isRefreshUi;
bool m_isMultiOutMode; bool m_isMultiOutMode;
bool m_isScanning;
}; };
#endif // HG_SETTING_DIALOG_H #endif // HG_SETTING_DIALOG_H

View File

@ -193,11 +193,11 @@ void twain_ui_free(void *buf)
} }
} }
int show_setting_ui(SANE_Handle device, HWND parent, LPSANEAPI api, const char *devName, bool with_scan, std::function<void(ui_result)> callback) int show_setting_ui(SANE_Handle device, HWND parent, LPSANEAPI api, const char *devName, bool with_scan, std::function<void(ui_result)> callback, std::function<void(int, void*, int)> *notify)
{ {
Init(); Init();
return g_manager->showSettingUi(device, parent, api, devName, scanner_cfg_, with_scan, callback); return g_manager->showSettingUi(device, parent, api, devName, scanner_cfg_, with_scan, callback, notify);
} }
int show_progress_ui(HWND parent, std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify) int show_progress_ui(HWND parent, std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify)

View File

@ -77,7 +77,7 @@ enum ui_result
// //
// 返回: ui_result 类型, UI_RESULT_FAILED or UI_RESULT_OK // 返回: ui_result 类型, UI_RESULT_FAILED or UI_RESULT_OK
//int show_setting_ui(SANE_Handle device, HWND parent, LPSANEAPI api, const char *devName, bool with_scan/*是否显示“扫描”按钮*/); //int show_setting_ui(SANE_Handle device, HWND parent, LPSANEAPI api, const char *devName, bool with_scan/*是否显示“扫描”按钮*/);
HGEXPORT int show_setting_ui(SANE_Handle device,HWND parent, LPSANEAPI api, const char *devName, bool with_scan/*是否显示“扫描”按钮*/,std::function<void(ui_result)> callback); HGEXPORT int show_setting_ui(SANE_Handle device, HWND parent, LPSANEAPI api, const char* devName, bool with_scan, std::function<void(ui_result)> callback, std::function<void(int, void*, int)>* notify);
// 功能: 显示扫描进度界面,非模态 // 功能: 显示扫描进度界面,非模态
// //