blob: 038b9530fc68d3453c5f2149a83edeac68e05059 [file] [log] [blame]
# Copyright 2021 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""LogPane Info Toolbar classes."""
from __future__ import annotations
import functools
from typing import TYPE_CHECKING
from prompt_toolkit.filters import Condition
from prompt_toolkit.layout import (
ConditionalContainer,
FormattedTextControl,
VSplit,
Window,
WindowAlign,
HorizontalAlign,
)
import pw_console.widgets.checkbox
import pw_console.widgets.mouse_handlers
import pw_console.style
if TYPE_CHECKING:
from pw_console.log_pane import LogPane
class LineInfoBar(ConditionalContainer):
"""One line bar for showing current and total log lines."""
def get_tokens(self):
"""Return formatted text tokens for display."""
tokens = ' {} / {} '.format(
self.log_pane.log_view.get_current_line() + 1,
self.log_pane.log_view.get_total_count(),
)
return [('', tokens)]
def __init__(self, log_pane: 'LogPane'):
self.log_pane = log_pane
info_bar_control = FormattedTextControl(self.get_tokens)
info_bar_window = Window(content=info_bar_control,
align=WindowAlign.RIGHT,
dont_extend_width=True)
super().__init__(
VSplit([info_bar_window],
height=1,
style=functools.partial(pw_console.style.get_toolbar_style,
self.log_pane,
dim=True),
align=HorizontalAlign.RIGHT),
# Only show current/total line info if not auto-following
# logs. Similar to tmux behavior.
filter=Condition(lambda: not self.log_pane.log_view.follow))
class TableToolbar(ConditionalContainer):
"""One line toolbar for showing table headers."""
TOOLBAR_HEIGHT = 1
def __init__(self, log_pane: 'LogPane'):
# FormattedText of the table column headers.
table_header_bar_control = FormattedTextControl(
log_pane.log_view.render_table_header)
# Left justify the header content.
table_header_bar_window = Window(
content=table_header_bar_control,
align=WindowAlign.LEFT,
dont_extend_width=False,
)
super().__init__(
VSplit([table_header_bar_window],
height=1,
style=functools.partial(pw_console.style.get_toolbar_style,
log_pane,
dim=True),
align=HorizontalAlign.LEFT),
filter=Condition(lambda: log_pane.table_view and log_pane.log_view.
get_total_count() > 0))