Add UI
This commit is contained in:
parent
7f6df30c9e
commit
6d74ef422d
5 changed files with 160 additions and 7 deletions
|
|
@ -16,6 +16,11 @@
|
|||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QFileInfo>
|
||||
#include <QHBoxLayout>
|
||||
#include <QSlider>
|
||||
#include <QSizePolicy>
|
||||
#include <QToolButton>
|
||||
#include <QWidget>
|
||||
|
||||
#include <QtNodes/NodeStyle>
|
||||
#include <QtNodes/StyleCollection>
|
||||
|
|
@ -108,6 +113,51 @@ PipeWireGraphModel::PipeWireGraphModel(Potato::PipeWireController *controller, Q
|
|||
}
|
||||
}
|
||||
|
||||
QWidget *PipeWireGraphModel::nodeWidget(QtNodes::NodeId nodeId) const
|
||||
{
|
||||
auto it = m_nodeWidgets.find(nodeId);
|
||||
if (it != m_nodeWidgets.end()) {
|
||||
return it->second;
|
||||
}
|
||||
|
||||
auto *widget = new QWidget();
|
||||
auto *layout = new QHBoxLayout(widget);
|
||||
layout->setContentsMargins(6, 2, 6, 2);
|
||||
layout->setSpacing(6);
|
||||
|
||||
auto *muteButton = new QToolButton(widget);
|
||||
muteButton->setText("M");
|
||||
muteButton->setCheckable(true);
|
||||
muteButton->setFixedSize(20, 20);
|
||||
muteButton->setToolTip(QString("Mute (UI only)"));
|
||||
|
||||
auto *slider = new QSlider(Qt::Horizontal, widget);
|
||||
slider->setRange(0, 100);
|
||||
slider->setValue(100);
|
||||
slider->setFixedHeight(18);
|
||||
slider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
|
||||
slider->setToolTip(QString("Volume (UI only)"));
|
||||
|
||||
layout->addWidget(muteButton);
|
||||
layout->addWidget(slider);
|
||||
|
||||
widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
|
||||
widget->setFixedHeight(26);
|
||||
widget->setStyleSheet(
|
||||
"QToolButton { background: #2b2f38; color: #dbe2ee; border: 1px solid #39404c; border-radius: 4px; font-weight: 700; }"
|
||||
"QToolButton:checked { background: #3c4350; color: #ffcf7a; }"
|
||||
"QSlider::groove:horizontal { height: 4px; background: #2b2f38; border-radius: 2px; }"
|
||||
"QSlider::sub-page:horizontal { background: #5fcf8d; border-radius: 2px; }"
|
||||
"QSlider::add-page:horizontal { background: #2b2f38; border-radius: 2px; }"
|
||||
"QSlider::handle:horizontal { width: 10px; margin: -6px 0; background: #dbe2ee; border-radius: 5px; }"
|
||||
);
|
||||
|
||||
widget->adjustSize();
|
||||
|
||||
m_nodeWidgets.emplace(nodeId, widget);
|
||||
return widget;
|
||||
}
|
||||
|
||||
QtNodes::NodeId PipeWireGraphModel::newNodeId()
|
||||
{
|
||||
return m_nextNodeId++;
|
||||
|
|
@ -210,6 +260,16 @@ bool PipeWireGraphModel::connectionPossible(QtNodes::ConnectionId const connecti
|
|||
return false;
|
||||
}
|
||||
|
||||
const auto &outPort = outInfo.outputPorts.at(connectionId.outPortIndex);
|
||||
const auto &inPort = inInfo.inputPorts.at(connectionId.inPortIndex);
|
||||
if (outPort.direction != SPA_DIRECTION_OUTPUT || inPort.direction != SPA_DIRECTION_INPUT) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (outInfo.mediaClass != inInfo.mediaClass) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -257,6 +317,10 @@ QVariant PipeWireGraphModel::nodeData(QtNodes::NodeId nodeId, QtNodes::NodeRole
|
|||
}
|
||||
case QtNodes::NodeRole::Size:
|
||||
{
|
||||
auto sizeIt = m_nodeSizes.find(nodeId);
|
||||
if (sizeIt != m_nodeSizes.end()) {
|
||||
return sizeIt->second;
|
||||
}
|
||||
const int maxPorts = std::max(info.inputPorts.size(), info.outputPorts.size());
|
||||
const int baseHeight = 50;
|
||||
const int perPortHeight = 28;
|
||||
|
|
@ -274,6 +338,8 @@ QVariant PipeWireGraphModel::nodeData(QtNodes::NodeId nodeId, QtNodes::NodeRole
|
|||
return QString("PipeWire");
|
||||
case QtNodes::NodeRole::Style:
|
||||
return nodeStyleVariant(info);
|
||||
case QtNodes::NodeRole::Widget:
|
||||
return QVariant::fromValue(nodeWidget(nodeId));
|
||||
default:
|
||||
return QVariant();
|
||||
}
|
||||
|
|
@ -293,6 +359,11 @@ bool PipeWireGraphModel::setNodeData(QtNodes::NodeId nodeId, QtNodes::NodeRole r
|
|||
return true;
|
||||
}
|
||||
|
||||
if (role == QtNodes::NodeRole::Size) {
|
||||
m_nodeSizes[nodeId] = value.toSize();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -333,9 +404,6 @@ QVariant PipeWireGraphModel::portData(QtNodes::NodeId nodeId,
|
|||
}
|
||||
|
||||
if (role == QtNodes::PortRole::ConnectionPolicyRole) {
|
||||
if (portType == QtNodes::PortType::In) {
|
||||
return QVariant::fromValue(QtNodes::ConnectionPolicy::One);
|
||||
}
|
||||
return QVariant::fromValue(QtNodes::ConnectionPolicy::Many);
|
||||
}
|
||||
|
||||
|
|
@ -379,6 +447,8 @@ bool PipeWireGraphModel::deleteNode(QtNodes::NodeId const nodeId)
|
|||
|
||||
m_nodes.erase(nodeId);
|
||||
m_positions.erase(nodeId);
|
||||
m_nodeSizes.erase(nodeId);
|
||||
m_nodeWidgets.erase(nodeId);
|
||||
Q_EMIT nodeDeleted(nodeId);
|
||||
return true;
|
||||
}
|
||||
|
|
@ -476,6 +546,7 @@ bool PipeWireGraphModel::updatePipeWireNode(const Potato::NodeInfo &node)
|
|||
|
||||
const QtNodes::NodeId nodeId = it->second;
|
||||
m_nodes[nodeId] = node;
|
||||
m_nodeSizes.erase(nodeId);
|
||||
Q_EMIT nodeUpdated(nodeId);
|
||||
return true;
|
||||
}
|
||||
|
|
@ -503,6 +574,8 @@ void PipeWireGraphModel::reset()
|
|||
m_nodes.clear();
|
||||
m_pwToNode.clear();
|
||||
m_positions.clear();
|
||||
m_nodeSizes.clear();
|
||||
m_nodeWidgets.clear();
|
||||
m_nextNodeId = 1;
|
||||
Q_EMIT modelReset();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue