Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
d8c814b
💾 Feat: 添加工作流脚本编辑器及相关功能
StardustSeemsInk Aug 3, 2025
c6b0c93
💾 Feat(WorkFlowScriptService): 初始化插件管理器并添加插件动态加载逻辑(旧逻辑,待适配新版本的库)
StardustSeemsInk Nov 8, 2025
bfffea4
💾 Feat: 更新目标框架至net10.0,添加插件服务提供者实现及插件响应事件处理逻辑
StardustSeemsInk Feb 13, 2026
724cbc4
🧩 Refactor(Dashboard): Use the KitX.Core and KitX.Core.Contract proje…
StardustSeemsInk Feb 20, 2026
73e6ab9
🐛 Fix(Settings_Personalise): Fix theme and language dropdowns not upd…
StardustSeemsInk Feb 21, 2026
53497dd
💾 🧩 Feat, Fix(Dashboard): 增强插件断开事件处理和工作流脚本支持
StardustSeemsInk Feb 25, 2026
54122b9
🐛 Fix: normalize Csharpell reference path casing for Linux
xihale Feb 25, 2026
075cfd7
Merge pull request #35 from xihale/fix/linux-reference-casing
Dynesshely Feb 25, 2026
2d988fc
🧩 Refactor(ViewModelBase): 将服务属性更改为静态以提高访问效率,并移除过时的配置方法
StardustSeemsInk Mar 10, 2026
3c641a6
🔧 Fix(RepoPage): To make sure the plugin can be correctly identified …
StardustSeemsInk Mar 15, 2026
98ea570
💾 Feat(Workflow): 进一步实现Workflow编辑器功能
StardustSeemsInk Mar 18, 2026
badd54f
🎇 🧩 Style, Refactor(Dashboard): 优化初始化流程、DI容器注册机制;统一ITaskService的使用原则
StardustSeemsInk Mar 19, 2026
a141fee
💾 Feat(WorkflowScriptEditor): 添加块脚本模式支持,更新模板代码和辅助函数初始化
StardustSeemsInk Mar 24, 2026
6404963
💾 Feat(Workflow): Add Blueprint Editor functionality and UI integration
StardustSeemsInk Mar 30, 2026
3c66964
💾 Feat(BlueprintEditor): 添加连接器颜色渲染功能,优化蓝图节点脚本
StardustSeemsInk Apr 1, 2026
eb4619c
💾 Feat(BlueprintEditor): 添加三阶段渲染功能,优化蓝图加载和连接器颜色应用
StardustSeemsInk Apr 4, 2026
ae41aa0
🧩 Refactor(Blueprint): 优化代码结构
StardustSeemsInk Apr 5, 2026
18dd941
🧩 Refactor(Blueprint): 引入节点注册表与策略模式,消除(添加新内置节点时的)散弹式修改
StardustSeemsInk Apr 6, 2026
985987a
💾 Feat(BlueprintEditor): 添加蓝图节点样式和连接器属性,优化节点和引脚的视觉表现
StardustSeemsInk Apr 6, 2026
2c2cb3b
🧩 Refactor(Blueprint): 将前端节点编辑器库替换为NotifyM.Avalonia
StardustSeemsInk Apr 7, 2026
981ce81
💾 Feat(Blueprint): Implement scope blocks in Blueprint Editor
StardustSeemsInk Apr 9, 2026
57b8415
💾 Feat(Blueprint): 添加WorkflowEditor与BlueprintEditor之间的桥接功能,支持脚本导入导出和执…
StardustSeemsInk Apr 9, 2026
af1f910
💾 Feat(Blueprint): 实现动态类型推断、变量节点 UI 与常量同步
StardustSeemsInk Apr 9, 2026
d951f6c
💾 Feat(Blueprint): 修复 Branch 端口排序与编辑器防抖
StardustSeemsInk Apr 9, 2026
f8c7e83
💾 Feat(Blueprint): 实现节点面板动态获取插件与Helper函数列表
StardustSeemsInk Apr 10, 2026
7861beb
💾 Feat(Blueprint): 添加节点重命名功能和上下文菜单支持
StardustSeemsInk Apr 10, 2026
a1fb4d7
🔧 Fix(App): 将服务获取日志级别从信息更改为调试
StardustSeemsInk Apr 10, 2026
09578e2
📝 Chore(Dashboard): 升级 Avalonia 至 11.3.13、FluentAvaloniaUI 至 2.5.1 等依…
StardustSeemsInk Apr 10, 2026
ca88bbf
🔧 Fix(Dashboard): 清理编译警告
StardustSeemsInk Apr 11, 2026
83526d0
💾 Feat(Workflow): 重写 WorkflowPage 管理面板,实现卡片网格 CRUD 布局,接入统一存储服务,添加编辑器窗…
StardustSeemsInk Apr 11, 2026
15af4fa
💾 Feat(Workflow): 初步完成Workflow管理面板,实现BS/BP综合编辑器
StardustSeemsInk Apr 11, 2026
b51d863
💾 Feat(Workflow): 修复编辑器元数据即时同步,WorkflowEditorWindow 及工作流面板全面 i18n 化
StardustSeemsInk Apr 12, 2026
0eab124
🔧 Fix(RepoPage): 修复插件列表首次加载不刷新及拖拽导入竞态问题,订阅 PluginStatusChanged 事件实现运行…
StardustSeemsInk Apr 12, 2026
a333b99
💾 Feat(Workflow): 添加插件触发器支持,更新工作流编辑器以处理插件事件触发,增强动态节点创建功能
StardustSeemsInk Apr 13, 2026
6087f85
📄 Docs: 修正通信协议文档中的默认端口值,更新为实际代码中的配置,确保与旧文档一致性
StardustSeemsInk Apr 18, 2026
4b48a1b
🧩Refactor: 拆分 ISecurityService 接口为 IDeviceKeyService 和 IEncryptionSer…
StardustSeemsInk Apr 19, 2026
7827baa
🧩 Refactor: 统一服务获取方式,使用 ServiceHost 代替 App.GetService,确保服务实例一致性
StardustSeemsInk Apr 20, 2026
37e430e
🔧 Fix(Dashboard): Dashboard 业务逻辑 - 异常处理、忙等待、参数传递修复
StardustSeemsInk Apr 27, 2026
409e383
🧩 Refactor: 更新服务注册和依赖注入,优化插件功能和触发器的刷新逻辑
StardustSeemsInk Apr 27, 2026
e5d7e95
🧩 Refactor: 重构服务初始化逻辑,移除 Instances 类,改为通过 DI 容器获取服务实例
StardustSeemsInk May 2, 2026
52ab897
🧩 Refactor: 移除未使用的 IScriptExecutionService 和 IMainProgramAnalyzer,简化 …
StardustSeemsInk May 5, 2026
0e03058
💾🧩 Feat, Refactor(Debug, Blueprint): 实现蓝图逐步调试UI与数据连接器悬浮值显示
StardustSeemsInk May 17, 2026
2c4135a
🧩 Refactor(BluePrint): 移除蓝图编辑器中未使用的节点类型推断和有效引脚类型确定逻辑
StardustSeemsInk May 17, 2026
168eb05
🧩 Refactor(Blueprint): 重构蓝图节点处理逻辑,支持内置函数的重命名和颜色分类
StardustSeemsInk May 18, 2026
5514aba
🎇 Style(Dashboard): 安全性修复/错误捕捉能力增强
StardustSeemsInk Jun 13, 2026
cf980d0
🧩 Refactor(Workflow): 适配 KitX.Workflow 独立库-App.axaml.cs 改用 ITriggerMa…
StardustSeemsInk Jun 15, 2026
aea1428
Merge pull request #37 from Crequency/dev=Workflow-Sep
StardustSeemsInk Jun 17, 2026
7a62cc7
🔧 Fix(Workflow): 修复颜色写死问题,全面跟随动态明暗主题/主题色设置。
StardustSeemsInk Jun 17, 2026
f49d187
🧩 Refactor(Workflow): 删除遗留双窗口编辑器、清理 bridge 死代码、填补 HelperFunctions 鸿沟
StardustSeemsInk Jun 17, 2026
11e7d6e
💾 Feat(WorkflowEditor): 修框选崩溃 + 前端呈现优化
StardustSeemsInk Jun 17, 2026
bbf4ce2
💾 Feat(Workflow): 添加实时活动日志,仅在调试版本中可见,记录工作流事件
StardustSeemsInk Jun 19, 2026
3622125
💾 Feat(Dashboard): 工作流页面活动日志增加执行输出与可调高度
StardustSeemsInk Jun 19, 2026
c000afb
💾 Feat(BlueprintEditor): 添加字符串连接节点功能,支持动态扩展输入引脚
StardustSeemsInk Jun 19, 2026
bc23747
🧩 Refactor(Dashboard): 提炼通用变长端口机制,StringConcat 迁移至标志驱动
StardustSeemsInk Jun 19, 2026
5d5fff9
🧩 Refactor(Workflow): 同步Abstractions命名空间using-代码组织重构
StardustSeemsInk Jun 20, 2026
7311968
🧩 Refactor(Workflow): 同步WorkflowOutput至Services命名空间-代码组织重构阶段L11
StardustSeemsInk Jun 20, 2026
419bb97
🔧 Fix(WorkflowPageViewModel): 更新日志输出以包含触发器类型的默认值
StardustSeemsInk Jun 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 0 additions & 11 deletions KitX Dashboard Core/KitX.Dashboard.Core.csproj

