summaryrefslogtreecommitdiff
path: root/src/managers/AnimationManager.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-05-15 14:18:31 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-05-15 14:18:31 +0200
commitd7ad80e6a2ee25bdc524c0012937d73725f5ad2f (patch)
treea5a41fc6072d225815cacb468b345e62140f2fd4 /src/managers/AnimationManager.cpp
parentcba4693d390da71c0d4fc743436c455c601fec9d (diff)
Added window animation rules
Diffstat (limited to 'src/managers/AnimationManager.cpp')
-rw-r--r--src/managers/AnimationManager.cpp105
1 files changed, 72 insertions, 33 deletions
diff --git a/src/managers/AnimationManager.cpp b/src/managers/AnimationManager.cpp
index 686d80dd..20302da6 100644
--- a/src/managers/AnimationManager.cpp
+++ b/src/managers/AnimationManager.cpp
@@ -203,52 +203,91 @@ bool CAnimationManager::deltazero(const CColor& a, const CColor& b) {
return a.r == b.r && a.g == b.g && a.b == b.b && a.a == b.a;
}
+//
+// Anims
+//
+//
-// animation on events
-void CAnimationManager::onWindowPostCreate(CWindow* pWindow) {
- auto ANIMSTYLE = g_pConfigManager->getString("animations:windows_style");
- transform(ANIMSTYLE.begin(), ANIMSTYLE.end(), ANIMSTYLE.begin(), ::tolower);
+void CAnimationManager::animationPopin(CWindow* pWindow) {
+ const auto GOALPOS = pWindow->m_vRealPosition.goalv();
+ const auto GOALSIZE = pWindow->m_vRealSize.goalv();
- // if the window is not being animated, that means the layout set a fixed size for it, don't animate.
- if (!pWindow->m_vRealPosition.isBeingAnimated() && !pWindow->m_vRealSize.isBeingAnimated())
- return;
+ pWindow->m_vRealPosition.setValue(GOALPOS + GOALSIZE / 2.f);
+ pWindow->m_vRealSize.setValue(Vector2D(5, 5));
+}
+
+void CAnimationManager::animationSlide(CWindow* pWindow, std::string force) {
+ pWindow->m_vRealSize.warp(); // size we preserve in slide
const auto GOALPOS = pWindow->m_vRealPosition.goalv();
const auto GOALSIZE = pWindow->m_vRealSize.goalv();
- if (ANIMSTYLE == "slide") {
- pWindow->m_vRealSize.warp(); // size we preserve in slide
+ const auto PMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID);
+
+ if (force != "") {
+ if (force == "bottom") pWindow->m_vRealPosition.setValue(Vector2D(GOALPOS.x, PMONITOR->vecPosition.y + PMONITOR->vecSize.y));
+ else if (force == "left") pWindow->m_vRealPosition.setValue(GOALPOS - Vector2D(GOALSIZE.x, 0));
+ else if (force == "right") pWindow->m_vRealPosition.setValue(GOALPOS + Vector2D(GOALSIZE.x, 0));
+ else pWindow->m_vRealPosition.setValue(Vector2D(GOALPOS.x, PMONITOR->vecPosition.y - GOALSIZE.y));
+
+ return;
+ }
+
+ const auto MIDPOINT = GOALPOS + GOALSIZE / 2.f;
+
+ // check sides it touches
+ const bool DISPLAYLEFT = STICKS(pWindow->m_vPosition.x, PMONITOR->vecPosition.x + PMONITOR->vecReservedTopLeft.x);
+ const bool DISPLAYRIGHT = STICKS(pWindow->m_vPosition.x + pWindow->m_vSize.x, PMONITOR->vecPosition.x + PMONITOR->vecSize.x - PMONITOR->vecReservedBottomRight.x);
+ const bool DISPLAYTOP = STICKS(pWindow->m_vPosition.y, PMONITOR->vecPosition.y + PMONITOR->vecReservedTopLeft.y);
+ const bool DISPLAYBOTTOM = STICKS(pWindow->m_vPosition.y + pWindow->m_vSize.y, PMONITOR->vecPosition.y + PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y);
- const auto MIDPOINT = GOALPOS + GOALSIZE / 2.f;
+ if (DISPLAYBOTTOM && DISPLAYTOP) {
+ if (DISPLAYLEFT && DISPLAYRIGHT) {
+ pWindow->m_vRealPosition.setValue(GOALPOS + Vector2D(0, GOALSIZE.y));
+ } else if (DISPLAYLEFT) {
+ pWindow->m_vRealPosition.setValue(GOALPOS - Vector2D(GOALSIZE.x, 0));
+ } else {
+ pWindow->m_vRealPosition.setValue(GOALPOS + Vector2D(GOALSIZE.x, 0));
+ }
+ } else if (DISPLAYTOP) {
+ pWindow->m_vRealPosition.setValue(GOALPOS - Vector2D(0, GOALSIZE.y));
+ } else if (DISPLAYBOTTOM) {
+ pWindow->m_vRealPosition.setValue(GOALPOS + Vector2D(0, GOALSIZE.y));
+ } else {
+ if (MIDPOINT.y > PMONITOR->vecPosition.y + PMONITOR->vecSize.y / 2.f)
+ pWindow->m_vRealPosition.setValue(Vector2D(GOALPOS.x, PMONITOR->vecPosition.y + PMONITOR->vecSize.y));
+ else
+ pWindow->m_vRealPosition.setValue(Vector2D(GOALPOS.x, PMONITOR->vecPosition.y - GOALSIZE.y));
+ }
+}
+
+void CAnimationManager::onWindowPostCreate(CWindow* pWindow) {
+ auto ANIMSTYLE = g_pConfigManager->getString("animations:windows_style");
+ transform(ANIMSTYLE.begin(), ANIMSTYLE.end(), ANIMSTYLE.begin(), ::tolower);
- // check sides it touches
- const auto PMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID);
- const bool DISPLAYLEFT = STICKS(pWindow->m_vPosition.x, PMONITOR->vecPosition.x + PMONITOR->vecReservedTopLeft.x);
- const bool DISPLAYRIGHT = STICKS(pWindow->m_vPosition.x + pWindow->m_vSize.x, PMONITOR->vecPosition.x + PMONITOR->vecSize.x - PMONITOR->vecReservedBottomRight.x);
- const bool DISPLAYTOP = STICKS(pWindow->m_vPosition.y, PMONITOR->vecPosition.y + PMONITOR->vecReservedTopLeft.y);
- const bool DISPLAYBOTTOM = STICKS(pWindow->m_vPosition.y + pWindow->m_vSize.y, PMONITOR->vecPosition.y + PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y);
+ // if the window is not being animated, that means the layout set a fixed size for it, don't animate.
+ if (!pWindow->m_vRealPosition.isBeingAnimated() && !pWindow->m_vRealSize.isBeingAnimated())
+ return;
- if (DISPLAYBOTTOM && DISPLAYTOP) {
- if (DISPLAYLEFT && DISPLAYRIGHT) {
- pWindow->m_vRealPosition.setValue(GOALPOS + Vector2D(0, GOALSIZE.y));
- } else if (DISPLAYLEFT) {
- pWindow->m_vRealPosition.setValue(GOALPOS - Vector2D(GOALSIZE.x, 0));
+ if (pWindow->m_sAdditionalConfigData.animationStyle != "") {
+ // the window has config'd special anim
+ if (pWindow->m_sAdditionalConfigData.animationStyle.find("slide") == 0) {
+ if (pWindow->m_sAdditionalConfigData.animationStyle.find(' ') != std::string::npos) {
+ // has a direction
+ animationSlide(pWindow, pWindow->m_sAdditionalConfigData.animationStyle.substr(pWindow->m_sAdditionalConfigData.animationStyle.find(' ') + 1));
} else {
- pWindow->m_vRealPosition.setValue(GOALPOS + Vector2D(GOALSIZE.x, 0));
+ animationSlide(pWindow);
}
- } else if (DISPLAYTOP) {
- pWindow->m_vRealPosition.setValue(GOALPOS - Vector2D(0, GOALSIZE.y));
- } else if (DISPLAYBOTTOM) {
- pWindow->m_vRealPosition.setValue(GOALPOS + Vector2D(0, GOALSIZE.y));
} else {
- if (MIDPOINT.y > PMONITOR->vecPosition.y + PMONITOR->vecSize.y / 2.f)
- pWindow->m_vRealPosition.setValue(Vector2D(GOALPOS.x, PMONITOR->vecPosition.y + PMONITOR->vecSize.y));
- else
- pWindow->m_vRealPosition.setValue(Vector2D(GOALPOS.x, PMONITOR->vecPosition.y - GOALSIZE.y));
+ // anim popin, fallback
+ animationPopin(pWindow);
}
} else {
- // anim popin, fallback
- pWindow->m_vRealPosition.setValue(GOALPOS + GOALSIZE / 2.f);
- pWindow->m_vRealSize.setValue(Vector2D(5, 5));
+ if (ANIMSTYLE == "slide") {
+ animationSlide(pWindow);
+ } else {
+ // anim popin, fallback
+ animationPopin(pWindow);
+ }
}
} \ No newline at end of file