feat(mainwindow):modify mainwindow animation and position

This commit is contained in:
shaojun 2019-08-23 16:18:21 +08:00
parent 3f4425c051
commit f3d8494454
3 changed files with 74 additions and 42 deletions

View File

@ -173,6 +173,14 @@ const QRect DockSettings::primaryRect() const
return rect; return rect;
} }
const int DockSettings::dockMargin(const Position position) const
{
if (position == Dock::Efficient)
return 0;
return 10;
}
const QSize DockSettings::panelSize() const const QSize DockSettings::panelSize() const
{ {
return m_mainWindowSize; return m_mainWindowSize;
@ -193,26 +201,20 @@ const QRect DockSettings::windowRect(const Position position, const bool hide) c
const QRect primaryRect = this->primaryRect(); const QRect primaryRect = this->primaryRect();
const int offsetX = (primaryRect.width() - size.width()) / 2; const int offsetX = (primaryRect.width() - size.width()) / 2;
const int offsetY = (primaryRect.height() - size.height()) / 2; const int offsetY = (primaryRect.height() - size.height()) / 2;
const int margin = this->dockMargin(position);
QPoint p(0, 0); QPoint p(0, 0);
switch (position) { switch (position) {
case Top: { case Top:
if (m_displayMode == Dock::Efficient) p = QPoint(offsetX, margin);
p = QPoint(offsetX, 0);
else
p = QPoint(offsetX, 10);
}
break; break;
case Left: case Left:
p = QPoint(0, offsetY); break; p = QPoint(margin, offsetY);
break;
case Right: case Right:
p = QPoint(primaryRect.width() - size.width(), offsetY); break; p = QPoint(primaryRect.width() - size.width() - margin, offsetY);
case Bottom: { break;
if (m_displayMode == Dock::Efficient) case Bottom:
p = QPoint(offsetX, primaryRect.height() - size.height()); p = QPoint(offsetX, primaryRect.height() - size.height() - margin);
else
p = QPoint(offsetX, primaryRect.height() - size.height() - 10);
}
break; break;
default: Q_UNREACHABLE(); default: Q_UNREACHABLE();
} }

View File

@ -78,6 +78,7 @@ public:
inline const QSize windowSize() const { return m_mainWindowSize; } inline const QSize windowSize() const { return m_mainWindowSize; }
inline const quint8 Opacity() const { return m_opacity * 255; } inline const quint8 Opacity() const { return m_opacity * 255; }
inline const QSize fashionTraySize() const { return m_fashionTraySize; } inline const QSize fashionTraySize() const { return m_fashionTraySize; }
const int dockMargin(const Position position) const;
const QSize panelSize() const; const QSize panelSize() const;
const QRect windowRect(const Position position, const bool hide = false) const; const QRect windowRect(const Position position, const bool hide = false) const;

View File

@ -80,20 +80,19 @@ MainWindow::MainWindow(QWidget *parent)
m_sizeChangeAni(new QVariantAnimation(this)), m_sizeChangeAni(new QVariantAnimation(this)),
m_posChangeAni(new QVariantAnimation(this)), m_posChangeAni(new QVariantAnimation(this)),
m_panelShowAni(new QPropertyAnimation(m_mainPanel, "pos")), m_panelShowAni(new QPropertyAnimation(this, "pos")),
m_panelHideAni(new QPropertyAnimation(m_mainPanel, "pos")), m_panelHideAni(new QPropertyAnimation(this, "pos")),
m_xcbMisc(XcbMisc::instance()), m_xcbMisc(XcbMisc::instance()),
m_dbusDaemonInterface(QDBusConnection::sessionBus().interface()), m_dbusDaemonInterface(QDBusConnection::sessionBus().interface()),
m_sniWatcher(new StatusNotifierWatcher(SNI_WATCHER_SERVICE, SNI_WATCHER_PATH, QDBusConnection::sessionBus(), this)) m_sniWatcher(new StatusNotifierWatcher(SNI_WATCHER_SERVICE, SNI_WATCHER_PATH, QDBusConnection::sessionBus(), this))
{ {
setAccessibleName("dock-mainwindow"); setAccessibleName("dock-mainwindow");
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus);
setAttribute(Qt::WA_TranslucentBackground); setAttribute(Qt::WA_TranslucentBackground);
setMouseTracking(true); setMouseTracking(true);
setAcceptDrops(true); setAcceptDrops(true);
DPlatformWindowHandle::enableDXcbForWindow(this, true); DPlatformWindowHandle::enableDXcbForWindow(this, true);
m_platformWindowHandle.setEnableBlurWindow(false); m_platformWindowHandle.setEnableBlurWindow(true);
m_platformWindowHandle.setTranslucentBackground(true); m_platformWindowHandle.setTranslucentBackground(true);
m_platformWindowHandle.setWindowRadius(0); m_platformWindowHandle.setWindowRadius(0);
m_platformWindowHandle.setBorderWidth(0); m_platformWindowHandle.setBorderWidth(0);
@ -165,7 +164,7 @@ void MainWindow::showEvent(QShowEvent *e)
{ {
QWidget::showEvent(e); QWidget::showEvent(e);
m_platformWindowHandle.setEnableBlurWindow(false); // m_platformWindowHandle.setEnableBlurWindow(false);
m_platformWindowHandle.setShadowOffset(QPoint()); m_platformWindowHandle.setShadowOffset(QPoint());
m_platformWindowHandle.setShadowRadius(0); m_platformWindowHandle.setShadowRadius(0);
@ -454,7 +453,7 @@ void MainWindow::positionChanged(const Position prevPos)
QTimer::singleShot(200, this, [&] { QTimer::singleShot(200, this, [&] {
resetPanelEnvironment(false, true); resetPanelEnvironment(false, true);
updateGeometry(); updateGeometry();
expand(); // expand();
}); });
// set strut // set strut
@ -616,7 +615,7 @@ void MainWindow::setStrutPartial()
return; return;
} }
m_xcbMisc->set_strut_partial(winId(), orientation, strut, strutStart, strutEnd); m_xcbMisc->set_strut_partial(winId(), orientation, strut + m_settings->dockMargin(m_settings->position()), strutStart, strutEnd);
} }
void MainWindow::expand() void MainWindow::expand()
@ -626,18 +625,32 @@ void MainWindow::expand()
const auto showAniState = m_panelShowAni->state(); const auto showAniState = m_panelShowAni->state();
m_panelHideAni->stop(); m_panelHideAni->stop();
QPoint finishPos(0, 0); QPoint finishPos = pos();
QPoint startPos = pos();
resetPanelEnvironment(true, false); resetPanelEnvironment(true, false);
if (showAniState != QPropertyAnimation::Running && m_mainPanel->pos() != m_panelShowAni->currentValue()) { if (showAniState != QPropertyAnimation::Running && pos() != m_panelShowAni->currentValue()) {
QPoint startPos(0, 0); const Position position = m_settings->position();
const QSize &size = m_settings->windowSize(); const QRectF windowRect = m_settings->windowRect(position, true);
switch (m_settings->position()) { switch (m_settings->position()) {
case Top: startPos.setY(-size.height()); break; case Top:
case Bottom: startPos.setY(size.height()); break; startPos.setY(-size().height());
case Left: startPos.setX(-size.width()); break; finishPos.setY(windowRect.top());
case Right: startPos.setX(size.width()); break; break;
case Bottom:
startPos.setY(windowRect.bottom());
finishPos.setY(windowRect.bottom() - size().height());
break;
case Left:
startPos.setX(-size().width());
finishPos.setX(windowRect.left());
break;
case Right:
startPos.setX(windowRect.right());
finishPos.setX(windowRect.right() - size().width());
break;
} }
m_panelShowAni->setStartValue(startPos); m_panelShowAni->setStartValue(startPos);
@ -650,18 +663,16 @@ void MainWindow::expand()
void MainWindow::narrow(const Position prevPos) void MainWindow::narrow(const Position prevPos)
{ {
const QSize size = m_settings->panelSize(); QPoint finishPos = pos();
QPoint finishPos(0, 0);
switch (prevPos) { switch (prevPos) {
case Top: finishPos.setY(-size.height()); break; case Top: finishPos.setY(pos().y() - size().height()); break;
case Bottom: finishPos.setY(size.height()); break; case Bottom: finishPos.setY(pos().y() + size().height()); break;
case Left: finishPos.setX(-size.width()); break; case Left: finishPos.setX(pos().x() - size().width()); break;
case Right: finishPos.setX(size.width()); break; case Right: finishPos.setX(pos().x() + size().width()); break;
} }
m_panelShowAni->stop(); m_panelShowAni->stop();
m_panelHideAni->setStartValue(m_mainPanel->pos()); m_panelHideAni->setStartValue(pos());
m_panelHideAni->setEndValue(finishPos); m_panelHideAni->setEndValue(finishPos);
m_panelHideAni->start(); m_panelHideAni->start();
m_platformWindowHandle.setShadowRadius(0); m_platformWindowHandle.setShadowRadius(0);
@ -683,10 +694,12 @@ void MainWindow::resetPanelEnvironment(const bool visible, const bool resetPosit
m_mainPanel->setFixedSize(m_settings->panelSize()); m_mainPanel->setFixedSize(m_settings->panelSize());
QWidget::setFixedSize(r.size()); QWidget::setFixedSize(r.size());
m_posChangeAni->setEndValue(r.topLeft()); m_posChangeAni->setEndValue(r.topLeft());
QWidget::move(r.topLeft());
if (!resetPosition) if (!resetPosition)
return; return;
QWidget::move(r.topLeft());
QPoint finishPos(0, 0); QPoint finishPos(0, 0);
switch (position) { switch (position) {
case Top: finishPos.setY((visible ? 0 : -r.height())); break; case Top: finishPos.setY((visible ? 0 : -r.height())); break;
@ -703,8 +716,9 @@ void MainWindow::updatePanelVisible()
{ {
if (!m_updatePanelVisible) if (!m_updatePanelVisible)
return; return;
if (m_settings->hideMode() == KeepShowing) if (m_settings->hideMode() == KeepShowing) {
return expand(); return expand();
}
const Dock::HideState state = m_settings->hideState(); const Dock::HideState state = m_settings->hideState();
@ -715,9 +729,24 @@ void MainWindow::updatePanelVisible()
if (!m_settings->autoHide()) if (!m_settings->autoHide())
break; break;
QRect r(pos(), size()); QRectF r(pos(), size());
if (r.contains(QCursor::pos())) const int margin = m_settings->dockMargin(m_settings->position());
switch (m_settings->position()) {
case Dock::Top:
r.setY(r.y() - margin);
break; break;
case Dock::Bottom:
r.setHeight(r.height() + margin);
break;
case Dock::Left:
r.setX(r.x() - margin);
break;
case Dock::Right:
r.setWidth(r.width() + margin);
}
if (r.contains(QCursor::pos())) {
break;
}
return narrow(m_settings->position()); return narrow(m_settings->position());