This file was deleted.

2 changes: 0 additions & 2 deletions KitX Dashboard Core/Program.cs

This file was deleted.

154 changes: 79 additions & 75 deletions KitX Dashboard/App.axaml
Original file line number Diff line number Diff line change
@@ -1,75 +1,79 @@
<Application x:Class="KitX.Dashboard.App"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:fluent="using:FluentAvalonia.UI.Media"
xmlns:local="using:KitX.Dashboard"
xmlns:materialIcons="using:Material.Icons.Avalonia"
xmlns:sty="using:FluentAvalonia.Styling">

<Application.DataTemplates>
<local:ViewLocator/>
</Application.DataTemplates>

<Application.Resources>
<ResourceDictionary>
<SolidColorBrush x:Key="ThemePrimaryAccent" Color="#FF3873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparentAA" Color="#AA3873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparentBB" Color="#BB3873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparentCC" Color="#CC3873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparentDD" Color="#DD3873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparentEE" Color="#EE3873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent99" Color="#993873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent88" Color="#883873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent77" Color="#773873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent66" Color="#663873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent55" Color="#553873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent44" Color="#443873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent33" Color="#333873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent22" Color="#223873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent11" Color="#113873D9"/>

<FontFamily x:Key="SarasaMonoCL">avares://KitX.Dashboard.Fonts/sarasa-mono-cl-regular.ttf#Sarasa Mono CL</FontFamily>
<FontFamily x:Key="SourceHanSans">avares://KitX.Dashboard.Fonts/SourceHanSans-VF.ttf#Source Han Sans VF</FontFamily>

