hy3/src/TabGroup.hpp

89 lines
2.1 KiB
C++
Raw Normal View History

2023-05-16 03:02:26 -07:00
#pragma once
#include <hyprland/src/helpers/AnimatedVariable.hpp>
#include <hyprland/src/helpers/Vector2D.hpp>
#include <list>
#include <memory>
2023-05-26 01:17:01 -07:00
#include <vector>
2023-05-16 03:02:26 -07:00
class Hy3TabGroup;
class Hy3TabBar;
2023-05-16 03:02:26 -07:00
#include "Hy3Layout.hpp"
#include <hyprland/src/render/Texture.hpp>
struct Hy3TabBarEntry {
std::string window_title;
bool focused = false;
2023-05-16 03:02:26 -07:00
bool urgent = false;
CTexture texture;
CAnimatedVariable offset; // offset 0, 0.0-1.0 of total bar
CAnimatedVariable width; // 0.0-1.0 of total bar
Hy3TabBar& tab_bar;
Hy3Node& node; // only used for comparioson. do not deref.
wlr_box last_render_box;
float last_render_rounding = 0.0;
bool last_render_focused = false;
bool last_render_urgent = false;
Hy3TabBarEntry(Hy3TabBar&, Hy3Node&);
bool operator==(const Hy3Node&) const;
bool operator==(const Hy3TabBarEntry&) const;
void prepareTexture(float, wlr_box&);
2023-05-16 03:02:26 -07:00
};
class Hy3TabBar {
public:
bool destroy = false;
CAnimatedVariable vertical_pos;
CAnimatedVariable fade_opacity;
Hy3TabBar();
void beginDestroy();
2023-05-16 03:02:26 -07:00
void focusNode(Hy3Node*);
void updateNodeList(std::list<Hy3Node*>& nodes);
void updateAnimations(bool warp = false);
2023-05-16 03:02:26 -07:00
void setSize(Vector2D);
std::list<Hy3TabBarEntry> entries;
2023-05-16 03:02:26 -07:00
private:
Hy3Node* focused_node = nullptr;
CAnimatedVariable focus_opacity;
CAnimatedVariable focus_start;
CAnimatedVariable focus_end;
2023-05-16 03:02:26 -07:00
Vector2D size;
// Tab bar entries take a reference to `this`.
Hy3TabBar(Hy3TabBar&&) = delete;
Hy3TabBar(const Hy3TabBar&) = delete;
2023-05-16 03:02:26 -07:00
};
class Hy3TabGroup {
public:
Hy3TabBar bar;
CAnimatedVariable pos;
CAnimatedVariable size;
// initialize a group with the given node. UB if node is not a group.
Hy3TabGroup(Hy3Node&);
2023-05-16 03:02:26 -07:00
// update tab bar with node position and data. UB if node is not a group.
void updateWithGroup(Hy3Node&);
// render the scaled tab bar on the current monitor.
void renderTabBar();
private:
2023-05-26 01:17:01 -07:00
std::vector<CWindow*> stencil_windows;
Hy3TabGroup();
2023-05-16 03:02:26 -07:00
// moving a Hy3TabGroup will unregister any active animations
Hy3TabGroup(Hy3TabGroup&&) = delete;
2023-05-26 01:17:01 -07:00
// UB if node is not a group.
void updateStencilWindows(Hy3Node&);
2023-05-16 03:02:26 -07:00
};