MailboxTreeModel.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. * Copyright (c) 2021, Luke Wilde <lukew@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "MailboxTreeModel.h"
  7. #include "AccountHolder.h"
  8. MailboxTreeModel::MailboxTreeModel(AccountHolder const& account_holder)
  9. : m_account_holder(account_holder)
  10. {
  11. m_mail_icon.set_bitmap_for_size(16, Gfx::Bitmap::try_load_from_file("/res/icons/16x16/app-mail.png"));
  12. m_folder_icon.set_bitmap_for_size(16, Gfx::Bitmap::try_load_from_file("/res/icons/16x16/filetype-folder.png"));
  13. m_account_icon.set_bitmap_for_size(16, Gfx::Bitmap::try_load_from_file("/res/icons/16x16/home-directory.png"));
  14. }
  15. MailboxTreeModel::~MailboxTreeModel()
  16. {
  17. }
  18. GUI::ModelIndex MailboxTreeModel::index(int row, int column, GUI::ModelIndex const& parent) const
  19. {
  20. if (!parent.is_valid()) {
  21. if (m_account_holder.accounts().is_empty())
  22. return {};
  23. return create_index(row, column, &m_account_holder.accounts().at(row));
  24. }
  25. auto& base_node = *static_cast<BaseNode*>(parent.internal_data());
  26. if (is<MailboxNode>(base_node)) {
  27. auto& remote_mailbox = verify_cast<MailboxNode>(base_node);
  28. return create_index(row, column, &remote_mailbox.children().at(row));
  29. }
  30. auto& remote_parent = verify_cast<AccountNode>(base_node);
  31. return create_index(row, column, &remote_parent.mailboxes().at(row));
  32. }
  33. GUI::ModelIndex MailboxTreeModel::parent_index(GUI::ModelIndex const& index) const
  34. {
  35. if (!index.is_valid())
  36. return {};
  37. auto& base_node = *static_cast<BaseNode*>(index.internal_data());
  38. if (is<AccountNode>(base_node))
  39. return {};
  40. auto& mailbox_node = verify_cast<MailboxNode>(base_node);
  41. if (!mailbox_node.has_parent()) {
  42. for (size_t row = 0; row < mailbox_node.associated_account().mailboxes().size(); ++row) {
  43. if (&mailbox_node.associated_account().mailboxes()[row] == &mailbox_node) {
  44. return create_index(row, index.column(), &mailbox_node.associated_account());
  45. }
  46. }
  47. } else {
  48. VERIFY(mailbox_node.parent()->has_children());
  49. for (size_t row = 0; row < mailbox_node.parent()->children().size(); ++row) {
  50. if (&mailbox_node.parent()->children()[row] == &mailbox_node) {
  51. return create_index(row, index.column(), mailbox_node.parent());
  52. }
  53. }
  54. }
  55. VERIFY_NOT_REACHED();
  56. return {};
  57. }
  58. int MailboxTreeModel::row_count(GUI::ModelIndex const& index) const
  59. {
  60. if (!index.is_valid())
  61. return m_account_holder.accounts().size();
  62. auto& base_node = *static_cast<BaseNode*>(index.internal_data());
  63. if (is<MailboxNode>(base_node))
  64. return verify_cast<MailboxNode>(base_node).children().size();
  65. auto& node = verify_cast<AccountNode>(base_node);
  66. return node.mailboxes().size();
  67. }
  68. int MailboxTreeModel::column_count(GUI::ModelIndex const&) const
  69. {
  70. return 1;
  71. }
  72. GUI::Variant MailboxTreeModel::data(GUI::ModelIndex const& index, GUI::ModelRole role) const
  73. {
  74. auto& base_node = *static_cast<BaseNode*>(index.internal_data());
  75. if (role == GUI::ModelRole::Display) {
  76. if (is<AccountNode>(base_node)) {
  77. auto& account_node = verify_cast<AccountNode>(base_node);
  78. return account_node.name();
  79. }
  80. auto& mailbox_node = verify_cast<MailboxNode>(base_node);
  81. return mailbox_node.display_name();
  82. }
  83. if (role == GUI::ModelRole::Icon) {
  84. if (is<AccountNode>(base_node))
  85. return m_account_icon;
  86. auto& mailbox_node = verify_cast<MailboxNode>(base_node);
  87. if (!mailbox_node.children().is_empty())
  88. return m_folder_icon;
  89. return m_mail_icon;
  90. }
  91. return {};
  92. }