mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 09:23:03 +00:00
feat(tray):tray layout
This commit is contained in:
parent
d77226cb6d
commit
0277d1404f
@ -13,11 +13,29 @@ AbstractContainer::AbstractContainer(TrayPlugin *trayPlugin, QWidget *parent)
|
||||
setAcceptDrops(true);
|
||||
|
||||
m_wrapperLayout->setMargin(0);
|
||||
m_wrapperLayout->setContentsMargins(10, 0, 10, 0);
|
||||
m_wrapperLayout->setContentsMargins(0, 0, 0, 0);
|
||||
m_wrapperLayout->setSpacing(TraySpace);
|
||||
|
||||
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
setLayout(m_wrapperLayout);
|
||||
|
||||
setMinimumWidth(TraySpace);
|
||||
setMinimumHeight(TraySpace);
|
||||
}
|
||||
|
||||
void AbstractContainer::refreshVisible()
|
||||
{
|
||||
qDebug() << this << size() << minimumSize() << maximumSize();
|
||||
if (!m_wrapperList.isEmpty()) {
|
||||
//非空保留两边边距
|
||||
if (m_dockPosition == Dock::Position::Top || m_dockPosition == Dock::Position::Bottom) {
|
||||
m_wrapperLayout->setContentsMargins(TraySpace, 0, TraySpace, 0);
|
||||
} else {
|
||||
m_wrapperLayout->setContentsMargins(0, TraySpace, 0, TraySpace);
|
||||
}
|
||||
} else {
|
||||
// 空,保留最小size,可以拖入
|
||||
m_wrapperLayout->setContentsMargins(0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void AbstractContainer::addWrapper(FashionTrayWidgetWrapper *wrapper)
|
||||
@ -91,10 +109,8 @@ void AbstractContainer::setDockPosition(const Dock::Position pos)
|
||||
m_dockPosition = pos;
|
||||
|
||||
if (pos == Dock::Position::Top || pos == Dock::Position::Bottom) {
|
||||
m_wrapperLayout->setContentsMargins(10, 0, 10, 0);
|
||||
m_wrapperLayout->setDirection(QBoxLayout::Direction::LeftToRight);
|
||||
} else {
|
||||
m_wrapperLayout->setContentsMargins(0, 10, 0, 10);
|
||||
m_wrapperLayout->setDirection(QBoxLayout::Direction::TopToBottom);
|
||||
}
|
||||
|
||||
|
@ -14,7 +14,7 @@ public:
|
||||
explicit AbstractContainer(TrayPlugin *trayPlugin, QWidget *parent = nullptr);
|
||||
|
||||
virtual bool acceptWrapper(FashionTrayWidgetWrapper *wrapper) = 0;
|
||||
virtual void refreshVisible() = 0;
|
||||
virtual void refreshVisible();
|
||||
|
||||
virtual void addWrapper(FashionTrayWidgetWrapper *wrapper);
|
||||
virtual bool removeWrapper(FashionTrayWidgetWrapper *wrapper);
|
||||
|
@ -22,6 +22,8 @@ bool AttentionContainer::acceptWrapper(FashionTrayWidgetWrapper *wrapper)
|
||||
|
||||
void AttentionContainer::refreshVisible()
|
||||
{
|
||||
AbstractContainer::refreshVisible();
|
||||
|
||||
setVisible(!isEmpty());
|
||||
}
|
||||
|
||||
|
@ -18,7 +18,7 @@ HoldContainer::HoldContainer(TrayPlugin *trayPlugin, QWidget *parent)
|
||||
|
||||
m_mainBoxLayout->addLayout(newLayout);
|
||||
|
||||
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
// setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
setLayout(m_mainBoxLayout);
|
||||
}
|
||||
|
||||
@ -41,6 +41,8 @@ void HoldContainer::addWrapper(FashionTrayWidgetWrapper *wrapper)
|
||||
|
||||
void HoldContainer::refreshVisible()
|
||||
{
|
||||
AbstractContainer::refreshVisible();
|
||||
|
||||
setVisible(expand() || !isEmpty());
|
||||
}
|
||||
|
||||
|
@ -25,10 +25,12 @@ void NormalContainer::addWrapper(FashionTrayWidgetWrapper *wrapper)
|
||||
|
||||
void NormalContainer::refreshVisible()
|
||||
{
|
||||
AbstractContainer::refreshVisible();
|
||||
|
||||
if (isEmpty()) {
|
||||
// set the minimum size to 1 to avoid can not drag back wrappers when
|
||||
// all wrappers has been drag out
|
||||
setMinimumSize(1, 1);
|
||||
setMinimumSize(TraySpace, TraySpace);
|
||||
} else {
|
||||
// set the minimum size back to 0 in order to make the fold animation works correctly
|
||||
setMinimumSize(0, 0);
|
||||
|
@ -43,6 +43,8 @@ FashionTrayItem::FashionTrayItem(TrayPlugin *trayPlugin, QWidget *parent)
|
||||
m_normalContainer(new NormalContainer(m_trayPlugin)),
|
||||
m_attentionContainer(new AttentionContainer(m_trayPlugin)),
|
||||
m_holdContainer(new HoldContainer(m_trayPlugin))
|
||||
, m_leftSpace(new QWidget)
|
||||
, m_rightSpace(new QWidget)
|
||||
{
|
||||
setAcceptDrops(true);
|
||||
|
||||
@ -57,11 +59,16 @@ FashionTrayItem::FashionTrayItem(TrayPlugin *trayPlugin, QWidget *parent)
|
||||
m_mainBoxLayout->setContentsMargins(0, 0, 0, 0);
|
||||
m_mainBoxLayout->setSpacing(0);
|
||||
|
||||
m_leftSpace->setFixedSize(TraySpace, TraySpace);
|
||||
m_rightSpace->setFixedSize(TraySpace, TraySpace);
|
||||
|
||||
m_mainBoxLayout->addWidget(m_leftSpliter);
|
||||
m_mainBoxLayout->addWidget(m_leftSpace);
|
||||
m_mainBoxLayout->addWidget(m_normalContainer);
|
||||
m_mainBoxLayout->addWidget(m_controlWidget);
|
||||
m_mainBoxLayout->addWidget(m_holdContainer);
|
||||
m_mainBoxLayout->addWidget(m_attentionContainer);
|
||||
m_mainBoxLayout->addWidget(m_rightSpace);
|
||||
m_mainBoxLayout->addWidget(m_rightSpliter);
|
||||
|
||||
m_mainBoxLayout->setAlignment(m_leftSpliter, Qt::AlignCenter);
|
||||
@ -162,7 +169,7 @@ void FashionTrayItem::setDockPosition(Dock::Position pos)
|
||||
|
||||
if (pos == Dock::Position::Top || pos == Dock::Position::Bottom) {
|
||||
m_mainBoxLayout->setDirection(QBoxLayout::Direction::LeftToRight);
|
||||
} else{
|
||||
} else {
|
||||
m_mainBoxLayout->setDirection(QBoxLayout::Direction::TopToBottom);
|
||||
}
|
||||
|
||||
@ -184,7 +191,8 @@ void FashionTrayItem::onExpandChanged(const bool expand)
|
||||
m_normalContainer->setExpand(expand);
|
||||
} else {
|
||||
// hide all tray widget delay for fold animation
|
||||
QTimer::singleShot(350, this, [=] {
|
||||
QTimer::singleShot(350, this, [ = ] {
|
||||
|
||||
m_normalContainer->setExpand(expand);
|
||||
});
|
||||
}
|
||||
@ -235,10 +243,10 @@ void FashionTrayItem::resizeEvent(QResizeEvent *event)
|
||||
|
||||
if (dockPosition == Dock::Position::Top || dockPosition == Dock::Position::Bottom) {
|
||||
m_leftSpliter->setFixedSize(SpliterSize, mSize.height() * 0.8);
|
||||
m_rightSpliter->setFixedSize(SpliterSize, mSize.height() * 0.8);
|
||||
} else{
|
||||
m_rightSpliter->setFixedSize(SpliterSize, mSize.height() * 0.5);
|
||||
} else {
|
||||
m_leftSpliter->setFixedSize(mSize.width() * 0.8, SpliterSize);
|
||||
m_rightSpliter->setFixedSize(mSize.width() * 0.8, SpliterSize);
|
||||
m_rightSpliter->setFixedSize(mSize.width() * 0.5, SpliterSize);
|
||||
}
|
||||
|
||||
QWidget::resizeEvent(event);
|
||||
@ -277,40 +285,40 @@ QSize FashionTrayItem::wantedTotalSize() const
|
||||
if (m_controlWidget->expanded()) {
|
||||
if (dockPosition == Dock::Position::Top || dockPosition == Dock::Position::Bottom) {
|
||||
size.setWidth(
|
||||
SpliterSize * 2 // 两个分隔条
|
||||
+ m_controlWidget->sizeHint().width() // 控制按钮
|
||||
+ m_normalContainer->sizeHint().width() // 普通区域
|
||||
+ m_holdContainer->sizeHint().width() // 保留区域
|
||||
+ m_attentionContainer->sizeHint().width() // 活动区域
|
||||
);
|
||||
SpliterSize * 2 // 两个分隔条
|
||||
+ m_controlWidget->sizeHint().width() // 控制按钮
|
||||
+ m_normalContainer->sizeHint().width() // 普通区域
|
||||
+ m_holdContainer->sizeHint().width() // 保留区域
|
||||
+ m_attentionContainer->sizeHint().width() // 活动区域
|
||||
);
|
||||
size.setHeight(height());
|
||||
} else {
|
||||
size.setWidth(width());
|
||||
size.setHeight(
|
||||
SpliterSize * 2 // 两个分隔条
|
||||
+ m_controlWidget->sizeHint().height()// 控制按钮
|
||||
+ m_normalContainer->sizeHint().height() // 普通区域
|
||||
+ m_holdContainer->sizeHint().height() // 保留区域
|
||||
+ m_attentionContainer->sizeHint().height() // 活动区域
|
||||
);
|
||||
SpliterSize * 2 // 两个分隔条
|
||||
+ m_controlWidget->sizeHint().height()// 控制按钮
|
||||
+ m_normalContainer->sizeHint().height() // 普通区域
|
||||
+ m_holdContainer->sizeHint().height() // 保留区域
|
||||
+ m_attentionContainer->sizeHint().height() // 活动区域
|
||||
);
|
||||
}
|
||||
} else {
|
||||
if (dockPosition == Dock::Position::Top || dockPosition == Dock::Position::Bottom) {
|
||||
size.setWidth(
|
||||
SpliterSize * 2 // 两个分隔条
|
||||
+ TrayWidgetWidth // 控制按钮
|
||||
+ m_holdContainer->sizeHint().width() // 保留区域
|
||||
+ m_attentionContainer->sizeHint().width() // 活动区域
|
||||
);
|
||||
SpliterSize * 2 // 两个分隔条
|
||||
+ TrayWidgetWidth // 控制按钮
|
||||
+ m_holdContainer->sizeHint().width() // 保留区域
|
||||
+ m_attentionContainer->sizeHint().width() // 活动区域
|
||||
);
|
||||
size.setHeight(height());
|
||||
} else {
|
||||
size.setWidth(width());
|
||||
size.setHeight(
|
||||
SpliterSize * 2 // 两个分隔条
|
||||
+ TrayWidgetWidth // 控制按钮
|
||||
+ m_holdContainer->sizeHint().height() // 保留区域
|
||||
+ m_attentionContainer->sizeHint().height() // 活动区域
|
||||
);
|
||||
SpliterSize * 2 // 两个分隔条
|
||||
+ TrayWidgetWidth // 控制按钮
|
||||
+ m_holdContainer->sizeHint().height() // 保留区域
|
||||
+ m_attentionContainer->sizeHint().height() // 活动区域
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -372,6 +380,10 @@ void FashionTrayItem::requestResize()
|
||||
// reset property "FashionTraySize" to notify dock resize
|
||||
// DockPluginsController will watch this property
|
||||
setProperty("FashionTraySize", sizeHint());
|
||||
|
||||
m_leftSpace->setVisible(!m_controlWidget->expanded());
|
||||
|
||||
m_rightSpace->setVisible(!m_controlWidget->expanded() && m_holdContainer->isEmpty() && m_attentionContainer->isEmpty());
|
||||
}
|
||||
|
||||
void FashionTrayItem::refreshHoldContainerPosition()
|
||||
|
@ -96,6 +96,9 @@ private:
|
||||
|
||||
static int TrayWidgetWidth;
|
||||
static int TrayWidgetHeight;
|
||||
|
||||
QWidget *m_leftSpace;
|
||||
QWidget *m_rightSpace;
|
||||
};
|
||||
|
||||
#endif // FASHIONTRAYITEM_H
|
||||
|
@ -62,7 +62,7 @@ FashionTrayWidgetWrapper::FashionTrayWidgetWrapper(const QString &itemKey, Abstr
|
||||
connect(m_absTrayWidget, &AbstractTrayWidget::needAttention, this, &FashionTrayWidgetWrapper::onTrayWidgetNeedAttention);
|
||||
connect(m_absTrayWidget, &AbstractTrayWidget::clicked, this, &FashionTrayWidgetWrapper::onTrayWidgetClicked);
|
||||
|
||||
setFixedSize(PLUGIN_BACKGROUND_MAX_SIZE, PLUGIN_BACKGROUND_MAX_SIZE);
|
||||
setMinimumSize(PLUGIN_BACKGROUND_MIN_SIZE, PLUGIN_BACKGROUND_MIN_SIZE);
|
||||
}
|
||||
|
||||
AbstractTrayWidget *FashionTrayWidgetWrapper::absTrayWidget() const
|
||||
@ -100,7 +100,12 @@ void FashionTrayWidgetWrapper::paintEvent(QPaintEvent *event)
|
||||
const int radius = dstyle.pixelMetric(DStyle::PM_FrameRadius);
|
||||
|
||||
QPainterPath path;
|
||||
path.addRoundedRect(rect(), radius, radius);
|
||||
|
||||
int minSize = std::min(width(), height());
|
||||
QRect rc(0, 0, minSize, minSize);
|
||||
rc.moveTo(rect().center() - rc.center());
|
||||
|
||||
path.addRoundedRect(rc, radius, radius);
|
||||
painter.fillPath(path, color);
|
||||
}
|
||||
}
|
||||
@ -175,11 +180,11 @@ void FashionTrayWidgetWrapper::resizeEvent(QResizeEvent *event)
|
||||
const Dock::Position position = qApp->property(PROP_POSITION).value<Dock::Position>();
|
||||
// 保持横纵比
|
||||
if (position == Dock::Bottom || position == Dock::Top) {
|
||||
setMinimumHeight(PLUGIN_BACKGROUND_MIN_SIZE);
|
||||
setFixedWidth(height());
|
||||
setMaximumWidth(height());
|
||||
setMaximumHeight(QWIDGETSIZE_MAX);
|
||||
} else {
|
||||
setMinimumWidth(PLUGIN_BACKGROUND_MIN_SIZE);
|
||||
setFixedHeight(width());
|
||||
setMaximumHeight(width());
|
||||
setMaximumWidth(QWIDGETSIZE_MAX);
|
||||
}
|
||||
|
||||
QWidget::resizeEvent(event);
|
||||
|
Loading…
x
Reference in New Issue
Block a user