hy3/src/TabGroup.hpp

87 lines
2 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;
bool needs_redraw = false;
CTexture texture;
CAnimatedVariable offset; // offset 0, 0.0-1.0 of total bar
CAnimatedVariable width; // 0.0-1.0 of total bar
std::shared_ptr<Hy3TabGroup> tab_group;
Hy3Node& node; // only used for comparioson. do not deref.
Vector2D last_render_size;
float last_render_scale = 0.0;
float last_render_rounding = 0.0;
Hy3TabBarEntry(std::shared_ptr<Hy3TabGroup>, Hy3Node&);
bool operator==(const Hy3Node&) const;
bool operator==(const Hy3TabBarEntry&) const;
void prepareTexture(float, Vector2D);
void animateRemoval();
2023-05-16 03:02:26 -07:00
};
class Hy3TabBar {
public:
CAnimatedVariable vertical_pos;
CAnimatedVariable fade_opacity;
Hy3TabBar();
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;
std::weak_ptr<Hy3TabGroup> group;
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;
};
class Hy3TabGroup {
public:
Hy3TabBar bar;
CAnimatedVariable pos;
CAnimatedVariable size;
// initialize a group with the given node. UB if node is not a group.
static std::shared_ptr<Hy3TabGroup> new_(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:
std::weak_ptr<Hy3TabGroup> self;
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
};