mirror of
https://github.com/aclist/dztui.git
synced 2026-10-30 22:52:42 +01:00
feat: filtered model WIP
This commit is contained in:
1 parent
5d6a7c9775
commit
da8722ec2a
4 files changed
+41
-46
No files matched your search
+12
-9
@@ -22,7 +22,7 @@ from dzgui.api.mods import (
|
|||||||
_hash,
|
_hash,
|
||||||
remove_stale_signatures,
|
remove_stale_signatures,
|
||||||
)
|
)
|
||||||
from dzgui.const.enum import Preferences, NotebookPage, ButtonType, ContextMenu
|
from dzgui.const.enum import FilterMode, Preferences, NotebookPage, ButtonType, ContextMenu
|
||||||
|
|
||||||
from dzgui.const.constants import (
|
from dzgui.const.constants import (
|
||||||
APPID_DAYZ,
|
APPID_DAYZ,
|
||||||
@@ -615,9 +615,12 @@ class Controller(GObject.GObject):
|
|||||||
insert = None
|
insert = None
|
||||||
else:
|
else:
|
||||||
manager = treeview.get_filter_man()
|
manager = treeview.get_filter_man()
|
||||||
for row in data:
|
manager.set_control(data)
|
||||||
manager.append_row(row)
|
manager.filter(FilterMode.INITIAL)
|
||||||
|
#for row in data:
|
||||||
|
# manager.append_row(row)
|
||||||
insert = manager.get_model()
|
insert = manager.get_model()
|
||||||
|
print(insert)
|
||||||
treeview.set_model(insert)
|
treeview.set_model(insert)
|
||||||
treeview.set_loaded(True)
|
treeview.set_loaded(True)
|
||||||
GLib.idle_add(cleanup)
|
GLib.idle_add(cleanup)
|
||||||
@@ -740,12 +743,12 @@ class Controller(GObject.GObject):
|
|||||||
if func is None:
|
if func is None:
|
||||||
self.mediator.statusbar.emit("server_page_changed", treeview.get_enum())
|
self.mediator.statusbar.emit("server_page_changed", treeview.get_enum())
|
||||||
return
|
return
|
||||||
|
# TODO: on legacy version, model clearing happens in thread
|
||||||
treeview.set_model(None)
|
treeview.set_model(None)
|
||||||
manager = treeview.get_filter_man()
|
manager = treeview.get_filter_man()
|
||||||
manager.clear_model()
|
# manager.clear_model()
|
||||||
self.set_callback(None, None)
|
self.set_callback(None, None)
|
||||||
self.thread_data_func(func)
|
self.thread_data_func(func)
|
||||||
#self.call_on_thread(func)
|
|
||||||
|
|
||||||
def focus_button_box(self) -> None:
|
def focus_button_box(self) -> None:
|
||||||
self.mediator.right_panel.focus_button_box()
|
self.mediator.right_panel.focus_button_box()
|
||||||
@@ -787,13 +790,13 @@ class Controller(GObject.GObject):
|
|||||||
|
|
||||||
# TODO: use model manager, map and keyword caches
|
# TODO: use model manager, map and keyword caches
|
||||||
def get_filters(self) -> list:
|
def get_filters(self) -> list:
|
||||||
self.mediator.filters.get_filters()
|
return self.mediator.filters.get_filters()
|
||||||
|
|
||||||
def get_keyword(self) -> str:
|
def get_keyword(self) -> str:
|
||||||
self.mediator.filters.get_keyword_filter()
|
return self.mediator.filters.get_keyword_filter()
|
||||||
|
|
||||||
def get_map(self) -> str:
|
def get_map(self) -> str:
|
||||||
self.mediator.filters.get_selected_map()
|
return self.mediator.filters.get_selected_map()
|
||||||
|
|
||||||
def get_prior_map(self) -> str:
|
def get_prior_map(self) -> str:
|
||||||
self.mediator.filters.get_prior_map()
|
return self.mediator.filters.get_prior_map()
|
||||||
@@ -42,29 +42,25 @@ class FilteredModelManager:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, controller: "Controller") -> None:
|
def __init__(self, controller: "Controller") -> None:
|
||||||
self.filter_cache: tuple
|
self.controller = controller
|
||||||
|
|
||||||
|
self.filter_cache = {}
|
||||||
self.ping_cache: dict[str, int] = {}
|
self.ping_cache: dict[str, int] = {}
|
||||||
|
|
||||||
self.model = self.new_model_from_class(ServerColumns)
|
self.ephemeral_model = self.new_model_from_class(ServerColumns)
|
||||||
self.real_model = self.new_model_from_class(ServerColumns)
|
|
||||||
|
|
||||||
self.control_model = None
|
self.control_model = None
|
||||||
self.filtered = None
|
self.filtered = None
|
||||||
self.success = True
|
self.success = True
|
||||||
|
|
||||||
def append_row(self, row: list) -> None:
|
def append_row(self, row: list) -> None:
|
||||||
# self.real_model.append(row)
|
self.ephemeral_model.append(row)
|
||||||
# NOTE: append null rows to thin client
|
|
||||||
self.model.append(row)
|
|
||||||
|
|
||||||
def clear_model(self) -> None:
|
def clear_model(self) -> None:
|
||||||
self.model.clear()
|
self.ephemeral_model.clear()
|
||||||
|
|
||||||
def get_real_model(self) -> ListStore:
|
|
||||||
return self.real_model
|
|
||||||
|
|
||||||
def get_model(self) -> ListStore:
|
def get_model(self) -> ListStore:
|
||||||
return self.model
|
return self.ephemeral_model
|
||||||
|
|
||||||
def new_model_from_class(self, cls: type) -> ListStore:
|
def new_model_from_class(self, cls: type) -> ListStore:
|
||||||
store = ListStore(*[ftype for field, ftype in cls.__annotations__.items()])
|
store = ListStore(*[ftype for field, ftype in cls.__annotations__.items()])
|
||||||
@@ -79,7 +75,7 @@ class FilteredModelManager:
|
|||||||
|
|
||||||
if filters in self.filter_cache:
|
if filters in self.filter_cache:
|
||||||
cache = self.filter_cache[filters]
|
cache = self.filter_cache[filters]
|
||||||
self.set_store(cache[0])
|
self.set_model(cache[0])
|
||||||
self.set_filtered(cache[1])
|
self.set_filtered(cache[1])
|
||||||
GLib.idle_add(
|
GLib.idle_add(
|
||||||
self.controller.mediator.get_active_treeview()._filter_cleanup
|
self.controller.mediator.get_active_treeview()._filter_cleanup
|
||||||
@@ -123,8 +119,7 @@ class FilteredModelManager:
|
|||||||
clone = None
|
clone = None
|
||||||
|
|
||||||
self.set_cache(filters, clone, rows)
|
self.set_cache(filters, clone, rows)
|
||||||
self.set_store(clone)
|
self.set_model(clone)
|
||||||
GLib.idle_add(self.controller.mediator.get_active_treeview()._filter_cleanup)
|
|
||||||
|
|
||||||
def sort_rows(self, rows: list) -> list:
|
def sort_rows(self, rows: list) -> list:
|
||||||
rows.sort(key=lambda x: re.sub(r"[^A-Za-z0-9]+", "", x[0].lower()))
|
rows.sort(key=lambda x: re.sub(r"[^A-Za-z0-9]+", "", x[0].lower()))
|
||||||
@@ -261,13 +256,16 @@ class FilteredModelManager:
|
|||||||
def get_filtered(self) -> list:
|
def get_filtered(self) -> list:
|
||||||
return self.filtered
|
return self.filtered
|
||||||
|
|
||||||
def set_store(self, model: ListStore | None) -> None:
|
def set_model(self, model: ListStore | None) -> None:
|
||||||
self.store = model
|
"""
|
||||||
|
ListStore representation of the model
|
||||||
def get_store(self) -> ListStore | None:
|
"""
|
||||||
return self.store
|
self.ephemeral_model = model
|
||||||
|
|
||||||
def set_control(self, rows: list) -> None:
|
def set_control(self, rows: list) -> None:
|
||||||
|
"""
|
||||||
|
Raw representation of the model, no transformations
|
||||||
|
"""
|
||||||
self.control_model = rows
|
self.control_model = rows
|
||||||
|
|
||||||
def set_success(self, result: bool) -> None:
|
def set_success(self, result: bool) -> None:
|
||||||
|
|||||||
@@ -1,18 +1,20 @@
|
|||||||
import logging
|
import logging
|
||||||
from typing import Literal
|
from typing import Literal
|
||||||
|
|
||||||
import gi # noqa E402
|
|
||||||
gi.require_version("Gtk", "3.0")
|
|
||||||
from gi.repository import Gtk, Gdk, Pango, GLib
|
|
||||||
|
|
||||||
from dzgui.const.enum import FilterMode
|
from dzgui.const.enum import FilterMode
|
||||||
from dzgui.const.constants import NO_EXPAND, NO_FILL, NO_PADDING
|
from dzgui.const.constants import NO_EXPAND, NO_FILL, NO_PADDING
|
||||||
from dzgui.util import strings
|
from dzgui.util import strings
|
||||||
from dzgui.util.margins import set_surrounding_margins
|
from dzgui.util.margins import set_surrounding_margins
|
||||||
from dzgui.views.components.labels import BoldLabel
|
from dzgui.views.components.labels import BoldLabel
|
||||||
|
|
||||||
|
import gi
|
||||||
|
|
||||||
|
gi.require_version("Gtk", "3.0")
|
||||||
|
from gi.repository import Gtk, Gdk, Pango, GLib # noqa E402
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class FilterPanel(Gtk.Box):
|
class FilterPanel(Gtk.Box):
|
||||||
def __init__(self, controller):
|
def __init__(self, controller):
|
||||||
super().__init__(spacing=6, vexpand=False)
|
super().__init__(spacing=6, vexpand=False)
|
||||||
@@ -41,7 +43,7 @@ class FilterPanel(Gtk.Box):
|
|||||||
self.maps_hr = []
|
self.maps_hr = []
|
||||||
|
|
||||||
self.enabled_filters = dict(self.default_filters)
|
self.enabled_filters = dict(self.default_filters)
|
||||||
self.keyword_filter: str
|
self.keyword_filter = ""
|
||||||
self.selected_map: str = strings.all_maps
|
self.selected_map: str = strings.all_maps
|
||||||
self.prior_map: str = strings.all_maps
|
self.prior_map: str = strings.all_maps
|
||||||
|
|
||||||
@@ -79,9 +81,7 @@ class FilterPanel(Gtk.Box):
|
|||||||
self.keyword_entry = Gtk.Entry()
|
self.keyword_entry = Gtk.Entry()
|
||||||
self.keyword_entry.set_placeholder_text("Filter by keyword")
|
self.keyword_entry.set_placeholder_text("Filter by keyword")
|
||||||
self.keyword_entry.connect("activate", self._on_keyword_enter)
|
self.keyword_entry.connect("activate", self._on_keyword_enter)
|
||||||
self.keyword_entry.connect(
|
self.keyword_entry.connect("key-press-event", self._on_keyword_keypress)
|
||||||
"key-press-event", self._on_keyword_keypress
|
|
||||||
)
|
|
||||||
|
|
||||||
completion = Gtk.EntryCompletion(inline_completion=True)
|
completion = Gtk.EntryCompletion(inline_completion=True)
|
||||||
completion.set_text_column(0)
|
completion.set_text_column(0)
|
||||||
@@ -142,9 +142,7 @@ class FilterPanel(Gtk.Box):
|
|||||||
state = self.default_filters[label]
|
state = self.default_filters[label]
|
||||||
check.set_active(state)
|
check.set_active(state)
|
||||||
|
|
||||||
def _on_map_entry_keypress(
|
def _on_map_entry_keypress(self, entry: Gtk.Entry, event: Gdk.EventKey) -> None:
|
||||||
self, entry: Gtk.Entry, event: Gdk.EventKey
|
|
||||||
) -> None:
|
|
||||||
match event.keyval:
|
match event.keyval:
|
||||||
case Gdk.KEY_Return:
|
case Gdk.KEY_Return:
|
||||||
text = entry.get_text()
|
text = entry.get_text()
|
||||||
@@ -189,9 +187,7 @@ class FilterPanel(Gtk.Box):
|
|||||||
view.grab_focus()
|
view.grab_focus()
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def _on_keyword_keypress(
|
def _on_keyword_keypress(self, entry: Gtk.Entry, event: Gdk.EventKey) -> bool:
|
||||||
self, entry: Gtk.Entry, event: Gdk.EventKey
|
|
||||||
) -> bool:
|
|
||||||
match event.keyval:
|
match event.keyval:
|
||||||
case Gdk.KEY_Up:
|
case Gdk.KEY_Up:
|
||||||
return True
|
return True
|
||||||
@@ -202,9 +198,7 @@ class FilterPanel(Gtk.Box):
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def _on_combo_keypress(
|
def _on_combo_keypress(self, combo: Gtk.ComboBox, event: Gdk.EventKey) -> bool:
|
||||||
self, combo: Gtk.ComboBox, event: Gdk.EventKey
|
|
||||||
) -> bool:
|
|
||||||
match event.keyval:
|
match event.keyval:
|
||||||
case Gdk.KEY_Down:
|
case Gdk.KEY_Down:
|
||||||
self.maps_combo.popup()
|
self.maps_combo.popup()
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ class ServerNotebook(Gtk.ScrolledWindow):
|
|||||||
self.lan = ServerTreeView(controller, ServerTab.LAN, ContextMenuGroup.SCAN_LAN)
|
self.lan = ServerTreeView(controller, ServerTab.LAN, ContextMenuGroup.SCAN_LAN)
|
||||||
|
|
||||||
self.lan.set_query_func(self.controller.dump_test_2)
|
self.lan.set_query_func(self.controller.dump_test_2)
|
||||||
self.browser.set_query_func(self.controller.dump_test_2)
|
self.browser.set_query_func(self.controller.dump_api)
|
||||||
|
|
||||||
tabs = [
|
tabs = [
|
||||||
(self.browser, server_labels.browser),
|
(self.browser, server_labels.browser),
|
||||||
|
|||||||
Reference in new issue
Block a user