<ResourceDictionary.MergedDictionaries>

</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>

<Application.Styles>
<sty:FluentAvaloniaTheme/>
<materialIcons:MaterialIconStyles/>

<StyleInclude Source="avares://AvaloniaEdit/Themes/Fluent/AvaloniaEdit.xaml"/>
<StyleInclude Source="avares://AvaloniaProgressRing/Styles/ProgressRing.xaml"/>
<StyleInclude Source="/Styles/FontsStyles.axaml"/>
</Application.Styles>

<TrayIcon.Icons>
<TrayIcons>
<TrayIcon Command="{Binding TrayIconClickedCommand}"
Icon="resm:KitX.Dashboard.Assets.KitX-Icon-256x256.ico"
IsVisible="True"
ToolTipText="{Binding TrayIconText}">
<TrayIcon.Menu>
<NativeMenu>
<NativeMenuItem Command="{Binding TrayIconClickedCommand}" Header="{DynamicResource Text_Public_ShowMainWindow}"/>
<NativeMenuItem Command="{Binding PluginLauncherCommand}" Header="{DynamicResource Text_Public_ShowLauncherWindow}"/>
<NativeMenuItemSeparator/>
<NativeMenuItem Command="{Binding ViewLatestAnnouncementsCommand}" Header="{DynamicResource Text_Public_ShowAnnouncements}"/>
<NativeMenuItem Header="{DynamicResource Text_Public_More}">
<NativeMenu>
<NativeMenuItem Command="{Binding OpenDebugToolCommand}" Header="{DynamicResource Text_Settings_General_OpenDebugTool}"/>
<NativeMenuItemSeparator/>
<NativeMenuItem Command="{Binding RestartCommand}" Header="{DynamicResource Text_Public_Restart}"/>
</NativeMenu>
</NativeMenuItem>
<NativeMenuItemSeparator/>
<NativeMenuItem Command="{Binding ExitCommand}" Header="{DynamicResource Text_Public_Exit}"/>
</NativeMenu>
</TrayIcon.Menu>
</TrayIcon>
</TrayIcons>
</TrayIcon.Icons>
</Application>
<Application x:Class="KitX.Dashboard.App"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:fluent="using:FluentAvalonia.UI.Media"
xmlns:local="using:KitX.Dashboard"
xmlns:vm="using:KitX.Dashboard.ViewModels"
xmlns:conv="using:KitX.Dashboard.Converters"
xmlns:materialIcons="using:Material.Icons.Avalonia"
xmlns:sty="using:FluentAvalonia.Styling">

