feat(dock): add window free scaling function

This commit is contained in:
wangxuwen 2019-08-26 16:15:50 +08:00
parent f4089b2073
commit dd7ef78dba
3 changed files with 114 additions and 9 deletions

View File

@ -85,6 +85,7 @@ public:
qreal dockRatio() const; qreal dockRatio() const;
void showDockSettingsMenu(); void showDockSettingsMenu();
QSize m_mainWindowSize;
signals: signals:
void dataChanged() const; void dataChanged() const;
@ -138,7 +139,6 @@ private:
DisplayMode m_displayMode; DisplayMode m_displayMode;
QRect m_primaryRawRect; QRect m_primaryRawRect;
QRect m_frontendRect; QRect m_frontendRect;
QSize m_mainWindowSize;
QSize m_fashionTraySize; QSize m_fashionTraySize;
WhiteMenu m_settingsMenu; WhiteMenu m_settingsMenu;

View File

@ -40,6 +40,10 @@
#define SNI_WATCHER_SERVICE "org.kde.StatusNotifierWatcher" #define SNI_WATCHER_SERVICE "org.kde.StatusNotifierWatcher"
#define SNI_WATCHER_PATH "/StatusNotifierWatcher" #define SNI_WATCHER_PATH "/StatusNotifierWatcher"
#define MAINWINDOW_MAX_SIZE (100)
#define MAINWINDOW_MIN_SIZE (40)
#define MAINWINDOW_DRAG_AREA_SIZE (2)
using org::kde::StatusNotifierWatcher; using org::kde::StatusNotifierWatcher;
const QPoint rawXPosition(const QPoint &scaledPos) const QPoint rawXPosition(const QPoint &scaledPos)
@ -84,7 +88,8 @@ MainWindow::MainWindow(QWidget *parent)
m_panelHideAni(new QPropertyAnimation(this, "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)),
m_dragStatus(false)
{ {
setAccessibleName("dock-mainwindow"); setAccessibleName("dock-mainwindow");
setAttribute(Qt::WA_TranslucentBackground); setAttribute(Qt::WA_TranslucentBackground);
@ -101,12 +106,12 @@ MainWindow::MainWindow(QWidget *parent)
m_settings = &DockSettings::Instance(); m_settings = &DockSettings::Instance();
m_xcbMisc->set_window_type(winId(), XcbMisc::Dock); m_xcbMisc->set_window_type(winId(), XcbMisc::Dock);
m_size = m_settings->m_mainWindowSize;
initSNIHost(); initSNIHost();
initComponents(); initComponents();
initConnections(); initConnections();
m_mainPanel->setFixedSize(m_settings->panelSize()); resizeMainPanelWindow();
for (auto item : DockItemManager::instance()->itemList()) for (auto item : DockItemManager::instance()->itemList())
m_mainPanel->insertItem(-1, item); m_mainPanel->insertItem(-1, item);
@ -194,6 +199,10 @@ void MainWindow::mousePressEvent(QMouseEvent *e)
if (e->button() == Qt::RightButton) if (e->button() == Qt::RightButton)
m_settings->showDockSettingsMenu(); m_settings->showDockSettingsMenu();
if ((e->button() == Qt::LeftButton) && (!getNoneResizeRegion().contains(e->pos()))) {
m_resizePoint = e->globalPos();
m_dragStatus = true;
}
} }
void MainWindow::keyPressEvent(QKeyEvent *e) void MainWindow::keyPressEvent(QKeyEvent *e)
@ -218,9 +227,9 @@ void MainWindow::enterEvent(QEvent *e)
void MainWindow::leaveEvent(QEvent *e) void MainWindow::leaveEvent(QEvent *e)
{ {
QWidget::leaveEvent(e); QWidget::leaveEvent(e);
m_expandDelayTimer->stop(); m_expandDelayTimer->stop();
m_leaveDelayTimer->start(); m_leaveDelayTimer->start();
setCursor(Qt::ArrowCursor);
} }
void MainWindow::dragEnterEvent(QDragEnterEvent *e) void MainWindow::dragEnterEvent(QDragEnterEvent *e)
@ -492,7 +501,7 @@ void MainWindow::updateGeometry()
// m_mainPanel->updateDockDisplayMode(m_settings->displayMode()); // m_mainPanel->updateDockDisplayMode(m_settings->displayMode());
// m_mainPanel->updateDockPosition(position); // m_mainPanel->updateDockPosition(position);
// this->setFixedSize has been overridden for size animation // this->setFixedSize has been overridden for size animation
m_mainPanel->setFixedSize(m_settings->panelSize()); resizeMainPanelWindow();
bool animation = true; bool animation = true;
bool isHide = m_settings->hideState() == Hide && !testAttribute(Qt::WA_UnderMouse); bool isHide = m_settings->hideState() == Hide && !testAttribute(Qt::WA_UnderMouse);
@ -691,7 +700,7 @@ void MainWindow::resetPanelEnvironment(const bool visible, const bool resetPosit
const QRect r(m_settings->windowRect(position)); const QRect r(m_settings->windowRect(position));
m_sizeChangeAni->setEndValue(r.size()); m_sizeChangeAni->setEndValue(r.size());
m_mainPanel->setFixedSize(m_settings->panelSize()); resizeMainPanelWindow();
QWidget::setFixedSize(r.size()); QWidget::setFixedSize(r.size());
m_posChangeAni->setEndValue(r.topLeft()); m_posChangeAni->setEndValue(r.topLeft());
@ -703,9 +712,9 @@ void MainWindow::resetPanelEnvironment(const bool visible, const bool resetPosit
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;
case Bottom: finishPos.setY(visible ? 0 : r.height()); break; case Bottom: finishPos.setY(visible ? MAINWINDOW_DRAG_AREA_SIZE * 2 : r.height()); break;
case Left: finishPos.setX((visible ? 0 : -r.width())); break; case Left: finishPos.setX((visible ? 0 : -r.width())); break;
case Right: finishPos.setX(visible ? 0 : r.width()); break; case Right: finishPos.setX(visible ? MAINWINDOW_DRAG_AREA_SIZE * 2 : r.width()); break;
} }
m_mainPanel->move(finishPos); m_mainPanel->move(finishPos);
@ -814,3 +823,91 @@ void MainWindow::setComposite(const bool hasComposite)
m_sizeChangeAni->setDuration(hasComposite ? 300 : 0); m_sizeChangeAni->setDuration(hasComposite ? 300 : 0);
} }
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
QPoint mousePoint = event->pos();
QRect r = getNoneResizeRegion();
if (!r.contains(mousePoint) || (m_dragStatus == true)) {
if ((Dock::Top == m_settings->position()) || (Dock::Bottom == m_settings->position())) {
setCursor(Qt::SizeVerCursor);
} else {
setCursor(Qt::SizeHorCursor);
}
} else {
setCursor(Qt::ArrowCursor);
}
if (m_dragStatus) {
//int xdiff = QCursor::pos().x() - m_resizePoint.x();
int ydiff = QCursor::pos().y() - m_resizePoint.y();
if (Dock::Top == m_settings->position()) {
m_settings->m_mainWindowSize.setHeight(qBound(MAINWINDOW_MIN_SIZE,m_size.height() + ydiff, MAINWINDOW_MAX_SIZE));
m_settings->m_mainWindowSize.setWidth(width());
} else if (Dock::Bottom == m_settings->position()) {
m_settings->m_mainWindowSize.setHeight(qBound(MAINWINDOW_MIN_SIZE,m_size.height() - ydiff, MAINWINDOW_MAX_SIZE));
m_settings->m_mainWindowSize.setWidth(width());
} else if (Dock::Left == m_settings->position()) {
} else {
}
resizeMainWindow();
}
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
m_dragStatus = false;
m_size = m_settings->m_mainWindowSize;
setStrutPartial();
setCursor(Qt::ArrowCursor);
}
QRect MainWindow::getNoneResizeRegion()
{
QRect r;
switch (m_settings->position()) {
case Dock::Top:
r.setRect(0, 0, width(), height() - MAINWINDOW_DRAG_AREA_SIZE);
break;
case Dock::Bottom:
r.setRect(0, MAINWINDOW_DRAG_AREA_SIZE, width(), height() - MAINWINDOW_DRAG_AREA_SIZE);
break;
case Dock::Left:
r.setRect(0, 0, width() - MAINWINDOW_DRAG_AREA_SIZE, height());
break;
case Dock::Right:
r.setRect(MAINWINDOW_DRAG_AREA_SIZE, 0, width() - MAINWINDOW_DRAG_AREA_SIZE, height());
break;
default: break;
}
return r;
}
void MainWindow::resizeMainWindow()
{
const Position position = m_settings->position();
QSize size = m_settings->windowSize();
const QRect windowRect = m_settings->windowRect(position, false);
resizeMainPanelWindow();
internalMove(windowRect.topLeft());
QWidget::setFixedSize(size);
}
void MainWindow::resizeMainPanelWindow()
{
switch (m_settings->position()) {
case Dock::Top:
case Dock::Bottom:
m_mainPanel->setFixedSize(m_settings->panelSize() - QSize(0, MAINWINDOW_DRAG_AREA_SIZE * 2));
break;
case Dock::Left:
case Dock::Right:
m_mainPanel->setFixedSize(m_settings->panelSize() - QSize(MAINWINDOW_DRAG_AREA_SIZE * 2, 0));
break;
default: break;
}
}

