summaryrefslogtreecommitdiff
path: root/utils/regtools/qeditor/utils.cpp
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2014-09-18 19:02:54 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2014-09-19 10:57:32 +0200
commita01bf8d93c2289c50fa4f24c15f6255e942ee82b (patch)
tree73ddff5d20ee2dc6c198ac4ce80295303c1f42b1 /utils/regtools/qeditor/utils.cpp
parentb2ef4a806bd5f8f81917a7c93d210cee123191af (diff)
downloadrockbox-a01bf8d93c2289c50fa4f24c15f6255e942ee82b.zip
rockbox-a01bf8d93c2289c50fa4f24c15f6255e942ee82b.tar.gz
rockbox-a01bf8d93c2289c50fa4f24c15f6255e942ee82b.tar.bz2
rockbox-a01bf8d93c2289c50fa4f24c15f6255e942ee82b.tar.xz
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>
Diffstat (limited to 'utils/regtools/qeditor/utils.cpp')
-rw-r--r--utils/regtools/qeditor/utils.cpp137
1 files changed, 137 insertions, 0 deletions
diff --git a/utils/regtools/qeditor/utils.cpp b/utils/regtools/qeditor/utils.cpp
index 1662169..0719eec 100644
--- a/utils/regtools/qeditor/utils.cpp
+++ b/utils/regtools/qeditor/utils.cpp
@@ -798,3 +798,140 @@ bool MySwitchableTextEditor::IsModified()
return false;
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;
+}