11// Custom view example with rainbow border
22
3- use iced:: widget:: { column , container} ;
3+ use iced:: widget:: container;
44use iced:: { time, Border } ;
55use iced:: { Color , Element , Length , Settings , Subscription , Task , Theme } ;
66use std:: time:: { Duration , Instant } ;
77
8- use icy_browser:: {
9- browser_view, get_fonts, hoverable, nav_bar, tab_bar, widgets, BrowserEngine , BrowserWidget ,
10- Ultralight ,
11- } ;
8+ use icy_browser:: { get_fonts, widgets, IcyBrowser , Ultralight } ;
129
1310fn main ( ) -> iced:: Result {
1411 let settings = Settings {
@@ -37,44 +34,53 @@ struct CustomWidgetState {
3734}
3835
3936struct Browser {
40- widgets : BrowserWidget < Ultralight , CustomWidgetState > ,
37+ icy_browser : IcyBrowser < Ultralight > ,
38+ custom_widget_state : CustomWidgetState ,
4139}
4240
4341impl Default for Browser {
4442 fn default ( ) -> Self {
4543 Self {
46- widgets : BrowserWidget :: new ( )
47- . with_custom_view (
48- custom_view,
49- CustomWidgetState {
50- border_colors : vec ! [
51- Color :: from_rgb( 1.0 , 0.0 , 0.0 ) , // Red
52- Color :: from_rgb( 1.0 , 0.5 , 0.0 ) , // Orange
53- Color :: from_rgb( 1.0 , 1.0 , 0.0 ) , // Yellow
54- Color :: from_rgb( 0.0 , 1.0 , 0.0 ) , // Green
55- Color :: from_rgb( 0.0 , 0.0 , 1.0 ) , // Blue
56- Color :: from_rgb( 0.29 , 0.0 , 0.51 ) , // Indigo
57- Color :: from_rgb( 0.56 , 0.0 , 1.0 ) , // Violet
58- ] ,
59- start_time : Instant :: now ( ) ,
60- } ,
61- )
62- . build ( ) ,
44+ icy_browser : IcyBrowser :: new ( ) . with_tab_bar ( ) . with_nav_bar ( ) . build ( ) ,
45+ custom_widget_state : CustomWidgetState {
46+ border_colors : vec ! [
47+ Color :: from_rgb( 1.0 , 0.0 , 0.0 ) , // Red
48+ Color :: from_rgb( 1.0 , 0.5 , 0.0 ) , // Orange
49+ Color :: from_rgb( 1.0 , 1.0 , 0.0 ) , // Yellow
50+ Color :: from_rgb( 0.0 , 1.0 , 0.0 ) , // Green
51+ Color :: from_rgb( 0.0 , 0.0 , 1.0 ) , // Blue
52+ Color :: from_rgb( 0.29 , 0.0 , 0.51 ) , // Indigo
53+ Color :: from_rgb( 0.56 , 0.0 , 1.0 ) , // Violet
54+ ] ,
55+ start_time : Instant :: now ( ) ,
56+ } ,
6357 }
6458 }
6559}
6660
6761impl Browser {
6862 fn update ( & mut self , message : Message ) -> Task < Message > {
6963 match message {
70- Message :: BrowserWidget ( msg) => self . widgets . update ( msg) . map ( Message :: BrowserWidget ) ,
71- Message :: Update => self . widgets . force_update ( ) . map ( Message :: BrowserWidget ) ,
64+ Message :: BrowserWidget ( msg) => self . icy_browser . update ( msg) . map ( Message :: BrowserWidget ) ,
65+ Message :: Update => self . icy_browser . force_update ( ) . map ( Message :: BrowserWidget ) ,
7266 Message :: Tick => Task :: none ( ) , // Tick
7367 }
7468 }
7569
7670 fn view ( & self ) -> Element < Message > {
77- self . widgets . view ( ) . map ( Message :: BrowserWidget )
71+ let elapsed = self . custom_widget_state . start_time . elapsed ( ) . as_secs_f32 ( ) ;
72+ let color_index = ( elapsed * 2.0 ) as usize % self . custom_widget_state . border_colors . len ( ) ;
73+ let color = self . custom_widget_state . border_colors [ color_index] ;
74+
75+ container ( self . icy_browser . view ( ) . map ( Message :: BrowserWidget ) )
76+ . center_x ( Length :: Fill )
77+ . center_y ( Length :: Fill )
78+ . padding ( 20 )
79+ . style ( move |_theme| container:: Style {
80+ border : Border :: default ( ) . color ( color) . width ( 20 ) ,
81+ ..Default :: default ( )
82+ } )
83+ . into ( )
7884 }
7985
8086 fn subscription ( & self ) -> Subscription < Message > {
@@ -84,31 +90,3 @@ impl Browser {
8490 ] )
8591 }
8692}
87-
88- fn custom_view < Engine : BrowserEngine > (
89- browser_widget : & BrowserWidget < Engine , CustomWidgetState > ,
90- widget_state : CustomWidgetState ,
91- ) -> Element < icy_browser:: Message > {
92- let elapsed = widget_state. start_time . elapsed ( ) . as_secs_f32 ( ) ;
93- let color_index = ( elapsed * 2.0 ) as usize % widget_state. border_colors . len ( ) ;
94- let color = widget_state. border_colors [ color_index] ;
95-
96- container ( column ! [
97- tab_bar( browser_widget. engine( ) . get_tabs( ) ) ,
98- hoverable( nav_bar( & browser_widget. nav_bar_state) )
99- . on_focus_change( icy_browser:: Message :: UpdateUrl ) ,
100- browser_view(
101- browser_widget. view_size,
102- browser_widget. engine( ) . get_tabs( ) . get_current( ) . get_view( ) ,
103- !browser_widget. show_overlay,
104- ) ,
105- ] )
106- . center_x ( Length :: Fill )
107- . center_y ( Length :: Fill )
108- . padding ( 20 )
109- . style ( move |_theme| container:: Style {
110- border : Border :: default ( ) . color ( color) . width ( 20 ) ,
111- ..Default :: default ( )
112- } )
113- . into ( )
114- }
0 commit comments