diff --git a/screens/repo_view_screen.py b/screens/repo_view_screen.py index cc81efd..5ad08a0 100644 --- a/screens/repo_view_screen.py +++ b/screens/repo_view_screen.py @@ -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 == "." # 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,25 +241,17 @@ 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: @@ -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")