feat(ui,ffi): Add the favourite room list filter
feat(ui,ffi): Add the `favourite` room list filter
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user