[gantt] adjust time bounds to show the full range of all ops

pull/1265/head
Tim Stack 3 weeks ago
parent f81ffeeba7
commit 48ed0ff458

@ -1,14 +0,0 @@
hunter_config(
libpcre
VERSION 8.41
CMAKE_ARGS
EXTRA_FLAGS=--enable-unicode-properties --enable-jit --enable-utf
)
hunter_config(
readline
VERSION 6.3
CMAKE_ARGS
EXTRA_FLAGS=CFLAGS=-Wno-implicit-function-declaration
)

@ -1,528 +0,0 @@
# Copyright (c) 2013-2019, Ruslan Baratov
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# This is a gate file to Hunter package manager.
# Include this file using `include` command and add package you need, example:
#
# cmake_minimum_required(VERSION 3.2)
#
# include("cmake/HunterGate.cmake")
# HunterGate(
# URL "https://github.com/path/to/hunter/archive.tar.gz"
# SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d"
# )
#
# project(MyProject)
#
# hunter_add_package(Foo)
# hunter_add_package(Boo COMPONENTS Bar Baz)
#
# Projects:
# * https://github.com/hunter-packages/gate/
# * https://github.com/ruslo/hunter
option(HUNTER_ENABLED "Enable Hunter package manager support" ON)
if(HUNTER_ENABLED)
if(CMAKE_VERSION VERSION_LESS "3.2")
message(
FATAL_ERROR
"At least CMake version 3.2 required for Hunter dependency management."
" Update CMake or set HUNTER_ENABLED to OFF."
)
endif()
endif()
include(CMakeParseArguments) # cmake_parse_arguments
option(HUNTER_STATUS_PRINT "Print working status" ON)
option(HUNTER_STATUS_DEBUG "Print a lot info" OFF)
option(HUNTER_TLS_VERIFY "Enable/disable TLS certificate checking on downloads" ON)
set(HUNTER_ERROR_PAGE "https://docs.hunter.sh/en/latest/reference/errors")
function(hunter_gate_status_print)
if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG)
foreach(print_message ${ARGV})
message(STATUS "[hunter] ${print_message}")
endforeach()
endif()
endfunction()
function(hunter_gate_status_debug)
if(HUNTER_STATUS_DEBUG)
foreach(print_message ${ARGV})
string(TIMESTAMP timestamp)
message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}")
endforeach()
endif()
endfunction()
function(hunter_gate_error_page error_page)
message("------------------------------ ERROR ------------------------------")
message(" ${HUNTER_ERROR_PAGE}/${error_page}.html")
message("-------------------------------------------------------------------")
message("")
message(FATAL_ERROR "")
endfunction()
function(hunter_gate_internal_error)
message("")
foreach(print_message ${ARGV})
message("[hunter ** INTERNAL **] ${print_message}")
endforeach()
message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
message("")
hunter_gate_error_page("error.internal")
endfunction()
function(hunter_gate_fatal_error)
cmake_parse_arguments(hunter "" "ERROR_PAGE" "" "${ARGV}")
if("${hunter_ERROR_PAGE}" STREQUAL "")
hunter_gate_internal_error("Expected ERROR_PAGE")
endif()
message("")
foreach(x ${hunter_UNPARSED_ARGUMENTS})
message("[hunter ** FATAL ERROR **] ${x}")
endforeach()
message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
message("")
hunter_gate_error_page("${hunter_ERROR_PAGE}")
endfunction()
function(hunter_gate_user_error)
hunter_gate_fatal_error(${ARGV} ERROR_PAGE "error.incorrect.input.data")
endfunction()
function(hunter_gate_self root version sha1 result)
string(COMPARE EQUAL "${root}" "" is_bad)
if(is_bad)
hunter_gate_internal_error("root is empty")
endif()
string(COMPARE EQUAL "${version}" "" is_bad)
if(is_bad)
hunter_gate_internal_error("version is empty")
endif()
string(COMPARE EQUAL "${sha1}" "" is_bad)
if(is_bad)
hunter_gate_internal_error("sha1 is empty")
endif()
string(SUBSTRING "${sha1}" 0 7 archive_id)
set(
hunter_self
"${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked"
)
set("${result}" "${hunter_self}" PARENT_SCOPE)
endfunction()
# Set HUNTER_GATE_ROOT cmake variable to suitable value.
function(hunter_gate_detect_root)
# Check CMake variable
string(COMPARE NOTEQUAL "${HUNTER_ROOT}" "" not_empty)
if(not_empty)
set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE)
hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable")
return()
endif()
# Check environment variable
string(COMPARE NOTEQUAL "$ENV{HUNTER_ROOT}" "" not_empty)
if(not_empty)
set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE)
hunter_gate_status_debug("HUNTER_ROOT detected by environment variable")
return()
endif()
# Check HOME environment variable
string(COMPARE NOTEQUAL "$ENV{HOME}" "" result)
if(result)
set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE)
hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable")
return()
endif()
# Check SYSTEMDRIVE and USERPROFILE environment variable (windows only)
if(WIN32)
string(COMPARE NOTEQUAL "$ENV{SYSTEMDRIVE}" "" result)
if(result)
set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE)
hunter_gate_status_debug(
"HUNTER_ROOT set using SYSTEMDRIVE environment variable"
)
return()
endif()
string(COMPARE NOTEQUAL "$ENV{USERPROFILE}" "" result)
if(result)
set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE)
hunter_gate_status_debug(
"HUNTER_ROOT set using USERPROFILE environment variable"
)
return()
endif()
endif()
hunter_gate_fatal_error(
"Can't detect HUNTER_ROOT"
ERROR_PAGE "error.detect.hunter.root"
)
endfunction()
function(hunter_gate_download dir)
string(
COMPARE
NOTEQUAL
"$ENV{HUNTER_DISABLE_AUTOINSTALL}"
""
disable_autoinstall
)
if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL)
hunter_gate_fatal_error(
"Hunter not found in '${dir}'"
"Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'"
"Settings:"
" HUNTER_ROOT: ${HUNTER_GATE_ROOT}"
" HUNTER_SHA1: ${HUNTER_GATE_SHA1}"
ERROR_PAGE "error.run.install"
)
endif()
string(COMPARE EQUAL "${dir}" "" is_bad)
if(is_bad)
hunter_gate_internal_error("Empty 'dir' argument")
endif()
string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad)
if(is_bad)
hunter_gate_internal_error("HUNTER_GATE_SHA1 empty")
endif()
string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad)
if(is_bad)
hunter_gate_internal_error("HUNTER_GATE_URL empty")
endif()
set(done_location "${dir}/DONE")
set(sha1_location "${dir}/SHA1")
set(build_dir "${dir}/Build")
set(cmakelists "${dir}/CMakeLists.txt")
hunter_gate_status_debug("Locking directory: ${dir}")
file(LOCK "${dir}" DIRECTORY GUARD FUNCTION)
hunter_gate_status_debug("Lock done")
if(EXISTS "${done_location}")
# while waiting for lock other instance can do all the job
hunter_gate_status_debug("File '${done_location}' found, skip install")
return()
endif()
file(REMOVE_RECURSE "${build_dir}")
file(REMOVE_RECURSE "${cmakelists}")
file(MAKE_DIRECTORY "${build_dir}") # check directory permissions
# Disabling languages speeds up a little bit, reduces noise in the output
# and avoids path too long windows error
file(
WRITE
"${cmakelists}"
"cmake_minimum_required(VERSION 3.2)\n"
"project(HunterDownload LANGUAGES NONE)\n"
"include(ExternalProject)\n"
"ExternalProject_Add(\n"
" Hunter\n"
" URL\n"
" \"${HUNTER_GATE_URL}\"\n"
" URL_HASH\n"
" SHA1=${HUNTER_GATE_SHA1}\n"
" DOWNLOAD_DIR\n"
" \"${dir}\"\n"
" TLS_VERIFY\n"
" ${HUNTER_TLS_VERIFY}\n"
" SOURCE_DIR\n"
" \"${dir}/Unpacked\"\n"
" CONFIGURE_COMMAND\n"
" \"\"\n"
" BUILD_COMMAND\n"
" \"\"\n"
" INSTALL_COMMAND\n"
" \"\"\n"
")\n"
)
if(HUNTER_STATUS_DEBUG)
set(logging_params "")
else()
set(logging_params OUTPUT_QUIET)
endif()
hunter_gate_status_debug("Run generate")
# Need to add toolchain file too.
# Otherwise on Visual Studio + MDD this will fail with error:
# "Could not find an appropriate version of the Windows 10 SDK installed on this machine"
if(EXISTS "${CMAKE_TOOLCHAIN_FILE}")
get_filename_component(absolute_CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" ABSOLUTE)
set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${absolute_CMAKE_TOOLCHAIN_FILE}")
else()
# 'toolchain_arg' can't be empty
set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=")
endif()
string(COMPARE EQUAL "${CMAKE_MAKE_PROGRAM}" "" no_make)
if(no_make)
set(make_arg "")
else()
# Test case: remove Ninja from PATH but set it via CMAKE_MAKE_PROGRAM
set(make_arg "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}")
endif()
execute_process(
COMMAND
"${CMAKE_COMMAND}"
"-H${dir}"
"-B${build_dir}"
"-G${CMAKE_GENERATOR}"
"${toolchain_arg}"
${make_arg}
WORKING_DIRECTORY "${dir}"
RESULT_VARIABLE download_result
${logging_params}
)
if(NOT download_result EQUAL 0)
hunter_gate_internal_error(
"Configure project failed."
"To reproduce the error run: ${CMAKE_COMMAND} -H${dir} -B${build_dir} -G${CMAKE_GENERATOR} ${toolchain_arg} ${make_arg}"
"In directory ${dir}"
)
endif()
hunter_gate_status_print(
"Initializing Hunter workspace (${HUNTER_GATE_SHA1})"
" ${HUNTER_GATE_URL}"
" -> ${dir}"
)
execute_process(
COMMAND "${CMAKE_COMMAND}" --build "${build_dir}"
WORKING_DIRECTORY "${dir}"
RESULT_VARIABLE download_result
${logging_params}
)
if(NOT download_result EQUAL 0)
hunter_gate_internal_error("Build project failed")
endif()
file(REMOVE_RECURSE "${build_dir}")
file(REMOVE_RECURSE "${cmakelists}")
file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}")
file(WRITE "${done_location}" "DONE")
hunter_gate_status_debug("Finished")
endfunction()
# Must be a macro so master file 'cmake/Hunter' can
# apply all variables easily just by 'include' command
# (otherwise PARENT_SCOPE magic needed)
macro(HunterGate)
if(HUNTER_GATE_DONE)
# variable HUNTER_GATE_DONE set explicitly for external project
# (see `hunter_download`)
set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
endif()
# First HunterGate command will init Hunter, others will be ignored
get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET)
if(NOT HUNTER_ENABLED)
# Empty function to avoid error "unknown function"
function(hunter_add_package)
endfunction()
set(
_hunter_gate_disabled_mode_dir
"${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/disabled-mode"
)
if(EXISTS "${_hunter_gate_disabled_mode_dir}")
hunter_gate_status_debug(
"Adding \"disabled-mode\" modules: ${_hunter_gate_disabled_mode_dir}"
)
list(APPEND CMAKE_PREFIX_PATH "${_hunter_gate_disabled_mode_dir}")
endif()
elseif(_hunter_gate_done)
hunter_gate_status_debug("Secondary HunterGate (use old settings)")
hunter_gate_self(
"${HUNTER_CACHED_ROOT}"
"${HUNTER_VERSION}"
"${HUNTER_SHA1}"
_hunter_self
)
include("${_hunter_self}/cmake/Hunter")
else()
set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}")
string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name)
if(_have_project_name)
hunter_gate_fatal_error(
"Please set HunterGate *before* 'project' command. "
"Detected project: ${PROJECT_NAME}"
ERROR_PAGE "error.huntergate.before.project"
)
endif()
cmake_parse_arguments(
HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV}
)
string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1)
string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url)
string(
COMPARE
NOTEQUAL
"${HUNTER_GATE_UNPARSED_ARGUMENTS}"
""
_have_unparsed
)
string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global)
string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath)
if(_have_unparsed)
hunter_gate_user_error(
"HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}"
)
endif()
if(_empty_sha1)
hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory")
endif()
if(_empty_url)
hunter_gate_user_error("URL suboption of HunterGate is mandatory")
endif()
if(_have_global)
if(HUNTER_GATE_LOCAL)
hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)")
endif()
if(_have_filepath)
hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)")
endif()
endif()
if(HUNTER_GATE_LOCAL)
if(_have_global)
hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)")
endif()
if(_have_filepath)
hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)")
endif()
endif()
if(_have_filepath)
if(_have_global)
hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)")
endif()
if(HUNTER_GATE_LOCAL)
hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)")
endif()
endif()
hunter_gate_detect_root() # set HUNTER_GATE_ROOT
# Beautify path, fix probable problems with windows path slashes
get_filename_component(
HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE
)
hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}")
if(NOT HUNTER_ALLOW_SPACES_IN_PATH)
string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces)
if(NOT _contain_spaces EQUAL -1)
hunter_gate_fatal_error(
"HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces."
"Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error"
"(Use at your own risk!)"
ERROR_PAGE "error.spaces.in.hunter.root"
)
endif()
endif()
string(
REGEX
MATCH
"[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*"
HUNTER_GATE_VERSION
"${HUNTER_GATE_URL}"
)
string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty)
if(_is_empty)
set(HUNTER_GATE_VERSION "unknown")
endif()
hunter_gate_self(
"${HUNTER_GATE_ROOT}"
"${HUNTER_GATE_VERSION}"
"${HUNTER_GATE_SHA1}"
_hunter_self
)
set(_master_location "${_hunter_self}/cmake/Hunter")
get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE)
set(_done_location "${_archive_id_location}/DONE")
set(_sha1_location "${_archive_id_location}/SHA1")
# Check Hunter already downloaded by HunterGate
if(NOT EXISTS "${_done_location}")
hunter_gate_download("${_archive_id_location}")
endif()
if(NOT EXISTS "${_done_location}")
hunter_gate_internal_error("hunter_gate_download failed")
endif()
if(NOT EXISTS "${_sha1_location}")
hunter_gate_internal_error("${_sha1_location} not found")
endif()
file(READ "${_sha1_location}" _sha1_value)
string(COMPARE EQUAL "${_sha1_value}" "${HUNTER_GATE_SHA1}" _is_equal)
if(NOT _is_equal)
hunter_gate_internal_error(
"Short SHA1 collision:"
" ${_sha1_value} (from ${_sha1_location})"
" ${HUNTER_GATE_SHA1} (HunterGate)"
)
endif()
if(NOT EXISTS "${_master_location}")
hunter_gate_user_error(
"Master file not found:"
" ${_master_location}"
"try to update Hunter/HunterGate"
)
endif()
include("${_master_location}")
set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
endif()
endmacro()

