feat: casefold mod names before sorting

This commit is contained in:
aclist 2026-05-02 20:29:52 +09:00
parent 5757f79755
commit 8bcb64810d
5 changed files with 23 additions and 17 deletions

View File

@ -102,7 +102,7 @@ def get_delimited_mods(steam_path: Path) -> list[Any]:
size = get_mod_size(mod)
# NOTE: final col is cell renderer highlight toggle
clean.append([meta.name, symlink, mod_dir, size, False])
clean.sort(key=lambda row: row[0])
clean.sort(key=lambda row: row[0].casefold())
return clean

View File

@ -1,5 +1,5 @@
from enum import Enum
from typing import Self
from typing import Any, Self
from dzgui.util import strings
@ -47,7 +47,7 @@ class FilterMode(Enum):
class EnumWithAttrs(Enum):
def __new__(cls, *args, **kwargs) -> Self:
def __new__(cls, *args: Any, **kwargs: Any) -> Self:
value = len(cls.__members__) + 1
obj = object.__new__(cls)
obj._value_ = value

View File

@ -14,7 +14,7 @@ from dzgui.api.mods import (
from dzgui.const.constants import APP_NAME, APPID_DAYZ, APPID_DAYZ_EXP
from dzgui.const.enum import Preferences
from dzgui.managers.threading import call_on_thread, StoredFunc, ThreadingManager
from dzgui.model.model_factory import ModelFactory
from dzgui.model.model_factory import FastInsertListStore, ModelFactory
from dzgui.util.format import format_mods
import dzgui.api.pefile as PeFile
@ -44,11 +44,13 @@ class ModManager:
self.path = controller.query_config(Preferences.DEFAULT)
self.treeview = self.controller.get_modtreeview()
self.store: FastInsertListStore
self.thread_man = ThreadingManager(controller)
self._get_mods()
@call_on_thread("getting mods")
def _get_mods(self) -> list:
def _get_mods(self) -> None:
mods = get_delimited_mods(self.path)
if len(mods) < 1:
msg = self.format_mod_statusbar()
@ -58,13 +60,13 @@ class ModManager:
func = StoredFunc(self._on_mods_loaded, mods)
self.thread_man.set_cleanup_func(func)
def _on_mods_loaded(self, mods: list[int]) -> None:
model = ModelFactory().make_mod_store()
model.extend(mods)
self.treeview.set_model(model)
def _on_mods_loaded(self, mods: list[list[str, str, str, float, bool]]) -> None:
self.store = ModelFactory().make_mod_store()
self.store.extend(mods)
self.treeview.set_model(self.store)
msg = self.format_mod_statusbar()
mods = len(model)
self.emitter.emit("mods_updated", msg, mods)
total_mods = len(self.store)
self.emitter.emit("mods_updated", msg, total_mods)
@call_on_thread("deleting mods")
def delete_mods(self) -> None:
@ -87,7 +89,7 @@ class ModManager:
mod = model.get(tree_iter, 2)[0]
return mod, tree_iter
def delete_single_mod(self, tree_path: Gtk.TreePath) -> None:
def delete_single_mod(self, tree_path: Gtk.TreePath) -> Gtk.TreeIter:
mod, _iter = self.get_mod_from_tree_path(tree_path)
steam_path = Path(self.path)
@ -111,7 +113,10 @@ class ModManager:
def _on_mods_deleted(self, iters: list[Gtk.TreeIter]) -> None:
for _iter in iters:
self.treeview.get_model().remove(_iter)
self.store.remove(_iter)
#model = self.treeview.get_model()
#if model:
# model.remove(_iter) # FIXME: do not remove from model interface directly
remove_stale_signatures(self.prefs.paths.config, self.prefs.paths.version)
mods = len(self.treeview.get_model())
msg = self.format_mod_statusbar()

View File

@ -1,16 +1,17 @@
import json
from pathlib import Path
from typing import Any
def read_json(path: Path) -> dict:
def read_json(path: Path) -> Any:
try:
with open(path, "r") as infile:
try:
data = json.load(infile)
return data
except json.decoder.JSONDecodeError as e:
raise e
except OSError as e:
raise e
return data
def write_json(data: dict, path: Path) -> None:

View File

@ -2,7 +2,7 @@ import logging
import threading
from queue import Queue
from typing import Any, Optional, Self
from typing import Any, Optional, Self, Union
from warnings import deprecated
from dzgui.api.servers import ping, Record
@ -321,7 +321,7 @@ class ServerTreeView(ContextMixin, TreeView):
def set_loaded(self, status: bool) -> None:
self.loaded = status
def get_model_and_control_model(self) -> tuple["FastInsertListStore", list[Any]]:
def get_model_and_control_model(self) -> tuple[Union["FastInsertListStore", None], list[Any]]:
model = self.get_model()
control = self.proxy_man.get_control()
return model, control