Skip to content

Commit

Permalink
Merge pull request #239 from billyeatcookies/palette-symbols
Browse files Browse the repository at this point in the history
Symbols Palette (`@` palette)
  • Loading branch information
tomlin7 committed Mar 4, 2024
2 parents 233166f + 2d307f6 commit 4329ace
Show file tree
Hide file tree
Showing 21 changed files with 83 additions and 60 deletions.
2 changes: 1 addition & 1 deletion biscuit/core/components/editors/texteditor/text.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ def config_bindings(self):
self.bind("<KeyRelease>", self.key_release_events)

self.bind("<Control-f>", self.open_find_replace)
self.bind("<Control-g>", lambda _: self.base.palette.show_prompt(':'))
self.bind("<Control-g>", lambda _: self.base.palette.show(':'))
self.bind("<Control-Left>", lambda _: self.handle_ctrl_hmovement())
self.bind("<Control-Right>", lambda _: self.handle_ctrl_hmovement(True))
self.bind("<Control-Shift-Left>", lambda _: self.handle_ctrl_shift_hmovement())
Expand Down
26 changes: 10 additions & 16 deletions biscuit/core/components/floating/palette/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,6 @@ class Palette(Toplevel):
Palette is an action menu centered horizontally and aligned to top of root.
They contain a list of actions.
+----------------------------------------------+
| \ | search | \ |
| \ +--------------------------------+ \ |
| \ \ \ \ \ \ \ \ \ |
|\ \ \ \ \ \ \ \ \ \|
| \ \ \ \ \ \ \ \ \ |
| \ \ \ \ \ \ \ \ \ |
| \ \ \ \ \ \ \ \ \ |
+----------------------------------------------+
"""
def __init__(self, master: App, width=60, *args, **kwargs) -> None:
super().__init__(master, *args, **kwargs)
Expand Down Expand Up @@ -59,15 +49,19 @@ def __init__(self, master: App, width=60, *args, **kwargs) -> None:
self.configure_bindings()

def register_actionset(self, actionset: ActionSet) -> None:
"Expects a lambda returning the actionset instead of the actionset itself"
"""Registers an actionset to the palette
Args:
actionset (ActionSet): lambda returning the actionset instead of the actionset itself
"""
self.actionsets.append(actionset)

def generate_help_actionset(self) -> None:
self.help_actionset = ActionSet("Help", "?")
for i in self.actionsets:
i = i() # get the actionset
if i.prompt:
self.help_actionset.append((i.prompt, lambda _, i=i: self.after(50, self.show_prompt, i.prompt), i.description))
if i.prefix:
self.help_actionset.append((i.prefix, lambda _, i=i: self.after(50, self.show, i.prefix), i.description))

# print([i() for i in self.actionsets])
self.register_actionset(lambda: self.help_actionset)
Expand Down Expand Up @@ -161,8 +155,8 @@ def show_items(self, items: list[PaletteItem]) -> None:

self.reset_selection()

def show_prompt(self, prompt: str) -> None:
"""Shows the palette with the passed prompt"""
def show(self, prefix: str) -> None:
"""Shows the palette with the passed prefix"""
self.update_idletasks()

x = self.master.winfo_rootx() + int((self.master.winfo_width() - self.winfo_width())/2)
Expand All @@ -172,4 +166,4 @@ def show_prompt(self, prompt: str) -> None:

self.focus_set()
self.searchbar.focus()
self.searchbar.add_prompt(prompt)
self.searchbar.add_prefix(prefix)
8 changes: 4 additions & 4 deletions biscuit/core/components/floating/palette/actionset.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@


class ActionSet(list):
def __init__(self, description: str, prompt: str, items: List[Tuple[str, Callable]] = [],
def __init__(self, description: str, prefix: str, items: List[Tuple[str, Callable]] = [],
pinned: List[Tuple[str, Callable]] = [], *args, **kwargs) -> None:
"""Palette Actionset
A list of items that can be searched through.
Expand All @@ -11,16 +11,16 @@ def __init__(self, description: str, prompt: str, items: List[Tuple[str, Callabl
----------
description : str
The description of the actionset.
prompt : str
The prompt of the actionset.
prefix : str
The prefix of the actionset.
items : List[Tuple[str, Callable]]
The items in the actionset.
pinned : List[Tuple[str, Callable]]
The pinned items in the actionset.
"""
super().__init__(items, *args, **kwargs)
self.description: str = description
self.prompt: str = prompt
self.prefix: str = prefix

self.pinned: List[Tuple[str, Callable]] = pinned # [[command, callback], ...]

Expand Down
14 changes: 7 additions & 7 deletions biscuit/core/components/floating/palette/searchbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ def clear(self) -> None:
def focus(self) -> None:
self.search_bar.focus()

def add_prompt(self, prompt: str) -> None:
self.text_variable.set(prompt + " ")
def add_prefix(self, prefix: str) -> None:
self.text_variable.set(prefix + " ")
self.search_bar.icursor(tk.END)

def get_search_term(self) -> str:
Expand All @@ -51,18 +51,18 @@ def get_search_term(self) -> str:
def filter(self, *args) -> None:
term = self.get_search_term()

prompt_found = False
prefix_found = False
for actionset in self.master.actionsets:
actionset = actionset()
if term.startswith(actionset.prompt):
if term.startswith(actionset.prefix):
self.master.pick_actionset(actionset)
term = term[len(actionset.prompt):].strip()
term = term[len(actionset.prefix):].strip()

prompt_found = True
prefix_found = True
break

self.term = term
if not prompt_found:
if not prefix_found:
self.master.pick_file_search(term)

exact, starts, includes = [], [], []
Expand Down
9 changes: 9 additions & 0 deletions biscuit/core/components/lsp/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import tarts as lsp

from .client import LangServerClient
from .utils import decode_position

if typing.TYPE_CHECKING:
from biscuit.core import App
Expand All @@ -24,6 +25,14 @@ def __init__(self, base: App):

self.kill_thread = None

def _update_symbols(self, tab, resp) -> None:
try:
self.base.settings.symbols_actionset.update([(i.name, lambda _, i=i: self.base.goto_location_in_active_editor(decode_position(i.location.range.start))) for i in resp])
self.base.palette.update()
except:
#TODO: currently only supports lsp.SymbolInformation; implement this for lsp.DocumentSymbol
pass

def register_langserver(self, language, command) -> None:
self.langservers[language] = command

Expand Down
1 change: 0 additions & 1 deletion biscuit/core/components/lsp/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,4 +97,3 @@ def __repr__(self) -> str:
@dataclasses.dataclass
class WorkspaceEdits:
edits: List[WorkspaceEdit]

3 changes: 2 additions & 1 deletion biscuit/core/components/lsp/handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,8 @@ def process(self, e: lsp.Event) -> None:
tab = self.master._outline_requests.pop(e.message_id)
if tab not in self.master.tabs_opened:
return


self.base.language_server_manager._update_symbols(tab, e.result)
self.base.outline.update_symbols(tab, e.result if e.result and isinstance(e.result[0], lsp.DocumentSymbol) else to_document_symbol(e.result))
return

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
class DirectoryTree(SidebarViewItem):
def __init__(self, master, startpath=None, observe_changes=False, itembar=True, *args, **kwargs) -> None:
self.title = 'No folder opened'
self.__buttons__ = (('new-file', lambda: self.base.palette.show_prompt('newfile:')),
('new-folder', lambda: self.base.palette.show_prompt('newfolder:')),
self.__buttons__ = (('new-file', lambda: self.base.palette.show('newfile:')),
('new-folder', lambda: self.base.palette.show('newfolder:')),
('refresh', self.refresh_root), ('collapse-all', self.collapse_all))
super().__init__(master, itembar, *args, **kwargs)

Expand Down
6 changes: 3 additions & 3 deletions biscuit/core/components/views/sidebar/explorer/menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ def get_coords(self, e) -> list:
class ExplorerContextMenu(Menu):
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
self.add_item("New file...", lambda: self.base.palette.show_prompt('newfile:'))
self.add_item("New Folder...", lambda: self.base.palette.show_prompt('newfolder:'))
self.add_item("New file...", lambda: self.base.palette.show('newfile:'))
self.add_item("New Folder...", lambda: self.base.palette.show('newfolder:'))
self.add_item("Reveal in File Explorer", self.master.reveal_in_explorer)
self.add_item("Open in Integrated Terminal", self.master.open_in_terminal)
# self.add_separator()
Expand All @@ -20,7 +20,7 @@ def __init__(self, *args, **kwargs) -> None:
self.add_item("Copy Path", self.master.copy_path)
self.add_item("Copy Relative Path", self.master.copy_relpath)
self.add_separator()
self.add_item("Rename...", lambda: self.base.palette.show_prompt('renamefile:'))
self.add_item("Rename...", lambda: self.base.palette.show('renamefile:'))
self.add_item("Delete", self.master.delete_item)

def get_coords(self, e) -> list:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@ def open_folder(self, *_) -> None:
self.base.events.open_directory()

def clone_repo(self, *_) -> None:
self.base.palette.show_prompt("clone")
self.base.palette.show("clone")
12 changes: 8 additions & 4 deletions biscuit/core/components/views/sidebar/outline/tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,18 @@

import tarts as lsp

from biscuit.core.components.utils.codicon import get_codicon
from biscuit.core.components.lsp.utils import decode_position
from biscuit.core.components.utils import Text, get_codicon

from .kinds import kinds


class Tree(tk.Text):
class Tree(Text):
def __init__(self, master):
super().__init__(master, wrap="none", borderwidth=0, highlightthickness=0)
self.master = master
self.base = master.base
self.config(**self.base.theme.views.sidebar.item.content, font=("Segoi UI", 10), padx=10, pady=10, spacing1=0, spacing2=0, spacing3=0)
self.config(cursor= "hand2", **self.base.theme.views.sidebar.item.content, font=("Segoi UI", 10), padx=10, pady=10, spacing1=0, spacing2=0, spacing3=0)

for kind in kinds:
if kind[1]:
Expand All @@ -37,10 +38,13 @@ def add_items(self, items: list[lsp.DocumentSymbol], level=0) -> None:
for item in items:
if item.kind == lsp.SymbolKind.MODULE:
continue

tag = f"{item.name}{item.kind}"
self.insert(tk.END, "┊" * level, "line")
self.insert(tk.END, get_codicon(kinds[item.kind - 1][0]), kinds[item.kind - 1][0])
self.insert(tk.END, f" {item.name}\n")
self.insert(tk.END, f" {item.name}\n", tag)
self.add_items(item.children, level + 1)
self.tag_bind(tag, "<Button-1>", lambda e, i=item: self.base.goto_location_in_active_editor(decode_position(i.range.start)))

# def onclick(self, event: tk.Event) -> None:
# self.config(state=tk.NORMAL)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,4 @@ def open_folder(self, _) -> None:
self.base.events.open_directory()

def clone_repo(self, *_) -> None:
self.base.palette.show_prompt("clone")
self.base.palette.show("clone")
2 changes: 1 addition & 1 deletion biscuit/core/layout/base/content/editors/editorsbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def __init__(self, master: EditorsPane, *args, **kwargs) -> None:
self.tabs.pack(fill=tk.BOTH, side=tk.LEFT, expand=True)

self.menu = EditorsbarMenu(self, "tabs")
self.menu.add_item("Show Opened Editors", lambda: self.base.palette.show_prompt("active:"))
self.menu.add_item("Show Opened Editors", lambda: self.base.palette.show("active:"))
self.menu.add_separator(10)
self.menu.add_item("Close All", self.master.delete_all_editors)

Expand Down
12 changes: 9 additions & 3 deletions biscuit/core/layout/base/content/editors/tabs.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,18 @@ def close_active_tab(self) -> None:
self.close_tab(self.active_tab)

def close_tab(self, tab: Tab) -> None:
i = self.tabs.index(tab)
self.tabs.remove(tab)
tab.editor.grid_forget()
self.master.master.close_editor(tab.editor)
tab.destroy()

try:
i = self.tabs.index(tab)
except ValueError:
# most probably in case of diff editors, not handled
return

self.tabs.remove(tab)
self.master.master.close_editor(tab.editor)

if self.tabs:
if i < len(self.tabs):
self.tabs[i].select()
Expand Down
2 changes: 1 addition & 1 deletion biscuit/core/layout/base/sidebar/slots.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def add_menus(self) -> None:

def add_settings_menu(self) -> None:
settings_menu = self.add_menu("settings-gear", "manage")
settings_menu.add_item("Command Palette", lambda *_: self.base.palette.show_prompt(">"))
settings_menu.add_item("Command Palette", lambda *_: self.base.palette.show(">"))
settings_menu.add_separator()
settings_menu.add_item("Settings", self.base.open_settings)

Expand Down
4 changes: 2 additions & 2 deletions biscuit/core/layout/menubar/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ def add_view_menu(self) -> None:
events = self.events

self.view_menu = self.add_menu("View")
self.view_menu.add_item("Command Palette...", lambda: self.base.palette.show_prompt(">"))
self.view_menu.add_item("Command Palette...", lambda: self.base.palette.show(">"))
self.view_menu.add_item("Explorer", events.show_explorer)
self.view_menu.add_item("Outline", events.show_outline)
self.view_menu.add_item("Search", events.show_search)
Expand All @@ -173,7 +173,7 @@ def add_help_menu(self) -> None:

self.help_menu = self.add_menu("Help")
self.help_menu.add_item("Welcome", events.show_welcome)
self.help_menu.add_item("Show All Commands", events.show_command_prompt)
self.help_menu.add_item("Show All Commands", events.show_command_palette)
self.help_menu.add_item("Documentation", events.documentation)
self.help_menu.add_item("Show Release Notes", events.release_notes)
self.help_menu.add_separator()
Expand Down
14 changes: 7 additions & 7 deletions biscuit/core/layout/statusbar/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def __init__(self, master: Root, *args, **kwargs) -> None:
("rewrite", lambda e=None: print("rewrite", e))],
)
self.base.palette.register_actionset(lambda: self.git_actionset)
self.branch = SButton(self, text="master", icon="source-control", function=lambda: self.base.palette.show_prompt('branch:'), description="Checkout branch")
self.branch = SButton(self, text="master", icon="source-control", function=lambda: self.base.palette.show('branch:'), description="Checkout branch")
self.branch.set_pack_data(side=tk.LEFT, padx=(2, 0))

# process indicator
Expand All @@ -64,7 +64,7 @@ def __init__(self, master: Root, *args, **kwargs) -> None:
"Goto line in active editor", ":", pinned=[["goto line: {}", lambda line=None: self.base.editorsmanager.active_editor.content.goto_line(int(line)) if line and line.isnumeric() else print("failed goto line", line)]]
)
self.base.palette.register_actionset(lambda: self.lc_actionset)
self.line_col_info = SButton(self, text="Ln 1, Col 1", function=lambda: self.base.palette.show_prompt(':'), description="Go to Line/Column")
self.line_col_info = SButton(self, text="Ln 1, Col 1", function=lambda: self.base.palette.show(':'), description="Go to Line/Column")
self.line_col_info.set_pack_data(side=tk.RIGHT)

# indentation
Expand All @@ -74,7 +74,7 @@ def __init__(self, master: Root, *args, **kwargs) -> None:
("4", lambda e=None: print("indent 2", e))],
)
self.base.palette.register_actionset(lambda: self.indent_actionset)
self.indentation = SButton(self, text="Spaces: 4", function=lambda: self.base.palette.show_prompt('indent:'), description="Select indentation")
self.indentation = SButton(self, text="Spaces: 4", function=lambda: self.base.palette.show('indent:'), description="Select indentation")
self.indentation.set_pack_data(side=tk.RIGHT)

# encoding
Expand All @@ -83,7 +83,7 @@ def __init__(self, master: Root, *args, **kwargs) -> None:
[("UTF-8", lambda e=None: print("encoding UTF-8", e))],
)
self.base.palette.register_actionset(lambda: self.encoding_actionset)
self.encoding = SButton(self, text="UTF-8", function=lambda: self.base.palette.show_prompt('encoding:'), description="Select encoding")
self.encoding = SButton(self, text="UTF-8", function=lambda: self.base.palette.show('encoding:'), description="Select encoding")
self.encoding.set_pack_data(side=tk.RIGHT)

# end of line
Expand All @@ -92,7 +92,7 @@ def __init__(self, master: Root, *args, **kwargs) -> None:
[(i.upper(), lambda _, val=nl: self.base.editorsmanager.active_editor.content.text.change_eol(eol=val)) for i, nl in textutils.eol_map.items()],
)
self.base.palette.register_actionset(lambda: self.eol_actionset)
self.eol = SButton(self, text="CRLF", function=lambda: self.base.palette.show_prompt('eol:'), description="Select End of Line sequence")
self.eol = SButton(self, text="CRLF", function=lambda: self.base.palette.show('eol:'), description="Select End of Line sequence")
self.eol.set_pack_data(side=tk.RIGHT)

# language mode
Expand All @@ -101,7 +101,7 @@ def __init__(self, master: Root, *args, **kwargs) -> None:
"Change Language Mode", "language:", items
)
self.base.palette.register_actionset(lambda: self.language_actionset)
self.file_type = SButton(self, text="Plain Text", function=lambda: self.base.palette.show_prompt('language:'), description="Select Language Mode")
self.file_type = SButton(self, text="Plain Text", function=lambda: self.base.palette.show('language:'), description="Select Language Mode")
self.file_type.set_pack_data(side=tk.RIGHT)

# show/hide notifications
Expand All @@ -116,7 +116,7 @@ def __init__(self, master: Root, *args, **kwargs) -> None:
("24 hours", lambda e=None: self.clock.use_24_hour_format(True)),],
)
self.base.palette.register_actionset(lambda: self.time_actionset)
self.clock.change_function(function=lambda: self.base.palette.show_prompt('time:'))
self.clock.change_function(function=lambda: self.base.palette.show('time:'))
self.clock.set_pack_data(side=tk.RIGHT)
self.clock.show()

Expand Down
5 changes: 5 additions & 0 deletions biscuit/core/settings/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,11 @@ def late_setup(self) -> None:
)
self.base.palette.register_actionset(lambda: clone_actionset)

self.symbols_actionset = ActionSet(
"Go to symbol in editor", "@", []
)
self.base.palette.register_actionset(lambda: self.symbols_actionset)

@property
def actionset(self):
"""Returns the generated action set."""
Expand Down
1 change: 1 addition & 0 deletions biscuit/core/settings/config/bindings/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def __init__(self, master: Settings) -> None:
self.close_file = "<Control-w>"
self.quit = "<Control-q>"
self.commandpalette = "<Control-P>"
self.symbolpalette = "<Control-J>"
self.panel = "<Control-grave>"
self.undo="<Control-z>"
self.redo="<Control-y>"
Expand Down
3 changes: 2 additions & 1 deletion biscuit/core/utils/binder.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ def bind_all(self) -> None:
def late_bind_all(self) -> None:
"""Bindings that require full initialization"""

self.bind(self.bindings.commandpalette, self.events.show_command_prompt)
self.bind(self.bindings.commandpalette, self.events.show_command_palette)
self.bind(self.bindings.symbolpalette, self.events.show_symbol_palette)
self.bind(self.bindings.panel, self.base.contentpane.toggle_panel)

self.bind('<Configure>', self.base.on_gui_update)
Expand Down
Loading

0 comments on commit 4329ace

Please sign in to comment.