1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 07:08:10 +00:00

Help: Make section books open and close when toggled

Much more satisfying!
This commit is contained in:
thankyouverycool 2020-07-07 07:19:30 -04:00 committed by Andreas Kling
parent cbf3c2caeb
commit d86dbfe9e8
6 changed files with 27 additions and 1 deletions

View file

@ -42,7 +42,7 @@ static ManualSectionNode s_sections[] = {
ManualModel::ManualModel() ManualModel::ManualModel()
{ {
// FIXME: need some help from the icon fairy ^) m_section_open_icon.set_bitmap_for_size(16, Gfx::Bitmap::load_from_file("/res/icons/16x16/book-open.png"));
m_section_icon.set_bitmap_for_size(16, Gfx::Bitmap::load_from_file("/res/icons/16x16/book.png")); m_section_icon.set_bitmap_for_size(16, Gfx::Bitmap::load_from_file("/res/icons/16x16/book.png"));
m_page_icon.set_bitmap_for_size(16, Gfx::Bitmap::load_from_file("/res/icons/16x16/filetype-unknown.png")); m_page_icon.set_bitmap_for_size(16, Gfx::Bitmap::load_from_file("/res/icons/16x16/filetype-unknown.png"));
} }
@ -142,12 +142,20 @@ GUI::Variant ManualModel::data(const GUI::ModelIndex& index, Role role) const
case Role::Icon: case Role::Icon:
if (node->is_page()) if (node->is_page())
return m_page_icon; return m_page_icon;
if (node->is_open())
return m_section_open_icon;
return m_section_icon; return m_section_icon;
default: default:
return {}; return {};
} }
} }
void ManualModel::update_section_node_on_toggle(const GUI::ModelIndex& index, const bool open)
{
auto* node = static_cast<ManualSectionNode*>(index.internal_data());
node->set_open(open);
}
void ManualModel::update() void ManualModel::update()
{ {
did_update(); did_update();

View file

@ -45,6 +45,7 @@ public:
String page_path(const GUI::ModelIndex&) const; String page_path(const GUI::ModelIndex&) const;
String page_and_section(const GUI::ModelIndex&) const; String page_and_section(const GUI::ModelIndex&) const;
void update_section_node_on_toggle(const GUI::ModelIndex&, const bool);
virtual int row_count(const GUI::ModelIndex& = GUI::ModelIndex()) const override; virtual int row_count(const GUI::ModelIndex& = GUI::ModelIndex()) const override;
virtual int column_count(const GUI::ModelIndex& = GUI::ModelIndex()) const override; virtual int column_count(const GUI::ModelIndex& = GUI::ModelIndex()) const override;
virtual GUI::Variant data(const GUI::ModelIndex&, Role = Role::Display) const override; virtual GUI::Variant data(const GUI::ModelIndex&, Role = Role::Display) const override;
@ -55,6 +56,7 @@ public:
private: private:
ManualModel(); ManualModel();
GUI::Icon m_section_open_icon;
GUI::Icon m_section_icon; GUI::Icon m_section_icon;
GUI::Icon m_page_icon; GUI::Icon m_page_icon;
}; };

View file

@ -37,4 +37,5 @@ public:
virtual const ManualNode* parent() const = 0; virtual const ManualNode* parent() const = 0;
virtual String name() const = 0; virtual String name() const = 0;
virtual bool is_page() const { return false; } virtual bool is_page() const { return false; }
virtual bool is_open() const { return false; }
}; };

View file

@ -57,3 +57,10 @@ void ManualSectionNode::reify_if_needed() const
for (auto& page_name : page_names) for (auto& page_name : page_names)
m_children.append(make<ManualPageNode>(*this, move(page_name))); m_children.append(make<ManualPageNode>(*this, move(page_name)));
} }
void ManualSectionNode::set_open(bool open)
{
if (m_open == open)
return;
m_open = open;
}

View file

@ -46,6 +46,8 @@ public:
virtual const ManualNode* parent() const override { return nullptr; } virtual const ManualNode* parent() const override { return nullptr; }
virtual String name() const override { return m_full_name; } virtual String name() const override { return m_full_name; }
virtual bool is_open() const override { return m_open; }
void set_open(bool open);
const String& section_name() const { return m_section; } const String& section_name() const { return m_section; }
String path() const; String path() const;
@ -57,4 +59,5 @@ private:
String m_full_name; String m_full_name;
mutable NonnullOwnPtrVector<ManualNode> m_children; mutable NonnullOwnPtrVector<ManualNode> m_children;
mutable bool m_reified { false }; mutable bool m_reified { false };
bool m_open { false };
}; };

View file

@ -147,6 +147,7 @@ int main(int argc, char* argv[])
String path = model->page_path(tree_view.selection().first()); String path = model->page_path(tree_view.selection().first());
if (path.is_null()) { if (path.is_null()) {
page_view.set_document(nullptr); page_view.set_document(nullptr);
window->set_title("Help");
return; return;
} }
history.push(path); history.push(path);
@ -154,6 +155,10 @@ int main(int argc, char* argv[])
open_page(path); open_page(path);
}; };
tree_view.on_toggle = [&](const GUI::ModelIndex& index, const bool open) {
model->update_section_node_on_toggle(index, open);
};
page_view.on_link_click = [&](auto& url, auto&, unsigned) { page_view.on_link_click = [&](auto& url, auto&, unsigned) {
char* current_path = strdup(history.current().characters()); char* current_path = strdup(history.current().characters());
char* path = realpath(url.path().characters(), nullptr); char* path = realpath(url.path().characters(), nullptr);