very basic file openning

This commit is contained in:
2026-02-06 06:28:58 +11:00
parent 3e8d85e0a4
commit 38b063f7af

View File

@@ -1,6 +1,6 @@
from textual.screen import Screen
from textual.app import ComposeResult
from textual.widgets import Input, Select, LoadingIndicator, Static, DataTable, ContentSwitcher, Tabs, Tab, Button, Markdown
from textual.widgets import Input, Select, TextArea, LoadingIndicator, Static, DataTable, ContentSwitcher, Tabs, Tab, Button, Markdown
from textual.containers import VerticalGroup, Vertical, HorizontalGroup, Right
from textual import work
@@ -20,6 +20,7 @@ class RepoViewScreen(Screen):
self.owner_name = owner_name
self.repo_name = repo_name
self.current_dir = "."
self.readme_loaded = False
def get_icon_from_name_and_type(self, file_name: str, is_folder: bool):
@@ -85,17 +86,61 @@ class RepoViewScreen(Screen):
else:
return "\ue5ff"
@work(thread=True, exclusive=True)
def action_view_file(self, path: str, type: str):
@work(thread=False, exclusive=True)
async def action_view_file(self, path: str, type: str):
self.notify(f"{path, type}")
if type == "dir":
self.current_dir = path
self.show_directory(path)
elif type == "file":
self.show_file(path)
def show_file(self, path: str):
files: DataTable = self.query_one("#files")
loading = self.query_one(LoadingIndicator)
open_file: TextArea = self.query_one("#open-file")
self.query_one("#readme").display = False
self.query_one("#repo-info").display = False
files.display = False
open_file.display = False
loading.display = True
content = requests.get(
self.app.GITEA_HOST + f"api/v1/repos/{self.owner_name}/{self.repo_name}/raw/{path}"
).text
languages = {
"py": "python",
"md": "markdown",
"h": "c",
"cpp": "c++"
}
extension = path[path.rfind(".")+1:]
open_file.text = content
try:
open_file.language = languages.get(extension, extension)
except:
open_file.language = None
self.notify(f"{open_file._languages}")
loading.display = False
open_file.display = True
def show_directory(self, path: str):
files: DataTable = self.query_one("#files")
self.query_one("#open-file").display = False
files.clear(columns=True)
loading = self.query_one(LoadingIndicator)
self.query_one("#repo-info").display = path == "."
files.display = False
loading.display = True
readme: Markdown = self.query_one("#readme")
readme.display = path == "."
# get files in dir
files_response = requests.get(
@@ -158,10 +203,8 @@ class RepoViewScreen(Screen):
else:
break
readme: Markdown = self.query_one("#readme")
found_readme = False
readme.display = path == "."
found_readme = False
# add a ".." folder if we're not in the root directory
if path != ".":
@@ -183,10 +226,11 @@ class RepoViewScreen(Screen):
f"[d]Updated {time_delta(datetime.now() - commit_created_at)} ago[/]"
))
if path == "." and file["name"].lower() == "readme.md":
if not self.readme_loaded and path == "." and file["name"].lower() == "readme.md":
print("Getting README...")
found_readme = True
self.readme_loaded = True
readme.border_title = f"\uf405 {file["name"]}"
readme_content = requests.get(
@@ -197,26 +241,18 @@ class RepoViewScreen(Screen):
print("Adding rows...")
files.add_rows(rows)
if not found_readme and path == ".":
if not self.readme_loaded and not found_readme and path == ".":
self.readme_loaded = True
self.app.call_from_thread(readme.update, "This repository has no `README.md` file.")
return found_readme
files.display = True
loading.display = False
@work(thread=True, exclusive=True)
def on_mount(self):
print("Getting files...")
files: DataTable = self.query_one("#files")
loading = self.query_one(LoadingIndicator)
files.display = False
self.show_directory(self.current_dir)
loading.display = False
files.display = True
def compose(self) -> ComposeResult:
# get repo data via a request
@@ -271,6 +307,8 @@ class RepoViewScreen(Screen):
#table.add_row("\ue5ff screens", "[d]switched from tabs to spaces", "[d]51 minutes ago")
yield table
yield TextArea.code_editor(theme="css", placeholder="Empty file", read_only=True, id="open-file")
yield LoadingIndicator()
readme = Markdown(markdown="Loading...", id="readme")