[textview] handle mouse movement in overlay better

master
Tim Stack 1 month 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};
}
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
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;
}

@ -133,6 +133,9 @@ public:
vis_line_t line,
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
{
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);
}
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 {

@ -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<vis_line_t> 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 {

@ -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 {};

@ -434,11 +434,37 @@ textview_curses::handle_mouse(mouse_event& me)
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);
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<main_content>()) {
this->set_selection_without_context(
mouse_line.get<main_content>().mc_line);
} else {
if (this->tc_press_line.is<main_content>()) {
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<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;
}

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

Loading…
Cancel
Save