Browse Source

Help: Make section books open and close when toggled

Much more satisfying!
thankyouverycool 5 years ago
parent
commit
d86dbfe9e8

+ 9 - 1
Applications/Help/ManualModel.cpp

@@ -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();

+ 2 - 0
Applications/Help/ManualModel.h

@@ -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;
 };
 };

+ 1 - 0
Applications/Help/ManualNode.h

@@ -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; }
 };
 };

+ 7 - 0
Applications/Help/ManualSectionNode.cpp

@@ -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;
+}

+ 3 - 0
Applications/Help/ManualSectionNode.h

@@ -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 };
 };
 };

+ 5 - 0
Applications/Help/main.cpp

@@ -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);