diff --git a/program/MainWindow.cs b/program/MainWindow.cs
index 28cdc98..e1f6e50 100644
--- a/program/MainWindow.cs
+++ b/program/MainWindow.cs
@@ -68,7 +68,7 @@
private static Builder CreateBuilder()
{
var builder = new Builder();
- builder.AddFromFile("homepageallv7.glade");
+ builder.AddFromFile("homepageallv8.glade");
return builder;
}
diff --git a/program/MapWindow.cs b/program/MapWindow.cs
index f1ef284..cd4b508 100644
--- a/program/MapWindow.cs
+++ b/program/MapWindow.cs
@@ -107,6 +107,14 @@
[UI] private Button SoundTestButton = null;
[UI] private CheckButton BlackAudioCheck = null;
[UI] private Label JacketSizeLabel = null;
+ // For new UI
+ [UI] private DrawingArea HeartWaveArea = null;
+ [UI] private DrawingArea BreathWaveArea = null;
+ [UI] private Label MapContactLabel = null;
+ [UI] private Label MapPointHeader = null;
+ [UI] private Label HeartWaveHeader = null;
+ [UI] private Label BreathWaveHeader = null;
+ [UI] private Button MapExplainButton = null;
private readonly Language _lang;
// private readonly SoundLooper _sound = new SoundLooper();
@@ -195,6 +203,14 @@
foreach (var w in mapWidgets)
if (w != null) w.StyleContext.AddClass("mappage");
+ AddClass(MapTitleLabel, "map-title");
+ AddClass(MapContactLabel, "contact-chip");
+ AddClass(MapPointHeader, "panel-header");
+ AddClass(HeartWaveHeader, "panel-header");
+ AddClass(BreathWaveHeader, "panel-header");
+ AddClass(MapExplainButton, "nav-button");
+ AddClass(MapBackButton, "nav-button");
+
SetName(MapArea, "MapArea");
SetName(MapTitleLabel, "MapTitleLabel");
SetName(MapCaseLabel, "MapCaseLabel");
@@ -215,12 +231,16 @@
// ── signals ───────────────────────────────────────────────────
MapArea.Drawn += OnMapDrawn;
+ HeartWaveArea.Drawn += (o, a) => DrawWave(a, HeartWaveArea, 0.86, 0.22, 0.20);
+ BreathWaveArea.Drawn += (o, a) => DrawWave(a, BreathWaveArea, 0.21, 0.57, 0.78);
MapBackButton.Clicked += OnBackClicked;
BodySkeletonRadio.Toggled += (s, e) => { if (BodySkeletonRadio.Active) ReloadBody(); };
BodyJacketRadio.Toggled += (s, e) => { if (BodyJacketRadio.Active) ReloadBody(); };
JacketSizeCombo.Changed += (s, e) => { ReloadBody(); SyncSpins(); MapArea.QueueDraw(); };
+ MapExplainButton.Clicked += (s, e) => { /* open 解説 */ };
+
HookView(ViewFrontRadio, "front");
HookView(ViewBackRadio, "back");
HookView(ViewRightRadio, "right");
@@ -252,6 +272,11 @@
if (w != null) w.Name = name;
}
+ private static void AddClass(Widget w, string cls)
+ {
+ if (w != null) w.StyleContext.AddClass(cls);
+ }
+
private void HookKeys()
{
if (_keysHooked) return;
@@ -1381,4 +1406,21 @@
_debugSweepId = 0;
Logger.Write("sound", "debug volume sweep stopped");
}
+ private void DrawWave(DrawnArgs args, DrawingArea area, double r, double g, double b)
+ {
+ var cr = args.Cr;
+ int w = area.AllocatedWidth, h = area.AllocatedHeight;
+
+ cr.SetSourceRGB(0.85, 0.85, 0.85);
+ cr.Rectangle(0, 0, w, h);
+ cr.Fill();
+
+ cr.SetSourceRGB(r, g, b);
+ cr.LineWidth = 1.5;
+ cr.MoveTo(0, h / 2.0);
+ cr.LineTo(w, h / 2.0);
+ cr.Stroke();
+
+ args.RetVal = true;
+ }
}
\ No newline at end of file
diff --git a/program/homepageallv8.glade b/program/homepageallv8.glade
new file mode 100644
index 0000000..6cde001
--- /dev/null
+++ b/program/homepageallv8.glade
@@ -0,0 +1,1080 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/program/touch_friendly.css b/program/touch_friendly.css
index 3a5b7e6..e0ca2a0 100644
--- a/program/touch_friendly.css
+++ b/program/touch_friendly.css
@@ -75,17 +75,19 @@
#LanguageToggle:checked label { color: #ffffff; }
/* ---------- back buttons ---------- */
-#SoundBackButton, #MapBackButton, #SettingBackButton {
+/* MapBackButton is deliberately NOT here — the map page pairs it with
+ MapExplainButton via .nav-button so both render at the same size. */
+#SoundBackButton, #SettingBackButton {
min-width: 100px;
min-height: 58px;
background-color: #F0F0F0;
border: 2px solid #B5B5B5;
}
-#SoundBackButton label, #MapBackButton label, #SettingBackButton label {
+#SoundBackButton label, #SettingBackButton label {
font-size: 20px;
color: #111111;
}
-#SoundBackButton:hover, #MapBackButton:hover, #SettingBackButton:hover {
+#SoundBackButton:hover, #SettingBackButton:hover {
background-color: #E2E2E2;
}
@@ -111,16 +113,23 @@
#StatusLabel.status-off { color: #c62828; font-weight: bold; font-size: 17px; }
/* ══════════════════════════════════════════════════════════════════
- MAP PAGE ONLY — scoped under #MapBox, so nothing here can leak to
- the splash, sound or settings pages. Sizes target the `label` node
- directly because _scaleCssProvider emits a plain `label {}` rule
- that beats any inherited value.
+ MAP PAGE
+ Two selector styles are in play here, and the difference matters:
+
+ #Id — works only for widgets MapWindow passes to SetName() in
+ its constructor. GTK3's Builder does not copy a glade id
+ into the CSS name, so an id alone matches nothing.
+ .class — applied via AddClass() in the same constructor. Used for
+ the header/title/button widgets because this build's
+ Builder rejects in the glade.
+
+ Sizes target the `label` node directly because _scaleCssProvider
+ emits a plain `label {}` rule that beats any inherited value.
══════════════════════════════════════════════════════════════════ */
-/* ── map page: composite widgets whose inner button node has no class ── */
-
-/* GtkRadioButton with draw-indicator=False renders as a button node that
- is a CHILD of the widget carrying .mappage, so button.mappage misses it. */
+/* ── 視点 radios ──
+ GtkRadioButton with draw-indicator=False renders as a button node that
+ is a CHILD of the widget carrying the id, so `#Id button` is needed. */
#ViewFrontRadio, #ViewBackRadio, #ViewRightRadio, #ViewLeftRadio,
#ViewFrontRadio button, #ViewBackRadio button,
#ViewRightRadio button, #ViewLeftRadio button {
@@ -134,7 +143,7 @@
#ViewFrontRadio label, #ViewBackRadio label,
#ViewRightRadio label, #ViewLeftRadio label {
color: #111111;
- font-size: 18px;
+ font-size: 22px;
font-weight: 700;
}
#ViewFrontRadio:checked, #ViewBackRadio:checked,
@@ -149,15 +158,28 @@
color: #ffffff;
}
+/* ── left control column ── */
+#BodySkeletonRadio label, #BodyJacketRadio label,
+#HideCircleCheck label, #BlackAudioCheck label,
+#JacketSizeLabel {
+ font-size: 19px;
+ color: #1e1e1e;
+}
+#BodyFrame > label, #ViewFrame > label {
+ font-size: 19px;
+ font-weight: 700;
+ color: #1e1e1e;
+}
+
/* 再生テスト — accent fill, white text is correct here */
#SoundTestButton {
background-color: #0B3B6B;
background-image: none;
border: 2px solid #072a4d;
border-radius: 0;
- min-height: 46px;
+ min-height: 58px;
}
-#SoundTestButton label { color: #ffffff; font-size: 18px; font-weight: 700; }
+#SoundTestButton label { color: #ffffff; font-size: 24px; font-weight: 700; }
#SoundTestButton:hover { background-color: #14538F; }
/* サイズ combo — the visible box is a button node inside the combobox */
@@ -175,7 +197,7 @@
#JacketSizeCombo button label,
#JacketSizeCombo cellview {
color: #111111;
- font-size: 16px;
+ font-size: 19px;
font-weight: 400;
}
#JacketSizeCombo arrow { color: #111111; min-width: 16px; min-height: 16px; }
@@ -186,11 +208,48 @@
#JacketSizeCombo window.popup row label {
color: #111111;
background-color: #ffffff;
- font-size: 16px;
+ font-size: 19px;
}
window.popup list row label { color: #111111; }
-/* inactive buttons */
+/* ── map page: class-based widgets (see header note) ── */
+label.map-title {
+ font-family: 'Noto Sans JP', 'IPAPGothic', sans-serif;
+ font-size: 40px;
+ font-weight: 700;
+ color: #1e1e1e;
+ background-color: rgba(255,255,255,0.55);
+ padding: 6px 40px;
+}
+label.panel-header {
+ font-family: 'Noto Sans JP', 'IPAPGothic', sans-serif;
+ font-size: 28px;
+ font-weight: 700;
+ color: #111111;
+ background-color: #F0F0F0;
+ padding: 6px 0;
+}
+label.contact-chip {
+ font-size: 20px;
+ font-weight: 700;
+ color: #ffffff;
+ background-color: #C62828;
+ padding: 6px 18px;
+}
+label.contact-chip.contact-ok { background-color: #2e7d32; }
+
+button.nav-button {
+ min-height: 62px;
+ background-color: #F0F0F0;
+ border: 2px solid #B5B5B5;
+}
+button.nav-button label {
+ font-size: 24px;
+ color: #111111;
+}
+button.nav-button:hover { background-color: #E2E2E2; }
+
+/* ---------- disabled states ---------- */
/* splash: modes unavailable until the device connects */
#Option1Button:disabled, #Option2Button:disabled, #Option3Button:disabled {
background-color: #A8AFA0;