twainui设置界面改为非模态

This commit is contained in:
yangjiaxuan 2023-05-06 10:55:17 +08:00
parent 09ba3c6f47
commit a7d96e1929
7 changed files with 44 additions and 134 deletions

View File

@ -40,7 +40,6 @@ win32 {
HEADERS += ../../../modules/twainui/qmfcapp.hpp
HEADERS += ../../../modules/twainui/qwinhost.hpp
HEADERS += ../../../modules/twainui/qwinwidget.hpp
HEADERS += ../../../modules/twainui/twainui.h
HEADERS += ../../../modules/twainui/hg_settingdialog.h
MY_OS = windows

View File

@ -2,7 +2,7 @@
#define DIALOG_DEVICE_SELECT_H
#include <QDialog>
#include "twainui.h"
#include "twain_user/twainui.h"
namespace Ui {
class Dialog_device_select;

View File

@ -3,7 +3,7 @@
#include <QDialog>
#include <qtranslator.h>
#include "twainui.h"
#include "twain_user/twainui.h"
namespace Ui {
class Dialog_progress_ui;

View File

@ -16,14 +16,33 @@
std::string hg_settingdialog::property_combox_data_type_ = "combox_value_type";
hg_settingdialog::hg_settingdialog(SANE_Handle handle, const SANEAPI* saneApi, bool showScan, const char* devName, QWidget *parent)
hg_settingdialog::hg_settingdialog(SANE_Handle handle, const SANEAPI* saneApi, bool showScan, const char* devName,
std::function<void(ui_result)> callback, QWidget *parent)
: QDialog(parent)
, save_(false)
, btn_cut_area_(nullptr), btn_gamma_(nullptr), clicked_gamma_(false)
, custom_area_lable_(nullptr), comb_(nullptr)
, m_devHandle(handle)
, m_showScan(showScan)
, m_callback(callback)
{
m_langCode = lang_get_cur_code_page();
if (20127 == m_langCode)
{
m_translator.load(":translation/TwainUI_zh_EN.qm");
}
else
{
m_translator.load(":translation/TwainUI_zh_CN.qm");
m_translator_qt.load(":translation/qt_zh_CN.qm");
}
QCoreApplication::installTranslator(&m_translator);
if (20127 != m_langCode)
QCoreApplication::installTranslator(&m_translator_qt);
setAttribute(Qt::WA_DeleteOnClose, true);
HGChar cfgpath[512] = {0};
QString old;
HGBase_GetConfigPath(cfgpath, _countof(cfgpath) - 1);
@ -83,6 +102,10 @@ hg_settingdialog::hg_settingdialog(SANE_Handle handle, const SANEAPI* saneApi, b
hg_settingdialog::~hg_settingdialog()
{
QCoreApplication::removeTranslator(&m_translator);
if (20127 != m_langCode)
QCoreApplication::removeTranslator(&m_translator_qt);
cur_scheme_->release();
cur_cfg_->release();
}
@ -1432,19 +1455,21 @@ void hg_settingdialog::slot_buttonScanClicked()
{
save_scheme();
m_closeButton = closeButtonScan;
close();
m_callback(UI_RESULT_START_SCAN);
}
void hg_settingdialog::slot_buttonOkClicked()
{
save_ = true;
m_closeButton = closeButtonOk;
m_callback(UI_RESULT_CLOSE_NORMAL);
close();
}
void hg_settingdialog::slot_buttonCancelClicked()
{
m_closeButton = closeButtonCancel;
m_callback(UI_RESULT_CLOSE_CANCEL);
close();
}

View File

@ -7,6 +7,7 @@
#include "HGSaneUI.h"
#include "cfg/gb_json.h"
#include "device_menu.h"
#include "twain_user/twainui.h"
class hg_settingdialog : public QDialog
{
@ -46,7 +47,8 @@ class hg_settingdialog : public QDialog
};
public:
explicit hg_settingdialog(SANE_Handle handle, const SANEAPI* saneApi, bool showScan, const char* devName, QWidget *parent = nullptr);
explicit hg_settingdialog(SANE_Handle handle, const SANEAPI* saneApi, bool showScan, const char* devName,
std::function<void(ui_result)> callback, QWidget *parent = nullptr);
~hg_settingdialog();
public:
@ -74,6 +76,9 @@ private:
SANEAPI m_saneAPI;
SANE_Handle m_devHandle;
bool m_showScan;
QTranslator m_translator;
QTranslator m_translator_qt;
int m_langCode;
private:
QString m_qstrFileName;
@ -139,6 +144,7 @@ private:
QString m_colorModeValue;
SANE_Gamma m_gammaData;
QComboBox *comb_;
std::function<void(ui_result)> m_callback;
};
#endif // HG_SETTING_DIALOG_H

View File

@ -1,4 +1,4 @@
#include "twainui.h"
#include "twain_user/twainui.h"
#include <QMessageBox>
#include "dialog_device_select.h"
#include "dialog_progress_ui.h"
@ -84,7 +84,7 @@ void twain_ui_free(void *buf)
}
}
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, std::function<void(ui_result)> callback)
{
if (nullptr == api || nullptr == device)
return -1;
@ -93,47 +93,20 @@ int show_setting_ui(SANE_Handle device, HWND parent, LPSANEAPI api, const char *
#ifdef HG_CMP_MSC
if (!g_ownApplication)
g_ownApplication = QMfcApp::pluginInstance(g_hInst);
QWinWidget win(parent);
QWinWidget *win = new QWinWidget(parent);
if (nullptr != parent)
{
win.showCentered();
qParent = &win;
win->showCentered();
qParent = win;
}
#else
qParent = parent;
#endif
QTranslator translator;
QTranslator translator2;
int cp = lang_get_cur_code_page();
if (20127 == cp)
{
translator.load(":translation/TwainUI_zh_EN.qm");
}
else
{
translator.load(":translation/TwainUI_zh_CN.qm");
translator2.load(":translation/qt_zh_CN.qm");
}
hg_settingdialog *dlg = new hg_settingdialog(device, api, with_scan, devName, callback, qParent);
dlg->show();
QCoreApplication::installTranslator(&translator);
if (20127 != cp)
QCoreApplication::installTranslator(&translator2);
hg_settingdialog dlg(device, api, with_scan, devName, qParent);
dlg.exec();
QCoreApplication::removeTranslator(&translator);
if (20127 != cp)
QCoreApplication::removeTranslator(&translator2);
int ret = dlg.getCloseButtonCliked();
if (ret == dlg.closeButtonScan)
return UI_RESULT_START_SCAN;
else if (ret == dlg.closeButtonCancel)
return UI_RESULT_CLOSE_CANCEL;
else
return UI_RESULT_CLOSE_NORMAL;
return 0;
}
int show_progress_ui(HWND parent, std::function<void (ui_result)> callback, std::function<void (int, void *, int)> *notify)

View File

@ -1,93 +0,0 @@
#pragma once
#include <string>
#include <vector>
#include <functional>
#include "sane/sane_ex.h"
#include "base/HGDef.h"
#include <Windows.h>
typedef struct _dev_que_ui
{
int id; // ID用户选中后返回该值
std::string name; // 设备名称
std::string sn; // 设备序列号
}DEVQUEUI;
// 功能: 选择多个同型设备中的一个,模态
//
// 参数: devs - 设备队列列表
//
// 返回: 用户选择的设备所对应的DEVQUE::id或者-1代表用户放弃选择设备
int choose_scanner(const std::vector<DEVQUEUI>& devs); // blocked. return selected DEVQUE::id or -1 if user cancelled
// 功能: 应用当前设备对应的用户配置,同步
//
// 参数: dev_name - 设备名称
//
// device - 设备打开的句柄
//
// api - sane_xxx API函数指针
//
// 返回: 当前设备配置方案的名称。返回指针通过调用函数twain_ui_free来释放
char* apply_current_config(const char* dev_name, SANE_Handle device, LPSANEAPI api);
// 功能: 释放由界面模块返回的动态分配的内存,同步
//
// 参数: buf - 内存地址
//
// 返回: 无
void twain_ui_free(void* buf);
enum ui_result
{
UI_RESULT_FAILED = -1, // 一般用于界面初始化失败
UI_RESULT_OK, // 界面正常显示
UI_RESULT_CLOSE_NORMAL, // 界面正常关闭
UI_RESULT_CLOSE_CANCEL, // 用户取消操作,如取消扫描……
UI_RESULT_START_SCAN, // 用户点击了开始扫描
};
// 功能: 释放由界面模块返回的动态分配的内存,模态
//
// 参数: device - 当前打开的设备句柄
//
// parent - 父窗口句柄
//
// api - sane_xxx API函数指针
//
// devName - 设备名称
//
// with_scan - 是否显示“扫描”按钮
//
// 返回: ui_result 类型, UI_RESULT_CLOSE_NORMAL or UI_RESULT_START_SCAN
int show_setting_ui(SANE_Handle device, HWND parent, LPSANEAPI api, const char *devName, bool with_scan/*是否显示“扫描”按钮*/);
// 功能: 显示扫描进度界面,非模态
//
// 参数: parent - 父窗口句柄
//
// callback - 用户界面操作事件回调(主要为取消扫描事件)
//
// notify - ui接收进度通知函数外部通过该返回的函数来通知当前扫描进度或事件
// notify events: SANE_EVENT_WORKING - void*: unused, be NULL, flag - unused, be 0
// SANE_EVENT_SCAN_FINISHED - void*: (utf8*)message, flag - error code (0 is success)
// SANE_EVENT_USB_DATA_RECEIVED- void* unused, be NULL, flag - unused, be 0
// SANE_EVENT_IMAGE_OK - void* unused, be NULL, flag - unused, be 0
//
// 返回: ui_result 类型, UI_RESULT_FAILED or UI_RESULT_OK
int show_progress_ui(HWND parent, std::function<void(ui_result)> callback, std::function<void(int/*event*/, void*/*msg*/, int/*flag*/)>* notify);
// 功能: 不显示扫描进度界面,设备返回错误信息指示框,非模态
//
// 参数: parent - 父窗口句柄
//
// events - SANE_EVENT_SCAN_FINISHED
//
// void* - (utf8*)message,
//
// flag - error code (0 is success)
//
// 返回: ui_result 类型, UI_RESULT_FAILED or UI_RESULT_OK
int show_messagebox_ui(HWND parent,int event, void* msg, int flag);