設定編集ウィンドウ(仕様書 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 ::
Stringdynamic_timeout は 4 つの係数をまとめた 1 つの値である。
画面では係数ごとに編集し、1 つでも上書きされていれば、
残りを既定の通知設定から埋めて 1 つの値として持たせる。
FILTER_MODES = ["blacklist", "whitelist"] of ::
StringLANGUAGES = ["auto", "ja", "en"] of ::
StringLog = ::
Log.for("runtime")
LOG_LEVELS = ["trace", "debug", "info", "notice", "warn", "error", "fatal", "none"] of ::
StringRULE_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 ::
Stringrules の 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 ::
StringTRANSPORTS = ["websocket", "udp"] of ::
StringTRIMMED_RULE_FIELDS = ["timeout_mode", "timeout", "max_body_length", "opacity", "volume"] of ::
StringUPDATE_CHANNELS = ["stable", "test"] of ::
StringConstructors
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)
SourceInstance methods
notify_external_change
外部エディタでの編集を取り込んだときに呼ぶ。
編集していなければ、読み直した内容をそのまま映す。
古い下書きを残すと、あとで一項目だけ直して保存したときに、
外部で変えた他の項目まで古い値へ戻してしまう。
編集中なら破棄せず、変更があったことだけを知らせて利用者に選ばせる。
Sourceon_open_notification_settings
Sourceon_open_notification_settings=(on_open_notification_settings :
Proc(
Nil))
Sourceon_request_steamvr_register
Sourceon_request_steamvr_register=(on_request_steamvr_register :
Proc(
Nil))
Sourceon_request_steamvr_unregister
Sourceon_request_steamvr_unregister=(on_request_steamvr_unregister :
Proc(
Nil))
Sourceon_request_update_action
情報タブの取得・適用のボタンを押したとき(issue #10 第 2 段階)。
Sourceon_request_update_action=(on_request_update_action :
Proc(
Nil))
情報タブの取得・適用のボタンを押したとき(issue #10 第 2 段階)。
Sourceopen
トレイメニューから開く。既に開いていれば前面化するだけとする。
Source主ループから毎周期呼ぶ。表示中だけ、一定間隔で状態のラベルを映し直す。
利用者が Windows の設定画面で通知アクセスを切り替えても、
開いたままの画面には届かない。開いた時点の表示が残り続けることになる。
Sourcewarn_if_unsaved?
未保存の変更があるまま閉じようとしたときは、一度警告を出して操作をやり直させる。
libui-ng が持つのは確認のないメッセージ表示だけなので、
「保存するか破棄するか」の選択は、警告のあとにもう一度閉じる操作をするかで表す。
未保存の編集があれば知らせて真を返す。
更新の適用のように、その場でアプリが終わる操作の前に呼ぶ。
閉じるときは警告しているのに、再起動だけ黙って下書きを捨てるわけにはいかない。
一度きりの警告にはしない。閉じる操作と違い、押し直しの意思表示が要る場面ではなく、
保存するか閉じるかを先に決めてもらう。
Source