@@ -11,6 +11,7 @@ use iced::{Alignment, Length, Padding, Task, padding};
1111use tokio:: time;
1212
1313use super :: { Focus , Panes , Server } ;
14+ use crate :: buffer:: context_menu as buffer_context_menu;
1415use crate :: widget:: { Element , Text , context_menu, double_pass} ;
1516use crate :: { Theme , font, icon, platform_specific, theme, window} ;
1617
@@ -38,6 +39,7 @@ pub enum Message {
3839 ReloadComplete ,
3940 MarkAsRead ( buffer:: Upstream ) ,
4041 MarkServerAsRead ( Server ) ,
42+ NicklistEvent ( buffer_context_menu:: Message ) ,
4143 QuitApplication ,
4244}
4345
@@ -61,6 +63,7 @@ pub enum Event {
6163 ConfigReloaded ( Result < Config , config:: Error > ) ,
6264 MarkAsRead ( buffer:: Upstream ) ,
6365 MarkServerAsRead ( Server ) ,
66+ NicklistEvent ( buffer_context_menu:: Message ) ,
6467 QuitApplication ,
6568}
6669
@@ -156,6 +159,9 @@ impl Sidebar {
156159 Message :: MarkServerAsRead ( server) => {
157160 ( Task :: none ( ) , Some ( Event :: MarkServerAsRead ( server) ) )
158161 }
162+ Message :: NicklistEvent ( message) => {
163+ ( Task :: none ( ) , Some ( Event :: NicklistEvent ( message) ) )
164+ }
159165 Message :: OpenConfigFile => {
160166 ( Task :: none ( ) , Some ( Event :: OpenConfigFile ) )
161167 }
@@ -393,7 +399,7 @@ impl Sidebar {
393399 pub fn view < ' a > (
394400 & ' a self ,
395401 servers : & server:: Map ,
396- clients : & data:: client:: Map ,
402+ clients : & ' a data:: client:: Map ,
397403 history : & ' a history:: Manager ,
398404 panes : & ' a Panes ,
399405 focus : Focus ,
@@ -564,27 +570,49 @@ impl Sidebar {
564570
565571 match config. sidebar . position {
566572 sidebar:: Position :: Left | sidebar:: Position :: Right => {
567- // Add buffers to a column.
568- let buffers = column ! [
569- Scrollable :: new(
570- Column :: with_children( buffers) . spacing( 1 )
571- )
572- . direction(
573- scrollable:: Direction :: Vertical (
574- scrollable:: Scrollbar :: default ( )
575- . width( config. sidebar. scrollbar. width)
576- . scroller_width(
577- config. sidebar. scrollbar. scroller_width
578- )
573+ let nicklist: Option < Element < ' a , Message > > =
574+ if config. sidebar . show_nicklist {
575+ focused_channel_nicklist (
576+ panes, focus, clients, config, theme, width,
579577 )
580- )
581- ] ;
578+ . map ( |list| {
579+ container ( list)
580+ . padding ( [ 0 , 2 ] )
581+ . height ( if config. sidebar . split {
582+ Length :: FillPortion (
583+ config. sidebar . nicklist_space ,
584+ )
585+ } else {
586+ Length :: Fill
587+ } )
588+ . into ( )
589+ } )
590+ } else {
591+ None
592+ } ;
582593
583- // Wrap buffers in a column with user_menu_button
584- let content = column ! [
585- container( buffers) . height( Length :: Fill ) ,
586- user_menu_button,
587- ] ;
594+ let buflist_height =
595+ if config. sidebar . split && nicklist. is_some ( ) {
596+ Length :: FillPortion ( config. sidebar . buflist_space )
597+ } else if nicklist. is_some ( ) {
598+ Length :: Shrink
599+ } else {
600+ Length :: Fill
601+ } ;
602+
603+ let buflist = Scrollable :: new (
604+ Column :: with_children ( buffers) . spacing ( 0 ) ,
605+ )
606+ . direction ( scrollable:: Direction :: Vertical (
607+ scrollable:: Scrollbar :: default ( )
608+ . width ( config. sidebar . scrollbar . width )
609+ . scroller_width (
610+ config. sidebar . scrollbar . scroller_width ,
611+ ) ,
612+ ) )
613+ . height ( buflist_height) ;
614+
615+ let content = column ! [ buflist, nicklist, user_menu_button, ] ;
588616
589617 container ( content)
590618 }
@@ -656,6 +684,41 @@ impl Sidebar {
656684 }
657685}
658686
687+ fn focused_channel_nicklist < ' a > (
688+ panes : & ' a Panes ,
689+ focus : Focus ,
690+ clients : & ' a data:: client:: Map ,
691+ config : & ' a Config ,
692+ theme : & ' a Theme ,
693+ width : Length ,
694+ ) -> Option < Element < ' a , Message > > {
695+ if !matches ! ( width, Length :: Fill ) {
696+ return None ;
697+ }
698+
699+ let ( server, channel) =
700+ panes. iter ( ) . find_map ( |( window, pane, state) | {
701+ if ( Focus { window, pane } ) != focus {
702+ return None ;
703+ }
704+ match state. buffer . upstream ( ) {
705+ Some ( buffer:: Upstream :: Channel ( server, channel) ) => {
706+ Some ( ( server, channel) )
707+ }
708+ _ => None ,
709+ }
710+ } ) ?;
711+
712+ let users = clients. get_channel_users ( server, channel) ;
713+ let prefix = clients. get_prefix ( server) ;
714+ let list = crate :: buffer:: channel:: nick_list:: view (
715+ server, prefix, channel, users, None , config, theme,
716+ )
717+ . map ( Message :: NicklistEvent ) ;
718+
719+ Some ( list)
720+ }
721+
659722#[ derive( Debug , Clone , Copy ) ]
660723enum Menu {
661724 RefreshConfig ,
0 commit comments