Skip to content

Commit 96d0d7f

Browse files
authored
Merge pull request #740 from OpenTrafficCam/bug/8343-await-all-methods-decorated-with-actions
bug/8343-await-all-methods-decorated-with-actions
2 parents 151a185 + 4b75ce9 commit 96d0d7f

9 files changed

Lines changed: 37 additions & 9 deletions

File tree

‎OTAnalytics/adapter_ui/dummy_viewmodel.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,7 +1037,7 @@ def _set_section_data(self, id: SectionId, data: dict) -> None:
10371037
self.treeview_sections.update_selected_items([id.serialize()])
10381038

10391039
@action
1040-
def remove_sections(self) -> None:
1040+
async def remove_sections(self) -> None:
10411041
if not (selected_section_ids := self.get_selected_section_ids()):
10421042
position = self.treeview_sections.get_position()
10431043
self._ui_factory.info_box(
@@ -1318,7 +1318,7 @@ async def _edit_flow(self, flow: Flow) -> None:
13181318
self.__update_flow_data(flow_data=flow_data)
13191319

13201320
@action
1321-
def remove_flows(self) -> None:
1321+
async def remove_flows(self) -> None:
13221322
if flow_ids := self._application.flow_state.selected_flows.get():
13231323
for flow_id in flow_ids:
13241324
self._application.remove_flow(flow_id)

‎OTAnalytics/adapter_ui/view_model.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ async def edit_selected_section_metadata(self) -> None:
217217
raise NotImplementedError
218218

219219
@abstractmethod
220-
def remove_sections(self) -> None:
220+
async def remove_sections(self) -> None:
221221
raise NotImplementedError
222222

223223
@abstractmethod
@@ -245,7 +245,7 @@ async def edit_selected_flow(self) -> None:
245245
raise NotImplementedError
246246

247247
@abstractmethod
248-
def remove_flows(self) -> None:
248+
async def remove_flows(self) -> None:
249249
raise NotImplementedError
250250

251251
@abstractmethod

‎OTAnalytics/plugin_ui/customtkinter_gui/frame_files.py‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import asyncio
12
import tkinter
23
from pathlib import Path
34
from typing import Any
@@ -34,7 +35,7 @@ def _get_widgets(self) -> None:
3435
)
3536
self.treeview.configure(yscrollcommand=self._treeview_scrollbar.set)
3637
self.button_add_files = CTkButton(
37-
master=self, text="Load", command=self._viewmodel.load_tracks
38+
master=self, text="Load", command=self._do_load_tracks
3839
)
3940

4041
def _place_widgets(self) -> None:
@@ -47,6 +48,10 @@ def _place_widgets(self) -> None:
4748
)
4849
self.button_add_files.grid(row=1, column=0, padx=PADX, pady=PADY, sticky=STICKY)
4950

51+
def _do_load_tracks(self) -> None:
52+
# Run the async load_tracks method in a blocking way for CTkButton
53+
asyncio.run(self._viewmodel.load_tracks())
54+
5055

5156
COLUMN_FILE = "File"
5257
COLUMN_TRACKS = "Tracks"

‎OTAnalytics/plugin_ui/customtkinter_gui/frame_flows.py‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def _get_widgets(self) -> None:
5555
command=self._edit_selected_flow,
5656
)
5757
self.button_remove = CTkButton(
58-
master=self, text="Remove", command=self._viewmodel.remove_flows
58+
master=self, text="Remove", command=self._remove_flows
5959
)
6060

6161
def _place_widgets(self) -> None:
@@ -79,6 +79,9 @@ def _add_flow(self) -> None:
7979
def _edit_selected_flow(self) -> None:
8080
asyncio.run(self._viewmodel.edit_selected_flow())
8181

82+
def _remove_flows(self) -> None:
83+
asyncio.run(self._viewmodel.remove_flows())
84+
8285
def _set_button_state_categories(self) -> None:
8386
self._general_buttons: list[CTkButton] = []
8487
self._add_buttons = [

‎OTAnalytics/plugin_ui/customtkinter_gui/frame_sections.py‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def _get_widgets(self) -> None:
6464
self.button_remove = CTkButton(
6565
master=self,
6666
text="Remove",
67-
command=self._viewmodel.remove_sections,
67+
command=self._remove_sections,
6868
)
6969

7070
def _place_widgets(self) -> None:
@@ -88,6 +88,9 @@ def _place_widgets(self) -> None:
8888
def _edit_selected_section_metadata(self) -> None:
8989
asyncio.run(self._viewmodel.edit_selected_section_metadata())
9090

91+
def _remove_sections(self) -> None:
92+
asyncio.run(self._viewmodel.remove_sections())
93+
9194
def _set_button_state_categories(self) -> None:
9295
self._general_buttons: list[CTkButton] = []
9396
self._add_buttons = [

‎OTAnalytics/plugin_ui/nicegui_gui/pages/sections_and_flow_form/flow_form.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
COLUMN_ID,
1616
CustomTable,
1717
)
18+
from OTAnalytics.plugin_ui.utils.asyncio_helper import run_async
1819

1920
BUTTON_WIDTH = "max-width: 45%; width: 100%"
2021
BASIC_WIDTH = "width: 100%"
@@ -108,7 +109,7 @@ def generate_flow(self) -> None:
108109
self._viewmodel.generate_flows()
109110

110111
def remove_flow(self) -> None:
111-
self._viewmodel.remove_flows()
112+
run_async(self._viewmodel.remove_flows())
112113

113114
async def show_flow_properties(self) -> None:
114115
await self._viewmodel.edit_selected_flow()

‎OTAnalytics/plugin_ui/nicegui_gui/pages/sections_and_flow_form/sections_form.py‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
COLUMN_ID,
1717
CustomTable,
1818
)
19+
from OTAnalytics.plugin_ui.utils.asyncio_helper import run_async
1920

2021
BUTTON_WIDTH = "max-width: 45%; width: 100%"
2122
BASIC_WIDTH = "width: 100%"
@@ -111,7 +112,7 @@ def build(self) -> Self:
111112
with ui.row().style(BASIC_WIDTH):
112113
self._button_remove = ui.button(
113114
self._resource_manager.get(SectionKeys.BUTTON_REMOVE),
114-
on_click=self._viewmodel.remove_sections,
115+
on_click=self.remove_sections,
115116
).style(BASIC_WIDTH)
116117
self._button_remove.mark(MARKER_BUTTON_REMOVE)
117118
self.update_items()
@@ -138,6 +139,9 @@ def _notify_viewmodel_about_selected_item_ids(self, ids: list[str]) -> None:
138139
def update_selected_items(self, item_ids: list[str]) -> None:
139140
self._section_table.select(item_ids)
140141

142+
def remove_sections(self) -> None:
143+
run_async(self._viewmodel.remove_sections())
144+
141145
def update_items(self) -> None:
142146
self._section_table.update(map_to_ui(self._viewmodel.get_all_sections()))
143147
selected_sections = [

‎OTAnalytics/plugin_ui/utils/__init__.py‎

Whitespace-only changes.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import asyncio
2+
from typing import Coroutine
3+
4+
5+
def run_async(coro: Coroutine) -> None:
6+
# Schedule the asynchronous removal so tests see the call immediately
7+
# while NiceGUI executes the coroutine in the event loop.
8+
try:
9+
asyncio.create_task(coro)
10+
except RuntimeError:
11+
# No running loop available; run the coroutine to completion
12+
asyncio.run(coro)

0 commit comments

Comments
 (0)