diff --git a/client/ostinato.pro b/client/ostinato.pro
index 0005b77..e8707c6 100644
--- a/client/ostinato.pro
+++ b/client/ostinato.pro
@@ -65,6 +65,7 @@ HEADERS += \
streamstatsfiltermodel.h \
streamstatsmodel.h \
streamstatswindow.h \
+ streamswidget.h \
variablefieldswidget.h \
xtableview.h
@@ -116,6 +117,7 @@ SOURCES += \
streammodel.cpp \
streamstatsmodel.cpp \
streamstatswindow.cpp \
+ streamswidget.cpp \
variablefieldswidget.cpp
diff --git a/client/portswindow.cpp b/client/portswindow.cpp
index b5ca9ea..92cf6bf 100644
--- a/client/portswindow.cpp
+++ b/client/portswindow.cpp
@@ -20,52 +20,35 @@ along with this program. If not, see
#include "portswindow.h"
#include "applymsg.h"
-#include "clipboardhelper.h"
#include "deviceswidget.h"
-#include "portconfigdialog.h"
-#include "settings.h"
-#include "streamconfigdialog.h"
-#include "streamfileformat.h"
-#include "streamlistdelegate.h"
-
#include "fileformat.pb.h"
+#include "portconfigdialog.h"
+#include "portgrouplist.h"
+#include "settings.h"
+#include "streamswidget.h"
-#include "xqlocale.h"
-
-#include
#include
-#include
#include
#include
+#include
#include
-extern ClipboardHelper *clipboardHelper;
extern QMainWindow *mainWindow;
PortsWindow::PortsWindow(PortGroupList *pgl, QWidget *parent)
: QWidget(parent), proxyPortModel(NULL)
{
- QAction *sep;
-
- delegate = new StreamListDelegate;
proxyPortModel = new QSortFilterProxyModel(this);
- //slm = new StreamListModel();
- //plm = new PortGroupList();
plm = pgl;
- Ui::PortsWindow::setupUi(this);
- Ui::StreamsWidget::setupUi(streamsWidget);
+ setupUi(this);
applyMsg_ = new ApplyMessage();
+ streamsWidget->setPortGroupList(plm);
devicesWidget->setPortGroupList(plm);
tvPortList->header()->hide();
- tvStreamList->setItemDelegate(delegate);
-
- tvStreamList->verticalHeader()->setDefaultSectionSize(
- tvStreamList->verticalHeader()->minimumSectionSize());
-
// Populate PortList Context Menu Actions
tvPortList->addAction(actionNew_Port_Group);
tvPortList->addAction(actionDelete_Port_Group);
@@ -75,41 +58,18 @@ PortsWindow::PortsWindow(PortGroupList *pgl, QWidget *parent)
tvPortList->addAction(actionExclusive_Control);
tvPortList->addAction(actionPort_Configuration);
- // Populate StreamList Context Menu Actions
- tvStreamList->addAction(actionNew_Stream);
- tvStreamList->addAction(actionEdit_Stream);
- tvStreamList->addAction(actionDuplicate_Stream);
- tvStreamList->addAction(actionDelete_Stream);
-
- QAction *sep2 = new QAction(this);
- sep2->setSeparator(true);
- tvStreamList->addAction(sep2);
-
- tvStreamList->addAction(actionOpen_Streams);
- tvStreamList->addAction(actionSave_Streams);
-
// PortList, StreamList, DeviceWidget actions combined
// make this window's actions
addActions(tvPortList->actions());
- sep = new QAction(this);
+ QAction *sep = new QAction(this);
sep->setSeparator(true);
addAction(sep);
- addActions(tvStreamList->actions());
+ addActions(streamsWidget->actions());
sep = new QAction(this);
sep->setSeparator(true);
addAction(sep);
addActions(devicesWidget->actions());
- // Add the clipboard actions to the context menu of streamList
- // but not to PortsWindow's actions since they are already available
- // in the global Edit Menu
- sep = new QAction("Clipboard", this);
- sep->setSeparator(true);
- tvStreamList->insertAction(sep2, sep);
- tvStreamList->insertActions(sep2, clipboardHelper->actions());
-
- tvStreamList->setModel(plm->getStreamModel());
-
// XXX: It would be ideal if we only needed to do the below to
// get the proxy model to do its magic. However, the QModelIndex
// used by the source model and the proxy model are different
@@ -139,52 +99,20 @@ PortsWindow::PortsWindow(PortGroupList *pgl, QWidget *parent)
SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)),
this, SLOT(when_portView_currentChanged(const QModelIndex&,
const QModelIndex&)));
+ connect(this,
+ SIGNAL(currentPortChanged(const QModelIndex&, const QModelIndex&)),
+ streamsWidget, SLOT(setCurrentPortIndex(const QModelIndex&)));
connect(this,
SIGNAL(currentPortChanged(const QModelIndex&, const QModelIndex&)),
devicesWidget, SLOT(setCurrentPortIndex(const QModelIndex&)));
- connect(plm->getStreamModel(), SIGNAL(rowsInserted(QModelIndex, int, int)),
- SLOT(updateStreamViewActions()));
- connect(plm->getStreamModel(), SIGNAL(rowsRemoved(QModelIndex, int, int)),
- SLOT(updateStreamViewActions()));
-
- connect(tvStreamList->selectionModel(),
- SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)),
- SLOT(updateStreamViewActions()));
- connect(tvStreamList->selectionModel(),
- SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
- SLOT(updateStreamViewActions()));
-
- tvStreamList->resizeColumnToContents(StreamModel::StreamIcon);
- tvStreamList->resizeColumnToContents(StreamModel::StreamStatus);
-
// Initially we don't have any ports/streams/devices
// - so send signal triggers
when_portView_currentChanged(QModelIndex(), QModelIndex());
- updateStreamViewActions();
-
- connect(plm->getStreamModel(),
- SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)),
- this, SLOT(streamModelDataChanged()));
- connect(plm->getStreamModel(),
- SIGNAL(modelReset()),
- this, SLOT(streamModelDataChanged()));
-}
-
-void PortsWindow::streamModelDataChanged()
-{
- QModelIndex current = tvPortList->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- if (plm->isPort(current))
- plm->port(current).recalculateAverageRates();
}
PortsWindow::~PortsWindow()
{
- delete delegate;
delete proxyPortModel;
delete applyMsg_;
}
@@ -322,30 +250,6 @@ void PortsWindow::showMyReservedPortsOnly(bool enabled)
proxyPortModel->setFilterRegExp(QRegExp(""));
}
-void PortsWindow::on_tvStreamList_activated(const QModelIndex & index)
-{
- if (!index.isValid())
- {
- qDebug("%s: invalid index", __FUNCTION__);
- return;
- }
-
- qDebug("stream list activated\n");
-
- Port &curPort = plm->port(proxyPortModel ?
- proxyPortModel->mapToSource(tvPortList->currentIndex()) :
- tvPortList->currentIndex());
-
- QList streams;
- streams.append(curPort.mutableStreamByIndex(index.row(), false));
-
- StreamConfigDialog scd(streams, curPort, this);
- if (scd.exec() == QDialog::Accepted) {
- curPort.recalculateAverageRates();
- curPort.setLocalConfigChanged(true);
- }
-}
-
void PortsWindow::when_portView_currentChanged(const QModelIndex& currentIndex,
const QModelIndex& previousIndex)
{
@@ -357,16 +261,12 @@ void PortsWindow::when_portView_currentChanged(const QModelIndex& currentIndex,
previous = proxyPortModel->mapToSource(previous);
}
- plm->getStreamModel()->setCurrentPortIndex(current);
updatePortViewActions(currentIndex);
- updateStreamViewActions();
qDebug("In %s", __FUNCTION__);
if (previous.isValid() && plm->isPort(previous))
{
- disconnect(&(plm->port(previous)), SIGNAL(portRateChanged(int, int)),
- this, SLOT(updatePortRates()));
disconnect(&(plm->port(previous)),
SIGNAL(localConfigChanged(int, int, bool)),
this,
@@ -387,9 +287,6 @@ void PortsWindow::when_portView_currentChanged(const QModelIndex& currentIndex,
else if (plm->isPort(current))
{
swDetail->setCurrentIndex(2); // port detail page
- updatePortRates();
- connect(&(plm->port(current)), SIGNAL(portRateChanged(int, int)),
- SLOT(updatePortRates()));
connect(&(plm->port(current)),
SIGNAL(localConfigChanged(int, int, bool)),
SLOT(updateApplyHint(int, int, bool)));
@@ -447,139 +344,6 @@ void PortsWindow::when_portModel_reset()
when_portView_currentChanged(QModelIndex(), tvPortList->currentIndex());
}
-void PortsWindow::on_startTx_clicked()
-{
- QModelIndex current = tvPortList->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- Q_ASSERT(plm->isPort(current));
-
- QModelIndex curPortGroup = plm->getPortModel()->parent(current);
- Q_ASSERT(curPortGroup.isValid());
- Q_ASSERT(plm->isPortGroup(curPortGroup));
-
- QList portList({plm->port(current).id()});
- plm->portGroup(curPortGroup).startTx(&portList);
-}
-
-void PortsWindow::on_stopTx_clicked()
-{
- QModelIndex current = tvPortList->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- Q_ASSERT(plm->isPort(current));
-
- QModelIndex curPortGroup = plm->getPortModel()->parent(current);
- Q_ASSERT(curPortGroup.isValid());
- Q_ASSERT(plm->isPortGroup(curPortGroup));
-
- QList portList({plm->port(current).id()});
- plm->portGroup(curPortGroup).stopTx(&portList);
-}
-
-void PortsWindow::on_averagePacketsPerSec_editingFinished()
-{
- QModelIndex current = tvPortList->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- Q_ASSERT(plm->isPort(current));
-
- bool isOk;
- double pps = XLocale().toDouble(averagePacketsPerSec->text(), &isOk);
-
- plm->port(current).setAveragePacketRate(pps);
-}
-
-void PortsWindow::on_averageBitsPerSec_editingFinished()
-{
- QModelIndex current = tvPortList->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- Q_ASSERT(plm->isPort(current));
-
- bool isOk;
- double bps = XLocale().toDouble(averageBitsPerSec->text(), &isOk);
-
- plm->port(current).setAverageBitRate(bps);
-}
-
-void PortsWindow::updatePortRates()
-{
- QModelIndex current = tvPortList->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- if (!current.isValid())
- return;
-
- if (!plm->isPort(current))
- return;
-
- averagePacketsPerSec->setText(QString("%L1")
- .arg(plm->port(current).averagePacketRate(), 0, 'f', 4));
- averageBitsPerSec->setText(QString("%L1")
- .arg(plm->port(current).averageBitRate(), 0, 'f', 0));
-}
-
-void PortsWindow::updateStreamViewActions()
-{
- QModelIndex current = tvPortList->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- // For some reason hasSelection() returns true even if selection size is 0
- // so additional check for size introduced
- if (tvStreamList->selectionModel()->hasSelection() &&
- (tvStreamList->selectionModel()->selection().size() > 0))
- {
- qDebug("Has selection %d",
- tvStreamList->selectionModel()->selection().size());
-
- // If more than one non-contiguous ranges selected,
- // disable "New" and "Edit"
- if (tvStreamList->selectionModel()->selection().size() > 1)
- {
- actionNew_Stream->setDisabled(true);
- actionEdit_Stream->setDisabled(true);
- }
- else
- {
- actionNew_Stream->setEnabled(true);
- actionEdit_Stream->setEnabled(true);
- }
-
- // Duplicate/Delete are always enabled as long as we have a selection
- actionDuplicate_Stream->setEnabled(true);
- actionDelete_Stream->setEnabled(true);
- }
- else
- {
- qDebug("No selection");
- if (plm->isPort(current))
- actionNew_Stream->setEnabled(true);
- else
- actionNew_Stream->setDisabled(true);
- actionEdit_Stream->setDisabled(true);
- actionDuplicate_Stream->setDisabled(true);
- actionDelete_Stream->setDisabled(true);
- }
- actionOpen_Streams->setEnabled(plm->isPort(current));
- actionSave_Streams->setEnabled(tvStreamList->model()->rowCount() > 0);
-
- startTx->setEnabled(tvStreamList->model()->rowCount() > 0);
- stopTx->setEnabled(tvStreamList->model()->rowCount() > 0);
-}
-
void PortsWindow::updateApplyHint(int /*portGroupId*/, int /*portId*/,
bool configChanged)
{
@@ -587,7 +351,7 @@ void PortsWindow::updateApplyHint(int /*portGroupId*/, int /*portId*/,
applyHint->setText("Configuration has changed - "
"click Apply "
"to activate the changes");
- else if (tvStreamList->model()->rowCount() > 0)
+ else if (plm->getStreamModel()->rowCount() > 0)
applyHint->setText("Configuration activated - "
"click
"
"to transmit packets");
@@ -839,259 +603,3 @@ void PortsWindow::on_actionPort_Configuration_triggered()
if (dialog.exec() == QDialog::Accepted)
plm->portGroup(current.parent()).modifyPort(current.row(), config);
}
-
-void PortsWindow::on_actionNew_Stream_triggered()
-{
- qDebug("New Stream Action");
-
- QItemSelectionModel* selectionModel = tvStreamList->selectionModel();
- if (selectionModel->selection().size() > 1) {
- qDebug("%s: Unexpected selection size %d, can't add", __FUNCTION__,
- selectionModel->selection().size());
- return;
- }
-
- // In case nothing is selected, insert 1 row at the end
- StreamModel *streamModel = plm->getStreamModel();
- int row = streamModel->rowCount(), count = 1;
-
- // In case we have a single range selected; insert as many rows as
- // in the singe selected range before the top of the selected range
- if (selectionModel->selection().size() == 1)
- {
- row = selectionModel->selection().at(0).top();
- count = selectionModel->selection().at(0).height();
- }
-
- Port &curPort = plm->port(proxyPortModel ?
- proxyPortModel->mapToSource(tvPortList->currentIndex()) :
- tvPortList->currentIndex());
-
- QList streams;
- for (int i = 0; i < count; i++)
- streams.append(new Stream);
-
- StreamConfigDialog scd(streams, curPort, this);
- scd.setWindowTitle(tr("Add Stream"));
- if (scd.exec() == QDialog::Accepted)
- streamModel->insert(row, streams);
-}
-
-void PortsWindow::on_actionEdit_Stream_triggered()
-{
- qDebug("Edit Stream Action");
-
- QItemSelectionModel* streamModel = tvStreamList->selectionModel();
- if (!streamModel->hasSelection())
- return;
-
- Port &curPort = plm->port(proxyPortModel ?
- proxyPortModel->mapToSource(tvPortList->currentIndex()) :
- tvPortList->currentIndex());
-
- QList streams;
- foreach(QModelIndex index, streamModel->selectedRows())
- streams.append(curPort.mutableStreamByIndex(index.row(), false));
-
- StreamConfigDialog scd(streams, curPort, this);
- if (scd.exec() == QDialog::Accepted) {
- curPort.recalculateAverageRates();
- curPort.setLocalConfigChanged(true);
- }
-}
-
-void PortsWindow::on_actionDuplicate_Stream_triggered()
-{
- QItemSelectionModel* model = tvStreamList->selectionModel();
- QModelIndex current = tvPortList->selectionModel()->currentIndex();
-
- qDebug("Duplicate Stream Action");
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- if (model->hasSelection())
- {
- bool isOk;
- int count = QInputDialog::getInt(this, "Duplicate Streams",
- "Count", 1, 1, 9999, 1, &isOk);
-
- if (!isOk)
- return;
-
- QList list;
- foreach(QModelIndex index, model->selectedRows())
- list.append(index.row());
- plm->port(current).duplicateStreams(list, count);
- }
- else
- qDebug("No selection");
-}
-
-void PortsWindow::on_actionDelete_Stream_triggered()
-{
- qDebug("Delete Stream Action");
-
- QModelIndex index;
-
- if (tvStreamList->selectionModel()->hasSelection())
- {
- qDebug("SelectedIndexes %d",
- tvStreamList->selectionModel()->selectedRows().size());
- while(tvStreamList->selectionModel()->selectedRows().size())
- {
- index = tvStreamList->selectionModel()->selectedRows().at(0);
- plm->getStreamModel()->removeRows(index.row(), 1);
- }
- }
- else
- qDebug("No selection");
-}
-
-void PortsWindow::on_actionOpen_Streams_triggered()
-{
- qDebug("Open Streams Action");
-
- QStringList fileTypes = StreamFileFormat::supportedFileTypes(
- StreamFileFormat::kOpenFile);
- QString fileType;
- QModelIndex current = tvPortList->selectionModel()->currentIndex();
- static QString dirName;
- QString fileName;
- QString errorStr;
- bool append = true;
- bool ret;
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- Q_ASSERT(plm->isPort(current));
-
- if (fileTypes.size())
- fileType = fileTypes.at(0);
-
- fileName = QFileDialog::getOpenFileName(this, tr("Open Streams"),
- dirName, fileTypes.join(";;"), &fileType);
- if (fileName.isEmpty())
- goto _exit;
-
- if (tvStreamList->model()->rowCount())
- {
- QMessageBox msgBox(QMessageBox::Question, qApp->applicationName(),
- tr("Append to existing streams? Or overwrite?"),
- QMessageBox::NoButton, this);
- QPushButton *appendBtn = msgBox.addButton(tr("Append"),
- QMessageBox::ActionRole);
- QPushButton *overwriteBtn = msgBox.addButton(tr("Overwrite"),
- QMessageBox::ActionRole);
- QPushButton *cancelBtn = msgBox.addButton(QMessageBox::Cancel);
-
- msgBox.exec();
-
- if (msgBox.clickedButton() == cancelBtn)
- goto _exit;
- else if (msgBox.clickedButton() == appendBtn)
- append = true;
- else if (msgBox.clickedButton() == overwriteBtn)
- append = false;
- else
- Q_ASSERT(false);
- }
-
- ret = plm->port(current).openStreams(fileName, append, errorStr);
- if (!ret || !errorStr.isEmpty())
- {
- QMessageBox msgBox(this);
- QStringList str = errorStr.split("\n\n\n\n");
-
- msgBox.setIcon(ret ? QMessageBox::Warning : QMessageBox::Critical);
- msgBox.setWindowTitle(qApp->applicationName());
- msgBox.setText(str.at(0));
- if (str.size() > 1)
- msgBox.setDetailedText(str.at(1));
- msgBox.setStandardButtons(QMessageBox::Ok);
-
- msgBox.exec();
- }
- dirName = QFileInfo(fileName).absolutePath();
- updateStreamViewActions();
-
-_exit:
- return;
-}
-
-void PortsWindow::on_actionSave_Streams_triggered()
-{
- qDebug("Save Streams Action");
-
- QModelIndex current = tvPortList->selectionModel()->currentIndex();
- static QString fileName;
- QStringList fileTypes = StreamFileFormat::supportedFileTypes(
- StreamFileFormat::kSaveFile);
- QString fileType;
- QString errorStr;
- QFileDialog::Options options;
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- // On Mac OS with Native Dialog, getSaveFileName() ignores fileType
- // which we need
-#if defined(Q_OS_MAC)
- options |= QFileDialog::DontUseNativeDialog;
-#endif
-
- if (fileTypes.size())
- fileType = fileTypes.at(0);
-
- Q_ASSERT(plm->isPort(current));
-
-_retry:
- fileName = QFileDialog::getSaveFileName(this, tr("Save Streams"),
- fileName, fileTypes.join(";;"), &fileType, options);
- if (fileName.isEmpty())
- goto _exit;
-
- if (QFileInfo(fileName).suffix().isEmpty()) {
- QString fileExt = fileType.section(QRegExp("[\\*\\)]"), 1, 1);
- qDebug("Adding extension '%s' to '%s'",
- qPrintable(fileExt), qPrintable(fileName));
- fileName.append(fileExt);
- if (QFileInfo(fileName).exists()) {
- if (QMessageBox::warning(this, tr("Overwrite File?"),
- QString("The file \"%1\" already exists.\n\n"
- "Do you wish to overwrite it?")
- .arg(QFileInfo(fileName).fileName()),
- QMessageBox::Yes|QMessageBox::No,
- QMessageBox::No) != QMessageBox::Yes)
- goto _retry;
- }
- }
-
- fileType = fileType.remove(QRegExp("\\(.*\\)")).trimmed();
- if (!fileType.startsWith("Ostinato")
- && !fileType.startsWith("Python"))
- {
- if (QMessageBox::warning(this, tr("Ostinato"),
- QString("You have chosen to save in %1 format. All stream "
- "attributes may not be saved in this format.\n\n"
- "It is recommended to save in native Ostinato format.\n\n"
- "Continue to save in %2 format?").arg(fileType).arg(fileType),
- QMessageBox::Yes|QMessageBox::No,
- QMessageBox::No) != QMessageBox::Yes)
- goto _retry;
- }
-
- // TODO: all or selected?
-
- if (!plm->port(current).saveStreams(fileName, fileType, errorStr))
- QMessageBox::critical(this, qApp->applicationName(), errorStr);
- else if (!errorStr.isEmpty())
- QMessageBox::warning(this, qApp->applicationName(), errorStr);
-
- fileName = QFileInfo(fileName).absolutePath();
-_exit:
- return;
-}
-
-
diff --git a/client/portswindow.h b/client/portswindow.h
index 92aa85c..17afb39 100644
--- a/client/portswindow.h
+++ b/client/portswindow.h
@@ -20,14 +20,12 @@ along with this program. If not, see
#ifndef _PORTS_WINDOW_H
#define _PORTS_WINDOW_H
-#include
-#include
#include "ui_portswindow.h"
-#include "ui_streamswidget.h"
-#include "portgrouplist.h"
+#include
class ApplyMessage;
-class QAbstractItemDelegate;
+class PortGroupList;
+
class QProgressDialog;
class QSortFilterProxyModel;
@@ -35,13 +33,10 @@ namespace OstProto {
class SessionContent;
}
-class PortsWindow : public QWidget, private Ui::PortsWindow, private Ui::StreamsWidget
+class PortsWindow : public QWidget, private Ui::PortsWindow
{
Q_OBJECT
- //QAbstractItemModel *slm; // stream list model
- PortGroupList *plm;
-
public:
PortsWindow(PortGroupList *pgl, QWidget *parent = 0);
~PortsWindow();
@@ -59,12 +54,6 @@ signals:
void currentPortChanged(const QModelIndex ¤t,
const QModelIndex &previous);
-private:
- QString lastNewPortGroup;
- QAbstractItemDelegate *delegate;
- QSortFilterProxyModel *proxyPortModel;
- ApplyMessage *applyMsg_;
-
public slots:
void clearCurrentSelection();
void showMyReservedPortsOnly(bool enabled);
@@ -72,14 +61,7 @@ public slots:
private slots:
void updateApplyHint(int portGroupId, int portId, bool configChanged);
void updatePortViewActions(const QModelIndex& currentIndex);
- void updateStreamViewActions();
- void on_startTx_clicked();
- void on_stopTx_clicked();
- void on_averagePacketsPerSec_editingFinished();
- void on_averageBitsPerSec_editingFinished();
- void updatePortRates();
- void on_tvStreamList_activated(const QModelIndex & index);
void when_portView_currentChanged(const QModelIndex& currentIndex,
const QModelIndex& previousIndex);
void when_portModel_dataChanged(const QModelIndex& topLeft,
@@ -96,15 +78,11 @@ private slots:
void on_actionExclusive_Control_triggered(bool checked);
void on_actionPort_Configuration_triggered();
- void on_actionNew_Stream_triggered();
- void on_actionEdit_Stream_triggered();
- void on_actionDuplicate_Stream_triggered();
- void on_actionDelete_Stream_triggered();
-
- void on_actionOpen_Streams_triggered();
- void on_actionSave_Streams_triggered();
-
- void streamModelDataChanged();
+private:
+ PortGroupList *plm;
+ QString lastNewPortGroup;
+ QSortFilterProxyModel *proxyPortModel;
+ ApplyMessage *applyMsg_;
};
#endif
diff --git a/client/portswindow.ui b/client/portswindow.ui
index e0611d0..56acde1 100644
--- a/client/portswindow.ui
+++ b/client/portswindow.ui
@@ -213,7 +213,7 @@
-
-
+
@@ -297,6 +297,12 @@
QTreeView
+
+ StreamsWidget
+ QWidget
+
+ 1
+
diff --git a/client/streamswidget.cpp b/client/streamswidget.cpp
index 307a379..c783020 100644
--- a/client/streamswidget.cpp
+++ b/client/streamswidget.cpp
@@ -17,64 +17,32 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see
*/
-#include "portswindow.h"
+#include "streamswidget.h"
-#include "applymsg.h"
#include "clipboardhelper.h"
-#include "deviceswidget.h"
-#include "portconfigdialog.h"
-#include "settings.h"
+#include "portgrouplist.h"
#include "streamconfigdialog.h"
#include "streamfileformat.h"
#include "streamlistdelegate.h"
-
-#include "fileformat.pb.h"
-
#include "xqlocale.h"
-#include
#include
#include
-#include
#include
-#include
extern ClipboardHelper *clipboardHelper;
-extern QMainWindow *mainWindow;
-PortsWindow::PortsWindow(PortGroupList *pgl, QWidget *parent)
- : QWidget(parent), proxyPortModel(NULL)
+StreamsWidget::StreamsWidget(QWidget *parent)
+ : QWidget(parent)
{
- QAction *sep;
+ setupUi(this);
delegate = new StreamListDelegate;
- proxyPortModel = new QSortFilterProxyModel(this);
-
- //slm = new StreamListModel();
- //plm = new PortGroupList();
- plm = pgl;
-
- Ui::PortsWindow::setupUi(this);
- Ui::StreamsWidget::setupUi(streamsWidget);
- applyMsg_ = new ApplyMessage();
- devicesWidget->setPortGroupList(plm);
-
- tvPortList->header()->hide();
-
tvStreamList->setItemDelegate(delegate);
tvStreamList->verticalHeader()->setDefaultSectionSize(
tvStreamList->verticalHeader()->minimumSectionSize());
- // Populate PortList Context Menu Actions
- tvPortList->addAction(actionNew_Port_Group);
- tvPortList->addAction(actionDelete_Port_Group);
- tvPortList->addAction(actionConnect_Port_Group);
- tvPortList->addAction(actionDisconnect_Port_Group);
-
- tvPortList->addAction(actionExclusive_Control);
- tvPortList->addAction(actionPort_Configuration);
-
// Populate StreamList Context Menu Actions
tvStreamList->addAction(actionNew_Stream);
tvStreamList->addAction(actionEdit_Stream);
@@ -88,61 +56,24 @@ PortsWindow::PortsWindow(PortGroupList *pgl, QWidget *parent)
tvStreamList->addAction(actionOpen_Streams);
tvStreamList->addAction(actionSave_Streams);
- // PortList, StreamList, DeviceWidget actions combined
- // make this window's actions
- addActions(tvPortList->actions());
- sep = new QAction(this);
- sep->setSeparator(true);
- addAction(sep);
+ // StreamWidget's actions is an aggegate of all sub-widget's actions
addActions(tvStreamList->actions());
- sep = new QAction(this);
- sep->setSeparator(true);
- addAction(sep);
- addActions(devicesWidget->actions());
// Add the clipboard actions to the context menu of streamList
- // but not to PortsWindow's actions since they are already available
+ // but not to StreamsWidget's actions since they are already available
// in the global Edit Menu
- sep = new QAction("Clipboard", this);
- sep->setSeparator(true);
- tvStreamList->insertAction(sep2, sep);
+ QAction *sep3 = new QAction("Clipboard", this);
+ sep3->setSeparator(true);
+ tvStreamList->insertAction(sep2, sep3);
tvStreamList->insertActions(sep2, clipboardHelper->actions());
+}
+
+void StreamsWidget::setPortGroupList(PortGroupList *portGroups)
+{
+ plm = portGroups;
tvStreamList->setModel(plm->getStreamModel());
- // XXX: It would be ideal if we only needed to do the below to
- // get the proxy model to do its magic. However, the QModelIndex
- // used by the source model and the proxy model are different
- // i.e. the row, column, internalId/internalPtr used by both
- // will be different. Since our domain objects - PortGroupList,
- // PortGroup, Port etc. use these attributes, we need to map the
- // proxy's index to the source's index before invoking any domain
- // object methods
- // TODO: research if we can skip the mapping when the domain
- // objects' design is reviewed
- if (proxyPortModel) {
- proxyPortModel->setSourceModel(plm->getPortModel());
- tvPortList->setModel(proxyPortModel);
- }
- else
- tvPortList->setModel(plm->getPortModel());
-
- connect( plm->getPortModel(),
- SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)),
- this, SLOT(when_portModel_dataChanged(const QModelIndex&,
- const QModelIndex&)));
-
- connect(plm->getPortModel(), SIGNAL(modelReset()),
- SLOT(when_portModel_reset()));
-
- connect( tvPortList->selectionModel(),
- SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)),
- this, SLOT(when_portView_currentChanged(const QModelIndex&,
- const QModelIndex&)));
- connect(this,
- SIGNAL(currentPortChanged(const QModelIndex&, const QModelIndex&)),
- devicesWidget, SLOT(setCurrentPortIndex(const QModelIndex&)));
-
connect(plm->getStreamModel(), SIGNAL(rowsInserted(QModelIndex, int, int)),
SLOT(updateStreamViewActions()));
connect(plm->getStreamModel(), SIGNAL(rowsRemoved(QModelIndex, int, int)),
@@ -158,9 +89,6 @@ PortsWindow::PortsWindow(PortGroupList *pgl, QWidget *parent)
tvStreamList->resizeColumnToContents(StreamModel::StreamIcon);
tvStreamList->resizeColumnToContents(StreamModel::StreamStatus);
- // Initially we don't have any ports/streams/devices
- // - so send signal triggers
- when_portView_currentChanged(QModelIndex(), QModelIndex());
updateStreamViewActions();
connect(plm->getStreamModel(),
@@ -171,158 +99,18 @@ PortsWindow::PortsWindow(PortGroupList *pgl, QWidget *parent)
this, SLOT(streamModelDataChanged()));
}
-void PortsWindow::streamModelDataChanged()
+void StreamsWidget::streamModelDataChanged()
{
- QModelIndex current = tvPortList->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- if (plm->isPort(current))
- plm->port(current).recalculateAverageRates();
+ if (plm->isPort(currentPortIndex_))
+ plm->port(currentPortIndex_).recalculateAverageRates();
}
-PortsWindow::~PortsWindow()
+StreamsWidget::~StreamsWidget()
{
delete delegate;
- delete proxyPortModel;
- delete applyMsg_;
}
-int PortsWindow::portGroupCount()
-{
- return plm->numPortGroups();
-}
-
-int PortsWindow::reservedPortCount()
-{
- int count = 0;
- int n = portGroupCount();
-
- for (int i = 0; i < n; i++)
- count += plm->portGroupByIndex(i).numReservedPorts();
-
- return count;
-}
-
-//! Always return true
-bool PortsWindow::openSession(
- const OstProto::SessionContent *session,
- QString & /*error*/)
-{
- QProgressDialog progress("Opening Session", NULL,
- 0, session->port_groups_size(), mainWindow);
- progress.show();
- progress.setEnabled(true); // since parent (mainWindow) is disabled
-
- plm->removeAllPortGroups();
-
- for (int i = 0; i < session->port_groups_size(); i++) {
- const OstProto::PortGroupContent &pgc = session->port_groups(i);
- PortGroup *pg = new PortGroup(QString::fromStdString(
- pgc.server_name()),
- quint16(pgc.server_port()));
- pg->setConfigAtConnect(&pgc);
- plm->addPortGroup(*pg);
- progress.setValue(i+1);
- }
-
- return true;
-}
-
-/*!
- * Prepare content to be saved for a session
- *
- * If port reservation is in use, saves only 'my' reserved ports
- *
- * Returns false, if user cancels op; true, otherwise
- */
-bool PortsWindow::saveSession(
- OstProto::SessionContent *session, // OUT param
- QString & /*error*/,
- QProgressDialog *progress)
-{
- int n = portGroupCount();
- QString myself;
-
- if (progress) {
- progress->setLabelText("Preparing Ports and PortGroups ...");
- progress->setRange(0, n);
- }
-
- if (reservedPortCount())
- myself = appSettings->value(kUserKey, kUserDefaultValue).toString();
-
- for (int i = 0; i < n; i++)
- {
- PortGroup &pg = plm->portGroupByIndex(i);
- OstProto::PortGroupContent *pgc = session->add_port_groups();
-
- pgc->set_server_name(pg.serverName().toStdString());
- pgc->set_server_port(pg.serverPort());
-
- for (int j = 0; j < pg.numPorts(); j++)
- {
- if (myself != pg.mPorts.at(j)->userName())
- continue;
-
- OstProto::PortContent *pc = pgc->add_ports();
- OstProto::Port *p = pc->mutable_port_config();
-
- // XXX: We save the entire OstProto::Port even though some
- // fields may be ephemeral; while opening we use only relevant
- // fields
- pg.mPorts.at(j)->protoDataCopyInto(p);
-
- for (int k = 0; k < pg.mPorts.at(j)->numStreams(); k++)
- {
- OstProto::Stream *s = pc->add_streams();
- pg.mPorts.at(j)->streamByIndex(k)->protoDataCopyInto(*s);
- }
-
- for (int k = 0; k < pg.mPorts.at(j)->numDeviceGroups(); k++)
- {
- OstProto::DeviceGroup *dg = pc->add_device_groups();
- dg->CopyFrom(*(pg.mPorts.at(j)->deviceGroupByIndex(k)));
- }
- }
-
- if (progress) {
- if (progress->wasCanceled())
- return false;
- progress->setValue(i);
- }
- if (i % 2 == 0)
- qApp->processEvents();
- }
-
- return true;
-}
-
-void PortsWindow::clearCurrentSelection()
-{
- tvPortList->selectionModel()->clearCurrentIndex();
- tvPortList->clearSelection();
-}
-
-void PortsWindow::showMyReservedPortsOnly(bool enabled)
-{
- if (!proxyPortModel)
- return;
-
- if (enabled) {
- QString rx = "Port Group|\\["
- + QRegExp::escape(appSettings->value(kUserKey,
- kUserDefaultValue).toString())
- + "\\]";
- qDebug("%s: regexp: <%s>", __FUNCTION__, qPrintable(rx));
- proxyPortModel->setFilterRegExp(QRegExp(rx));
- }
- else
- proxyPortModel->setFilterRegExp(QRegExp(""));
-}
-
-void PortsWindow::on_tvStreamList_activated(const QModelIndex & index)
+void StreamsWidget::on_tvStreamList_activated(const QModelIndex & index)
{
if (!index.isValid())
{
@@ -332,9 +120,7 @@ void PortsWindow::on_tvStreamList_activated(const QModelIndex & index)
qDebug("stream list activated\n");
- Port &curPort = plm->port(proxyPortModel ?
- proxyPortModel->mapToSource(tvPortList->currentIndex()) :
- tvPortList->currentIndex());
+ Port &curPort = plm->port(currentPortIndex_);
QList streams;
streams.append(curPort.mutableStreamByIndex(index.row(), false));
@@ -346,197 +132,95 @@ void PortsWindow::on_tvStreamList_activated(const QModelIndex & index)
}
}
-void PortsWindow::when_portView_currentChanged(const QModelIndex& currentIndex,
- const QModelIndex& previousIndex)
+void StreamsWidget::setCurrentPortIndex(const QModelIndex &portIndex)
{
- QModelIndex current = currentIndex;
- QModelIndex previous = previousIndex;
+ if (!plm)
+ return;
- if (proxyPortModel) {
- current = proxyPortModel->mapToSource(current);
- previous = proxyPortModel->mapToSource(previous);
- }
-
- plm->getStreamModel()->setCurrentPortIndex(current);
- updatePortViewActions(currentIndex);
- updateStreamViewActions();
+ // XXX: We assume portIndex corresponds to sourceModel, not proxyModel
+ if (!plm->isPort(portIndex))
+ return;
qDebug("In %s", __FUNCTION__);
- if (previous.isValid() && plm->isPort(previous))
- {
- disconnect(&(plm->port(previous)), SIGNAL(portRateChanged(int, int)),
+ // Disconnect previous port
+ if (plm->isPort(currentPortIndex_))
+ disconnect(&(plm->port(currentPortIndex_)),
+ SIGNAL(portRateChanged(int, int)),
this, SLOT(updatePortRates()));
- disconnect(&(plm->port(previous)),
- SIGNAL(localConfigChanged(int, int, bool)),
- this,
- SLOT(updateApplyHint(int, int, bool)));
- }
- if (!current.isValid())
- {
- qDebug("setting stacked widget to welcome page");
- swDetail->setCurrentIndex(0); // welcome page
- }
- else
- {
- if (plm->isPortGroup(current))
- {
- swDetail->setCurrentIndex(1); // portGroup detail page
- }
- else if (plm->isPort(current))
- {
- swDetail->setCurrentIndex(2); // port detail page
- updatePortRates();
- connect(&(plm->port(current)), SIGNAL(portRateChanged(int, int)),
- SLOT(updatePortRates()));
- connect(&(plm->port(current)),
- SIGNAL(localConfigChanged(int, int, bool)),
- SLOT(updateApplyHint(int, int, bool)));
- if (plm->port(current).isDirty())
- updateApplyHint(plm->port(current).portGroupId(),
- plm->port(current).id(), true);
- else if (plm->port(current).numStreams())
- applyHint->setText("Click
"
- "to transmit packets");
- else
- applyHint->setText("");
- }
- }
+ currentPortIndex_ = portIndex;
+ plm->getStreamModel()->setCurrentPortIndex(portIndex);
- emit currentPortChanged(current, previous);
+ // Connect current port
+ if (plm->isPort(currentPortIndex_))
+ connect(&(plm->port(currentPortIndex_)),
+ SIGNAL(portRateChanged(int, int)),
+ this, SLOT(updatePortRates()));
+ updatePortRates();
+ updateStreamViewActions();
}
-void PortsWindow::when_portModel_dataChanged(const QModelIndex& topLeft,
- const QModelIndex& bottomRight)
+void StreamsWidget::on_startTx_clicked()
{
- qDebug("In %s %d:(%d, %d) - %d:(%d, %d)", __FUNCTION__,
- topLeft.parent().isValid(), topLeft.row(), topLeft.column(),
- bottomRight.parent().isValid(), bottomRight.row(), bottomRight.column());
+ Q_ASSERT(plm->isPort(currentPortIndex_));
- if (!topLeft.isValid() || !bottomRight.isValid())
- return;
-
- if (topLeft.parent() != bottomRight.parent())
- return;
-
- // If a port has changed, expand the port group
- if (topLeft.parent().isValid())
- tvPortList->expand(proxyPortModel ?
- proxyPortModel->mapFromSource(topLeft.parent()) :
- topLeft.parent());
-
-#if 0 // not sure why the >= <= operators are not overloaded in QModelIndex
- if ((tvPortList->currentIndex() >= topLeft) &&
- (tvPortList->currentIndex() <= bottomRight))
-#endif
- if (((topLeft < tvPortList->currentIndex()) ||
- (topLeft == tvPortList->currentIndex())) &&
- (((tvPortList->currentIndex() < bottomRight)) ||
- (tvPortList->currentIndex() == bottomRight)))
- {
- // Update UI to reflect potential change in exclusive mode,
- // transmit mode et al
- when_portView_currentChanged(tvPortList->currentIndex(),
- tvPortList->currentIndex());
- }
-}
-
-void PortsWindow::when_portModel_reset()
-{
- when_portView_currentChanged(QModelIndex(), tvPortList->currentIndex());
-}
-
-void PortsWindow::on_startTx_clicked()
-{
- QModelIndex current = tvPortList->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- Q_ASSERT(plm->isPort(current));
-
- QModelIndex curPortGroup = plm->getPortModel()->parent(current);
+ QModelIndex curPortGroup = plm->getPortModel()->parent(currentPortIndex_);
Q_ASSERT(curPortGroup.isValid());
Q_ASSERT(plm->isPortGroup(curPortGroup));
- QList portList({plm->port(current).id()});
+ QList portList({plm->port(currentPortIndex_).id()});
plm->portGroup(curPortGroup).startTx(&portList);
}
-void PortsWindow::on_stopTx_clicked()
+void StreamsWidget::on_stopTx_clicked()
{
- QModelIndex current = tvPortList->currentIndex();
+ Q_ASSERT(plm->isPort(currentPortIndex_));
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- Q_ASSERT(plm->isPort(current));
-
- QModelIndex curPortGroup = plm->getPortModel()->parent(current);
+ QModelIndex curPortGroup = plm->getPortModel()->parent(currentPortIndex_);
Q_ASSERT(curPortGroup.isValid());
Q_ASSERT(plm->isPortGroup(curPortGroup));
- QList portList({plm->port(current).id()});
+ QList portList({plm->port(currentPortIndex_).id()});
plm->portGroup(curPortGroup).stopTx(&portList);
}
-void PortsWindow::on_averagePacketsPerSec_editingFinished()
+void StreamsWidget::on_averagePacketsPerSec_editingFinished()
{
- QModelIndex current = tvPortList->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- Q_ASSERT(plm->isPort(current));
+ Q_ASSERT(plm->isPort(currentPortIndex_));
bool isOk;
double pps = XLocale().toDouble(averagePacketsPerSec->text(), &isOk);
- plm->port(current).setAveragePacketRate(pps);
+ plm->port(currentPortIndex_).setAveragePacketRate(pps);
}
-void PortsWindow::on_averageBitsPerSec_editingFinished()
+void StreamsWidget::on_averageBitsPerSec_editingFinished()
{
- QModelIndex current = tvPortList->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- Q_ASSERT(plm->isPort(current));
+ Q_ASSERT(plm->isPort(currentPortIndex_));
bool isOk;
double bps = XLocale().toDouble(averageBitsPerSec->text(), &isOk);
- plm->port(current).setAverageBitRate(bps);
+ plm->port(currentPortIndex_).setAverageBitRate(bps);
}
-void PortsWindow::updatePortRates()
+void StreamsWidget::updatePortRates()
{
- QModelIndex current = tvPortList->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- if (!current.isValid())
+ if (!currentPortIndex_.isValid())
return;
- if (!plm->isPort(current))
+ if (!plm->isPort(currentPortIndex_))
return;
averagePacketsPerSec->setText(QString("%L1")
- .arg(plm->port(current).averagePacketRate(), 0, 'f', 4));
+ .arg(plm->port(currentPortIndex_).averagePacketRate(), 0, 'f', 4));
averageBitsPerSec->setText(QString("%L1")
- .arg(plm->port(current).averageBitRate(), 0, 'f', 0));
+ .arg(plm->port(currentPortIndex_).averageBitRate(), 0, 'f', 0));
}
-void PortsWindow::updateStreamViewActions()
+void StreamsWidget::updateStreamViewActions()
{
- QModelIndex current = tvPortList->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
// For some reason hasSelection() returns true even if selection size is 0
// so additional check for size introduced
if (tvStreamList->selectionModel()->hasSelection() &&
@@ -565,7 +249,7 @@ void PortsWindow::updateStreamViewActions()
else
{
qDebug("No selection");
- if (plm->isPort(current))
+ if (plm->isPort(currentPortIndex_))
actionNew_Stream->setEnabled(true);
else
actionNew_Stream->setDisabled(true);
@@ -573,274 +257,14 @@ void PortsWindow::updateStreamViewActions()
actionDuplicate_Stream->setDisabled(true);
actionDelete_Stream->setDisabled(true);
}
- actionOpen_Streams->setEnabled(plm->isPort(current));
+ actionOpen_Streams->setEnabled(plm->isPort(currentPortIndex_));
actionSave_Streams->setEnabled(tvStreamList->model()->rowCount() > 0);
startTx->setEnabled(tvStreamList->model()->rowCount() > 0);
stopTx->setEnabled(tvStreamList->model()->rowCount() > 0);
}
-void PortsWindow::updateApplyHint(int /*portGroupId*/, int /*portId*/,
- bool configChanged)
-{
- if (configChanged)
- applyHint->setText("Configuration has changed - "
- "click Apply "
- "to activate the changes");
- else if (tvStreamList->model()->rowCount() > 0)
- applyHint->setText("Configuration activated - "
- "click
"
- "to transmit packets");
- else
- applyHint->setText("Configuration activated");
-}
-
-void PortsWindow::updatePortViewActions(const QModelIndex& currentIndex)
-{
- QModelIndex current = currentIndex;
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- if (!current.isValid())
- {
- qDebug("current is now invalid");
- actionDelete_Port_Group->setDisabled(true);
- actionConnect_Port_Group->setDisabled(true);
- actionDisconnect_Port_Group->setDisabled(true);
-
- actionExclusive_Control->setDisabled(true);
- actionPort_Configuration->setDisabled(true);
-
- goto _EXIT;
- }
-
- qDebug("currentChanged %p", (void*)current.internalId());
-
- if (plm->isPortGroup(current))
- {
- actionDelete_Port_Group->setEnabled(true);
-
- actionExclusive_Control->setDisabled(true);
- actionPort_Configuration->setDisabled(true);
-
- switch(plm->portGroup(current).state())
- {
- case QAbstractSocket::UnconnectedState:
- case QAbstractSocket::ClosingState:
- qDebug("state = unconnected|closing");
- actionConnect_Port_Group->setEnabled(true);
- actionDisconnect_Port_Group->setDisabled(true);
- break;
-
- case QAbstractSocket::HostLookupState:
- case QAbstractSocket::ConnectingState:
- case QAbstractSocket::ConnectedState:
- qDebug("state = lookup|connecting|connected");
- actionConnect_Port_Group->setDisabled(true);
- actionDisconnect_Port_Group->setEnabled(true);
- break;
-
-
- case QAbstractSocket::BoundState:
- case QAbstractSocket::ListeningState:
- default:
- // FIXME(LOW): indicate error
- qDebug("unexpected state");
- break;
- }
- }
- else if (plm->isPort(current))
- {
- actionDelete_Port_Group->setDisabled(true);
- actionConnect_Port_Group->setDisabled(true);
- actionDisconnect_Port_Group->setDisabled(true);
-
- actionExclusive_Control->setEnabled(true);
- if (plm->port(current).hasExclusiveControl())
- actionExclusive_Control->setChecked(true);
- else
- actionExclusive_Control->setChecked(false);
- actionPort_Configuration->setEnabled(true);
- }
-
-_EXIT:
- return;
-}
-
-void PortsWindow::on_pbApply_clicked()
-{
- QModelIndex curPort;
- QModelIndex curPortGroup;
-
- curPort = tvPortList->selectionModel()->currentIndex();
- if (proxyPortModel)
- curPort = proxyPortModel->mapToSource(curPort);
- if (!curPort.isValid())
- {
- qDebug("%s: curPort is invalid", __FUNCTION__);
- goto _exit;
- }
-
- if (!plm->isPort(curPort))
- {
- qDebug("%s: curPort is not a port", __FUNCTION__);
- goto _exit;
- }
-
- if (plm->port(curPort).getStats().state().is_transmit_on())
- {
- QMessageBox::information(0, "Configuration Change",
- "Please stop transmit on the port before applying any changes");
- goto _exit;
- }
-
- curPortGroup = plm->getPortModel()->parent(curPort);
- if (!curPortGroup.isValid())
- {
- qDebug("%s: curPortGroup is invalid", __FUNCTION__);
- goto _exit;
- }
- if (!plm->isPortGroup(curPortGroup))
- {
- qDebug("%s: curPortGroup is not a portGroup", __FUNCTION__);
- goto _exit;
- }
-
- disconnect(applyMsg_);
- connect(&(plm->portGroup(curPortGroup)), SIGNAL(applyFinished()),
- applyMsg_, SLOT(hide()));
- applyMsg_->show();
-
- // FIXME(HI): shd this be a signal?
- //portGroup.when_configApply(port);
- // FIXME(MED): mixing port id and index!!!
- plm->portGroup(curPortGroup).when_configApply(plm->port(curPort).id());
-
-_exit:
- return;
-
-#if 0
- // TODO (LOW): This block is for testing only
- QModelIndex current = tvPortList->selectionModel()->currentIndex();
-
- if (current.isValid())
- qDebug("current = %llx", current.internalId());
- else
- qDebug("current is invalid");
-#endif
-}
-
-void PortsWindow::on_actionNew_Port_Group_triggered()
-{
- bool ok;
- QString text = QInputDialog::getText(this,
- "Add Port Group", "Port Group Address (HostName[:Port])",
- QLineEdit::Normal, lastNewPortGroup, &ok);
-
- if (ok)
- {
- QStringList addr = text.split(":");
- quint16 port = DEFAULT_SERVER_PORT;
-
- if (addr.size() > 2) { // IPv6 Address
- // IPv6 addresses with port number SHOULD be specified as
- // [2001:db8::1]:80 (RFC5952 Sec6) to avoid ambiguity due to ':'
- addr = text.split("]:");
- if (addr.size() > 1)
- port = addr[1].toUShort();
- }
- else if (addr.size() == 2) // Hostname/IPv4 + Port specified
- port = addr[1].toUShort();
-
- // Play nice and remove square brackets irrespective of addr type
- addr[0].remove(QChar('['));
- addr[0].remove(QChar(']'));
-
- PortGroup *pg = new PortGroup(addr[0], port);
- plm->addPortGroup(*pg);
- lastNewPortGroup = text;
- }
-}
-
-void PortsWindow::on_actionDelete_Port_Group_triggered()
-{
- QModelIndex current = tvPortList->selectionModel()->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- if (current.isValid())
- plm->removePortGroup(plm->portGroup(current));
-}
-
-void PortsWindow::on_actionConnect_Port_Group_triggered()
-{
- QModelIndex current = tvPortList->selectionModel()->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- if (current.isValid())
- plm->portGroup(current).connectToHost();
-}
-
-void PortsWindow::on_actionDisconnect_Port_Group_triggered()
-{
- QModelIndex current = tvPortList->selectionModel()->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- if (current.isValid())
- plm->portGroup(current).disconnectFromHost();
-}
-
-void PortsWindow::on_actionExclusive_Control_triggered(bool checked)
-{
- QModelIndex current = tvPortList->selectionModel()->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- if (plm->isPort(current))
- {
- OstProto::Port config;
-
- config.set_is_exclusive_control(checked);
- plm->portGroup(current.parent()).modifyPort(current.row(), config);
- }
-}
-
-void PortsWindow::on_actionPort_Configuration_triggered()
-{
- QModelIndex current = tvPortList->selectionModel()->currentIndex();
-
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- if (!plm->isPort(current))
- return;
-
- Port &port = plm->port(current);
- OstProto::Port config;
- // XXX: we don't call Port::protoDataCopyInto() to get config b'coz
- // we want only the modifiable fields populated to send to Drone
- // TODO: extend Port::protoDataCopyInto() to accept an optional param
- // which says copy only modifiable fields
- //plm->port(current).protoDataCopyInto(&config);
- config.set_transmit_mode(port.transmitMode());
- config.set_is_tracking_stream_stats(port.trackStreamStats());
- config.set_is_exclusive_control(port.hasExclusiveControl());
- config.set_user_name(port.userName().toStdString());
-
- PortConfigDialog dialog(config, port.getStats().state(), this);
-
- if (dialog.exec() == QDialog::Accepted)
- plm->portGroup(current.parent()).modifyPort(current.row(), config);
-}
-
-void PortsWindow::on_actionNew_Stream_triggered()
+void StreamsWidget::on_actionNew_Stream_triggered()
{
qDebug("New Stream Action");
@@ -863,9 +287,7 @@ void PortsWindow::on_actionNew_Stream_triggered()
count = selectionModel->selection().at(0).height();
}
- Port &curPort = plm->port(proxyPortModel ?
- proxyPortModel->mapToSource(tvPortList->currentIndex()) :
- tvPortList->currentIndex());
+ Port &curPort = plm->port(currentPortIndex_);
QList streams;
for (int i = 0; i < count; i++)
@@ -877,7 +299,7 @@ void PortsWindow::on_actionNew_Stream_triggered()
streamModel->insert(row, streams);
}
-void PortsWindow::on_actionEdit_Stream_triggered()
+void StreamsWidget::on_actionEdit_Stream_triggered()
{
qDebug("Edit Stream Action");
@@ -885,9 +307,7 @@ void PortsWindow::on_actionEdit_Stream_triggered()
if (!streamModel->hasSelection())
return;
- Port &curPort = plm->port(proxyPortModel ?
- proxyPortModel->mapToSource(tvPortList->currentIndex()) :
- tvPortList->currentIndex());
+ Port &curPort = plm->port(currentPortIndex_);
QList streams;
foreach(QModelIndex index, streamModel->selectedRows())
@@ -900,16 +320,12 @@ void PortsWindow::on_actionEdit_Stream_triggered()
}
}
-void PortsWindow::on_actionDuplicate_Stream_triggered()
+void StreamsWidget::on_actionDuplicate_Stream_triggered()
{
QItemSelectionModel* model = tvStreamList->selectionModel();
- QModelIndex current = tvPortList->selectionModel()->currentIndex();
qDebug("Duplicate Stream Action");
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
if (model->hasSelection())
{
bool isOk;
@@ -922,13 +338,13 @@ void PortsWindow::on_actionDuplicate_Stream_triggered()
QList list;
foreach(QModelIndex index, model->selectedRows())
list.append(index.row());
- plm->port(current).duplicateStreams(list, count);
+ plm->port(currentPortIndex_).duplicateStreams(list, count);
}
else
qDebug("No selection");
}
-void PortsWindow::on_actionDelete_Stream_triggered()
+void StreamsWidget::on_actionDelete_Stream_triggered()
{
qDebug("Delete Stream Action");
@@ -948,24 +364,20 @@ void PortsWindow::on_actionDelete_Stream_triggered()
qDebug("No selection");
}
-void PortsWindow::on_actionOpen_Streams_triggered()
+void StreamsWidget::on_actionOpen_Streams_triggered()
{
qDebug("Open Streams Action");
QStringList fileTypes = StreamFileFormat::supportedFileTypes(
StreamFileFormat::kOpenFile);
QString fileType;
- QModelIndex current = tvPortList->selectionModel()->currentIndex();
static QString dirName;
QString fileName;
QString errorStr;
bool append = true;
bool ret;
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
- Q_ASSERT(plm->isPort(current));
+ Q_ASSERT(plm->isPort(currentPortIndex_));
if (fileTypes.size())
fileType = fileTypes.at(0);
@@ -998,7 +410,7 @@ void PortsWindow::on_actionOpen_Streams_triggered()
Q_ASSERT(false);
}
- ret = plm->port(current).openStreams(fileName, append, errorStr);
+ ret = plm->port(currentPortIndex_).openStreams(fileName, append, errorStr);
if (!ret || !errorStr.isEmpty())
{
QMessageBox msgBox(this);
@@ -1014,16 +426,16 @@ void PortsWindow::on_actionOpen_Streams_triggered()
msgBox.exec();
}
dirName = QFileInfo(fileName).absolutePath();
+ updateStreamViewActions();
_exit:
return;
}
-void PortsWindow::on_actionSave_Streams_triggered()
+void StreamsWidget::on_actionSave_Streams_triggered()
{
qDebug("Save Streams Action");
- QModelIndex current = tvPortList->selectionModel()->currentIndex();
static QString fileName;
QStringList fileTypes = StreamFileFormat::supportedFileTypes(
StreamFileFormat::kSaveFile);
@@ -1031,9 +443,6 @@ void PortsWindow::on_actionSave_Streams_triggered()
QString errorStr;
QFileDialog::Options options;
- if (proxyPortModel)
- current = proxyPortModel->mapToSource(current);
-
// On Mac OS with Native Dialog, getSaveFileName() ignores fileType
// which we need
#if defined(Q_OS_MAC)
@@ -1043,7 +452,7 @@ void PortsWindow::on_actionSave_Streams_triggered()
if (fileTypes.size())
fileType = fileTypes.at(0);
- Q_ASSERT(plm->isPort(current));
+ Q_ASSERT(plm->isPort(currentPortIndex_));
_retry:
fileName = QFileDialog::getSaveFileName(this, tr("Save Streams"),
@@ -1083,7 +492,7 @@ _retry:
// TODO: all or selected?
- if (!plm->port(current).saveStreams(fileName, fileType, errorStr))
+ if (!plm->port(currentPortIndex_).saveStreams(fileName, fileType, errorStr))
QMessageBox::critical(this, qApp->applicationName(), errorStr);
else if (!errorStr.isEmpty())
QMessageBox::warning(this, qApp->applicationName(), errorStr);
diff --git a/client/streamswidget.h b/client/streamswidget.h
index 92aa85c..a719bae 100644
--- a/client/streamswidget.h
+++ b/client/streamswidget.h
@@ -17,61 +17,30 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see
*/
-#ifndef _PORTS_WINDOW_H
-#define _PORTS_WINDOW_H
+#ifndef _STREAMS_WIDGET_H
+#define _STREAMS_WIDGET_H
-#include
-#include
-#include "ui_portswindow.h"
#include "ui_streamswidget.h"
-#include "portgrouplist.h"
+#include
+//#include
-class ApplyMessage;
+class PortGroupList;
class QAbstractItemDelegate;
-class QProgressDialog;
-class QSortFilterProxyModel;
-namespace OstProto {
- class SessionContent;
-}
-
-class PortsWindow : public QWidget, private Ui::PortsWindow, private Ui::StreamsWidget
+class StreamsWidget : public QWidget, private Ui::StreamsWidget
{
Q_OBJECT
- //QAbstractItemModel *slm; // stream list model
- PortGroupList *plm;
-
public:
- PortsWindow(PortGroupList *pgl, QWidget *parent = 0);
- ~PortsWindow();
+ StreamsWidget(QWidget *parent = 0);
+ ~StreamsWidget();
- int portGroupCount();
- int reservedPortCount();
-
- bool openSession(const OstProto::SessionContent *session,
- QString &error);
- bool saveSession(OstProto::SessionContent *session,
- QString &error,
- QProgressDialog *progress = NULL);
-
-signals:
- void currentPortChanged(const QModelIndex ¤t,
- const QModelIndex &previous);
-
-private:
- QString lastNewPortGroup;
- QAbstractItemDelegate *delegate;
- QSortFilterProxyModel *proxyPortModel;
- ApplyMessage *applyMsg_;
+ void setPortGroupList(PortGroupList *portGroups);
public slots:
- void clearCurrentSelection();
- void showMyReservedPortsOnly(bool enabled);
+ void setCurrentPortIndex(const QModelIndex &portIndex);
private slots:
- void updateApplyHint(int portGroupId, int portId, bool configChanged);
- void updatePortViewActions(const QModelIndex& currentIndex);
void updateStreamViewActions();
void on_startTx_clicked();
@@ -80,21 +49,6 @@ private slots:
void on_averageBitsPerSec_editingFinished();
void updatePortRates();
void on_tvStreamList_activated(const QModelIndex & index);
- void when_portView_currentChanged(const QModelIndex& currentIndex,
- const QModelIndex& previousIndex);
- void when_portModel_dataChanged(const QModelIndex& topLeft,
- const QModelIndex& bottomRight);
- void when_portModel_reset();
-
- void on_pbApply_clicked();
-
- void on_actionNew_Port_Group_triggered();
- void on_actionDelete_Port_Group_triggered();
- void on_actionConnect_Port_Group_triggered();
- void on_actionDisconnect_Port_Group_triggered();
-
- void on_actionExclusive_Control_triggered(bool checked);
- void on_actionPort_Configuration_triggered();
void on_actionNew_Stream_triggered();
void on_actionEdit_Stream_triggered();
@@ -105,6 +59,12 @@ private slots:
void on_actionSave_Streams_triggered();
void streamModelDataChanged();
+
+private:
+ PortGroupList *plm{nullptr}; // FIXME: rename to portGroups_?
+ QModelIndex currentPortIndex_;
+
+ QAbstractItemDelegate *delegate;
};
#endif