class

Runtime::SettingsWindow

Inherits Reference < Object

設定編集ウィンドウ(仕様書 4.8 節)。

入力値の受け渡しと表示だけを行い、検証と保存と反映は config/usecase に任せる。 編集は設定スナップショットの複製に対して行い、保存が通ったときだけ現在の設定と入れ替わる。

Constants

DYNAMIC_PRESET_CUSTOM = "custom"

dynamic の簡単設定で選べるもの(issue #45)。 係数の組であるプリセットに続けて、係数を自分で決めるためのカスタムを末尾へ置く。

DYNAMIC_PRESETS = ::Config::DynamicTimeout::PRESET_NAMES + [DYNAMIC_PRESET_CUSTOM]
DYNAMIC_TIMEOUT_FIELDS = ["base", "reading_speed", "min", "max"] of ::String

dynamic_timeout は 4 つの係数をまとめた 1 つの値である。 画面では係数ごとに編集し、1 つでも上書きされていれば、 残りを既定の通知設定から埋めて 1 つの値として持たせる。

FILTER_MODES = ["blacklist", "whitelist"] of ::String
LANGUAGES = ["auto", "ja", "en"] of ::String
Log = ::Log.for("runtime")
LOG_LEVELS = ["trace", "debug", "info", "notice", "warn", "error", "fatal", "none"] of ::String
REPOSITORY_URL = "https://github.com/limit7412/KxNotifyUtils"
RULE_FIELD_LABEL_KEYS = {"timeout_mode" => "settings.rules.field.timeout_mode", "timeout" => "settings.defaults.timeout", "max_body_length" => "settings.defaults.max_body_length", "title_template" => "settings.defaults.title_template", "icon" => "settings.defaults.icon", "opacity" => "settings.defaults.opacity", "volume" => "settings.defaults.volume", "sound" => "settings.defaults.sound", "dynamic_timeout.base" => "settings.defaults.dynamic_base", "dynamic_timeout.reading_speed" => "settings.defaults.dynamic_reading_speed", "dynamic_timeout.min" => "settings.defaults.dynamic_min", "dynamic_timeout.max" => "settings.defaults.dynamic_max"}

上書き行の見出しに使う辞書キー(issue #36)。 生のフィールド名を並べず、既定の通知設定タブと同じ文言を使う。 timeout_mode だけは入力欄へ書くトークンが分かるよう、選択肢を添えた文言にする。 行を足すときはここにも足す。漏れた行は今までどおりフィールド名がそのまま出る。

RULE_FIELDS = ["timeout_mode", "timeout", "max_body_length", "title_template", "icon", "opacity", "volume", "sound"] of ::String

rules の 1 項目で上書きできるフィールドのうち、単独の値を持つもの。 どれも「上書きするか」のチェックと入力欄の組で編集するため、同じ形で扱う。

RULE_OVERRIDE_ROWS = RULE_FIELDS + DYNAMIC_TIMEOUT_FIELDS.map do |field| "dynamic_timeout.#{field}" end

画面に並べる上書き行。

SLIDER_SCALE = 100

スライダの目盛り。設定の 0.0〜1.0 を 0.01 刻みで扱う。 手で書いたこれより細かい値は、この画面から保存すると 0.01 へ丸まる。

STATUS_REFRESH_INTERVAL = 2.seconds

表示中に状態のラベルを映し直す間隔。 通知アクセスの確かめ直しがソース側で 5 秒ごとなので、それより短くしても表示は変わらない。

THIRD_PARTY_NOTICES = {{ read_file("/tmp/tmp.eCpLGE/src/src/runtime/../../THIRD-PARTY-NOTICES.md") }}

サードパーティライセンス表記をビルド時に実行ファイルへ取り込む。 配布物は exe 1 ファイルで、同梱の LICENSE ファイルが存在しないため、 この画面が利用者から見えるライセンス表記の一次的な置き場所になる。

TIMEOUT_MODES = ["dynamic", "fixed"] of ::String
TRANSPORTS = ["websocket", "udp"] of ::String
TRIMMED_RULE_FIELDS = ["timeout_mode", "timeout", "max_body_length", "opacity", "volume"] of ::String

前後の空白に意味が無く、落として読むフィールド。

UPDATE_CHANNELS = ["stable", "test"] of ::String

Constructors

new(config : Config::Usecase, relay : Notify::RelayUsecase, version : String, access_status : Proc(String) = -> do I18n.t("status.unknown") end, steamvr_status : Proc(String) = -> do I18n.t("status.unknown") end, steamvr_connected : Proc(Bool) = -> do false end, update_status : Proc(String) = -> do I18n.t("settings.about.update_unchecked") end, update_url : Proc(String | Nil) = -> do nil.as(String | ::Nil) end, update_action : Proc(Tuple(String, Bool)) = -> do {I18n.t("settings.about.update_download"), false} end)
Source

Instance methods

notify_external_change

外部エディタでの編集を取り込んだときに呼ぶ。

編集していなければ、読み直した内容をそのまま映す。 古い下書きを残すと、あとで一項目だけ直して保存したときに、 外部で変えた他の項目まで古い値へ戻してしまう。

編集中なら破棄せず、変更があったことだけを知らせて利用者に選ばせる。

Source
on_open_notification_settings
Source
on_open_notification_settings=(on_open_notification_settings : Proc(Nil))
Source
on_request_steamvr_register
Source
on_request_steamvr_register=(on_request_steamvr_register : Proc(Nil))
Source
on_request_steamvr_unregister
Source
on_request_steamvr_unregister=(on_request_steamvr_unregister : Proc(Nil))
Source
on_request_update_action

情報タブの取得・適用のボタンを押したとき(issue #10 第 2 段階)。

Source
on_request_update_action=(on_request_update_action : Proc(Nil))

情報タブの取得・適用のボタンを押したとき(issue #10 第 2 段階)。

Source
open

トレイメニューから開く。既に開いていれば前面化するだけとする。

Source
open?
Source
tick(now : Time::Span = Time.monotonic) : Nil

主ループから毎周期呼ぶ。表示中だけ、一定間隔で状態のラベルを映し直す。

利用者が Windows の設定画面で通知アクセスを切り替えても、 開いたままの画面には届かない。開いた時点の表示が残り続けることになる。

Source
warn_if_unsaved?

未保存の変更があるまま閉じようとしたときは、一度警告を出して操作をやり直させる。 libui-ng が持つのは確認のないメッセージ表示だけなので、 「保存するか破棄するか」の選択は、警告のあとにもう一度閉じる操作をするかで表す。 未保存の編集があれば知らせて真を返す。

更新の適用のように、その場でアプリが終わる操作の前に呼ぶ。 閉じるときは警告しているのに、再起動だけ黙って下書きを捨てるわけにはいかない。 一度きりの警告にはしない。閉じる操作と違い、押し直しの意思表示が要る場面ではなく、 保存するか閉じるかを先に決めてもらう。

Source