@@ -31,7 +31,6 @@ use crate::bottom_pane::textarea::TextAreaState;
31
31
use codex_file_search:: FileMatch ;
32
32
use std:: cell:: RefCell ;
33
33
34
- const BASE_PLACEHOLDER_TEXT : & str = "Ask Codex to do anything" ;
35
34
/// If the pasted content exceeds this number of characters, replace it with a
36
35
/// placeholder in the UI.
37
36
const LARGE_PASTE_CHAR_THRESHOLD : usize = 1000 ;
@@ -61,6 +60,7 @@ pub(crate) struct ChatComposer {
61
60
pending_pastes : Vec < ( String , String ) > ,
62
61
token_usage_info : Option < TokenUsageInfo > ,
63
62
has_focus : bool ,
63
+ placeholder_text : String ,
64
64
}
65
65
66
66
/// Popup state – at most one can be visible at any time.
@@ -75,6 +75,7 @@ impl ChatComposer {
75
75
has_input_focus : bool ,
76
76
app_event_tx : AppEventSender ,
77
77
enhanced_keys_supported : bool ,
78
+ placeholder_text : String ,
78
79
) -> Self {
79
80
let use_shift_enter_hint = enhanced_keys_supported;
80
81
@@ -91,6 +92,7 @@ impl ChatComposer {
91
92
pending_pastes : Vec :: new ( ) ,
92
93
token_usage_info : None ,
93
94
has_focus : has_input_focus,
95
+ placeholder_text,
94
96
}
95
97
}
96
98
@@ -712,7 +714,7 @@ impl WidgetRef for &ChatComposer {
712
714
let mut state = self . textarea_state . borrow_mut ( ) ;
713
715
StatefulWidgetRef :: render_ref ( & ( & self . textarea ) , textarea_rect, buf, & mut state) ;
714
716
if self . textarea . text ( ) . is_empty ( ) {
715
- Line :: from ( BASE_PLACEHOLDER_TEXT )
717
+ Line :: from ( self . placeholder_text . as_str ( ) )
716
718
. style ( Style :: default ( ) . dim ( ) )
717
719
. render_ref ( textarea_rect. inner ( Margin :: new ( 1 , 0 ) ) , buf) ;
718
720
}
@@ -885,7 +887,8 @@ mod tests {
885
887
886
888
let ( tx, _rx) = std:: sync:: mpsc:: channel ( ) ;
887
889
let sender = AppEventSender :: new ( tx) ;
888
- let mut composer = ChatComposer :: new ( true , sender, false ) ;
890
+ let mut composer =
891
+ ChatComposer :: new ( true , sender, false , "Ask Codex to do anything" . to_string ( ) ) ;
889
892
890
893
let needs_redraw = composer. handle_paste ( "hello" . to_string ( ) ) ;
891
894
assert ! ( needs_redraw) ;
@@ -908,7 +911,8 @@ mod tests {
908
911
909
912
let ( tx, _rx) = std:: sync:: mpsc:: channel ( ) ;
910
913
let sender = AppEventSender :: new ( tx) ;
911
- let mut composer = ChatComposer :: new ( true , sender, false ) ;
914
+ let mut composer =
915
+ ChatComposer :: new ( true , sender, false , "Ask Codex to do anything" . to_string ( ) ) ;
912
916
913
917
let large = "x" . repeat ( LARGE_PASTE_CHAR_THRESHOLD + 10 ) ;
914
918
let needs_redraw = composer. handle_paste ( large. clone ( ) ) ;
@@ -937,7 +941,8 @@ mod tests {
937
941
let large = "y" . repeat ( LARGE_PASTE_CHAR_THRESHOLD + 1 ) ;
938
942
let ( tx, _rx) = std:: sync:: mpsc:: channel ( ) ;
939
943
let sender = AppEventSender :: new ( tx) ;
940
- let mut composer = ChatComposer :: new ( true , sender, false ) ;
944
+ let mut composer =
945
+ ChatComposer :: new ( true , sender, false , "Ask Codex to do anything" . to_string ( ) ) ;
941
946
942
947
composer. handle_paste ( large) ;
943
948
assert_eq ! ( composer. pending_pastes. len( ) , 1 ) ;
@@ -973,7 +978,12 @@ mod tests {
973
978
974
979
for ( name, input) in test_cases {
975
980
// Create a fresh composer for each test case
976
- let mut composer = ChatComposer :: new ( true , sender. clone ( ) , false ) ;
981
+ let mut composer = ChatComposer :: new (
982
+ true ,
983
+ sender. clone ( ) ,
984
+ false ,
985
+ "Ask Codex to do anything" . to_string ( ) ,
986
+ ) ;
977
987
978
988
if let Some ( text) = input {
979
989
composer. handle_paste ( text) ;
@@ -1011,7 +1021,8 @@ mod tests {
1011
1021
1012
1022
let ( tx, rx) = std:: sync:: mpsc:: channel ( ) ;
1013
1023
let sender = AppEventSender :: new ( tx) ;
1014
- let mut composer = ChatComposer :: new ( true , sender, false ) ;
1024
+ let mut composer =
1025
+ ChatComposer :: new ( true , sender, false , "Ask Codex to do anything" . to_string ( ) ) ;
1015
1026
1016
1027
// Type the slash command.
1017
1028
for ch in [
@@ -1054,7 +1065,8 @@ mod tests {
1054
1065
1055
1066
let ( tx, rx) = std:: sync:: mpsc:: channel ( ) ;
1056
1067
let sender = AppEventSender :: new ( tx) ;
1057
- let mut composer = ChatComposer :: new ( true , sender, false ) ;
1068
+ let mut composer =
1069
+ ChatComposer :: new ( true , sender, false , "Ask Codex to do anything" . to_string ( ) ) ;
1058
1070
1059
1071
for ch in [ '/' , 'm' , 'e' , 'n' , 't' , 'i' , 'o' , 'n' ] {
1060
1072
let _ = composer. handle_key_event ( KeyEvent :: new ( KeyCode :: Char ( ch) , KeyModifiers :: NONE ) ) ;
@@ -1093,7 +1105,8 @@ mod tests {
1093
1105
1094
1106
let ( tx, _rx) = std:: sync:: mpsc:: channel ( ) ;
1095
1107
let sender = AppEventSender :: new ( tx) ;
1096
- let mut composer = ChatComposer :: new ( true , sender, false ) ;
1108
+ let mut composer =
1109
+ ChatComposer :: new ( true , sender, false , "Ask Codex to do anything" . to_string ( ) ) ;
1097
1110
1098
1111
// Define test cases: (paste content, is_large)
1099
1112
let test_cases = [
@@ -1166,7 +1179,8 @@ mod tests {
1166
1179
1167
1180
let ( tx, _rx) = std:: sync:: mpsc:: channel ( ) ;
1168
1181
let sender = AppEventSender :: new ( tx) ;
1169
- let mut composer = ChatComposer :: new ( true , sender, false ) ;
1182
+ let mut composer =
1183
+ ChatComposer :: new ( true , sender, false , "Ask Codex to do anything" . to_string ( ) ) ;
1170
1184
1171
1185
// Define test cases: (content, is_large)
1172
1186
let test_cases = [
@@ -1232,7 +1246,8 @@ mod tests {
1232
1246
1233
1247
let ( tx, _rx) = std:: sync:: mpsc:: channel ( ) ;
1234
1248
let sender = AppEventSender :: new ( tx) ;
1235
- let mut composer = ChatComposer :: new ( true , sender, false ) ;
1249
+ let mut composer =
1250
+ ChatComposer :: new ( true , sender, false , "Ask Codex to do anything" . to_string ( ) ) ;
1236
1251
1237
1252
// Define test cases: (cursor_position_from_end, expected_pending_count)
1238
1253
let test_cases = [
0 commit comments