diff --git a/Userland/Applications/Mail/InboxModel.cpp b/Userland/Applications/Mail/InboxModel.cpp index 657d472a2a..055c817077 100644 --- a/Userland/Applications/Mail/InboxModel.cpp +++ b/Userland/Applications/Mail/InboxModel.cpp @@ -13,6 +13,12 @@ InboxModel::InboxModel(Vector entries) { } +void InboxModel::set_seen(int row, bool seen) +{ + m_entries[row].seen = seen; + did_update(DontInvalidateIndices); +} + int InboxModel::row_count(GUI::ModelIndex const&) const { return m_entries.size(); diff --git a/Userland/Applications/Mail/InboxModel.h b/Userland/Applications/Mail/InboxModel.h index b8c0c0e2e3..3a97c5aa8c 100644 --- a/Userland/Applications/Mail/InboxModel.h +++ b/Userland/Applications/Mail/InboxModel.h @@ -33,6 +33,8 @@ public: virtual ~InboxModel() override = default; + void set_seen(int row, bool); + virtual int row_count(const GUI::ModelIndex& = GUI::ModelIndex()) const override; virtual int column_count(const GUI::ModelIndex& = GUI::ModelIndex()) const override { return Column::__Count; } virtual ErrorOr column_name(int) const override; diff --git a/Userland/Applications/Mail/MailWidget.cpp b/Userland/Applications/Mail/MailWidget.cpp index 7024b8bc63..4370f7f9e5 100644 --- a/Userland/Applications/Mail/MailWidget.cpp +++ b/Userland/Applications/Mail/MailWidget.cpp @@ -243,7 +243,8 @@ bool MailWidget::is_supported_alternative(Alternative const& alternative) const void MailWidget::selected_mailbox() { - m_individual_mailbox_view->set_model(InboxModel::create({})); + m_individual_mailbox_model = InboxModel::create({}); + m_individual_mailbox_view->set_model(m_individual_mailbox_model); auto const& index = m_mailbox_list->selection().first(); @@ -427,7 +428,8 @@ void MailWidget::selected_mailbox() } m_statusbar->set_text(String::formatted("[{}]: Loaded {} entries", mailbox.name, i).release_value_but_fixme_should_propagate_errors()); - m_individual_mailbox_view->set_model(InboxModel::create(move(active_inbox_entries))); + m_individual_mailbox_model = InboxModel::create(move(active_inbox_entries)); + m_individual_mailbox_view->set_model(m_individual_mailbox_model); } void MailWidget::selected_email_to_load() @@ -509,6 +511,9 @@ void MailWidget::selected_email_to_load() }, .partial_fetch = false, }, + IMAP::FetchCommand::DataItem { + .type = IMAP::FetchCommand::DataItemType::Flags, + }, }, }; @@ -532,6 +537,9 @@ void MailWidget::selected_email_to_load() auto& fetch_response_data = fetch_data.last().get(); + auto seen = !fetch_response_data.flags().find_if([](StringView value) { return value.equals_ignoring_ascii_case("\\Seen"sv); }).is_end(); + m_individual_mailbox_model->set_seen(index.row(), seen); + if (!fetch_response_data.contains_response_type(IMAP::FetchResponseType::Body)) { GUI::MessageBox::show_error(window(), "The server sent no body."sv); return; diff --git a/Userland/Applications/Mail/MailWidget.h b/Userland/Applications/Mail/MailWidget.h index dc73cb7525..be8a6b2c12 100644 --- a/Userland/Applications/Mail/MailWidget.h +++ b/Userland/Applications/Mail/MailWidget.h @@ -41,6 +41,7 @@ private: OwnPtr m_imap_client; RefPtr m_mailbox_list; + RefPtr m_individual_mailbox_model; RefPtr m_individual_mailbox_view; RefPtr m_web_view; RefPtr m_statusbar;