diff --git a/Ink Canvas/MainWindow.xaml b/Ink Canvas/MainWindow.xaml
index cf129f5f..abb36a21 100644
--- a/Ink Canvas/MainWindow.xaml
+++ b/Ink Canvas/MainWindow.xaml
@@ -1435,6 +1435,11 @@
Visibility="Collapsed" />
+
+
+
+
@@ -4664,16 +4669,21 @@
Panel.ZIndex="1001"/>
-
+
+
+
+
+
+
+
@@ -784,7 +784,7 @@ internal void ImageBlackboard_MouseUp(object sender, MouseButtonEventArgs e)
}
catch
{
- BlackBoardWaterMark.Visibility = Visibility.Collapsed;
+ BlackBoardWaterMarkContainer.Visibility = Visibility.Collapsed;
}
}
else if (Settings.Appearance.EnableChickenSoupInWhiteboardMode && Settings.Appearance.ChickenSoupSource == 3)
@@ -861,7 +861,7 @@ internal void ImageBlackboard_MouseUp(object sender, MouseButtonEventArgs e)
// if (!isInMultiTouchMode) ToggleSwitchEnableMultiTouchMode.IsOn = true;
WaterMarkTime.Visibility = Visibility.Collapsed;
WaterMarkDate.Visibility = Visibility.Collapsed;
- BlackBoardWaterMark.Visibility = Visibility.Collapsed;
+ BlackBoardWaterMarkContainer.Visibility = Visibility.Collapsed;
ICCWaterMarkDark.Visibility = Visibility.Collapsed;
ICCWaterMarkWhite.Visibility = Visibility.Collapsed;
diff --git a/Ink Canvas/MainWindow_cs/MW_Settings.cs b/Ink Canvas/MainWindow_cs/MW_Settings.cs
index acacfedc..fe400061 100644
--- a/Ink Canvas/MainWindow_cs/MW_Settings.cs
+++ b/Ink Canvas/MainWindow_cs/MW_Settings.cs
@@ -1437,6 +1437,78 @@ private async void BtnHitokotoCustomize_Click(object sender, RoutedEventArgs e)
}
}
+ private void UpdateChickenSoupPosition()
+ {
+ if (BlackBoardWaterMarkContainer == null) return;
+
+ if (double.IsNaN(Settings.Appearance.ChickenSoupPositionX) || double.IsNaN(Settings.Appearance.ChickenSoupPositionY))
+ {
+ // 默认右上角
+ BlackBoardWaterMarkContainer.HorizontalAlignment = System.Windows.HorizontalAlignment.Right;
+ BlackBoardWaterMarkContainer.VerticalAlignment = System.Windows.VerticalAlignment.Top;
+ BlackBoardWaterMarkContainer.Margin = new Thickness(0, 15, 25, 0);
+ }
+ else
+ {
+ BlackBoardWaterMarkContainer.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
+ BlackBoardWaterMarkContainer.VerticalAlignment = System.Windows.VerticalAlignment.Top;
+ BlackBoardWaterMarkContainer.Margin = new Thickness(Settings.Appearance.ChickenSoupPositionX, Settings.Appearance.ChickenSoupPositionY, 0, 0);
+ }
+ }
+
+ private void ButtonCustomChickenSoupPosition_Click(object sender, RoutedEventArgs e)
+ {
+ if (!isLoaded) return;
+
+ // 切换到自定义位置模式
+ WaterMarkGrid.IsHitTestVisible = true;
+ BlackBoardWaterMarkThumb.Cursor = System.Windows.Input.Cursors.SizeAll;
+
+ // 如果还未自定义过位置,先将对齐方式改为左上角,并计算当前实际位置
+ if (double.IsNaN(Settings.Appearance.ChickenSoupPositionX))
+ {
+ Point relativePoint = BlackBoardWaterMarkContainer.TransformToAncestor(WaterMarkGrid).Transform(new Point(0, 0));
+ Settings.Appearance.ChickenSoupPositionX = relativePoint.X;
+ Settings.Appearance.ChickenSoupPositionY = relativePoint.Y;
+ UpdateChickenSoupPosition();
+ }
+
+ // 隐藏设置面板,以便用户拖动
+ HideSubPanels();
+
+ // 提示用户
+ ShowNotification("已进入自定义位置模式,请拖动屏幕上的文本进行位置调整。再次点击任意工具栏按钮即可退出该模式。");
+ }
+
+ private void BlackBoardWaterMark_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
+ {
+ if (WaterMarkGrid.IsHitTestVisible)
+ {
+ double left = BlackBoardWaterMarkContainer.Margin.Left + e.HorizontalChange;
+ double top = BlackBoardWaterMarkContainer.Margin.Top + e.VerticalChange;
+
+ // 防止拖出边界
+ if (left < 0) left = 0;
+ if (top < 0) top = 0;
+
+ Settings.Appearance.ChickenSoupPositionX = left;
+ Settings.Appearance.ChickenSoupPositionY = top;
+
+ BlackBoardWaterMarkContainer.Margin = new Thickness(left, top, 0, 0);
+ SaveSettingsToFile();
+ }
+ }
+
+ private void WaterMarkGrid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ if (WaterMarkGrid.IsHitTestVisible)
+ {
+ WaterMarkGrid.IsHitTestVisible = false;
+ BlackBoardWaterMarkThumb.Cursor = System.Windows.Input.Cursors.Arrow;
+ ShowNotification("位置已保存,已退出自定义位置模式。");
+ }
+ }
+
private void ToggleSwitchEnableViewboxBlackBoardScaleTransform_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
@@ -1710,11 +1782,11 @@ private void ToggleSwitchEnableChickenSoupInWhiteboardMode_Toggled(object sender
{
if (ToggleSwitchEnableTimeDisplayInWhiteboardMode.IsOn)
{
- BlackBoardWaterMark.Visibility = Visibility.Visible;
+ BlackBoardWaterMarkContainer.Visibility = Visibility.Visible;
}
else
{
- BlackBoardWaterMark.Visibility = Visibility.Collapsed;
+ BlackBoardWaterMarkContainer.Visibility = Visibility.Collapsed;
}
}
diff --git a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs
index 9fbca2bc..51253e1d 100644
--- a/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs
+++ b/Ink Canvas/MainWindow_cs/MW_SettingsToLoad.cs
@@ -444,6 +444,7 @@ private void LoadSettings(bool isStartup = false, bool skipAutoUpdateCheck = fal
try
{
ComboBoxChickenSoupSource.SelectedIndex = Settings.Appearance.ChickenSoupSource;
+ UpdateChickenSoupPosition();
}
finally
{
diff --git a/Ink Canvas/Properties/Strings.en.resx b/Ink Canvas/Properties/Strings.en.resx
new file mode 100644
index 00000000..8438b9fd
--- /dev/null
+++ b/Ink Canvas/Properties/Strings.en.resx
@@ -0,0 +1,8 @@
+
+
+ Quote Position
+
+
+ Customize Position
+
+
diff --git a/Ink Canvas/Properties/Strings.resx b/Ink Canvas/Properties/Strings.resx
index 483d13e0..c9522462 100644
--- a/Ink Canvas/Properties/Strings.resx
+++ b/Ink Canvas/Properties/Strings.resx
@@ -2626,4 +2626,10 @@
开启后,点击白板工具栏「展台」将打开希沃视频展台(需已安装);关闭则使用内置展台。
-
\ No newline at end of file
+
+ 信仰の源显示位置
+
+
+ 自定义位置
+
+
diff --git a/Ink Canvas/Resources/Settings.cs b/Ink Canvas/Resources/Settings.cs
index 4f3baec5..2ea46c18 100644
--- a/Ink Canvas/Resources/Settings.cs
+++ b/Ink Canvas/Resources/Settings.cs
@@ -298,6 +298,10 @@ public class Appearance
public bool IsShowQuickPanel { get; set; } = true;
[JsonProperty("chickenSoupSource")]
public int ChickenSoupSource { get; set; } = 1;
+ [JsonProperty("chickenSoupPositionX")]
+ public double ChickenSoupPositionX { get; set; } = double.NaN;
+ [JsonProperty("chickenSoupPositionY")]
+ public double ChickenSoupPositionY { get; set; } = double.NaN;
[JsonProperty("hitokotoCategories", NullValueHandling = NullValueHandling.Ignore)]
public List HitokotoCategories { get; set; }
[JsonProperty("isShowModeFingerToggleSwitch")]
diff --git a/update_settings.py b/update_settings.py
new file mode 100644
index 00000000..38a8756b
--- /dev/null
+++ b/update_settings.py
@@ -0,0 +1,159 @@
+import re
+
+with open("Ink Canvas/MainWindow_cs/MW_Settings.cs", "r", encoding="utf-8") as f:
+ content = f.read()
+
+old_str = """ private void UpdateChickenSoupPosition()
+ {
+ if (BlackBoardWaterMark == null) return;
+
+ if (double.IsNaN(Settings.Appearance.ChickenSoupPositionX) || double.IsNaN(Settings.Appearance.ChickenSoupPositionY))
+ {
+ // 默认右上角
+ BlackBoardWaterMark.HorizontalAlignment = System.Windows.HorizontalAlignment.Right;
+ BlackBoardWaterMark.VerticalAlignment = System.Windows.VerticalAlignment.Top;
+ BlackBoardWaterMark.Margin = new Thickness(0, 15, 25, 0);
+ }
+ else
+ {
+ BlackBoardWaterMark.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
+ BlackBoardWaterMark.VerticalAlignment = System.Windows.VerticalAlignment.Top;
+ BlackBoardWaterMark.Margin = new Thickness(Settings.Appearance.ChickenSoupPositionX, Settings.Appearance.ChickenSoupPositionY, 0, 0);
+ }
+ }
+
+ private void ButtonCustomChickenSoupPosition_Click(object sender, RoutedEventArgs e)
+ {
+ if (!isLoaded) return;
+
+ // 切换到自定义位置模式
+ WaterMarkGrid.IsHitTestVisible = true;
+ BlackBoardWaterMark.Cursor = System.Windows.Input.Cursors.SizeAll;
+
+ // 如果还未自定义过位置,先将对齐方式改为左上角,并计算当前实际位置
+ if (double.IsNaN(Settings.Appearance.ChickenSoupPositionX))
+ {
+ Point relativePoint = BlackBoardWaterMark.TransformToAncestor(WaterMarkGrid).Transform(new Point(0, 0));
+ Settings.Appearance.ChickenSoupPositionX = relativePoint.X;
+ Settings.Appearance.ChickenSoupPositionY = relativePoint.Y;
+ UpdateChickenSoupPosition();
+ }
+
+ // 隐藏设置面板,以便用户拖动
+ HideSubPanels();
+
+ // 提示用户
+ ShowNotification("已进入自定义位置模式,请拖动屏幕上的文本进行位置调整。再次点击任意工具栏按钮即可退出该模式。");
+ }
+
+ private void BlackBoardWaterMark_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
+ {
+ if (WaterMarkGrid.IsHitTestVisible)
+ {
+ double left = BlackBoardWaterMark.Margin.Left + e.HorizontalChange;
+ double top = BlackBoardWaterMark.Margin.Top + e.VerticalChange;
+
+ // 防止拖出边界
+ if (left < 0) left = 0;
+ if (top < 0) top = 0;
+
+ Settings.Appearance.ChickenSoupPositionX = left;
+ Settings.Appearance.ChickenSoupPositionY = top;
+
+ BlackBoardWaterMark.Margin = new Thickness(left, top, 0, 0);
+ SaveSettingsToFile();
+ }
+ }
+
+ private void WaterMarkGrid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ if (WaterMarkGrid.IsHitTestVisible)
+ {
+ WaterMarkGrid.IsHitTestVisible = false;
+ BlackBoardWaterMark.Cursor = System.Windows.Input.Cursors.Arrow;
+ ShowNotification("位置已保存,已退出自定义位置模式。");
+ }
+ }"""
+
+new_str = """ private void UpdateChickenSoupPosition()
+ {
+ if (BlackBoardWaterMarkContainer == null) return;
+
+ if (double.IsNaN(Settings.Appearance.ChickenSoupPositionX) || double.IsNaN(Settings.Appearance.ChickenSoupPositionY))
+ {
+ // 默认右上角
+ BlackBoardWaterMarkContainer.HorizontalAlignment = System.Windows.HorizontalAlignment.Right;
+ BlackBoardWaterMarkContainer.VerticalAlignment = System.Windows.VerticalAlignment.Top;
+ BlackBoardWaterMarkContainer.Margin = new Thickness(0, 15, 25, 0);
+ }
+ else
+ {
+ BlackBoardWaterMarkContainer.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
+ BlackBoardWaterMarkContainer.VerticalAlignment = System.Windows.VerticalAlignment.Top;
+ BlackBoardWaterMarkContainer.Margin = new Thickness(Settings.Appearance.ChickenSoupPositionX, Settings.Appearance.ChickenSoupPositionY, 0, 0);
+ }
+ }
+
+ private void ButtonCustomChickenSoupPosition_Click(object sender, RoutedEventArgs e)
+ {
+ if (!isLoaded) return;
+
+ // 切换到自定义位置模式
+ WaterMarkGrid.IsHitTestVisible = true;
+ BlackBoardWaterMarkThumb.Cursor = System.Windows.Input.Cursors.SizeAll;
+
+ // 如果还未自定义过位置,先将对齐方式改为左上角,并计算当前实际位置
+ if (double.IsNaN(Settings.Appearance.ChickenSoupPositionX))
+ {
+ Point relativePoint = BlackBoardWaterMarkContainer.TransformToAncestor(WaterMarkGrid).Transform(new Point(0, 0));
+ Settings.Appearance.ChickenSoupPositionX = relativePoint.X;
+ Settings.Appearance.ChickenSoupPositionY = relativePoint.Y;
+ UpdateChickenSoupPosition();
+ }
+
+ // 隐藏设置面板,以便用户拖动
+ HideSubPanels();
+
+ // 提示用户
+ ShowNotification("已进入自定义位置模式,请拖动屏幕上的文本进行位置调整。再次点击任意工具栏按钮即可退出该模式。");
+ }
+
+ private void BlackBoardWaterMark_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
+ {
+ if (WaterMarkGrid.IsHitTestVisible)
+ {
+ double left = BlackBoardWaterMarkContainer.Margin.Left + e.HorizontalChange;
+ double top = BlackBoardWaterMarkContainer.Margin.Top + e.VerticalChange;
+
+ // 防止拖出边界
+ if (left < 0) left = 0;
+ if (top < 0) top = 0;
+
+ Settings.Appearance.ChickenSoupPositionX = left;
+ Settings.Appearance.ChickenSoupPositionY = top;
+
+ BlackBoardWaterMarkContainer.Margin = new Thickness(left, top, 0, 0);
+ SaveSettingsToFile();
+ }
+ }
+
+ private void WaterMarkGrid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ if (WaterMarkGrid.IsHitTestVisible)
+ {
+ WaterMarkGrid.IsHitTestVisible = false;
+ BlackBoardWaterMarkThumb.Cursor = System.Windows.Input.Cursors.Arrow;
+ ShowNotification("位置已保存,已退出自定义位置模式。");
+ }
+ }"""
+
+# Handle both \n and \r\n
+old_str_regex = re.escape(old_str).replace(r'\n', r'\r?\n')
+
+if re.search(old_str_regex, content):
+ content = re.sub(old_str_regex, new_str, content)
+ with open("Ink Canvas/MainWindow_cs/MW_Settings.cs", "w", encoding="utf-8") as f:
+ f.write(content)
+ print("Success")
+else:
+ print("Not found")
diff --git a/update_visibility.py b/update_visibility.py
new file mode 100644
index 00000000..b4c8b65f
--- /dev/null
+++ b/update_visibility.py
@@ -0,0 +1,19 @@
+import os
+import re
+
+files = [
+ "Ink Canvas/MainWindow_cs/MW_AutoFold.cs",
+ "Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs",
+ "Ink Canvas/MainWindow_cs/MW_Settings.cs"
+]
+
+for file in files:
+ with open(file, "r", encoding="utf-8") as f:
+ content = f.read()
+
+ new_content = content.replace("BlackBoardWaterMark.Visibility = ", "BlackBoardWaterMarkContainer.Visibility = ")
+
+ if new_content != content:
+ with open(file, "w", encoding="utf-8") as f:
+ f.write(new_content)
+ print(f"Updated {file}")