Skip to content

Commit 9aec963

Browse files
committed
[hist] add month/year zoom levels
Related to #1587
1 parent 041461e commit 9aec963

File tree

5 files changed

+86
-69
lines changed

5 files changed

+86
-69
lines changed

src/hotkeys.cc

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -349,21 +349,29 @@ DELETE FROM lnav_user_notifications WHERE id = 'org.lnav.mouse-support'
349349
if ((lnav_data.ld_zoom_level - 1) < 0) {
350350
alerter::singleton().chime("maximum zoom-in level reached");
351351
} else {
352-
ec.execute(INTERNAL_SRC_LOC,
353-
fmt::format(
354-
FMT_STRING(":zoom-to {}"),
355-
lnav_zoom_strings[lnav_data.ld_zoom_level - 1]));
352+
auto res = ec.execute(
353+
INTERNAL_SRC_LOC,
354+
fmt::format(
355+
FMT_STRING(":zoom-to {}"),
356+
lnav_zoom_strings[lnav_data.ld_zoom_level - 1]));
357+
if (res.isOk()) {
358+
prompt.p_editor.set_inactive_value(res.unwrap());
359+
}
356360
}
357361
break;
358362

359363
case 'Z':
360364
if ((lnav_data.ld_zoom_level + 1) >= ZOOM_COUNT) {
361365
alerter::singleton().chime("maximum zoom-out level reached");
362366
} else {
363-
ec.execute(INTERNAL_SRC_LOC,
364-
fmt::format(
365-
FMT_STRING(":zoom-to {}"),
366-
lnav_zoom_strings[lnav_data.ld_zoom_level + 1]));
367+
auto res = ec.execute(
368+
INTERNAL_SRC_LOC,
369+
fmt::format(
370+
FMT_STRING(":zoom-to {}"),
371+
lnav_zoom_strings[lnav_data.ld_zoom_level + 1]));
372+
if (res.isOk()) {
373+
prompt.p_editor.set_inactive_value(res.unwrap());
374+
}
367375
}
368376
break;
369377

src/lnav_commands.cc

Lines changed: 67 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ constexpr std::chrono::microseconds ZOOM_LEVELS[] = {
107107
8h,
108108
24h,
109109
7 * 24h,
110+
30 * 24h,
111+
365 * 24h,
110112
};
111113

