refactor out into separate files
This commit is contained in:
parent
c676773a44
commit
c601beb28e
9 changed files with 186 additions and 157 deletions
|
@ -9,6 +9,9 @@ librsvg_dep = dependency('librsvg-2.0')
|
||||||
|
|
||||||
executable(
|
executable(
|
||||||
'filemanager',
|
'filemanager',
|
||||||
|
'./src/SvgWidget.cpp',
|
||||||
|
'./src/FileButton.cpp',
|
||||||
|
'./src/DirectoryView.cpp',
|
||||||
'./src/main.cpp',
|
'./src/main.cpp',
|
||||||
dependencies : [raven_dep, librsvg_dep]
|
dependencies : [raven_dep, librsvg_dep]
|
||||||
)
|
)
|
||||||
|
|
30
src/DirectoryView.cpp
Normal file
30
src/DirectoryView.cpp
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#include "DirectoryView.hpp"
|
||||||
|
#include "src/Forward.hpp"
|
||||||
|
|
||||||
|
DirectoryView::~DirectoryView() {}
|
||||||
|
|
||||||
|
void DirectoryView::update() {
|
||||||
|
window()->start_batch();
|
||||||
|
target()->clear_children();
|
||||||
|
for (const auto &entry : std::filesystem::directory_iterator(m_current_path)) {
|
||||||
|
auto button = m_target->add<FileButton>(entry.path().filename(), this);
|
||||||
|
}
|
||||||
|
window()->end_batch();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DirectoryView::navigate(std::string path) {
|
||||||
|
m_current_path = path;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DirectoryView::navigate_relative(std::string path) {
|
||||||
|
m_current_path /= path;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DirectoryView::on_init() {
|
||||||
|
m_target = make_target();
|
||||||
|
m_target->set_layout<Raven::DocumentLayout>(12.0);
|
||||||
|
update();
|
||||||
|
set_did_init(true);
|
||||||
|
}
|
25
src/DirectoryView.hpp
Normal file
25
src/DirectoryView.hpp
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <filesystem>
|
||||||
|
#include "raven/Widget.hpp"
|
||||||
|
#include "raven/ScrollContainer.hpp"
|
||||||
|
#include "raven/DocumentLayout.hpp"
|
||||||
|
#include "FileButton.hpp"
|
||||||
|
|
||||||
|
class DirectoryView : public Raven::ScrollContainer {
|
||||||
|
public:
|
||||||
|
DirectoryView()
|
||||||
|
: Raven::ScrollContainer() {}
|
||||||
|
|
||||||
|
~DirectoryView();
|
||||||
|
|
||||||
|
void update();
|
||||||
|
void navigate(std::string path);
|
||||||
|
void navigate_relative(std::string path);
|
||||||
|
protected:
|
||||||
|
void on_init();
|
||||||
|
private:
|
||||||
|
std::filesystem::path m_current_path { "/" };
|
||||||
|
std::shared_ptr<Raven::Widget> m_target;
|
||||||
|
};
|
36
src/FileButton.cpp
Normal file
36
src/FileButton.cpp
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
#include "FileButton.hpp"
|
||||||
|
#include "DirectoryView.hpp"
|
||||||
|
|
||||||
|
Raven::GenericStyle FileButton::style = Raven::GenericStyle {
|
||||||
|
pango_font_description_from_string("sans-serif"),
|
||||||
|
Raven::black6,
|
||||||
|
Raven::white3,
|
||||||
|
Raven::white2,
|
||||||
|
Raven::white1,
|
||||||
|
0.0,
|
||||||
|
true,
|
||||||
|
true
|
||||||
|
};
|
||||||
|
|
||||||
|
void FileButton::on_init() {
|
||||||
|
rect().set_width(96);
|
||||||
|
rect().set_height(118);
|
||||||
|
|
||||||
|
set_style(&style);
|
||||||
|
|
||||||
|
auto layout = set_layout<Raven::BoxLayout>(Raven::Direction::Vertical);
|
||||||
|
layout->slot_percent(100); // icon
|
||||||
|
layout->slot_pixel(24); // name (text)
|
||||||
|
|
||||||
|
add<SvgWidget>("folder-adwaita.svg");
|
||||||
|
auto label = add<Raven::Label>(m_name, Raven::PaintTextAlign::Center);
|
||||||
|
label->rect().set_max_width(rect().width());
|
||||||
|
label->rect().set_max_height(24);
|
||||||
|
set_did_init(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileButton::on_activation_update(Raven::ActivationUpdateEvent &event) {
|
||||||
|
if (event.activation_status() == false && m_directory_view) {
|
||||||
|
m_directory_view->navigate_relative(m_name);
|
||||||
|
}
|
||||||
|
}
|
28
src/FileButton.hpp
Normal file
28
src/FileButton.hpp
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include "raven/Widget.hpp"
|
||||||
|
#include "raven/BoxLayout.hpp"
|
||||||
|
#include "raven/Label.hpp"
|
||||||
|
#include "Forward.hpp"
|
||||||
|
#include "SvgWidget.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
class FileButton : public Raven::Widget {
|
||||||
|
public:
|
||||||
|
static Raven::GenericStyle style;
|
||||||
|
public:
|
||||||
|
FileButton(std::string name, DirectoryView* directory_view)
|
||||||
|
: Raven::Widget()
|
||||||
|
, m_directory_view(directory_view)
|
||||||
|
, m_name(name) {}
|
||||||
|
|
||||||
|
std::string &name() { return m_name; }
|
||||||
|
protected:
|
||||||
|
void on_init();
|
||||||
|
void on_activation_update(Raven::ActivationUpdateEvent &event);
|
||||||
|
private:
|
||||||
|
DirectoryView* m_directory_view;
|
||||||
|
std::string m_name;
|
||||||
|
};
|
5
src/Forward.hpp
Normal file
5
src/Forward.hpp
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
class SvgWidget;
|
||||||
|
class FileButton;
|
||||||
|
class DirectoryView;
|
32
src/SvgWidget.cpp
Normal file
32
src/SvgWidget.cpp
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
#include "SvgWidget.hpp"
|
||||||
|
|
||||||
|
void SvgWidget::on_init() {
|
||||||
|
m_file = g_file_new_for_path(m_path.c_str());
|
||||||
|
m_handle = rsvg_handle_new_from_gfile_sync(m_file, RSVG_HANDLE_FLAGS_NONE, NULL, NULL);
|
||||||
|
|
||||||
|
set_style(&Raven::clear_widget_style);
|
||||||
|
|
||||||
|
if (!m_handle)
|
||||||
|
{
|
||||||
|
std::cerr << "could not load svg file: " << m_path << std::endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
set_did_init(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SvgWidget::on_paint() {
|
||||||
|
RsvgRectangle viewport = {
|
||||||
|
.x = 0.0,
|
||||||
|
.y = 0.0,
|
||||||
|
.width = rect().width(),
|
||||||
|
.height = rect().height(),
|
||||||
|
};
|
||||||
|
|
||||||
|
rsvg_handle_render_document(m_handle, painter()->cairo()->cobj(), &viewport, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
SvgWidget::~SvgWidget() {
|
||||||
|
g_object_unref(m_file);
|
||||||
|
g_object_unref(m_handle);
|
||||||
|
}
|
25
src/SvgWidget.hpp
Normal file
25
src/SvgWidget.hpp
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "raven/Widget.hpp"
|
||||||
|
#include "librsvg/rsvg.h"
|
||||||
|
|
||||||
|
|
||||||
|
class SvgWidget : public Raven::Widget {
|
||||||
|
public:
|
||||||
|
SvgWidget(std::string path)
|
||||||
|
: Raven::Widget()
|
||||||
|
, m_path(path) {}
|
||||||
|
|
||||||
|
~SvgWidget();
|
||||||
|
|
||||||
|
std::string &path() { return m_path; }
|
||||||
|
void set_path(std::string path) { m_path = path; repaint(); }
|
||||||
|
protected:
|
||||||
|
void on_init();
|
||||||
|
void on_paint();
|
||||||
|
private:
|
||||||
|
std::string m_path;
|
||||||
|
RsvgHandle *m_handle;
|
||||||
|
GFile *m_file;
|
||||||
|
};
|
159
src/main.cpp
159
src/main.cpp
|
@ -1,165 +1,10 @@
|
||||||
#include "GenericStyle.hpp"
|
#include "DirectoryView.hpp"
|
||||||
#include "Painter.hpp"
|
|
||||||
#include "librsvg/rsvg.h"
|
|
||||||
#include "raven/Label.hpp"
|
|
||||||
#include "cairomm/refptr.h"
|
|
||||||
#include "cairomm/surface.h"
|
|
||||||
#include "raven/Window.hpp"
|
|
||||||
#include "raven/Widget.hpp"
|
|
||||||
#include "raven/Button.hpp"
|
|
||||||
#include "raven/Box.hpp"
|
|
||||||
#include "raven/Label.hpp"
|
|
||||||
#include "raven/Layout.hpp"
|
|
||||||
#include "raven/RGB.hpp"
|
|
||||||
#include "raven/DocumentLayout.hpp"
|
|
||||||
#include "raven/Events.hpp"
|
|
||||||
#include "raven/BoxLayout.hpp"
|
|
||||||
#include "raven/Box.hpp"
|
|
||||||
#include "raven/ScrollContainer.hpp"
|
|
||||||
#include "raven/Styles.hpp"
|
|
||||||
#include <bits/types/FILE.h>
|
|
||||||
#include <iostream>
|
|
||||||
#include <memory>
|
|
||||||
#include <string>
|
|
||||||
#include <filesystem>
|
|
||||||
|
|
||||||
class SvgWidget : public Raven::Widget {
|
|
||||||
public:
|
|
||||||
SvgWidget(std::string path)
|
|
||||||
: Raven::Widget()
|
|
||||||
, m_path(path) {}
|
|
||||||
|
|
||||||
~SvgWidget() {
|
|
||||||
g_object_unref(m_file);
|
|
||||||
g_object_unref(m_handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string &path() { return m_path; }
|
|
||||||
void set_path(std::string path) { m_path = path; repaint(); }
|
|
||||||
protected:
|
|
||||||
void on_init() {
|
|
||||||
m_file = g_file_new_for_path(m_path.c_str());
|
|
||||||
m_handle = rsvg_handle_new_from_gfile_sync(m_file, RSVG_HANDLE_FLAGS_NONE, NULL, NULL);
|
|
||||||
|
|
||||||
set_style(&Raven::clear_widget_style);
|
|
||||||
|
|
||||||
if (!m_handle)
|
|
||||||
{
|
|
||||||
std::cerr << "could not load svg file: " << m_path << std::endl;
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
set_did_init(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void on_paint() {
|
|
||||||
RsvgRectangle viewport = {
|
|
||||||
.x = 0.0,
|
|
||||||
.y = 0.0,
|
|
||||||
.width = rect().width(),
|
|
||||||
.height = rect().height(),
|
|
||||||
};
|
|
||||||
|
|
||||||
rsvg_handle_render_document(m_handle, painter()->cairo()->cobj(), &viewport, NULL);
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
std::string m_path;
|
|
||||||
RsvgHandle *m_handle;
|
|
||||||
GFile *m_file;
|
|
||||||
};
|
|
||||||
|
|
||||||
class FileButton : public Raven::Widget {
|
|
||||||
public:
|
|
||||||
static Raven::GenericStyle style;
|
|
||||||
public:
|
|
||||||
FileButton(std::string name)
|
|
||||||
: Raven::Widget()
|
|
||||||
, m_name(name) {}
|
|
||||||
|
|
||||||
std::function<void()> on_open { [](){} };
|
|
||||||
|
|
||||||
std::string &name() { return m_name; }
|
|
||||||
protected:
|
|
||||||
void on_init() {
|
|
||||||
rect().set_width(96);
|
|
||||||
rect().set_height(118);
|
|
||||||
|
|
||||||
set_style(&style);
|
|
||||||
|
|
||||||
auto layout = set_layout<Raven::BoxLayout>(Raven::Direction::Vertical);
|
|
||||||
layout->slot_percent(100); // icon
|
|
||||||
layout->slot_pixel(24); // name (text)
|
|
||||||
|
|
||||||
add<SvgWidget>("folder-adwaita.svg");
|
|
||||||
auto label = add<Raven::Label>(m_name, Raven::PaintTextAlign::Center);
|
|
||||||
label->rect().set_max_width(rect().width());
|
|
||||||
label->rect().set_max_height(24);
|
|
||||||
set_did_init(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void on_activation_update(Raven::ActivationUpdateEvent &event) {
|
|
||||||
if (event.activation_status() == false) {
|
|
||||||
on_open();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
std::string m_name;
|
|
||||||
};
|
|
||||||
|
|
||||||
Raven::GenericStyle FileButton::style = Raven::GenericStyle {
|
|
||||||
pango_font_description_from_string("sans-serif"),
|
|
||||||
Raven::black6,
|
|
||||||
Raven::white3,
|
|
||||||
Raven::white2,
|
|
||||||
Raven::white1,
|
|
||||||
0.0,
|
|
||||||
true,
|
|
||||||
true
|
|
||||||
};
|
|
||||||
|
|
||||||
class DirectoryView : public Raven::ScrollContainer {
|
|
||||||
public:
|
|
||||||
DirectoryView()
|
|
||||||
: Raven::ScrollContainer() {}
|
|
||||||
|
|
||||||
void update() {
|
|
||||||
window()->start_batch();
|
|
||||||
m_target->clear_children();
|
|
||||||
for (const auto &entry : std::filesystem::directory_iterator(m_current_path)) {
|
|
||||||
auto button = m_target->add<FileButton>(entry.path().filename());
|
|
||||||
button->on_open = [this, button]() {
|
|
||||||
navigate_relative(button->name());
|
|
||||||
};
|
|
||||||
}
|
|
||||||
window()->end_batch();
|
|
||||||
}
|
|
||||||
|
|
||||||
void navigate(std::string path) {
|
|
||||||
m_current_path = path;
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
||||||
void navigate_relative(std::string path) {
|
|
||||||
m_current_path /= path;
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
protected:
|
|
||||||
void on_init() {
|
|
||||||
m_target = make_target();
|
|
||||||
m_target->set_layout<Raven::DocumentLayout>(12.0);
|
|
||||||
update();
|
|
||||||
set_did_init(true);
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
std::filesystem::path m_current_path { "/" };
|
|
||||||
std::shared_ptr<Raven::Widget> m_target;
|
|
||||||
};
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
Raven::Window window {};
|
Raven::Window window {};
|
||||||
window.spawn_window();
|
window.spawn_window();
|
||||||
|
|
||||||
auto main_widget = window.set_main_widget<DirectoryView>();
|
window.set_main_widget<DirectoryView>();
|
||||||
|
|
||||||
window.run(true);
|
window.run(true);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue