ManualModel.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "ManualModel.h"
  2. #include "ManualNode.h"
  3. #include "ManualPageNode.h"
  4. #include "ManualSectionNode.h"
  5. #include <LibDraw/PNGLoader.h>
  6. static ManualSectionNode s_sections[] = {
  7. { "1", "Command-line programs" },
  8. { "2", "System calls" }
  9. };
  10. ManualModel::ManualModel()
  11. {
  12. // FIXME: need some help from the icon fairy ^)
  13. m_section_icon.set_bitmap_for_size(16, load_png("/res/icons/16x16/book.png"));
  14. m_page_icon.set_bitmap_for_size(16, load_png("/res/icons/16x16/filetype-unknown.png"));
  15. }
  16. String ManualModel::page_path(const GModelIndex& index) const
  17. {
  18. if (!index.is_valid())
  19. return {};
  20. auto* node = static_cast<const ManualNode*>(index.internal_data());
  21. if (!node->is_page())
  22. return {};
  23. auto* page = static_cast<const ManualPageNode*>(node);
  24. return page->path();
  25. }
  26. String ManualModel::page_and_section(const GModelIndex& index) const
  27. {
  28. if (!index.is_valid())
  29. return {};
  30. auto* node = static_cast<const ManualNode*>(index.internal_data());
  31. if (!node->is_page())
  32. return {};
  33. auto* page = static_cast<const ManualPageNode*>(node);
  34. auto* section = static_cast<const ManualSectionNode*>(page->parent());
  35. return String::format("%s(%s)", page->name().characters(), section->section_name().characters());
  36. }
  37. GModelIndex ManualModel::index(int row, int column, const GModelIndex& parent_index) const
  38. {
  39. if (!parent_index.is_valid())
  40. return create_index(row, column, &s_sections[row]);
  41. auto* parent = static_cast<const ManualNode*>(parent_index.internal_data());
  42. auto* child = &parent->children()[row];
  43. return create_index(row, column, child);
  44. }
  45. GModelIndex ManualModel::parent_index(const GModelIndex& index) const
  46. {
  47. if (!index.is_valid())
  48. return {};
  49. auto* child = static_cast<const ManualNode*>(index.internal_data());
  50. auto* parent = child->parent();
  51. if (parent == nullptr)
  52. return {};
  53. if (parent->parent() == nullptr) {
  54. for (size_t row = 0; row < sizeof(s_sections) / sizeof(s_sections[0]); row++)
  55. if (&s_sections[row] == parent)
  56. return create_index(row, 0, parent);
  57. ASSERT_NOT_REACHED();
  58. }
  59. for (int row = 0; row < parent->parent()->children().size(); row++) {
  60. ManualNode* child_at_row = &parent->parent()->children()[row];
  61. if (child_at_row == parent)
  62. return create_index(row, 0, parent);
  63. }
  64. ASSERT_NOT_REACHED();
  65. }
  66. int ManualModel::row_count(const GModelIndex& index) const
  67. {
  68. if (!index.is_valid())
  69. return sizeof(s_sections) / sizeof(s_sections[0]);
  70. auto* node = static_cast<const ManualNode*>(index.internal_data());
  71. return node->children().size();
  72. }
  73. int ManualModel::column_count(const GModelIndex&) const
  74. {
  75. return 1;
  76. }
  77. GVariant ManualModel::data(const GModelIndex& index, Role role) const
  78. {
  79. auto* node = static_cast<const ManualNode*>(index.internal_data());
  80. switch (role) {
  81. case Role::Display:
  82. return node->name();
  83. case Role::Icon:
  84. if (node->is_page())
  85. return m_page_icon;
  86. return m_section_icon;
  87. default:
  88. return {};
  89. }
  90. }
  91. void ManualModel::update()
  92. {
  93. did_update();
  94. }