From 5bef5b48cae6e9b949177802b67856fa88cf74b0 Mon Sep 17 00:00:00 2001 From: Ihor Ivlev Date: Sat, 31 Oct 2026 14:15:43 +0100 Subject: [PATCH] osd: centre dot A small red dot at the centre of the video, as an aiming reference. It is an OSD item like the others (toggled in the OSD menu), on by default, fixed in place, and hidden in VR mode. OSDElement gets a second form for a fixed view with a default-enabled flag; movable items keep working as before. --- .../openipc/pixelpilot/osd/OSDElement.java | 19 ++++++++++++++++++- .../openipc/pixelpilot/osd/OSDManager.java | 19 ++++++++++++------- app/src/main/res/drawable/osd_center_dot.xml | 12 ++++++++++++ app/src/main/res/layout/activity_video.xml | 14 ++++++++++++++ 4 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 app/src/main/res/drawable/osd_center_dot.xml diff --git a/app/src/main/java/com/openipc/pixelpilot/osd/OSDElement.java b/app/src/main/java/com/openipc/pixelpilot/osd/OSDElement.java index fd73d37b..a42052b3 100644 --- a/app/src/main/java/com/openipc/pixelpilot/osd/OSDElement.java +++ b/app/src/main/java/com/openipc/pixelpilot/osd/OSDElement.java @@ -1,12 +1,29 @@ package com.openipc.pixelpilot.osd; +import android.view.View; + public class OSDElement { public String name; - public MovableLayout layout; + public MovableLayout layout; // null for a fixed item + public View fixedView; // fixed item, e.g. the centre dot + public boolean defaultEnabled; public OSDElement(String n, MovableLayout l) { name = n; layout = l; + fixedView = null; + defaultEnabled = false; + } + + public OSDElement(String n, View fixed, boolean enabledByDefault) { + name = n; + layout = null; + fixedView = fixed; + defaultEnabled = enabledByDefault; + } + + public View view() { + return layout != null ? layout : fixedView; } public String prefName() { diff --git a/app/src/main/java/com/openipc/pixelpilot/osd/OSDManager.java b/app/src/main/java/com/openipc/pixelpilot/osd/OSDManager.java index 68e9c088..2cc32051 100644 --- a/app/src/main/java/com/openipc/pixelpilot/osd/OSDManager.java +++ b/app/src/main/java/com/openipc/pixelpilot/osd/OSDManager.java @@ -38,7 +38,8 @@ public OSDManager(Context context, ActivityVideoBinding binding) { public void lockOSD(Boolean isLocked) { for (int i = 0; i < listOSDItems.size(); i++) { - listOSDItems.get(i).layout.setMovable(!isLocked); + MovableLayout layout = listOSDItems.get(i).layout; + if (layout != null) layout.setMovable(!isLocked); } osdLocked = isLocked; } @@ -52,8 +53,12 @@ public String getTitle() { } public void onOSDItemCheckChanged(OSDElement element, boolean isChecked) { - // Show or hide the ImageView corresponding to the checkbox position - element.layout.setVisibility(isChecked ? View.VISIBLE : View.GONE); + // Show or hide the ImageView corresponding to the checkbox position. + // The centre dot stays hidden in VR mode, where there is no single video view. + boolean show = isChecked && (element.layout != null + || binding.mainVideoSurface.getVisibility() == View.VISIBLE + || binding.mainVideo.getVisibility() == View.VISIBLE); + element.view().setVisibility(show ? View.VISIBLE : View.GONE); SharedPreferences prefs = context.getSharedPreferences("osd_config", MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putBoolean(element.prefName() + "_enabled", isChecked); @@ -81,6 +86,7 @@ public void onFinish() { listOSDItems.add(new OSDElement("Battery Air", binding.itemBat)); listOSDItems.add(new OSDElement("Battery Cell Air", binding.itemBatCell)); listOSDItems.add(new OSDElement("Battery GS", binding.itemGSBattery)); + listOSDItems.add(new OSDElement("Center Dot", binding.imgCenterDot, true)); listOSDItems.add(new OSDElement("Current", binding.itemCurrent)); listOSDItems.add(new OSDElement("Flight Mode", binding.itemFlightMode)); listOSDItems.add(new OSDElement("Ground Speed", binding.itemGndSpeed)); @@ -106,14 +112,13 @@ public void onFinish() { public boolean isElementEnabled(OSDElement elem) { SharedPreferences prefs = context.getSharedPreferences("osd_config", MODE_PRIVATE); - return prefs.getBoolean(elem.prefName() + "_enabled", false); + return prefs.getBoolean(elem.prefName() + "_enabled", elem.defaultEnabled); } public void restoreOSDConfig() { - SharedPreferences prefs = context.getSharedPreferences("osd_config", MODE_PRIVATE); for (OSDElement element : listOSDItems) { - boolean enabled = prefs.getBoolean(element.prefName() + "_enabled", false); - onOSDItemCheckChanged(element, enabled); + onOSDItemCheckChanged(element, isElementEnabled(element)); + if (element.layout == null) continue; // fixed item: no saved position element.layout.restorePosition(element.prefName()); element.layout.setMovable(!isOSDLocked()); } diff --git a/app/src/main/res/drawable/osd_center_dot.xml b/app/src/main/res/drawable/osd_center_dot.xml new file mode 100644 index 00000000..3bb0e336 --- /dev/null +++ b/app/src/main/res/drawable/osd_center_dot.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_video.xml b/app/src/main/res/layout/activity_video.xml index 8aa7e519..ccd34212 100644 --- a/app/src/main/res/layout/activity_video.xml +++ b/app/src/main/res/layout/activity_video.xml @@ -733,4 +733,18 @@ + + +