<Application.DataTemplates>
<local:ViewLocator/>
</Application.DataTemplates>

<Application.Resources>
<ResourceDictionary>
<SolidColorBrush x:Key="ThemePrimaryAccent" Color="#FF3873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparentAA" Color="#AA3873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparentBB" Color="#BB3873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparentCC" Color="#CC3873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparentDD" Color="#DD3873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparentEE" Color="#EE3873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent99" Color="#993873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent88" Color="#883873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent77" Color="#773873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent66" Color="#663873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent55" Color="#553873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent44" Color="#443873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent33" Color="#333873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent22" Color="#223873D9"/>
<SolidColorBrush x:Key="ThemePrimaryAccentTransparent11" Color="#113873D9"/>

<FontFamily x:Key="SarasaMonoCL">avares://KitX.Dashboard.Fonts/sarasa-mono-cl-regular.ttf#Sarasa Mono CL</FontFamily>
<FontFamily x:Key="SourceHanSans">avares://KitX.Dashboard.Fonts/SourceHanSans-VF.ttf#Source Han Sans VF</FontFamily>

<ResourceDictionary.MergedDictionaries>

</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>

<Application.Styles>
<sty:FluentAvaloniaTheme/>
<materialIcons:MaterialIconStyles/>

<StyleInclude Source="avares://AvaloniaEdit/Themes/Fluent/AvaloniaEdit.xaml"/>
<StyleInclude Source="avares://AvaloniaProgressRing/Styles/ProgressRing.xaml"/>
<StyleInclude Source="avares://NodifyM.Avalonia/Styles/ControlStyles.axaml"/>
<StyleInclude Source="/Styles/BlueprintNodeStyles.axaml"/>
<StyleInclude Source="/Styles/FontsStyles.axaml"/>
</Application.Styles>

