mirror of
https://github.com/tstack/lnav.git
synced 2024-10-26 13:16:11 +03:00
[textview] handle mouse movement in overlay better
This commit is contained in:
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…
Reference in New Issue
Block a user