pw_console: Add styles and key bindings

This adds the necessary prompt_toolkit boiler plate for some barebones
colors styles and key bindings.

No-Docs-Update-Reason: prompt_toolkit UI boilerplate
Change-Id: I29b5a7f82bbc412f3ada3a52bebefa1576136704
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/48766
Pigweed-Auto-Submit: Anthony DiGirolamo <tonymd@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
Reviewed-by: Keir Mierle <keir@google.com>
Reviewed-by: Joe Ethier <jethier@google.com>
diff --git a/pw_console/py/BUILD.gn b/pw_console/py/BUILD.gn
index f8952f1..e6b2848 100644
--- a/pw_console/py/BUILD.gn
+++ b/pw_console/py/BUILD.gn
@@ -22,6 +22,8 @@
     "pw_console/__init__.py",
     "pw_console/__main__.py",
     "pw_console/console_app.py",
+    "pw_console/key_bindings.py",
+    "pw_console/style.py",
   ]
   tests = [ "console_app_test.py" ]
   python_deps = [
diff --git a/pw_console/py/pw_console/key_bindings.py b/pw_console/py/pw_console/key_bindings.py
new file mode 100644
index 0000000..3579d17
--- /dev/null
+++ b/pw_console/py/pw_console/key_bindings.py
@@ -0,0 +1,74 @@
+# 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.
+# pylint: skip-file
+"""Console key bindings."""
+import logging
+
+from prompt_toolkit.filters import (
+    Condition,
+    has_focus,
+)
+from prompt_toolkit.key_binding import KeyBindings
+from prompt_toolkit.key_binding.bindings.focus import focus_next, focus_previous
+
+__all__ = ('create_key_bindings', )
+
+_LOG = logging.getLogger(__package__)
+
+
+def create_key_bindings(console_app):
+    """Create custom key bindings.
+
+    This starts with the key bindings, defined by `prompt-toolkit`, but adds the
+    ones which are specific for the console_app. A console_app instance
+    reference is passed in so key bind functions can access it.
+    """
+
+    bindings = KeyBindings()
+
+    @bindings.add('f1')
+    def show_help(event):
+        """Toggle help window."""
+        console_app.toggle_help()
+
+    @bindings.add('q', filter=Condition(lambda: console_app.show_help_window))
+    def close_help_window(event):
+        """Hide help window."""
+        console_app.toggle_help()
+
+    @bindings.add('f2')
+    def toggle_vertical_split(event):
+        """Toggle horizontal and vertical window splitting."""
+        console_app.toggle_vertical_split()
+
+    @bindings.add('c-w')
+    @bindings.add('c-q')
+    def exit_(event):
+        """Quit the console application."""
+        event.app.exit()
+
+    @bindings.add('s-tab')
+    @bindings.add('c-right')
+    @bindings.add('c-down')
+    def app_focus_next(event):
+        """Move focus to the next widget."""
+        focus_next(event)
+
+    @bindings.add('c-left')
+    @bindings.add('c-up')
+    def app_focus_previous(event):
+        """Move focus to the previous widget."""
+        focus_previous(event)
+
+    return bindings
diff --git a/pw_console/py/pw_console/style.py b/pw_console/py/pw_console/style.py
new file mode 100644
index 0000000..471911d
--- /dev/null
+++ b/pw_console/py/pw_console/style.py
@@ -0,0 +1,55 @@
+# 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.
+"""UI Color Styles for ConsoleApp."""
+
+from prompt_toolkit.styles import Style
+
+TOOLBAR_STYLE = 'bg:#fdd1ff #432445'
+
+pw_console_styles = Style.from_dict({
+    'bottom_toolbar_colored_background': TOOLBAR_STYLE,
+    'bottom_toolbar': TOOLBAR_STYLE,
+    'bottom_toolbar_colored_text': TOOLBAR_STYLE,
+
+    # FloatingMessageBar style
+    'message': 'bg:#282c34 #c678dd',
+
+    # prompt_toolkit scrollbar styles:
+    'scrollbar.background': 'bg:#3e4452 #abb2bf',
+    'scrollbar.button': 'bg:#7f3285 #282c34',
+    # Unstyled scrollbar classes:
+    # 'scrollbar.arrow'
+    # 'scrollbar.start'
+    # 'scrollbar.end'
+
+    # Top menu bar styles
+    'menu': 'bg:#3e4452 #bbc2cf',
+    'menu-bar.selected-item': 'bg:#61afef #282c34',
+    'menu-border': 'bg:#282c34 #61afef',
+    'menu-bar': TOOLBAR_STYLE,
+
+    # Top bar logo + keyboard shortcuts
+    'logo':    TOOLBAR_STYLE + ' bold',
+    'keybind': TOOLBAR_STYLE,
+    'keyhelp': TOOLBAR_STYLE,
+
+    # Help window styles
+    'help_window_content': 'bg:default default',
+    'frame.border': '',
+    'shadow': 'bg:#282c34',
+
+    # Highlighted line style
+    'cursor-line': 'bg:#3e4452 nounderline',
+    'selected-log-line': 'bg:#3e4452',
+}) # yapf: disable