Skip to content

Commit

Permalink
add EditorLayoutManager
Browse files Browse the repository at this point in the history
  • Loading branch information
MikiraSora committed Sep 28, 2024
1 parent 64d6afa commit f4fadf5
Show file tree
Hide file tree
Showing 14 changed files with 207 additions and 3 deletions.
3 changes: 3 additions & 0 deletions OngekiFumenEditor/App.config
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@
<setting name="EnableMultiInstances" serializeAs="String">
<value>False</value>
</setting>
<setting name="IsFirstTimeOpenEditor" serializeAs="String">
<value>True</value>
</setting>
</OngekiFumenEditor.Properties.ProgramSetting>
<OngekiFumenEditor.Properties.LogSetting>
<setting name="LogFileDirPath" serializeAs="String">
Expand Down
88 changes: 88 additions & 0 deletions OngekiFumenEditor/Kernel/EditorLayout/EditorLayoutManager.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
using Caliburn.Micro;
using Gemini.Framework.Services;
using Gemini.Modules.Shell.Services;
using Gemini.Modules.Shell.ViewModels;
using Gemini.Modules.Shell.Views;
using OngekiFumenEditor.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.IO;
using System.IO.Pipelines;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace OngekiFumenEditor.Kernel.EditorLayout
{
[Export(typeof(IEditorLayoutManager))]
public class EditorLayoutManager : IEditorLayoutManager
{
[Import]
private ILayoutItemStatePersister layoutItemStatePersister;

public bool TryGetDependices(out IShell shell, out IShellView shellView)
{
shell = IoC.Get<IShell>();
shellView = default;

if (shell is ShellViewModel)
{
if (shell.GetType().GetField("_shellView", BindingFlags.NonPublic | BindingFlags.Instance)
is FieldInfo fieldInfo)
shellView = fieldInfo.GetValue(shell) as IShellView;
else
Log.LogError($"shell object is ShellViewModel but can not locate IShellView object");
}

return shell != null && shellView != null;
}

public async Task<bool> LoadLayout(Stream intputLayoutDataStream)
{
var tempFilePath = TempFileHelper.GetTempFilePath("layout", "layout");
{
using var fs = File.OpenWrite(tempFilePath);
await intputLayoutDataStream.CopyToAsync(fs);
}

try
{
if (!TryGetDependices(out var shell, out var shellView))
return false;

return layoutItemStatePersister.LoadState(shell, shellView, tempFilePath);
}
catch (Exception e)
{
Log.LogError($"Can't load and apply program layout:{e.Message}", e);
return false;
}
}

public async Task<bool> SaveLayout(Stream outputLayoutDataStream)
{
var tempFilePath = TempFileHelper.GetTempFilePath("layout", "layout");

try
{
if (!TryGetDependices(out var shell, out var shellView))
return false;

var r = layoutItemStatePersister.SaveState(shell, shellView, tempFilePath);
if (!r)
return false;
using var fs = File.OpenRead(tempFilePath);
await fs.CopyToAsync(outputLayoutDataStream);
return true;
}
catch (Exception e)
{
Log.LogError($"Can't save current program layout:{e.Message}", e);
return false;
}
}
}
}
17 changes: 17 additions & 0 deletions OngekiFumenEditor/Kernel/EditorLayout/IEditorLayoutManager.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OngekiFumenEditor.Kernel.EditorLayout
{
public interface IEditorLayoutManager
{
Task<bool> SaveLayout(Stream outputLayoutDataStream);
Task<bool> LoadLayout(Stream intputLayoutDataStream);

//Task CheckAndNotifyUserUseSuggestLayout();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@
Margin="10,0,10,10"
Content="{markup:Translate [EnableMultiInstances]}"
IsChecked="{Binding Setting.EnableMultiInstances}" />
<CheckBox
Margin="10,0,10,10"
Content="{markup:Translate [DisableShowSplashScreenAfterBoot]}"
IsChecked="{Binding Setting.DisableShowSplashScreenAfterBoot}" />
</StackPanel>
</GroupBox>
<GroupBox Margin="5" Header="{markup:Translate [CrashDumpFile]}">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using OngekiFumenEditor.Base;
using OngekiFumenEditor.Base.OngekiObjects.ConnectableObject;
using OngekiFumenEditor.Kernel.Audio;
using OngekiFumenEditor.Kernel.EditorLayout;
using OngekiFumenEditor.Kernel.RecentFiles;
using OngekiFumenEditor.Kernel.Scheduler;
using OngekiFumenEditor.Modules.FumenObjectPropertyBrowser;
Expand Down Expand Up @@ -208,6 +209,8 @@ protected override async Task DoNew()
AudioPlayer = await IoC.Get<IAudioManager>().LoadAudioAsync(editorProjectData.AudioFilePath);
Log.LogInfo($"FumenVisualEditorViewModel DoNew()");
await Dispatcher.Yield();

CheckAndAdviceSuggestLayout();
}
catch (Exception e)
{
Expand Down Expand Up @@ -248,6 +251,8 @@ public async Task Load(EditorProjectDataModel projModel)

var dispTGrid = TGridCalculator.ConvertAudioTimeToTGrid(projModel.RememberLastDisplayTime, this);
ScrollTo(dispTGrid);

CheckAndAdviceSuggestLayout();
}
catch (Exception e)
{
Expand Down Expand Up @@ -338,5 +343,22 @@ public override async Task TryCloseAsync(bool? dialogResult = null)
}

#endregion

private async void CheckAndAdviceSuggestLayout()
{
if (!ProgramSetting.Default.IsFirstTimeOpenEditor)
return;

if (MessageBox.Show(Resources.ShouldLoadSuggestLayout, Resources.Suggest, MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
using var stream = ResourceUtils.OpenReadFromLocalAssemblyResourcesFolder("suggestLayout.bin");
var result = await IoC.Get<IEditorLayoutManager>().LoadLayout(stream);
if (!result)
MessageBox.Show(Resources.LoadLayoutFailed);
}

ProgramSetting.Default.IsFirstTimeOpenEditor = false;
ProgramSetting.Default.Save();
}
}
}
3 changes: 2 additions & 1 deletion OngekiFumenEditor/OngekiFumenEditor.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebugType>full</DebugType>
<DefineConstants>$(DefineConstants);PLAYFIELD_DEBUG</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
Expand All @@ -35,6 +34,7 @@
<Page Remove="Modules\FumenBulletPalleteListViewer\Converters\**" />
<Page Remove="_bin\**" />
<None Remove="Modules\FumenVisualEditor\Views\OngekiObjects\playerLoc.png" />
<None Remove="Resources\suggestLayout.bin" />
<Resource Include="Modules\FumenVisualEditor\Views\OngekiObjects\playerLoc.png" />
</ItemGroup>