<TrayIcon.Icons>
<TrayIcons>
<TrayIcon Command="{Binding TrayIconClickedCommand}"
Icon="resm:KitX.Dashboard.Assets.KitX-Icon-256x256.ico"
IsVisible="True"
ToolTipText="{Binding TrayIconText}">
<TrayIcon.Menu>
<NativeMenu>
<NativeMenuItem Command="{Binding TrayIconClickedCommand}" Header="{DynamicResource Text_Public_ShowMainWindow}"/>
<NativeMenuItem Command="{Binding PluginLauncherCommand}" Header="{DynamicResource Text_Public_ShowLauncherWindow}"/>
<NativeMenuItemSeparator/>
<NativeMenuItem Command="{Binding ViewLatestAnnouncementsCommand}" Header="{DynamicResource Text_Public_ShowAnnouncements}"/>
<NativeMenuItem Header="{DynamicResource Text_Public_More}">
<NativeMenu>
<NativeMenuItem Command="{Binding OpenDebugToolCommand}" Header="{DynamicResource Text_Settings_General_OpenDebugTool}"/>
<NativeMenuItemSeparator/>
<NativeMenuItem Command="{Binding RestartCommand}" Header="{DynamicResource Text_Public_Restart}"/>
</NativeMenu>
</NativeMenuItem>
<NativeMenuItemSeparator/>
<NativeMenuItem Command="{Binding ExitCommand}" Header="{DynamicResource Text_Public_Exit}"/>
</NativeMenu>
</TrayIcon.Menu>
</TrayIcon>
</TrayIcons>
</TrayIcon.Icons>
</Application>
121 changes: 111 additions & 10 deletions KitX Dashboard/App.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,115 @@
using Avalonia.Media.Imaging;
using Avalonia.Styling;
using Common.BasicHelper.Utils.Extensions;
using KitX.Dashboard.Managers;
using KitX.Core.Announcement;
using KitX.Core.Contract.Announcement;
using KitX.Core.Contract.Configuration;
using KitX.Core.Contract.Event;
using KitX.Core.Contract.Workflow;
using KitX.Core.DI;
using KitX.Core.Event;
using KitX.Dashboard.Services;
using KitX.Dashboard.ViewModels;
using KitX.Dashboard.ViewModels.Pages.Controls;
using KitX.Dashboard.Views;
using LiveChartsCore;
using LiveChartsCore.SkiaSharpView;
using Microsoft.Extensions.DependencyInjection;
using Serilog;

using ServiceHost = KitX.Core.DI.ServiceHost;

namespace KitX.Dashboard;

