very basic file openning
This commit is contained in:
@@ -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
|
found_readme = False
|
||||||
|
|
||||||
readme.display = path == "."
|
|
||||||
|
|
||||||
# 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,25 +241,17 @@ 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:
|
||||||
|
|
||||||
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user