diff --git a/src/db_sub_source.cc b/src/db_sub_source.cc index afc84cc1..d7220ad9 100644 --- a/src/db_sub_source.cc +++ b/src/db_sub_source.cc @@ -328,6 +328,16 @@ db_label_source::time_for_row(vis_line_t row) return row_info{this->dls_time_column[row], row}; } +nonstd::optional +db_overlay_source::list_header_for_overlay(const listview_curses& lv, + vis_line_t line) +{ + attr_line_t retval; + + retval.append(" JSON column details"); + return retval; +} + void db_overlay_source::list_value_for_overlay(const listview_curses& lv, vis_line_t row, @@ -369,7 +379,7 @@ db_overlay_source::list_value_for_overlay(const listview_curses& lv, { const std::string& header = this->dos_labels->dls_headers[col].hm_name; - value_out.emplace_back(" JSON Column: " + header); + value_out.emplace_back(" Column: " + header); retval += 1; } diff --git a/src/db_sub_source.hh b/src/db_sub_source.hh index 646fa60c..d233498d 100644 --- a/src/db_sub_source.hh +++ b/src/db_sub_source.hh @@ -133,6 +133,9 @@ public: vis_line_t line, std::vector& value_out) override; + nonstd::optional list_header_for_overlay( + const listview_curses& lv, vis_line_t line) override; + void set_show_details_in_overlay(bool val) override { this->dos_active = val; diff --git a/src/field_overlay_source.cc b/src/field_overlay_source.cc index b3f309ec..ef9d3d3a 100644 --- a/src/field_overlay_source.cc +++ b/src/field_overlay_source.cc @@ -432,12 +432,6 @@ field_overlay_source::build_field_lines(const listview_curses& lv, this->add_key_line_attrs(key_size - 3); } - if (!this->fos_contexts.empty() - && !this->fos_contexts.top().c_show_discovered) - { - return; - } - if (this->fos_log_helper.ldh_parser->dp_pairs.empty()) { this->fos_lines.emplace_back(" No discovered message fields"); } else { diff --git a/src/listview_curses.cc b/src/listview_curses.cc index d605daf0..32b759df 100644 --- a/src/listview_curses.cc +++ b/src/listview_curses.cc @@ -536,7 +536,7 @@ listview_curses::do_update() VC_ROLE.value(role_t::VCR_CURSOR_LINE)); } this->lv_display_lines.push_back( - overlay_content{overlay_row}); + overlay_content{row, overlay_row}); mvwattrline(this->lv_window, y, this->vc_x, @@ -1158,12 +1158,14 @@ listview_curses::set_overlay_selection(nonstd::optional sel) this->lv_overlay_source->list_value_for_overlay( *this, this->get_selection(), overlay_content); if (!overlay_content.empty()) { - if (sel.value() >= 0 && sel.value() < overlay_content.size()) { - this->lv_overlay_focused = true; - this->lv_focused_overlay_selection = sel.value(); - } else { - this->lv_overlay_focused = true; + this->lv_overlay_focused = true; + if (sel.value() < 0) { this->lv_focused_overlay_selection = 0_vl; + } else if (sel.value() >= overlay_content.size()) { + this->lv_focused_overlay_selection + = vis_line_t(overlay_content.size()); + } else { + this->lv_focused_overlay_selection = sel.value(); } } } else { diff --git a/src/listview_curses.hh b/src/listview_curses.hh index 607ce2e4..982b1414 100644 --- a/src/listview_curses.hh +++ b/src/listview_curses.hh @@ -542,6 +542,7 @@ public: vis_line_t om_line; }; struct overlay_content { + vis_line_t oc_main_line; vis_line_t oc_line; }; struct empty_space {}; diff --git a/src/textview_curses.cc b/src/textview_curses.cc index 6e65717d..c50e2f82 100644 --- a/src/textview_curses.cc +++ b/src/textview_curses.cc @@ -434,11 +434,37 @@ textview_curses::handle_mouse(mouse_event& me) this->set_needs_update(); } + nonstd::optional overlay_content_min_y; + nonstd::optional overlay_content_max_y; + if (this->tc_press_line.is()) { + auto main_line + = this->tc_press_line.get().oc_main_line; + for (size_t lpc = 0; lpc < this->lv_display_lines.size(); lpc++) { + if (overlay_content_min_y + && !this->lv_display_lines[lpc].is() + && !this->lv_display_lines[lpc].is()) + { + overlay_content_max_y = lpc; + break; + } + if (this->lv_display_lines[lpc].is()) { + auto& mc = this->lv_display_lines[lpc].get(); + if (mc.mc_line == main_line) { + overlay_content_min_y = lpc; + } + } + } + if (overlay_content_min_y && !overlay_content_max_y) { + overlay_content_max_y = this->lv_display_lines.size(); + } + } + auto* sub_delegate = dynamic_cast(this->tc_sub_source); switch (me.me_state) { case mouse_button_state_t::BUTTON_STATE_PRESSED: { this->tc_text_selection_active = true; + this->tc_press_line = mouse_line; if (!this->lv_selectable) { this->set_selectable(true); } @@ -564,15 +590,33 @@ textview_curses::handle_mouse(mouse_event& me) }; } } - } else if (me.me_y < 0) { - this->shift_selection(listview_curses::shift_amount_t::up_line); - mouse_line = main_content{this->get_top()}; - } else if (me.me_y >= height) { - this->shift_selection( - listview_curses::shift_amount_t::down_line); - } else if (mouse_line.is()) { - this->set_selection_without_context( - mouse_line.get().mc_line); + } else { + if (this->tc_press_line.is()) { + if (me.me_y < 0) { + this->shift_selection( + listview_curses::shift_amount_t::up_line); + } else if (me.me_y >= height) { + this->shift_selection( + listview_curses::shift_amount_t::down_line); + } else if (mouse_line.is()) { + this->set_selection_without_context( + mouse_line.get().mc_line); + } + } else if (this->tc_press_line.is() + && overlay_content_min_y && overlay_content_max_y) + { + if (me.me_y < overlay_content_min_y.value()) { + this->set_overlay_selection( + this->get_overlay_selection().value_or(0_vl) + - 1_vl); + } else if (me.me_y >= overlay_content_max_y.value()) { + this->set_overlay_selection( + this->get_overlay_selection().value() + 1_vl); + } else if (mouse_line.is()) { + this->set_overlay_selection( + mouse_line.get().oc_line); + } + } } break; } diff --git a/src/textview_curses.hh b/src/textview_curses.hh index cb8afa32..8b1ef1db 100644 --- a/src/textview_curses.hh +++ b/src/textview_curses.hh @@ -812,6 +812,7 @@ public: nonstd::optional tc_selected_text; bool tc_text_selection_active{false}; + display_line_content_t tc_press_line; protected: class grep_highlighter {