mirror of
https://github.com/aclist/dztui.git
synced 2026-10-30 22:52:42 +01:00
feat: write settings to config file
This commit is contained in:
1 parent
a77697eec0
commit
ea2d1d7e9f
5 files changed
+128
-51
No files matched your search
@@ -1,4 +1,5 @@
|
|||||||
## Added
|
## Added
|
||||||
|
- Setup wizard
|
||||||
- Changelog text wrapping and formatting
|
- Changelog text wrapping and formatting
|
||||||
- Changelog ships with source
|
- Changelog ships with source
|
||||||
- Documentation ships with source
|
- Documentation ships with source
|
||||||
|
|||||||
+14
-2
@@ -38,11 +38,12 @@ config_new_button = "Create new DZGUI 7 config from scratch"
|
|||||||
config_new_box = "A new config file will be created. Proceed to the next step."
|
config_new_box = "A new config file will be created. Proceed to the next step."
|
||||||
|
|
||||||
### APIValidationPage
|
### APIValidationPage
|
||||||
|
entry_placeholder = "Enter API key here"
|
||||||
api_success = "API key set successfully. Please proceed to the next step."
|
api_success = "API key set successfully. Please proceed to the next step."
|
||||||
heading_steam_api = "Steam Web API key"
|
heading_steam_api = "Steam Web API key"
|
||||||
button_web_api = "Web API setup link"
|
button_web_api = "Web API setup link"
|
||||||
blurb_steam_api = """
|
blurb_steam_api = """
|
||||||
You will need to set up a Steam Web API key in order to browse the global server list.
|
You must set up a Steam Web API key in order to browse the global server list.
|
||||||
\nIf you don't have one already, it can be set up via the page below.
|
\nIf you don't have one already, it can be set up via the page below.
|
||||||
\nPlease refer to the DZGUI documentation for more instructions.
|
\nPlease refer to the DZGUI documentation for more instructions.
|
||||||
"""
|
"""
|
||||||
@@ -52,7 +53,18 @@ by numeric ID on the web. For example, in the URL https://www.battlemetrics.net/
|
|||||||
the ID would be <b>24819107</b>.
|
the ID would be <b>24819107</b>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
entry_placeholder = "Enter API key here"
|
### PreferencesPage
|
||||||
|
heading_prefs = "User preferences"
|
||||||
|
blurb_prefs = """Here you can set up some basic settings. Additional preferences can be\n
|
||||||
|
configured via the Options menu once DZGUI launches.
|
||||||
|
"""
|
||||||
|
label_player = "Player name"
|
||||||
|
placeholder_player = "Set an in-game player name"
|
||||||
|
radio_km = "km (kilometers)"
|
||||||
|
radio_mi = "mi (miles)"
|
||||||
|
label_dist = "Distance display"
|
||||||
|
label_client = "Steam client"
|
||||||
|
|
||||||
|
|
||||||
### Completion page
|
### Completion page
|
||||||
heading_completion = "Setup complete"
|
heading_completion = "Setup complete"
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
from dzgui.strings import options
|
||||||
|
from dzgui.const.constants import FLATPAK_RUN_CMD, FLATPAK_SANDBOX, STEAM_CMD
|
||||||
|
|
||||||
|
import gi
|
||||||
|
|
||||||
|
gi.require_version("Gtk", "3.0")
|
||||||
|
from gi.repository import Gtk # noqa
|
||||||
|
|
||||||
|
|
||||||
|
class ClientCombo(Gtk.ComboBox):
|
||||||
|
def __init__(self) -> None:
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
self.client_store = Gtk.ListStore(str, str)
|
||||||
|
clients = (
|
||||||
|
(
|
||||||
|
options.steam_combo,
|
||||||
|
STEAM_CMD,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
options.flatpak_combo,
|
||||||
|
FLATPAK_RUN_CMD,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
options.flatpak_container_combo,
|
||||||
|
FLATPAK_SANDBOX,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
for client in clients:
|
||||||
|
self.client_store.append(client)
|
||||||
|
self.set_model(self.client_store) # Text()
|
||||||
|
renderer_text = Gtk.CellRendererText()
|
||||||
|
self.pack_start(renderer_text, True)
|
||||||
|
self.add_attribute(renderer_text, "text", 0)
|
||||||
|
self.set_active(0)
|
||||||
@@ -13,8 +13,8 @@ from dzgui.const.constants import (
|
|||||||
HERO_PATH,
|
HERO_PATH,
|
||||||
LEGACY_CONFIG_PATH,
|
LEGACY_CONFIG_PATH,
|
||||||
)
|
)
|
||||||
|
from dzgui.const.boilerplate import config_boilerplate
|
||||||
from dzgui.const.endpoints import BM_API_SETUP, STEAM_API_SETUP
|
from dzgui.const.endpoints import BM_API_SETUP, STEAM_API_SETUP
|
||||||
|
|
||||||
from dzgui.init.migrate import migrate_legacy_conf
|
from dzgui.init.migrate import migrate_legacy_conf
|
||||||
from dzgui.managers.threading import call_on_thread, StoredFunc, ThreadingManager
|
from dzgui.managers.threading import call_on_thread, StoredFunc, ThreadingManager
|
||||||
from dzgui.strings import wizard
|
from dzgui.strings import wizard
|
||||||
@@ -23,14 +23,16 @@ from dzgui.util.open_links import open_link_by_url
|
|||||||
from dzgui.util.css import add_class
|
from dzgui.util.css import add_class
|
||||||
from dzgui.views.components.buttons import WebButton
|
from dzgui.views.components.buttons import WebButton
|
||||||
from dzgui.views.components.entry import APIEntry
|
from dzgui.views.components.entry import APIEntry
|
||||||
|
from dzgui.views.components.misc import ClientCombo
|
||||||
|
|
||||||
import gi
|
import gi
|
||||||
|
|
||||||
gi.require_version("Gtk", "3.0")
|
gi.require_version("Gtk", "3.0")
|
||||||
gi.require_version("Gdk", "3.0")
|
|
||||||
from gi.repository import Gdk, Gtk, GLib, GObject, GdkPixbuf # noqa E402
|
from gi.repository import Gdk, Gtk, GLib, GObject, GdkPixbuf # noqa E402
|
||||||
|
|
||||||
|
|
||||||
|
# TODO: currently unused, corresponds to linear index
|
||||||
|
# TODO: use of pagenum enum and page_type attribute is redundant
|
||||||
class PageNum(Enum):
|
class PageNum(Enum):
|
||||||
INTRO = 1
|
INTRO = 1
|
||||||
HAS_CONFIG = 2
|
HAS_CONFIG = 2
|
||||||
@@ -334,7 +336,7 @@ class ConfigMigrationPage(ScrolledWizardPage):
|
|||||||
EMITTER.emit("step_complete")
|
EMITTER.emit("step_complete")
|
||||||
EMITTER.emit("config", False)
|
EMITTER.emit("config", False)
|
||||||
|
|
||||||
def get_migrated(self) -> bool:
|
def is_migrated(self) -> bool:
|
||||||
return self.migrated
|
return self.migrated
|
||||||
|
|
||||||
def _on_import_clicked(self, button: Gtk.Button) -> None:
|
def _on_import_clicked(self, button: Gtk.Button) -> None:
|
||||||
@@ -349,6 +351,67 @@ class ConfigMigrationPage(ScrolledWizardPage):
|
|||||||
EMITTER.emit("config", True)
|
EMITTER.emit("config", True)
|
||||||
|
|
||||||
|
|
||||||
|
class PreferencesPage(ScrolledWizardPage):
|
||||||
|
def __init__(self) -> None:
|
||||||
|
super().__init__(
|
||||||
|
enum=PageNum.USER_PREFS,
|
||||||
|
heading=wizard.heading_prefs,
|
||||||
|
description=wizard.blurb_prefs,
|
||||||
|
)
|
||||||
|
self.page_type = Gtk.AssistantPageType.INTRO
|
||||||
|
|
||||||
|
# TODO: widgets and strings are largely a reimplementation of options page, consolidate
|
||||||
|
name_label = Gtk.Label(label=wizard.label_player)
|
||||||
|
self.name_box = Gtk.Box(
|
||||||
|
orientation=Gtk.Orientation.HORIZONTAL, spacing=10, halign=Gtk.Align.CENTER
|
||||||
|
)
|
||||||
|
self.name_entry = Gtk.Entry(placeholder_text=wizard.placeholder_player)
|
||||||
|
self.name_entry.connect("changed", self._on_entry_changed)
|
||||||
|
self.name_box.add(name_label)
|
||||||
|
self.name_box.add(self.name_entry)
|
||||||
|
|
||||||
|
self.dist_box = Gtk.Box(
|
||||||
|
orientation=Gtk.Orientation.HORIZONTAL, spacing=10, halign=Gtk.Align.CENTER
|
||||||
|
)
|
||||||
|
self.radio_km = Gtk.RadioButton.new_with_label(None, wizard.radio_km)
|
||||||
|
self.radio_miles = Gtk.RadioButton.new_with_label_from_widget(
|
||||||
|
self.radio_km, wizard.radio_mi
|
||||||
|
)
|
||||||
|
dist_label = Gtk.Label(label=wizard.label_dist)
|
||||||
|
self.dist_box.add(dist_label)
|
||||||
|
self.dist_box.add(self.radio_km)
|
||||||
|
self.dist_box.add(self.radio_miles)
|
||||||
|
|
||||||
|
client_label = Gtk.Label(label=wizard.label_client)
|
||||||
|
self.client_box = Gtk.Box(
|
||||||
|
orientation=Gtk.Orientation.HORIZONTAL, spacing=10, halign=Gtk.Align.CENTER
|
||||||
|
)
|
||||||
|
self.client_combo = ClientCombo()
|
||||||
|
self.client_box.add(client_label)
|
||||||
|
self.client_box.add(self.client_combo)
|
||||||
|
|
||||||
|
for el in self.name_box, self.dist_box, self.client_box:
|
||||||
|
self.add_start(el)
|
||||||
|
|
||||||
|
def get_prefs(self) -> None:
|
||||||
|
name = self.name_entry.get_text().strip()
|
||||||
|
use_miles = self.radio_miles.get_active()
|
||||||
|
model = self.client_combo.get_model()
|
||||||
|
ind = self.client_combo.get_active()
|
||||||
|
client = model[ind][1]
|
||||||
|
print(name)
|
||||||
|
print(use_miles)
|
||||||
|
print(client)
|
||||||
|
return name, use_miles, client
|
||||||
|
|
||||||
|
def _on_entry_changed(self, entry: Gtk.Entry) -> None:
|
||||||
|
text = entry.get_text()
|
||||||
|
if text.isspace():
|
||||||
|
EMITTER.emit("step_pending")
|
||||||
|
return
|
||||||
|
EMITTER.emit("step_complete")
|
||||||
|
|
||||||
|
|
||||||
class CompletionPage(ScrolledWizardPage):
|
class CompletionPage(ScrolledWizardPage):
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
super().__init__(
|
super().__init__(
|
||||||
@@ -356,7 +419,6 @@ class CompletionPage(ScrolledWizardPage):
|
|||||||
heading=wizard.heading_completion,
|
heading=wizard.heading_completion,
|
||||||
description=wizard.blurb_completion,
|
description=wizard.blurb_completion,
|
||||||
)
|
)
|
||||||
# TODO: show collapsible config file tree
|
|
||||||
self.page_type = Gtk.AssistantPageType.SUMMARY
|
self.page_type = Gtk.AssistantPageType.SUMMARY
|
||||||
|
|
||||||
self.connect("map", lambda _: EMITTER.emit("step_complete"))
|
self.connect("map", lambda _: EMITTER.emit("step_complete"))
|
||||||
@@ -371,8 +433,6 @@ class Assistant(Gtk.Assistant):
|
|||||||
self.set_default_size(1500, 900)
|
self.set_default_size(1500, 900)
|
||||||
|
|
||||||
self.config_path = config
|
self.config_path = config
|
||||||
# TODO: read in from boilerplate file
|
|
||||||
from dzgui.const.boilerplate import config_boilerplate
|
|
||||||
|
|
||||||
self.config_values: dict[str, Any] = config_boilerplate
|
self.config_values: dict[str, Any] = config_boilerplate
|
||||||
|
|
||||||
@@ -381,16 +441,7 @@ class Assistant(Gtk.Assistant):
|
|||||||
self.page3 = SteamPathPage()
|
self.page3 = SteamPathPage()
|
||||||
self.page4 = SteamValidationPage()
|
self.page4 = SteamValidationPage()
|
||||||
self.page5 = BMValidationPage()
|
self.page5 = BMValidationPage()
|
||||||
|
self.page6 = PreferencesPage()
|
||||||
# self.page6 = PreferencesPage()
|
|
||||||
# contains name, miles, and steam client choice
|
|
||||||
# self.name = Gtk.Entry()
|
|
||||||
# self.miles = Gtk.RadioButton()
|
|
||||||
# TODO: use dual column model, recycle into options
|
|
||||||
# TODO: update client_combo in options page
|
|
||||||
# self.client = Gtk.ComboBox()
|
|
||||||
# TODO: write to config if not present
|
|
||||||
|
|
||||||
self.page7 = CompletionPage()
|
self.page7 = CompletionPage()
|
||||||
|
|
||||||
self.set_forward_page_func(self._advance_page)
|
self.set_forward_page_func(self._advance_page)
|
||||||
@@ -407,6 +458,7 @@ class Assistant(Gtk.Assistant):
|
|||||||
self.page3,
|
self.page3,
|
||||||
self.page4,
|
self.page4,
|
||||||
self.page5,
|
self.page5,
|
||||||
|
self.page6,
|
||||||
self.page7,
|
self.page7,
|
||||||
):
|
):
|
||||||
# NOTE: skip config migration page if no legacy config file
|
# NOTE: skip config migration page if no legacy config file
|
||||||
@@ -420,9 +472,6 @@ class Assistant(Gtk.Assistant):
|
|||||||
self.show_all()
|
self.show_all()
|
||||||
|
|
||||||
def write_config(self) -> None:
|
def write_config(self) -> None:
|
||||||
# NOTE: implies that file was already migrated on page 3
|
|
||||||
if self.has_legacy_config:
|
|
||||||
return
|
|
||||||
write_json(self.config_values, self.config_path)
|
write_json(self.config_values, self.config_path)
|
||||||
|
|
||||||
def _advance_page(self, index: int) -> int:
|
def _advance_page(self, index: int) -> int:
|
||||||
@@ -431,7 +480,7 @@ class Assistant(Gtk.Assistant):
|
|||||||
case self.page1:
|
case self.page1:
|
||||||
pass
|
pass
|
||||||
case self.page2:
|
case self.page2:
|
||||||
if self.page2.get_migrated():
|
if self.page2.is_migrated():
|
||||||
return self.get_n_pages() - 1
|
return self.get_n_pages() - 1
|
||||||
case self.page3:
|
case self.page3:
|
||||||
self.config_values["default_steam_path"] = page.get_path_from_radio()
|
self.config_values["default_steam_path"] = page.get_path_from_radio()
|
||||||
@@ -439,11 +488,15 @@ class Assistant(Gtk.Assistant):
|
|||||||
self.config_values["steam_api"] = page.get_api_key()
|
self.config_values["steam_api"] = page.get_api_key()
|
||||||
case self.page5:
|
case self.page5:
|
||||||
self.config_values["bm_api"] = page.get_api_key()
|
self.config_values["bm_api"] = page.get_api_key()
|
||||||
# case self.page6:
|
# NOTE: collects config values before advancing to last page
|
||||||
# self.write_config()
|
case self.page6:
|
||||||
|
name, use_miles, client = self.page6.get_prefs()
|
||||||
|
self.config_values["name"] = name
|
||||||
|
self.config_values["use_miles"] = use_miles
|
||||||
|
self.config_values["client"] = client
|
||||||
|
self.write_config()
|
||||||
case _:
|
case _:
|
||||||
raise AttributeError("Trying to advance a non-canonical page")
|
raise AttributeError("Trying to advance a non-canonical page")
|
||||||
print(self.config_values)
|
|
||||||
return index + 1
|
return index + 1
|
||||||
|
|
||||||
def destroy_and_quit(self, widget: Self) -> None:
|
def destroy_and_quit(self, widget: Self) -> None:
|
||||||
|
|||||||
@@ -9,12 +9,9 @@ from dzgui.const.constants import (
|
|||||||
APPID_DAYZ_EXP,
|
APPID_DAYZ_EXP,
|
||||||
APPNAME_DAYZ,
|
APPNAME_DAYZ,
|
||||||
APPNAME_DAYZ_EXP_HUMAN,
|
APPNAME_DAYZ_EXP_HUMAN,
|
||||||
FLATPAK_RUN_CMD,
|
|
||||||
FLATPAK_SANDBOX,
|
|
||||||
NO_EXPAND,
|
NO_EXPAND,
|
||||||
NO_FILL,
|
NO_FILL,
|
||||||
NO_PADDING,
|
NO_PADDING,
|
||||||
STEAM_CMD,
|
|
||||||
VIEW_CONCEAL,
|
VIEW_CONCEAL,
|
||||||
VIEW_REVEAL,
|
VIEW_REVEAL,
|
||||||
)
|
)
|
||||||
@@ -27,6 +24,7 @@ from dzgui.views.components.labels import LeftLabel
|
|||||||
from dzgui.views.components.eventbox import InfoEventBox
|
from dzgui.views.components.eventbox import InfoEventBox
|
||||||
from dzgui.views.components.buttons import WebButton
|
from dzgui.views.components.buttons import WebButton
|
||||||
from dzgui.views.components.frame import HeadingFrame
|
from dzgui.views.components.frame import HeadingFrame
|
||||||
|
from dzgui.views.components.misc import ClientCombo
|
||||||
from dzgui.views.dialogs.generic import ExceptionDialog
|
from dzgui.views.dialogs.generic import ExceptionDialog
|
||||||
|
|
||||||
|
|
||||||
@@ -101,29 +99,7 @@ class Options(Gtk.Box):
|
|||||||
Preferences.WINDOW,
|
Preferences.WINDOW,
|
||||||
)
|
)
|
||||||
|
|
||||||
# TODO: make this an abstract class
|
self.client_combo = ClientCombo()
|
||||||
client_store = Gtk.ListStore(str, str)
|
|
||||||
clients = (
|
|
||||||
(
|
|
||||||
options.steam_combo,
|
|
||||||
STEAM_CMD,
|
|
||||||
),
|
|
||||||
(
|
|
||||||
options.flatpak_combo,
|
|
||||||
FLATPAK_RUN_CMD,
|
|
||||||
),
|
|
||||||
(
|
|
||||||
options.flatpak_container_combo,
|
|
||||||
FLATPAK_SANDBOX,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
for client in clients:
|
|
||||||
client_store.append(client)
|
|
||||||
self.client_combo = Gtk.ComboBox.new_with_model(client_store) # Text()
|
|
||||||
renderer_text = Gtk.CellRendererText()
|
|
||||||
self.client_combo.pack_start(renderer_text, True)
|
|
||||||
self.client_combo.add_attribute(renderer_text, "text", 0)
|
|
||||||
self.client_combo.set_active(0)
|
|
||||||
self.client_combo.connect("changed", self._on_client_changed)
|
self.client_combo.connect("changed", self._on_client_changed)
|
||||||
|
|
||||||
client_hbox = ShortHBox(self.client_combo)
|
client_hbox = ShortHBox(self.client_combo)
|
||||||
|
|||||||
Reference in new issue
Block a user