@@ -1138,6 +1138,127 @@ logfile_sub_source::text_attrs_for_line(textview_curses& lv,
11381138 value_out = std::move (this ->lss_token_al .al_attrs );
11391139}
11401140
1141+ void
1142+ logfile_sub_source::text_horiz_columns (textview_curses& tc,
1143+ vis_line_t start_row,
1144+ vis_line_t end_row,
1145+ std::set<int >& columns_out)
1146+ {
1147+ if (this ->lss_indexing_in_progress ) {
1148+ return ;
1149+ }
1150+
1151+ auto count = vis_line_t ((int ) this ->text_line_count ());
1152+ auto begin = std::max (0_vl, start_row);
1153+ auto last = std::min (count, end_row);
1154+ if (last <= begin) {
1155+ return ;
1156+ }
1157+ auto win = this ->window_at (begin, last);
1158+ std::map<intern_string_t , int > field2left;
1159+ std::optional<int > ts_left_opt;
1160+ std::optional<int > level_left_opt;
1161+ std::optional<int > body_left_opt;
1162+ for (const auto & msg : *win) {
1163+ const auto & values = msg.get_values ();
1164+ auto line_sf = values.lvv_sbr .to_string_fragment ();
1165+ std::optional<line_range> ts_range;
1166+ std::optional<line_range> level_range;
1167+ auto time_col_size = this ->lss_time_column_size ;
1168+ if (time_col_size > 0 ) {
1169+ time_col_size -= 1 ;
1170+ }
1171+ for (const auto & sa : msg.get_attrs ()) {
1172+ if (sa.sa_type != &L_TIMESTAMP && sa.sa_type != &L_LEVEL) {
1173+ continue ;
1174+ }
1175+ if (!sa.sa_range .is_valid ()) {
1176+ continue ;
1177+ }
1178+ if (this ->lss_line_context == line_context_t ::time_column) {
1179+ if (sa.sa_type == &L_TIMESTAMP) {
1180+ ts_range = sa.sa_range ;
1181+ } else {
1182+ level_range = sa.sa_range ;
1183+ }
1184+ } else {
1185+ auto sa_left
1186+ = (int ) line_sf.byte_to_column_index (sa.sa_range .lr_start );
1187+ if (sa.sa_type == &L_TIMESTAMP) {
1188+ if (!ts_left_opt || sa_left < ts_left_opt.value ()) {
1189+ ts_left_opt = sa_left;
1190+ }
1191+ } else {
1192+ if (!level_left_opt || sa_left < level_left_opt.value ()) {
1193+ level_left_opt = sa_left;
1194+ }
1195+ }
1196+ }
1197+ }
1198+ for (const auto & sa : msg.get_attrs ()) {
1199+ if (sa.sa_type != &SA_BODY) {
1200+ continue ;
1201+ }
1202+ if (!sa.sa_range .is_valid ()) {
1203+ continue ;
1204+ }
1205+ auto curr_range = sa.sa_range ;
1206+ if (ts_range && ts_range.value () < sa.sa_range ) {
1207+ curr_range.lr_start -= ts_range->length ();
1208+ }
1209+ if (level_range && level_range.value () < sa.sa_range ) {
1210+ curr_range.lr_start -= level_range->length ();
1211+ }
1212+ curr_range.lr_start += time_col_size;
1213+ auto body_left
1214+ = (int ) line_sf.byte_to_column_index (curr_range.lr_start );
1215+ if (!body_left_opt || body_left < body_left_opt.value ()) {
1216+ body_left_opt = body_left;
1217+ }
1218+ }
1219+ for (const auto & lv : values.lvv_values ) {
1220+ if (!lv.lv_origin .is_valid () || lv.lv_origin .lr_start < 0 ) {
1221+ continue ;
1222+ }
1223+ if (lv.lv_meta .lvm_column .is <logline_value_meta::internal_column>())
1224+ {
1225+ continue ;
1226+ }
1227+ auto curr_range = lv.lv_origin ;
1228+ if (ts_range && ts_range.value () < lv.lv_origin ) {
1229+ curr_range.lr_start -= ts_range->length ();
1230+ }
1231+ if (level_range && level_range.value () < lv.lv_origin ) {
1232+ curr_range.lr_start -= level_range->length ();
1233+ }
1234+ curr_range.lr_start += time_col_size;
1235+
1236+ auto left_for_value
1237+ = (int ) line_sf.byte_to_column_index (curr_range.lr_start );
1238+ auto iter = field2left.find (lv.lv_meta .lvm_name );
1239+ if (iter == field2left.end ()) {
1240+ field2left.emplace (lv.lv_meta .lvm_name , left_for_value);
1241+ } else if (left_for_value < iter->second ) {
1242+ iter->second = left_for_value;
1243+ }
1244+ }
1245+ }
1246+
1247+ for (const auto & [name, left] : field2left) {
1248+ log_debug (" inserting %d for %s" , left, name.c_str ());
1249+ columns_out.insert (left);
1250+ }
1251+ if (body_left_opt) {
1252+ columns_out.insert (body_left_opt.value ());
1253+ }
1254+ if (ts_left_opt) {
1255+ columns_out.insert (ts_left_opt.value ());
1256+ }
1257+ if (level_left_opt) {
1258+ columns_out.insert (level_left_opt.value ());
1259+ }
1260+ }
1261+
11411262struct logline_cmp {
11421263 explicit logline_cmp (logfile_sub_source& lc) : llss_controller(lc) {}
11431264
@@ -2172,7 +2293,7 @@ logfile_sub_source::list_input_handle_key(listview_curses& lv,
21722293 }
21732294 break ;
21742295 }
2175- return false ;
2296+ return text_sub_source::list_input_handle_key (lv, ch) ;
21762297}
21772298
21782299std::optional<
0 commit comments