radio/roboute/views/detailedview.cpp

322 lines
8.5 KiB
C++

#include "detailedview.h"
#include <QtWidgets/QHeaderView>
DetailedView::DetailedView(QWidget* parent):
QWidget(parent),
layout(new QGridLayout(this)),
topPanel(new QHBoxLayout()),
logArea(new QTextEdit(this)),
splitter(new QSplitter(this)),
dock(new QWidget(this)),
props(new QTableView(dock)),
commands(new QListView(dock)),
connectBtn(new QPushButton(QIcon::fromTheme("state-ok"), "", this)),
launchBtn(new QPushButton(QIcon::fromTheme("system-run"), "", this)),
clearBtn(new QPushButton(QIcon::fromTheme("trash-empty"), "", this)),
removeBtn(new QPushButton(QIcon::fromTheme("delete"), "", this)),
editBtn(new QPushButton(QIcon::fromTheme("edit-rename"), "", this)),
connected(false),
launched(false),
propsShown(false),
commandsShown(false),
model(0)
{
setLayout(layout);
logArea->setReadOnly(true);
layout->addLayout(topPanel, 0, 0, 1, 1);
layout->addWidget(splitter, 1, 0, 1, 1);
splitter->addWidget(logArea);
splitter->addWidget(dock);
QHBoxLayout* lay = new QHBoxLayout();
dock->setLayout(lay);
lay->addWidget(props);
lay->addWidget(commands);
lay->setContentsMargins(0,0,0,0);
props->verticalHeader()->hide();
props->horizontalHeader()->setStretchLastSection(true);
props->setCornerButtonEnabled(false);
props->setShowGrid(false);
props->hide();
commands->hide();
dock->hide();
connectBtn->setToolTip(tr("Connect"));
connectBtn->setEnabled(false);
launchBtn->setToolTip(tr("Launch"));
launchBtn->setEnabled(false);
clearBtn->setToolTip(tr("Clear log"));
clearBtn->setEnabled(false);
removeBtn->setToolTip(tr("Remove"));
removeBtn->setEnabled(false);
editBtn->setToolTip(tr("Edit"));
editBtn->setEnabled(false);
QObject::connect(connectBtn, SIGNAL(clicked()), this, SLOT(onConnectClick()));
QObject::connect(launchBtn, SIGNAL(clicked()), this, SLOT(onLaunchClick()));
QObject::connect(clearBtn, SIGNAL(clicked()), this, SLOT(onClearClick()));
QObject::connect(removeBtn, SIGNAL(clicked()), this, SLOT(onRemoveClick()));
QObject::connect(editBtn, SIGNAL(clicked()), this, SLOT(onEditClick()));
QObject::connect(commands, SIGNAL(doubleClicked(const QModelIndex)), SLOT(onCommandDoubleClicked(const QModelIndex)));
topPanel->addWidget(connectBtn);
topPanel->addWidget(launchBtn);
topPanel->addWidget(clearBtn);
topPanel->addStretch();
topPanel->addWidget(editBtn);
topPanel->addWidget(removeBtn);
layout->setContentsMargins(0,0,0,0);
}
void DetailedView::appendMessage(const QString& msg)
{
QStringList list = msg.split('\n');
QStringList::const_iterator itr = list.begin();
QStringList::const_iterator end = list.end();
for (;itr != end; ++itr) {
QString str = *itr;
if (str != "") {
logArea->append(*itr);
}
}
}
void DetailedView::clear()
{
logArea->clear();
connectBtn->setToolTip(tr("Connect"));
connectBtn->setEnabled(false);
connectBtn->setIcon(QIcon::fromTheme("state-ok"));
launchBtn->setToolTip(tr("Launch"));
launchBtn->setEnabled(false);
launchBtn->setIcon(QIcon::fromTheme("kt-start"));
clearBtn->setEnabled(false);
removeBtn->setEnabled(false);
connected = false;
launched = false;
}
void DetailedView::setConnectable(bool value)
{
connectBtn->setEnabled(value);
}
void DetailedView::setConnected(bool value)
{
if (connected != value) {
connected = value;
if (connected) {
connectBtn->setToolTip(tr("Disonnect"));
connectBtn->setIcon(QIcon::fromTheme("state-error"));
} else {
connectBtn->setToolTip(tr("Connect"));
connectBtn->setIcon(QIcon::fromTheme("state-ok"));
}
}
}
void DetailedView::setLaunchable(bool value)
{
launchBtn->setEnabled(value);
}
void DetailedView::setLaunched(bool value)
{
if (launched != value) {
launched = value;
if (launched) {
launchBtn->setToolTip(tr("Stop"));
launchBtn->setIcon(QIcon::fromTheme("kt-stop"));
} else {
launchBtn->setToolTip(tr("Launch"));
launchBtn->setIcon(QIcon::fromTheme("kt-start"));
}
}
}
void DetailedView::onConnectClick()
{
if (model == 0) {
return;
}
if (connected) {
emit disconnect(model->id);
} else {
emit connect(model->id);
}
}
void DetailedView::onLaunchClick()
{
if (model == 0) {
return;
}
if (launched) {
emit stop(model->id);
} else {
emit launch(model->id);
}
}
void DetailedView::onRemoveClick()
{
if (model == 0) {
return;
}
emit remove(model->id);
}
void DetailedView::onEditClick()
{
if (model == 0) {
return;
}
emit edit(model->id);
}
void DetailedView::setRemovable(bool value)
{
removeBtn->setEnabled(value);
}
void DetailedView::setEditable(bool value)
{
editBtn->setEnabled(value);
}
void DetailedView::setModel(AppModel* p_model)
{
if (model != 0) {
clearModel();
}
model = p_model;
QString* history = model->getHistory();
appendMessage(*history);
setConnectable(model->getConnectable());
setConnected(model->getConnected());
setLaunchable(model->getLaunchable());
setLaunched(model->getLaunched());
setRemovable(model->id != 0);
setEditable(model->getEditable());
clearBtn->setEnabled(true);
delete history;
QObject::connect(model, SIGNAL(newLogMessage(const QString&)), this, SLOT(appendMessage(const QString&)));
QObject::connect(model, SIGNAL(changedConnectable(bool)), this, SLOT(setConnectable(bool)));
QObject::connect(model, SIGNAL(changedConnected(bool)), this, SLOT(setConnected(bool)));
QObject::connect(model, SIGNAL(changedLaunchable(bool)), this, SLOT(setLaunchable(bool)));
QObject::connect(model, SIGNAL(changedLaunched(bool)), this, SLOT(setLaunched(bool)));
QObject::connect(model, SIGNAL(changedEditable(bool)), this, SLOT(setEditable(bool)));
QObject::connect(model, SIGNAL(clearedLog()), this, SLOT(clearedLog()));
QItemSelectionModel *m1 = props->selectionModel();
props->setModel(&model->props);
delete m1;
QItemSelectionModel *m2 = commands->selectionModel();
commands->setModel(&model->commands);
delete m2;
}
void DetailedView::clearModel()
{
if (model != 0) {
clear();
QObject::disconnect(model, SIGNAL(newLogMessage(const QString&)), this, SLOT(appendMessage(const QString&)));
QObject::disconnect(model, SIGNAL(changedConnectable(bool)), this, SLOT(setConnectable(bool)));
QObject::disconnect(model, SIGNAL(changedConnected(bool)), this, SLOT(setConnected(bool)));
QObject::disconnect(model, SIGNAL(changedLaunchable(bool)), this, SLOT(setLaunchable(bool)));
QObject::disconnect(model, SIGNAL(changedLaunched(bool)), this, SLOT(setLaunched(bool)));
QObject::disconnect(model, SIGNAL(clearedLog()), this, SLOT(clearedLog()));
model = 0;
}
}
void DetailedView::saveSettings()
{
QSettings settings;
settings.beginGroup("detailedView");
settings.setValue("splitterState", splitter->saveState());
settings.setValue("propsHeaderState", props->horizontalHeader()->saveState());
settings.endGroup();
}
void DetailedView::readSettings()
{
QSettings settings;
splitter->restoreState(settings.value("detailedView/splitterState").toByteArray());
props->horizontalHeader()->restoreState(settings.value("detailedView/propsHeaderState").toByteArray());
}
void DetailedView::showAttrs(bool value)
{
if (value) {
props->show();
} else {
props->hide();
}
propsShown = value;
checkDock();
}
void DetailedView::showCommands(bool value)
{
if (value) {
commands->show();
} else {
commands->hide();
}
commandsShown = value;
checkDock();
}
void DetailedView::checkDock()
{
if (commandsShown || propsShown) {
dock->show();
} else {
dock->hide();
}
}
void DetailedView::onCommandDoubleClicked(const QModelIndex& index)
{
if (model == 0) {
return;
}
emit launchCommand(model->id, index.data().toString());
}
uint64_t DetailedView::getModelId()
{
if (model == 0) {
throw 1;
}
return model->id;
}
void DetailedView::onClearClick()
{
if (model == 0) {
return;
}
emit clearLog(model->id);
}
void DetailedView::clearedLog()
{
logArea->clear();
}