public partial class App : Application
{
/// <summary>
/// Initialize DI container before UI framework starts
/// This should be called from AppFramework.RunFramework() before any UI code runs
/// Note: This is now called BEFORE Logger initialization (Phase 2 refactoring).
/// Log.Debug() calls in service constructors (e.g., ConfigManager) are no-ops
/// until Serilog Logger is configured later in RunFramework().
/// </summary>
internal static void InitializeServiceProvider()
{
if (ServiceHost.IsInitialized)
return;

Log.Information("Initializing service provider...");

// Initialize service provider with Core services
var services = new ServiceCollection();

// Register Core services from KitX.Core
services.AddCoreServices();

// Register Dashboard-specific services
services.AddSingleton<IFileDialogService, FileDialogService>();

// Register SignalTasksManager for signal-based coordination
services.AddSingleton<Common.BasicHelper.Core.TaskSystem.SignalTasksManager>();

// Register Dashboard ViewModels (for DI auto-resolution without ActivatorUtilities fallback)
services.AddTransient<WorkflowScriptEditorWindowViewModel>();
services.AddTransient<DebugWindowViewModel>();
services.AddTransient<BlueprintEditorViewModel>();
services.AddTransient<Settings_GeneralViewModel>();
services.AddTransient<Settings_PerformenceViewModel>();

// Build the SINGLE IServiceProvider — no duplicate BuildServiceProvider calls
var provider = services.BuildServiceProvider();

// Initialize ServiceHost with the single provider (centralized service access)
ServiceHost.Initialize(provider);

// Initialize the workflow library's own service locator with the same provider,
// so workflow code created outside DI (builtin functions, lazy singletons) can
// resolve shared services (IPluginService, IDeviceServer, workflow services, ...).
KitX.Workflow.Hosting.ServiceLocator.Initialize(provider);

// Pre-resolve the plugin manager bridge to force eager singleton construction
// (the concrete RealPluginManager subscribes to plugin events in its ctor).
var rpm = provider.GetRequiredService<IRealPluginManagerBridge>();
Log.Information("RealPluginManager pre-resolved. HashCode: {HashCode}", rpm.GetHashCode());

// Initialize TriggerManager from persisted workflow configurations
var triggerManager = provider.GetRequiredService<ITriggerManager>();
triggerManager.InitializeFromPersistedWorkflows();

Log.Information("Service provider initialized.");
}

/// <summary>
/// Gets service from DI container.
/// Throws if the service is not registered — all types must be explicitly registered.
/// </summary>
public static T GetService<T>() where T : class
{
Log.Debug($"Getting service: {typeof(T).Name}");

if (!ServiceHost.IsInitialized)
{
Log.Warning("ServiceHost not initialized, initializing now (this should not happen in normal flow)...");
InitializeServiceProvider();
}

var service = ServiceHost.ServiceProvider.GetService(typeof(T));
if (service != null)
return (T)service;

// Service not registered — throw to make missing registrations visible at runtime
throw new InvalidOperationException(
$"Service '{typeof(T).Name}' is not registered in the DI container. " +
"Ensure it is added via services.AddSingleton/AddTransient/AddScoped in InitializeServiceProvider()."
);
}

public static Bitmap? DefaultIcon
{
get
{
var path = Path.Combine(ConstantTable.AssetsPath, ConfigManager.Instance.AppConfig.App.CoverIconFileName).GetFullPath();
var configService = GetService<IConfigService>();
var path = Path.Combine(ConstantTable.AssetsPath, configService.AppConfig.App.CoverIconFileName).GetFullPath();

if (Design.IsDesignMode)
return null;
Expand Down Expand Up @@ -57,7 +149,8 @@ public override void Initialize()

private void LoadTheme()
{
RequestedThemeVariant = ConfigManager.Instance.AppConfig.App.Theme switch
var configService = GetService<IConfigService>();
RequestedThemeVariant = configService.AppConfig.App.Theme switch
{
"Light" => ThemeVariant.Light,
"Dark" => ThemeVariant.Dark,
Expand All @@ -68,7 +161,8 @@ private void LoadTheme()

private void LoadLanguage()
{
var config = ConfigManager.Instance.AppConfig;
var configService = GetService<IConfigService>();
var config = configService.AppConfig;
var lang = config.App.AppLanguage;
var backup_lang = config.App.SurpportLanguages.Keys.First();
var path = $"{ConstantTable.LanguageFilePath}/{lang}.axaml".GetFullPath();
Expand Down Expand Up @@ -106,7 +200,8 @@ private void LoadLanguage()

try
{
EventService.Invoke(nameof(EventService.LanguageChanged));
var eventService = GetService<IEventService>();
eventService.Publish(EventNames.LanguageChanged, EventArgs.Empty);
}
catch (Exception e)
{
Expand All @@ -116,7 +211,8 @@ private void LoadLanguage()

private static void CalculateThemeColor()
{
Color c = Color.Parse(ConfigManager.Instance.AppConfig.App.ThemeColor);
var configService = GetService<IConfigService>();
Color c = Color.Parse(configService.AppConfig.App.ThemeColor);

if (Current is not null)
{
Expand Down Expand Up @@ -147,15 +243,16 @@ private static void InitializeLiveCharts()
);
}

EventService.ThemeConfigChanged += () =>
var eventService = GetService<IEventService>();
eventService.Subscribe(EventNames.ThemeConfigChanged, (s, e) =>
{
var usingLightTheme = Current?.ActualThemeVariant == ThemeVariant.Light;

LiveCharts.Configure(config =>
{
config = usingLightTheme ? config.AddLightTheme() : config.AddDarkTheme();
});
};
});
}

public override void OnFrameworkInitializationCompleted()
Expand All @@ -167,8 +264,12 @@ public override void OnFrameworkInitializationCompleted()
desktop.MainWindow = new MainWindow { DataContext = new MainWindowViewModel() };
}

if (ConfigManager.Instance.AppConfig.App.ShowAnnouncementWhenStart)
new Thread(async () => await AnnouncementManager.CheckNewAnnouncements()).Start();
var configService = GetService<IConfigService>();
if (configService.AppConfig.App.ShowAnnouncementWhenStart)
{
var announcementService = GetService<IAnnouncementService>();
new Thread(async () => await announcementService.CheckNewAnnouncementsAsync()).Start();
}

base.OnFrameworkInitializationCompleted();
}
Expand Down
Loading
Loading