View File

@ -66,16 +66,21 @@ private:
void enterEvent(QEvent *e); void enterEvent(QEvent *e);
void leaveEvent(QEvent *e); void leaveEvent(QEvent *e);
void dragEnterEvent(QDragEnterEvent *e); void dragEnterEvent(QDragEnterEvent *e);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void setFixedSize(const QSize &size); void setFixedSize(const QSize &size);
void internalAnimationMove(int x, int y); void internalAnimationMove(int x, int y);
void initSNIHost(); void initSNIHost();
void initComponents(); void initComponents();
void initConnections(); void initConnections();
void resizeMainWindow();
void resizeMainPanelWindow();
const QPoint x11GetWindowPos(); const QPoint x11GetWindowPos();
void x11MoveWindow(const int x, const int y); void x11MoveWindow(const int x, const int y);
void x11MoveResizeWindow(const int x, const int y, const int w, const int h); void x11MoveResizeWindow(const int x, const int y, const int w, const int h);
QRect getNoneResizeRegion();
signals: signals:
void panelGeometryChanged(); void panelGeometryChanged();
@ -123,6 +128,9 @@ private:
QDBusConnectionInterface *m_dbusDaemonInterface; QDBusConnectionInterface *m_dbusDaemonInterface;
org::kde::StatusNotifierWatcher *m_sniWatcher; org::kde::StatusNotifierWatcher *m_sniWatcher;
QString m_sniHostService; QString m_sniHostService;
bool m_dragStatus;
QPoint m_resizePoint;
QSize m_size;
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H