Skip to content

Release v1.3.3: 三语界面、主题图标与上传重试 - #4

Merged
SeaAndStars merged 32 commits into
masterfrom
dev
Oct 19, 2026
Merged

SeaAndStars merged 32 commits into
masterfrom
dev

Conversation

@SeaAndStars

Copy link
Copy Markdown
Owner

v1.3.3 发布

将 1.3.3 的全部改动合入 master。自 v1.3.1 以来的主要内容:

界面与多语言

  • 设置页新增语言选择:简体中文 / English / 繁體中文;选择即时生效并持久化,启动首帧前应用
  • 主窗口、子窗口、崩溃提示,以及上传、协作、翻译、合并冲突等动态提示与进度文案接入 i18n
  • 标签分类列随语言显示,文件内仍保存原始分类值
  • 主程序与更新程序新增浅色 / 深色圆角图标,随系统主题切换
  • 修复 Windows 11 深色窗口 1px 白边、通知条遮挡标题栏、管理图片文件列表缺分隔线

上传与打包

  • AList PUT 上传遇到连接重置 / 超时 / 5xx 时最多重试 3 次(指数退避);2xx 空响应不再当成成功
  • 批量上传中单个文件失败不再中断整批,返回每文件错误
  • 打包工具上传失败时显示服务端 message;413 给出明确提示
  • 新增上传重试测试(瞬时 5xx、连接中断、413 不重试、批量失败隔离)

CI / 测试

  • 覆盖率统计改为 scoped coverlet collector,CI 输出覆盖率摘要
  • 修复 SettingsViewModelFailureTests 在 en-US runner 下断言中文导致的失败(固定 zh-CN)
  • 本地 en-US 环境:100 tests passed

发布步骤

  • 三平台 CI 通过
  • 合并后打 v1.3.3 tag,触发 desktop-release 工作流
  • 校验 12 个平台产物

SeaAndStars and others added 30 commits August 18, 2025 13:36
Add LabeledTextBox control and improve label editing
This pull request introduces several improvements and new features to the LabelPlus_Next application, focusing on enhanced theming support, major usability upgrades to the PicViewer control (including new interaction modes and label management), and the addition of a centralized label management utility. The most important changes are grouped below:

Theming and Style Enhancements:

