@@ -49,6 +49,25 @@ impl Component for App {
4949 . tooltip_text ( "Add project" )
5050 . build ( ) ;
5151 add_project_button. add_css_class ( "flat" ) ;
52+ let projects_empty_add_button = gtk:: Button :: builder ( )
53+ . child (
54+ & adw:: ButtonContent :: builder ( )
55+ . icon_name ( "list-add-symbolic" )
56+ . label ( "Add Project" )
57+ . build ( ) ,
58+ )
59+ . halign ( gtk:: Align :: Center )
60+ . build ( ) ;
61+ projects_empty_add_button. add_css_class ( "suggested-action" ) ;
62+ let projects_empty_page = adw:: StatusPage :: builder ( )
63+ . icon_name ( "folder-symbolic" )
64+ . title ( "No Projects Yet" )
65+ . description ( "Create a project to organize your clusters." )
66+ . valign ( gtk:: Align :: Center )
67+ . vexpand ( true )
68+ . build ( ) ;
69+ projects_empty_page. set_child ( Some ( & projects_empty_add_button) ) ;
70+ let projects_content_stack = gtk:: Stack :: new ( ) ;
5271 let context_selector_label = gtk:: Label :: new ( Some ( "No cluster" ) ) ;
5372 context_selector_label. set_ellipsize ( gtk:: pango:: EllipsizeMode :: End ) ;
5473 context_selector_label. set_max_width_chars ( 22 ) ;
@@ -82,23 +101,48 @@ impl Component for App {
82101 . tooltip_text ( "Add cluster" )
83102 . build ( ) ;
84103 let import_cluster_button = gtk:: Button :: builder ( ) . label ( "Import" ) . build ( ) ;
104+ let clusters_empty_add_button = gtk:: Button :: builder ( )
105+ . child (
106+ & adw:: ButtonContent :: builder ( )
107+ . icon_name ( "list-add-symbolic" )
108+ . label ( "Add Cluster" )
109+ . build ( ) ,
110+ )
111+ . halign ( gtk:: Align :: Center )
112+ . build ( ) ;
113+ clusters_empty_add_button. add_css_class ( "suggested-action" ) ;
114+ let clusters_empty_page = adw:: StatusPage :: builder ( )
115+ . icon_name ( "network-server-symbolic" )
116+ . title ( "No Clusters Yet" )
117+ . description ( "Add a cluster to start browsing this project." )
118+ . valign ( gtk:: Align :: Center )
119+ . vexpand ( true )
120+ . build ( ) ;
121+ clusters_empty_page. set_child ( Some ( & clusters_empty_add_button) ) ;
122+ let clusters_content_stack = gtk:: Stack :: new ( ) ;
85123 let namespace_selector_label = gtk:: Label :: new ( Some ( "default" ) ) ;
86124 let namespace_menu_button = gtk:: MenuButton :: new ( ) ;
87125 namespace_menu_button. set_size_request ( 170 , -1 ) ;
88126 namespace_menu_button. set_child ( Some ( & selector_button_child ( & namespace_selector_label) ) ) ;
89127 let namespace_list = gtk:: ListBox :: new ( ) ;
90128 namespace_menu_button. set_popover ( Some ( & selector_popover ( & namespace_list) ) ) ;
91- let custom_namespace_entry = gtk :: Entry :: builder ( )
92- . placeholder_text ( "my-namespace ")
129+ let custom_namespace_entry = adw :: EntryRow :: builder ( )
130+ . title ( "Namespace ")
93131 . hexpand ( true )
94132 . build ( ) ;
95133 let custom_namespace_button = gtk:: Button :: builder ( )
96134 . label ( "Use" )
97135 . tooltip_text ( "Use and save this namespace" )
98136 . build ( ) ;
99137 custom_namespace_button. add_css_class ( "suggested-action" ) ;
100- let project_name_entry = gtk:: Entry :: builder ( )
101- . placeholder_text ( "Production" )
138+ let rename_namespace_entry = adw:: EntryRow :: builder ( )
139+ . title ( "Namespace" )
140+ . hexpand ( true )
141+ . build ( ) ;
142+ let rename_namespace_button = gtk:: Button :: builder ( ) . label ( "Rename" ) . build ( ) ;
143+ rename_namespace_button. add_css_class ( "suggested-action" ) ;
144+ let project_name_entry = adw:: EntryRow :: builder ( )
145+ . title ( "Project Name" )
102146 . hexpand ( true )
103147 . build ( ) ;
104148 let project_create_button = gtk:: Button :: builder ( ) . label ( "Create" ) . build ( ) ;
@@ -389,25 +433,21 @@ impl Component for App {
389433 expand_logs_button : & detail_expand_logs_button,
390434 } ) ;
391435
392- let setup_name_entry = gtk:: Entry :: builder ( )
393- . placeholder_text ( "production" )
394- . hexpand ( true )
395- . build ( ) ;
396- let setup_server_entry = gtk:: Entry :: builder ( )
397- . placeholder_text ( "https://127.0.0.1:6443" )
436+ let setup_name_entry = adw:: EntryRow :: builder ( ) . title ( "Name" ) . hexpand ( true ) . build ( ) ;
437+ let setup_server_entry = adw:: EntryRow :: builder ( )
438+ . title ( "API Server" )
398439 . hexpand ( true )
399440 . build ( ) ;
400- let setup_token_entry = gtk :: PasswordEntry :: builder ( )
401- . placeholder_text ( "Bearer token " )
441+ let setup_token_entry = adw :: PasswordEntryRow :: builder ( )
442+ . title ( "Bearer Token " )
402443 . hexpand ( true )
403- . show_peek_icon ( true )
404444 . build ( ) ;
405- let setup_ca_entry = gtk :: Entry :: builder ( )
406- . placeholder_text ( "Optional base64 CA data ")
445+ let setup_ca_entry = adw :: EntryRow :: builder ( )
446+ . title ( " CA Data ")
407447 . hexpand ( true )
408448 . build ( ) ;
409- let setup_insecure_check = gtk :: CheckButton :: builder ( )
410- . label ( "Skip TLS verification " )
449+ let setup_insecure_check = adw :: SwitchRow :: builder ( )
450+ . title ( "Skip TLS Verification " )
411451 . build ( ) ;
412452 let setup_button = gtk:: Button :: builder ( )
413453 . label ( "Add Cluster" )
@@ -422,6 +462,8 @@ impl Component for App {
422462 open_dialog_button. add_css_class ( "suggested-action" ) ;
423463 let custom_namespace_dialog =
424464 build_custom_namespace_dialog ( & custom_namespace_entry, & custom_namespace_button) ;
465+ let rename_namespace_dialog =
466+ build_rename_namespace_dialog ( & rename_namespace_entry, & rename_namespace_button) ;
425467 let project_dialog = build_project_dialog (
426468 & project_name_entry,
427469 & project_create_button,
@@ -504,7 +546,12 @@ impl Component for App {
504546 split_view. set_content ( Some ( & content) ) ;
505547 root_stack. add_named ( & build_empty_setup_page ( & open_dialog_button) , Some ( "setup" ) ) ;
506548 root_stack. add_named (
507- & build_projects_page ( & project_list, & add_project_button) ,
549+ & build_projects_page (
550+ & project_list,
551+ & add_project_button,
552+ & projects_content_stack,
553+ & projects_empty_page,
554+ ) ,
508555 Some ( "projects" ) ,
509556 ) ;
510557 root_stack. add_named (
@@ -516,6 +563,8 @@ impl Component for App {
516563 cluster_list : & cluster_list,
517564 add_cluster_button : & add_cluster_button,
518565 import_cluster_button : & import_cluster_button,
566+ content_stack : & clusters_content_stack,
567+ empty_page : & clusters_empty_page,
519568 } ) ,
520569 Some ( "clusters" ) ,
521570 ) ;
@@ -554,6 +603,10 @@ impl Component for App {
554603 let sender = sender. clone ( ) ;
555604 move |_| sender. input ( AppMsg :: ShowAddClusterDialog )
556605 } ) ;
606+ clusters_empty_add_button. connect_clicked ( {
607+ let sender = sender. clone ( ) ;
608+ move |_| sender. input ( AppMsg :: ShowAddClusterDialog )
609+ } ) ;
557610 import_cluster_button. connect_clicked ( {
558611 let sender = sender. clone ( ) ;
559612 move |_| sender. input ( AppMsg :: ShowImportFile )
@@ -570,14 +623,26 @@ impl Component for App {
570623 let sender = sender. clone ( ) ;
571624 move |_| sender. input ( AppMsg :: ShowAddProjectDialog )
572625 } ) ;
573- custom_namespace_entry. connect_activate ( {
626+ projects_empty_add_button. connect_clicked ( {
627+ let sender = sender. clone ( ) ;
628+ move |_| sender. input ( AppMsg :: ShowAddProjectDialog )
629+ } ) ;
630+ custom_namespace_entry. connect_entry_activated ( {
574631 let sender = sender. clone ( ) ;
575632 move |_| sender. input ( AppMsg :: CustomNamespaceEntered )
576633 } ) ;
577634 custom_namespace_button. connect_clicked ( {
578635 let sender = sender. clone ( ) ;
579636 move |_| sender. input ( AppMsg :: CustomNamespaceEntered )
580637 } ) ;
638+ rename_namespace_entry. connect_entry_activated ( {
639+ let sender = sender. clone ( ) ;
640+ move |_| sender. input ( AppMsg :: RenameNamespaceConfirmed )
641+ } ) ;
642+ rename_namespace_button. connect_clicked ( {
643+ let sender = sender. clone ( ) ;
644+ move |_| sender. input ( AppMsg :: RenameNamespaceConfirmed )
645+ } ) ;
581646 status_filter_list. connect_child_activated ( {
582647 let sender = sender. clone ( ) ;
583648 move |_, child| sender. input ( AppMsg :: StatusFilterChanged ( child. index ( ) as u32 ) )
@@ -586,7 +651,7 @@ impl Component for App {
586651 let sender = sender. clone ( ) ;
587652 move |_, child| sender. input ( AppMsg :: ObjectColumnToggled ( child. index ( ) as u32 ) )
588653 } ) ;
589- project_name_entry. connect_activate ( {
654+ project_name_entry. connect_entry_activated ( {
590655 let sender = sender. clone ( ) ;
591656 move |_| sender. input ( AppMsg :: AddProject )
592657 } ) ;
@@ -752,13 +817,15 @@ impl Component for App {
752817 project_list,
753818 project_title_label,
754819 add_project_button,
820+ projects_content_stack,
755821 cluster_back_button,
756822 cluster_menu_button,
757823 cluster_refresh_button,
758824 context_selector_label,
759825 cluster_list,
760826 add_cluster_button,
761827 import_cluster_button,
828+ clusters_content_stack,
762829 cluster_summaries : std:: collections:: HashMap :: new ( ) ,
763830 namespace_menu_button,
764831 namespace_selector_label,
@@ -835,6 +902,10 @@ impl Component for App {
835902 custom_namespace_dialog,
836903 custom_namespace_entry,
837904 custom_namespace_button,
905+ rename_namespace_dialog,
906+ rename_namespace_entry,
907+ rename_namespace_button,
908+ renaming_namespace : None ,
838909 project_dialog,
839910 project_dialog_description,
840911 project_name_entry,
0 commit comments