mirror of
https://github.com/aclist/dztui.git
synced 2026-08-30 03:37:00 +02:00
Compare commits
7 Commits
6ec77f6542
...
f849cbc183
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f849cbc183 | ||
|
|
77505db621 | ||
|
|
ba7a2b7ab4 | ||
|
|
6d7ed80996 | ||
|
|
72024c5d43 | ||
|
|
0426d50d3e | ||
|
|
26ee560cb4 |
@ -84,7 +84,6 @@ class Controller(GObject.GObject):
|
||||
self.emitter = Emitter()
|
||||
self.emitter.connect("map_selection_changed", self._on_map_selection_changed)
|
||||
self.emitter.connect("check_toggled", self._on_check_toggled)
|
||||
self.emitter.connect("servers_loaded_init", self._on_servers_loaded_init)
|
||||
|
||||
# NOTE: suppress requests until entire UI is loaded
|
||||
self.loaded = False
|
||||
@ -321,6 +320,7 @@ class Controller(GObject.GObject):
|
||||
self.mediator.filters.button_grid.block_toggles(True)
|
||||
self.populate_filter_prefs()
|
||||
self.mediator.filters.button_grid.block_toggles(False)
|
||||
self.emitter.emit("lan_page_initialized")
|
||||
ServerModelManager(self, tv).load()
|
||||
|
||||
def populate_filter_prefs(self) -> None:
|
||||
@ -347,16 +347,7 @@ class Controller(GObject.GObject):
|
||||
filter_man = self.get_filter_man()
|
||||
return filter_man.get_filters()
|
||||
|
||||
# TODO: rename
|
||||
def _on_servers_loaded_init(self, emitter: "Emitter") -> None:
|
||||
"""Triggered after servers load but prior to maps loading"""
|
||||
# FIXME: wipe maps store when changing tabs if model is none
|
||||
# e.g. select recent, toggle map, then select lan -> not wiped
|
||||
tv = self.get_active_treeview()
|
||||
if tv.loaded is False:
|
||||
return
|
||||
store = self.get_map_store()
|
||||
self.emitter.emit("load_maps", store)
|
||||
|
||||
def has_server_model(self) -> bool:
|
||||
treeview = self.get_active_treeview()
|
||||
|
||||
@ -17,16 +17,27 @@ def has_new_config(config: Path) -> bool:
|
||||
return config.exists()
|
||||
|
||||
|
||||
def migrate_cols_file(res: Path) -> None:
|
||||
# NOTE: dzg.columns.json is API 7 spec
|
||||
old_res = Path.home() / LEGACY_COLS_PATH
|
||||
if old_res.is_file():
|
||||
j = read_json(old_res)
|
||||
def convert_cols_file(res: Path) -> dict[str, int] | None:
|
||||
j = read_json(res)
|
||||
cols = j["cols"]
|
||||
# NOTE: implies prior conversion
|
||||
if "View" in cols:
|
||||
return
|
||||
return None
|
||||
# NOTE: user may not have changed these widths in API 6
|
||||
try:
|
||||
cols["View"] = cols.pop("Perspective")
|
||||
cols["Max"] = cols.pop("Maximum")
|
||||
except Exception:
|
||||
pass
|
||||
return j
|
||||
|
||||
|
||||
def migrate_cols_file(res: Path) -> None:
|
||||
# NOTE: filename "dzg.columns.json" is API 7 spec
|
||||
old_res = Path.home() / LEGACY_COLS_PATH
|
||||
if old_res.is_file():
|
||||
j = convert_cols_file(old_res)
|
||||
if j is not None:
|
||||
write_json(j, res)
|
||||
|
||||
|
||||
|
||||
@ -243,9 +243,11 @@ class ServerModelManager:
|
||||
filter_man = self.tv.get_filter_man()
|
||||
maps = self._get_new_maps()
|
||||
filter_man.set_unique_maps(maps)
|
||||
store = filter_man.get_map_store()
|
||||
|
||||
self.first_iteration = False
|
||||
self.emitter.emit("servers_loaded_init")
|
||||
self.emitter.emit("load_maps", store)
|
||||
# self.emitter.emit("servers_loaded_init")
|
||||
|
||||
def add_to_history(self, record: dict[str, Any]) -> None:
|
||||
proxy_man = self._get_proxy_man()
|
||||
@ -378,24 +380,24 @@ class ServerModelManager:
|
||||
# NOTE: maps are set outside of thread because it triggers map changed signals
|
||||
maps = self._get_new_maps()
|
||||
filter_man.set_unique_maps(maps)
|
||||
store = filter_man.get_map_store()
|
||||
self.emitter.emit("load_maps", store)
|
||||
|
||||
self.first_iteration = False
|
||||
self.emitter.emit("servers_loaded_init")
|
||||
self.emitter.emit("saved_servers_changed")
|
||||
|
||||
def _update_maps(self) -> None:
|
||||
filter_man = self.tv.get_filter_man()
|
||||
filter_man.set_unique_maps(self._get_new_maps())
|
||||
self.emitter.emit("servers_loaded_init")
|
||||
store = filter_man.get_map_store()
|
||||
self.emitter.emit("load_maps", store)
|
||||
self.first_iteration = False
|
||||
|
||||
def _cleanup_on_success(self) -> None:
|
||||
proxy = self._get_proxy_man().get_proxy_model()
|
||||
self.tv.set_model(proxy)
|
||||
|
||||
# TODO: servers_loaded vs servers_reloaded
|
||||
self.emitter.emit("servers_loaded", self.enum)
|
||||
|
||||
if self.first_iteration:
|
||||
self._update_maps()
|
||||
|
||||
|
||||
@ -94,9 +94,11 @@ class RefreshButton(IconTextButton):
|
||||
icon=REFRESH_ICON,
|
||||
label=atomic_buttons.refresh,
|
||||
)
|
||||
|
||||
self.controller = controller
|
||||
emitter = self.controller.get_emitter()
|
||||
self.loading = False
|
||||
self.is_clicked = False
|
||||
|
||||
self.time = 30
|
||||
|
||||
@ -110,15 +112,19 @@ class RefreshButton(IconTextButton):
|
||||
|
||||
def _on_refresh_clicked(self, button: Self) -> None:
|
||||
"""Spawned in a thread"""
|
||||
self.loading = True
|
||||
self.is_clicked = True
|
||||
self.controller.refresh_tree()
|
||||
# TODO: get server tab enum
|
||||
# if LAN tab, reload existing entries in place
|
||||
|
||||
def start_decrement(self, emitter: "Emitter", tab: "ServerTab") -> None:
|
||||
if self.is_clicked is False:
|
||||
return
|
||||
if self.loading:
|
||||
return
|
||||
self.set_sensitive(False)
|
||||
self.loading = False
|
||||
self.loading = True
|
||||
self.is_clicked = False
|
||||
self.show_time(True)
|
||||
GLib.timeout_add_seconds(1, self.decrement)
|
||||
|
||||
@ -128,6 +134,7 @@ class RefreshButton(IconTextButton):
|
||||
self.time = 30
|
||||
self.show_time(False)
|
||||
self.set_sensitive(True)
|
||||
self.loading = False
|
||||
return False
|
||||
self.show_time(True)
|
||||
return True
|
||||
|
||||
@ -107,16 +107,16 @@ class RightPanel(Gtk.Box):
|
||||
if page.loaded is True:
|
||||
return
|
||||
self.filters_vbox.set_sensitive(False)
|
||||
# TODO: unless it is lan page
|
||||
#self.refresh_button.set_sensitive(False)
|
||||
|
||||
def _on_lan_page_init(self, emitter: "Emitter") -> None:
|
||||
self.filters_vbox.set_sensitive(False)
|
||||
self.refresh_button.set_sensitive(False)
|
||||
|
||||
def _on_servers_loaded(self, emitter: "Emitter", context: "ServerTab") -> None:
|
||||
# TODO: similar logic on notebook page change
|
||||
state = self.controller.has_server_model()
|
||||
for el in self.filters_vbox, self.refresh_button:
|
||||
el.set_sensitive(state)
|
||||
self.filters_vbox.set_sensitive(state)
|
||||
|
||||
def _on_version_clicked(self, widget: Gtk.EventBox, event: Gdk.EventButton) -> None:
|
||||
def revert() -> Literal[False]:
|
||||
|
||||
@ -72,6 +72,7 @@ class ServerTreeView(ContextMixin, TreeView): # type: ignore
|
||||
logger.critical(e)
|
||||
valid_json = False
|
||||
|
||||
# NOTE: reasonable defaults for long columns
|
||||
width_map = {
|
||||
"Name": 800,
|
||||
"Map": 300,
|
||||
@ -96,6 +97,7 @@ class ServerTreeView(ContextMixin, TreeView): # type: ignore
|
||||
column.set_fixed_width(saved_size)
|
||||
column.set_expand(True)
|
||||
else:
|
||||
if column_title in width_map:
|
||||
w = width_map[column_title]
|
||||
column.set_fixed_width(w)
|
||||
if column_title == "Ping":
|
||||
|
||||
@ -45,3 +45,9 @@ if proc.returncode == 0:
|
||||
with tarfile.open(tarpath, "w:gz") as tar:
|
||||
tar.add(release_exe, arcname=appname)
|
||||
print(f"Wrote tarfile to '{tarpath}'")
|
||||
|
||||
proc = subprocess.run([release_exe, "-v"], capture_output=True, text=True)
|
||||
assert proc.stdout.rstrip() == version
|
||||
|
||||
release_exe.unlink()
|
||||
Path(wheel).unlink()
|
||||
|
||||
14
tests/fixtures/columns_1
vendored
Normal file
14
tests/fixtures/columns_1
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
{
|
||||
"cols": {
|
||||
"Name": 1,
|
||||
"Map": 1,
|
||||
"Gametime": 1,
|
||||
"Players": 1,
|
||||
"Queue": 1,
|
||||
"IP": 1,
|
||||
"Qport": 1,
|
||||
"Ping": 1,
|
||||
"Maximum": 1,
|
||||
"Perspective": 1
|
||||
}
|
||||
}
|
||||
12
tests/fixtures/columns_2
vendored
Normal file
12
tests/fixtures/columns_2
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
{
|
||||
"cols": {
|
||||
"Name": 398,
|
||||
"Map": 181,
|
||||
"Gametime": 151,
|
||||
"Players": 119,
|
||||
"Queue": 96,
|
||||
"IP": 247,
|
||||
"Qport": 94,
|
||||
"Ping": 253
|
||||
}
|
||||
}
|
||||
13
tests/fixtures/columns_3
vendored
Normal file
13
tests/fixtures/columns_3
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
{
|
||||
"cols": {
|
||||
"Name": 1,
|
||||
"Map": 1,
|
||||
"Gametime": 1,
|
||||
"Players": 1,
|
||||
"Queue": 1,
|
||||
"IP": 1,
|
||||
"Qport": 1,
|
||||
"Ping": 1,
|
||||
"View": 1
|
||||
}
|
||||
}
|
||||
33
tests/test_columns.py
Normal file
33
tests/test_columns.py
Normal file
@ -0,0 +1,33 @@
|
||||
import pytest
|
||||
|
||||
from dzgui.init.migrate import convert_cols_file
|
||||
from tests.fixtures import fixture_path
|
||||
|
||||
@pytest.fixture
|
||||
def columns_with_perspective():
|
||||
return fixture_path("columns_1")
|
||||
|
||||
@pytest.fixture
|
||||
def columns_without_perspective():
|
||||
return fixture_path("columns_2")
|
||||
|
||||
@pytest.fixture
|
||||
def columns_with_view():
|
||||
return fixture_path("columns_3")
|
||||
|
||||
@pytest.mark.config
|
||||
def test_columns_with_perspective(columns_with_perspective):
|
||||
j = convert_cols_file(columns_with_perspective)
|
||||
assert "View" in j["cols"]
|
||||
assert "Max" in j["cols"]
|
||||
|
||||
@pytest.mark.config
|
||||
def test_columns_without_perspective(columns_without_perspective):
|
||||
j = convert_cols_file(columns_without_perspective)
|
||||
assert "View" not in j["cols"]
|
||||
assert "Max" not in j["cols"]
|
||||
|
||||
@pytest.mark.config
|
||||
def test_columns_with_view(columns_with_view):
|
||||
j = convert_cols_file(columns_with_view)
|
||||
assert j is None
|
||||
Loading…
Reference in New Issue
Block a user