delegatesizehelper updates
Make `DelegateSizeHelper` take a `QQuickItem` rather than a width value and move `TimelineDelegate` to use it rather than duplicting the code. This requires the creation of `LibNeoChat` so that both the main and timeline modules can get access to the class. Note: ideally more stuff will go into `LibNeoChat` but it turns out our dependencies are kinda spaghetti like and so will take some untangling.
This commit is contained in:
@@ -90,4 +90,5 @@ ecm_add_qml_module(timeline GENERATE_PLUGIN_SOURCE
|
||||
target_link_libraries(timeline PRIVATE
|
||||
Qt::Quick
|
||||
KF6::Kirigami
|
||||
LibNeoChat
|
||||
)
|
||||
|
||||
@@ -10,6 +10,7 @@ import org.kde.kirigami as Kirigami
|
||||
import org.kde.kirigamiaddons.components as KirigamiComponents
|
||||
|
||||
import org.kde.neochat
|
||||
import org.kde.neochat.libneochat as LibNeoChat
|
||||
|
||||
/**
|
||||
* @brief The base delegate for all messages in the timeline.
|
||||
@@ -185,7 +186,7 @@ TimelineDelegate {
|
||||
/**
|
||||
* @brief The width available to the bubble content.
|
||||
*/
|
||||
property real contentMaxWidth: (root.isThreaded ? bubbleSizeHelper.parentWidth : bubbleSizeHelper.currentWidth) - bubble.leftPadding - bubble.rightPadding
|
||||
property real contentMaxWidth: (root.isThreaded ? bubbleSizeHelper.parentWidth : bubbleSizeHelper.availableWidth) - bubble.leftPadding - bubble.rightPadding
|
||||
|
||||
Message.room: root.room
|
||||
Message.timeline: root.ListView.view
|
||||
@@ -321,14 +322,14 @@ TimelineDelegate {
|
||||
model: root.readMarkers
|
||||
}
|
||||
|
||||
DelegateSizeHelper {
|
||||
LibNeoChat.DelegateSizeHelper {
|
||||
id: bubbleSizeHelper
|
||||
parentItem: mainContainer
|
||||
leftPadding: avatar.anchors.leftMargin + (NeoChatConfig.showAvatarInTimeline ? avatar.width + bubble.anchors.leftMargin : 0)
|
||||
startBreakpoint: Kirigami.Units.gridUnit * 25
|
||||
endBreakpoint: Kirigami.Units.gridUnit * 40
|
||||
startPercentWidth: root.alwaysFillWidth ? 100 : 90
|
||||
endPercentWidth: root.alwaysFillWidth ? 100 : 60
|
||||
|
||||
parentWidth: mainContainer.availableWidth - (NeoChatConfig.showAvatarInTimeline ? avatar.width + bubble.anchors.leftMargin : 0)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,17 @@
|
||||
TimelineDelegate::TimelineDelegate(QQuickItem *parent)
|
||||
: QQuickItem(parent)
|
||||
{
|
||||
m_sizeHelper.setParentItem(this);
|
||||
connect(&m_sizeHelper, &DelegateSizeHelper::leftPaddingChanged, this, [this]() {
|
||||
Q_EMIT leftPaddingChanged();
|
||||
resizeContent();
|
||||
updatePolish();
|
||||
});
|
||||
connect(&m_sizeHelper, &DelegateSizeHelper::rightPaddingChanged, this, [this]() {
|
||||
Q_EMIT rightPaddingChanged();
|
||||
resizeContent();
|
||||
updatePolish();
|
||||
});
|
||||
}
|
||||
|
||||
QQuickItem *TimelineDelegate::contentItem()
|
||||
@@ -56,38 +67,22 @@ void TimelineDelegate::setAlwaysFillWidth(bool alwaysFillWidth)
|
||||
|
||||
qreal TimelineDelegate::leftPadding()
|
||||
{
|
||||
return m_leftPadding;
|
||||
return m_sizeHelper.leftPadding();
|
||||
}
|
||||
|
||||
void TimelineDelegate::setLeftPadding(qreal leftPadding)
|
||||
{
|
||||
if (qFuzzyCompare(leftPadding, m_leftPadding)) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_leftPadding = leftPadding;
|
||||
Q_EMIT leftPaddingChanged();
|
||||
|
||||
resizeContent();
|
||||
updatePolish();
|
||||
m_sizeHelper.setLeftPadding(leftPadding);
|
||||
}
|
||||
|
||||
qreal TimelineDelegate::rightPadding()
|
||||
{
|
||||
return m_rightPadding;
|
||||
return m_sizeHelper.rightPadding();
|
||||
}
|
||||
|
||||
void TimelineDelegate::setRightPadding(qreal rightPadding)
|
||||
{
|
||||
if (qFuzzyCompare(rightPadding, m_rightPadding)) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_rightPadding = rightPadding;
|
||||
Q_EMIT rightPaddingChanged();
|
||||
|
||||
resizeContent();
|
||||
updatePolish();
|
||||
m_sizeHelper.setRightPadding(rightPadding);
|
||||
}
|
||||
|
||||
void TimelineDelegate::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
|
||||
@@ -114,68 +109,27 @@ void TimelineDelegate::componentComplete()
|
||||
|
||||
void TimelineDelegate::setCurveValues()
|
||||
{
|
||||
m_leftPadding = qreal(m_units->largeSpacing());
|
||||
m_rightPadding = qreal(m_units->largeSpacing());
|
||||
m_sizeHelper.setLeftPadding(qreal(m_units->largeSpacing()));
|
||||
m_sizeHelper.setRightPadding(qreal(m_units->largeSpacing()));
|
||||
|
||||
m_startBreakpoint = qreal(m_units->gridUnit() * 46);
|
||||
m_endBreakpoint = qreal(m_units->gridUnit() * 66);
|
||||
m_maxWidth = qreal(m_units->gridUnit() * 60);
|
||||
m_sizeHelper.setStartBreakpoint(qreal(m_units->gridUnit() * 46));
|
||||
m_sizeHelper.setEndBreakpoint(qreal(m_units->gridUnit() * 66));
|
||||
m_sizeHelper.setMaxWidth(qreal(m_units->gridUnit() * 60));
|
||||
|
||||
resizeContent();
|
||||
}
|
||||
|
||||
int TimelineDelegate::availablePercentageWidth() const
|
||||
{
|
||||
// Don't bother with calculations for a horizontal line.
|
||||
if (m_startPercentWidth == m_endPercentWidth) {
|
||||
return m_startPercentWidth;
|
||||
}
|
||||
// Dividing by zero is a bad idea.
|
||||
if (m_startBreakpoint == m_endBreakpoint || qFuzzyCompare(width(), 0)) {
|
||||
return 100;
|
||||
}
|
||||
|
||||
// Fit to y = mx + c
|
||||
qreal m = (m_endPercentWidth - m_startPercentWidth) / (m_endBreakpoint - m_startBreakpoint);
|
||||
qreal c = m_startPercentWidth - m * m_startBreakpoint;
|
||||
|
||||
// This allows us to clamp correctly if the start or end width is bigger.
|
||||
bool endPercentBigger = m_endPercentWidth > m_startPercentWidth;
|
||||
int maxPercentWidth = endPercentBigger ? m_endPercentWidth : m_startPercentWidth;
|
||||
int minPercentWidth = endPercentBigger ? m_startPercentWidth : m_endPercentWidth;
|
||||
|
||||
int calcPercentWidth = std::round(m * maxAvailableWidth() + c);
|
||||
return std::clamp(calcPercentWidth, minPercentWidth, maxPercentWidth);
|
||||
}
|
||||
|
||||
qreal TimelineDelegate::maxAvailableWidth() const
|
||||
{
|
||||
if (qFuzzyCompare(width(), 0)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return std::max(width() - m_leftPadding - m_rightPadding, 0.0);
|
||||
}
|
||||
|
||||
qreal TimelineDelegate::availableWidth() const
|
||||
{
|
||||
if (m_alwaysFillWidth) {
|
||||
return maxAvailableWidth();
|
||||
}
|
||||
|
||||
qreal absoluteWidth = maxAvailableWidth() * availablePercentageWidth() * 0.01;
|
||||
return std::round(std::min(absoluteWidth, m_maxWidth));
|
||||
}
|
||||
|
||||
void TimelineDelegate::resizeContent()
|
||||
{
|
||||
if (m_contentItem == nullptr || !isComponentComplete()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto leftPadding = m_leftPadding + (maxAvailableWidth() - availableWidth()) / 2;
|
||||
auto availableWidth = m_alwaysFillWidth ? m_sizeHelper.maxAvailableWidth() : m_sizeHelper.availableWidth();
|
||||
|
||||
const auto leftPadding = m_sizeHelper.leftPadding() + (m_sizeHelper.maxAvailableWidth() - availableWidth) / 2;
|
||||
m_contentItem->setPosition(QPointF(leftPadding, 0));
|
||||
m_contentItem->setSize(QSizeF(availableWidth(), m_contentItem->implicitHeight()));
|
||||
m_contentItem->setSize(QSizeF(availableWidth, m_contentItem->implicitHeight()));
|
||||
}
|
||||
|
||||
void TimelineDelegate::updateImplicitHeight()
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
|
||||
#include <Kirigami/Platform/Units>
|
||||
|
||||
#include "delegatesizehelper.h"
|
||||
|
||||
/**
|
||||
* @brief The base Item for all delegates in the timeline.
|
||||
*
|
||||
@@ -77,17 +79,8 @@ private:
|
||||
Kirigami::Platform::Units *m_units = nullptr;
|
||||
void setCurveValues();
|
||||
|
||||
qreal m_leftPadding;
|
||||
qreal m_rightPadding;
|
||||
DelegateSizeHelper m_sizeHelper;
|
||||
|
||||
qreal m_startBreakpoint;
|
||||
qreal m_endBreakpoint;
|
||||
int m_startPercentWidth = 100;
|
||||
int m_endPercentWidth = 85;
|
||||
qreal m_maxWidth;
|
||||
int availablePercentageWidth() const;
|
||||
qreal maxAvailableWidth() const;
|
||||
qreal availableWidth() const;
|
||||
bool m_alwaysFillWidth = false;
|
||||
|
||||
void resizeContent();
|
||||
|
||||
Reference in New Issue
Block a user