filemanager/desktop/desktop.cpp

123 lines
3.8 KiB
C++
Raw Normal View History

2021-09-05 14:39:56 -07:00
/*
* Copyright (C) 2021 CutefishOS Team.
*
* Author: Reion Wong <reionwong@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "desktop.h"
2021-09-07 20:55:28 -07:00
#include <QQmlContext>
#include <QQmlEngine>
2021-09-05 14:39:56 -07:00
#include <QGuiApplication>
2021-09-07 20:55:28 -07:00
#include <QDBusServiceWatcher>
2021-09-05 14:39:56 -07:00
Desktop::Desktop(QObject *parent)
: QObject(parent)
2021-09-15 00:46:38 -07:00
, m_dockInterface("com.cutefish.Dock",
2021-09-07 20:55:28 -07:00
"/Dock",
2021-09-15 00:46:38 -07:00
"com.cutefish.Dock", QDBusConnection::sessionBus())
2021-09-07 20:55:28 -07:00
, m_leftMargin(0)
, m_rightMargin(0)
, m_bottomMargin(0)
2021-09-05 14:39:56 -07:00
{
2021-09-07 20:55:28 -07:00
if (m_dockInterface.isValid()) {
updateMargins();
connect(&m_dockInterface, SIGNAL(primaryGeometryChanged()), this, SLOT(updateMargins()));
connect(&m_dockInterface, SIGNAL(directionChanged()), this, SLOT(updateMargins()));
2021-09-10 23:41:22 -07:00
connect(&m_dockInterface, SIGNAL(visibilityChanged()), this, SLOT(updateMargins()));
2021-09-07 20:55:28 -07:00
} else {
2021-09-15 00:46:38 -07:00
QDBusServiceWatcher *watcher = new QDBusServiceWatcher("com.cutefish.Dock",
2021-09-07 20:55:28 -07:00
QDBusConnection::sessionBus(),
QDBusServiceWatcher::WatchForUnregistration,
this);
connect(watcher, &QDBusServiceWatcher::serviceUnregistered, this, [=] {
updateMargins();
connect(&m_dockInterface, SIGNAL(primaryGeometryChanged()), this, SLOT(updateMargins()));
connect(&m_dockInterface, SIGNAL(directionChanged()), this, SLOT(updateMargins()));
2021-09-10 23:41:22 -07:00
connect(&m_dockInterface, SIGNAL(visibilityChanged()), this, SLOT(updateMargins()));
2021-09-07 20:55:28 -07:00
});
}
2021-09-05 14:39:56 -07:00
for (QScreen *screen : QGuiApplication::screens()) {
screenAdded(screen);
}
connect(qApp, &QGuiApplication::screenAdded, this, &Desktop::screenAdded);
connect(qApp, &QGuiApplication::screenRemoved, this, &Desktop::screenRemoved);
}
2021-09-07 20:55:28 -07:00
int Desktop::leftMargin() const
{
return m_leftMargin;
}
int Desktop::rightMargin() const
{
return m_rightMargin;
}
int Desktop::bottomMargin() const
{
return m_bottomMargin;
}
2021-09-05 14:39:56 -07:00
void Desktop::screenAdded(QScreen *screen)
{
if (!m_list.contains(screen)) {
DesktopView *view = new DesktopView(screen);
2021-09-07 20:55:28 -07:00
view->engine()->rootContext()->setContextProperty("Desktop", this);
2021-09-05 14:39:56 -07:00
view->show();
m_list.insert(screen, view);
}
}
void Desktop::screenRemoved(QScreen *screen)
{
if (m_list.contains(screen)) {
DesktopView *view = m_list.find(screen).value();
view->setVisible(false);
view->deleteLater();
m_list.remove(screen);
}
}
2021-09-07 20:55:28 -07:00
void Desktop::updateMargins()
{
QRect dockGeometry = m_dockInterface.property("primaryGeometry").toRect();
int dockDirection = m_dockInterface.property("direction").toInt();
2021-09-10 23:41:22 -07:00
int visibility = m_dockInterface.property("visibility").toInt();
2021-09-07 20:55:28 -07:00
m_leftMargin = 0;
m_rightMargin = 0;
m_bottomMargin = 0;
2021-09-10 23:41:22 -07:00
// AlwaysHide
if (visibility == 1) {
emit marginsChanged();
return;
}
2021-09-07 20:55:28 -07:00
if (dockDirection == 0) {
m_leftMargin = dockGeometry.width();
} else if (dockDirection == 1) {
m_bottomMargin = dockGeometry.height();
} else if (dockDirection == 2) {
m_rightMargin = dockGeometry.width();
}
emit marginsChanged();
}