working on more stuff for the berry.ui library

This commit is contained in:
SpookyDervish
2025-10-27 18:43:34 +11:00
parent 29d2cf1970
commit 4d3fd99a17
4 changed files with 77 additions and 11 deletions

2
docs/index.html Normal file
View File

@@ -0,0 +1,2 @@
# Berry IDE
W.I.P

35
main.py
View File

@@ -10,10 +10,21 @@ from textual_fspicker import FileOpen, FileSave
from plugin_loader import PluginLoader from plugin_loader import PluginLoader
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import subprocess import subprocess
import os import os
class Watcher(FileSystemEventHandler):
def __init__(self, app: App):
super().__init__()
self.app = app
async def on_any_event(self, event):
await self.app.query_one(DirectoryTree).reload()
class Berry(App): class Berry(App):
CSS_PATH = "assets/style.tcss" CSS_PATH = "assets/style.tcss"
SUB_TITLE = "New File" SUB_TITLE = "New File"
@@ -26,6 +37,10 @@ class Berry(App):
Binding("ctrl+f", "find", "Find", priority=True) Binding("ctrl+f", "find", "Find", priority=True)
] ]
def __init__(self, path: str):
super().__init__()
self.path = path
def compose(self) -> ComposeResult: def compose(self) -> ComposeResult:
yield Header() yield Header()
with Vertical(id="sidebar"): with Vertical(id="sidebar"):
@@ -36,7 +51,7 @@ class Berry(App):
with ContentSwitcher(initial="files"): with ContentSwitcher(initial="files"):
with Vertical(id="files"): with Vertical(id="files"):
yield Static("EXPLORER") yield Static("EXPLORER")
yield DirectoryTree("./", id="directory") yield DirectoryTree(self.path, id="directory")
with Vertical(id="editor"): with Vertical(id="editor"):
first_tab = Tab("New File") first_tab = Tab("New File")
@@ -46,7 +61,7 @@ class Berry(App):
first_tab, first_tab,
id="file-tabs" id="file-tabs"
) )
yield TextArea.code_editor(placeholder="This file is empty.", language="python", theme="css", id="code-editor", disabled=True) yield TextArea.code_editor(placeholder="This file is empty.", theme="css", id="code-editor", disabled=True)
#if os.name == "nt": #if os.name == "nt":
with Vertical(id="console-container"): with Vertical(id="console-container"):
@@ -248,7 +263,11 @@ class Berry(App):
with open(result, "wb") as f: with open(result, "wb") as f:
f.write(self.query_one("#code-editor").text.encode()) f.write(self.query_one("#code-editor").text.encode())
tabs: Tabs = self.query_one("#file-tabs")
tabs.active_tab.label = os.path.basename(result)
self.notify(f"Saved to {result} successfully.", title="Done!", markup=False) self.notify(f"Saved to {result} successfully.", title="Done!", markup=False)
self.query_one(DirectoryTree).reload()
def action_save_as(self): def action_save_as(self):
self.push_screen(FileSave(), callback=self.done_saving) self.push_screen(FileSave(), callback=self.done_saving)
@@ -269,6 +288,11 @@ class Berry(App):
self.unsaved_files.pop(self.open_file) self.unsaved_files.pop(self.open_file)
self.notify("Saved.") self.notify("Saved.")
def action_quit(self):
self.observer.stop()
self.observer.join()
return super().action_quit()
def on_ready(self): def on_ready(self):
# src/main.py: Tab<> # src/main.py: Tab<>
self.file_tabs = {} self.file_tabs = {}
@@ -277,12 +301,15 @@ class Berry(App):
self.switching = False self.switching = False
self.file_clicked = False self.file_clicked = False
self.observer = Observer()
self.observer.schedule(Watcher(self), path=self.path)
self.observer.start()
#if os.name == "nt": #if os.name == "nt":
self.query_one("#console").write("Run a command below.") self.query_one("#console").write("Run a command below.")
#else: #else:
# self.query_one("#terminal").start() # self.query_one("#terminal").start()
if __name__ == "__main__": if __name__ == "__main__":
app = Berry() app = Berry("./")
app.run() app.run()

View File

@@ -1,7 +1,8 @@
from textual_window import Window from textual_window import Window
from textual.widgets import RichLog from textual.widgets import RichLog, Button
from textual import work from textual import work
from lupa import LuaRuntime, lua51 from textual.binding import Binding
from lupa import lua51
import os, json, asyncio import os, json, asyncio
@@ -18,6 +19,30 @@ class PluginLoader(Window):
allow_maximize=True allow_maximize=True
) )
def fake_notify(self, message: str, title: str = None, severity: str = "information"):
self.app.notify(message=message, title=title, severity=severity)
def create_sidebar_button(self, icon: str):
new_button = Button(icon)
self.app.query_one("#sidebar-buttons").mount(new_button)
def set_theme(self, theme_name: str):
self.app.theme = theme_name
def add_bind(self, action_name: str, key: str, description: str, show: bool = True):
# a bit of a sneaky way of doing things
self.app.bind(key, action_name, description=description, show=show)
self.app.refresh_bindings()
def fake_run_action(self, action_name: str):
getattr(self.app, f"action_{action_name}")()
def create_action(self, action_name: str, function):
def wrapper():
function()
setattr(self.app, f"action_{action_name}", wrapper)
@work @work
async def find_plugins(self): async def find_plugins(self):
log = self.query_one(RichLog) log = self.query_one(RichLog)
@@ -26,9 +51,15 @@ class PluginLoader(Window):
log.write("[b]Setting up LUA runtime..[/]") log.write("[b]Setting up LUA runtime..[/]")
self.lua_runtime = lua51.LuaRuntime() self.lua_runtime = lua51.LuaRuntime()
lua_runtime_stuff = { lua_runtime_stuff = {
"ui": { "ui": {
"notify": self.notify "notify": self.fake_notify,
"createSidebarButton": self.create_sidebar_button,
"setTheme": self.set_theme,
"runAction": self.fake_run_action,
"addBind": self.add_bind,
"createAction": self.create_action
} }
} }
@@ -109,7 +140,7 @@ class PluginLoader(Window):
executed_code = self.lua_runtime.execute(code) executed_code = self.lua_runtime.execute(code)
except lua51.LuaError as e: except lua51.LuaError as e:
log.write(f"[b red]Error in {lua_file_path}: {e}[/]") log.write(f"[b red]Error in {lua_file_path}: {e}[/]")
self.notify("There was Lua error while loading one your installed plugins. Check the Plugin Loader window for more details.", title="Lua Error", severity="error") self.notify("There was Lua error while loading one your installed plugins. Check the Plugin Loader window for more details.", title="Lua Error", severity="error", timeout=10)
no_errors = False no_errors = False
continue continue
@@ -120,8 +151,9 @@ class PluginLoader(Window):
plugin_paths.append(plugin_folder) plugin_paths.append(plugin_folder)
log.write("\n[b]Done loading plugins![/]")
if no_errors: if no_errors:
log.write("\n[d]Window will automatically close in 5 seconds.[/]") log.write("[d]Window will automatically close in 5 seconds.[/]")
await asyncio.sleep(5.0) await asyncio.sleep(5.0)
self.close_window() self.close_window()

View File

@@ -1,7 +1,12 @@
local plugin = {} local plugin = {}
function testAction()
berry.ui.notify("I just ran the test action!")
end
function plugin.init() function plugin.init()
berry.ui.notify(tostring(math.random(1,10))) berry.ui.createAction("test", testAction)
berry.ui.addBind("test", "ctrl+d", "Test")
end end
return plugin return plugin