chore: add layout cxx skeleton

This commit is contained in:
Mikhail Zolotukhin 2022-03-27 16:02:35 +03:00 committed by Genda
parent 5b79638032
commit 6a61242a5f
20 changed files with 241 additions and 33 deletions

View File

@ -1,5 +1,7 @@
# SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
# SPDX-License-Identifier: MIT
add_subdirectory(layout)
target_sources(bismuth_core PRIVATE engine.cpp windows_list.cpp window.cpp
surface.cpp)

View File

@ -0,0 +1,5 @@
# SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
# SPDX-License-Identifier: MIT
target_sources(bismuth_core PRIVATE layout.cpp monocle.cpp stacked.cpp
layout_list.cpp)

View File

@ -0,0 +1,9 @@
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
// SPDX-License-Identifier: MIT
#include "layout.hpp"
namespace Bismuth
{
}

View File

@ -0,0 +1,23 @@
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
// SPDX-License-Identifier: MIT
#pragma once
#include <QRect>
#include <vector>
#include "engine/window.hpp"
namespace Bismuth
{
class Layout
{
public:
/**
* Apply layout for the @p windows on tiling @p area. Method changes the
* geometry of the windows to match the particular layout.
*/
virtual void apply(QRect area, std::vector<Window> &windows) = 0;
};
}

View File

@ -0,0 +1,23 @@
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
// SPDX-License-Identifier: MIT
#include "layout_list.hpp"
#include "engine/layout/stacked.hpp"
#include <memory>
namespace Bismuth
{
const Layout &LayoutList::layoutOnSurface(const Surface &surface) const
{
auto &layout = m_layouts.at(surface);
if (layout) {
return *layout;
} else {
// m_layouts.emplace(Surface(surface), std::make_unique<Stacked>());
return *m_layouts.at(surface);
}
}
}

View File

@ -0,0 +1,20 @@
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
// SPDX-License-Identifier: MIT
#pragma once
#include <map>
#include <memory>
#include "engine/surface.hpp"
#include "layout.hpp"
namespace Bismuth
{
struct LayoutList {
const Layout &layoutOnSurface(const Surface &) const;
private:
std::map<Surface, std::unique_ptr<Layout>> m_layouts{};
};
}

View File

@ -0,0 +1,15 @@
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
// SPDX-License-Identifier: MIT
#include "monocle.hpp"
namespace Bismuth
{
void Monocle::apply(QRect area, std::vector<Window> &windows)
{
for (auto &window : windows) {
// Place the window on the all available area
window.setGeometry(area);
}
}
}

View File

@ -0,0 +1,13 @@
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
// SPDX-License-Identifier: MIT
#pragma once
#include "layout.hpp"
namespace Bismuth
{
struct Monocle : Layout {
virtual void apply(QRect area, std::vector<Window> &windows) override;
};
}

View File

@ -0,0 +1,11 @@
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
// SPDX-License-Identifier: MIT
#include "stacked.hpp"
namespace Bismuth
{
void Stacked::apply(QRect area, std::vector<Window> &windows)
{
}
}

View File

@ -0,0 +1,13 @@
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
// SPDX-License-Identifier: MIT
#pragma once
#include "layout.hpp"
namespace Bismuth
{
struct Stacked : Layout {
virtual void apply(QRect area, std::vector<Window> &windows) override;
};
}

View File

