[textview] handle mouse movement in overlay better

pull/1265/head
Tim Stack 2 months ago
parent c465cc6d54
commit 5a744f0c66

@ -328,6 +328,16 @@ db_label_source::time_for_row(vis_line_t row)
return row_info{this->dls_time_column[row], row}; return row_info{this->dls_time_column[row], row};
} }
nonstd::optional<attr_line_t>
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 void
db_overlay_source::list_value_for_overlay(const listview_curses& lv, db_overlay_source::list_value_for_overlay(const listview_curses& lv,
vis_line_t row, vis_line_t row,
@ -369,7 +379,7 @@ db_overlay_source::list_value_for_overlay(const listview_curses& lv,
{ {
const std::string& header const std::string& header
= this->dos_labels->dls_headers[col].hm_name; = this->dos_labels->dls_headers[col].hm_name;
value_out.emplace_back(" JSON Column: " + header); value_out.emplace_back(" Column: " + header);
retval += 1; retval += 1;
} }

@ -133,6 +133,9 @@ public:
vis_line_t line, vis_line_t line,
std::vector<attr_line_t>& value_out) override; std::vector<attr_line_t>& value_out) override;
nonstd::optional<attr_line_t> list_header_for_overlay(
const listview_curses& lv, vis_line_t line) override;
void set_show_details_in_overlay(bool val) override void set_show_details_in_overlay(bool val) override
{ {
this->dos_active = val; this->dos_active = val;

@ -432,12 +432,6 @@ field_overlay_source::build_field_lines(const listview_curses& lv,
this->add_key_line_attrs(key_size - 3); 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()) { if (this->fos_log_helper.ldh_parser->dp_pairs.empty()) {
this->fos_lines.emplace_back(" No discovered message fields"); this->fos_lines.emplace_back(" No discovered message fields");
} else { } else {

@ -536,7 +536,7 @@ listview_curses::do_update()
VC_ROLE.value(role_t::VCR_CURSOR_LINE)); VC_ROLE.value(role_t::VCR_CURSOR_LINE));
} }
this->lv_display_lines.push_back( this->lv_display_lines.push_back(
overlay_content{overlay_row}); overlay_content{row, overlay_row});
mvwattrline(this->lv_window, mvwattrline(this->lv_window,
y, y,
this->vc_x, this->vc_x,
@ -1158,12 +1158,14 @@ listview_curses::set_overlay_selection(nonstd::optional<vis_line_t> sel)
this->lv_overlay_source->list_value_for_overlay( this->lv_overlay_source->list_value_for_overlay(
*this, this->get_selection(), overlay_content); *this, this->get_selection(), overlay_content);
if (!overlay_content.empty()) { if (!overlay_content.empty()) {
if (sel.value() >= 0 && sel.value() < overlay_content.size()) { this->lv_overlay_focused = true;
this->lv_overlay_focused = true; if (sel.value() < 0) {
this->lv_focused_overlay_selection = sel.value();
} else {
this->lv_overlay_focused = true;
this->lv_focused_overlay_selection = 0_vl; 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 { } else {

@ -542,6 +542,7 @@ public:
vis_line_t om_line; vis_line_t om_line;
}; };
struct overlay_content { struct overlay_content {
vis_line_t oc_main_line;
vis_line_t oc_line; vis_line_t oc_line;
}; };
struct empty_space {}; struct empty_space {};

@ -434,11 +434,37 @@ textview_curses::handle_mouse(mouse_event& me)
this->set_needs_update(); this->set_needs_update();
} }
nonstd::optional<int> overlay_content_min_y;
nonstd::optional<int> overlay_content_max_y;
if (this->tc_press_line.is<overlay_content>()) {
auto main_line
= this->tc_press_line.get<overlay_content>().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<static_overlay_content>()
&& !this->lv_display_lines[lpc].is<overlay_content>())
{
overlay_content_max_y = lpc;
break;
}
if (this->lv_display_lines[lpc].is<main_content>()) {
auto& mc = this->lv_display_lines[lpc].get<main_content>();
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<text_delegate*>(this->tc_sub_source); auto* sub_delegate = dynamic_cast<text_delegate*>(this->tc_sub_source);
switch (me.me_state) { switch (me.me_state) {
case mouse_button_state_t::BUTTON_STATE_PRESSED: { case mouse_button_state_t::BUTTON_STATE_PRESSED: {
this->tc_text_selection_active = true; this->tc_text_selection_active = true;
this->tc_press_line = mouse_line;
if (!this->lv_selectable) { if (!this->lv_selectable) {
this->set_selectable(true); this->set_selectable(true);
} }
@ -564,15 +590,33 @@ textview_curses::handle_mouse(mouse_event& me)
}; };
} }
} }
} else if (me.me_y < 0) { } else {
this->shift_selection(listview_curses::shift_amount_t::up_line); if (this->tc_press_line.is<main_content>()) {
mouse_line = main_content{this->get_top()}; if (me.me_y < 0) {
} else if (me.me_y >= height) { this->shift_selection(
this->shift_selection( listview_curses::shift_amount_t::up_line);
listview_curses::shift_amount_t::down_line); } else if (me.me_y >= height) {
} else if (mouse_line.is<main_content>()) { this->shift_selection(
this->set_selection_without_context( listview_curses::shift_amount_t::down_line);
mouse_line.get<main_content>().mc_line); } else if (mouse_line.is<main_content>()) {
this->set_selection_without_context(
mouse_line.get<main_content>().mc_line);
}
} else if (this->tc_press_line.is<overlay_content>()
&& 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<overlay_content>()) {
this->set_overlay_selection(
mouse_line.get<overlay_content>().oc_line);
}
}
} }
break; break;
} }

@ -812,6 +812,7 @@ public:
nonstd::optional<selected_text_info> tc_selected_text; nonstd::optional<selected_text_info> tc_selected_text;
bool tc_text_selection_active{false}; bool tc_text_selection_active{false};
display_line_content_t tc_press_line;
protected: protected:
class grep_highlighter { class grep_highlighter {

Loading…
Cancel
Save