112114
constexpr std::array<string_fragment, ZOOM_COUNT> lnav_zoom_strings = {
@@ -120,6 +122,8 @@ constexpr std::array<string_fragment, ZOOM_COUNT> lnav_zoom_strings = {
120122
"8-hour"_frag,
121123
"1-day"_frag,
122124
"1-week"_frag,
125+
"1-month"_frag,
126+
"1-year"_frag,
123127
};
124128

125129
inline attr_line_t&
@@ -2232,71 +2236,76 @@ com_zoom_to(exec_context& ec,
22322236
std::vector<std::string>& args)
22332237
{
22342238
std::string retval;
2239+
std::optional<int> zoom_level;
22352240

2236-
if (ec.ec_dry_run) {
2237-
} else if (args.size() > 1) {
2238-
bool found = false;
2239-
2240-
for (size_t lpc = 0; lpc < lnav_zoom_strings.size() && !found; lpc++) {
2241-
if (lnav_zoom_strings[lpc].iequal(args[1])) {
2242-
auto& ss = *lnav_data.ld_spectro_source;
2243-
timeval old_time;
2244-
2245-
lnav_data.ld_zoom_level = lpc;
2246-
2247-
auto& hist_view = lnav_data.ld_views[LNV_HISTOGRAM];
2248-
2249-
if (hist_view.get_inner_height() > 0) {
2250-
auto old_time_opt = lnav_data.ld_hist_source2.time_for_row(
2251-
lnav_data.ld_views[LNV_HISTOGRAM].get_top());
2252-
if (old_time_opt) {
2253-
old_time = old_time_opt.value().ri_time;
2254-
rebuild_hist();
2255-
lnav_data.ld_hist_source2.row_for_time(old_time) |
2256-
[](auto new_top) {
2257-
lnav_data.ld_views[LNV_HISTOGRAM].set_top(
2258-
new_top);
2259-
};
2260-
}
2261-
}
2262-
2263-
auto& spectro_view = lnav_data.ld_views[LNV_SPECTRO];
2264-
2265-
if (spectro_view.get_inner_height() > 0) {
2266-
auto old_time_opt
2267-
= lnav_data.ld_spectro_source->time_for_row(
2268-
lnav_data.ld_views[LNV_SPECTRO]
2269-
.get_selection()
2270-
.value_or(0_vl));
2271-
ss.ss_granularity = ZOOM_LEVELS[lnav_data.ld_zoom_level];
2272-
ss.invalidate();
2273-
spectro_view.reload_data();
2274-
if (old_time_opt) {
2275-
lnav_data.ld_spectro_source->row_for_time(
2276-
old_time_opt.value().ri_time)
2277-
| [](auto new_top) {
2278-
lnav_data.ld_views[LNV_SPECTRO].set_selection(
2279-
new_top);
2280-
};
2281-
}
2282-
}
2241+
if (args.size() == 1) {
2242+
auto um = lnav::console::user_message::error("expecting a zoom level")
2243+
.with_snippets(ec.ec_source)
2244+
.with_help(attr_line_t("available levels: ")
2245+
.join(lnav_zoom_strings, ", "))
2246+
.move();
2247+
return Err(um);
2248+
}
22832249

2284-
lnav_data.ld_view_stack.set_needs_update();
2250+
for (size_t lpc = 0; lpc < lnav_zoom_strings.size() && !zoom_level; lpc++) {
2251+
if (lnav_zoom_strings[lpc].iequal(args[1])) {
2252+
zoom_level = lpc;
2253+
}
2254+
}
22852255

2286-
found = true;
2256+
if (!zoom_level) {
2257+
auto um = lnav::console::user_message::error(
2258+
attr_line_t("invalid zoom level: ")
2259+
.append(lnav::roles::symbol(args[1])))
2260+
.with_snippets(ec.ec_source)
2261+
.with_help(attr_line_t("available levels: ")
2262+
.join(lnav_zoom_strings, ", "))
2263+
.move();
2264+
return Err(um);
2265+
}
2266+
if (!ec.ec_dry_run) {
2267+
auto& ss = *lnav_data.ld_spectro_source;
2268+
timeval old_time;
2269+
2270+
lnav_data.ld_zoom_level = zoom_level.value();
2271+
2272+
auto& hist_view = lnav_data.ld_views[LNV_HISTOGRAM];
2273+
2274+
if (hist_view.get_inner_height() > 0) {
2275+
auto old_time_opt = lnav_data.ld_hist_source2.time_for_row(
2276+
lnav_data.ld_views[LNV_HISTOGRAM].get_top());
2277+
if (old_time_opt) {
2278+
old_time = old_time_opt.value().ri_time;
2279+
rebuild_hist();
2280+
lnav_data.ld_hist_source2.row_for_time(old_time) |
2281+
[](auto new_top) {
2282+
lnav_data.ld_views[LNV_HISTOGRAM].set_top(new_top);
2283+
};
22872284
}
22882285
}
22892286

2290-
if (!found) {
2291-
auto um = lnav::console::user_message::error(
2292-
attr_line_t("invalid zoom level: ")
2293-
.append(lnav::roles::symbol(args[1])))
2294-
.with_snippets(ec.ec_source)
2295-
.with_help(attr_line_t("available levels: ")
2296-
.join(lnav_zoom_strings, ", "))
2297-
.move();
2298-
return Err(um);
2287+
auto& spectro_view = lnav_data.ld_views[LNV_SPECTRO];
2288+
2289+
if (spectro_view.get_inner_height() > 0) {
2290+
auto old_time_opt = lnav_data.ld_spectro_source->time_for_row(
2291+
lnav_data.ld_views[LNV_SPECTRO].get_selection().value_or(0_vl));
2292+
ss.ss_granularity = ZOOM_LEVELS[lnav_data.ld_zoom_level];
2293+
ss.invalidate();
2294+
spectro_view.reload_data();
2295+
if (old_time_opt) {
2296+
lnav_data.ld_spectro_source->row_for_time(
2297+
old_time_opt.value().ri_time)
2298+
|
2299+
[](auto new_top) {
2300+
lnav_data.ld_views[LNV_SPECTRO].set_selection(new_top);
2301+
};
2302+
}
22992303
}
2304+
2305+
lnav_data.ld_view_stack.set_needs_update();
2306+
2307+
retval = fmt::format(FMT_STRING("info: set zoom-level to {}"),
2308+
lnav_zoom_strings[zoom_level.value()]);
23002309
}
23012310

23022311
return Ok(retval);

src/lnav_commands.hh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ std::optional<std::string> find_arg(std::vector<std::string>& args,
6969

7070
bookmark_vector<vis_line_t> combined_user_marks(vis_bookmarks& vb);
7171

72-
constexpr ssize_t ZOOM_COUNT = 10;
72+
constexpr ssize_t ZOOM_COUNT = 12;
7373
extern const std::chrono::microseconds ZOOM_LEVELS[ZOOM_COUNT];
7474

7575
extern const std::array<string_fragment, ZOOM_COUNT> lnav_zoom_strings;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
✘ error: invalid zoom level: bad
22
 --> command-option:1
33
 | :zoom-to bad 
4-
 = help: available levels: 1-second, 30-second, 1-minute, 5-minute, 15-minute, 1-hour, 4-hour, 8-hour, 1-day, 1-week
4+
 = help: available levels: 1-second, 30-second, 1-minute, 5-minute, 15-minute, 1-hour, 4-hour, 8-hour, 1-day, 1-week, 1-month, 1-year

test/expected/test_cmds.sh_b6a3bb78e9d60e5e1f5ce5b18e40d2f1662707ab.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2046,7 +2046,7 @@ For support questions, email:
20462046
Zoom the histogram view to the given level
20472047
Parameter
20482048
zoom-level The zoom level
2049-
Values: 1-second|30-second|1-minute|5-minute|15-minute|1-hour|4-hour|8-hour|1-day|1-week
2049+
Values: 1-second|30-second|1-minute|5-minute|15-minute|1-hour|4-hour|8-hour|1-day|1-week|1-month|1-year
20502050

20512051
Example
20522052
#1 To set the zoom level to '1-week':

0 commit comments

Comments
 (0)