feat(ui,ffi): Add the favourite room list filter

feat(ui,ffi): Add the `favourite` room list filter
This commit is contained in:
Ivan Enderlin
2024-02-19 13:45:37 +01:00
committed by GitHub
12 changed files with 285 additions and 3 deletions
+5 -3
View File
@@ -15,9 +15,9 @@ use matrix_sdk::{
use matrix_sdk_ui::{
room_list_service::{
filters::{
new_filter_all, new_filter_any, new_filter_category, new_filter_fuzzy_match_room_name,
new_filter_non_left, new_filter_none, new_filter_normalized_match_room_name,
new_filter_unread, RoomCategory,
new_filter_all, new_filter_any, new_filter_category, new_filter_favourite,
new_filter_fuzzy_match_room_name, new_filter_non_left, new_filter_none,
new_filter_normalized_match_room_name, new_filter_unread, RoomCategory,
},
BoxedFilterFn,
},
@@ -417,6 +417,7 @@ pub enum RoomListEntriesDynamicFilterKind {
Any { filters: Vec<RoomListEntriesDynamicFilterKind> },
NonLeft,
Unread,
Favourite,
Category { expect: RoomListFilterCategory },
None,
NormalizedMatchRoomName { pattern: String },
@@ -455,6 +456,7 @@ impl FilterWrapper {
))),
Kind::NonLeft => Self(Box::new(new_filter_non_left(client))),
Kind::Unread => Self(Box::new(new_filter_unread(client))),
Kind::Favourite => Self(Box::new(new_filter_favourite(client))),
Kind::Category { expect } => Self(Box::new(new_filter_category(client, expect.into()))),
Kind::None => Self(Box::new(new_filter_none())),
Kind::NormalizedMatchRoomName { pattern } => {
@@ -1,3 +1,17 @@
// Copyright 2024 The Matrix.org Foundation C.I.C.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use super::{super::room_list::BoxedFilterFn, Filter};
/// Create a new filter that will run multiple filters. It returns `false` if at
@@ -1,3 +1,17 @@
// Copyright 2024 The Matrix.org Foundation C.I.C.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use super::{super::room_list::BoxedFilterFn, Filter};
/// Create a new filter that will run multiple filters. It returns `true` if at
@@ -1,3 +1,17 @@
// Copyright 2024 The Matrix.org Foundation C.I.C.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use matrix_sdk::{Client, RoomListEntry};
use super::Filter;
@@ -0,0 +1,96 @@
// Copyright 2024 The Matrix.org Foundation C.I.C.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use matrix_sdk::{Client, RoomListEntry};
use super::Filter;
struct FavouriteRoomMatcher<F>
where
F: Fn(&RoomListEntry) -> Option<bool>,
{
is_favourite: F,
}
impl<F> FavouriteRoomMatcher<F>
where
F: Fn(&RoomListEntry) -> Option<bool>,
{
fn matches(&self, room_list_entry: &RoomListEntry) -> bool {
if !matches!(room_list_entry, RoomListEntry::Filled(_) | RoomListEntry::Invalidated(_)) {
return false;
}
(self.is_favourite)(room_list_entry).unwrap_or(false)
}
}
/// Create a new filter that will accept all filled or invalidated entries, but
/// filters out rooms that are not marked as favourite (see
/// [`matrix_sdk_base::Room::is_favourite`]).
pub fn new_filter(client: &Client) -> impl Filter {
let client = client.clone();
let matcher = FavouriteRoomMatcher {
is_favourite: move |room| {
let room_id = room.as_room_id()?;
let room = client.get_room(room_id)?;
Some(room.is_favourite())
},
};
move |room_list_entry| -> bool { matcher.matches(room_list_entry) }
}
#[cfg(test)]
mod tests {
use std::ops::Not;
use matrix_sdk::RoomListEntry;
use ruma::room_id;
use super::FavouriteRoomMatcher;
#[test]
fn test_is_favourite() {
let matcher = FavouriteRoomMatcher { is_favourite: |_| Some(true) };
assert!(matcher.matches(&RoomListEntry::Empty).not());
assert!(matcher.matches(&RoomListEntry::Filled(room_id!("!r0:bar.org").to_owned())));
assert!(matcher.matches(&RoomListEntry::Invalidated(room_id!("!r0:bar.org").to_owned())));
}
#[test]
fn test_is_not_favourite() {
let matcher = FavouriteRoomMatcher { is_favourite: |_| Some(false) };
assert!(matcher.matches(&RoomListEntry::Empty).not());
assert!(matcher.matches(&RoomListEntry::Filled(room_id!("!r0:bar.org").to_owned())).not());
assert!(matcher
.matches(&RoomListEntry::Invalidated(room_id!("!r0:bar.org").to_owned()))
.not());
}
#[test]
fn test_favourite_state_cannot_be_found() {
let matcher = FavouriteRoomMatcher { is_favourite: |_| None };
assert!(matcher.matches(&RoomListEntry::Empty).not());
assert!(matcher.matches(&RoomListEntry::Filled(room_id!("!r0:bar.org").to_owned())).not());
assert!(matcher
.matches(&RoomListEntry::Invalidated(room_id!("!r0:bar.org").to_owned()))
.not());
}
}
@@ -1,3 +1,17 @@
// Copyright 2024 The Matrix.org Foundation C.I.C.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
pub use fuzzy_matcher::{skim::SkimMatcherV2, FuzzyMatcher as _};
use matrix_sdk::Client;
@@ -1,6 +1,63 @@
// Copyright 2024 The Matrix.org Foundation C.I.C.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! A collection of room filters.
//!
//! The room list can provide an access to the rooms per list, like with
//! [`super::RoomList::entries_with_dynamic_adapters`]. The provided collection
//! of rooms can be filtered with these filters. A classical usage would be the
//! following:
//!
//! ```rust
//! use matrix_sdk::Client;
//! use matrix_sdk_ui::room_list_service::{
//! filters, RoomListDynamicEntriesController,
//! };
//!
//! fn configure_room_list(
//! client: &Client,
//! entries_controller: &RoomListDynamicEntriesController,
//! ) {
//! // _All_ non-left rooms
//! // _and_ that fall in the “People” category,
//! // _and_ that are marked as favourite,
//! // _and_ that are _not_ unread.
//! entries_controller.set_filter(Box::new(
//! // All
//! filters::new_filter_all(vec![
//! // Non-left
//! Box::new(filters::new_filter_non_left(&client)),
//! // People
//! Box::new(filters::new_filter_category(
//! client,
//! filters::RoomCategory::People,
//! )),
//! // Favourite
//! Box::new(filters::new_filter_favourite(client)),
//! // Not Unread
//! Box::new(filters::new_filter_not(Box::new(
//! filters::new_filter_unread(client),
//! ))),
//! ]),
//! ));
//! }
//! ```
mod all;
mod any;
mod category;
mod favourite;
mod fuzzy_match_room_name;
mod non_left;
mod none;
@@ -11,6 +68,7 @@ mod unread;
pub use all::new_filter as new_filter_all;
pub use any::new_filter as new_filter_any;
pub use category::{new_filter as new_filter_category, RoomCategory};
pub use favourite::new_filter as new_filter_favourite;
pub use fuzzy_match_room_name::new_filter as new_filter_fuzzy_match_room_name;
use matrix_sdk::RoomListEntry;
pub use non_left::new_filter as new_filter_non_left;
@@ -1,3 +1,17 @@
// Copyright 2024 The Matrix.org Foundation C.I.C.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use matrix_sdk::{Client, RoomListEntry};
use matrix_sdk_base::RoomState;
@@ -1,3 +1,17 @@
// Copyright 2024 The Matrix.org Foundation C.I.C.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use super::Filter;
/// Create a new filter that will reject all entries.
@@ -1,3 +1,17 @@
// Copyright 2024 The Matrix.org Foundation C.I.C.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use matrix_sdk::Client;
use super::{normalize_string, Filter};
@@ -1,3 +1,17 @@
// Copyright 2024 The Matrix.org Foundation C.I.C.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::ops::Not;
use super::{super::room_list::BoxedFilterFn, Filter};
@@ -1,3 +1,17 @@
// Copyright 2024 The Matrix.org Foundation C.I.C.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use matrix_sdk::{Client, RoomListEntry};
use matrix_sdk_base::read_receipts::RoomReadReceipts;