Files
dzgui/dzgui/views/components/statusbar.py
T
aclist d305f47bb9
Mirror to Codeberg / mirror-to-codeberg (push) Has been cancelled
Merge branch 'dzgui7' into feat/launch-offline
2026-06-14 22:03:02 +09:00

157 lines
5.1 KiB
Python

from typing import Self, Union, TYPE_CHECKING
from dzgui.const.enum import NotebookPage, ServerTab
from dzgui.util.strings import esc_to_return, question_to_return
from dzgui.views.components.buttons import LoggerAlertsButton
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk # noqa E402
if TYPE_CHECKING:
from dzgui.const.enum import ServerTab
from dzgui.controllers.mc import Controller
from dzgui.controllers.emitter import Emitter
from dzgui.views.trees.tree_base import TreeView
from dzgui.views.base import Notebook
class Statusbar(Gtk.Grid):
def __init__(self, controller: "Controller") -> None:
super().__init__(orientation=Gtk.Orientation.HORIZONTAL)
self.controller = controller
self.controller.register_widget("statusbar", self)
self.emitter = controller.get_emitter()
self.prior_enum: NotebookPage
self.prior_status: str
self.playercount = ""
self.statusbar = Gtk.Statusbar()
self.spinner = Gtk.Spinner()
self.attach(self.statusbar, 0, 0, 3, 1)
self.attach_next_to(self.spinner, self.statusbar, Gtk.PositionType.RIGHT, 3, 1)
self.players = ""
controller.get_menu().connect("generic_treesel_changed", self._help_row_changed)
controller.get_notebook().connect_after(
"switch-page", self._on_notebook_page_changed
)
self.emitter.connect("distcalc_started", self._on_distcalc_started)
self.emitter.connect("distcalc_ended", self._on_distcalc_ended)
self.emitter.connect("servers_loaded", self._on_servers_loaded)
self.emitter.connect("mods_updated", self._on_mods_updated)
def _on_alerts_clicked(self, button: LoggerAlertsButton) -> None:
self.controller.populate_log()
def _on_mods_updated(self, emitter: "Emitter", msg: str, mods: int) -> None:
self.set_by_context(NotebookPage.MODS, msg)
def _on_notebook_page_changed(
self, notebook: "Notebook", child: Gtk.Widget, index: int
) -> None:
if self.controller.loaded is False:
return
enum = notebook.get_page_by_enum()
show_statusbar = enum.dict["statusbar"]
if show_statusbar is False:
self.set_by_context(enum, "")
return
if enum in (
NotebookPage.THANKS,
NotebookPage.CHANGELOG,
NotebookPage.LOG,
NotebookPage.CONNECTION,
NotebookPage.OFFLINE,
):
self.prior_enum = enum
self.set_by_context(enum, esc_to_return)
return
match enum:
case NotebookPage.HELP:
bar = self.controller.get_help_row()
case NotebookPage.KEYS:
bar = question_to_return
case _:
bar = self.prior_status
self.prior_enum = enum
self.set_by_context(enum, bar)
def _on_server_row_changed(self, statusbar: Self) -> None:
self.spinner.start()
def _on_distcalc_started(self, emitter: "Emitter") -> None:
self.spinner.start()
def _on_distcalc_ended(
self,
statusbar: Self,
dist: Union[str, None],
context: Union["ServerTab", NotebookPage],
) -> None:
self.spinner.stop()
if type(context) is NotebookPage:
self.prior_enum = context
self.prior_status = ""
# FIXME: CalcDist is being called when table is not loaded
if dist is None:
self.set_by_context(context, "")
return
else:
pretty = self.append_distance(dist)
self.set_by_context(context, pretty)
def append_distance(self, dist: str) -> str:
return f"{self.playercount} Distance: {dist}"
def _on_servers_loaded(self, statusbar: Self, context: "ServerTab") -> None:
count = self.controller.get_player_count()
self.playercount = count
self.set_by_context(context, count)
self.emitter.emit("statusbar_loaded")
def pop(self, context: Union["ServerTab", "NotebookPage"]) -> None:
cid = self.statusbar.get_context_id(str(context))
self.statusbar.pop(cid)
def set_by_context(
self, context: Union[NotebookPage, "ServerTab"], string: str
) -> None:
if context != NotebookPage.KEYS:
self.prior_status = string
meta = self.statusbar.get_context_id(str(context))
self.statusbar.push(meta, string)
self.set_cache(string)
def get_cache(self) -> str:
return self.cache
def set_cache(self, string: str) -> None:
self.cache = string
def set_text(self, string: str, context: str) -> int:
meta = self.statusbar.get_context_id(context)
self.statusbar.push(meta, string)
self.set_cache(string)
return meta
def _help_row_changed(self, tree: "TreeView", sel: Gtk.TreeSelection) -> None:
row = tree.get_value_at_index(1)
if self.controller.loaded is False:
return
tooltip = row.dict["tooltip"]
self.set_by_context(NotebookPage.HELP, tooltip)