Expand Down Expand Up @@ -145,6 +145,7 @@
<EmbeddedResource Include="Resources\empty_ogkr_template.ogkr" />
<EmbeddedResource Include="Resources\Music.xml" />
<EmbeddedResource Include="Resources\MusicSource.xml" />
<EmbeddedResource Include="Resources\suggestLayout.bin" />
<EmbeddedResource Include="Resources\ui_jacket_0666" />
</ItemGroup>

Expand Down
14 changes: 13 additions & 1 deletion OngekiFumenEditor/Properties/ProgramSetting.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions OngekiFumenEditor/Properties/ProgramSetting.settings
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,8 @@
<Setting Name="EnableMultiInstances" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="IsFirstTimeOpenEditor" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
</Settings>
</SettingsFile>
27 changes: 27 additions & 0 deletions OngekiFumenEditor/Properties/Resources.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions OngekiFumenEditor/Properties/Resources.ja.resx
Original file line number Diff line number Diff line change
Expand Up @@ -1518,4 +1518,13 @@
<data name="XOffset" xml:space="preserve">
<value>水平スクロールオフセット</value>
</data>
<data name="DisableShowSplashScreenAfterBoot" xml:space="preserve">
<value>プログラムの起動後に起動ウィンドウのインターフェイスが表示されない</value>
</data>
<data name="ShouldLoadSuggestLayout" xml:space="preserve">
<value>初めてエディタを開いたときに、推奨されるツール レイアウトをロードしますか?</value>
</data>
<data name="LoadLayoutFailed" xml:space="preserve">
<value>レイアウトファイルの読み込みに失敗しました</value>
</data>
</root>
9 changes: 9 additions & 0 deletions OngekiFumenEditor/Properties/Resources.resx
Original file line number Diff line number Diff line change
Expand Up @@ -1527,4 +1527,13 @@
<data name="EnableShowPlayerLocation" xml:space="preserve">
<value>Display the player's current position (if there is no AutoPlayFaderLane, it defaults to the center)</value>
</data>
<data name="DisableShowSplashScreenAfterBoot" xml:space="preserve">
<value>SplashScreen does not display after program startup</value>
</data>
<data name="ShouldLoadSuggestLayout" xml:space="preserve">
<value>It's first time that the editor is opened. Should loaded the recommended tools layout?</value>
</data>
<data name="LoadLayoutFailed" xml:space="preserve">
<value>Failed to load layout file</value>
</data>
</root>
9 changes: 9 additions & 0 deletions OngekiFumenEditor/Properties/Resources.zh-Hans.resx
Original file line number Diff line number Diff line change
Expand Up @@ -1527,4 +1527,13 @@
<data name="EnableShowPlayerLocation" xml:space="preserve">
<value>显示玩家当前位置 (若没AutoPlayFaderLane轨道则默认在中心)</value>
</data>
<data name="DisableShowSplashScreenAfterBoot" xml:space="preserve">
<value>程序启动后不显示启动窗口</value>
</data>
<data name="ShouldLoadSuggestLayout" xml:space="preserve">
<value>第一次打开编辑器,是否加载推荐的做谱工具布局?</value>
</data>
<data name="LoadLayoutFailed" xml:space="preserve">
<value>加载布局文件失败</value>
</data>
</root>
Binary file added OngekiFumenEditor/Resources/suggestLayout.bin
Binary file not shown.
2 changes: 1 addition & 1 deletion OngekiFumenEditor/Utils/ResourceUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace OngekiFumenEditor.Utils
{
public static class ResourceUtils
{
public static Stream OpenReadFromLocalAssemblyResource(string resourceName) => typeof(ResourceUtils).Assembly.GetManifestResourceStream("OngekiFumenEditor.Resources." + resourceName);
public static Stream OpenReadFromLocalAssemblyResourcesFolder(string resourceName) => typeof(ResourceUtils).Assembly.GetManifestResourceStream("OngekiFumenEditor.Resources." + resourceName);

public static Stream OpenReadResourceStream(string relativeUrl)
{
Expand Down

0 comments on commit f4fadf5

Please sign in to comment.