mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-09 21:22:39 -05:00
qeditor: move backend selector to its own class, that's cleaner
Change-Id: I7f3fa66a8f67639b4b64cf9f6acc5fb10e227653 Reviewed-on: http://gerrit.rockbox.org/974 Reviewed-by: Amaury Pouly <amaury.pouly@gmail.com>
This commit is contained in:
parent
b2ef4a806b
commit
a01bf8d93c
4 changed files with 196 additions and 163 deletions
|
|
@ -113,14 +113,7 @@ RegTab::RegTab(Backend *backend, QWidget *parent)
|
||||||
m_right_panel = new QVBoxLayout;
|
m_right_panel = new QVBoxLayout;
|
||||||
QGroupBox *data_sel_group = new QGroupBox("Data selection");
|
QGroupBox *data_sel_group = new QGroupBox("Data selection");
|
||||||
QHBoxLayout *data_sel_layout = new QHBoxLayout;
|
QHBoxLayout *data_sel_layout = new QHBoxLayout;
|
||||||
m_data_selector = new QComboBox;
|
m_backend_selector = new BackendSelector(m_backend, this);
|
||||||
m_data_selector->addItem(QIcon::fromTheme("text-x-generic"), "Explore", QVariant(DataSelNothing));
|
|
||||||
m_data_selector->addItem(QIcon::fromTheme("document-open"), "File...", QVariant(DataSelFile));
|
|
||||||
#ifdef HAVE_HWSTUB
|
|
||||||
m_data_selector->addItem(QIcon::fromTheme("multimedia-player"), "Device...", QVariant(DataSelDevice));
|
|
||||||
#endif
|
|
||||||
m_data_sel_edit = new QLineEdit;
|
|
||||||
m_data_sel_edit->setReadOnly(true);
|
|
||||||
m_readonly_check = new QCheckBox("Read-only");
|
m_readonly_check = new QCheckBox("Read-only");
|
||||||
m_readonly_check->setCheckState(Qt::Checked);
|
m_readonly_check->setCheckState(Qt::Checked);
|
||||||
m_data_soc_label = new QLabel;
|
m_data_soc_label = new QLabel;
|
||||||
|
|
@ -129,13 +122,7 @@ RegTab::RegTab(Backend *backend, QWidget *parent)
|
||||||
m_data_sel_reload = new QPushButton(this);
|
m_data_sel_reload = new QPushButton(this);
|
||||||
m_data_sel_reload->setIcon(QIcon::fromTheme("view-refresh"));
|
m_data_sel_reload->setIcon(QIcon::fromTheme("view-refresh"));
|
||||||
m_data_sel_reload->setToolTip("Reload data");
|
m_data_sel_reload->setToolTip("Reload data");
|
||||||
data_sel_layout->addWidget(m_data_selector);
|
data_sel_layout->addWidget(m_backend_selector);
|
||||||
data_sel_layout->addWidget(m_data_sel_edit, 1);
|
|
||||||
data_sel_layout->addStretch(0);
|
|
||||||
#ifdef HAVE_HWSTUB
|
|
||||||
m_dev_selector = new QComboBox;
|
|
||||||
data_sel_layout->addWidget(m_dev_selector, 1);
|
|
||||||
#endif
|
|
||||||
data_sel_layout->addWidget(m_readonly_check);
|
data_sel_layout->addWidget(m_readonly_check);
|
||||||
data_sel_layout->addWidget(m_data_soc_label);
|
data_sel_layout->addWidget(m_data_soc_label);
|
||||||
data_sel_layout->addWidget(m_dump);
|
data_sel_layout->addWidget(m_dump);
|
||||||
|
|
@ -158,29 +145,24 @@ RegTab::RegTab(Backend *backend, QWidget *parent)
|
||||||
connect(m_backend, SIGNAL(OnSocListChanged()), this, SLOT(OnSocListChanged()));
|
connect(m_backend, SIGNAL(OnSocListChanged()), this, SLOT(OnSocListChanged()));
|
||||||
connect(m_reg_tree, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
|
connect(m_reg_tree, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
|
||||||
this, SLOT(OnRegItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)));
|
this, SLOT(OnRegItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)));
|
||||||
connect(m_data_selector, SIGNAL(activated(int)),
|
|
||||||
this, SLOT(OnDataSelChanged(int)));
|
|
||||||
connect(m_data_soc_label, SIGNAL(linkActivated(const QString&)), this,
|
connect(m_data_soc_label, SIGNAL(linkActivated(const QString&)), this,
|
||||||
SLOT(OnDataSocActivated(const QString&)));
|
SLOT(OnDataSocActivated(const QString&)));
|
||||||
connect(m_analysers_list, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)),
|
connect(m_analysers_list, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)),
|
||||||
this, SLOT(OnAnalyserChanged(QListWidgetItem *, QListWidgetItem *)));
|
this, SLOT(OnAnalyserChanged(QListWidgetItem *, QListWidgetItem *)));
|
||||||
#ifdef HAVE_HWSTUB
|
connect(m_backend_selector, SIGNAL(OnSelect(IoBackend *)),
|
||||||
connect(m_dev_selector, SIGNAL(currentIndexChanged(int)),
|
this, SLOT(OnBackendSelect(IoBackend *)));
|
||||||
this, SLOT(OnDevChanged(int)));
|
|
||||||
#endif
|
|
||||||
connect(m_readonly_check, SIGNAL(clicked(bool)), this, SLOT(OnReadOnlyClicked(bool)));
|
connect(m_readonly_check, SIGNAL(clicked(bool)), this, SLOT(OnReadOnlyClicked(bool)));
|
||||||
connect(m_dump, SIGNAL(clicked(bool)), this, SLOT(OnDumpRegs(bool)));
|
connect(m_dump, SIGNAL(clicked(bool)), this, SLOT(OnDumpRegs(bool)));
|
||||||
|
connect(m_data_sel_reload, SIGNAL(clicked(bool)), this, SLOT(OnBackendReload(bool)));
|
||||||
|
connect(m_type_selector, SIGNAL(currentChanged(int)), this, SLOT(OnTypeChanged(int)));
|
||||||
|
|
||||||
OnSocListChanged();
|
OnSocListChanged();
|
||||||
OnDataSelChanged(0);
|
SetDataSocName("");
|
||||||
}
|
}
|
||||||
|
|
||||||
RegTab::~RegTab()
|
RegTab::~RegTab()
|
||||||
{
|
{
|
||||||
#ifdef HAVE_HWSTUB
|
/* backend will be deleted by backend selector */
|
||||||
ClearDevList();
|
|
||||||
#endif
|
|
||||||
delete m_io_backend;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RegTab::Quit()
|
bool RegTab::Quit()
|
||||||
|
|
@ -210,79 +192,15 @@ void RegTab::OnDataSocActivated(const QString& str)
|
||||||
m_soc_selector->setCurrentIndex(index);
|
m_soc_selector->setCurrentIndex(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegTab::OnDataSelChanged(int index)
|
void RegTab::OnBackendSelect(IoBackend *backend)
|
||||||
{
|
{
|
||||||
if(index == -1)
|
m_io_backend = backend;
|
||||||
return;
|
SetReadOnlyIndicator();
|
||||||
QVariant var = m_data_selector->itemData(index);
|
SetDataSocName(m_io_backend->GetSocName());
|
||||||
if(var == DataSelFile)
|
OnDataSocActivated(m_io_backend->GetSocName());
|
||||||
{
|
|
||||||
m_data_sel_edit->show();
|
|
||||||
#ifdef HAVE_HWSTUB
|
|
||||||
m_dev_selector->hide();
|
|
||||||
#endif
|
|
||||||
m_readonly_check->show();
|
|
||||||
m_data_sel_reload->show();
|
|
||||||
m_dump->hide();
|
|
||||||
QFileDialog *fd = new QFileDialog(m_data_selector);
|
|
||||||
fd->setFilter("Textual files (*.txt);;All files (*)");
|
|
||||||
fd->setDirectory(Settings::Get()->value("loaddatadir", QDir::currentPath()).toString());
|
|
||||||
if(fd->exec())
|
|
||||||
{
|
|
||||||
QStringList filenames = fd->selectedFiles();
|
|
||||||
delete m_io_backend;
|
|
||||||
m_io_backend = m_backend->CreateFileIoBackend(filenames[0]);
|
|
||||||
m_data_sel_edit->setText(filenames[0]);
|
|
||||||
SetDataSocName(m_io_backend->GetSocName());
|
|
||||||
OnDataSocActivated(m_io_backend->GetSocName());
|
|
||||||
}
|
|
||||||
Settings::Get()->setValue("loaddatadir", fd->directory().absolutePath());
|
|
||||||
SetReadOnlyIndicator();
|
|
||||||
}
|
|
||||||
#ifdef HAVE_HWSTUB
|
|
||||||
else if(var == DataSelDevice)
|
|
||||||
{
|
|
||||||
m_data_sel_edit->hide();
|
|
||||||
m_readonly_check->show();
|
|
||||||
m_dev_selector->show();
|
|
||||||
m_data_sel_reload->hide();
|
|
||||||
m_dump->show();
|
|
||||||
OnDevListChanged();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_data_sel_edit->show();
|
|
||||||
#ifdef HAVE_HWSTUB
|
|
||||||
m_dev_selector->hide();
|
|
||||||
#endif
|
|
||||||
m_readonly_check->hide();
|
|
||||||
m_data_sel_reload->hide();
|
|
||||||
m_dump->hide();
|
|
||||||
|
|
||||||
delete m_io_backend;
|
|
||||||
m_io_backend = m_backend->CreateDummyIoBackend();
|
|
||||||
m_readonly_check->setCheckState(Qt::Checked);
|
|
||||||
SetDataSocName("");
|
|
||||||
UpdateSocFilename();
|
|
||||||
}
|
|
||||||
OnDataChanged();
|
OnDataChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegTab::UpdateSocFilename()
|
|
||||||
{
|
|
||||||
int index = m_data_selector->currentIndex();
|
|
||||||
if(index == -1)
|
|
||||||
return;
|
|
||||||
if(m_data_selector->itemData(index) != DataSelNothing)
|
|
||||||
return;
|
|
||||||
index = m_soc_selector->currentIndex();
|
|
||||||
if(index == -1)
|
|
||||||
return;
|
|
||||||
SocRef ref = m_soc_selector->itemData(index).value< SocRef >();
|
|
||||||
m_data_sel_edit->setText(ref.GetSocFile()->GetFilename());
|
|
||||||
}
|
|
||||||
|
|
||||||
void RegTab::SetReadOnlyIndicator()
|
void RegTab::SetReadOnlyIndicator()
|
||||||
{
|
{
|
||||||
if(m_io_backend->IsReadOnly())
|
if(m_io_backend->IsReadOnly())
|
||||||
|
|
@ -371,51 +289,6 @@ void RegTab::OnSocListChanged()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_HWSTUB
|
|
||||||
void RegTab::OnDevListChanged()
|
|
||||||
{
|
|
||||||
ClearDevList();
|
|
||||||
QList< HWStubDevice* > list = m_hwstub_helper.GetDevList();
|
|
||||||
foreach(HWStubDevice *dev, list)
|
|
||||||
{
|
|
||||||
QString name = QString("Bus %1 Device %2: %3").arg(dev->GetBusNumber())
|
|
||||||
.arg(dev->GetDevAddress()).arg(dev->GetTargetInfo().bName);
|
|
||||||
m_dev_selector->addItem(QIcon::fromTheme("multimedia-player"), name,
|
|
||||||
QVariant::fromValue((void *)dev));
|
|
||||||
}
|
|
||||||
if(list.size() > 0)
|
|
||||||
m_dev_selector->setCurrentIndex(0);
|
|
||||||
else
|
|
||||||
SetDataSocName("");
|
|
||||||
SetReadOnlyIndicator();
|
|
||||||
}
|
|
||||||
|
|
||||||
void RegTab::OnDevChanged(int index)
|
|
||||||
{
|
|
||||||
if(index == -1)
|
|
||||||
return;
|
|
||||||
HWStubDevice *dev = reinterpret_cast< HWStubDevice* >(m_dev_selector->itemData(index).value< void* >());
|
|
||||||
delete m_io_backend;
|
|
||||||
/* NOTE: make a copy of the HWStubDevice device because the one in the list
|
|
||||||
* might get destroyed when clearing the list while the backend is still
|
|
||||||
* active: this would result in a double free when the backend is also destroyed */
|
|
||||||
m_io_backend = m_backend->CreateHWStubIoBackend(new HWStubDevice(dev));
|
|
||||||
SetDataSocName(m_io_backend->GetSocName());
|
|
||||||
OnDataSocActivated(m_io_backend->GetSocName());
|
|
||||||
OnDataChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
void RegTab::ClearDevList()
|
|
||||||
{
|
|
||||||
while(m_dev_selector->count() > 0)
|
|
||||||
{
|
|
||||||
HWStubDevice *dev = reinterpret_cast< HWStubDevice* >(m_dev_selector->itemData(0).value< void* >());
|
|
||||||
delete dev;
|
|
||||||
m_dev_selector->removeItem(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void RegTab::FillDevSubTree(QTreeWidgetItem *_item)
|
void RegTab::FillDevSubTree(QTreeWidgetItem *_item)
|
||||||
{
|
{
|
||||||
DevTreeItem *item = dynamic_cast< DevTreeItem* >(_item);
|
DevTreeItem *item = dynamic_cast< DevTreeItem* >(_item);
|
||||||
|
|
@ -472,7 +345,6 @@ void RegTab::OnSocChanged(int index)
|
||||||
m_cur_soc = m_soc_selector->itemData(index).value< SocRef >();
|
m_cur_soc = m_soc_selector->itemData(index).value< SocRef >();
|
||||||
FillRegTree();
|
FillRegTree();
|
||||||
FillAnalyserList();
|
FillAnalyserList();
|
||||||
UpdateSocFilename();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegTab::OnReadOnlyClicked(bool checked)
|
void RegTab::OnReadOnlyClicked(bool checked)
|
||||||
|
|
@ -480,7 +352,6 @@ void RegTab::OnReadOnlyClicked(bool checked)
|
||||||
if(m_io_backend->IsReadOnly())
|
if(m_io_backend->IsReadOnly())
|
||||||
return SetReadOnlyIndicator();
|
return SetReadOnlyIndicator();
|
||||||
m_right_content->AllowWrite(!checked);
|
m_right_content->AllowWrite(!checked);
|
||||||
UpdateSocFilename();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegTab::OnDumpRegs(bool c)
|
void RegTab::OnDumpRegs(bool c)
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@
|
||||||
#include "backend.h"
|
#include "backend.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
class RegTabPanel
|
class RegTabPanel
|
||||||
{
|
{
|
||||||
|
|
@ -47,15 +48,6 @@ signals:
|
||||||
void OnModified(bool modified);
|
void OnModified(bool modified);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
enum
|
|
||||||
{
|
|
||||||
DataSelNothing,
|
|
||||||
DataSelFile,
|
|
||||||
#ifdef HAVE_HWSTUB
|
|
||||||
DataSelDevice,
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
void FillDevSubTree(QTreeWidgetItem *item);
|
void FillDevSubTree(QTreeWidgetItem *item);
|
||||||
void FillSocSubTree(QTreeWidgetItem *item);
|
void FillSocSubTree(QTreeWidgetItem *item);
|
||||||
void FillRegTree();
|
void FillRegTree();
|
||||||
|
|
@ -69,37 +61,27 @@ protected:
|
||||||
void UpdateSocFilename();
|
void UpdateSocFilename();
|
||||||
|
|
||||||
QComboBox *m_soc_selector;
|
QComboBox *m_soc_selector;
|
||||||
#ifdef HAVE_HWSTUB
|
BackendSelector *m_backend_selector;
|
||||||
QComboBox *m_dev_selector;
|
|
||||||
HWStubBackendHelper m_hwstub_helper;
|
|
||||||
#endif
|
|
||||||
Backend *m_backend;
|
Backend *m_backend;
|
||||||
QTreeWidget *m_reg_tree;
|
QTreeWidget *m_reg_tree;
|
||||||
SocRef m_cur_soc;
|
SocRef m_cur_soc;
|
||||||
QVBoxLayout *m_right_panel;
|
QVBoxLayout *m_right_panel;
|
||||||
RegTabPanel *m_right_content;
|
RegTabPanel *m_right_content;
|
||||||
QLineEdit *m_data_sel_edit;
|
|
||||||
QCheckBox *m_readonly_check;
|
QCheckBox *m_readonly_check;
|
||||||
QLabel *m_data_soc_label;
|
QLabel *m_data_soc_label;
|
||||||
QPushButton *m_data_sel_reload;
|
QPushButton *m_data_sel_reload;
|
||||||
QPushButton *m_dump;
|
QPushButton *m_dump;
|
||||||
QComboBox *m_data_selector;
|
|
||||||
IoBackend *m_io_backend;
|
IoBackend *m_io_backend;
|
||||||
QTabWidget *m_type_selector;
|
QTabWidget *m_type_selector;
|
||||||
QListWidget *m_analysers_list;
|
QListWidget *m_analysers_list;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
#ifdef HAVE_HWSTUB
|
|
||||||
void OnDevListChanged();
|
|
||||||
void OnDevChanged(int index);
|
|
||||||
void ClearDevList();
|
|
||||||
#endif
|
|
||||||
void SetReadOnlyIndicator();
|
void SetReadOnlyIndicator();
|
||||||
void OnSocChanged(int index);
|
void OnSocChanged(int index);
|
||||||
void OnSocListChanged();
|
void OnSocListChanged();
|
||||||
void OnRegItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
|
void OnRegItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
|
||||||
void OnRegItemClicked(QTreeWidgetItem *clicked, int col);
|
void OnRegItemClicked(QTreeWidgetItem *clicked, int col);
|
||||||
void OnDataSelChanged(int index);
|
void OnBackendSelect(IoBackend *backend);
|
||||||
void OnDataChanged();
|
void OnDataChanged();
|
||||||
void OnDataSocActivated(const QString&);
|
void OnDataSocActivated(const QString&);
|
||||||
void OnAnalyserChanged(QListWidgetItem *current, QListWidgetItem *previous);
|
void OnAnalyserChanged(QListWidgetItem *current, QListWidgetItem *previous);
|
||||||
|
|
|
||||||
|
|
@ -798,3 +798,140 @@ bool MySwitchableTextEditor::IsModified()
|
||||||
return false;
|
return false;
|
||||||
return m_line_mode ? m_line->isModified() : m_edit->IsModified();
|
return m_line_mode ? m_line->isModified() : m_edit->IsModified();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BackendSelector
|
||||||
|
*/
|
||||||
|
BackendSelector::BackendSelector(Backend *backend, QWidget *parent)
|
||||||
|
:QWidget(parent), m_backend(backend)
|
||||||
|
{
|
||||||
|
m_data_selector = new QComboBox;
|
||||||
|
m_data_selector->addItem(QIcon::fromTheme("text-x-generic"), "Nothing...", QVariant(DataSelNothing));
|
||||||
|
m_data_selector->addItem(QIcon::fromTheme("document-open"), "File...", QVariant(DataSelFile));
|
||||||
|
#ifdef HAVE_HWSTUB
|
||||||
|
m_data_selector->addItem(QIcon::fromTheme("multimedia-player"), "Device...", QVariant(DataSelDevice));
|
||||||
|
#endif
|
||||||
|
m_data_sel_edit = new QLineEdit;
|
||||||
|
m_data_sel_edit->setReadOnly(true);
|
||||||
|
QHBoxLayout *data_sel_layout = new QHBoxLayout(this);
|
||||||
|
data_sel_layout->addWidget(m_data_selector);
|
||||||
|
data_sel_layout->addWidget(m_data_sel_edit, 1);
|
||||||
|
data_sel_layout->addStretch(0);
|
||||||
|
#ifdef HAVE_HWSTUB
|
||||||
|
m_dev_selector = new QComboBox;
|
||||||
|
data_sel_layout->addWidget(m_dev_selector, 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
m_io_backend = m_backend->CreateDummyIoBackend();
|
||||||
|
|
||||||
|
connect(m_data_selector, SIGNAL(activated(int)),
|
||||||
|
this, SLOT(OnDataSelChanged(int)));
|
||||||
|
#ifdef HAVE_HWSTUB
|
||||||
|
connect(m_dev_selector, SIGNAL(currentIndexChanged(int)),
|
||||||
|
this, SLOT(OnDevChanged(int)));
|
||||||
|
#endif
|
||||||
|
OnDataSelChanged(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
BackendSelector::~BackendSelector()
|
||||||
|
{
|
||||||
|
#ifdef HAVE_HWSTUB
|
||||||
|
ClearDevList();
|
||||||
|
#endif
|
||||||
|
delete m_io_backend;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackendSelector::OnDataSelChanged(int index)
|
||||||
|
{
|
||||||
|
if(index == -1)
|
||||||
|
return;
|
||||||
|
QVariant var = m_data_selector->itemData(index);
|
||||||
|
if(var == DataSelFile)
|
||||||
|
{
|
||||||
|
m_data_sel_edit->show();
|
||||||
|
#ifdef HAVE_HWSTUB
|
||||||
|
m_dev_selector->hide();
|
||||||
|
#endif
|
||||||
|
QFileDialog *fd = new QFileDialog(m_data_selector);
|
||||||
|
fd->setFilter("Textual files (*.txt);;All files (*)");
|
||||||
|
fd->setDirectory(Settings::Get()->value("loaddatadir", QDir::currentPath()).toString());
|
||||||
|
if(fd->exec())
|
||||||
|
{
|
||||||
|
QStringList filenames = fd->selectedFiles();
|
||||||
|
ChangeBackend(m_backend->CreateFileIoBackend(filenames[0]));
|
||||||
|
m_data_sel_edit->setText(filenames[0]);
|
||||||
|
}
|
||||||
|
Settings::Get()->setValue("loaddatadir", fd->directory().absolutePath());
|
||||||
|
}
|
||||||
|
#ifdef HAVE_HWSTUB
|
||||||
|
else if(var == DataSelDevice)
|
||||||
|
{
|
||||||
|
m_data_sel_edit->hide();;
|
||||||
|
m_dev_selector->show();
|
||||||
|
OnDevListChanged();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_data_sel_edit->hide();
|
||||||
|
#ifdef HAVE_HWSTUB
|
||||||
|
m_dev_selector->hide();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ChangeBackend(m_backend->CreateDummyIoBackend());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_HWSTUB
|
||||||
|
void BackendSelector::OnDevListChanged()
|
||||||
|
{
|
||||||
|
ClearDevList();
|
||||||
|
QList< HWStubDevice* > list = m_hwstub_helper.GetDevList();
|
||||||
|
foreach(HWStubDevice *dev, list)
|
||||||
|
{
|
||||||
|
QString name = QString("Bus %1 Device %2: %3").arg(dev->GetBusNumber())
|
||||||
|
.arg(dev->GetDevAddress()).arg(dev->GetTargetInfo().bName);
|
||||||
|
m_dev_selector->addItem(QIcon::fromTheme("multimedia-player"), name,
|
||||||
|
QVariant::fromValue((void *)dev));
|
||||||
|
}
|
||||||
|
if(list.size() > 0)
|
||||||
|
m_dev_selector->setCurrentIndex(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackendSelector::OnDevChanged(int index)
|
||||||
|
{
|
||||||
|
if(index == -1)
|
||||||
|
return;
|
||||||
|
HWStubDevice *dev = reinterpret_cast< HWStubDevice* >(m_dev_selector->itemData(index).value< void* >());
|
||||||
|
delete m_io_backend;
|
||||||
|
/* NOTE: make a copy of the HWStubDevice device because the one in the list
|
||||||
|
* might get destroyed when clearing the list while the backend is still
|
||||||
|
* active: this would result in a double free when the backend is also destroyed */
|
||||||
|
m_io_backend = m_backend->CreateHWStubIoBackend(new HWStubDevice(dev));
|
||||||
|
emit OnSelect(m_io_backend);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackendSelector::ClearDevList()
|
||||||
|
{
|
||||||
|
while(m_dev_selector->count() > 0)
|
||||||
|
{
|
||||||
|
HWStubDevice *dev = reinterpret_cast< HWStubDevice* >(m_dev_selector->itemData(0).value< void* >());
|
||||||
|
delete dev;
|
||||||
|
m_dev_selector->removeItem(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
IoBackend *BackendSelector::GetBackend()
|
||||||
|
{
|
||||||
|
return m_io_backend;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackendSelector::ChangeBackend(IoBackend *new_backend)
|
||||||
|
{
|
||||||
|
/* WARNING: delete old backend *after* calling the signal, otherwise the old backend
|
||||||
|
* might get used after delete */
|
||||||
|
emit OnSelect(new_backend);
|
||||||
|
delete m_io_backend;
|
||||||
|
m_io_backend = new_backend;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,9 @@
|
||||||
#include <QHBoxLayout>
|
#include <QHBoxLayout>
|
||||||
#include <QItemEditorCreatorBase>
|
#include <QItemEditorCreatorBase>
|
||||||
#include <QStyledItemDelegate>
|
#include <QStyledItemDelegate>
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include "settings.h"
|
||||||
#include "backend.h"
|
#include "backend.h"
|
||||||
|
|
||||||
class SocBitRangeValidator : public QValidator
|
class SocBitRangeValidator : public QValidator
|
||||||
|
|
@ -274,4 +277,44 @@ protected:
|
||||||
QLineEdit *m_line;
|
QLineEdit *m_line;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class BackendSelector : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
BackendSelector(Backend *backend, QWidget *parent = 0);
|
||||||
|
virtual ~BackendSelector();
|
||||||
|
IoBackend *GetBackend();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void OnSelect(IoBackend *backend);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
DataSelNothing,
|
||||||
|
DataSelFile,
|
||||||
|
#ifdef HAVE_HWSTUB
|
||||||
|
DataSelDevice,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
Backend *m_backend;
|
||||||
|
IoBackend *m_io_backend;
|
||||||
|
QComboBox *m_data_selector;
|
||||||
|
QLineEdit *m_data_sel_edit;
|
||||||
|
#ifdef HAVE_HWSTUB
|
||||||
|
QComboBox *m_dev_selector;
|
||||||
|
HWStubBackendHelper m_hwstub_helper;
|
||||||
|
#endif
|
||||||
|
void ChangeBackend(IoBackend *new_backend);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
#ifdef HAVE_HWSTUB
|
||||||
|
void OnDevListChanged();
|
||||||
|
void OnDevChanged(int index);
|
||||||
|
void ClearDevList();
|
||||||
|
#endif
|
||||||
|
void OnDataSelChanged(int index);
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* AUX_H */
|
#endif /* AUX_H */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue