initial commit

This commit is contained in:
Blue 2018-08-05 00:46:25 +03:00 committed by Юрий Губич
commit 4b60ece582
327 changed files with 28286 additions and 0 deletions

View file

@ -0,0 +1,27 @@
cmake_minimum_required(VERSION 2.8.12)
project(robouteViews)
find_package(Qt5Core REQUIRED)
find_package(Qt5Widgets REQUIRED)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(HEADERS
mainview.h
detailedview.h
newappdialogue.h
commandform.h
)
set(SOURCES
mainview.cpp
detailedview.cpp
newappdialogue.cpp
commandform.cpp
)
add_library(robouteViews STATIC ${HEADERS} ${SOURCES})
target_link_libraries(robouteViews Qt5::Core)
target_link_libraries(robouteViews Qt5::Widgets)

View file

@ -0,0 +1,104 @@
#include "commandform.h"
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QSpinBox>
#include <QtWidgets/QPushButton>
CommandForm::CommandForm(const QString& commandName, const AMap& p_args, QWidget* parent):
QDialog(parent),
args(p_args),
editors(),
name(commandName)
{
QVBoxLayout* mainLayout = new QVBoxLayout(this);
QHBoxLayout* buttonsLayout = new QHBoxLayout();
QFormLayout* formLayout = new QFormLayout();
mainLayout->addWidget(new QLabel(name, this));
mainLayout->addLayout(formLayout);
mainLayout->addStretch();
mainLayout->addLayout(buttonsLayout);
setLayout(mainLayout);
createForm(formLayout);
createButtons(buttonsLayout);
}
void CommandForm::createButtons(QHBoxLayout* layout)
{
layout->addStretch();
QPushButton* accept = new QPushButton(QIcon::fromTheme("dialog-ok"), tr("OK"), this);
QPushButton* reject = new QPushButton(QIcon::fromTheme("dialog-cancel"), tr("Cancel"), this);
connect(accept, SIGNAL(clicked()), SLOT(accept()));
connect(reject, SIGNAL(clicked()), SLOT(reject()));
layout->addWidget(accept);
layout->addWidget(reject);
}
void CommandForm::createForm(QFormLayout* layout)
{
AMap::const_iterator itr = args.begin();
AMap::const_iterator end = args.end();
for (; itr != end; ++itr) {
bool supportable = false;
QWidget* editor;
switch (itr.value()) {
case 0:
editor = new QLineEdit(this);
supportable = true;
break;
case 2:
QSpinBox* spbox = new QSpinBox(this);
spbox->setMaximum(UINT16_MAX); //TODO what the hell is wrong with this shit?
editor = spbox;
supportable = true;
break;
}
if (supportable) {
layout->addRow(tr(itr.key().toStdString().c_str()), editor);
editors.insert(itr.key(), editor);
}
}
}
QMap<QString, QVariant> CommandForm::getData() const
{
AMap::const_iterator itr = args.begin();
AMap::const_iterator end = args.end();
QMap<QString, QVariant> result;
for (; itr != end; ++itr) {
bool supportable = false;
QWidget* editor = editors.find(itr.key()).value();
switch (itr.value()) {
case 0:
result.insert(itr.key(), static_cast<QLineEdit*>(editor)->text());
supportable = true;
break;
case 2:
result.insert(itr.key(), static_cast<QSpinBox*>(editor)->value());
supportable = true;
break;
}
}
return result;
}
QString CommandForm::getName() const
{
return name;
}

View file

@ -0,0 +1,31 @@
#ifndef COMMANDFORM_H
#define COMMANDFORM_H
#include <QtWidgets/QDialog>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QFormLayout>
#include <QtCore/QVariant>
#include <QtCore/QMap>
class CommandForm : public QDialog
{
Q_OBJECT
typedef QMap<QString, uint64_t> AMap;
public:
CommandForm(const QString& commandName, const AMap& p_args, QWidget* parent = 0);
QMap<QString, QVariant> getData() const;
QString getName() const;
private:
AMap args;
QMap<QString, QWidget*> editors;
QString name;
void createForm(QFormLayout* layout);
void createButtons(QHBoxLayout* layout);
};
#endif // COMMANDFORM_H

View file

@ -0,0 +1,321 @@
#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();
}

View file

@ -0,0 +1,86 @@
#ifndef DETAILEDVIEW_H
#define DETAILEDVIEW_H
#include "../models/appmodel.h"
#include <QtCore/QSettings>
#include <QtWidgets/QWidget>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QTableView>
#include <QtWidgets/QListView>
#include <QtWidgets/QSplitter>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QDockWidget>
class DetailedView : public QWidget
{
Q_OBJECT
public:
DetailedView(QWidget* parent = 0);
void setModel(AppModel* p_model);
void clearModel();
uint64_t getModelId();
void saveSettings();
void readSettings();
void showAttrs(bool value);
void showCommands(bool value);
private:
QGridLayout* layout;
QHBoxLayout* topPanel;
QTextEdit* logArea;
QSplitter* splitter;
QWidget* dock;
QTableView* props;
QListView* commands;
QPushButton* connectBtn;
QPushButton* launchBtn;
QPushButton* clearBtn;
QPushButton* removeBtn;
QPushButton* editBtn;
bool connected;
bool launched;
bool propsShown;
bool commandsShown;
AppModel* model;
public slots:
void appendMessage(const QString& msg);
void clear();
void setConnectable(bool value);
void setConnected(bool value);
void setLaunchable(bool value);
void setLaunched(bool value);
void setRemovable(bool value);
void setEditable(bool value);
void clearedLog();
signals:
void connect(uint64_t id);
void disconnect(uint64_t id);
void launch(uint64_t id);
void stop(uint64_t id);
void remove(uint64_t id);
void edit(uint64_t id);
void launchCommand(uint64_t id, const QString& name);
void clearLog(uint64_t id);
private slots:
void onConnectClick();
void onLaunchClick();
void onClearClick();
void onRemoveClick();
void onEditClick();
void checkDock();
void onCommandDoubleClicked(const QModelIndex& index);
};
#endif // DETAILEDVIEW_H

View file

@ -0,0 +1,59 @@
#include "mainview.h"
MainView::MainView(QAbstractListModel* model, QWidget* parent):
QWidget(parent),
splitter(new QSplitter(this)),
list(new QListView(this)),
details(new DetailedView(this)),
detailed(false)
{
QGridLayout* layout = new QGridLayout();
setLayout(layout);
//AppListItemDelegate* dlg = new AppListItemDelegate(this);
//list->setItemDelegate(dlg);
list->setModel(model);
layout->addWidget(splitter, 0, 0, 1, 1);
splitter->addWidget(list);
splitter->addWidget(details);
details->hide();
}
void MainView::hideDetails()
{
if (detailed) {
detailed = false;
details->hide();
}
}
void MainView::showDetails()
{
if (!detailed) {
detailed = true;
details->show();
}
}
void MainView::saveSettings()
{
QSettings settings;
settings.beginGroup("view");
settings.setValue("splitterState", splitter->saveState());
settings.endGroup();
details->saveSettings();
}
void MainView::readSettings()
{
QSettings settings;
splitter->restoreState(settings.value("view/splitterState").toByteArray());
details->readSettings();
}

40
roboute/views/mainview.h Normal file
View file

@ -0,0 +1,40 @@
#ifndef MAINVIEW_H
#define MAINVIEW_H
#include <QtWidgets/QWidget>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QSplitter>
#include <QtWidgets/QListView>
#include <QtCore/QAbstractListModel>
#include <QtWidgets/QPlainTextEdit>
#include <QtCore/QSettings>
//#include "applistitemdelegate.h"
#include "detailedview.h"
class MainView : public QWidget
{
Q_OBJECT
public:
MainView(QAbstractListModel* model, QWidget* parent = 0);
public:
QSplitter* splitter;
QListView* list;
DetailedView* details;
void saveSettings();
void readSettings();
private:
bool detailed;
public:
void showDetails();
void hideDetails();
};
#endif // MAINVIEW_H

View file

@ -0,0 +1,114 @@
#include "newappdialogue.h"
NewAppDialogue::NewAppDialogue(QWidget* parent):
QDialog(parent),
name(new QLineEdit(this)),
address(new QLineEdit(this)),
port(new QLineEdit(this)),
login(new QLineEdit(this)),
pass(new QLineEdit(this)),
log(new QLineEdit(this)),
command(new QLineEdit(this))
{
construct();
}
NewAppDialogue::NewAppDialogue(const QMap<QString, QString>& data, QWidget* parent):
QDialog(parent),
name(new QLineEdit(this)),
address(new QLineEdit(this)),
port(new QLineEdit(this)),
login(new QLineEdit(this)),
pass(new QLineEdit(this)),
log(new QLineEdit(this)),
command(new QLineEdit(this))
{
construct();
if (data.contains("name")) {
name->setText(data.value("name"));
}
if (data.contains("address")) {
address->setText(data.value("address"));
}
if (data.contains("port")) {
port->setText(data.value("port"));
}
if (data.contains("login")) {
login->setText(data.value("login"));
}
if (data.contains("password")) {
pass->setText(data.value("password"));
}
if (data.contains("logFile")) {
log->setText(data.value("logFile"));
}
if (data.contains("command")) {
command->setText(data.value("command"));
}
}
void NewAppDialogue::construct()
{
QVBoxLayout* mainLayout = new QVBoxLayout(this);
QHBoxLayout* buttonsLayout = new QHBoxLayout();
QFormLayout* formLayout = new QFormLayout();
mainLayout->addLayout(formLayout);
mainLayout->addStretch();
mainLayout->addLayout(buttonsLayout);
setLayout(mainLayout);
createButtons(buttonsLayout);
createForm(formLayout);
}
void NewAppDialogue::createButtons(QHBoxLayout* layout)
{
layout->addStretch();
QPushButton* accept = new QPushButton(QIcon::fromTheme("dialog-ok"), tr("OK"), this);
QPushButton* reject = new QPushButton(QIcon::fromTheme("dialog-cancel"), tr("Cancel"), this);
connect(accept, SIGNAL(clicked()), SLOT(accept()));
connect(reject, SIGNAL(clicked()), SLOT(reject()));
layout->addWidget(accept);
layout->addWidget(reject);
}
void NewAppDialogue::createForm(QFormLayout* layout)
{
pass->setEchoMode(QLineEdit::Password);
layout->addRow(tr("Name"), name);
layout->addRow(tr("Server address"), address);
layout->addRow(tr("Service port"), port);
layout->addRow(tr("ssh login"), login);
layout->addRow(tr("Password"), pass);
layout->addRow(tr("Log file"), log);
layout->addRow(tr("Command"), command);
}
QMap<QString, QString> NewAppDialogue::getData() const
{
QMap<QString, QString> map;
map.insert("name", name->text());
map.insert("address", address->text());
map.insert("port", port->text());
map.insert("login", login->text());
map.insert("password", pass->text());
map.insert("logFile", log->text());
map.insert("command", command->text());
return map;
}

View file

@ -0,0 +1,37 @@
#ifndef NEWAPPDIALOGUE_H
#define NEWAPPDIALOGUE_H
#include <QtWidgets/QDialog>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QFormLayout>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QSpacerItem>
#include <QtWidgets/QLineEdit>
#include <QtCore/QMap>
class NewAppDialogue : public QDialog
{
Q_OBJECT
public:
NewAppDialogue(QWidget* parent = 0);
NewAppDialogue(const QMap<QString, QString>& data, QWidget* parent = 0);
QMap<QString, QString> getData() const;
private:
QLineEdit* name;
QLineEdit* address;
QLineEdit* port;
QLineEdit* login;
QLineEdit* pass;
QLineEdit* log;
QLineEdit* command;
private:
void construct();
void createButtons(QHBoxLayout* layout);
void createForm(QFormLayout* layout);
};
#endif // NEWAPPDIALOGUE_H