@ -342,9 +342,10 @@ gantt_source::gantt_source(textview_curses& log_view,
logfile_sub_source& lss,
textview_curses& preview_view,
plain_text_source& preview_source,
statusview_curses& preview_status_view,
gantt_status_source& preview_status_source)
: gs_log_view(log_view), gs_lss(lss), gs_preview_view(preview_view),
gs_preview_source(preview_source),
gs_preview_source(preview_source), gs_preview_status_view(preview_status_view),
gs_preview_status_source(preview_status_source)
{
this->tss_supports_filtering = true;
@ -353,6 +354,7 @@ gantt_source::gantt_source(textview_curses& log_view,
bool
gantt_source::list_input_handle_key(listview_curses& lv, int ch)
{
log_debug("list input %x", ch);
switch (ch) {
case 'q':
case KEY_ESCAPE: {
@ -360,25 +362,34 @@ gantt_source::list_input_handle_key(listview_curses& lv, int ch)
this->gs_preview_focused = false;
this->gs_preview_view.set_height(5_vl);
}
this->tss_view->tc_cursor_role = role_t::VCR_CURSOR_LINE;
this->gs_preview_view.tc_cursor_role = role_t::VCR_DISABLED_CURSOR_LINE;
this->gs_preview_status_view.set_enabled(this->gs_preview_focused);
break;
}
case '\n':
case '\r':
case KEY_ENTER: {
this->gs_preview_focused = !this->gs_preview_focused;
this->gs_preview_status_view.set_enabled(this->gs_preview_focused);
if (this->gs_preview_focused) {
auto height = this->tss_view->get_dimensions().first;
if (height > 5) {
this->gs_preview_view.set_height(height - 3_vl);
}
this->tss_view->tc_cursor_role = role_t::VCR_DISABLED_CURSOR_LINE;
this->gs_preview_view.tc_cursor_role = role_t::VCR_CURSOR_LINE;
} else {
this->tss_view->tc_cursor_role = role_t::VCR_CURSOR_LINE;
this->gs_preview_view.tc_cursor_role = role_t::VCR_DISABLED_CURSOR_LINE;
this->gs_preview_view.set_height(5_vl);
}
return true;
}
}
if (this->gs_preview_focused) {
log_debug("to preview");
return this->gs_preview_view.handle_key(ch);
}
@ -400,20 +411,23 @@ gantt_source::text_handle_mouse(textview_curses& tc,
std::pair<timeval, timeval>
gantt_source::get_time_bounds_for(int line)
{
const auto& low_row
= this->gs_time_order[std::max(0_vl, this->tss_view->get_top())].get();
const auto& sel_row = this->gs_time_order[line].get();
const auto& high_row
= this
->gs_time_order[std::min(
this->tss_view->get_bottom(),
vis_line_t((int) this->gs_time_order.size() - 1))]
.get();
auto high_tv_sec = std::max(sel_row.or_value.otr_range.tr_end.tv_sec,
high_row.or_value.otr_range.tr_begin.tv_sec);
auto duration = std::chrono::seconds{
high_tv_sec - low_row.or_value.otr_range.tr_begin.tv_sec};
auto low_index = this->tss_view->get_top();
auto high_index
= std::min(this->tss_view->get_bottom(),
vis_line_t((int) this->gs_time_order.size() - 1));
const auto& low_row = this->gs_time_order[low_index].get();
const auto& high_row = this->gs_time_order[high_index].get();
auto low_tv_sec = low_row.or_value.otr_range.tr_begin.tv_sec;
auto high_tv_sec = high_row.or_value.otr_range.tr_begin.tv_sec;
for (auto index = low_index; index <= high_index; index += 1_vl) {
const auto& row = this->gs_time_order[index].get();
if (row.or_value.otr_range.tr_end.tv_sec > high_tv_sec) {
high_tv_sec = row.or_value.otr_range.tr_end.tv_sec;
}
}
auto duration = std::chrono::seconds{high_tv_sec - low_tv_sec};
auto span_iter
= std::upper_bound(TIME_SPANS.begin(), TIME_SPANS.end(), duration);
if (span_iter == TIME_SPANS.end()) {
@ -571,6 +585,7 @@ gantt_source::rebuild_indexes()
this->gs_subid_map.clear();
this->gs_allocator.reset();
this->gs_preview_source.clear();
this->gs_preview_rows.clear();
this->gs_preview_status_source.get_description().clear();
auto min_log_time_opt = this->gs_lss.get_min_log_time();
@ -847,6 +862,11 @@ gantt_source::time_for_row(vis_line_t row)
}
}
auto preview_selection = this->gs_preview_view.get_selection();
if (preview_selection < this->gs_preview_rows.size()) {
return this->gs_preview_rows[preview_selection];
}
return row_info{
otr.otr_range.tr_begin,
row,
@ -867,6 +887,7 @@ gantt_source::text_selection_changed(textview_curses& tc)
auto sel = tc.get_selection();
this->gs_preview_source.clear();
this->gs_preview_rows.clear();
if (sel >= this->gs_time_order.size()) {
return;
}
@ -911,10 +932,13 @@ gantt_source::text_selection_changed(textview_curses& tc)
if (opid_sf == row.or_name) {
std::vector<attr_line_t> rows_al(msg_line.get_line_count());
auto cl = this->gs_lss.at(msg_line.get_vis_line());
this->gs_log_view.listview_value_for_rows(
this->gs_log_view, msg_line.get_vis_line(), rows_al);
for (const auto& row_al : rows_al) {
this->gs_preview_rows.emplace_back(msg_line.get_logline().get_timeval(), cl);
++cl;
preview_content.append(row_al).append("\n");
}
msgs_remaining -= 1;
@ -925,7 +949,7 @@ gantt_source::text_selection_changed(textview_curses& tc)
}
this->gs_preview_source.replace_with(preview_content);
this->gs_preview_view.set_top(0_vl);
this->gs_preview_view.set_selection(0_vl);
this->gs_preview_status_source.get_description().set_value(
" ID %.*s", id_sf.length(), id_sf.data());
auto err_count = level_stats.lls_error_count;

@ -47,6 +47,7 @@ public:
logfile_sub_source& lss,
textview_curses& preview_view,
plain_text_source& preview_source,
statusview_curses& preview_status_view,
gantt_status_source& preview_status_source);
bool list_input_handle_key(listview_curses& lv, int ch) override;
@ -92,6 +93,7 @@ public:
logfile_sub_source& gs_lss;
textview_curses& gs_preview_view;
plain_text_source& gs_preview_source;
statusview_curses& gs_preview_status_view;
gantt_status_source& gs_preview_status_source;
ArenaAlloc::Alloc<char> gs_allocator{64 * 1024};
@ -173,6 +175,7 @@ public:
std::array<size_t, logfile_filter_state::MAX_FILTERS> gs_filter_hits{};
exec_context* gs_exec_context;
bool gs_preview_focused{false};
std::vector<text_time_translator::row_info> gs_preview_rows;
};
class gantt_header_overlay : public text_overlay_menu {

@ -117,9 +117,6 @@
"command": "|lnav-copy-text",
"alt-msg": "${keymap_def_clear}"
},
"x67": {
"command": ":goto 0"
},
"x6d": {
"command": ":mark",
"alt-msg": "${keymap_def_next_user_mark}"

@ -1372,10 +1372,15 @@ VALUES ('org.lnav.mouse-support', -1, DATETIME('now', '+1 minute'),
lnav_data.ld_gantt_details_view.set_title("gantt-details");
lnav_data.ld_gantt_details_view.set_window(lnav_data.ld_window);
lnav_data.ld_gantt_details_view.set_selectable(true);
lnav_data.ld_gantt_details_view.set_show_scrollbar(true);
lnav_data.ld_gantt_details_view.set_height(5_vl);
lnav_data.ld_gantt_details_view.set_sub_source(
&lnav_data.ld_gantt_details_source);
lnav_data.ld_gantt_details_view.tc_cursor_role
= role_t::VCR_CURSOR_LINE;
lnav_data.ld_gantt_details_view.tc_disabled_cursor_role
= role_t::VCR_DISABLED_CURSOR_LINE;
auto top_status_lifetime
= injector::bind<top_status_source>::to_scoped_singleton();
@ -2847,6 +2852,7 @@ SELECT tbl_name FROM sqlite_master WHERE sql LIKE 'CREATE VIRTUAL TABLE%'
lnav_data.ld_log_source,
lnav_data.ld_gantt_details_view,
lnav_data.ld_gantt_details_source,
lnav_data.ld_status[LNS_GANTT],
lnav_data.ld_gantt_status_source);
gantt_view_source->gs_exec_context = &lnav_data.ld_exec_context;
auto gantt_header_source

@ -251,6 +251,10 @@ private:
class text_time_translator {
public:
struct row_info {
row_info() = default;
row_info(struct timeval tv, int64_t id) : ri_time(tv), ri_id(id) {}
struct timeval ri_time {
0, 0
};

@ -4957,11 +4957,6 @@
"command": ":next-mark error",
"alt-msg": "${keymap_def_alt_warning}"
},
"x67": {
"id": "",
"command": ":goto 0",
"alt-msg": ""
},
"x69": {
"id": "",
"command": ":toggle-view histogram",

@ -80,7 +80,7 @@
/ui/keymap-defs/default/x0c/command -> default-keymap.json:68
/ui/keymap-defs/default/x12/command -> default-keymap.json:71
/ui/keymap-defs/default/x15/command -> default-keymap.json:80
/ui/keymap-defs/default/x17/command -> default-keymap.json:146
/ui/keymap-defs/default/x17/command -> default-keymap.json:143
/ui/keymap-defs/default/x18/command -> default-keymap.json:74
/ui/keymap-defs/default/x21/command -> default-keymap.json:47
/ui/keymap-defs/default/x23/command -> default-keymap.json:53
@ -98,48 +98,47 @@
/ui/keymap-defs/default/x3a/command -> default-keymap.json:89
/ui/keymap-defs/default/x3b/command -> default-keymap.json:98
/ui/keymap-defs/default/x3d/command -> default-keymap.json:83
/ui/keymap-defs/default/x3f/command -> default-keymap.json:164
/ui/keymap-defs/default/x3f/command -> default-keymap.json:161
/ui/keymap-defs/default/x40/command -> default-keymap.json:50
/ui/keymap-defs/default/x45/alt-msg -> default-keymap.json:102
/ui/keymap-defs/default/x45/command -> default-keymap.json:101
/ui/keymap-defs/default/x4e/alt-msg -> default-keymap.json:129
/ui/keymap-defs/default/x4e/command -> default-keymap.json:128
/ui/keymap-defs/default/x50/alt-msg -> default-keymap.json:172
/ui/keymap-defs/default/x50/command -> default-keymap.json:171
/ui/keymap-defs/default/x51/command -> default-keymap.json:185
/ui/keymap-defs/default/x54/alt-msg -> default-keymap.json:137
/ui/keymap-defs/default/x54/command -> default-keymap.json:136
/ui/keymap-defs/default/x55/command -> default-keymap.json:153
/ui/keymap-defs/default/x4e/alt-msg -> default-keymap.json:126
/ui/keymap-defs/default/x4e/command -> default-keymap.json:125
/ui/keymap-defs/default/x50/alt-msg -> default-keymap.json:169
/ui/keymap-defs/default/x50/command -> default-keymap.json:168
/ui/keymap-defs/default/x51/command -> default-keymap.json:182
/ui/keymap-defs/default/x54/alt-msg -> default-keymap.json:134
/ui/keymap-defs/default/x54/command -> default-keymap.json:133
/ui/keymap-defs/default/x55/command -> default-keymap.json:150
/ui/keymap-defs/default/x57/alt-msg -> default-keymap.json:110
/ui/keymap-defs/default/x57/command -> default-keymap.json:109
/ui/keymap-defs/default/x58/command -> default-keymap.json:86
/ui/keymap-defs/default/x5e/command -> default-keymap.json:62
/ui/keymap-defs/default/x60/command -> default-keymap.json:176
/ui/keymap-defs/default/x60/id -> default-keymap.json:175
/ui/keymap-defs/default/x60/command -> default-keymap.json:173
/ui/keymap-defs/default/x60/id -> default-keymap.json:172
/ui/keymap-defs/default/x63/alt-msg -> default-keymap.json:118
/ui/keymap-defs/default/x63/command -> default-keymap.json:117
/ui/keymap-defs/default/x65/alt-msg -> default-keymap.json:106
/ui/keymap-defs/default/x65/command -> default-keymap.json:105
/ui/keymap-defs/default/x67/command -> default-keymap.json:121
/ui/keymap-defs/default/x69/alt-msg -> default-keymap.json:168
/ui/keymap-defs/default/x69/command -> default-keymap.json:167
/ui/keymap-defs/default/x6d/alt-msg -> default-keymap.json:125
/ui/keymap-defs/default/x6d/command -> default-keymap.json:124
/ui/keymap-defs/default/x6e/alt-msg -> default-keymap.json:133
/ui/keymap-defs/default/x6e/command -> default-keymap.json:132
/ui/keymap-defs/default/x70/command -> default-keymap.json:140
/ui/keymap-defs/default/x71/command -> default-keymap.json:182
/ui/keymap-defs/default/x75/alt-msg -> default-keymap.json:150
/ui/keymap-defs/default/x75/command -> default-keymap.json:149
/ui/keymap-defs/default/x76/command -> default-keymap.json:179
/ui/keymap-defs/default/x69/alt-msg -> default-keymap.json:165
/ui/keymap-defs/default/x69/command -> default-keymap.json:164
/ui/keymap-defs/default/x6d/alt-msg -> default-keymap.json:122
/ui/keymap-defs/default/x6d/command -> default-keymap.json:121
/ui/keymap-defs/default/x6e/alt-msg -> default-keymap.json:130
/ui/keymap-defs/default/x6e/command -> default-keymap.json:129
/ui/keymap-defs/default/x70/command -> default-keymap.json:137
/ui/keymap-defs/default/x71/command -> default-keymap.json:179
/ui/keymap-defs/default/x75/alt-msg -> default-keymap.json:147
/ui/keymap-defs/default/x75/command -> default-keymap.json:146
/ui/keymap-defs/default/x76/command -> default-keymap.json:176
/ui/keymap-defs/default/x77/alt-msg -> default-keymap.json:114
/ui/keymap-defs/default/x77/command -> default-keymap.json:113
/ui/keymap-defs/default/x78/command -> default-keymap.json:143
/ui/keymap-defs/default/x7b/alt-msg -> default-keymap.json:161
/ui/keymap-defs/default/x7b/command -> default-keymap.json:160
/ui/keymap-defs/default/x78/command -> default-keymap.json:140
/ui/keymap-defs/default/x7b/alt-msg -> default-keymap.json:158
/ui/keymap-defs/default/x7b/command -> default-keymap.json:157
/ui/keymap-defs/default/x7c/command -> default-keymap.json:92
/ui/keymap-defs/default/x7d/alt-msg -> default-keymap.json:157
/ui/keymap-defs/default/x7d/command -> default-keymap.json:156
/ui/keymap-defs/default/x7d/alt-msg -> default-keymap.json:154
/ui/keymap-defs/default/x7d/command -> default-keymap.json:153
/ui/keymap-defs/fr/x22/command -> fr-keymap.json:13
/ui/keymap-defs/fr/x26/command -> fr-keymap.json:7
/ui/keymap-defs/fr/x27/command -> fr-keymap.json:16

Loading…
Cancel
Save