add breadcrumb bar in the topbar

This commit is contained in:
hippoz 2022-07-29 03:03:31 +03:00
parent ba2f22b221
commit 51a75e9cc1
Signed by: hippoz
GPG key ID: 7C52899193467641
5 changed files with 54 additions and 13 deletions

View file

@ -3,6 +3,7 @@
#include "BoxLayout.hpp"
#include "DirectoryView.hpp"
#include "TopBar.hpp"
#include <filesystem>
void AppWidget::on_init() {
auto layout = set_layout<Raven::BoxLayout>(Raven::Direction::Vertical);
@ -12,6 +13,14 @@ void AppWidget::on_init() {
auto top_bar = add<TopBar>();
auto directory_view = add<DirectoryView>();
directory_view->on_path_update = [top_bar](std::filesystem::path where) {
top_bar->breadcrumb_set(where);
};
top_bar->on_navigate = [directory_view](std::filesystem::path where) {
directory_view->navigate(where);
};
top_bar->on_action = [directory_view](TopBar::Action action) {
if (action == TopBar::Action::Back) {
directory_view->go_back();
@ -24,5 +33,7 @@ void AppWidget::on_init() {
}
};
directory_view->navigate_home();
set_did_init(true);
}

View file

@ -6,6 +6,7 @@ DirectoryView::~DirectoryView() {}
void DirectoryView::set_current_path(std::filesystem::path path) {
m_current_path = path;
on_path_update(m_current_path);
// microtasks defer execution of the callback until all external events are processed.
// if they're not used here and set_current_path() is called in a click or hover handler,
@ -34,7 +35,6 @@ void DirectoryView::on_init() {
m_target = make_target();
m_target->set_layout<Raven::DocumentLayout>(16.0);
navigate_home();
set_did_init(true);
}

View file

@ -1,5 +1,6 @@
#pragma once
#include <functional>
#include <stack>
#include <string>
#include <filesystem>
@ -22,6 +23,8 @@ public:
void go_forward();
void navigate_home();
void navigate_parent_directory();
std::function<void(std::filesystem::path)> on_path_update { [](std::filesystem::path _){} };
protected:
void set_current_path(std::filesystem::path path);

View file

@ -1,9 +1,10 @@
#include "TopBar.hpp"
#include "raven/Styles.hpp"
#include "raven/Box.hpp"
#include "raven/BoxLayout.hpp"
#include "raven/SvgWidget.hpp"
#include "raven/RowLayout.hpp"
#include "Styles.hpp"
#include "Box.hpp"
#include "BoxLayout.hpp"
#include "SvgWidget.hpp"
#include "RowLayout.hpp"
#include "Button.hpp"
void TopBar::on_init() {
set_style(&Raven::accent_widget_style);
@ -22,8 +23,12 @@ void TopBar::on_init() {
auto home_button = add<Raven::SvgWidget>("/usr/share/icons/Papirus/24x24/actions/go-home.svg");
home_button->set_style(&Raven::default_button_style);
m_breadcrumbs = add<Raven::Widget>();
m_breadcrumbs->set_style(&Raven::accent_widget_style);
auto breadcrumbs_layout = m_breadcrumbs->set_layout<Raven::BoxLayout>(Raven::Direction::Horizontal);
breadcrumbs_layout->set_spacing(8);
back_button->on_click = [this, back_button]() {
std::cout << back_button->rect().width() << ", " << back_button->rect().height() << std::endl;
on_action(Action::Back);
};
forward_button->on_click = [this]() {
@ -38,3 +43,18 @@ void TopBar::on_init() {
set_did_init(true);
}
void TopBar::breadcrumb_set(std::filesystem::path path) {
window()->queue_microtask([this, path]() {
m_breadcrumbs->clear_children();
std::filesystem::path current_path;
for (std::filesystem::path::iterator i = path.begin(); i != path.end(); i++) {
auto button = m_breadcrumbs->add<Raven::Button>(*i == "/" ? "/" : i->filename());
current_path /= *i;
button->on_click = [this, current_path]() {
on_navigate(current_path);
};
}
});
}

View file

@ -1,22 +1,29 @@
#pragma once
#include "Widget.hpp"
#include <filesystem>
#include <functional>
#include <memory>
class TopBar : public Raven::Widget {
public:
enum class Action {
Back = 0,
Forward,
Home,
ParentDirectory
};
enum class Action {
Back = 0,
Forward,
Home,
ParentDirectory
};
public:
TopBar()
: Raven::Widget() {}
void breadcrumb_set(std::filesystem::path path);
std::function<void(Action)> on_action { [](Action _){} };
std::function<void(std::filesystem::path)> on_navigate { [](std::filesystem::path _){} };
protected:
void on_init();
private:
std::shared_ptr<Raven::Widget> m_breadcrumbs;
std::filesystem::path m_breadcrumb_path { "/" };
};