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.screen import Screen
from textual.app import ComposeResult 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.containers import VerticalGroup, Vertical, HorizontalGroup, Right
from textual import work from textual import work
@@ -20,6 +20,7 @@ class RepoViewScreen(Screen):
self.owner_name = owner_name self.owner_name = owner_name
self.repo_name = repo_name self.repo_name = repo_name
self.current_dir = "." self.current_dir = "."
self.readme_loaded = False
def get_icon_from_name_and_type(self, file_name: str, is_folder: bool): def get_icon_from_name_and_type(self, file_name: str, is_folder: bool):
@@ -85,17 +86,61 @@ class RepoViewScreen(Screen):
else: else:
return "\ue5ff" return "\ue5ff"
@work(thread=True, exclusive=True) @work(thread=False, exclusive=True)
def action_view_file(self, path: str, type: str): async def action_view_file(self, path: str, type: str):
self.notify(f"{path, type}") self.notify(f"{path, type}")
if type == "dir": if type == "dir":
self.current_dir = path self.current_dir = path
self.show_directory(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): def show_directory(self, path: str):
files: DataTable = self.query_one("#files") files: DataTable = self.query_one("#files")
self.query_one("#open-file").display = False
files.clear(columns=True) 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 # get files in dir
files_response = requests.get( files_response = requests.get(
@@ -158,10 +203,8 @@ class RepoViewScreen(Screen):
else: else:
break 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 # add a ".." folder if we're not in the root directory
if path != ".": if path != ".":
@@ -183,10 +226,11 @@ class RepoViewScreen(Screen):
f"[d]Updated {time_delta(datetime.now() - commit_created_at)} ago[/]" 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...") print("Getting README...")
found_readme = True found_readme = True
self.readme_loaded = True
readme.border_title = f"\uf405 {file["name"]}" readme.border_title = f"\uf405 {file["name"]}"
readme_content = requests.get( readme_content = requests.get(
@@ -197,26 +241,18 @@ class RepoViewScreen(Screen):
print("Adding rows...") print("Adding rows...")
files.add_rows(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.") 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) @work(thread=True, exclusive=True)
def on_mount(self): def on_mount(self):
print("Getting files...") print("Getting files...")
files: DataTable = self.query_one("#files")
loading = self.query_one(LoadingIndicator)
files.display = False
self.show_directory(self.current_dir) self.show_directory(self.current_dir)
loading.display = False
files.display = True
def compose(self) -> ComposeResult: def compose(self) -> ComposeResult:
# get repo data via a request # 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") #table.add_row("\ue5ff screens", "[d]switched from tabs to spaces", "[d]51 minutes ago")
yield table yield table
yield TextArea.code_editor(theme="css", placeholder="Empty file", read_only=True, id="open-file")
yield LoadingIndicator() yield LoadingIndicator()
readme = Markdown(markdown="Loading...", id="readme") readme = Markdown(markdown="Loading...", id="readme")