This commit is contained in:
Joey Yakimowich-Payne 2026-01-27 18:57:54 -07:00
commit 6d74ef422d
5 changed files with 160 additions and 7 deletions

View file

@ -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();
}