feat(tray):tray layout

This commit is contained in:
shaojun 2019-09-06 11:20:14 +08:00
parent d77226cb6d
commit 0277d1404f
8 changed files with 82 additions and 40 deletions

View File

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

View File

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

View File

@ -22,6 +22,8 @@ bool AttentionContainer::acceptWrapper(FashionTrayWidgetWrapper *wrapper)
void AttentionContainer::refreshVisible()
{
AbstractContainer::refreshVisible();
setVisible(!isEmpty());
}

View File

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

View File

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

View File

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

View File

@ -96,6 +96,9 @@ private:
static int TrayWidgetWidth;
static int TrayWidgetHeight;
QWidget *m_leftSpace;
QWidget *m_rightSpace;
};
#endif // FASHIONTRAYITEM_H

View File

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