Browse Source

sidebar: Rename IconItem to SidebarIconItem

And other refactoring
fractal-6
Kévin Commaille 2 years ago committed by Kévin Commaille
parent
commit
b1e6726a2b
  1. 4
      src/session/model/mod.rs
  2. 48
      src/session/model/sidebar_data/icon_item.rs
  3. 8
      src/session/model/sidebar_data/item_list.rs
  4. 2
      src/session/model/sidebar_data/mod.rs
  5. 8
      src/session/view/content/mod.rs
  6. 8
      src/session/view/sidebar/icon_item_row.rs
  7. 4
      src/session/view/sidebar/icon_item_row.ui
  8. 4
      src/session/view/sidebar/mod.rs
  9. 22
      src/session/view/sidebar/row.rs

4
src/session/model/mod.rs

@ -28,8 +28,8 @@ pub use self::{
session::{Session, SessionState},
session_settings::{SessionSettings, StoredSessionSettings},
sidebar_data::{
Category, CategoryType, IconItem, ItemList, ItemType, Selection, SidebarItem,
SidebarItemImpl, SidebarListModel,
Category, CategoryType, ItemList, Selection, SidebarIconItem, SidebarIconItemType,
SidebarItem, SidebarItemImpl, SidebarListModel,
},
user::{User, UserExt},
user_sessions_list::{UserSession, UserSessionsList},

48
src/session/model/sidebar_data/icon_item.rs

@ -7,14 +7,14 @@ use super::{CategoryType, SidebarItem, SidebarItemExt, SidebarItemImpl};
#[derive(Debug, Default, Hash, Eq, PartialEq, Clone, Copy, glib::Enum)]
#[repr(u32)]
#[enum_type(name = "ItemType")]
pub enum ItemType {
#[enum_type(name = "SidebarIconItemType")]
pub enum SidebarIconItemType {
#[default]
Explore = 0,
Forget = 1,
}
impl ItemType {
impl SidebarIconItemType {
/// The icon name for this item type.
pub fn icon_name(&self) -> &'static str {
match self {
@ -24,7 +24,7 @@ impl ItemType {
}
}
impl fmt::Display for ItemType {
impl fmt::Display for SidebarIconItemType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let label = match self {
Self::Explore => gettext("Explore"),
@ -41,11 +41,11 @@ mod imp {
use super::*;
#[derive(Debug, Default, glib::Properties)]
#[properties(wrapper_type = super::IconItem)]
pub struct IconItem {
#[properties(wrapper_type = super::SidebarIconItem)]
pub struct SidebarIconItem {
/// The type of this item.
#[property(get, construct_only, builder(ItemType::default()))]
pub r#type: Cell<ItemType>,
#[property(get, construct_only, builder(SidebarIconItemType::default()))]
pub item_type: Cell<SidebarIconItemType>,
/// The display name of this item.
#[property(get = Self::display_name)]
pub display_name: PhantomData<String>,
@ -55,46 +55,48 @@ mod imp {
}
#[glib::object_subclass]
impl ObjectSubclass for IconItem {
const NAME: &'static str = "IconItem";
type Type = super::IconItem;
impl ObjectSubclass for SidebarIconItem {
const NAME: &'static str = "SidebarIconItem";
type Type = super::SidebarIconItem;
type ParentType = SidebarItem;
}
#[glib::derived_properties]
impl ObjectImpl for IconItem {}
impl ObjectImpl for SidebarIconItem {}
impl SidebarItemImpl for IconItem {
impl SidebarItemImpl for SidebarIconItem {
fn update_visibility(&self, for_category: CategoryType) {
let obj = self.obj();
match self.r#type.get() {
ItemType::Explore => obj.set_visible(true),
ItemType::Forget => obj.set_visible(for_category == CategoryType::Left),
match self.item_type.get() {
SidebarIconItemType::Explore => obj.set_visible(true),
SidebarIconItemType::Forget => obj.set_visible(for_category == CategoryType::Left),
}
}
}
impl IconItem {
impl SidebarIconItem {
/// The display name of this item.
fn display_name(&self) -> String {
self.r#type.get().to_string()
self.item_type.get().to_string()
}
/// The icon name used for this item.
fn icon_name(&self) -> String {
self.r#type.get().icon_name().to_owned()
self.item_type.get().icon_name().to_owned()
}
}
}
glib::wrapper! {
/// A top-level row in the sidebar with an icon.
pub struct IconItem(ObjectSubclass<imp::IconItem>) @extends SidebarItem;
pub struct SidebarIconItem(ObjectSubclass<imp::SidebarIconItem>) @extends SidebarItem;
}
impl IconItem {
pub fn new(type_: ItemType) -> Self {
glib::Object::builder().property("type", type_).build()
impl SidebarIconItem {
pub fn new(item_type: SidebarIconItemType) -> Self {
glib::Object::builder()
.property("item-type", item_type)
.build()
}
}

8
src/session/model/sidebar_data/item_list.rs

@ -1,6 +1,8 @@
use gtk::{gio, glib, glib::clone, prelude::*, subclass::prelude::*};
use super::{Category, CategoryType, IconItem, ItemType, SidebarItem, SidebarItemExt};
use super::{
Category, CategoryType, SidebarIconItem, SidebarIconItemType, SidebarItem, SidebarItemExt,
};
use crate::session::model::{RoomList, VerificationList};
mod imp {
@ -43,14 +45,14 @@ mod imp {
let verification_list = obj.verification_list();
let list: [SidebarItem; 8] = [
IconItem::new(ItemType::Explore).upcast(),
SidebarIconItem::new(SidebarIconItemType::Explore).upcast(),
Category::new(CategoryType::VerificationRequest, &verification_list).upcast(),
Category::new(CategoryType::Invited, &room_list).upcast(),
Category::new(CategoryType::Favorite, &room_list).upcast(),
Category::new(CategoryType::Normal, &room_list).upcast(),
Category::new(CategoryType::LowPriority, &room_list).upcast(),
Category::new(CategoryType::Left, &room_list).upcast(),
IconItem::new(ItemType::Forget).upcast(),
SidebarIconItem::new(SidebarIconItemType::Forget).upcast(),
];
self.list.set(list.clone()).unwrap();

2
src/session/model/sidebar_data/mod.rs

@ -7,7 +7,7 @@ mod selection;
pub use self::{
category::{Category, CategoryType},
icon_item::{IconItem, ItemType},
icon_item::{SidebarIconItem, SidebarIconItemType},
item::{SidebarItem, SidebarItemExt, SidebarItemImpl},
item_list::ItemList,
list_model::SidebarListModel,

8
src/session/view/content/mod.rs

@ -10,7 +10,9 @@ use self::{
explore::Explore, invite::Invite, room_details::RoomDetails, room_history::RoomHistory,
};
use crate::{
session::model::{IconItem, IdentityVerification, ItemType, Room, RoomType, Session},
session::model::{
IdentityVerification, Room, RoomType, Session, SidebarIconItem, SidebarIconItemType,
},
verification_view::IdentityVerificationView,
};
@ -206,8 +208,8 @@ impl Content {
}
}
Some(o)
if o.downcast_ref::<IconItem>()
.is_some_and(|i| i.r#type() == ItemType::Explore) =>
if o.downcast_ref::<SidebarIconItem>()
.is_some_and(|i| i.item_type() == SidebarIconItemType::Explore) =>
{
imp.explore.init();
imp.stack.set_visible_child(&*imp.explore);

8
src/session/view/sidebar/icon_item_row.rs

@ -1,7 +1,7 @@
use adw::subclass::prelude::BinImpl;
use gtk::{self, glib, prelude::*, subclass::prelude::*, CompositeTemplate};
use crate::session::model::{IconItem, ItemType};
use crate::session::model::{SidebarIconItem, SidebarIconItemType};
mod imp {
use std::cell::RefCell;
@ -16,7 +16,7 @@ mod imp {
pub struct IconItemRow {
/// The [`IconItem`] of this row.
#[property(get, set = Self::set_icon_item, explicit_notify, nullable)]
pub icon_item: RefCell<Option<IconItem>>,
pub icon_item: RefCell<Option<SidebarIconItem>>,
}
#[glib::object_subclass]
@ -43,7 +43,7 @@ mod imp {
impl IconItemRow {
/// Set the [`IconItem`] of this row.
fn set_icon_item(&self, icon_item: Option<IconItem>) {
fn set_icon_item(&self, icon_item: Option<SidebarIconItem>) {
if *self.icon_item.borrow() == icon_item {
return;
}
@ -51,7 +51,7 @@ mod imp {
if icon_item
.as_ref()
.is_some_and(|i| i.r#type() == ItemType::Forget)
.is_some_and(|i| i.item_type() == SidebarIconItemType::Forget)
{
obj.add_css_class("forget");
} else {

4
src/session/view/sidebar/icon_item_row.ui

@ -7,7 +7,7 @@
<child>
<object class="GtkImage">
<binding name="icon-name">
<lookup name="icon-name" type="IconItem">
<lookup name="icon-name" type="SidebarIconItem">
<lookup name="icon-item">SidebarIconItemRow</lookup>
</lookup>
</binding>
@ -20,7 +20,7 @@
<property name="hexpand">True</property>
<property name="ellipsize">end</property>
<binding name="label">
<lookup name="display-name" type="IconItem">
<lookup name="display-name" type="SidebarIconItem">
<lookup name="icon-item">SidebarIconItemRow</lookup>
</lookup>
</binding>

4
src/session/view/sidebar/mod.rs

@ -15,7 +15,7 @@ use self::{
use crate::{
account_switcher::AccountSwitcherButton,
session::model::{
Category, CategoryType, IconItem, IdentityVerification, Room, RoomType, Selection,
Category, CategoryType, IdentityVerification, Room, RoomType, Selection, SidebarIconItem,
SidebarListModel, User,
},
utils::expression,
@ -121,7 +121,7 @@ mod imp {
match row.item() {
Some(o) if o.is::<Category>() => row.set_expanded(!row.is_expanded()),
Some(o) if o.is::<Room>() => model.set_selected(pos),
Some(o) if o.is::<IconItem>() => model.set_selected(pos),
Some(o) if o.is::<SidebarIconItem>() => model.set_selected(pos),
Some(o) if o.is::<IdentityVerification>() => model.set_selected(pos),
_ => {}
}

22
src/session/view/sidebar/row.rs

@ -5,8 +5,8 @@ use gtk::{accessible::Relation, gdk, glib, glib::clone};
use super::{CategoryRow, IconItemRow, RoomRow, Sidebar, VerificationRow};
use crate::{
session::model::{
Category, CategoryType, IconItem, IdentityVerification, ItemType, Room, RoomType,
SidebarItem,
Category, CategoryType, IdentityVerification, Room, RoomType, SidebarIconItem,
SidebarIconItemType, SidebarItem,
},
spawn, toast,
utils::{message_dialog, BoundObjectWeakRef},
@ -135,7 +135,7 @@ mod imp {
};
child.set_room(Some(room.clone()));
} else if let Some(icon_item) = item.downcast_ref::<IconItem>() {
} else if let Some(icon_item) = item.downcast_ref::<SidebarIconItem>() {
let child = if let Some(child) = obj.child().and_downcast::<IconItemRow>() {
child
} else {
@ -207,13 +207,13 @@ impl Row {
}
}
/// Get the [`ItemType`] of this item.
/// Get the [`SidebarIconItemType`] of this item.
///
/// If this is not an [`IconItem`], returns `None`.
pub fn item_type(&self) -> Option<ItemType> {
/// If this is not a [`SidebarIconItem`], returns `None`.
pub fn item_type(&self) -> Option<SidebarIconItemType> {
self.item()
.and_downcast_ref::<IconItem>()
.map(|i| i.r#type())
.and_downcast_ref::<SidebarIconItem>()
.map(|i| i.item_type())
}
/// Handle the drag-n-drop hovering this row.
@ -234,7 +234,7 @@ impl Row {
return true;
}
} else if let Some(item_type) = self.item_type() {
if room.category() == RoomType::Left && item_type == ItemType::Forget {
if room.category() == RoomType::Left && item_type == SidebarIconItemType::Forget {
self.add_css_class("drop-active");
sidebar.set_drop_active_target_type(None);
return true;
@ -264,7 +264,7 @@ impl Row {
ret = true;
}
} else if let Some(item_type) = self.item_type() {
if room.category() == RoomType::Left && item_type == ItemType::Forget {
if room.category() == RoomType::Left && item_type == SidebarIconItemType::Forget {
spawn!(clone!(@strong self as obj, @weak room => async move {
obj.forget_room(&room).await;
}));
@ -338,7 +338,7 @@ impl Row {
} else {
let is_forget_item = self
.item_type()
.is_some_and(|item_type| item_type == ItemType::Forget);
.is_some_and(|item_type| item_type == SidebarIconItemType::Forget);
if is_forget_item && source_type == RoomType::Left {
self.remove_css_class("drop-disabled");
} else {

Loading…
Cancel
Save