147 lines
4.2 KiB
C++
147 lines
4.2 KiB
C++
#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();
|
|
|
|
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)
|
|
{
|
|
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();
|
|
}
|