From f56625c9cf3a66c8c4e37b201be456cdf5b32152 Mon Sep 17 00:00:00 2001 From: Tim Bendt Date: Sun, 4 May 2025 19:53:27 -0600 Subject: [PATCH] style the modals --- .../actions/__pycache__/task.cpython-311.pyc | Bin 1609 -> 1983 bytes maildir_gtd/actions/task.py | 19 +++++++++----- maildir_gtd/email_viewer.tcss | 15 +++++++++++ maildir_gtd/screens/CreateTask.py | 14 ++++++++-- maildir_gtd/screens/OpenMessage.py | 24 +++++++++++------- .../__pycache__/CreateTask.cpython-311.pyc | Bin 2443 -> 3079 bytes .../__pycache__/OpenMessage.cpython-311.pyc | Bin 2451 -> 2722 bytes 7 files changed, 54 insertions(+), 18 deletions(-) diff --git a/maildir_gtd/actions/__pycache__/task.cpython-311.pyc b/maildir_gtd/actions/__pycache__/task.cpython-311.pyc index 757988b76cab9ee8ca35a6fd649ae2701f3451a5..9e1623c0281cb2379935e540d972c0a8f8f94614 100644 GIT binary patch literal 1983 zcma(S-A`Lp{G8s~mX?oJffYA_8w)H|p~=`>g1E$WFbM$`nM+0{_0oHQ!fkJJ&Z$6c z4bkbq7m3C|VodrXYM9A18b4y<1OGr-YOFUQS>nrlF*W!=_T=we+EO-&{`$MWuk-c$ zI;Wr2*SitG&~LukZzY6&7fKmyC1LM55Y~}~G_0eE1CA#!=r-LJlO`lAY?3a=>=Sm7 z9h&{7JmJvrI0`ub5Sxq!uqiJXbRM`jM2X7DRh7+;M<^k2(?JPO(s%@y&J#?A5Bx!U z9LOzkIu=qHG#f8_2c~Ix1x;g3x>=XOt0-GFQl5_xcOJ@{AZ}IEG~R?2Ta{H1fefD8 zQ-SeWV?p7wM2W@|Nv^~UP1TiYgDT*+%A@faMO8S&(PO#<3#)X7Q9EpWBotxz5Wc-X zA;6FDFv1Xy3-PLO=PI&>)97RLiLE-=xr%FZA|)35*Z6JQCd}Qc%zqn7^oDc|txNC9 z8Jxyhk>E$*Xkx0@+yEakwv3d7Y=%gXnjh`H>gH+ zqAA=c8LcMkQ%pN7F(}-j8b)3xG|HD!&H-WSQ?3pMT&7cHOYun5Fnv~ok}yk7C8!Z0 zjD^`O(RI^(Xffq0LstgO+K3U0CF9Wu+)2}2x`~EH%vuKBA7)(TNoG1U5)nq%z+!|X zc+`jo98?rmTwa#cIdy?T#am)xVoGWv!9+(W0+t`V6nupd%7Q!^n<8 zIK#DWPG~F|SM_dg7&;5aAbc%K!!Q(7BjPYvDXv*!$#h3%Nn}1O)Ku5OV7L^lHKkuS zBC5_V^c>Es1wU9Xbk_cTbRR9FqOIQ5vU}>O{HeZz_w>e4&U+eg*VmT!1@gY0icoaQ zPd5C8fcz~;5y>ZxCo6+RH|lu$SO2-Y{&PG2^LhXITR~0GLdEOs;Z){^Et8R>JjNG}rGPYCKpReoB)%6z| zeQRgSzkPtB9o7o&K;Gt+Bx`}>y>sz}kc74+cj%0?U4JsvEp2z(K^_grro=ckgfQ^df^rR?&==9eV`UEiZ@ka|s+hCwZOne#0K2*u!u{VDjDk5NC zUb5KnL_zkNTVrpH{nFI2)6|u3>iXQhBlqUz-dq{?U{~Rgc)UgfPFfF~dVrWtP8NAm z)v0(Z&9p6&p^@J+_SXNw?uU{bAF7^-sJ*er2|AwSaE>J(H;t^vvfD|Q+aRD_f gTfYK&ELX;Rs3mt43+VaWQ7k$d@!29ehFGWn13LrZfdBvi delta 952 zcmZ`&O-vI(6rS0?($dl*DYXz_!;eW1rNIzPpqLbagdRu~IM{=x?5tW@x|`Wqfd+&` z4|)?r?X7jmFJDw7;7wTL1wBHIQMP)8HbP;UGXF67C8a9>Ez9lYX$Q=}qJNxIhI3 zGPSlO%3J9Em8RCma0_?=`OkmzNJbEG*SS?t)IaqE4)D6l#a&+$4CN3Hs(?Z)Ujg=LwW{HYq(^3@GG_P5jw$fjSOlET$wGzD+AhW{5 z^0|U%0%IKy%dV(0AqL$BQ@y3)99fx+d0d}q%^O%}rCc6cc~>+IEl2Dop*>>~L~~s4 z#Im9qB&X+N0%mvQN?0{5jkr*yts92PZc>)zjf3&ToT*|nL2`@pY95iqI6X?!4HYNo z_h`Dl5GQ&(r`Wb|aot0+%+D15Y=A1~_n!V5?s{~k(j0jbeh@6ib`#GNuX{?}L*?$F zQfR2s)l&&as~(}X=_jD@o58)wst<%(%R#xA`V#DOf_;@x%U1AV(2KxLy zx^?Q!nYVFAo}%O}h0^6v+6kp?N1Th?NySqGV1K|jCiD9vZDZ~H`*v|mwv$o^p0p^4C-~a#s diff --git a/maildir_gtd/actions/task.py b/maildir_gtd/actions/task.py index af31c5a..378319a 100644 --- a/maildir_gtd/actions/task.py +++ b/maildir_gtd/actions/task.py @@ -1,20 +1,25 @@ +import asyncio import subprocess + +from textual import work from maildir_gtd.screens.CreateTask import CreateTaskScreen def action_create_task(app) -> None: """Show the input modal for creating a task.""" - def check_task(task_args: str) -> bool: + + async def check_task(task_args: str) -> bool: try: - result = subprocess.run( - ["task", "add"] + task_args.split(" "), - capture_output=True, - text=True + result = await asyncio.create_subprocess_shell( + f"task add {task_args}", + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE ) + stdout, stderr = await result.communicate() if result.returncode == 0: - app.show_status("Task created successfully.") + app.show_status(f"Task created: {stdout.decode()}") else: - app.show_status(f"Failed to create task: {result.stderr}") + app.show_status(f"Failed to create task: {stderr.decode()}", severity="error") except Exception as e: app.show_status(f"Error: {e}", severity="error") return True diff --git a/maildir_gtd/email_viewer.tcss b/maildir_gtd/email_viewer.tcss index 954345f..fe9a8f7 100644 --- a/maildir_gtd/email_viewer.tcss +++ b/maildir_gtd/email_viewer.tcss @@ -111,3 +111,18 @@ Markdown { #envelopes-list ListItem:odd { background: rgb(25, 24, 26); } + +#open_message_container, #create_task_container { + dock: bottom; + width: 100%; + padding: 0 1; + height: 5; + + Input { + width: 1fr; + } + Label, Button { + width: auto; + } +} + diff --git a/maildir_gtd/screens/CreateTask.py b/maildir_gtd/screens/CreateTask.py index 7de2c95..c33e891 100644 --- a/maildir_gtd/screens/CreateTask.py +++ b/maildir_gtd/screens/CreateTask.py @@ -14,16 +14,18 @@ class CreateTaskScreen(ModalScreen[str]): Input(placeholder="arguments", id="task_input"), ), Horizontal( - Button("Cancel"), - Button("Submit") + Button("Cancel", id="cancel"), + Button("Submit", id="submit", variant="primary"), ), id="create_task_container", classes="modal_screen" ) + @on(Input.Submitted) def handle_task_args(self) -> None: input_widget = self.query_one("#task_input", Input) + self.visible = False self.disabled = True self.loading = True task_args = input_widget.value @@ -32,3 +34,11 @@ class CreateTaskScreen(ModalScreen[str]): def on_key(self, event) -> None: if (event.key == "escape" or event.key == "ctrl+c"): self.dismiss() + + def button_on_click(self, event): + if event.button.id == "cancel": + self.dismiss() + elif event.button.id == "submit": + input_widget = self.query_one("#task_input", Input) + task_args = input_widget.value + self.dismiss(task_args) diff --git a/maildir_gtd/screens/OpenMessage.py b/maildir_gtd/screens/OpenMessage.py index 2cf0003..aa0ba4e 100644 --- a/maildir_gtd/screens/OpenMessage.py +++ b/maildir_gtd/screens/OpenMessage.py @@ -2,26 +2,32 @@ from textual import on from textual.app import ComposeResult from textual.screen import ModalScreen from textual.widgets import Input, Label, Button -from textual.containers import Container +from textual.containers import Horizontal class OpenMessageScreen(ModalScreen[int | None]): def compose(self) -> ComposeResult: - yield Container( - Label("📨", id="message_label"), + yield Horizontal( + Label("📨 ID", id="message_label"), Input(placeholder="Enter message ID (integer only)", type="integer", id="open_message_input"), - Button("Open", variant="primary", id="open_message_button"), + Button("Cancel", id="cancel"), + Button("Open", variant="primary", id="submit"), id="open_message_container", classes="modal_screen" ) @on(Input.Submitted) - def handle_message_id(self) -> None: + def handle_message_id(self, event) -> None: + input_widget = self.query_one("#open_message_input", Input) + message_id = int(input_widget.value if input_widget.value else 0) + self.dismiss(message_id) + + + def button_on_click(self, event) -> None: + if event.button.id == "cancel": + self.dismiss() + elif event.button.id == "submit": input_widget = self.query_one("#open_message_input", Input) message_id = int(input_widget.value if input_widget.value else 0) self.dismiss(message_id) - @on(Input._on_key) - def handle_close(self, event) -> None: - if (event.key == "escape" or event.key == "ctrl+c"): - self.dismiss() diff --git a/maildir_gtd/screens/__pycache__/CreateTask.cpython-311.pyc b/maildir_gtd/screens/__pycache__/CreateTask.cpython-311.pyc index c719a930ca58e7b9a039fd7282a168b749ca039c..c9fed7c5f84be331e3f2542bffa3c82f8b537833 100644 GIT binary patch delta 1206 zcmZ`&Ur19?7(eI!*SUGM(&;E?F7;ZIq8=1Xg(56uL5dG5jJbQkxjF0XF8ZTPLTJ_? z;Xp>KBI&iTIIcg}ad-`)KKcipb% zPG>a&d-Jhz`n~wtC1N~D58@t8)`cY@2a%U7Y}vS?%euHEj92N>5*n}8`4OZkbPjho z96)G;@k7FN4X;=0)f;?{gJh0g<_?{6=ry`?!ai4;!(PG?JW}jhH1VVbAha5}6H=n;J({$Sld%LnIQ4(>neWUZ>yr z(ZkuHyz1Xn{RP$kS#4OkksW#!$*Y5#>R>?~qyb?JKcUZrOMZSH1uF&WY*#5}9?yv7 z!WOuBl$EGUJbpq5>^R!YP$C+P#IGjJ3!|D`s=Agm$j#tf+#r%&Pb3kUiWzi5Y{y6F z9q|}$q3dFguL+`wO8|@LtEc5@|Kt93|GPt*o`HgAAU$04c+=-I^p|)Nx6*Fup+^HI zyzvM-Q#7s{aWeruMqV#zp=PXGw6R113=-Mc>NWgcnK5;+3?R zsofOa1<}35NuqBHm0_DlQd7mPa$?gK+6zjVx|?LJNGtU#%gw#)PWAw+gdL@Cc1};m gjD9jm^Gd4EhvBk+VdZxAbfK|hn}vSv6Sq$M4P0dnqW}N^ delta 630 zcmZpd=oaQ%&dbZi00eI;#WF%!HuAADGKNhSVYEYa+!{p_RE0mTo0<{1!1e9>XSPTp)ToAd*{v2WoDcmVM zYj~Hj02Ko<1cWh6XJlkZVE~%VH+dsdHfwNcQf}sCFXrovb0#aXga}>~P`DzXa92QV zLIs35c`{2FT0Bn6~yv8I-#=9LsP0oe))MbeX<*;N=7 zCTFnQ^2tI}@d7D7O|Hq?IkoI%fb1fW!@>67;spD-q$D+^NDU;Y4J1}F6oE7rNrMO; z7{LK#6cM+ek42O~523R4*{TBCh@sB=rT0JlI44 DUVe(i diff --git a/maildir_gtd/screens/__pycache__/OpenMessage.cpython-311.pyc b/maildir_gtd/screens/__pycache__/OpenMessage.cpython-311.pyc index 092e3420b20847793a0c44907c317605aaaa9c7d..aa3dbb71727a15868e43bf93d619c07aebffb83b 100644 GIT binary patch delta 1275 zcmZ`&%}*0S6rbJh7u#8id}ylyD&MOKl9(8U#*fGW4U|L(iAF=PyMgktCDX-30)ZG0 zXqu>*gWRkh5CR7eUc7nm57?R>nkG#=c<`cG0tds%H(Odn;Z5f^@4b2N&6{6mY0bMj z?Y*X{2;@d6IPvq9R%lZD5+pvKuaF(gBLD%`7}DXvpx6`Eo0 ze57Bv@zE{c8jsK>%%a$GNkhm`4Znf6v^A)=S*nSQN+YmUwI+cNW>H4aYmP$(8bbPs z=o~BIzM<>kTfKCgx7wteV^++Z&P%c4Dh$q=R$iVZ@tHC5I4>pV9?ryV`kVj0vjR1BTxJa%z0@Mn1hutU|&UAl;-IJsUvbsAip0t z2!Z7rmI|`f@YxDY385w4_8<6xf${_J_$XVzhj94ji$2!GLGFRJa3n|GQxc=34gyJ# zK@-3dVI_1qFFl;I?Sw@FY^RMuGXvHDX<^XHpdBE2z$jSxKrwMNVU5P7=JEx^n)iR3vq6b>geP&GEP8aMg?c=l##3spyI~a$0rj zerhzWeAPM}ts_Ujh<&GA8CB|FkuVg|d4gey>MD)M=aw2lCyaBi_k6{W_bJ$>LC!O0 zC%^{s5=jGdF#0`U-&k@MV7WY8K@ru}dKba+FVrGQS-!I(rUDr;m=%LA?-N^HM1RRA z8?nUHV}OKdM44}CDV<9$GA+!2HMFNhW)jBSw0V_Wp?PKej_#mCKUWBGQ2l>c^`~#H Tx4gZb4PMx0+q*}^c<1~9-c1gu delta 1045 zcmZuu%}*0S6rbI8x7~J1!#4z4Kt3z9hQufWQ43H4+(refgWpWs~&Thaq*(!_%Yy)7vxPrfOXi123T_ul;8$GkWDp`O(`J~*|Sh*w^9p*aLBP&m6d>leJqdBwjiJonnE6@KVb&ac*k~F zK-4$vnoBy_nL<0M3T_}LPOY5_h)Kb$_Ja)ol=)XsA_SYXH20aB;SFk2*B+GQY6|3eLu zt*Oa1X~UV5n)1w{v<=xRlp`lKFCU7nCk?%