mirror of
https://github.com/KDE/latte-dock.git
synced 2025-03-05 00:58:20 +03:00
Visibility manager has been implemented, but need integration on qml
This commit is contained in:
parent
40888f827c
commit
0735a73cac
@ -1,42 +1,135 @@
|
|||||||
#include "visibilitymanager.h"
|
#include "visibilitymanager.h"
|
||||||
#include "visibilitymanager_p.h"
|
#include "visibilitymanager_p.h"
|
||||||
|
#include "windowinfowrap.h"
|
||||||
|
|
||||||
|
#include "../liblattedock/extras.h"
|
||||||
|
|
||||||
namespace Latte {
|
namespace Latte {
|
||||||
|
|
||||||
//! BEGIN: VisiblityManagerPrivate implementation
|
//! BEGIN: VisiblityManagerPrivate implementation
|
||||||
VisibilityManagerPrivate::VisibilityManagerPrivate(PlasmaQuick::ContainmentView *view, VisibilityManager *q)
|
VisibilityManagerPrivate::VisibilityManagerPrivate(PlasmaQuick::ContainmentView *view, VisibilityManager *q)
|
||||||
: QObject(view), q(q)
|
: QObject(view), q(q), view(view), wm(AbstractWindowInterface::getInstance(view, nullptr))
|
||||||
{
|
{
|
||||||
|
timerCheckWindows.setInterval(350);
|
||||||
|
timerCheckWindows.setSingleShot(true);
|
||||||
|
|
||||||
|
timerShow.setSingleShot(true);
|
||||||
|
timerHide.setSingleShot(true);
|
||||||
|
|
||||||
|
restoreConfig();
|
||||||
|
|
||||||
|
connect(&timerCheckWindows, &QTimer::timeout, this, &VisibilityManagerPrivate::checkAllWindows);
|
||||||
|
connect(&timerShow, &QTimer::timeout, q, &VisibilityManager::mustBeShown);
|
||||||
|
connect(&timerHide, &QTimer::timeout, q, &VisibilityManager::mustBeHide);
|
||||||
}
|
}
|
||||||
|
|
||||||
VisibilityManagerPrivate::~VisibilityManagerPrivate()
|
VisibilityManagerPrivate::~VisibilityManagerPrivate()
|
||||||
{
|
{
|
||||||
|
wm->removeDockStruts();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisibilityManagerPrivate::setMode(Dock::Visibility mode)
|
inline void VisibilityManagerPrivate::setMode(Dock::Visibility mode)
|
||||||
{
|
{
|
||||||
|
if (this->mode == mode)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// clear mode
|
||||||
|
if (this->mode == Dock::AlwaysVisible)
|
||||||
|
wm->removeDockStruts();
|
||||||
|
|
||||||
|
for (auto &c : connections) {
|
||||||
|
disconnect(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
timerShow.stop();
|
||||||
|
timerHide.stop();
|
||||||
|
timerCheckWindows.stop();
|
||||||
|
|
||||||
|
this->mode = mode;
|
||||||
|
|
||||||
|
switch (this->mode) {
|
||||||
|
case Dock::AlwaysVisible:
|
||||||
|
{
|
||||||
|
wm->setDockStruts(dockRect, view->location());
|
||||||
|
raiseDock(true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Dock::AutoHide:
|
||||||
|
{
|
||||||
|
raiseDock(true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Dock::DodgeActive:
|
||||||
|
{
|
||||||
|
connections[0] = connect(wm.get(), &AbstractWindowInterface::activeWindowChanged
|
||||||
|
, this, &VisibilityManagerPrivate::dodgeActive);
|
||||||
|
connections[1] = connect(wm.get(), &AbstractWindowInterface::windowChanged
|
||||||
|
, this, &VisibilityManagerPrivate::dodgeActive);
|
||||||
|
|
||||||
|
dodgeActive(wm->activeWindow());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Dock::DodgeMaximized:
|
||||||
|
{
|
||||||
|
connections[0] = connect(wm.get(), &AbstractWindowInterface::windowChanged
|
||||||
|
, this, &VisibilityManagerPrivate::dodgeMaximized);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Dock::DodgeAllWindows:
|
||||||
|
{
|
||||||
|
for(const auto & wid : wm->windows()) {
|
||||||
|
windows.insert({wid, wm->requestInfo(wid)});
|
||||||
|
}
|
||||||
|
|
||||||
|
connections[0] = connect(wm.get(), &AbstractWindowInterface::windowChanged
|
||||||
|
, this, &VisibilityManagerPrivate::dodgeWindows);
|
||||||
|
|
||||||
|
connections[1] = connect(wm.get(), &AbstractWindowInterface::windowRemoved
|
||||||
|
, this, [&](WId wid) {
|
||||||
|
windows.erase(wid);
|
||||||
|
timerCheckWindows.start();
|
||||||
|
});
|
||||||
|
connections[2] = connect(wm.get(), &AbstractWindowInterface::windowAdded
|
||||||
|
, this, [&](WId wid) {
|
||||||
|
windows.insert({wid, wm->requestInfo(wid)});
|
||||||
|
timerCheckWindows.start();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
saveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisibilityManagerPrivate::setIsHidden(bool isHidden)
|
inline void VisibilityManagerPrivate::setIsHidden(bool isHidden)
|
||||||
{
|
{
|
||||||
|
if (this->isHidden == isHidden)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this->isHidden = isHidden;
|
||||||
|
emit q->isHiddenChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisibilityManagerPrivate::setTimerShow(int msec)
|
inline void VisibilityManagerPrivate::setTimerShow(int msec)
|
||||||
{
|
{
|
||||||
|
timerShow.setInterval(msec);
|
||||||
|
saveConfig();
|
||||||
|
emit q->timerShowChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisibilityManagerPrivate::setTimerHide(int msec)
|
inline void VisibilityManagerPrivate::setTimerHide(int msec)
|
||||||
{
|
{
|
||||||
|
timerHide.setInterval(msec);
|
||||||
|
saveConfig();
|
||||||
|
emit q->timerHideChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisibilityManagerPrivate::raiseDock(bool raise)
|
inline void VisibilityManagerPrivate::raiseDock(bool raise)
|
||||||
{
|
{
|
||||||
|
// possible optimization
|
||||||
|
/* if (!isHidden == raise) {
|
||||||
|
return;
|
||||||
|
} */
|
||||||
|
|
||||||
if (raise) {
|
if (raise) {
|
||||||
timerHide.stop();
|
timerHide.stop();
|
||||||
|
|
||||||
@ -50,44 +143,116 @@ void VisibilityManagerPrivate::raiseDock(bool raise)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisibilityManagerPrivate::setDockRect(const QRect &rect)
|
inline void VisibilityManagerPrivate::setDockRect(const QRect &dockRect)
|
||||||
{
|
{
|
||||||
|
if (!view->containment() || this->dockRect == dockRect)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this->dockRect = dockRect;
|
||||||
|
|
||||||
|
if (mode == Dock::AlwaysVisible) {
|
||||||
|
wm->setDockStruts(this->dockRect, view->containment()->location());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisibilityManagerPrivate::windowAdded(WId id)
|
void VisibilityManagerPrivate::dodgeActive(WId wid)
|
||||||
{
|
{
|
||||||
|
if (wid != wm->activeWindow())
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto winfo = wm->requestInfo(wid);
|
||||||
|
|
||||||
|
if (!winfo.isValid() || !winfo.isOnCurrentDesktop() || winfo.isMinimized())
|
||||||
|
return;
|
||||||
|
|
||||||
|
raiseDock(intersects(winfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisibilityManagerPrivate::dodgeActive(WId id)
|
void VisibilityManagerPrivate::dodgeMaximized(WId wid)
|
||||||
{
|
{
|
||||||
|
auto winfo = wm->requestInfo(wid);
|
||||||
|
|
||||||
|
if (!winfo.isValid() || !winfo.isOnCurrentDesktop() || winfo.isMinimized())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (winfo.isMaximized())
|
||||||
|
raiseDock(false);
|
||||||
|
else
|
||||||
|
timerCheckWindows.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisibilityManagerPrivate::dodgeWindows(WId id)
|
void VisibilityManagerPrivate::dodgeWindows(WId wid)
|
||||||
{
|
{
|
||||||
|
auto winfo = wm->requestInfo(wid);
|
||||||
|
|
||||||
|
if (!winfo.isValid() || !winfo.isOnCurrentDesktop() || winfo.isMinimized())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (intersects(winfo))
|
||||||
|
raiseDock(false);
|
||||||
|
else
|
||||||
|
timerCheckWindows.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisibilityManagerPrivate::checkAllWindows()
|
void VisibilityManagerPrivate::checkAllWindows()
|
||||||
{
|
{
|
||||||
|
bool raise{true};
|
||||||
|
|
||||||
|
for (const auto &winfo : windows) {
|
||||||
|
//! std::pair<WId, WindowInfoWrap>
|
||||||
|
if (!std::get<1>(winfo).isValid() || !std::get<1>(winfo).isOnCurrentDesktop())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (std::get<1>(winfo).isFullscreen()) {
|
||||||
|
raise = false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
} else if (std::get<1>(winfo).isMinimized()) {
|
||||||
|
continue;
|
||||||
|
|
||||||
|
} else if (mode == Dock::DodgeMaximized) {
|
||||||
|
if (std::get<1>(winfo).isMaximized())
|
||||||
|
raise = false;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
} else if (intersects(std::get<1>(winfo))) {
|
||||||
|
raise = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
raiseDock(raise);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VisibilityManagerPrivate::intersects(const WindowInfoWrap &info)
|
inline bool VisibilityManagerPrivate::intersects(const WindowInfoWrap &winfo)
|
||||||
{
|
{
|
||||||
|
return winfo.geometry().intersects(dockRect);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisibilityManagerPrivate::saveConfig()
|
inline void VisibilityManagerPrivate::saveConfig()
|
||||||
{
|
{
|
||||||
|
if (!view->containment())
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto config = view->containment()->config();
|
||||||
|
|
||||||
|
config.writeEntry("visibility", static_cast<int>(mode));
|
||||||
|
config.writeEntry("timerShow", timerShow.interval());
|
||||||
|
config.writeEntry("timerHide", timerHide.interval());
|
||||||
|
|
||||||
|
view->containment()->configNeedsSaving();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisibilityManagerPrivate::restoreConfig()
|
inline void VisibilityManagerPrivate::restoreConfig()
|
||||||
{
|
{
|
||||||
|
if (!view->containment())
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto config = view->containment()->config();
|
||||||
|
|
||||||
|
mode = static_cast<Dock::Visibility>(config.readEntry("visibility", static_cast<int>(Dock::DodgeActive)));
|
||||||
|
timerShow.setInterval(config.readEntry("timerShow", 0));
|
||||||
|
timerHide.setInterval(config.readEntry("timerHide", 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VisibilityManagerPrivate::event(QEvent *ev)
|
bool VisibilityManagerPrivate::event(QEvent *ev)
|
||||||
@ -139,7 +304,7 @@ bool VisibilityManager::isHidden() const
|
|||||||
return d->isHidden;
|
return d->isHidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisibilityManager::setHidden(bool isHidden)
|
void VisibilityManager::setIsHidden(bool isHidden)
|
||||||
{
|
{
|
||||||
d->setIsHidden(isHidden);
|
d->setIsHidden(isHidden);
|
||||||
}
|
}
|
||||||
|
@ -3,9 +3,10 @@
|
|||||||
|
|
||||||
#include "../liblattedock/dock.h"
|
#include "../liblattedock/dock.h"
|
||||||
#include "windowinfowrap.h"
|
#include "windowinfowrap.h"
|
||||||
|
#include "abstractwindowinterface.h"
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
@ -28,6 +29,7 @@ public:
|
|||||||
~VisibilityManagerPrivate();
|
~VisibilityManagerPrivate();
|
||||||
|
|
||||||
void setMode(Dock::Visibility mode);
|
void setMode(Dock::Visibility mode);
|
||||||
|
void setIsHidden(bool isHidden);
|
||||||
void setTimerShow(int msec);
|
void setTimerShow(int msec);
|
||||||
void setTimerHide(int msec);
|
void setTimerHide(int msec);
|
||||||
|
|
||||||
@ -37,10 +39,11 @@ public:
|
|||||||
|
|
||||||
void windowAdded(WId id);
|
void windowAdded(WId id);
|
||||||
void dodgeActive(WId id);
|
void dodgeActive(WId id);
|
||||||
|
void dodgeMaximized(WId id);
|
||||||
void dodgeWindows(WId id);
|
void dodgeWindows(WId id);
|
||||||
void checkAllWindows();
|
void checkAllWindows();
|
||||||
|
|
||||||
bool intersects(const WindowInfoWrap &info);
|
bool intersects(const WindowInfoWrap &winfo);
|
||||||
|
|
||||||
void saveConfig();
|
void saveConfig();
|
||||||
void restoreConfig();
|
void restoreConfig();
|
||||||
@ -48,9 +51,11 @@ public:
|
|||||||
bool event(QEvent *ev) override;
|
bool event(QEvent *ev) override;
|
||||||
|
|
||||||
VisibilityManager *q;
|
VisibilityManager *q;
|
||||||
|
PlasmaQuick::ContainmentView *view;
|
||||||
|
std::unique_ptr<AbstractWindowInterface> wm;
|
||||||
Dock::Visibility mode{Dock::DodgeActive};
|
Dock::Visibility mode{Dock::DodgeActive};
|
||||||
std::array<QMetaObject::Connection, 4> connections;
|
std::array<QMetaObject::Connection, 4> connections;
|
||||||
std::unordered_map<WId, std::unique_ptr<WindowInfoWrap>> windows;
|
std::unordered_map<WId, WindowInfoWrap> windows;
|
||||||
QTimer timerShow;
|
QTimer timerShow;
|
||||||
QTimer timerHide;
|
QTimer timerHide;
|
||||||
QTimer timerCheckWindows;
|
QTimer timerCheckWindows;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user