Added theme-aware resources and brushes to App.axaml, including a fallback color and dynamic brushes for the LabeledTextBox control, improving visual consistency across light and dark themes. (LabelPlus_Next/App.axaml [1] [2]
PicViewer Control Usability and API Improvements:

Introduced a new ViewerMode enum and a Mode property to PicViewer, enabling different interaction modes such as Browse, Label, Input, and Check. Added a SelectedLabel property and an AddLabelRequested event for more flexible label selection and creation workflows. (LabelPlus_Next/CustomControls/PicViewer.cs [1] [2]
Improved pointer and keyboard interaction logic in PicViewer: label addition is now possible in Label mode or by holding Ctrl, crosshair cursors provide better visual feedback, and label dragging and highlighting behaviors are more intuitive. (LabelPlus_Next/CustomControls/PicViewer.cs [1] [2] [3] [4] [5] [6]
Added synchronization between the external label selection and the overlay highlight, so UI selection state is always reflected visually. (LabelPlus_Next/CustomControls/PicViewer.cs [1] [2] [3]
Label Management and Undo Functionality:

Introduced a new LabelManager singleton class to centralize label operations and provide per-image undo stacks for label removal, allowing users to undo label deletions. (LabelPlus_Next/Models/LabelManager.cs LabelPlus_Next/Models/LabelManager.csR1-R52)
Added an UpdateHeader method to LabelFileManager for updating label group and comment metadata. (LabelPlus_Next/Models/LabelFileManager.cs LabelPlus_Next/Models/LabelFileManager.csR34-R40)
LabeledTextBox Rendering Improvements:

Updated the rendering logic in LabeledTextBox to ensure the index capsule background is drawn with the correct brush, and improved separator line drawing to avoid overlap with the capsule, ensuring better appearance with anti-aliasing and DPI scaling. (LabelPlus_Next/CustomControls/LabeledTextBox.cs [1] [2]
Project File Cleanup:

Removed an unnecessary folder reference from the project file. (LabelPlus_Next/LabelPlus_Next.csproj LabelPlus_Next/LabelPlus_Next.csprojL37-L40)
- surface PROPFIND failures in the tree with a retry action instead of
  leaving a blank pane while still reporting "连接成功"
- auto-detect AList's /dav endpoint, persist the corrected BaseUrl and
  re-anchor file:// hrefs returned for root-relative hrefs
- expand the root automatically after connecting
- load settings synchronously before binding, auto-save changes with a
  debounce, and flush pending edits on exit; the settings dialog now
  edits the main view model (single source of truth, includes ApiBaseUrl)
- use the site API root rather than the WebDAV /dav endpoint for API
  upload and publishing, fixing 401 from /dav/api/auth/login
Bring dev up to date with master (1.3.1) and the WebDAV tools fixes
from 565adc7: listing error reporting, settings auto-load/save and the
API base URL correction for publishing.
- locate Client/Update version files through the selected folder, the
  solution, or the repository root instead of requiring them in the
  chosen folder
- when a source project folder (for example LabelPlus_Next.Desktop) is
  selected, display its version and use the multi-platform build path
  instead of trying to zip the source tree
- refresh version info when the folder/solution fields lose focus and
  after browsing for a solution
- discover the published target-framework directory instead of assuming
  net9.0, fixing packaging on the current net10.0 projects
Resolve pack versions from the repository, show Project/Version for
source project folders, and auto-build multi-platform packages instead
of failing with the version/project empty error. Also discover the
actual publish target-framework output.
- log the running executable path and build time at startup so it is
  obvious whether the latest Tools binary is actually being used
- log pack mode, effective API base, and API login success/failure
  (never the password or token) to make 401/upload issues diagnosable
- run ZIP creation on a worker thread so large folders no longer freeze
  the window while "生成并上传" is running
- treat source project folders that happen to contain a version file
  (for example LabelPlus_Next.Update) as source code: use the
  multi-platform build path instead of zipping bin/obj and sources
- normalize TargetPath values that point at manifest.json to their
  directory, so uploads no longer land under a bogus
  /OneDrive2/Update/manifest.json/ path
- show the file size and actionable guidance when the server rejects an
  upload with 413 Request Entity Too Large
Keep the pack UI responsive by zipping on a worker thread, build source
project folders instead of zipping them, normalize TargetPath to a
directory, and add executable/build/API diagnostics plus 413 guidance.
…ders

- clear the Windows 11 DWM border colour for every app window that uses
  the custom ChromeTitleBar; this removes the 1px white line around
  BorderOnly windows while keeping the native resize border
- share the helper between the app and the updater
- add row separators to both file lists in the Manage Images dialog
Bump the client and updater versions for the window-chrome and image
list UI fixes.
Remove the Windows 11 white window edge, add row dividers to the
Manage Images file lists, and bump the client/updater version to 1.3.2.
…ML i18n

- add light/dark rounded-rectangle app icon tiles and switch them with the
  active theme in the main app and updater
- move the language selector from the Translate toolbar to the Settings page,
  persist the choice in settings.json, and apply it before the first paint
- route every XAML UI string through I18N resources (zh-CN / en / zh-Hant-TW)
  and localize the main window, dialog, crash-report, and settings messages
- add localized count/placeholder converters for dynamic XAML text
… edge

- offset window notifications below the custom title bar and top action row
- extend the client area and paint the DWM border with the theme background so
  the 1px white edge is not visible in dark mode; reapply on activation/theme change
- translate the label category column without changing the stored values
Add theme-aware app icons, the Settings language switch, full XAML
localization, and fix the update-toast overlap and dark-mode window edge.
- add a code-side UI string catalog and UiText.Tr for messages built in
  view models and services (Chinese-source keys with en / zh-Hant values)
- localize upload, teamwork, translate, settings, project, merge-conflict and
  file-error messages, including progress, notifications and dialogs
- add a category display converter and a localization unit test
- bump the client and updater versions to 1.3.3
Localize dynamic UI messages, add the code-side translation catalog,
and bump the client/updater version to 1.3.3.
… grips

- style the Semi button template presenter so the close caption turns red on
  hover/press (main app and updater)
- make the mode radio buttons two-way so selecting Label mode actually changes
  PicViewer.Mode and clicking the canvas adds labels again
- add a category colour bar to each label row in the text list
- show subtle always-visible divider lines and centred drag grips for both
  splitters in the editor
… bar

- move the category colour strip into the No. column, immediately left of the
  label number, instead of between No. and Text
- make the image-pane mode selector a wrapping segment with compact buttons so
  it does not clip when the splitter narrows the image pane
Fix the close-button hover, restore Label mode clicks, add label colour
bars and splitter grips, and make the mode bar wrap instead of clipping.
Large AList PUTs occasionally lose the TCP connection mid-body (SocketException 10054), which previously aborted the whole pack run after one attempt.

- retry transient upload failures up to 3 times with jittered backoff, rebuilding the request body for every attempt; 408/429/5xx are retried while 413 and other 4xx are permanent
- treat an empty 2xx response as a failure instead of reporting success
- return per-file failures from PutMany/SafeUpload rather than throwing away the batch
- show the underlying upload error in the pack tool status/log
- add local HttpListener tests covering 503 retry, connection reset retry, 413 no-retry, and give-up behavior
- add coverlet collector and coverlet.runsettings covering Models,
  Converters, ViewModels, Services, Shared, DeeplinkClients and Tools core,
  excluding UI/platform adapters and generated code
- switch CI coverage to coverlet and publish the scoped line rate
- add converter, model/NodeItem and merge-conflict tests
- initialise MergeConflictViewModel.SelectedConflictItem correctly and remove
  unused private diff helpers
Add scoped core-logic coverage tooling, initial converter/model/merge
tests, and the merge-conflict selection fix.
- wrap the upload header actions so Add/Refresh/Settings are never clipped
- refresh the upload project list when the page opens, guard refreshes with a
  busy flag and hide the idle progress bar
- show friendly access-denied/IO messages instead of a raw special-folder path
- guard TeamWork refreshes, reset IsBusy and coalesce duplicate load toasts
- refresh code-built nav labels and category cell text after language changes
- give the label colour strip a stable 32px height
Fix upload header overflow and refresh/progress state, coalesce TeamWork
toasts, and refresh localized nav/category text on language change.
- add writer/reader/header/store/round-trip tests for translation files
- cover LabelItem, ManifestV1, CollaborationSession, NoopFileDialogService,
  TranslationFileUtils, UpdateFiles and transfer progress
- cover UpdateVersion fallback/equal-prerelease, merge-conflict defaults and
  forced conflicts, MainWindowViewModel autosave/image helpers and tools
  settings/staged-installer edge cases
- exclude network/platform adapters from the core coverage scope
- fix CollaborationSession.RemoteDirectory to return "/" for a root-level file
Cover translation file formats, models, settings/update helpers and
narrow the core coverage scope to exclude network/platform adapters.
@gitguardian

gitguardian Bot commented Oct 19, 2026

Copy link
Copy Markdown

⚠️ GitGuardian has uncovered 1 secret following the scan of your pull request.

Please consider investigating the findings and remediating the incidents. Failure to do so may lead to compromising the associated services or software components.

🔎 Detected hardcoded secret in your pull request
GitGuardian id GitGuardian status Secret Commit Filename
20606471 Triggered Generic Password 62082a9 LabelPlus_Next.ApiServer/appsettings.json View secret
🛠 Guidelines to remediate hardcoded secrets
  1. Understand the implications of revoking this secret by investigating where it is used in your code.
  2. Replace and store your secret safely. Learn here the best practices.
  3. Revoke and rotate this secret.
  4. If possible, rewrite git history. Rewriting git history is not a trivial act. You might completely break other contributing developers' workflow and you risk accidentally deleting legitimate data.

To avoid such incidents in the future consider


🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.

@SeaAndStars
SeaAndStars merged commit 579f7cd into master Oct 19, 2026
7 of 9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants