code_app/modules/saneui/dialog_device_select.cpp

147 lines
4.2 KiB
C++
Raw Normal View History

#include "dialog_device_select.h"
#include "ui_dialog_device_select.h"
#include <QMessageBox>
Dialog_Device_Select::Dialog_Device_Select(const SANEAPI* saneApi, const char **devNames, QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog_Device_Select)
{
ui->setupUi(this);
memcpy(&m_saneAPI, saneApi, sizeof(SANEAPI));
m_devHandle = nullptr;
m_devName.clear();
m_vDevName.clear();
2023-04-03 03:06:14 +00:00
setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
if (nullptr == devNames)
{
const SANE_Device** device_list;
if (SANE_STATUS_GOOD == saneApi->sane_get_devices_api(&device_list, SANE_TRUE))
{
const SANE_Device** p;
for (p = device_list; *p != nullptr; ++p)
{
m_vDevName.push_back((*p)->name);
ui->listWidget->addItem((*p)->name);
}
}
}
else
{
const char **p = devNames;
while (*p != nullptr)
{
m_vDevName.push_back(*p);
ui->listWidget->addItem(*p);
++p;
}
}
if (!m_vDevName.empty())
{
ui->listWidget->setCurrentRow(0);
}
if (ui->listWidget->count() > 1)
processSameDeviceType();
}
Dialog_Device_Select::~Dialog_Device_Select()
{
delete ui;
}
SANE_Handle Dialog_Device_Select::GetDevHandle()
{
return m_devHandle;
}
std::string Dialog_Device_Select::GetDevName()
{
return m_devName;
}
void Dialog_Device_Select::processSameDeviceType()
{
int len = ui->listWidget->count();
for (int i = 0; i < len - 1; ++i)
{
for (int j = i + 1; j < len; ++j)
{
QString devName = ui->listWidget->item(i)->text();
QString devName2 = ui->listWidget->item(j)->text();
if (devName.contains(" - "))
{
devName.truncate(devName.lastIndexOf(" - "));
if (!devName.contains(" - "))
{
devName = ui->listWidget->item(i)->text();
}
}
if (devName2.contains(" - "))
{
devName2.truncate(devName2.lastIndexOf(" - "));
if (!devName2.contains(" - "))
{
devName2 = ui->listWidget->item(j)->text();
}
}
if (devName == devName2)
{
SANE_Handle dev = nullptr;
SANE_Status ret = m_saneAPI.sane_open_api(ui->listWidget->item(i)->text().toStdString().c_str(), &dev);
if (SANE_STATUS_GOOD == ret && dev != nullptr)
{
char serialNum[32] = {0};
m_saneAPI.sane_control_option_api(dev, SANE_OPT_ID_DEVICE_SERIAL_NO, SANE_ACTION_GET_VALUE, serialNum, NULL);
ui->listWidget->item(i)->setText(ui->listWidget->item(i)->text() + "(" + QString::fromLocal8Bit(serialNum) + ")");
m_saneAPI.sane_close_api(dev);
}
ret = m_saneAPI.sane_open_api(ui->listWidget->item(j)->text().toStdString().c_str(), &dev);
if (SANE_STATUS_GOOD == ret && dev != nullptr)
{
char serialNum[32] = {0};
m_saneAPI.sane_control_option_api(dev, SANE_OPT_ID_DEVICE_SERIAL_NO, SANE_ACTION_GET_VALUE, serialNum, NULL);
ui->listWidget->item(j)->setText(ui->listWidget->item(j)->text() + "(" + QString::fromLocal8Bit(serialNum) + ")");
m_saneAPI.sane_close_api(dev);
}
}
}
}
}
void Dialog_Device_Select::on_pushButton_OK_clicked()
{
int index = ui->listWidget->currentRow();
if (index < 0)
{
return;
}
SANE_Handle dev = nullptr;
SANE_Status ret = m_saneAPI.sane_open_api(m_vDevName[index].c_str(), &dev);
if (SANE_STATUS_GOOD != ret)
{
2023-04-04 08:36:19 +00:00
QMessageBox::information(this, tr("tips"), QString::fromUtf8(m_saneAPI.sane_strstatus_api(ret)));
return;
}
m_devHandle = dev;
m_devName = m_vDevName[index];
accept();
}
void Dialog_Device_Select::on_pushButton_Cancel_clicked()
{
reject();
}
void Dialog_Device_Select::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{
on_pushButton_OK_clicked();
}