@ -16,6 +16,16 @@ bool Window::operator<(const Window &rhs) const
return m_client < m_client;
}
QRect Window::geometry() const
{
return m_client.frameGeometry();
}
void Window::setGeometry(QRect newGeometry)
{
m_client.setFrameGeometry(newGeometry);
}
void Window::setMode(Mode value)
{
m_mode = value;

View File

@ -23,6 +23,9 @@ public:
bool operator<(const Window &rhs) const;
QRect geometry() const;
void setGeometry(QRect);
void setMode(Mode);
Mode mode() const;

View File

@ -30,6 +30,12 @@ public:
*/
BI_READONLY_PROPERTY(QStringList, activities)
/**
* The geometry of this Client. Be aware that depending on resize mode the frameGeometryChanged
* signal might be emitted at each resize step or only at the end of the resize operation.
*/
BI_PROPERTY(QRect, frameGeometry, setFrameGeometry)
// /**
// * Whether the window is active.
// */

View File

@ -1,4 +1,6 @@
# SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
# SPDX-License-Identifier: MIT
add_subdirectory(layout)
target_sources(test_runner PRIVATE window.cpp)

View File

@ -0,0 +1,4 @@
# SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
# SPDX-License-Identifier: MIT
target_sources(test_runner PRIVATE monocle.cpp)

View File

@ -0,0 +1,33 @@
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
// SPDX-License-Identifier: MIT
#include <doctest/doctest.h>
#include "engine/layout/monocle.hpp"
#include "engine/window.hpp"
#include "plasma-api/client.hpp"
#include "plasma-api/client.mock.hpp"
TEST_CASE("Monocle Tiling Logic")
{
auto monocleLayout = Bismuth::Monocle();
auto fakeClient1 = FakeKWinClient();
fakeClient1.m_frameGeometry = QRect(15, 42, 48, 67);
auto fakeClient2 = FakeKWinClient();
fakeClient1.m_frameGeometry = QRect(18, 24, 79, 10);
auto tilingArea = QRect(0, 0, 1000, 1000);
auto windowsToTile = std::vector<Bismuth::Window>({
Bismuth::Window(PlasmaApi::Client(&fakeClient1)),
Bismuth::Window(PlasmaApi::Client(&fakeClient2)),
});
monocleLayout.apply(tilingArea, windowsToTile);
for (auto &window : windowsToTile) {
CHECK(window.geometry() == tilingArea);
}
}

View File

@ -9,36 +9,7 @@
#include "engine/window.hpp"
#include "plasma-api/client.hpp"
class FakeKWinClient : public QObject
{
Q_OBJECT
Q_PROPERTY(bool minimized MEMBER m_minimized)
Q_PROPERTY(bool onAllDesktops MEMBER m_onAllDesktops)
Q_PROPERTY(int desktop MEMBER m_desktop)
Q_PROPERTY(int screen MEMBER m_screen)
Q_PROPERTY(QStringList activities MEMBER m_activities)
public:
FakeKWinClient &operator=(const FakeKWinClient &rhs)
{
if (&rhs != this) {
m_minimized = rhs.m_minimized;
m_onAllDesktops = rhs.m_onAllDesktops;
m_desktop = rhs.m_desktop;
m_screen = rhs.m_screen;
m_activities = rhs.m_activities;
}
return *this;
}
bool m_minimized{};
bool m_onAllDesktops{};
int m_desktop{};
int m_screen{};
QStringList m_activities{};
};
#include "plasma-api/client.mock.hpp"
TEST_CASE("Window Visibility")
{
@ -136,5 +107,3 @@ TEST_CASE("Window Visibility")
CHECK(visible == true);
}
}
#include "window.moc"

View File

@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
# SPDX-License-Identifier: MIT
target_sources(test_runner PRIVATE workspace.cpp)
target_sources(test_runner PRIVATE workspace.cpp client.mock.cpp)

View File

@ -0,0 +1,17 @@
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
// SPDX-License-Identifier: MIT
#include "client.mock.hpp"
FakeKWinClient &FakeKWinClient::operator=(const FakeKWinClient &rhs)
{
if (&rhs != this) {
m_minimized = rhs.m_minimized;
m_onAllDesktops = rhs.m_onAllDesktops;
m_desktop = rhs.m_desktop;
m_screen = rhs.m_screen;
m_activities = rhs.m_activities;
}
return *this;
}

View File

@ -0,0 +1,30 @@
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
// SPDX-License-Identifier: MIT
#pragma once
#include <QObject>
#include <QRect>
#include <QStringList>
class FakeKWinClient : public QObject
{
Q_OBJECT
Q_PROPERTY(bool minimized MEMBER m_minimized)
Q_PROPERTY(bool onAllDesktops MEMBER m_onAllDesktops)
Q_PROPERTY(int desktop MEMBER m_desktop)
Q_PROPERTY(int screen MEMBER m_screen)
Q_PROPERTY(QStringList activities MEMBER m_activities)
Q_PROPERTY(QRect frameGeometry MEMBER m_frameGeometry)
public:
FakeKWinClient &operator=(const FakeKWinClient &);
bool m_minimized{};
bool m_onAllDesktops{};
int m_desktop{};
int m_screen{};
QStringList m_activities{};
QRect m_frameGeometry{};
};