Visibility manager has been implemented, but need integration on qml

v0.6
audoban 8 years ago
parent 3f0dcaa47d
commit 0a62508aa9

@ -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…
Cancel
Save