create new project
This commit is contained in:
parent
ee2c95ce6c
commit
db59bfa114
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/.dev/
|
||||||
|
__pycache__/
|
||||||
|
*.swp
|
3
sqle/__init__.py
Normal file
3
sqle/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
# TODO
|
||||||
|
|
10
sqle/__main__.py
Normal file
10
sqle/__main__.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
from imgui_bundle import imgui, imgui_ctx, immapp
|
||||||
|
|
||||||
|
import sqle.win
|
||||||
|
|
||||||
|
term = sqle.win.Terminal()
|
||||||
|
|
||||||
|
immapp.run(
|
||||||
|
window_title = "SQLE",
|
||||||
|
gui_function = lambda: term.gui(),
|
||||||
|
)
|
1
sqle/utl/__init__.py
Normal file
1
sqle/utl/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
from .future import Future, Promise
|
26
sqle/utl/future.py
Normal file
26
sqle/utl/future.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
from typing import Generic, TypeVar
|
||||||
|
from threading import Event
|
||||||
|
|
||||||
|
T = TypeVar("T")
|
||||||
|
|
||||||
|
class Future(Generic[T]):
|
||||||
|
_event: Event = Event()
|
||||||
|
_data : T|None = None
|
||||||
|
|
||||||
|
def get(self) -> T|None:
|
||||||
|
return self._data if self.filled() else None
|
||||||
|
|
||||||
|
def filled(self) -> bool:
|
||||||
|
return self._event.is_set()
|
||||||
|
|
||||||
|
class Promise(Future[T]):
|
||||||
|
def fill(self, data: T):
|
||||||
|
self._data = data
|
||||||
|
self._event.set()
|
||||||
|
return self
|
||||||
|
|
||||||
|
def is_filled(fut: Future[T]|None):
|
||||||
|
return fut.filled() if fut is not None else False
|
||||||
|
|
||||||
|
def is_filling(fut: Future[T]|None):
|
||||||
|
return (not fut.filled()) if fut is not None else False
|
1
sqle/win/__init__.py
Normal file
1
sqle/win/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
from .terminal import Terminal
|
44
sqle/win/terminal.py
Normal file
44
sqle/win/terminal.py
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
from imgui_bundle import imgui, imgui_ctx
|
||||||
|
from abc import ABCMeta, abstractmethod
|
||||||
|
|
||||||
|
from sqle.utl.future import Future, Promise, is_filling, is_filled
|
||||||
|
|
||||||
|
|
||||||
|
class Terminal:
|
||||||
|
def __init__(self):
|
||||||
|
self._sql = ""
|
||||||
|
self._io = _IO()
|
||||||
|
|
||||||
|
self._req_sql = None
|
||||||
|
self._req_fut = None
|
||||||
|
|
||||||
|
def gui(self) -> None:
|
||||||
|
with imgui_ctx.begin("my first window"):
|
||||||
|
modified, self._sql = imgui.input_text(
|
||||||
|
"##sql",
|
||||||
|
self._sql,
|
||||||
|
)
|
||||||
|
|
||||||
|
if imgui.is_item_deactivated_after_edit():
|
||||||
|
accept_enter = (self._req_sql != self._sql) or (not is_filling(self._req_fut))
|
||||||
|
if accept_enter:
|
||||||
|
# TODO: abort prev future
|
||||||
|
self._req_fut = self._io.try_exec(self._sql)
|
||||||
|
|
||||||
|
if is_filled(self._req_fut):
|
||||||
|
msg = self._req_fut.get()
|
||||||
|
imgui.text(msg if msg is not None else "OK")
|
||||||
|
|
||||||
|
# TODO: display table
|
||||||
|
|
||||||
|
# an interface the Terminal window wants for handling SQL
|
||||||
|
class IO(metaclass = ABCMeta):
|
||||||
|
@abstractmethod
|
||||||
|
def try_exec(self, sql: str) -> Promise[str|None]: # TODO: return also SQL result
|
||||||
|
pass
|
||||||
|
|
||||||
|
# an impl of IO for testing
|
||||||
|
class _IO(IO):
|
||||||
|
def try_exec(self, sql):
|
||||||
|
print("exec: "+sql)
|
||||||
|
return Promise().fill(None)
|
Loading…
Reference in New Issue
Block a user