Merge all changes from the libaegisub branch into trunk, the effective range is r4175:4330. All options have been re-done and now use Cajun to support a json-backed format.
Initial support for low-level access and file I/O methods are included as well. Originally committed to SVN as r4331.
This commit is contained in:
parent
23972b10bc
commit
40e12403d5
141 changed files with 6681 additions and 2960 deletions
|
@ -14,6 +14,7 @@ ffmpegsource = libffms
|
||||||
endif
|
endif
|
||||||
|
|
||||||
SUBDIRS = \
|
SUBDIRS = \
|
||||||
|
libaegisub \
|
||||||
$(ffmpegsource) \
|
$(ffmpegsource) \
|
||||||
$(libass) \
|
$(libass) \
|
||||||
$(univchardet) \
|
$(univchardet) \
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
<Configuration
|
<Configuration
|
||||||
Name="Debug|Win32"
|
Name="Debug|Win32"
|
||||||
ConfigurationType="1"
|
ConfigurationType="1"
|
||||||
InheritedPropertySheets=".\suffix_debug32.vsprops;.\wxlib_include.vsprops;.\wxlib_lib32.vsprops;.\libraries_outdirs.vsprops;.\contrib_includedirs.vsprops;.\aegisub_exe_filename.vsprops;.\ffms2_lib_include_dir.vsprops;.\compiler_options.vsprops;.\compiler_options_debug.vsprops;.\svn_rev_header_update.vsprops;.\delayload_portaudio_32.vsprops;.\delayload_openal_32.vsprops"
|
InheritedPropertySheets=".\suffix_debug32.vsprops;.\wxlib_include.vsprops;.\wxlib_lib32.vsprops;.\libraries_outdirs.vsprops;.\contrib_includedirs.vsprops;.\aegisub_exe_filename.vsprops;.\ffms2_lib_include_dir.vsprops;.\compiler_options.vsprops;.\compiler_options_debug.vsprops;.\svn_rev_header_update.vsprops;.\delayload_portaudio_32.vsprops;.\delayload_openal_32.vsprops;.\libaegisub_include_dir.vsprops"
|
||||||
CharacterSet="1"
|
CharacterSet="1"
|
||||||
>
|
>
|
||||||
<Tool
|
<Tool
|
||||||
|
@ -88,7 +88,7 @@
|
||||||
<Configuration
|
<Configuration
|
||||||
Name="Debug|x64"
|
Name="Debug|x64"
|
||||||
ConfigurationType="1"
|
ConfigurationType="1"
|
||||||
InheritedPropertySheets=".\suffix_debug64.vsprops;.\wxlib_include.vsprops;.\wxlib_lib64.vsprops;.\libraries_outdirs.vsprops;.\contrib_includedirs.vsprops;.\aegisub_exe_filename.vsprops;.\ffms2_lib_include_dir.vsprops;.\compiler_options.vsprops;.\compiler_options_debug.vsprops;.\svn_rev_header_update.vsprops"
|
InheritedPropertySheets=".\suffix_debug64.vsprops;.\wxlib_include.vsprops;.\wxlib_lib64.vsprops;.\libraries_outdirs.vsprops;.\contrib_includedirs.vsprops;.\aegisub_exe_filename.vsprops;.\ffms2_lib_include_dir.vsprops;.\compiler_options.vsprops;.\compiler_options_debug.vsprops;.\svn_rev_header_update.vsprops;.\libaegisub_include_dir.vsprops"
|
||||||
CharacterSet="1"
|
CharacterSet="1"
|
||||||
>
|
>
|
||||||
<Tool
|
<Tool
|
||||||
|
@ -154,7 +154,7 @@
|
||||||
<Configuration
|
<Configuration
|
||||||
Name="Release|Win32"
|
Name="Release|Win32"
|
||||||
ConfigurationType="1"
|
ConfigurationType="1"
|
||||||
InheritedPropertySheets=".\suffix_release32.vsprops;.\wxlib_include.vsprops;.\wxlib_lib32.vsprops;.\libraries_outdirs.vsprops;.\contrib_includedirs.vsprops;.\aegisub_exe_filename.vsprops;.\ffms2_lib_include_dir.vsprops;.\compiler_options.vsprops;.\svn_rev_header_update.vsprops;.\delayload_portaudio_32.vsprops;.\delayload_openal_32.vsprops"
|
InheritedPropertySheets=".\suffix_release32.vsprops;.\wxlib_include.vsprops;.\wxlib_lib32.vsprops;.\libraries_outdirs.vsprops;.\contrib_includedirs.vsprops;.\aegisub_exe_filename.vsprops;.\ffms2_lib_include_dir.vsprops;.\compiler_options.vsprops;.\svn_rev_header_update.vsprops;.\delayload_portaudio_32.vsprops;.\delayload_openal_32.vsprops;.\libaegisub_include_dir.vsprops"
|
||||||
CharacterSet="1"
|
CharacterSet="1"
|
||||||
WholeProgramOptimization="1"
|
WholeProgramOptimization="1"
|
||||||
>
|
>
|
||||||
|
@ -223,7 +223,7 @@
|
||||||
<Configuration
|
<Configuration
|
||||||
Name="Release|x64"
|
Name="Release|x64"
|
||||||
ConfigurationType="1"
|
ConfigurationType="1"
|
||||||
InheritedPropertySheets=".\suffix_release64.vsprops;.\wxlib_include.vsprops;.\wxlib_lib64.vsprops;.\libraries_outdirs.vsprops;.\contrib_includedirs.vsprops;.\aegisub_exe_filename.vsprops;.\ffms2_lib_include_dir.vsprops;.\compiler_options.vsprops;.\svn_rev_header_update.vsprops"
|
InheritedPropertySheets=".\suffix_release64.vsprops;.\wxlib_include.vsprops;.\wxlib_lib64.vsprops;.\libraries_outdirs.vsprops;.\contrib_includedirs.vsprops;.\aegisub_exe_filename.vsprops;.\ffms2_lib_include_dir.vsprops;.\compiler_options.vsprops;.\svn_rev_header_update.vsprops;.\libaegisub_include_dir.vsprops"
|
||||||
CharacterSet="1"
|
CharacterSet="1"
|
||||||
WholeProgramOptimization="1"
|
WholeProgramOptimization="1"
|
||||||
>
|
>
|
||||||
|
@ -1103,14 +1103,6 @@
|
||||||
RelativePath="..\..\src\dialog_kara_timing_copy.h"
|
RelativePath="..\..\src\dialog_kara_timing_copy.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\dialog_options.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\dialog_options.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\src\dialog_paste_over.cpp"
|
RelativePath="..\..\src\dialog_paste_over.cpp"
|
||||||
>
|
>
|
||||||
|
@ -1255,10 +1247,62 @@
|
||||||
RelativePath="..\..\src\dialog_video_details.h"
|
RelativePath="..\..\src\dialog_video_details.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\preferences.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Core"
|
Name="Core"
|
||||||
>
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\agi_pre.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|x64"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|x64"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\agi_pre.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\compat.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\compat.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\src\frame_main.cpp"
|
RelativePath="..\..\src\frame_main.cpp"
|
||||||
>
|
>
|
||||||
|
@ -1307,46 +1351,6 @@
|
||||||
RelativePath="..\..\src\setup.cpp"
|
RelativePath="..\..\src\setup.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\agi_pre.cpp"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
UsePrecompiledHeader="1"
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
UsePrecompiledHeader="1"
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
UsePrecompiledHeader="1"
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|x64"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
UsePrecompiledHeader="1"
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\agi_pre.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\src\subs_edit_box.cpp"
|
RelativePath="..\..\src\subs_edit_box.cpp"
|
||||||
>
|
>
|
||||||
|
|
11
aegisub/build/aegisub_vs2008/libaegisub_include_dir.vsprops
Normal file
11
aegisub/build/aegisub_vs2008/libaegisub_include_dir.vsprops
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioPropertySheet
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8.00"
|
||||||
|
Name="libaegisub_include_dir"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalIncludeDirectories=""$(ProjectDir)\..\..\libaegisub\include""
|
||||||
|
/>
|
||||||
|
</VisualStudioPropertySheet>
|
26
aegisub/build/libaegisub_vs2008/compiler_options.vsprops
Normal file
26
aegisub/build/libaegisub_vs2008/compiler_options.vsprops
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioPropertySheet
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8.00"
|
||||||
|
Name="compiler_options"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
EnableIntrinsicFunctions="true"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
OpenMP="true"
|
||||||
|
WarningLevel="3"
|
||||||
|
WarnAsError="true"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
LinkIncremental="1"
|
||||||
|
GenerateManifest="true"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="2"
|
||||||
|
LargeAddressAware="2"
|
||||||
|
DataExecutionPrevention="2"
|
||||||
|
/>
|
||||||
|
</VisualStudioPropertySheet>
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioPropertySheet
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8.00"
|
||||||
|
Name="compiler_options_debug"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
InlineFunctionExpansion="0"
|
||||||
|
EnableIntrinsicFunctions="false"
|
||||||
|
WholeProgramOptimization="false"
|
||||||
|
PreprocessorDefinitions="DEBUG;_DEBUG;_CRT_SECURE_NO_WARNINGS"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
BufferSecurityCheck="true"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
DebugInformationFormat="4"
|
||||||
|
EnablePREfast="true"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
LinkIncremental="2"
|
||||||
|
RandomizedBaseAddress="1"
|
||||||
|
/>
|
||||||
|
</VisualStudioPropertySheet>
|
226
aegisub/build/libaegisub_vs2008/libaegisub_vs2008.vcproj
Normal file
226
aegisub/build/libaegisub_vs2008/libaegisub_vs2008.vcproj
Normal file
|
@ -0,0 +1,226 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="9.00"
|
||||||
|
Name="libaegisub_vs2008"
|
||||||
|
ProjectGUID="{8732F2B6-B3C6-4AE8-986A-2A334E33334B}"
|
||||||
|
RootNamespace="libaegisub_vs2008"
|
||||||
|
TargetFrameworkVersion="196613"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
<Platform
|
||||||
|
Name="x64"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
ConfigurationType="4"
|
||||||
|
InheritedPropertySheets=".\wxlib_include.vsprops;.\libraries_outdirs.vsprops;.\compiler_options_debug.vsprops;..\aegisub_vs2008\wxlib_lib32.vsprops;..\aegisub_vs2008\suffix_debug32.vsprops;.\precomp_header.vsprops;.\src_msvc_include_dir.vsprops"
|
||||||
|
CharacterSet="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
MinimalRebuild="true"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
WarningLevel="3"
|
||||||
|
DebugInformationFormat="4"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
ConfigurationType="4"
|
||||||
|
InheritedPropertySheets=".\wxlib_include.vsprops;.\libraries_outdirs.vsprops;.\compiler_options.vsprops;..\aegisub_vs2008\wxlib_lib32.vsprops;..\aegisub_vs2008\suffix_release32.vsprops;.\precomp_header.vsprops"
|
||||||
|
CharacterSet="1"
|
||||||
|
WholeProgramOptimization="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
EnableIntrinsicFunctions="true"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
WarningLevel="3"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|x64"
|
||||||
|
ConfigurationType="4"
|
||||||
|
InheritedPropertySheets=".\wxlib_include.vsprops;.\libraries_outdirs.vsprops;.\compiler_options_debug.vsprops;..\aegisub_vs2008\wxlib_lib64.vsprops;..\aegisub_vs2008\suffix_debug64.vsprops;.\precomp_header.vsprops"
|
||||||
|
CharacterSet="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
TargetEnvironment="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
MinimalRebuild="true"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
WarningLevel="3"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|x64"
|
||||||
|
ConfigurationType="4"
|
||||||
|
InheritedPropertySheets=".\wxlib_include.vsprops;.\libraries_outdirs.vsprops;.\compiler_options.vsprops;..\aegisub_vs2008\wxlib_lib64.vsprops;..\aegisub_vs2008\suffix_release64.vsprops;.\precomp_header.vsprops"
|
||||||
|
CharacterSet="1"
|
||||||
|
WholeProgramOptimization="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
TargetEnvironment="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
EnableIntrinsicFunctions="true"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
WarningLevel="3"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Common"
|
||||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\common\mru.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\common\option.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\common\option_visit.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\common\option_visit.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\common\validator.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Windows"
|
||||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\windows\access.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\windows\io.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\windows\lagi_pre.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|x64"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|x64"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\windows\util.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Include"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\include\libaegisub\access.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\include\libaegisub\colour.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\include\libaegisub\exception.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\include\libaegisub\io.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\include\libaegisub\mru.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\include\libaegisub\option.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\include\libaegisub\option_value.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\include\libaegisub\util.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\include\libaegisub\validator.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\libaegisub\lagi_pre.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
27
aegisub/build/libaegisub_vs2008/libraries_outdirs.vsprops
Normal file
27
aegisub/build/libaegisub_vs2008/libraries_outdirs.vsprops
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioPropertySheet
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8.00"
|
||||||
|
Name="standard_outdirs"
|
||||||
|
OutputDirectory="$(SolutionDir)build/$(ProjectName)/$(PlatformName)/$(ConfigurationName)/"
|
||||||
|
IntermediateDirectory="$(OutDir)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCLibrarianTool"
|
||||||
|
OutputFile="$(LibraryOutDir)/$(ProjectName).lib"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
OutputFile=""
|
||||||
|
AdditionalLibraryDirectories="$(LibraryOutDir)"
|
||||||
|
ImportLibrary="$(LibraryOutDir)$(TargetName).lib"
|
||||||
|
/>
|
||||||
|
<UserMacro
|
||||||
|
Name="LibraryOutDir"
|
||||||
|
Value="$(SolutionDir)lib/$(PlatformName)/$(ConfigurationName)/"
|
||||||
|
/>
|
||||||
|
<UserMacro
|
||||||
|
Name="ExecutableOutDir"
|
||||||
|
Value="$(SolutionDir)bin/"
|
||||||
|
/>
|
||||||
|
</VisualStudioPropertySheet>
|
13
aegisub/build/libaegisub_vs2008/precomp_header.vsprops
Normal file
13
aegisub/build/libaegisub_vs2008/precomp_header.vsprops
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioPropertySheet
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8.00"
|
||||||
|
Name="precomp_header"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="2"
|
||||||
|
PrecompiledHeaderThrough="../../libaegisub/lagi_pre.h"
|
||||||
|
ForcedIncludeFiles="../../libaegisub/lagi_pre.h"
|
||||||
|
/>
|
||||||
|
</VisualStudioPropertySheet>
|
11
aegisub/build/libaegisub_vs2008/src_msvc_include_dir.vsprops
Normal file
11
aegisub/build/libaegisub_vs2008/src_msvc_include_dir.vsprops
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioPropertySheet
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8.00"
|
||||||
|
Name="src_msvc_include_dir"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalIncludeDirectories=""$(ProjectDir)\..\..\src\msvc""
|
||||||
|
/>
|
||||||
|
</VisualStudioPropertySheet>
|
15
aegisub/build/libaegisub_vs2008/wxlib_include.vsprops
Normal file
15
aegisub/build/libaegisub_vs2008/wxlib_include.vsprops
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioPropertySheet
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8.00"
|
||||||
|
Name="wxlib_include"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalIncludeDirectories=""$(SolutionDir)/wxlib/include/";"$(ProjectDir)../../libaegisub/include/""
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
AdditionalIncludeDirectories=""$(SolutionDir)/wxlib/include/""
|
||||||
|
/>
|
||||||
|
</VisualStudioPropertySheet>
|
|
@ -1204,6 +1204,7 @@ AC_CONFIG_FILES([
|
||||||
Makefile
|
Makefile
|
||||||
automation/Makefile
|
automation/Makefile
|
||||||
desktop/Makefile
|
desktop/Makefile
|
||||||
|
libaegisub/Makefile
|
||||||
libass/Makefile
|
libass/Makefile
|
||||||
libffms/Makefile
|
libffms/Makefile
|
||||||
po/Makefile.in
|
po/Makefile.in
|
||||||
|
@ -1214,6 +1215,7 @@ src/libosxutil/Makefile
|
||||||
src/libresrc/Makefile
|
src/libresrc/Makefile
|
||||||
tools/Makefile
|
tools/Makefile
|
||||||
universalchardet/Makefile
|
universalchardet/Makefile
|
||||||
|
tests/Makefile
|
||||||
])
|
])
|
||||||
|
|
||||||
# Files that need substitution.
|
# Files that need substitution.
|
||||||
|
|
12
aegisub/docs/doxygen/doxyfile_libaegisub
Normal file
12
aegisub/docs/doxygen/doxyfile_libaegisub
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
@INCLUDE = doxyfile_base
|
||||||
|
|
||||||
|
PROJECT_NAME = "libaegisub"
|
||||||
|
|
||||||
|
INPUT = ../../libaegisub/ ./pages_libaegisub
|
||||||
|
|
||||||
|
EXCLUDE_PATTERNS = */.svn* */.deps* */.libs*
|
||||||
|
|
||||||
|
PREDEFINED += \
|
||||||
|
__WINDOWS__ \
|
||||||
|
__UNIX__ \
|
||||||
|
__OSX__
|
|
@ -17,6 +17,9 @@ case "$1" in
|
||||||
"reporter")
|
"reporter")
|
||||||
TRIM="${SRC_PWD}/reporter/"
|
TRIM="${SRC_PWD}/reporter/"
|
||||||
;;
|
;;
|
||||||
|
"libaegisub")
|
||||||
|
TRIM="${SRC_PWD}/libaegisub/"
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
export OUTPUT_DIR="$2"
|
export OUTPUT_DIR="$2"
|
||||||
|
|
7
aegisub/docs/doxygen/pages_libaegisub/groups.dox
Normal file
7
aegisub/docs/doxygen/pages_libaegisub/groups.dox
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/**
|
||||||
|
@defgroup base Base
|
||||||
|
@defgroup unix Unix
|
||||||
|
@defgroup windows Windows
|
||||||
|
@defgroup osx OS X
|
||||||
|
@defgroup io File I/O
|
||||||
|
*/
|
11
aegisub/docs/doxygen/pages_libaegisub/index.dox
Normal file
11
aegisub/docs/doxygen/pages_libaegisub/index.dox
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
/** @mainpage
|
||||||
|
|
||||||
|
Main
|
||||||
|
- @ref base
|
||||||
|
|
||||||
|
Library
|
||||||
|
- @ref unix
|
||||||
|
- @ref windows
|
||||||
|
- @ref osx
|
||||||
|
- @ref io
|
||||||
|
*/
|
5
aegisub/docs/doxygen/pages_libaegisub/license.dox
Normal file
5
aegisub/docs/doxygen/pages_libaegisub/license.dox
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
/** @page License libaegisub License
|
||||||
|
|
||||||
|
@verbinclude "LICENCE"
|
||||||
|
|
||||||
|
*/
|
32
aegisub/libaegisub/Makefile.am
Normal file
32
aegisub/libaegisub/Makefile.am
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
# $Id$
|
||||||
|
AUTOMAKE_OPTIONS = subdir-objects
|
||||||
|
AM_CXXFLAGS=
|
||||||
|
DISTCLEANFILES=
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libaegisub-2.2.la
|
||||||
|
libaegisub_2_2_la_CPPFLAGS = -I../src/include -Iinclude -I. @WX_CPPFLAGS@
|
||||||
|
|
||||||
|
if PRECOMPILED_HEADER
|
||||||
|
BUILT_SOURCES = lagi_pre.h.gch
|
||||||
|
AM_CXXFLAGS += -include lagi_pre.h -Winvalid-pch -fpch-deps -fpch-preprocess
|
||||||
|
nodist_libaegisub_2_2_la_SOURCES = lagi_pre.h.gch
|
||||||
|
endif
|
||||||
|
|
||||||
|
if PRECOMPILED_HEADER
|
||||||
|
# This doesn't depend on Makefile on purpose, you should already know what you're doing when using this.
|
||||||
|
lagi_pre.h.gch: lagi_pre.h
|
||||||
|
@CXX@ $(libaegisub_2_2_la_CPPFLAGS) @CXXFLAGS@ @DEBUG_FLAGS@ -fPIC -DPIC lagi_pre.h
|
||||||
|
DISTCLEANFILES += lagi_pre.h.gch
|
||||||
|
endif
|
||||||
|
|
||||||
|
libaegisub_2_2_la_SOURCES = \
|
||||||
|
common/mru.cpp \
|
||||||
|
common/option.cpp \
|
||||||
|
common/option_visit.cpp \
|
||||||
|
common/validator.cpp \
|
||||||
|
unix/util.cpp \
|
||||||
|
unix/io.cpp \
|
||||||
|
unix/access.cpp
|
||||||
|
|
||||||
|
noinst_HEADERS = *.h
|
||||||
|
|
203
aegisub/libaegisub/common/mru.cpp
Normal file
203
aegisub/libaegisub/common/mru.cpp
Normal file
|
@ -0,0 +1,203 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file mru.cpp
|
||||||
|
/// @brief Most Recently Used (MRU) Lists
|
||||||
|
/// @ingroup libaegisub
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#include <fstream>
|
||||||
|
#include <time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "libaegisub/access.h"
|
||||||
|
#include "libaegisub/mru.h"
|
||||||
|
#include "libaegisub/io.h"
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
|
||||||
|
MRUManager::MRUManager(const std::string &config, const std::string &default_config): config_name(config) {
|
||||||
|
|
||||||
|
json::UnknownElement root;
|
||||||
|
std::istream *stream;
|
||||||
|
|
||||||
|
try {
|
||||||
|
stream = io::Open(config);
|
||||||
|
} catch (const acs::AcsNotFound&) {
|
||||||
|
stream = new std::istringstream(default_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
json::Reader::Read(root, *stream);
|
||||||
|
} catch (const json::Exception&) {
|
||||||
|
/// @todo Do something better here, maybe print the exact error
|
||||||
|
// std::cout << "json::Exception: " << e.what() << std::endl;
|
||||||
|
|
||||||
|
stream = new std::istringstream(default_config);
|
||||||
|
json::Reader::Read(root, *stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
const json::Object& root_new = (json::Object)root;
|
||||||
|
|
||||||
|
json::Object::const_iterator index_object(root_new.Begin()), index_objectEnd(root_new.End());
|
||||||
|
|
||||||
|
for (; index_object != index_objectEnd; ++index_object) {
|
||||||
|
const json::Object::Member& member = *index_object;
|
||||||
|
const std::string &member_name = member.name;
|
||||||
|
const json::UnknownElement& element = member.element;
|
||||||
|
|
||||||
|
Load(member_name, (json::Array)element);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MRUManager::~MRUManager() {
|
||||||
|
Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MRUManager::Add(const std::string &key, const std::string &entry) {
|
||||||
|
|
||||||
|
MRUMap::iterator index;
|
||||||
|
|
||||||
|
if ((index = mru.find(key)) != mru.end()) {
|
||||||
|
MRUListMap &map = *index->second;
|
||||||
|
|
||||||
|
// Remove the file before adding it.
|
||||||
|
Remove(key, entry);
|
||||||
|
|
||||||
|
map.insert(std::pair<time_t, std::string>(time(NULL), entry));
|
||||||
|
|
||||||
|
Prune(map);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
throw MRUErrorInvalidKey("Invalid key value");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MRUManager::Remove(const std::string &key, const std::string &entry) {
|
||||||
|
|
||||||
|
MRUMap::iterator index;
|
||||||
|
|
||||||
|
if ((index = mru.find(key)) != mru.end()) {
|
||||||
|
MRUListMap map = *index->second;
|
||||||
|
for (MRUListMap::iterator map_idx = map.begin(); map_idx != map.end();) {
|
||||||
|
if (map_idx->second == entry)
|
||||||
|
map.erase(map_idx++);
|
||||||
|
else
|
||||||
|
++map_idx;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw MRUErrorInvalidKey("Invalid key value");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const MRUManager::MRUListMap* MRUManager::Get(const std::string &key) {
|
||||||
|
|
||||||
|
MRUMap::iterator index;
|
||||||
|
|
||||||
|
if ((index = mru.find(key)) != mru.end()) {
|
||||||
|
return index->second;
|
||||||
|
} else {
|
||||||
|
throw MRUErrorInvalidKey("Invalid key value");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const std::string MRUManager::GetEntry(const std::string &key, const int entry) {
|
||||||
|
|
||||||
|
const MRUManager::MRUListMap *map = Get(key);
|
||||||
|
|
||||||
|
MRUListMap::const_iterator index = map->begin();;
|
||||||
|
|
||||||
|
if ((unsigned int)entry > map->size())
|
||||||
|
throw MRUErrorIndexOutOfRange("Requested element index is out of range.");
|
||||||
|
|
||||||
|
std::advance(index, entry);
|
||||||
|
|
||||||
|
return index->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MRUManager::Flush() {
|
||||||
|
|
||||||
|
json::Object out;
|
||||||
|
|
||||||
|
for (MRUMap::const_iterator i = mru.begin(); i != mru.end(); ++i) {
|
||||||
|
json::Array array;
|
||||||
|
MRUListMap *map_list = i->second;
|
||||||
|
|
||||||
|
for (MRUListMap::const_iterator i_lst = map_list->begin(); i_lst != map_list->end(); ++i_lst) {
|
||||||
|
json::Object obj;
|
||||||
|
obj["time"] = json::Number((double)i_lst->first);
|
||||||
|
obj["entry"] = json::String(i_lst->second);
|
||||||
|
array.Insert(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
out[i->first] = array;
|
||||||
|
}
|
||||||
|
|
||||||
|
io::Save file(config_name);
|
||||||
|
std::ofstream& ofp = file.Get();
|
||||||
|
json::Writer::Write(out, ofp);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// @brief Prune MRUListMap to the desired length.
|
||||||
|
/// This uses the user-set values for MRU list length.
|
||||||
|
inline void MRUManager::Prune(MRUListMap& map) {
|
||||||
|
unsigned int size = 16;
|
||||||
|
|
||||||
|
MRUListMap::iterator index = map.begin();;
|
||||||
|
|
||||||
|
if (map.size() >= size) {
|
||||||
|
std::advance(index, size);
|
||||||
|
|
||||||
|
// Use a range incase the storage number shrinks.
|
||||||
|
map.erase(index, map.end());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Load MRU Lists.
|
||||||
|
/// @param key List name.
|
||||||
|
/// @param array json::Array of values.
|
||||||
|
void MRUManager::Load(const std::string &key, const json::Array& array) {
|
||||||
|
|
||||||
|
json::Array::const_iterator index(array.Begin()), indexEnd(array.End());
|
||||||
|
|
||||||
|
MRUListMap *map = new MRUListMap();
|
||||||
|
|
||||||
|
for (; index != indexEnd; ++index) {
|
||||||
|
const json::Object& obj = *index;
|
||||||
|
|
||||||
|
time_t time = (time_t)(json::Number)obj["time"];
|
||||||
|
std::string entry = (json::String)obj["entry"];
|
||||||
|
|
||||||
|
map->insert(std::pair<time_t, std::string>(time, entry));
|
||||||
|
}
|
||||||
|
|
||||||
|
mru.insert(std::pair<std::string, MRUListMap*>(key, map));
|
||||||
|
Prune(*map);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
237
aegisub/libaegisub/common/option.cpp
Normal file
237
aegisub/libaegisub/common/option.cpp
Normal file
|
@ -0,0 +1,237 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file option.cpp
|
||||||
|
/// @brief Option interface.
|
||||||
|
/// @ingroup libaegisub
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <map>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "libaegisub/io.h"
|
||||||
|
#include "option_visit.h"
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
|
||||||
|
Options::Options(const std::string &file, const std::string& default_config):
|
||||||
|
config_file(file), config_default(default_config), config_loaded(false) {
|
||||||
|
std::istringstream stream(default_config);
|
||||||
|
LoadConfig(stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
Options::~Options() {
|
||||||
|
Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Options::ConfigNext(std::istream& stream) {
|
||||||
|
LoadConfig(stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Options::ConfigUser() {
|
||||||
|
std::istream *stream = agi::io::Open(config_file);
|
||||||
|
LoadConfig(*stream);
|
||||||
|
config_loaded = true;
|
||||||
|
delete stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Options::LoadConfig(std::istream& stream) {
|
||||||
|
/// @todo Store all previously loaded configs in an array for bug report purposes,
|
||||||
|
/// this is just a temp stub.
|
||||||
|
json::UnknownElement config_root;
|
||||||
|
|
||||||
|
try {
|
||||||
|
json::Reader::Read(config_root, stream);
|
||||||
|
} catch (json::Reader::ParseException& e) {
|
||||||
|
std::cout << "json::ParseException: " << e.what() << ", Line/offset: " << e.m_locTokenBegin.m_nLine + 1 << '/' << e.m_locTokenBegin.m_nLineOffset + 1 << std::endl << std::endl;
|
||||||
|
} catch (json::Exception& e) {
|
||||||
|
/// @todo Do something better here, maybe print the exact error
|
||||||
|
std::cout << "json::Exception: " << e.what() << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigVisitor config_visitor(values, std::string(""));
|
||||||
|
config_root.Accept(config_visitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
OptionValue* Options::Get(const std::string &name) {
|
||||||
|
|
||||||
|
OptionValueMap::iterator index;
|
||||||
|
|
||||||
|
if ((index = values.find(name)) != values.end())
|
||||||
|
return index->second;
|
||||||
|
|
||||||
|
std::cout << "agi::Options::Get Option not found: (" << name << ")" << std::endl;
|
||||||
|
throw OptionErrorNotFound("Option value not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Options::Flush() {
|
||||||
|
|
||||||
|
json::Object obj_out;
|
||||||
|
|
||||||
|
bool ok;
|
||||||
|
|
||||||
|
for (OptionValueMap::const_iterator i = values.begin(); i != values.end(); ++i) {
|
||||||
|
|
||||||
|
std::string key = i->first.substr(i->first.rfind("/")+1, i->first.size());
|
||||||
|
|
||||||
|
int type = i->second->GetType();
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case OptionValue::Type_String: {
|
||||||
|
ok = PutOption(obj_out, i->first, (json::String)i->second->GetString());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OptionValue::Type_Int:
|
||||||
|
ok = PutOption(obj_out, i->first, (json::Number)(const double)i->second->GetInt());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OptionValue::Type_Double:
|
||||||
|
ok = PutOption(obj_out, i->first, (json::Number)i->second->GetDouble());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OptionValue::Type_Colour: {
|
||||||
|
std::string str = std::string(i->second->GetColour());
|
||||||
|
ok = PutOption(obj_out, i->first, (json::String)str);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OptionValue::Type_Bool:
|
||||||
|
ok = PutOption(obj_out, i->first, (json::Boolean)i->second->GetBool());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OptionValue::Type_List_String: {
|
||||||
|
std::vector<std::string> array_string;
|
||||||
|
i->second->GetListString(array_string);
|
||||||
|
|
||||||
|
json::Array array;
|
||||||
|
|
||||||
|
for (std::vector<std::string>::const_iterator i_str = array_string.begin(); i_str != array_string.end(); ++i_str) {
|
||||||
|
json::Object obj;
|
||||||
|
obj["string"] = json::String(*i_str);
|
||||||
|
array.Insert(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
ok = PutOption(obj_out, i->first, (json::Array)array);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OptionValue::Type_List_Int: {
|
||||||
|
std::vector<int64_t> array_int;
|
||||||
|
i->second->GetListInt(array_int);
|
||||||
|
|
||||||
|
json::Array array;
|
||||||
|
|
||||||
|
for (std::vector<int64_t>::const_iterator i_int = array_int.begin(); i_int != array_int.end(); ++i_int) {
|
||||||
|
json::Object obj;
|
||||||
|
obj["int"] = json::Number((const double)*i_int);
|
||||||
|
array.Insert(obj);
|
||||||
|
}
|
||||||
|
ok = PutOption(obj_out, i->first, (json::Array)array);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OptionValue::Type_List_Double: {
|
||||||
|
std::vector<double> array_double;
|
||||||
|
i->second->GetListDouble(array_double);
|
||||||
|
|
||||||
|
json::Array array;
|
||||||
|
|
||||||
|
for (std::vector<double>::const_iterator i_double = array_double.begin(); i_double != array_double.end(); ++i_double) {
|
||||||
|
json::Object obj;
|
||||||
|
obj["double"] = json::Number(*i_double);
|
||||||
|
array.Insert(obj);
|
||||||
|
}
|
||||||
|
ok = PutOption(obj_out, i->first, (json::Array)array);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OptionValue::Type_List_Colour: {
|
||||||
|
std::vector<Colour> array_colour;
|
||||||
|
i->second->GetListColour(array_colour);
|
||||||
|
|
||||||
|
json::Array array;
|
||||||
|
for (std::vector<Colour>::const_iterator i_colour = array_colour.begin(); i_colour != array_colour.end(); ++i_colour) {
|
||||||
|
json::Object obj;
|
||||||
|
|
||||||
|
Colour col = *i_colour;
|
||||||
|
std::string str = std::string(col);
|
||||||
|
|
||||||
|
obj["colour"] = json::String(str);
|
||||||
|
|
||||||
|
array.Insert(obj);
|
||||||
|
}
|
||||||
|
ok = PutOption(obj_out, i->first, (json::Array)array);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OptionValue::Type_List_Bool: {
|
||||||
|
std::vector<bool> array_bool;
|
||||||
|
|
||||||
|
json::Array array;
|
||||||
|
|
||||||
|
i->second->GetListBool(array_bool);
|
||||||
|
for (std::vector<bool>::const_iterator i_bool = array_bool.begin(); i_bool != array_bool.end(); ++i_bool) {
|
||||||
|
json::Object obj;
|
||||||
|
obj["bool"] = json::Boolean(*i_bool);
|
||||||
|
array.Insert(obj);
|
||||||
|
}
|
||||||
|
ok = PutOption(obj_out, i->first, (json::Array)array);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
io::Save file(config_file);
|
||||||
|
json::Writer::Write(obj_out, file.Get());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Options::PutOption(json::Object &obj, const std::string &path, const json::UnknownElement &value) {
|
||||||
|
// Having a '/' denotes it is a leaf.
|
||||||
|
if (path.find('/') == std::string::npos) {
|
||||||
|
json::Object::iterator pos = obj.Find(path);
|
||||||
|
|
||||||
|
// Fail if a key of the same name already exists.
|
||||||
|
if (pos != obj.End())
|
||||||
|
throw OptionErrorDuplicateKey("Key already exists");
|
||||||
|
|
||||||
|
obj.Insert(json::Object::Member(path, value));
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
std::string thispart = path.substr(0, path.find("/"));
|
||||||
|
std::string restpart = path.substr(path.find("/")+1, path.size());
|
||||||
|
json::Object::iterator pos = obj.Find(thispart);
|
||||||
|
|
||||||
|
// New key, make object.
|
||||||
|
if (pos == obj.End())
|
||||||
|
pos = obj.Insert(json::Object::Member(thispart, json::Object()));
|
||||||
|
|
||||||
|
PutOptionVisitor visitor(restpart, value);
|
||||||
|
pos->element.Accept(visitor);
|
||||||
|
return visitor.result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace agi
|
242
aegisub/libaegisub/common/option_visit.cpp
Normal file
242
aegisub/libaegisub/common/option_visit.cpp
Normal file
|
@ -0,0 +1,242 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file option_visit.cpp
|
||||||
|
/// @brief Cajun JSON visitor to load config values.
|
||||||
|
/// @see option_visit.h
|
||||||
|
/// @ingroup libaegisub
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include <wx/colour.h>
|
||||||
|
#include <wx/wxcrtvararg.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <libaegisub/colour.h>
|
||||||
|
#include "option_visit.h"
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
|
||||||
|
ConfigVisitor::ConfigVisitor(OptionValueMap &val, const std::string &member_name): values(val) {
|
||||||
|
// Corropsonding code is in AddOptionValue()
|
||||||
|
name = member_name + "/";
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigVisitor::~ConfigVisitor() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfigVisitor::Visit(const json::Object& object) {
|
||||||
|
|
||||||
|
json::Object::const_iterator index(object.Begin()), index_end(object.End());
|
||||||
|
|
||||||
|
for (; index != index_end; ++index) {
|
||||||
|
const json::Object::Member& member = *index;
|
||||||
|
const std::string &member_name = member.name;
|
||||||
|
const json::UnknownElement& element = member.element;
|
||||||
|
|
||||||
|
ConfigVisitor config_visitor(values, name + member_name);
|
||||||
|
|
||||||
|
element.Accept(config_visitor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfigVisitor::Visit(const json::Array& array) {
|
||||||
|
int init = 0;
|
||||||
|
|
||||||
|
OptionValueList *array_list;
|
||||||
|
|
||||||
|
json::Array::const_iterator index(array.Begin()), indexEnd(array.End());
|
||||||
|
|
||||||
|
for (; index != indexEnd; ++index) {
|
||||||
|
|
||||||
|
const json::Object& index_array = *index;
|
||||||
|
|
||||||
|
json::Object::const_iterator index_object(index_array.Begin()), index_objectEnd(index_array.End());
|
||||||
|
|
||||||
|
for (; index_object != index_objectEnd; ++index_object) {
|
||||||
|
const json::Object::Member& member = *index_object;
|
||||||
|
const std::string& member_name = member.name;
|
||||||
|
|
||||||
|
|
||||||
|
// This can only happen once since a list must always be of the same
|
||||||
|
// type, if we try inserting another type into it we want it to fail.
|
||||||
|
if (!init) {
|
||||||
|
if (member_name == "string") {
|
||||||
|
array_list = new OptionValueListString(name);
|
||||||
|
} else if (member_name == "int") {
|
||||||
|
array_list = new OptionValueListInt(name);
|
||||||
|
} else if (member_name == "double") {
|
||||||
|
array_list = new OptionValueListDouble(name);
|
||||||
|
} else if (member_name == "bool") {
|
||||||
|
array_list = new OptionValueListBool(name);
|
||||||
|
} else if (member_name == "colour") {
|
||||||
|
array_list = new OptionValueListColour(name);
|
||||||
|
} else {
|
||||||
|
throw OptionJsonValueArray("Array type not handled");
|
||||||
|
}
|
||||||
|
init = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (member_name == "string") {
|
||||||
|
std::string val = (json::String)member.element;
|
||||||
|
array_list->InsertString(val);
|
||||||
|
|
||||||
|
} else if (member_name == "int") {
|
||||||
|
int64_t val = (int64_t)(json::Number)member.element;
|
||||||
|
array_list->InsertInt(val);
|
||||||
|
|
||||||
|
} else if (member_name == "double") {
|
||||||
|
double val = (json::Number)member.element;
|
||||||
|
array_list->InsertDouble(val);
|
||||||
|
|
||||||
|
} else if (member_name == "bool") {
|
||||||
|
bool val = (json::Boolean)member.element;
|
||||||
|
array_list->InsertBool(val);
|
||||||
|
|
||||||
|
} else if (member_name == "colour") {
|
||||||
|
std::string val = (json::String)member.element;
|
||||||
|
Colour col(val);
|
||||||
|
array_list->InsertColour(col);
|
||||||
|
}
|
||||||
|
|
||||||
|
AddOptionValue(array_list);
|
||||||
|
|
||||||
|
} catch (agi::Exception&) {
|
||||||
|
throw OptionJsonValueArray("Attempt to insert value into array of wrong type");
|
||||||
|
}
|
||||||
|
|
||||||
|
} // for index_object
|
||||||
|
|
||||||
|
} // for index
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfigVisitor::Visit(const json::Number& number) {
|
||||||
|
double val = number.Value();
|
||||||
|
|
||||||
|
if (int64_t(val) == ceil(val)) {
|
||||||
|
OptionValue *opt = new OptionValueInt(name, int64_t(val));
|
||||||
|
AddOptionValue(opt);
|
||||||
|
} else {
|
||||||
|
OptionValue *opt = new OptionValueDouble(name, val);
|
||||||
|
AddOptionValue(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfigVisitor::Visit(const json::String& string) {
|
||||||
|
OptionValue *opt;
|
||||||
|
if (string.Value().find("rgb(") == 0) {
|
||||||
|
opt = new OptionValueColour(name, string.Value());
|
||||||
|
} else {
|
||||||
|
opt = new OptionValueString(name, string.Value());
|
||||||
|
}
|
||||||
|
AddOptionValue(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfigVisitor::Visit(const json::Boolean& boolean) {
|
||||||
|
OptionValue *opt = new OptionValueBool(name, boolean.Value());
|
||||||
|
AddOptionValue(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfigVisitor::Visit(const json::Null& null) {
|
||||||
|
throw OptionJsonValueNull("Attempt to read null value");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfigVisitor::AddOptionValue(OptionValue* opt) {
|
||||||
|
// Corrosponding code is in the constuctor.
|
||||||
|
std::string stripped = name.substr(1, name.rfind("/")-1);
|
||||||
|
OptionValue *opt_cur;
|
||||||
|
|
||||||
|
OptionValueMap::iterator index;
|
||||||
|
|
||||||
|
if ((index = values.find(stripped)) != values.end()) {
|
||||||
|
opt_cur = index->second;
|
||||||
|
} else {
|
||||||
|
values.insert(OptionValuePair(stripped, opt));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int type = opt_cur->GetType();
|
||||||
|
switch (type) {
|
||||||
|
case OptionValue::Type_String:
|
||||||
|
opt_cur->SetString(opt->GetString());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OptionValue::Type_Int:
|
||||||
|
opt_cur->SetInt(opt->GetInt());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OptionValue::Type_Double:
|
||||||
|
opt_cur->SetDouble(opt->GetDouble());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OptionValue::Type_Colour:
|
||||||
|
opt_cur->SetColour(opt->GetColour());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OptionValue::Type_Bool:
|
||||||
|
opt_cur->SetBool(opt->GetBool());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OptionValue::Type_List_String: {
|
||||||
|
std::vector<std::string> array;
|
||||||
|
opt->GetListString(array);
|
||||||
|
opt_cur->SetListString(array);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case OptionValue::Type_List_Int: {
|
||||||
|
std::vector<int64_t> array;
|
||||||
|
opt->GetListInt(array);
|
||||||
|
opt_cur->SetListInt(array);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case OptionValue::Type_List_Double: {
|
||||||
|
std::vector<double> array;
|
||||||
|
opt->GetListDouble(array);
|
||||||
|
opt_cur->SetListDouble(array);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case OptionValue::Type_List_Colour: {
|
||||||
|
std::vector<Colour> array;
|
||||||
|
opt->GetListColour(array);
|
||||||
|
opt_cur->SetListColour(array);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
case OptionValue::Type_List_Bool: {
|
||||||
|
std::vector<bool> array;
|
||||||
|
opt->GetListBool(array);
|
||||||
|
opt_cur->SetListBool(array);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace agi
|
83
aegisub/libaegisub/common/option_visit.h
Normal file
83
aegisub/libaegisub/common/option_visit.h
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file option_visit.h
|
||||||
|
/// @brief Cajun JSON visitor to load config values.
|
||||||
|
/// @see option_visit.cpp
|
||||||
|
/// @ingroup libaegisub
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#include "libaegisub/cajun/elements.h"
|
||||||
|
#include "libaegisub/cajun/visitor.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "libaegisub/option.h"
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
|
||||||
|
DEFINE_BASE_EXCEPTION_NOINNER(OptionJsonValueError, Exception)
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(OptionJsonValueArray, OptionJsonValueError, "options/value/array")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(OptionJsonValueSingle, OptionJsonValueError, "options/value")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(OptionJsonValueNull, OptionJsonValueError, "options/value")
|
||||||
|
|
||||||
|
class ConfigVisitor : public json::ConstVisitor {
|
||||||
|
|
||||||
|
OptionValueMap &values;
|
||||||
|
std::string name;
|
||||||
|
typedef std::pair<std::string, OptionValue*> OptionValuePair;
|
||||||
|
|
||||||
|
void AddOptionValue(OptionValue* opt);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
ConfigVisitor(OptionValueMap &val, const std::string &member_name);
|
||||||
|
~ConfigVisitor();
|
||||||
|
|
||||||
|
void Visit(const json::Array& array);
|
||||||
|
void Visit(const json::Object& object);
|
||||||
|
void Visit(const json::Number& number);
|
||||||
|
void Visit(const json::String& string);
|
||||||
|
void Visit(const json::Boolean& boolean);
|
||||||
|
void Visit(const json::Null& null);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class PutOptionVisitor : public json::Visitor {
|
||||||
|
public:
|
||||||
|
bool result;
|
||||||
|
const std::string &path;
|
||||||
|
const json::UnknownElement &value;
|
||||||
|
|
||||||
|
PutOptionVisitor(const std::string &path, const json::UnknownElement &value)
|
||||||
|
: result(false), path(path), value(value)
|
||||||
|
{}
|
||||||
|
|
||||||
|
// all of these are a fail
|
||||||
|
virtual void Visit(json::Array& array) { }
|
||||||
|
virtual void Visit(json::Number& number) { }
|
||||||
|
virtual void Visit(json::String& string) { }
|
||||||
|
virtual void Visit(json::Boolean& boolean) { }
|
||||||
|
virtual void Visit(json::Null& null) { }
|
||||||
|
|
||||||
|
// this one is the win
|
||||||
|
virtual void Visit(json::Object& object) {
|
||||||
|
result = Options::PutOption(object, path, value);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace agi
|
73
aegisub/libaegisub/common/validator.cpp
Normal file
73
aegisub/libaegisub/common/validator.cpp
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file validator.cpp
|
||||||
|
/// @brief Input validation.
|
||||||
|
/// @ingroup libaegisub
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <libaegisub/validator.h>
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
|
||||||
|
bool ValidAny::CheckType(std::string &value) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ValidAny::Check(std::string &value) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ValidString::CheckType(std::string &value) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ValidString::Check(std::string &value) {
|
||||||
|
return CheckType(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ValidInt::CheckType(std::string &value) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ValidInt::Check(std::string &value) {
|
||||||
|
return CheckType(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ValidBool::CheckType(std::string &value) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ValidBool::Check(std::string &value) {
|
||||||
|
return CheckType(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ValidColour::Check(std::string &value) {
|
||||||
|
|
||||||
|
if (ValidString::CheckType(value)) {
|
||||||
|
// check if it's a valid colour
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace agi
|
||||||
|
|
58
aegisub/libaegisub/include/libaegisub/access.h
Normal file
58
aegisub/libaegisub/include/libaegisub/access.h
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file access.h
|
||||||
|
/// @brief Public interface for access methods.
|
||||||
|
/// @ingroup libaegisub
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <libaegisub/exception.h>
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
namespace acs {
|
||||||
|
|
||||||
|
DEFINE_BASE_EXCEPTION_NOINNER(AcsError, Exception)
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(AcsFatal, AcsError, "acs/fatal")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(AcsNotFound, AcsError, "acs/notfound")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(AcsNotAFile, AcsError, "acs/file")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(AcsNotADirectory, AcsError, "acs/directory")
|
||||||
|
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(AcsAccess, AcsError, "acs/access")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(AcsRead, AcsAccess, "acs/access/read")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(AcsWrite, AcsAccess, "acs/access/write")
|
||||||
|
|
||||||
|
|
||||||
|
enum Type {
|
||||||
|
FileRead,
|
||||||
|
DirRead,
|
||||||
|
FileWrite,
|
||||||
|
DirWrite
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void Check(const std::string &file, acs::Type);
|
||||||
|
|
||||||
|
void CheckFileRead(const std::string &file);
|
||||||
|
void CheckDirRead(const std::string &dir);
|
||||||
|
|
||||||
|
void CheckFileWrite(const std::string &file);
|
||||||
|
void CheckDirWrite(const std::string &dir);
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace axs
|
||||||
|
} // namespace agi
|
272
aegisub/libaegisub/include/libaegisub/cajun/elements.h
Normal file
272
aegisub/libaegisub/include/libaegisub/cajun/elements.h
Normal file
|
@ -0,0 +1,272 @@
|
||||||
|
/**********************************************
|
||||||
|
|
||||||
|
License: BSD
|
||||||
|
Project Webpage: http://cajun-jsonapi.sourceforge.net/
|
||||||
|
Author: Terry Caton
|
||||||
|
|
||||||
|
***********************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <deque>
|
||||||
|
#include <list>
|
||||||
|
#include <string>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
* better documentation (doxygen?)
|
||||||
|
* Unicode support
|
||||||
|
* parent element accessors
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace json
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
// forward declarations (more info further below)
|
||||||
|
|
||||||
|
|
||||||
|
class Visitor;
|
||||||
|
class ConstVisitor;
|
||||||
|
|
||||||
|
template <typename ValueTypeT>
|
||||||
|
class TrivialType_T;
|
||||||
|
|
||||||
|
typedef TrivialType_T<double> Number;
|
||||||
|
typedef TrivialType_T<bool> Boolean;
|
||||||
|
typedef TrivialType_T<std::string> String;
|
||||||
|
|
||||||
|
class Object;
|
||||||
|
class Array;
|
||||||
|
class Null;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// Exception - base class for all JSON-related runtime errors
|
||||||
|
|
||||||
|
class Exception : public std::runtime_error
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Exception(const std::string& sMessage);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// UnknownElement - provides a typesafe surrogate for any of the JSON-
|
||||||
|
// sanctioned element types. This class allows the Array and Object
|
||||||
|
// class to effectively contain a heterogeneous set of child elements.
|
||||||
|
// The cast operators provide convenient implicit downcasting, while
|
||||||
|
// preserving dynamic type safety by throwing an exception during a
|
||||||
|
// a bad cast.
|
||||||
|
// The object & array element index operators (operators [std::string]
|
||||||
|
// and [size_t]) provide convenient, quick access to child elements.
|
||||||
|
// They are a logical extension of the cast operators. These child
|
||||||
|
// element accesses can be chained together, allowing the following
|
||||||
|
// (when document structure is well-known):
|
||||||
|
// String str = objInvoices[1]["Customer"]["Company"];
|
||||||
|
|
||||||
|
|
||||||
|
class UnknownElement
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
UnknownElement();
|
||||||
|
UnknownElement(const UnknownElement& unknown);
|
||||||
|
UnknownElement(const Object& object);
|
||||||
|
UnknownElement(const Array& array);
|
||||||
|
UnknownElement(const Number& number);
|
||||||
|
UnknownElement(const Boolean& boolean);
|
||||||
|
UnknownElement(const String& string);
|
||||||
|
UnknownElement(const Null& null);
|
||||||
|
|
||||||
|
~UnknownElement();
|
||||||
|
|
||||||
|
UnknownElement& operator = (const UnknownElement& unknown);
|
||||||
|
|
||||||
|
// implicit cast to actual element type. throws on failure
|
||||||
|
operator const Object& () const;
|
||||||
|
operator const Array& () const;
|
||||||
|
operator const Number& () const;
|
||||||
|
operator const Boolean& () const;
|
||||||
|
operator const String& () const;
|
||||||
|
operator const Null& () const;
|
||||||
|
|
||||||
|
// implicit cast to actual element type. *converts* on failure, and always returns success
|
||||||
|
operator Object& ();
|
||||||
|
operator Array& ();
|
||||||
|
operator Number& ();
|
||||||
|
operator Boolean& ();
|
||||||
|
operator String& ();
|
||||||
|
operator Null& ();
|
||||||
|
|
||||||
|
// provides quick access to children when real element type is object
|
||||||
|
UnknownElement& operator[] (const std::string& key);
|
||||||
|
const UnknownElement& operator[] (const std::string& key) const;
|
||||||
|
|
||||||
|
// provides quick access to children when real element type is array
|
||||||
|
UnknownElement& operator[] (size_t index);
|
||||||
|
const UnknownElement& operator[] (size_t index) const;
|
||||||
|
|
||||||
|
// implements visitor pattern
|
||||||
|
void Accept(ConstVisitor& visitor) const;
|
||||||
|
void Accept(Visitor& visitor);
|
||||||
|
|
||||||
|
// tests equality. first checks type, then value if possible
|
||||||
|
bool operator == (const UnknownElement& element) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
class Imp;
|
||||||
|
|
||||||
|
template <typename ElementTypeT>
|
||||||
|
class Imp_T;
|
||||||
|
|
||||||
|
class CastVisitor;
|
||||||
|
class ConstCastVisitor;
|
||||||
|
|
||||||
|
template <typename ElementTypeT>
|
||||||
|
class CastVisitor_T;
|
||||||
|
|
||||||
|
template <typename ElementTypeT>
|
||||||
|
class ConstCastVisitor_T;
|
||||||
|
|
||||||
|
template <typename ElementTypeT>
|
||||||
|
const ElementTypeT& CastTo() const;
|
||||||
|
|
||||||
|
template <typename ElementTypeT>
|
||||||
|
ElementTypeT& ConvertTo();
|
||||||
|
|
||||||
|
Imp* m_pImp;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Array - mimics std::deque<UnknownElement>. The array contents are effectively
|
||||||
|
// heterogeneous thanks to the ElementUnknown class. push_back has been replaced
|
||||||
|
// by more generic insert functions.
|
||||||
|
|
||||||
|
class Array
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef std::deque<UnknownElement> Elements;
|
||||||
|
typedef Elements::iterator iterator;
|
||||||
|
typedef Elements::const_iterator const_iterator;
|
||||||
|
|
||||||
|
iterator Begin();
|
||||||
|
iterator End();
|
||||||
|
const_iterator Begin() const;
|
||||||
|
const_iterator End() const;
|
||||||
|
|
||||||
|
iterator Insert(const UnknownElement& element, iterator itWhere);
|
||||||
|
iterator Insert(const UnknownElement& element);
|
||||||
|
iterator Erase(iterator itWhere);
|
||||||
|
void Resize(size_t newSize);
|
||||||
|
void Clear();
|
||||||
|
|
||||||
|
size_t Size() const;
|
||||||
|
bool Empty() const;
|
||||||
|
|
||||||
|
UnknownElement& operator[] (size_t index);
|
||||||
|
const UnknownElement& operator[] (size_t index) const;
|
||||||
|
|
||||||
|
bool operator == (const Array& array) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Elements m_Elements;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Object - mimics std::map<std::string, UnknownElement>. The member value
|
||||||
|
// contents are effectively heterogeneous thanks to the UnknownElement class
|
||||||
|
|
||||||
|
class Object
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
struct Member {
|
||||||
|
Member(const std::string& nameIn = std::string(), const UnknownElement& elementIn = UnknownElement());
|
||||||
|
|
||||||
|
bool operator == (const Member& member) const;
|
||||||
|
|
||||||
|
std::string name;
|
||||||
|
UnknownElement element;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::list<Member> Members; // map faster, but does not preserve order
|
||||||
|
typedef Members::iterator iterator;
|
||||||
|
typedef Members::const_iterator const_iterator;
|
||||||
|
|
||||||
|
bool operator == (const Object& object) const;
|
||||||
|
|
||||||
|
iterator Begin();
|
||||||
|
iterator End();
|
||||||
|
const_iterator Begin() const;
|
||||||
|
const_iterator End() const;
|
||||||
|
|
||||||
|
size_t Size() const;
|
||||||
|
bool Empty() const;
|
||||||
|
|
||||||
|
iterator Find(const std::string& name);
|
||||||
|
const_iterator Find(const std::string& name) const;
|
||||||
|
|
||||||
|
iterator Insert(const Member& member);
|
||||||
|
iterator Insert(const Member& member, iterator itWhere);
|
||||||
|
iterator Erase(iterator itWhere);
|
||||||
|
void Clear();
|
||||||
|
|
||||||
|
UnknownElement& operator [](const std::string& name);
|
||||||
|
const UnknownElement& operator [](const std::string& name) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
class Finder;
|
||||||
|
|
||||||
|
Members m_Members;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// TrivialType_T - class template for encapsulates a simple data type, such as
|
||||||
|
// a string, number, or boolean. Provides implicit const & noncost cast operators
|
||||||
|
// for that type, allowing "DataTypeT type = trivialType;"
|
||||||
|
|
||||||
|
|
||||||
|
template <typename DataTypeT>
|
||||||
|
class TrivialType_T
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TrivialType_T(const DataTypeT& t = DataTypeT());
|
||||||
|
|
||||||
|
operator DataTypeT&();
|
||||||
|
operator const DataTypeT&() const;
|
||||||
|
|
||||||
|
DataTypeT& Value();
|
||||||
|
const DataTypeT& Value() const;
|
||||||
|
|
||||||
|
bool operator == (const TrivialType_T<DataTypeT>& trivial) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
DataTypeT m_tValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Null - doesn't do much of anything but satisfy the JSON spec. It is the default
|
||||||
|
// element type of UnknownElement
|
||||||
|
|
||||||
|
class Null
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool operator == (const Null& trivial) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End namespace
|
||||||
|
|
||||||
|
|
||||||
|
#include "elements.inl"
|
412
aegisub/libaegisub/include/libaegisub/cajun/elements.inl
Normal file
412
aegisub/libaegisub/include/libaegisub/cajun/elements.inl
Normal file
|
@ -0,0 +1,412 @@
|
||||||
|
/**********************************************
|
||||||
|
|
||||||
|
License: BSD
|
||||||
|
Project Webpage: http://cajun-jsonapi.sourceforge.net/
|
||||||
|
Author: Terry Caton
|
||||||
|
|
||||||
|
***********************************************/
|
||||||
|
|
||||||
|
#include "visitor.h"
|
||||||
|
#include "reader.h"
|
||||||
|
#include <cassert>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
* better documentation
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace json
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
inline Exception::Exception(const std::string& sMessage) :
|
||||||
|
std::runtime_error(sMessage) {}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////
|
||||||
|
// UnknownElement members
|
||||||
|
|
||||||
|
class UnknownElement::Imp
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~Imp() {}
|
||||||
|
virtual Imp* Clone() const = 0;
|
||||||
|
|
||||||
|
virtual bool Compare(const Imp& imp) const = 0;
|
||||||
|
|
||||||
|
virtual void Accept(ConstVisitor& visitor) const = 0;
|
||||||
|
virtual void Accept(Visitor& visitor) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template <typename ElementTypeT>
|
||||||
|
class UnknownElement::Imp_T : public UnknownElement::Imp
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Imp_T(const ElementTypeT& element) : m_Element(element) {}
|
||||||
|
virtual Imp* Clone() const { return new Imp_T<ElementTypeT>(*this); }
|
||||||
|
|
||||||
|
virtual void Accept(ConstVisitor& visitor) const { visitor.Visit(m_Element); }
|
||||||
|
virtual void Accept(Visitor& visitor) { visitor.Visit(m_Element); }
|
||||||
|
|
||||||
|
virtual bool Compare(const Imp& imp) const
|
||||||
|
{
|
||||||
|
ConstCastVisitor_T<ElementTypeT> castVisitor;
|
||||||
|
imp.Accept(castVisitor);
|
||||||
|
return castVisitor.m_pElement &&
|
||||||
|
m_Element == *castVisitor.m_pElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
ElementTypeT m_Element;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class UnknownElement::ConstCastVisitor : public ConstVisitor
|
||||||
|
{
|
||||||
|
virtual void Visit(const Array& array) {}
|
||||||
|
virtual void Visit(const Object& object) {}
|
||||||
|
virtual void Visit(const Number& number) {}
|
||||||
|
virtual void Visit(const String& string) {}
|
||||||
|
virtual void Visit(const Boolean& boolean) {}
|
||||||
|
virtual void Visit(const Null& null) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename ElementTypeT>
|
||||||
|
class UnknownElement::ConstCastVisitor_T : public ConstCastVisitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ConstCastVisitor_T() : m_pElement(0) {}
|
||||||
|
virtual void Visit(const ElementTypeT& element) { m_pElement = &element; } // we don't know what this is, but it overrides one of the base's no-op functions
|
||||||
|
const ElementTypeT* m_pElement;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class UnknownElement::CastVisitor : public Visitor
|
||||||
|
{
|
||||||
|
virtual void Visit(Array& array) {}
|
||||||
|
virtual void Visit(Object& object) {}
|
||||||
|
virtual void Visit(Number& number) {}
|
||||||
|
virtual void Visit(String& string) {}
|
||||||
|
virtual void Visit(Boolean& boolean) {}
|
||||||
|
virtual void Visit(Null& null) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename ElementTypeT>
|
||||||
|
class UnknownElement::CastVisitor_T : public CastVisitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CastVisitor_T() : m_pElement(0) {}
|
||||||
|
virtual void Visit(ElementTypeT& element) { m_pElement = &element; } // we don't know what this is, but it overrides one of the base's no-op functions
|
||||||
|
ElementTypeT* m_pElement;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
inline UnknownElement::UnknownElement() : m_pImp( new Imp_T<Null>( Null() ) ) {}
|
||||||
|
inline UnknownElement::UnknownElement(const UnknownElement& unknown) : m_pImp( unknown.m_pImp->Clone()) {}
|
||||||
|
inline UnknownElement::UnknownElement(const Object& object) : m_pImp( new Imp_T<Object>(object) ) {}
|
||||||
|
inline UnknownElement::UnknownElement(const Array& array) : m_pImp( new Imp_T<Array>(array) ) {}
|
||||||
|
inline UnknownElement::UnknownElement(const Number& number) : m_pImp( new Imp_T<Number>(number) ) {}
|
||||||
|
inline UnknownElement::UnknownElement(const Boolean& boolean) : m_pImp( new Imp_T<Boolean>(boolean) ) {}
|
||||||
|
inline UnknownElement::UnknownElement(const String& string) : m_pImp( new Imp_T<String>(string) ) {}
|
||||||
|
inline UnknownElement::UnknownElement(const Null& null) : m_pImp( new Imp_T<Null>(null) ) {}
|
||||||
|
|
||||||
|
inline UnknownElement::~UnknownElement() { delete m_pImp; }
|
||||||
|
|
||||||
|
inline UnknownElement::operator const Object& () const { return CastTo<Object>(); }
|
||||||
|
inline UnknownElement::operator const Array& () const { return CastTo<Array>(); }
|
||||||
|
inline UnknownElement::operator const Number& () const { return CastTo<Number>(); }
|
||||||
|
inline UnknownElement::operator const Boolean& () const { return CastTo<Boolean>(); }
|
||||||
|
inline UnknownElement::operator const String& () const { return CastTo<String>(); }
|
||||||
|
inline UnknownElement::operator const Null& () const { return CastTo<Null>(); }
|
||||||
|
|
||||||
|
inline UnknownElement::operator Object& () { return ConvertTo<Object>(); }
|
||||||
|
inline UnknownElement::operator Array& () { return ConvertTo<Array>(); }
|
||||||
|
inline UnknownElement::operator Number& () { return ConvertTo<Number>(); }
|
||||||
|
inline UnknownElement::operator Boolean& () { return ConvertTo<Boolean>(); }
|
||||||
|
inline UnknownElement::operator String& () { return ConvertTo<String>(); }
|
||||||
|
inline UnknownElement::operator Null& () { return ConvertTo<Null>(); }
|
||||||
|
|
||||||
|
inline UnknownElement& UnknownElement::operator = (const UnknownElement& unknown)
|
||||||
|
{
|
||||||
|
delete m_pImp;
|
||||||
|
m_pImp = unknown.m_pImp->Clone();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline UnknownElement& UnknownElement::operator[] (const std::string& key)
|
||||||
|
{
|
||||||
|
// the people want an object. make us one if we aren't already
|
||||||
|
Object& object = ConvertTo<Object>();
|
||||||
|
return object[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const UnknownElement& UnknownElement::operator[] (const std::string& key) const
|
||||||
|
{
|
||||||
|
// throws if we aren't an object
|
||||||
|
const Object& object = CastTo<Object>();
|
||||||
|
return object[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline UnknownElement& UnknownElement::operator[] (size_t index)
|
||||||
|
{
|
||||||
|
// the people want an array. make us one if we aren't already
|
||||||
|
Array& array = ConvertTo<Array>();
|
||||||
|
return array[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const UnknownElement& UnknownElement::operator[] (size_t index) const
|
||||||
|
{
|
||||||
|
// throws if we aren't an array
|
||||||
|
const Array& array = CastTo<Array>();
|
||||||
|
return array[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <typename ElementTypeT>
|
||||||
|
const ElementTypeT& UnknownElement::CastTo() const
|
||||||
|
{
|
||||||
|
ConstCastVisitor_T<ElementTypeT> castVisitor;
|
||||||
|
m_pImp->Accept(castVisitor);
|
||||||
|
if (castVisitor.m_pElement == 0)
|
||||||
|
throw Exception("Bad cast");
|
||||||
|
return *castVisitor.m_pElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template <typename ElementTypeT>
|
||||||
|
ElementTypeT& UnknownElement::ConvertTo()
|
||||||
|
{
|
||||||
|
CastVisitor_T<ElementTypeT> castVisitor;
|
||||||
|
m_pImp->Accept(castVisitor);
|
||||||
|
if (castVisitor.m_pElement == 0)
|
||||||
|
{
|
||||||
|
// we're not the right type. fix it & try again
|
||||||
|
*this = ElementTypeT();
|
||||||
|
m_pImp->Accept(castVisitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *castVisitor.m_pElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void UnknownElement::Accept(ConstVisitor& visitor) const { m_pImp->Accept(visitor); }
|
||||||
|
inline void UnknownElement::Accept(Visitor& visitor) { m_pImp->Accept(visitor); }
|
||||||
|
|
||||||
|
|
||||||
|
inline bool UnknownElement::operator == (const UnknownElement& element) const
|
||||||
|
{
|
||||||
|
return m_pImp->Compare(*element.m_pImp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////
|
||||||
|
// Object members
|
||||||
|
|
||||||
|
|
||||||
|
inline Object::Member::Member(const std::string& nameIn, const UnknownElement& elementIn) :
|
||||||
|
name(nameIn), element(elementIn) {}
|
||||||
|
|
||||||
|
inline bool Object::Member::operator == (const Member& member) const
|
||||||
|
{
|
||||||
|
return name == member.name &&
|
||||||
|
element == member.element;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Object::Finder : public std::unary_function<Object::Member, bool>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Finder(const std::string& name) : m_name(name) {}
|
||||||
|
bool operator () (const Object::Member& member) {
|
||||||
|
return member.name == m_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string m_name;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
inline Object::iterator Object::Begin() { return m_Members.begin(); }
|
||||||
|
inline Object::iterator Object::End() { return m_Members.end(); }
|
||||||
|
inline Object::const_iterator Object::Begin() const { return m_Members.begin(); }
|
||||||
|
inline Object::const_iterator Object::End() const { return m_Members.end(); }
|
||||||
|
|
||||||
|
inline size_t Object::Size() const { return m_Members.size(); }
|
||||||
|
inline bool Object::Empty() const { return m_Members.empty(); }
|
||||||
|
|
||||||
|
inline Object::iterator Object::Find(const std::string& name)
|
||||||
|
{
|
||||||
|
return std::find_if(m_Members.begin(), m_Members.end(), Finder(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Object::const_iterator Object::Find(const std::string& name) const
|
||||||
|
{
|
||||||
|
return std::find_if(m_Members.begin(), m_Members.end(), Finder(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Object::iterator Object::Insert(const Member& member)
|
||||||
|
{
|
||||||
|
return Insert(member, End());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Object::iterator Object::Insert(const Member& member, iterator itWhere)
|
||||||
|
{
|
||||||
|
iterator it = Find(member.name);
|
||||||
|
if (it != m_Members.end())
|
||||||
|
throw Exception("Object member already exists: " + member.name);
|
||||||
|
|
||||||
|
it = m_Members.insert(itWhere, member);
|
||||||
|
return it;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Object::iterator Object::Erase(iterator itWhere)
|
||||||
|
{
|
||||||
|
return m_Members.erase(itWhere);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline UnknownElement& Object::operator [](const std::string& name)
|
||||||
|
{
|
||||||
|
|
||||||
|
iterator it = Find(name);
|
||||||
|
if (it == m_Members.end())
|
||||||
|
{
|
||||||
|
Member member(name);
|
||||||
|
it = Insert(member, End());
|
||||||
|
}
|
||||||
|
return it->element;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const UnknownElement& Object::operator [](const std::string& name) const
|
||||||
|
{
|
||||||
|
const_iterator it = Find(name);
|
||||||
|
if (it == End())
|
||||||
|
throw Exception("Object member not found: " + name);
|
||||||
|
return it->element;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Object::Clear()
|
||||||
|
{
|
||||||
|
m_Members.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Object::operator == (const Object& object) const
|
||||||
|
{
|
||||||
|
return m_Members == object.m_Members;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////
|
||||||
|
// Array members
|
||||||
|
|
||||||
|
inline Array::iterator Array::Begin() { return m_Elements.begin(); }
|
||||||
|
inline Array::iterator Array::End() { return m_Elements.end(); }
|
||||||
|
inline Array::const_iterator Array::Begin() const { return m_Elements.begin(); }
|
||||||
|
inline Array::const_iterator Array::End() const { return m_Elements.end(); }
|
||||||
|
|
||||||
|
inline Array::iterator Array::Insert(const UnknownElement& element, iterator itWhere)
|
||||||
|
{
|
||||||
|
return m_Elements.insert(itWhere, element);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Array::iterator Array::Insert(const UnknownElement& element)
|
||||||
|
{
|
||||||
|
return Insert(element, End());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Array::iterator Array::Erase(iterator itWhere)
|
||||||
|
{
|
||||||
|
return m_Elements.erase(itWhere);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Array::Resize(size_t newSize)
|
||||||
|
{
|
||||||
|
m_Elements.resize(newSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline size_t Array::Size() const { return m_Elements.size(); }
|
||||||
|
inline bool Array::Empty() const { return m_Elements.empty(); }
|
||||||
|
|
||||||
|
inline UnknownElement& Array::operator[] (size_t index)
|
||||||
|
{
|
||||||
|
size_t nMinSize = index + 1; // zero indexed
|
||||||
|
if (m_Elements.size() < nMinSize)
|
||||||
|
m_Elements.resize(nMinSize);
|
||||||
|
return m_Elements[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const UnknownElement& Array::operator[] (size_t index) const
|
||||||
|
{
|
||||||
|
if (index >= m_Elements.size())
|
||||||
|
throw Exception("Array out of bounds");
|
||||||
|
return m_Elements[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Array::Clear() {
|
||||||
|
m_Elements.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Array::operator == (const Array& array) const
|
||||||
|
{
|
||||||
|
return m_Elements == array.m_Elements;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////
|
||||||
|
// TrivialType_T members
|
||||||
|
|
||||||
|
template <typename DataTypeT>
|
||||||
|
TrivialType_T<DataTypeT>::TrivialType_T(const DataTypeT& t) :
|
||||||
|
m_tValue(t) {}
|
||||||
|
|
||||||
|
template <typename DataTypeT>
|
||||||
|
TrivialType_T<DataTypeT>::operator DataTypeT&()
|
||||||
|
{
|
||||||
|
return Value();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename DataTypeT>
|
||||||
|
TrivialType_T<DataTypeT>::operator const DataTypeT&() const
|
||||||
|
{
|
||||||
|
return Value();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename DataTypeT>
|
||||||
|
DataTypeT& TrivialType_T<DataTypeT>::Value()
|
||||||
|
{
|
||||||
|
return m_tValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename DataTypeT>
|
||||||
|
const DataTypeT& TrivialType_T<DataTypeT>::Value() const
|
||||||
|
{
|
||||||
|
return m_tValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename DataTypeT>
|
||||||
|
bool TrivialType_T<DataTypeT>::operator == (const TrivialType_T<DataTypeT>& trivial) const
|
||||||
|
{
|
||||||
|
return m_tValue == trivial.m_tValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////
|
||||||
|
// Null members
|
||||||
|
|
||||||
|
inline bool Null::operator == (const Null& trivial) const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End namespace
|
125
aegisub/libaegisub/include/libaegisub/cajun/reader.h
Normal file
125
aegisub/libaegisub/include/libaegisub/cajun/reader.h
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
/**********************************************
|
||||||
|
|
||||||
|
License: BSD
|
||||||
|
Project Webpage: http://cajun-jsonapi.sourceforge.net/
|
||||||
|
Author: Terry Caton
|
||||||
|
|
||||||
|
***********************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "elements.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace json
|
||||||
|
{
|
||||||
|
|
||||||
|
class Reader
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// this structure will be reported in one of the exceptions defined below
|
||||||
|
struct Location
|
||||||
|
{
|
||||||
|
Location();
|
||||||
|
|
||||||
|
unsigned int m_nLine; // document line, zero-indexed
|
||||||
|
unsigned int m_nLineOffset; // character offset from beginning of line, zero indexed
|
||||||
|
unsigned int m_nDocOffset; // character offset from entire document, zero indexed
|
||||||
|
};
|
||||||
|
|
||||||
|
// thrown during the first phase of reading. generally catches low-level problems such
|
||||||
|
// as errant characters or corrupt/incomplete documents
|
||||||
|
class ScanException : public Exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ScanException(const std::string& sMessage, const Reader::Location& locError) :
|
||||||
|
Exception(sMessage),
|
||||||
|
m_locError(locError) {}
|
||||||
|
|
||||||
|
Reader::Location m_locError;
|
||||||
|
};
|
||||||
|
|
||||||
|
// thrown during the second phase of reading. generally catches higher-level problems such
|
||||||
|
// as missing commas or brackets
|
||||||
|
class ParseException : public Exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ParseException(const std::string& sMessage, const Reader::Location& locTokenBegin, const Reader::Location& locTokenEnd) :
|
||||||
|
Exception(sMessage),
|
||||||
|
m_locTokenBegin(locTokenBegin),
|
||||||
|
m_locTokenEnd(locTokenEnd) {}
|
||||||
|
|
||||||
|
Reader::Location m_locTokenBegin;
|
||||||
|
Reader::Location m_locTokenEnd;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// if you know what the document looks like, call one of these...
|
||||||
|
static void Read(Object& object, std::istream& istr);
|
||||||
|
static void Read(Array& array, std::istream& istr);
|
||||||
|
static void Read(String& string, std::istream& istr);
|
||||||
|
static void Read(Number& number, std::istream& istr);
|
||||||
|
static void Read(Boolean& boolean, std::istream& istr);
|
||||||
|
static void Read(Null& null, std::istream& istr);
|
||||||
|
|
||||||
|
// ...otherwise, if you don't know, call this & visit it
|
||||||
|
static void Read(UnknownElement& elementRoot, std::istream& istr);
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct Token
|
||||||
|
{
|
||||||
|
enum Type
|
||||||
|
{
|
||||||
|
TOKEN_OBJECT_BEGIN, // {
|
||||||
|
TOKEN_OBJECT_END, // }
|
||||||
|
TOKEN_ARRAY_BEGIN, // [
|
||||||
|
TOKEN_ARRAY_END, // ]
|
||||||
|
TOKEN_NEXT_ELEMENT, // ,
|
||||||
|
TOKEN_MEMBER_ASSIGN, // :
|
||||||
|
TOKEN_STRING, // "xxx"
|
||||||
|
TOKEN_NUMBER, // [+/-]000.000[e[+/-]000]
|
||||||
|
TOKEN_BOOLEAN, // true -or- false
|
||||||
|
TOKEN_NULL // null
|
||||||
|
};
|
||||||
|
|
||||||
|
Type nType;
|
||||||
|
std::string sValue;
|
||||||
|
|
||||||
|
// for malformed file debugging
|
||||||
|
Reader::Location locBegin;
|
||||||
|
Reader::Location locEnd;
|
||||||
|
};
|
||||||
|
|
||||||
|
class InputStream;
|
||||||
|
class TokenStream;
|
||||||
|
typedef std::vector<Token> Tokens;
|
||||||
|
|
||||||
|
template <typename ElementTypeT>
|
||||||
|
static void Read_i(ElementTypeT& element, std::istream& istr);
|
||||||
|
|
||||||
|
// scanning istream into token sequence
|
||||||
|
void Scan(Tokens& tokens, InputStream& inputStream);
|
||||||
|
|
||||||
|
void EatWhiteSpace(InputStream& inputStream);
|
||||||
|
void MatchString(std::string& sValue, InputStream& inputStream);
|
||||||
|
void MatchNumber(std::string& sNumber, InputStream& inputStream);
|
||||||
|
void MatchExpectedString(const std::string& sExpected, InputStream& inputStream);
|
||||||
|
|
||||||
|
// parsing token sequence into element structure
|
||||||
|
void Parse(UnknownElement& element, TokenStream& tokenStream);
|
||||||
|
void Parse(Object& object, TokenStream& tokenStream);
|
||||||
|
void Parse(Array& array, TokenStream& tokenStream);
|
||||||
|
void Parse(String& string, TokenStream& tokenStream);
|
||||||
|
void Parse(Number& number, TokenStream& tokenStream);
|
||||||
|
void Parse(Boolean& boolean, TokenStream& tokenStream);
|
||||||
|
void Parse(Null& null, TokenStream& tokenStream);
|
||||||
|
|
||||||
|
const std::string& MatchExpectedToken(Token::Type nExpected, TokenStream& tokenStream);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End namespace
|
||||||
|
|
||||||
|
|
||||||
|
#include "reader.inl"
|
519
aegisub/libaegisub/include/libaegisub/cajun/reader.inl
Normal file
519
aegisub/libaegisub/include/libaegisub/cajun/reader.inl
Normal file
|
@ -0,0 +1,519 @@
|
||||||
|
/**********************************************
|
||||||
|
|
||||||
|
License: BSD
|
||||||
|
Project Webpage: http://cajun-jsonapi.sourceforge.net/
|
||||||
|
Author: Terry Caton
|
||||||
|
|
||||||
|
***********************************************/
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
#include <set>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
* better documentation
|
||||||
|
* unicode character decoding
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace json
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
inline std::istream& operator >> (std::istream& istr, UnknownElement& elementRoot) {
|
||||||
|
Reader::Read(elementRoot, istr);
|
||||||
|
return istr;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Reader::Location::Location() :
|
||||||
|
m_nLine(0),
|
||||||
|
m_nLineOffset(0),
|
||||||
|
m_nDocOffset(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////
|
||||||
|
// Reader::InputStream
|
||||||
|
|
||||||
|
class Reader::InputStream // would be cool if we could inherit from std::istream & override "get"
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
InputStream(std::istream& iStr) :
|
||||||
|
m_iStr(iStr) {}
|
||||||
|
|
||||||
|
// protect access to the input stream, so we can keeep track of document/line offsets
|
||||||
|
char Get(); // big, define outside
|
||||||
|
char Peek() {
|
||||||
|
assert(m_iStr.eof() == false); // enforce reading of only valid stream data
|
||||||
|
return m_iStr.peek();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EOS() {
|
||||||
|
m_iStr.peek(); // apparently eof flag isn't set until a character read is attempted. whatever.
|
||||||
|
return m_iStr.eof();
|
||||||
|
}
|
||||||
|
|
||||||
|
const Location& GetLocation() const { return m_Location; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::istream& m_iStr;
|
||||||
|
Location m_Location;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline char Reader::InputStream::Get()
|
||||||
|
{
|
||||||
|
assert(m_iStr.eof() == false); // enforce reading of only valid stream data
|
||||||
|
char c = m_iStr.get();
|
||||||
|
|
||||||
|
++m_Location.m_nDocOffset;
|
||||||
|
if (c == '\n') {
|
||||||
|
++m_Location.m_nLine;
|
||||||
|
m_Location.m_nLineOffset = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
++m_Location.m_nLineOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////
|
||||||
|
// Reader::TokenStream
|
||||||
|
|
||||||
|
class Reader::TokenStream
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TokenStream(const Tokens& tokens);
|
||||||
|
|
||||||
|
const Token& Peek();
|
||||||
|
const Token& Get();
|
||||||
|
|
||||||
|
bool EOS() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const Tokens& m_Tokens;
|
||||||
|
Tokens::const_iterator m_itCurrent;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline Reader::TokenStream::TokenStream(const Tokens& tokens) :
|
||||||
|
m_Tokens(tokens),
|
||||||
|
m_itCurrent(tokens.begin())
|
||||||
|
{}
|
||||||
|
|
||||||
|
inline const Reader::Token& Reader::TokenStream::Peek() {
|
||||||
|
assert(m_itCurrent != m_Tokens.end());
|
||||||
|
return *(m_itCurrent);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const Reader::Token& Reader::TokenStream::Get() {
|
||||||
|
assert(m_itCurrent != m_Tokens.end());
|
||||||
|
return *(m_itCurrent++);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Reader::TokenStream::EOS() const {
|
||||||
|
return m_itCurrent == m_Tokens.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////
|
||||||
|
// Reader (finally)
|
||||||
|
|
||||||
|
|
||||||
|
inline void Reader::Read(Object& object, std::istream& istr) { Read_i(object, istr); }
|
||||||
|
inline void Reader::Read(Array& array, std::istream& istr) { Read_i(array, istr); }
|
||||||
|
inline void Reader::Read(String& string, std::istream& istr) { Read_i(string, istr); }
|
||||||
|
inline void Reader::Read(Number& number, std::istream& istr) { Read_i(number, istr); }
|
||||||
|
inline void Reader::Read(Boolean& boolean, std::istream& istr) { Read_i(boolean, istr); }
|
||||||
|
inline void Reader::Read(Null& null, std::istream& istr) { Read_i(null, istr); }
|
||||||
|
inline void Reader::Read(UnknownElement& unknown, std::istream& istr) { Read_i(unknown, istr); }
|
||||||
|
|
||||||
|
|
||||||
|
template <typename ElementTypeT>
|
||||||
|
void Reader::Read_i(ElementTypeT& element, std::istream& istr)
|
||||||
|
{
|
||||||
|
Reader reader;
|
||||||
|
|
||||||
|
Tokens tokens;
|
||||||
|
InputStream inputStream(istr);
|
||||||
|
reader.Scan(tokens, inputStream);
|
||||||
|
|
||||||
|
TokenStream tokenStream(tokens);
|
||||||
|
reader.Parse(element, tokenStream);
|
||||||
|
|
||||||
|
if (tokenStream.EOS() == false)
|
||||||
|
{
|
||||||
|
const Token& token = tokenStream.Peek();
|
||||||
|
std::string sMessage = "Expected End of token stream; found " + token.sValue;
|
||||||
|
throw ParseException(sMessage, token.locBegin, token.locEnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Reader::Scan(Tokens& tokens, InputStream& inputStream)
|
||||||
|
{
|
||||||
|
while (EatWhiteSpace(inputStream), // ignore any leading white space...
|
||||||
|
inputStream.EOS() == false) // ...before checking for EOS
|
||||||
|
{
|
||||||
|
// if all goes well, we'll create a token each pass
|
||||||
|
Token token;
|
||||||
|
token.locBegin = inputStream.GetLocation();
|
||||||
|
|
||||||
|
// gives us null-terminated string
|
||||||
|
std::string sChar;
|
||||||
|
sChar.push_back(inputStream.Peek());
|
||||||
|
|
||||||
|
switch (sChar[0])
|
||||||
|
{
|
||||||
|
case '{':
|
||||||
|
token.sValue = sChar[0];
|
||||||
|
MatchExpectedString(sChar, inputStream);
|
||||||
|
token.nType = Token::TOKEN_OBJECT_BEGIN;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '}':
|
||||||
|
token.sValue = sChar[0];
|
||||||
|
MatchExpectedString(sChar, inputStream);
|
||||||
|
token.nType = Token::TOKEN_OBJECT_END;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '[':
|
||||||
|
token.sValue = sChar[0];
|
||||||
|
MatchExpectedString(sChar, inputStream);
|
||||||
|
token.nType = Token::TOKEN_ARRAY_BEGIN;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ']':
|
||||||
|
token.sValue = sChar[0];
|
||||||
|
MatchExpectedString(sChar, inputStream);
|
||||||
|
token.nType = Token::TOKEN_ARRAY_END;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ',':
|
||||||
|
token.sValue = sChar[0];
|
||||||
|
MatchExpectedString(sChar, inputStream);
|
||||||
|
token.nType = Token::TOKEN_NEXT_ELEMENT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ':':
|
||||||
|
token.sValue = sChar[0];
|
||||||
|
MatchExpectedString(sChar, inputStream);
|
||||||
|
token.nType = Token::TOKEN_MEMBER_ASSIGN;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '"':
|
||||||
|
MatchString(token.sValue, inputStream);
|
||||||
|
token.nType = Token::TOKEN_STRING;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '-':
|
||||||
|
case '0':
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
MatchNumber(token.sValue, inputStream);
|
||||||
|
token.nType = Token::TOKEN_NUMBER;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 't':
|
||||||
|
token.sValue = "true";
|
||||||
|
MatchExpectedString(token.sValue, inputStream);
|
||||||
|
token.nType = Token::TOKEN_BOOLEAN;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'f':
|
||||||
|
token.sValue = "false";
|
||||||
|
MatchExpectedString(token.sValue, inputStream);
|
||||||
|
token.nType = Token::TOKEN_BOOLEAN;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'n':
|
||||||
|
token.sValue = "null";
|
||||||
|
MatchExpectedString(token.sValue, inputStream);
|
||||||
|
token.nType = Token::TOKEN_NULL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: {
|
||||||
|
std::string sErrorMessage = "Unexpected character in stream: " + sChar;
|
||||||
|
throw ScanException(sErrorMessage, inputStream.GetLocation());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
token.locEnd = inputStream.GetLocation();
|
||||||
|
tokens.push_back(token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Reader::EatWhiteSpace(InputStream& inputStream)
|
||||||
|
{
|
||||||
|
while (inputStream.EOS() == false &&
|
||||||
|
::isspace(inputStream.Peek()))
|
||||||
|
inputStream.Get();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Reader::MatchExpectedString(const std::string& sExpected, InputStream& inputStream)
|
||||||
|
{
|
||||||
|
std::string::const_iterator it(sExpected.begin()),
|
||||||
|
itEnd(sExpected.end());
|
||||||
|
for ( ; it != itEnd; ++it) {
|
||||||
|
if (inputStream.EOS() || // did we reach the end before finding what we're looking for...
|
||||||
|
inputStream.Get() != *it) // ...or did we find something different?
|
||||||
|
{
|
||||||
|
std::string sMessage = "Expected string: " + sExpected;
|
||||||
|
throw ScanException(sMessage, inputStream.GetLocation());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// all's well if we made it here, return quietly
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Reader::MatchString(std::string& string, InputStream& inputStream)
|
||||||
|
{
|
||||||
|
MatchExpectedString("\"", inputStream);
|
||||||
|
|
||||||
|
while (inputStream.EOS() == false &&
|
||||||
|
inputStream.Peek() != '"')
|
||||||
|
{
|
||||||
|
char c = inputStream.Get();
|
||||||
|
|
||||||
|
// escape?
|
||||||
|
if (c == '\\' &&
|
||||||
|
inputStream.EOS() == false) // shouldn't have reached the end yet
|
||||||
|
{
|
||||||
|
c = inputStream.Get();
|
||||||
|
switch (c) {
|
||||||
|
case '/': string.push_back('/'); break;
|
||||||
|
case '"': string.push_back('"'); break;
|
||||||
|
case '\\': string.push_back('\\'); break;
|
||||||
|
case 'b': string.push_back('\b'); break;
|
||||||
|
case 'f': string.push_back('\f'); break;
|
||||||
|
case 'n': string.push_back('\n'); break;
|
||||||
|
case 'r': string.push_back('\r'); break;
|
||||||
|
case 't': string.push_back('\t'); break;
|
||||||
|
case 'u': // TODO: what do we do with this?
|
||||||
|
default: {
|
||||||
|
std::string sMessage = "Unrecognized escape sequence found in string: \\" + c;
|
||||||
|
throw ScanException(sMessage, inputStream.GetLocation());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
string.push_back(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// eat the last '"' that we just peeked
|
||||||
|
MatchExpectedString("\"", inputStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Reader::MatchNumber(std::string& sNumber, InputStream& inputStream)
|
||||||
|
{
|
||||||
|
const char sNumericChars[] = "0123456789.eE-+";
|
||||||
|
std::set<char> numericChars;
|
||||||
|
numericChars.insert(sNumericChars, sNumericChars + sizeof(sNumericChars));
|
||||||
|
|
||||||
|
while (inputStream.EOS() == false &&
|
||||||
|
numericChars.find(inputStream.Peek()) != numericChars.end())
|
||||||
|
{
|
||||||
|
sNumber.push_back(inputStream.Get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Reader::Parse(UnknownElement& element, Reader::TokenStream& tokenStream)
|
||||||
|
{
|
||||||
|
if (tokenStream.EOS()) {
|
||||||
|
std::string sMessage = "Unexpected end of token stream";
|
||||||
|
throw ParseException(sMessage, Location(), Location()); // nowhere to point to
|
||||||
|
}
|
||||||
|
|
||||||
|
const Token& token = tokenStream.Peek();
|
||||||
|
switch (token.nType) {
|
||||||
|
case Token::TOKEN_OBJECT_BEGIN:
|
||||||
|
{
|
||||||
|
// implicit non-const cast will perform conversion for us (if necessary)
|
||||||
|
Object& object = element;
|
||||||
|
Parse(object, tokenStream);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case Token::TOKEN_ARRAY_BEGIN:
|
||||||
|
{
|
||||||
|
Array& array = element;
|
||||||
|
Parse(array, tokenStream);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case Token::TOKEN_STRING:
|
||||||
|
{
|
||||||
|
String& string = element;
|
||||||
|
Parse(string, tokenStream);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case Token::TOKEN_NUMBER:
|
||||||
|
{
|
||||||
|
Number& number = element;
|
||||||
|
Parse(number, tokenStream);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case Token::TOKEN_BOOLEAN:
|
||||||
|
{
|
||||||
|
Boolean& boolean = element;
|
||||||
|
Parse(boolean, tokenStream);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case Token::TOKEN_NULL:
|
||||||
|
{
|
||||||
|
Null& null = element;
|
||||||
|
Parse(null, tokenStream);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
std::string sMessage = "Unexpected token: " + token.sValue;
|
||||||
|
throw ParseException(sMessage, token.locBegin, token.locEnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Reader::Parse(Object& object, Reader::TokenStream& tokenStream)
|
||||||
|
{
|
||||||
|
MatchExpectedToken(Token::TOKEN_OBJECT_BEGIN, tokenStream);
|
||||||
|
|
||||||
|
bool bContinue = (tokenStream.EOS() == false &&
|
||||||
|
tokenStream.Peek().nType != Token::TOKEN_OBJECT_END);
|
||||||
|
while (bContinue)
|
||||||
|
{
|
||||||
|
Object::Member member;
|
||||||
|
|
||||||
|
// first the member name. save the token in case we have to throw an exception
|
||||||
|
const Token& tokenName = tokenStream.Peek();
|
||||||
|
member.name = MatchExpectedToken(Token::TOKEN_STRING, tokenStream);
|
||||||
|
|
||||||
|
// ...then the key/value separator...
|
||||||
|
MatchExpectedToken(Token::TOKEN_MEMBER_ASSIGN, tokenStream);
|
||||||
|
|
||||||
|
// ...then the value itself (can be anything).
|
||||||
|
Parse(member.element, tokenStream);
|
||||||
|
|
||||||
|
// try adding it to the object (this could throw)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
object.Insert(member);
|
||||||
|
}
|
||||||
|
catch (Exception&)
|
||||||
|
{
|
||||||
|
// must be a duplicate name
|
||||||
|
std::string sMessage = "Duplicate object member token: " + member.name;
|
||||||
|
throw ParseException(sMessage, tokenName.locBegin, tokenName.locEnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
bContinue = (tokenStream.EOS() == false &&
|
||||||
|
tokenStream.Peek().nType == Token::TOKEN_NEXT_ELEMENT);
|
||||||
|
if (bContinue)
|
||||||
|
MatchExpectedToken(Token::TOKEN_NEXT_ELEMENT, tokenStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
MatchExpectedToken(Token::TOKEN_OBJECT_END, tokenStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Reader::Parse(Array& array, Reader::TokenStream& tokenStream)
|
||||||
|
{
|
||||||
|
MatchExpectedToken(Token::TOKEN_ARRAY_BEGIN, tokenStream);
|
||||||
|
|
||||||
|
bool bContinue = (tokenStream.EOS() == false &&
|
||||||
|
tokenStream.Peek().nType != Token::TOKEN_ARRAY_END);
|
||||||
|
while (bContinue)
|
||||||
|
{
|
||||||
|
// ...what's next? could be anything
|
||||||
|
Array::iterator itElement = array.Insert(UnknownElement());
|
||||||
|
UnknownElement& element = *itElement;
|
||||||
|
Parse(element, tokenStream);
|
||||||
|
|
||||||
|
bContinue = (tokenStream.EOS() == false &&
|
||||||
|
tokenStream.Peek().nType == Token::TOKEN_NEXT_ELEMENT);
|
||||||
|
if (bContinue)
|
||||||
|
MatchExpectedToken(Token::TOKEN_NEXT_ELEMENT, tokenStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
MatchExpectedToken(Token::TOKEN_ARRAY_END, tokenStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Reader::Parse(String& string, Reader::TokenStream& tokenStream)
|
||||||
|
{
|
||||||
|
string = MatchExpectedToken(Token::TOKEN_STRING, tokenStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Reader::Parse(Number& number, Reader::TokenStream& tokenStream)
|
||||||
|
{
|
||||||
|
const Token& currentToken = tokenStream.Peek(); // might need this later for throwing exception
|
||||||
|
const std::string& sValue = MatchExpectedToken(Token::TOKEN_NUMBER, tokenStream);
|
||||||
|
|
||||||
|
std::istringstream iStr(sValue);
|
||||||
|
double dValue;
|
||||||
|
iStr >> dValue;
|
||||||
|
|
||||||
|
// did we consume all characters in the token?
|
||||||
|
if (iStr.eof() == false)
|
||||||
|
{
|
||||||
|
std::string sMessage = "Unexpected character in NUMBER token: " + iStr.peek();
|
||||||
|
throw ParseException(sMessage, currentToken.locBegin, currentToken.locEnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
number = dValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Reader::Parse(Boolean& boolean, Reader::TokenStream& tokenStream)
|
||||||
|
{
|
||||||
|
const std::string& sValue = MatchExpectedToken(Token::TOKEN_BOOLEAN, tokenStream);
|
||||||
|
boolean = (sValue == "true" ? true : false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Reader::Parse(Null&, Reader::TokenStream& tokenStream)
|
||||||
|
{
|
||||||
|
MatchExpectedToken(Token::TOKEN_NULL, tokenStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const std::string& Reader::MatchExpectedToken(Token::Type nExpected, Reader::TokenStream& tokenStream)
|
||||||
|
{
|
||||||
|
if (tokenStream.EOS())
|
||||||
|
{
|
||||||
|
std::string sMessage = "Unexpected End of token stream";
|
||||||
|
throw ParseException(sMessage, Location(), Location()); // nowhere to point to
|
||||||
|
}
|
||||||
|
|
||||||
|
const Token& token = tokenStream.Get();
|
||||||
|
if (token.nType != nExpected)
|
||||||
|
{
|
||||||
|
std::string sMessage = "Unexpected token: " + token.sValue;
|
||||||
|
throw ParseException(sMessage, token.locBegin, token.locEnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
return token.sValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // End namespace
|
44
aegisub/libaegisub/include/libaegisub/cajun/visitor.h
Normal file
44
aegisub/libaegisub/include/libaegisub/cajun/visitor.h
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/**********************************************
|
||||||
|
|
||||||
|
License: BSD
|
||||||
|
Project Webpage: http://cajun-jsonapi.sourceforge.net/
|
||||||
|
Author: Terry Caton
|
||||||
|
|
||||||
|
***********************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "elements.h"
|
||||||
|
|
||||||
|
namespace json
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
class Visitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~Visitor() {}
|
||||||
|
|
||||||
|
virtual void Visit(Array& array) = 0;
|
||||||
|
virtual void Visit(Object& object) = 0;
|
||||||
|
virtual void Visit(Number& number) = 0;
|
||||||
|
virtual void Visit(String& string) = 0;
|
||||||
|
virtual void Visit(Boolean& boolean) = 0;
|
||||||
|
virtual void Visit(Null& null) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ConstVisitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~ConstVisitor() {}
|
||||||
|
|
||||||
|
virtual void Visit(const Array& array) = 0;
|
||||||
|
virtual void Visit(const Object& object) = 0;
|
||||||
|
virtual void Visit(const Number& number) = 0;
|
||||||
|
virtual void Visit(const String& string) = 0;
|
||||||
|
virtual void Visit(const Boolean& boolean) = 0;
|
||||||
|
virtual void Visit(const Null& null) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End namespace
|
57
aegisub/libaegisub/include/libaegisub/cajun/writer.h
Normal file
57
aegisub/libaegisub/include/libaegisub/cajun/writer.h
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
/**********************************************
|
||||||
|
|
||||||
|
License: BSD
|
||||||
|
Project Webpage: http://cajun-jsonapi.sourceforge.net/
|
||||||
|
Author: Terry Caton
|
||||||
|
|
||||||
|
***********************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "elements.h"
|
||||||
|
#include "visitor.h"
|
||||||
|
|
||||||
|
namespace json
|
||||||
|
{
|
||||||
|
|
||||||
|
class Writer : private ConstVisitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void Write(const Object& object, std::ostream& ostr);
|
||||||
|
static void Write(const Array& array, std::ostream& ostr);
|
||||||
|
static void Write(const String& string, std::ostream& ostr);
|
||||||
|
static void Write(const Number& number, std::ostream& ostr);
|
||||||
|
static void Write(const Boolean& boolean, std::ostream& ostr);
|
||||||
|
static void Write(const Null& null, std::ostream& ostr);
|
||||||
|
static void Write(const UnknownElement& elementRoot, std::ostream& ostr);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Writer(std::ostream& ostr);
|
||||||
|
|
||||||
|
template <typename ElementTypeT>
|
||||||
|
static void Write_i(const ElementTypeT& element, std::ostream& ostr);
|
||||||
|
|
||||||
|
void Write_i(const Object& object);
|
||||||
|
void Write_i(const Array& array);
|
||||||
|
void Write_i(const String& string);
|
||||||
|
void Write_i(const Number& number);
|
||||||
|
void Write_i(const Boolean& boolean);
|
||||||
|
void Write_i(const Null& null);
|
||||||
|
void Write_i(const UnknownElement& unknown);
|
||||||
|
|
||||||
|
virtual void Visit(const Array& array);
|
||||||
|
virtual void Visit(const Object& object);
|
||||||
|
virtual void Visit(const Number& number);
|
||||||
|
virtual void Visit(const String& string);
|
||||||
|
virtual void Visit(const Boolean& boolean);
|
||||||
|
virtual void Visit(const Null& null);
|
||||||
|
|
||||||
|
std::ostream& m_ostr;
|
||||||
|
int m_nTabDepth;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End namespace
|
||||||
|
|
||||||
|
|
||||||
|
#include "writer.inl"
|
153
aegisub/libaegisub/include/libaegisub/cajun/writer.inl
Normal file
153
aegisub/libaegisub/include/libaegisub/cajun/writer.inl
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
/**********************************************
|
||||||
|
|
||||||
|
License: BSD
|
||||||
|
Project Webpage: http://cajun-jsonapi.sourceforge.net/
|
||||||
|
Author: Terry Caton
|
||||||
|
|
||||||
|
***********************************************/
|
||||||
|
|
||||||
|
#include "writer.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
* better documentation
|
||||||
|
* unicode character encoding
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace json
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
inline void Writer::Write(const UnknownElement& elementRoot, std::ostream& ostr) { Write_i(elementRoot, ostr); }
|
||||||
|
inline void Writer::Write(const Object& object, std::ostream& ostr) { Write_i(object, ostr); }
|
||||||
|
inline void Writer::Write(const Array& array, std::ostream& ostr) { Write_i(array, ostr); }
|
||||||
|
inline void Writer::Write(const Number& number, std::ostream& ostr) { Write_i(number, ostr); }
|
||||||
|
inline void Writer::Write(const String& string, std::ostream& ostr) { Write_i(string, ostr); }
|
||||||
|
inline void Writer::Write(const Boolean& boolean, std::ostream& ostr) { Write_i(boolean, ostr); }
|
||||||
|
inline void Writer::Write(const Null& null, std::ostream& ostr) { Write_i(null, ostr); }
|
||||||
|
|
||||||
|
|
||||||
|
inline Writer::Writer(std::ostream& ostr) :
|
||||||
|
m_ostr(ostr),
|
||||||
|
m_nTabDepth(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
template <typename ElementTypeT>
|
||||||
|
void Writer::Write_i(const ElementTypeT& element, std::ostream& ostr)
|
||||||
|
{
|
||||||
|
Writer writer(ostr);
|
||||||
|
writer.Write_i(element);
|
||||||
|
ostr.flush(); // all done
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Writer::Write_i(const Array& array)
|
||||||
|
{
|
||||||
|
if (array.Empty())
|
||||||
|
m_ostr << "[]";
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_ostr << '[' << std::endl;
|
||||||
|
++m_nTabDepth;
|
||||||
|
|
||||||
|
Array::const_iterator it(array.Begin()),
|
||||||
|
itEnd(array.End());
|
||||||
|
while (it != itEnd) {
|
||||||
|
m_ostr << std::string(m_nTabDepth, '\t');
|
||||||
|
|
||||||
|
Write_i(*it);
|
||||||
|
|
||||||
|
if (++it != itEnd)
|
||||||
|
m_ostr << ',';
|
||||||
|
m_ostr << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
--m_nTabDepth;
|
||||||
|
m_ostr << std::string(m_nTabDepth, '\t') << ']';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Writer::Write_i(const Object& object)
|
||||||
|
{
|
||||||
|
if (object.Empty())
|
||||||
|
m_ostr << "{}";
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_ostr << '{' << std::endl;
|
||||||
|
++m_nTabDepth;
|
||||||
|
|
||||||
|
Object::const_iterator it(object.Begin()),
|
||||||
|
itEnd(object.End());
|
||||||
|
while (it != itEnd) {
|
||||||
|
m_ostr << std::string(m_nTabDepth, '\t') << '"' << it->name << "\" : ";
|
||||||
|
Write_i(it->element);
|
||||||
|
|
||||||
|
if (++it != itEnd)
|
||||||
|
m_ostr << ',';
|
||||||
|
m_ostr << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
--m_nTabDepth;
|
||||||
|
m_ostr << std::string(m_nTabDepth, '\t') << '}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Writer::Write_i(const Number& numberElement)
|
||||||
|
{
|
||||||
|
m_ostr << std::setprecision(20) << numberElement.Value();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Writer::Write_i(const Boolean& booleanElement)
|
||||||
|
{
|
||||||
|
m_ostr << (booleanElement.Value() ? "true" : "false");
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Writer::Write_i(const String& stringElement)
|
||||||
|
{
|
||||||
|
m_ostr << '"';
|
||||||
|
|
||||||
|
const std::string& s = stringElement.Value();
|
||||||
|
std::string::const_iterator it(s.begin()),
|
||||||
|
itEnd(s.end());
|
||||||
|
for (; it != itEnd; ++it)
|
||||||
|
{
|
||||||
|
switch (*it)
|
||||||
|
{
|
||||||
|
case '"': m_ostr << "\\\""; break;
|
||||||
|
case '\\': m_ostr << "\\\\"; break;
|
||||||
|
case '\b': m_ostr << "\\b"; break;
|
||||||
|
case '\f': m_ostr << "\\f"; break;
|
||||||
|
case '\n': m_ostr << "\\n"; break;
|
||||||
|
case '\r': m_ostr << "\\r"; break;
|
||||||
|
case '\t': m_ostr << "\\t"; break;
|
||||||
|
//case '\u': m_ostr << ""; break; ??
|
||||||
|
default: m_ostr << *it; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_ostr << '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Writer::Write_i(const Null& )
|
||||||
|
{
|
||||||
|
m_ostr << "null";
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Writer::Write_i(const UnknownElement& unknown)
|
||||||
|
{
|
||||||
|
unknown.Accept(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Writer::Visit(const Array& array) { Write_i(array); }
|
||||||
|
inline void Writer::Visit(const Object& object) { Write_i(object); }
|
||||||
|
inline void Writer::Visit(const Number& number) { Write_i(number); }
|
||||||
|
inline void Writer::Visit(const String& string) { Write_i(string); }
|
||||||
|
inline void Writer::Visit(const Boolean& boolean) { Write_i(boolean); }
|
||||||
|
inline void Writer::Visit(const Null& null) { Write_i(null); }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End namespace
|
31
aegisub/libaegisub/include/libaegisub/colour.h
Normal file
31
aegisub/libaegisub/include/libaegisub/colour.h
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file colour.h
|
||||||
|
/// @brief Colourspace class and functions.
|
||||||
|
/// @ingroup libaegisub
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#include <string>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// This file is a stub for now.
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
|
||||||
|
typedef std::string Colour;
|
||||||
|
|
||||||
|
} // namespace agi
|
|
@ -36,13 +36,10 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifndef AGI_PRE
|
#include <string>
|
||||||
#include <wx/string.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/// @see aegisub.h
|
/// @see aegisub.h
|
||||||
namespace Aegisub {
|
namespace agi {
|
||||||
|
|
||||||
|
|
||||||
/// @class Exception
|
/// @class Exception
|
||||||
|
@ -61,11 +58,11 @@ namespace Aegisub {
|
||||||
/// When throwing exceptions, throw temporaries, not heap allocated
|
/// When throwing exceptions, throw temporaries, not heap allocated
|
||||||
/// objects. (C++ FAQ Lite 17.6.) I.e. this is correct:
|
/// objects. (C++ FAQ Lite 17.6.) I.e. this is correct:
|
||||||
/// @code
|
/// @code
|
||||||
/// throw Aegisub::SomeException(_T("Message for exception"));
|
/// throw Aegisub::SomeException("Message for exception");
|
||||||
/// @endcode
|
/// @endcode
|
||||||
/// This is wrong:
|
/// This is wrong:
|
||||||
/// @code
|
/// @code
|
||||||
/// throw new Aegisub::SomeException(_T("Remember this is the wrong way!"));
|
/// throw new Aegisub::SomeException("Remember this is the wrong way!");
|
||||||
/// @endcode
|
/// @endcode
|
||||||
/// Exceptions must not be allocated on heap, because of the risks of
|
/// Exceptions must not be allocated on heap, because of the risks of
|
||||||
/// leaking memory that way. (C++ FAQ Lite 17.8.)
|
/// leaking memory that way. (C++ FAQ Lite 17.8.)
|
||||||
|
@ -96,7 +93,7 @@ namespace Aegisub {
|
||||||
class Exception {
|
class Exception {
|
||||||
|
|
||||||
/// The error message
|
/// The error message
|
||||||
wxString message;
|
std::string message;
|
||||||
|
|
||||||
/// An inner exception, the cause of this exception
|
/// An inner exception, the cause of this exception
|
||||||
Exception *inner;
|
Exception *inner;
|
||||||
|
@ -109,7 +106,7 @@ namespace Aegisub {
|
||||||
///
|
///
|
||||||
/// Deriving classes should always use this constructor for initialising
|
/// Deriving classes should always use this constructor for initialising
|
||||||
/// the base class.
|
/// the base class.
|
||||||
Exception(const wxString &msg, const Exception *inr = 0)
|
Exception(const std::string &msg, const Exception *inr = 0)
|
||||||
: message(msg)
|
: message(msg)
|
||||||
, inner(0)
|
, inner(0)
|
||||||
{
|
{
|
||||||
|
@ -136,7 +133,7 @@ namespace Aegisub {
|
||||||
|
|
||||||
/// @brief Get the outer exception error message
|
/// @brief Get the outer exception error message
|
||||||
/// @return Error message
|
/// @return Error message
|
||||||
virtual wxString GetMessage() const { return message; }
|
virtual std::string GetMessage() const { return message; }
|
||||||
|
|
||||||
/// @brief Get error messages for chained exceptions
|
/// @brief Get error messages for chained exceptions
|
||||||
/// @return Chained error message
|
/// @return Chained error message
|
||||||
|
@ -144,7 +141,7 @@ namespace Aegisub {
|
||||||
/// If there is an inner exception, prepend its chained error message to
|
/// If there is an inner exception, prepend its chained error message to
|
||||||
/// our error message, with a CRLF between. Returns our own error message
|
/// our error message, with a CRLF between. Returns our own error message
|
||||||
/// alone if there is no inner exception.
|
/// alone if there is no inner exception.
|
||||||
wxString GetChainedMessage() const { if (inner) return inner->GetChainedMessage() + _T("\r\n") + GetMessage(); else return GetMessage(); }
|
std::string GetChainedMessage() const { if (inner) return inner->GetChainedMessage() + "\r\n" + GetMessage(); else return GetMessage(); }
|
||||||
|
|
||||||
/// @brief Exception class printable name
|
/// @brief Exception class printable name
|
||||||
///
|
///
|
||||||
|
@ -155,16 +152,16 @@ namespace Aegisub {
|
||||||
/// name for their sub-tree, further sub-classes add further levels, each
|
/// name for their sub-tree, further sub-classes add further levels, each
|
||||||
/// level is separated by a slash. Characters allowed in the name for a
|
/// level is separated by a slash. Characters allowed in the name for a
|
||||||
/// level are [a-z0-9_].
|
/// level are [a-z0-9_].
|
||||||
virtual const wxChar * GetName() const = 0;
|
virtual const char * GetName() const = 0;
|
||||||
|
|
||||||
|
|
||||||
/// @brief Convert to wxChar array as the error message
|
/// @brief Convert to char array as the error message
|
||||||
/// @return The error message
|
/// @return The error message
|
||||||
operator const wxChar * () { return GetMessage().c_str(); }
|
operator const char * () { return GetMessage().c_str(); }
|
||||||
|
|
||||||
/// @brief Convert to wxString as the error message
|
/// @brief Convert to std::string as the error message
|
||||||
/// @return The error message
|
/// @return The error message
|
||||||
operator wxString () { return GetMessage(); }
|
operator std::string () { return GetMessage(); }
|
||||||
|
|
||||||
/// @brief Create a copy of the exception allocated on the heap
|
/// @brief Create a copy of the exception allocated on the heap
|
||||||
/// @return A heap-allocated exception object
|
/// @return A heap-allocated exception object
|
||||||
|
@ -180,7 +177,7 @@ namespace Aegisub {
|
||||||
///
|
///
|
||||||
/// Intended for use in error messages where it can sometimes be convenient to
|
/// Intended for use in error messages where it can sometimes be convenient to
|
||||||
/// indicate the exact position the error occurred at.
|
/// indicate the exact position the error occurred at.
|
||||||
#define AG_WHERE _T(" (at ") _T(__FILE__) _T(":") _T(#__LINE__) _T(")")
|
#define AG_WHERE " (at " __FILE__ ":" #__LINE__ ")"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -194,8 +191,8 @@ namespace Aegisub {
|
||||||
#define DEFINE_SIMPLE_EXCEPTION_NOINNER(classname,baseclass,displayname) \
|
#define DEFINE_SIMPLE_EXCEPTION_NOINNER(classname,baseclass,displayname) \
|
||||||
class classname : public baseclass { \
|
class classname : public baseclass { \
|
||||||
public: \
|
public: \
|
||||||
classname(const wxString &msg) : baseclass(msg) { } \
|
classname(const std::string &msg) : baseclass(msg) { } \
|
||||||
const wxChar * GetName() const { return _T(displayname); } \
|
const char * GetName() const { return displayname; } \
|
||||||
Exception * Copy() const { return new classname(*this); } \
|
Exception * Copy() const { return new classname(*this); } \
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -209,8 +206,8 @@ namespace Aegisub {
|
||||||
#define DEFINE_SIMPLE_EXCEPTION(classname,baseclass,displayname) \
|
#define DEFINE_SIMPLE_EXCEPTION(classname,baseclass,displayname) \
|
||||||
class classname : public baseclass { \
|
class classname : public baseclass { \
|
||||||
public: \
|
public: \
|
||||||
classname(const wxString &msg, Exception *inner) : baseclass(msg, inner) { } \
|
classname(const std::string &msg, Exception *inner) : baseclass(msg, inner) { } \
|
||||||
const wxChar * GetName() const { return _T(displayname); } \
|
const char * GetName() const { return displayname; } \
|
||||||
Exception * Copy() const { return new classname(*this); } \
|
Exception * Copy() const { return new classname(*this); } \
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -224,7 +221,7 @@ namespace Aegisub {
|
||||||
#define DEFINE_BASE_EXCEPTION_NOINNER(classname,baseclass) \
|
#define DEFINE_BASE_EXCEPTION_NOINNER(classname,baseclass) \
|
||||||
class classname : public baseclass { \
|
class classname : public baseclass { \
|
||||||
public: \
|
public: \
|
||||||
classname(const wxString &msg) : baseclass(msg) { } \
|
classname(const std::string &msg) : baseclass(msg) { } \
|
||||||
};
|
};
|
||||||
|
|
||||||
/// @brief Macro for declaring non-instantiable exception base classes with inner
|
/// @brief Macro for declaring non-instantiable exception base classes with inner
|
||||||
|
@ -238,7 +235,7 @@ namespace Aegisub {
|
||||||
#define DEFINE_BASE_EXCEPTION(classname,baseclass) \
|
#define DEFINE_BASE_EXCEPTION(classname,baseclass) \
|
||||||
class classname : public baseclass { \
|
class classname : public baseclass { \
|
||||||
public: \
|
public: \
|
||||||
classname(const wxString &msg, Exception *inner) : baseclass(msg, inner) { } \
|
classname(const std::string &msg, Exception *inner) : baseclass(msg, inner) { } \
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -291,10 +288,10 @@ namespace Aegisub {
|
||||||
|
|
||||||
/// @brief Constructor, automatically builds the error message
|
/// @brief Constructor, automatically builds the error message
|
||||||
/// @param filename Name of the file that could not be found
|
/// @param filename Name of the file that could not be found
|
||||||
FileNotFoundError(const wxString &filename) : FileNotAccessibleError(wxString(_T("File not found: ")) + filename) { }
|
FileNotFoundError(const std::string &filename) : FileNotAccessibleError(std::string("File not found: ") + filename) { }
|
||||||
|
|
||||||
// Not documented, see Aegisub::Exception class
|
// Not documented, see Aegisub::Exception class
|
||||||
const wxChar * GetName() const { return _T("filesystem/not_accessible/not_found"); }
|
const char * GetName() const { return "filesystem/not_accessible/not_found"; }
|
||||||
|
|
||||||
// Not documented, see Aegisub::Exception class
|
// Not documented, see Aegisub::Exception class
|
||||||
Exception * Copy() const { return new FileNotFoundError(*this); } \
|
Exception * Copy() const { return new FileNotFoundError(*this); } \
|
57
aegisub/libaegisub/include/libaegisub/io.h
Normal file
57
aegisub/libaegisub/include/libaegisub/io.h
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file io.h
|
||||||
|
/// @brief Public interface for IO methods.
|
||||||
|
/// @ingroup libaegisub
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <libaegisub/exception.h>
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
namespace io {
|
||||||
|
|
||||||
|
DEFINE_BASE_EXCEPTION_NOINNER(IOError, Exception)
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(IOFatal, IOError, "io/fatal")
|
||||||
|
|
||||||
|
/*
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(IOAccess, IOError, "io/access")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(IONotFound, IOError, "io/notfound")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(IONotAFile, IOError, "io/file")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(IONotADirectory, IOError, "io/directory")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(IOAccessRead, IOError, "io/read")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(IOAccessWrite, IOError, "io/write")
|
||||||
|
*/
|
||||||
|
|
||||||
|
std::ifstream* Open(const std::string &file);
|
||||||
|
|
||||||
|
class Save {
|
||||||
|
std::ofstream *fp;
|
||||||
|
const std::string file_name;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Save(const std::string& file);
|
||||||
|
~Save();
|
||||||
|
std::ofstream& Get();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace io
|
||||||
|
} // namespace agi
|
||||||
|
|
||||||
|
|
104
aegisub/libaegisub/include/libaegisub/mru.h
Normal file
104
aegisub/libaegisub/include/libaegisub/mru.h
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file mru.h
|
||||||
|
/// @brief Public interface for MRU (Most Recently Used) lists.
|
||||||
|
/// @ingroup libaegisub
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#include <fstream>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
#include "libaegisub/cajun/reader.h"
|
||||||
|
#include "libaegisub/cajun/writer.h"
|
||||||
|
#include "libaegisub/cajun/elements.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <libaegisub/exception.h>
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
|
||||||
|
DEFINE_BASE_EXCEPTION_NOINNER(MRUError,Exception)
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(MRUErrorInvalidKey, MRUError, "mru/invalid")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(MRUErrorIndexOutOfRange, MRUError, "mru/invalid")
|
||||||
|
|
||||||
|
/// @class MRUManager
|
||||||
|
/// @brief Most Recently Used (MRU) list handling
|
||||||
|
///
|
||||||
|
/// Add() should be called anytime a file is opened, this will either add the
|
||||||
|
/// entry or update it if it already exists.
|
||||||
|
///
|
||||||
|
/// If a file fails to open, Remove() should be called.
|
||||||
|
///
|
||||||
|
class MRUManager {
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// @brief Map for time->value pairs.
|
||||||
|
/// @param int Last time loaded
|
||||||
|
/// @param std::string File or value that was last loaded.
|
||||||
|
typedef std::multimap<time_t, std::string, std::greater_equal<time_t> > MRUListMap;
|
||||||
|
|
||||||
|
/// @brief Constructor
|
||||||
|
/// @param config File to load MRU values from
|
||||||
|
MRUManager(const std::string &config, const std::string &default_config);
|
||||||
|
|
||||||
|
/// Destructor
|
||||||
|
~MRUManager();
|
||||||
|
|
||||||
|
/// @brief Add entry to the list.
|
||||||
|
/// @param key List name
|
||||||
|
/// @param entry Entry to add
|
||||||
|
/// @exception MRUErrorInvalidKey thrown when an invalid key is used.
|
||||||
|
void Add(const std::string &key, const std::string &entry);
|
||||||
|
|
||||||
|
/// @brief Remove entry from the list.
|
||||||
|
/// @param key List name
|
||||||
|
/// @param entry Entry to add
|
||||||
|
/// @exception MRUErrorInvalidKey thrown when an invalid key is used.
|
||||||
|
void Remove(const std::string &key, const std::string &entry);
|
||||||
|
|
||||||
|
/// @brief Return list
|
||||||
|
/// @param key List name
|
||||||
|
/// @exception MRUErrorInvalidKey thrown when an invalid key is used.
|
||||||
|
const MRUListMap* Get(const std::string &key);
|
||||||
|
|
||||||
|
/// @brief Return A single entry in a list.
|
||||||
|
/// @param key List name
|
||||||
|
/// @param entry 0-base position of entry
|
||||||
|
/// @exception MRUErrorInvalidKey thrown when an invalid key is used.
|
||||||
|
const std::string GetEntry(const std::string &key, const int entry);
|
||||||
|
|
||||||
|
/// Write MRU lists to disk.
|
||||||
|
void Flush();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
/// Internal name of the config file, set during object construction.
|
||||||
|
const std::string config_name;
|
||||||
|
|
||||||
|
/// @brief Map for MRUListMap values.
|
||||||
|
/// @param std::string Name
|
||||||
|
/// @param MRUListMap instance.
|
||||||
|
typedef std::map<std::string, MRUListMap*> MRUMap;
|
||||||
|
|
||||||
|
/// Internal MRUMap values.
|
||||||
|
MRUMap mru;
|
||||||
|
|
||||||
|
void Load(const std::string &key, const json::Array& array);
|
||||||
|
inline void Prune(MRUListMap& map);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace agi
|
120
aegisub/libaegisub/include/libaegisub/option.h
Normal file
120
aegisub/libaegisub/include/libaegisub/option.h
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file option.h
|
||||||
|
/// @brief Public interface for option values.
|
||||||
|
/// @ingroup libaegisub
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
#include "libaegisub/cajun/reader.h"
|
||||||
|
#include "libaegisub/cajun/writer.h"
|
||||||
|
#include "libaegisub/cajun/elements.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <libaegisub/exception.h>
|
||||||
|
#include <libaegisub/option_value.h>
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
|
||||||
|
DEFINE_BASE_EXCEPTION_NOINNER(OptionError,Exception)
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(OptionErrorNotFound, OptionError, "options/not_found")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(OptionErrorDuplicateKey, OptionError, "options/dump/duplicate")
|
||||||
|
|
||||||
|
|
||||||
|
/// This is a cool trick: make a class un-copyable, in this case we always want
|
||||||
|
/// to update our *original* map, this will ensure that it is always updated in
|
||||||
|
/// every situation.
|
||||||
|
class OptionValueMap : public std::map<std::string,OptionValue*> {
|
||||||
|
private:
|
||||||
|
OptionValueMap(const OptionValueMap& x);
|
||||||
|
OptionValueMap& operator=(const OptionValueMap& x);
|
||||||
|
public:
|
||||||
|
OptionValueMap() {};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Options {
|
||||||
|
friend class PutOptionVisitor;
|
||||||
|
|
||||||
|
/// Root json::Object, used for loading.
|
||||||
|
json::UnknownElement config_root;
|
||||||
|
|
||||||
|
/// Internal OptionValueMap
|
||||||
|
OptionValueMap values;
|
||||||
|
|
||||||
|
/// @brief Create option object.
|
||||||
|
/// @param path Path to store
|
||||||
|
json::Object CreateObject(std::string path);
|
||||||
|
|
||||||
|
/// User config (file that will be written to disk)
|
||||||
|
const std::string config_file;
|
||||||
|
|
||||||
|
/// Default config (for use when config file is/gets corrupted)
|
||||||
|
const std::string config_default;
|
||||||
|
|
||||||
|
/// Whether the user (final) config has been loaded
|
||||||
|
bool config_loaded;
|
||||||
|
|
||||||
|
/// @brief Load a config file into the Options object.
|
||||||
|
/// @param config Config to load.
|
||||||
|
void LoadConfig(std::istream& stream);
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// @brief Write an option to file.
|
||||||
|
/// @param[out] obj Parent object
|
||||||
|
/// @param[in] path Path option should be stored in.
|
||||||
|
/// @param[in] value Value to write.
|
||||||
|
static bool PutOption(json::Object &obj, const std::string &path, const json::UnknownElement &value);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// @brief Constructor
|
||||||
|
/// @param file User config that will be loaded from and written back to.
|
||||||
|
/// @param default_config Default configuration.
|
||||||
|
Options(const std::string &file, const std::string &default_config);
|
||||||
|
|
||||||
|
/// Destructor
|
||||||
|
~Options();
|
||||||
|
|
||||||
|
/// @brief Get an option by name.
|
||||||
|
/// @param name Option to get.
|
||||||
|
/// Get an option value object by name throw an internal exception if the option is not found.
|
||||||
|
OptionValue* Get(const std::string &name);
|
||||||
|
|
||||||
|
/// @brief Next configuration file to load.
|
||||||
|
/// @param[in] src Stream to load from.
|
||||||
|
/// Load next config which will superceed any values from previous configs
|
||||||
|
/// can be called as many times as required, but only after ConfigDefault() and
|
||||||
|
/// before ConfigUser()
|
||||||
|
void ConfigNext(std::istream &stream);
|
||||||
|
|
||||||
|
/// @brief Set user config file.
|
||||||
|
/// Set the user configuration file and read options from it, closes all possible
|
||||||
|
/// config file loading and sets the file to write to.
|
||||||
|
void ConfigUser();
|
||||||
|
|
||||||
|
/// Write the user configuration to disk, throws an exeption if something goes wrong.
|
||||||
|
void Flush();
|
||||||
|
|
||||||
|
/// Print internal option type, name and values.
|
||||||
|
void DumpAll();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace agi
|
199
aegisub/libaegisub/include/libaegisub/option_value.h
Normal file
199
aegisub/libaegisub/include/libaegisub/option_value.h
Normal file
|
@ -0,0 +1,199 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file option_value.h
|
||||||
|
/// @brief Container for holding an actual option value.
|
||||||
|
/// @ingroup libaegisub
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#include <fstream>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "libaegisub/cajun/reader.h"
|
||||||
|
#include "libaegisub/cajun/writer.h"
|
||||||
|
#include "libaegisub/cajun/elements.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <libaegisub/exception.h>
|
||||||
|
#include <libaegisub/colour.h>
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
|
||||||
|
|
||||||
|
DEFINE_BASE_EXCEPTION_NOINNER(OptionValueError, Exception)
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(OptionValueErrorNotFound, OptionValueError, "options/not_found")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(OptionValueErrorInvalidType, OptionValueError, "options/invalid_type")
|
||||||
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(OptionValueErrorInvalidListType, OptionValueError, "options/array/invalid_type")
|
||||||
|
|
||||||
|
|
||||||
|
class OptionValue;
|
||||||
|
class ConfigVisitor;
|
||||||
|
|
||||||
|
|
||||||
|
/// @class OptionValueListener
|
||||||
|
/// Inherit from this class to get the proper type for the notification callback
|
||||||
|
/// signature.
|
||||||
|
class OptionValueListener {
|
||||||
|
public:
|
||||||
|
// (I might have messed up the syntax here. It's supposed to be a pointer
|
||||||
|
// to a member function of an OptionValueListener-derived class.)
|
||||||
|
typedef void (OptionValueListener::*ChangeEvent)(const OptionValue *option);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/// @class OptionValue
|
||||||
|
/// Holds an actual option.
|
||||||
|
class OptionValue {
|
||||||
|
std::set<OptionValueListener*> listeners;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void NotifyChanged();
|
||||||
|
|
||||||
|
public:
|
||||||
|
OptionValue() {};
|
||||||
|
virtual ~OptionValue() {};
|
||||||
|
|
||||||
|
|
||||||
|
/// Option type
|
||||||
|
/// No bitsets here.
|
||||||
|
enum OptionType {
|
||||||
|
Type_String = 0, ///< String
|
||||||
|
Type_Int = 1, ///< Integer
|
||||||
|
Type_Double = 2, ///< Double
|
||||||
|
Type_Colour = 3, ///< Colour
|
||||||
|
Type_Bool = 4, ///< Bool
|
||||||
|
Type_List_String = 100, ///< List of Strings
|
||||||
|
Type_List_Int = 101, ///< List of Integers
|
||||||
|
Type_List_Double = 102, ///< List of Doubles
|
||||||
|
Type_List_Colour = 103, ///< List of Colours
|
||||||
|
Type_List_Bool = 104 ///< List of Bools
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual OptionType GetType() const = 0;
|
||||||
|
virtual std::string GetName() const = 0;
|
||||||
|
virtual bool IsDefault() const = 0;
|
||||||
|
virtual void Reset() = 0;
|
||||||
|
|
||||||
|
virtual std::string GetString() const { throw OptionValueErrorInvalidType("Attempt to retrieve string from non-string value"); }
|
||||||
|
virtual int64_t GetInt() const { throw OptionValueErrorInvalidType("Attempt to retrieve int from non-int value"); }
|
||||||
|
virtual double GetDouble() const { throw OptionValueErrorInvalidType("Attempt to retrieve double from non-double value"); }
|
||||||
|
virtual Colour GetColour() const { throw OptionValueErrorInvalidType("Attempt to retrieve colour from non-colour value"); }
|
||||||
|
virtual bool GetBool() const { throw OptionValueErrorInvalidType("Attempt to retrieve bool from non-bool value"); }
|
||||||
|
|
||||||
|
virtual void SetString(const std::string val) { throw OptionValueErrorInvalidType("Attempt to set string in a non-string value"); }
|
||||||
|
virtual void SetInt(const int64_t val) { throw OptionValueErrorInvalidType("Attempt to set int in a non-int value"); }
|
||||||
|
virtual void SetDouble(const double val) { throw OptionValueErrorInvalidType("Attempt to set double in a non-double value"); }
|
||||||
|
virtual void SetColour(const Colour val) { throw OptionValueErrorInvalidType("Attempt to set colour in a non-colour value"); }
|
||||||
|
virtual void SetBool(const bool val) { throw OptionValueErrorInvalidType("Attempt to set bool in a non-bool value"); }
|
||||||
|
|
||||||
|
virtual std::string GetDefaultString() const { throw OptionValueErrorInvalidType("Attempt to retrieve string from non-string value"); }
|
||||||
|
virtual int64_t GetDefaultInt() const { throw OptionValueErrorInvalidType("Attempt to retrieve int from non-int value"); }
|
||||||
|
virtual double GetDefaultDouble() const { throw OptionValueErrorInvalidType("Attempt to retrieve double from non-double value"); }
|
||||||
|
virtual Colour GetDefaultColour() const { throw OptionValueErrorInvalidType("Attempt to retrieve colour from non-colour value"); }
|
||||||
|
virtual bool GetDefaultBool() const { throw OptionValueErrorInvalidType("Attempt to retrieve bool from non-bool value"); }
|
||||||
|
|
||||||
|
|
||||||
|
virtual void GetListString(std::vector<std::string> &out) const { throw OptionValueErrorInvalidListType("Attempt to retrive string list from non-string list"); }
|
||||||
|
virtual void GetListInt(std::vector<int64_t> &out) const { throw OptionValueErrorInvalidListType("Attempt to retrive int list from non-int list"); }
|
||||||
|
virtual void GetListDouble(std::vector<double> &out) const { throw OptionValueErrorInvalidListType("Attempt to retrive double list from non-double list"); }
|
||||||
|
virtual void GetListColour(std::vector<Colour> &out) const { throw OptionValueErrorInvalidListType("Attempt to retrive colour list from non-colour list"); }
|
||||||
|
virtual void GetListBool(std::vector<bool> &out) const { throw OptionValueErrorInvalidListType("Attempt to retrive string bool from non-bool list"); }
|
||||||
|
|
||||||
|
virtual void SetListString(const std::vector<std::string> val) { throw OptionValueErrorInvalidListType("Attempt to set string list in a non-string list"); }
|
||||||
|
virtual void SetListInt(const std::vector<int64_t> val) { throw OptionValueErrorInvalidListType("Attempt to set int list in a non-int list"); }
|
||||||
|
virtual void SetListDouble(const std::vector<double> val) { throw OptionValueErrorInvalidListType("Attempt to set double list in a non-double list"); }
|
||||||
|
virtual void SetListColour(const std::vector<Colour> val) { throw OptionValueErrorInvalidListType("Attempt to set colour list in a non-colour list"); }
|
||||||
|
virtual void SetListBool(const std::vector<bool> val) { throw OptionValueErrorInvalidListType("Attempt to set string in a non-bool list"); }
|
||||||
|
|
||||||
|
virtual void GetDefaultListString(std::vector<std::string> &out) const { throw OptionValueErrorInvalidListType("Attempt to retrive string list from non-string list"); }
|
||||||
|
virtual void GetDefaultListInt(std::vector<int64_t> &out) const { throw OptionValueErrorInvalidListType("Attempt to retrive int list from non-int list"); }
|
||||||
|
virtual void GetDefaultListDouble(std::vector<double> &out) const { throw OptionValueErrorInvalidListType("Attempt to retrive double list from non-double list"); }
|
||||||
|
virtual void GetDefaultListColour(std::vector<Colour> &out) const { throw OptionValueErrorInvalidListType("Attempt to retrive colour list from non-colour list"); }
|
||||||
|
virtual void GetDefaultListBool(std::vector<bool> &out) const { throw OptionValueErrorInvalidListType("Attempt to retrive string bool from non-bool list"); }
|
||||||
|
|
||||||
|
|
||||||
|
void Subscribe(OptionValueListener*);
|
||||||
|
void Unsubscribe(OptionValueListener*);
|
||||||
|
|
||||||
|
void Subscribe(OptionValueListener *listener, OptionValueListener::ChangeEvent handler);
|
||||||
|
void Unsubscribe(OptionValueListener *listener, OptionValueListener::ChangeEvent handler);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CONFIG_OPTIONVALUE(type_name, type) \
|
||||||
|
class OptionValue##type_name : public OptionValue { \
|
||||||
|
type value; \
|
||||||
|
type value_default; \
|
||||||
|
std::string name; \
|
||||||
|
public: \
|
||||||
|
OptionValue##type_name(std::string member_name, type member_value): \
|
||||||
|
value(member_value), name(member_name) {} \
|
||||||
|
type Get##type_name() const { return value; } \
|
||||||
|
void Set##type_name(const type new_val) { value = new_val; } \
|
||||||
|
type GetDefault##type_name() const { return value_default; } \
|
||||||
|
OptionType GetType() const { return OptionValue::Type_##type_name; } \
|
||||||
|
std::string GetName() const { return name; } \
|
||||||
|
void Reset() { value = value_default; } \
|
||||||
|
bool IsDefault() const { return (value == value_default) ? 1 : 0; } \
|
||||||
|
};
|
||||||
|
|
||||||
|
CONFIG_OPTIONVALUE(String, std::string)
|
||||||
|
CONFIG_OPTIONVALUE(Int, int64_t)
|
||||||
|
CONFIG_OPTIONVALUE(Double, double)
|
||||||
|
CONFIG_OPTIONVALUE(Colour, Colour)
|
||||||
|
CONFIG_OPTIONVALUE(Bool, bool)
|
||||||
|
|
||||||
|
|
||||||
|
class OptionValueList: public OptionValue {
|
||||||
|
friend class ConfigVisitor;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
OptionValueList() {};
|
||||||
|
virtual ~OptionValueList() {};
|
||||||
|
virtual void InsertString(const std::string val) { throw OptionValueErrorInvalidListType("Attempt to insert string in a non-string list"); }
|
||||||
|
virtual void InsertInt(const int64_t val) { throw OptionValueErrorInvalidListType("Attempt to insert int in a non-int list"); }
|
||||||
|
virtual void InsertDouble(const double val) { throw OptionValueErrorInvalidListType("Attempt to insert double in a non-double list"); }
|
||||||
|
virtual void InsertColour(const Colour val) { throw OptionValueErrorInvalidListType("Attempt insert set colour in a from non-colour list"); }
|
||||||
|
virtual void InsertBool(const bool val) { throw OptionValueErrorInvalidListType("Attempt to insert bool in a non-bool list"); }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define CONFIG_OPTIONVALUE_LIST(type_name, type) \
|
||||||
|
class OptionValueList##type_name : public OptionValueList { \
|
||||||
|
std::vector<type> array; \
|
||||||
|
std::vector<type> array_default; \
|
||||||
|
std::string name; \
|
||||||
|
void Insert##type_name(const type val) { array.push_back(val); } \
|
||||||
|
public: \
|
||||||
|
virtual std::string GetString() const { return "";} \
|
||||||
|
OptionValueList##type_name(std::string member_name): name(member_name) {} \
|
||||||
|
void GetList##type_name(std::vector<type> &out) const { out = array; } \
|
||||||
|
void SetList##type_name(const std::vector<type> val) { array = val;} \
|
||||||
|
void GetDefaultList##type_name(std::vector<type> &out) const { out = array_default; } \
|
||||||
|
OptionType GetType() const { return OptionValue::Type_List_##type_name; } \
|
||||||
|
std::string GetName() const { return name; } \
|
||||||
|
void Reset() { array = array_default; } \
|
||||||
|
bool IsDefault() const { return (array == array_default) ? 1 : 0; } \
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_OPTIONVALUE_LIST(String, std::string)
|
||||||
|
CONFIG_OPTIONVALUE_LIST(Int, int64_t)
|
||||||
|
CONFIG_OPTIONVALUE_LIST(Double, double)
|
||||||
|
CONFIG_OPTIONVALUE_LIST(Colour, Colour)
|
||||||
|
CONFIG_OPTIONVALUE_LIST(Bool, bool)
|
||||||
|
|
||||||
|
} // namespace agi
|
36
aegisub/libaegisub/include/libaegisub/util.h
Normal file
36
aegisub/libaegisub/include/libaegisub/util.h
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file util.h
|
||||||
|
/// @brief Public interface for general utilities.
|
||||||
|
/// @ingroup libaegisub
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#include <string>
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <libaegisub/access.h>
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
namespace util {
|
||||||
|
|
||||||
|
const std::string DirName(const std::string& path);
|
||||||
|
void Rename(const std::string& from, const std::string& to);
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace util
|
||||||
|
} // namespace agi
|
83
aegisub/libaegisub/include/libaegisub/validator.h
Normal file
83
aegisub/libaegisub/include/libaegisub/validator.h
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file validator.h
|
||||||
|
/// @brief Input validation.
|
||||||
|
/// @ingroup libaegisub
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <libaegisub/colour.h>
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
|
||||||
|
|
||||||
|
class Validator {
|
||||||
|
public:
|
||||||
|
/// Types supported.
|
||||||
|
enum ValidType {
|
||||||
|
Type_Any = 0, ///< Any (should be used instead of "String"
|
||||||
|
/// to accept any value for code clarity.)
|
||||||
|
Type_String = 1, ///< String
|
||||||
|
Type_Int = 2, ///< Integer
|
||||||
|
Type_Bool = 3, ///< Bool
|
||||||
|
Type_Colour = 4 ///< Colour
|
||||||
|
};
|
||||||
|
|
||||||
|
/// @brief Check value type.
|
||||||
|
/// @param value Value
|
||||||
|
/// @return true/false
|
||||||
|
///
|
||||||
|
/// If the value type is "int" or "string" it will return true/false based on this alone.
|
||||||
|
/// This should validate against full values or single characters to make it suitable for input boxes.
|
||||||
|
virtual bool CheckType(std::string &value)=0;
|
||||||
|
|
||||||
|
/// @brief Check value including constraints.
|
||||||
|
/// @param value Value
|
||||||
|
/// @return true/false
|
||||||
|
///
|
||||||
|
/// Check value including bounds checking.
|
||||||
|
/// CheckType() should always be the first function called.
|
||||||
|
virtual bool Check(std::string &value)=0;
|
||||||
|
|
||||||
|
/// @brief Return validation type.
|
||||||
|
/// @return Type
|
||||||
|
virtual ValidType GetType()=0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define VALID_BASE(type_name) \
|
||||||
|
class Valid##type_name : public Validator { \
|
||||||
|
public: \
|
||||||
|
ValidType GetType() { return Type_##type_name; } \
|
||||||
|
bool CheckType(std::string &value); \
|
||||||
|
virtual bool Check(std::string &value); \
|
||||||
|
};
|
||||||
|
|
||||||
|
VALID_BASE(Any)
|
||||||
|
VALID_BASE(String)
|
||||||
|
VALID_BASE(Int)
|
||||||
|
VALID_BASE(Bool)
|
||||||
|
|
||||||
|
|
||||||
|
class ValidColour: public ValidString {
|
||||||
|
public:
|
||||||
|
ValidType GetType() { return Type_Colour; }
|
||||||
|
virtual bool Check(std::string &value);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace agi
|
23
aegisub/libaegisub/lagi_pre.h
Normal file
23
aegisub/libaegisub/lagi_pre.h
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
#define LAGI_PRE
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <io.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <map>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "libaegisub/cajun/elements.h"
|
||||||
|
#include "libaegisub/cajun/reader.h"
|
||||||
|
#include "libaegisub/cajun/visitor.h"
|
||||||
|
#include "libaegisub/cajun/writer.h"
|
||||||
|
|
||||||
|
#define LAGI_PRE
|
109
aegisub/libaegisub/unix/access.cpp
Normal file
109
aegisub/libaegisub/unix/access.cpp
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file access.cpp
|
||||||
|
/// @brief Unix access methods.
|
||||||
|
/// @ingroup libaegisub unix
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "libaegisub/util.h"
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
namespace acs {
|
||||||
|
|
||||||
|
|
||||||
|
void CheckFileRead(const std::string &file) {
|
||||||
|
Check(file, acs::FileRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CheckFileWrite(const std::string &file) {
|
||||||
|
Check(file, acs::FileWrite);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CheckDirRead(const std::string &dir) {
|
||||||
|
Check(dir, acs::DirRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CheckDirWrite(const std::string &dir) {
|
||||||
|
Check(dir, acs::DirWrite);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Check(const std::string &file, acs::Type type) {
|
||||||
|
struct stat file_stat;
|
||||||
|
int file_status;
|
||||||
|
|
||||||
|
file_status = stat(file.c_str(), &file_stat);
|
||||||
|
|
||||||
|
if (file_status != 0) {
|
||||||
|
switch (errno) {
|
||||||
|
case ENOENT:
|
||||||
|
throw AcsNotFound("File or path not found.");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EACCES:
|
||||||
|
throw AcsAccess("Access Denied to file, path or path component.");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EIO:
|
||||||
|
throw AcsFatal("Fatal I/O error occurred.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case FileRead:
|
||||||
|
case FileWrite:
|
||||||
|
if ((file_stat.st_mode & S_IFREG) == 0)
|
||||||
|
throw AcsNotAFile("Not a file.");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DirRead:
|
||||||
|
case DirWrite:
|
||||||
|
if ((file_stat.st_mode & S_IFDIR) == 0)
|
||||||
|
throw AcsNotADirectory("Not a directory.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case DirRead:
|
||||||
|
case FileRead:
|
||||||
|
file_status = access(file.c_str(), R_OK);
|
||||||
|
if (file_status != 0)
|
||||||
|
throw AcsRead("File or directory is not readable.");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DirWrite:
|
||||||
|
case FileWrite:
|
||||||
|
file_status = access(file.c_str(), W_OK);
|
||||||
|
if (file_status != 0)
|
||||||
|
throw AcsWrite("File or directory is not writable.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace acs
|
||||||
|
} // namespace agi
|
87
aegisub/libaegisub/unix/io.cpp
Normal file
87
aegisub/libaegisub/unix/io.cpp
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file io.cpp
|
||||||
|
/// @brief Unix IO methods.
|
||||||
|
/// @ingroup libaegisub unix
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "libaegisub/io.h"
|
||||||
|
#include "libaegisub/util.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
namespace io {
|
||||||
|
|
||||||
|
std::ifstream* Open(const std::string &file) {
|
||||||
|
acs::CheckFileRead(file);
|
||||||
|
|
||||||
|
std::ifstream *stream = new std::ifstream(file.c_str());
|
||||||
|
|
||||||
|
if (stream->fail())
|
||||||
|
throw IOFatal("Unknown fatal error as occurred");
|
||||||
|
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Save::Save(const std::string& file): file_name(file) {
|
||||||
|
|
||||||
|
const std::string pwd = util::DirName(file);
|
||||||
|
|
||||||
|
acs::CheckDirWrite(pwd.c_str());
|
||||||
|
|
||||||
|
try {
|
||||||
|
acs::CheckFileWrite(file);
|
||||||
|
} catch (acs::AcsNotFound& e) {
|
||||||
|
// If the file doesn't exist we create a 0 byte file, this so so
|
||||||
|
// util::Rename will find it, and to let users know something went
|
||||||
|
// wrong by leaving a 0 byte file.
|
||||||
|
std::ofstream fp_touch(file.c_str());
|
||||||
|
fp_touch.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @todo This is a temp hack, proper implementation needs to come after
|
||||||
|
/// Windows support is added. The code in the destructor needs fixing
|
||||||
|
/// as well.
|
||||||
|
const std::string tmp = file + "_tmp";
|
||||||
|
|
||||||
|
// This will open to file.XXXX. (tempfile)
|
||||||
|
fp = new std::ofstream(tmp.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
Save::~Save() {
|
||||||
|
|
||||||
|
const std::string tmp(file_name + "_tmp");
|
||||||
|
util::Rename(tmp, file_name);
|
||||||
|
delete fp;
|
||||||
|
fp = 0; // to avoid any silly errors.
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ofstream& Save::Get() {
|
||||||
|
return *fp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace io
|
||||||
|
} // namespace agi
|
59
aegisub/libaegisub/unix/util.cpp
Normal file
59
aegisub/libaegisub/unix/util.cpp
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file util.cpp
|
||||||
|
/// @brief Unix utility methods.
|
||||||
|
/// @ingroup libaegisub unix
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <fstream>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include "libaegisub/util.h"
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
namespace util {
|
||||||
|
|
||||||
|
|
||||||
|
const std::string DirName(const std::string& path) {
|
||||||
|
if (path.find('/') == std::string::npos) {
|
||||||
|
const std::string cwd(".");
|
||||||
|
return cwd;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string stripped = path.substr(0, path.rfind("/")+1);
|
||||||
|
return stripped;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Rename(const std::string& from, const std::string& to) {
|
||||||
|
acs::CheckFileWrite(from);
|
||||||
|
|
||||||
|
try {
|
||||||
|
acs::CheckFileWrite(to);
|
||||||
|
} catch (acs::AcsNotFound& e) {
|
||||||
|
acs::CheckDirWrite(DirName(to));
|
||||||
|
}
|
||||||
|
|
||||||
|
rename(from.c_str(), to.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace io
|
||||||
|
} // namespace agi
|
118
aegisub/libaegisub/windows/access.cpp
Normal file
118
aegisub/libaegisub/windows/access.cpp
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file access.cpp
|
||||||
|
/// @brief Windows access methods.
|
||||||
|
/// @ingroup libaegisub windows
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <io.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef R_OK
|
||||||
|
#define R_OK 04
|
||||||
|
#endif
|
||||||
|
#ifndef W_OK
|
||||||
|
#define W_OK 02
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#pragma warning(disable: 4996)
|
||||||
|
|
||||||
|
|
||||||
|
#include "libaegisub/util.h"
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
namespace acs {
|
||||||
|
|
||||||
|
void CheckFileRead(const std::string &file) {
|
||||||
|
Check(file, acs::FileRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CheckFileWrite(const std::string &file) {
|
||||||
|
Check(file, acs::FileWrite);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CheckDirRead(const std::string &dir) {
|
||||||
|
Check(dir, acs::DirRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CheckDirWrite(const std::string &dir) {
|
||||||
|
Check(dir, acs::DirWrite);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Check(const std::string &file, acs::Type type) {
|
||||||
|
struct stat file_stat;
|
||||||
|
int file_status;
|
||||||
|
|
||||||
|
file_status = stat(file.c_str(), &file_stat);
|
||||||
|
|
||||||
|
if (file_status != 0) {
|
||||||
|
switch (errno) {
|
||||||
|
case ENOENT:
|
||||||
|
throw AcsNotFound("File or path not found.");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EACCES:
|
||||||
|
throw AcsAccess("Access Denied to file, path or path component.");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EIO:
|
||||||
|
throw AcsFatal("Fatal I/O error occurred.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case FileRead:
|
||||||
|
case FileWrite:
|
||||||
|
if ((file_stat.st_mode & S_IFREG) == 0)
|
||||||
|
throw AcsNotAFile("Not a file.");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DirRead:
|
||||||
|
case DirWrite:
|
||||||
|
if ((file_stat.st_mode & S_IFDIR) == 0)
|
||||||
|
throw AcsNotADirectory("Not a directory.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case DirRead:
|
||||||
|
case FileRead:
|
||||||
|
file_status = access(file.c_str(), R_OK);
|
||||||
|
if (file_status != 0)
|
||||||
|
throw AcsRead("File or directory is not readable.");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DirWrite:
|
||||||
|
case FileWrite:
|
||||||
|
file_status = access(file.c_str(), W_OK);
|
||||||
|
if (file_status != 0)
|
||||||
|
throw AcsWrite("File or directory is not writable.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
89
aegisub/libaegisub/windows/io.cpp
Normal file
89
aegisub/libaegisub/windows/io.cpp
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file io.cpp
|
||||||
|
/// @brief Windows IO methods.
|
||||||
|
/// @ingroup libaegisub windows
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "libaegisub/io.h"
|
||||||
|
#include "libaegisub/util.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
namespace io {
|
||||||
|
|
||||||
|
std::ifstream* Open(const std::string &file) {
|
||||||
|
acs::CheckFileRead(file);
|
||||||
|
|
||||||
|
std::ifstream *stream = new std::ifstream(file.c_str());
|
||||||
|
|
||||||
|
if (stream->fail()) {
|
||||||
|
delete stream;
|
||||||
|
throw IOFatal("Unknown fatal error as occurred");
|
||||||
|
}
|
||||||
|
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Save::Save(const std::string& file): file_name(file) {
|
||||||
|
|
||||||
|
const std::string pwd = util::DirName(file);
|
||||||
|
|
||||||
|
acs::CheckDirWrite(pwd.c_str());
|
||||||
|
|
||||||
|
try {
|
||||||
|
acs::CheckFileWrite(file);
|
||||||
|
} catch (acs::AcsNotFound&) {
|
||||||
|
// If the file doesn't exist we create a 0 byte file, this so so
|
||||||
|
// util::Rename will find it, and to let users know something went
|
||||||
|
// wrong by leaving a 0 byte file.
|
||||||
|
std::ofstream fp_touch(file.c_str());
|
||||||
|
fp_touch.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @todo This is a temp hack, proper implementation needs to come after
|
||||||
|
/// Windows support is added. The code in the destructor needs fixing
|
||||||
|
/// as well.
|
||||||
|
const std::string tmp = file + "_tmp";
|
||||||
|
|
||||||
|
// This will open to file.XXXX. (tempfile)
|
||||||
|
fp = new std::ofstream(tmp.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
Save::~Save() {
|
||||||
|
|
||||||
|
const std::string tmp(file_name + "_tmp");
|
||||||
|
util::Rename(tmp, file_name);
|
||||||
|
delete fp;
|
||||||
|
fp = 0; // to avoid any silly errors.
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ofstream& Save::Get() {
|
||||||
|
return *fp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace io
|
||||||
|
} // namespace agi
|
0
aegisub/libaegisub/windows/lagi_pre.cpp
Normal file
0
aegisub/libaegisub/windows/lagi_pre.cpp
Normal file
59
aegisub/libaegisub/windows/util.cpp
Normal file
59
aegisub/libaegisub/windows/util.cpp
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice appear in all copies.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
/// @file util.cpp
|
||||||
|
/// @brief Windows utility methods.
|
||||||
|
/// @ingroup libaegisub windows
|
||||||
|
|
||||||
|
#ifndef LAGI_PRE
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <fstream>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include "libaegisub/util.h"
|
||||||
|
|
||||||
|
namespace agi {
|
||||||
|
namespace util {
|
||||||
|
|
||||||
|
|
||||||
|
const std::string DirName(const std::string& path) {
|
||||||
|
if (path.find('/') == std::string::npos) {
|
||||||
|
const std::string cwd(".");
|
||||||
|
return cwd;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string stripped = path.substr(0, path.rfind("/")+1);
|
||||||
|
return stripped;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Rename(const std::string& from, const std::string& to) {
|
||||||
|
acs::CheckFileWrite(from);
|
||||||
|
|
||||||
|
try {
|
||||||
|
acs::CheckFileWrite(to);
|
||||||
|
} catch (acs::AcsNotFound&) {
|
||||||
|
acs::CheckDirWrite(DirName(to));
|
||||||
|
}
|
||||||
|
|
||||||
|
rename(from.c_str(), to.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace io
|
||||||
|
} // namespace agi
|
|
@ -23,10 +23,10 @@ SUBDIRS = \
|
||||||
libresrc \
|
libresrc \
|
||||||
$(libosxutil_subdir)
|
$(libosxutil_subdir)
|
||||||
|
|
||||||
AM_CXXFLAGS += -DAEGISUB -Iinclude -I../libffms/include @WX_CPPFLAGS@ @OPENMP_CXXFLAGS@ @LIBAVFORMAT_CFLAGS@ @LIBAVCODEC_CFLAGS@ @LIBSWSCALE_CFLAGS@ @LIBAVUTIL_CFLAGS@
|
AM_CXXFLAGS += -DAEGISUB -Iinclude -I../libffms/include -I../libaegisub/include @WX_CPPFLAGS@ @OPENMP_CXXFLAGS@ @LIBAVFORMAT_CFLAGS@ @LIBAVCODEC_CFLAGS@ @LIBSWSCALE_CFLAGS@ @LIBAVUTIL_CFLAGS@
|
||||||
|
|
||||||
bin_PROGRAMS = aegisub-2.2
|
bin_PROGRAMS = aegisub-2.2
|
||||||
aegisub_2_2_LDADD = libresrc/libresrc.a $(libosxutil_lib)
|
aegisub_2_2_LDADD = libresrc/libresrc.a $(libosxutil_lib) -L../libaegisub -laegisub-2.2
|
||||||
aegisub_2_2_CPPFLAGS = @FREETYPE_CFLAGS@
|
aegisub_2_2_CPPFLAGS = @FREETYPE_CFLAGS@
|
||||||
aegisub_2_2_LDFLAGS = @DEBUG_FLAGS@ @PROFILE_FLAGS@ @GL_LIBS@ @PTHREAD_LIBS@ @WX_LIBS@ @ICONV_LDFLAGS@ $(libosxutil_ldflags) @CCMALLOC_LDFLAGS@ @EFENCE_LDFLAGS@
|
aegisub_2_2_LDFLAGS = @DEBUG_FLAGS@ @PROFILE_FLAGS@ @GL_LIBS@ @PTHREAD_LIBS@ @WX_LIBS@ @ICONV_LDFLAGS@ $(libosxutil_ldflags) @CCMALLOC_LDFLAGS@ @EFENCE_LDFLAGS@
|
||||||
LIBS += @FREETYPE_LIBS@ @FONTCONFIG_LIBS@ @CCMALLOC_LIBS@
|
LIBS += @FREETYPE_LIBS@ @FONTCONFIG_LIBS@ @CCMALLOC_LIBS@
|
||||||
|
@ -222,6 +222,7 @@ aegisub_2_2_SOURCES = \
|
||||||
charset_conv.cpp \
|
charset_conv.cpp \
|
||||||
colorspace.cpp \
|
colorspace.cpp \
|
||||||
colour_button.cpp \
|
colour_button.cpp \
|
||||||
|
compat.cpp \
|
||||||
dialog_about.cpp \
|
dialog_about.cpp \
|
||||||
dialog_attachments.cpp \
|
dialog_attachments.cpp \
|
||||||
dialog_automation.cpp \
|
dialog_automation.cpp \
|
||||||
|
@ -232,7 +233,6 @@ aegisub_2_2_SOURCES = \
|
||||||
dialog_fonts_collector.cpp \
|
dialog_fonts_collector.cpp \
|
||||||
dialog_jumpto.cpp \
|
dialog_jumpto.cpp \
|
||||||
dialog_kara_timing_copy.cpp \
|
dialog_kara_timing_copy.cpp \
|
||||||
dialog_options.cpp \
|
|
||||||
dialog_paste_over.cpp \
|
dialog_paste_over.cpp \
|
||||||
dialog_progress.cpp \
|
dialog_progress.cpp \
|
||||||
dialog_properties.cpp \
|
dialog_properties.cpp \
|
||||||
|
@ -274,6 +274,7 @@ aegisub_2_2_SOURCES = \
|
||||||
mythes.cxx \
|
mythes.cxx \
|
||||||
options.cpp \
|
options.cpp \
|
||||||
plugin_manager.cpp \
|
plugin_manager.cpp \
|
||||||
|
preferences.cpp \
|
||||||
scintilla_text_ctrl.cpp \
|
scintilla_text_ctrl.cpp \
|
||||||
spellchecker.cpp \
|
spellchecker.cpp \
|
||||||
spline.cpp \
|
spline.cpp \
|
||||||
|
|
|
@ -243,10 +243,6 @@
|
||||||
#undef _CRT_SECURE_NO_WARNINGS
|
#undef _CRT_SECURE_NO_WARNINGS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
///////////////////
|
|
||||||
// Aegisub headers
|
|
||||||
#include "include/aegisub/exception.h"
|
|
||||||
|
|
||||||
#endif // C++
|
#endif // C++
|
||||||
|
|
||||||
#endif // AGI_PRE_H
|
#endif // AGI_PRE_H
|
||||||
|
|
|
@ -42,10 +42,9 @@
|
||||||
// Headers
|
// Headers
|
||||||
#ifndef AGI_PRE
|
#ifndef AGI_PRE
|
||||||
#include <wx/string.h>
|
#include <wx/string.h>
|
||||||
|
|
||||||
#include "include/aegisub/exception.h"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <libaegisub/exception.h>
|
||||||
|
|
||||||
//////////////
|
//////////////
|
||||||
// Prototypes
|
// Prototypes
|
||||||
|
@ -81,18 +80,18 @@ namespace Aegisub {
|
||||||
/// @brief DOCME
|
/// @brief DOCME
|
||||||
///
|
///
|
||||||
/// DOCME
|
/// DOCME
|
||||||
class InvalidMarginIdError : public InternalError {
|
class InvalidMarginIdError : public agi::InternalError {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/// @brief DOCME
|
/// @brief DOCME
|
||||||
/// @return
|
/// @return
|
||||||
///
|
///
|
||||||
InvalidMarginIdError() : InternalError(_T("Invalid margin id"), 0) { }
|
InvalidMarginIdError() : InternalError("Invalid margin id", 0) { }
|
||||||
|
|
||||||
/// @brief DOCME
|
/// @brief DOCME
|
||||||
/// @return
|
/// @return
|
||||||
///
|
///
|
||||||
const wxChar *GetName() { return _T("internal_error/invalid_margin_id"); }
|
const char *GetName() { return "internal_error/invalid_margin_id"; }
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,8 @@
|
||||||
#include "ass_file.h"
|
#include "ass_file.h"
|
||||||
#include "ass_override.h"
|
#include "ass_override.h"
|
||||||
#include "ass_style.h"
|
#include "ass_style.h"
|
||||||
|
#include "compat.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "subtitle_format.h"
|
#include "subtitle_format.h"
|
||||||
#include "text_file_reader.h"
|
#include "text_file_reader.h"
|
||||||
|
@ -794,7 +796,7 @@ AssStyle *AssFile::GetStyle(wxString name) {
|
||||||
/// @brief Adds file name to list of recent
|
/// @brief Adds file name to list of recent
|
||||||
/// @param file
|
/// @param file
|
||||||
void AssFile::AddToRecent(wxString file) {
|
void AssFile::AddToRecent(wxString file) {
|
||||||
Options.AddToRecentList(file,_T("Recent sub"));
|
AegisubApp::Get()->mru->Add("Subtitle", STD_STR(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief List of supported wildcards
|
/// @brief List of supported wildcards
|
||||||
|
@ -861,7 +863,7 @@ void AssFile::StackPush(wxString desc) {
|
||||||
for (std::list<AssFile*>::iterator cur=UndoStack.begin();cur!=UndoStack.end();cur++) {
|
for (std::list<AssFile*>::iterator cur=UndoStack.begin();cur!=UndoStack.end();cur++) {
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
int depth = Options.AsInt(_T("Undo levels"));
|
int depth = OPT_GET("Limits/Undo Levels")->GetInt();
|
||||||
while (n > depth) {
|
while (n > depth) {
|
||||||
delete UndoStack.front();
|
delete UndoStack.front();
|
||||||
UndoStack.pop_front();
|
UndoStack.pop_front();
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
#include "frame_main.h"
|
#include "frame_main.h"
|
||||||
#include "hotkeys.h"
|
#include "hotkeys.h"
|
||||||
#include "libresrc/libresrc.h"
|
#include "libresrc/libresrc.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "toggle_bitmap.h"
|
#include "toggle_bitmap.h"
|
||||||
#include "tooltip_manager.h"
|
#include "tooltip_manager.h"
|
||||||
|
@ -97,7 +98,7 @@ wxPanel(parent,-1,wxDefaultPosition,wxDefaultSize,wxTAB_TRAVERSAL|wxBORDER_RAISE
|
||||||
VolumeBar = new wxSlider(this,Audio_Volume,50,0,100,wxDefaultPosition,wxSize(-1,20),wxSL_VERTICAL|wxSL_BOTH|wxSL_INVERSE);
|
VolumeBar = new wxSlider(this,Audio_Volume,50,0,100,wxDefaultPosition,wxSize(-1,20),wxSL_VERTICAL|wxSL_BOTH|wxSL_INVERSE);
|
||||||
VolumeBar->PushEventHandler(new FocusEvent());
|
VolumeBar->PushEventHandler(new FocusEvent());
|
||||||
VolumeBar->SetToolTip(_("Audio Volume"));
|
VolumeBar->SetToolTip(_("Audio Volume"));
|
||||||
bool link = Options.AsBool(_T("Audio Link"));
|
bool link = OPT_GET("Audio/Link")->GetBool();
|
||||||
if (link) {
|
if (link) {
|
||||||
VolumeBar->SetValue(VerticalZoom->GetValue());
|
VolumeBar->SetValue(VerticalZoom->GetValue());
|
||||||
VolumeBar->Enable(false);
|
VolumeBar->Enable(false);
|
||||||
|
@ -177,23 +178,23 @@ wxPanel(parent,-1,wxDefaultPosition,wxDefaultSize,wxTAB_TRAVERSAL|wxBORDER_RAISE
|
||||||
|
|
||||||
AutoCommit = new ToggleBitmap(this,Audio_Check_AutoCommit,GETIMAGE(toggle_audio_autocommit_24),wxSize(30,-1));
|
AutoCommit = new ToggleBitmap(this,Audio_Check_AutoCommit,GETIMAGE(toggle_audio_autocommit_24),wxSize(30,-1));
|
||||||
AutoCommit->SetToolTip(_("Automatically commit all changes"));
|
AutoCommit->SetToolTip(_("Automatically commit all changes"));
|
||||||
AutoCommit->SetValue(Options.AsBool(_T("Audio Autocommit")));
|
AutoCommit->SetValue(OPT_GET("Audio/Auto/Commit")->GetBool());
|
||||||
ButtonSizer->Add(AutoCommit,0,wxRIGHT | wxALIGN_CENTER | wxEXPAND,0);
|
ButtonSizer->Add(AutoCommit,0,wxRIGHT | wxALIGN_CENTER | wxEXPAND,0);
|
||||||
NextCommit = new ToggleBitmap(this,Audio_Check_NextCommit,GETIMAGE(toggle_audio_nextcommit_24),wxSize(30,-1));
|
NextCommit = new ToggleBitmap(this,Audio_Check_NextCommit,GETIMAGE(toggle_audio_nextcommit_24),wxSize(30,-1));
|
||||||
NextCommit->SetToolTip(_("Auto goes to next line on commit"));
|
NextCommit->SetToolTip(_("Auto goes to next line on commit"));
|
||||||
NextCommit->SetValue(Options.AsBool(_T("Audio Next Line on Commit")));
|
NextCommit->SetValue(OPT_GET("Audio/Next Line on Commit")->GetBool());
|
||||||
ButtonSizer->Add(NextCommit,0,wxRIGHT | wxALIGN_CENTER | wxEXPAND,0);
|
ButtonSizer->Add(NextCommit,0,wxRIGHT | wxALIGN_CENTER | wxEXPAND,0);
|
||||||
AutoScroll = new ToggleBitmap(this,Audio_Check_AutoGoto,GETIMAGE(toggle_audio_autoscroll_24),wxSize(30,-1));
|
AutoScroll = new ToggleBitmap(this,Audio_Check_AutoGoto,GETIMAGE(toggle_audio_autoscroll_24),wxSize(30,-1));
|
||||||
AutoScroll->SetToolTip(_("Auto scrolls audio display to selected line"));
|
AutoScroll->SetToolTip(_("Auto scrolls audio display to selected line"));
|
||||||
AutoScroll->SetValue(Options.AsBool(_T("Audio Autoscroll")));
|
AutoScroll->SetValue(OPT_GET("Audio/Auto/Scroll")->GetBool());
|
||||||
ButtonSizer->Add(AutoScroll,0,wxRIGHT | wxALIGN_CENTER | wxEXPAND,0);
|
ButtonSizer->Add(AutoScroll,0,wxRIGHT | wxALIGN_CENTER | wxEXPAND,0);
|
||||||
SpectrumMode = new ToggleBitmap(this,Audio_Check_Spectrum,GETIMAGE(toggle_audio_spectrum_24),wxSize(30,-1));
|
SpectrumMode = new ToggleBitmap(this,Audio_Check_Spectrum,GETIMAGE(toggle_audio_spectrum_24),wxSize(30,-1));
|
||||||
SpectrumMode->SetToolTip(_("Spectrum analyzer mode"));
|
SpectrumMode->SetToolTip(_("Spectrum analyzer mode"));
|
||||||
SpectrumMode->SetValue(Options.AsBool(_T("Audio Spectrum")));
|
SpectrumMode->SetValue(OPT_GET("Audio/Spectrum")->GetBool());
|
||||||
ButtonSizer->Add(SpectrumMode,0,wxRIGHT | wxALIGN_CENTER | wxEXPAND,0);
|
ButtonSizer->Add(SpectrumMode,0,wxRIGHT | wxALIGN_CENTER | wxEXPAND,0);
|
||||||
MedusaMode = new ToggleBitmap(this,Audio_Check_Medusa,GETIMAGE(toggle_audio_medusa_24),wxSize(30,-1));
|
MedusaMode = new ToggleBitmap(this,Audio_Check_Medusa,GETIMAGE(toggle_audio_medusa_24),wxSize(30,-1));
|
||||||
MedusaMode->SetToolTip(_("Enable Medusa-Style Timing Shortcuts"));
|
MedusaMode->SetToolTip(_("Enable Medusa-Style Timing Shortcuts"));
|
||||||
MedusaMode->SetValue(Options.AsBool(_T("Audio Medusa Timing Hotkeys")));
|
MedusaMode->SetValue(OPT_GET("Audio/Medusa Timing Hotkeys")->GetBool());
|
||||||
ButtonSizer->Add(MedusaMode,0,wxRIGHT | wxALIGN_CENTER | wxEXPAND,0);
|
ButtonSizer->Add(MedusaMode,0,wxRIGHT | wxALIGN_CENTER | wxEXPAND,0);
|
||||||
ButtonSizer->AddStretchSpacer(1);
|
ButtonSizer->AddStretchSpacer(1);
|
||||||
|
|
||||||
|
@ -383,8 +384,7 @@ void AudioBox::OnVerticalLink(wxCommandEvent &event) {
|
||||||
}
|
}
|
||||||
VolumeBar->Enable(!VerticalLink->GetValue());
|
VolumeBar->Enable(!VerticalLink->GetValue());
|
||||||
|
|
||||||
Options.SetBool(_T("Audio Link"),VerticalLink->GetValue());
|
OPT_SET("Audio/Link")->SetBool(VerticalLink->GetValue());
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -419,8 +419,7 @@ void AudioBox::OnSash(wxSashEvent& event) {
|
||||||
Sash->GetParent()->Layout();
|
Sash->GetParent()->Layout();
|
||||||
|
|
||||||
// Store new size
|
// Store new size
|
||||||
Options.SetInt(_T("Audio Display Height"),h);
|
OPT_SET("Audio/Display Height")->SetInt(h);
|
||||||
Options.Save();
|
|
||||||
|
|
||||||
// Fix layout
|
// Fix layout
|
||||||
frameMain->Freeze();
|
frameMain->Freeze();
|
||||||
|
@ -683,8 +682,7 @@ void AudioBox::OnGoto(wxCommandEvent &event) {
|
||||||
///
|
///
|
||||||
void AudioBox::OnAutoGoto(wxCommandEvent &event) {
|
void AudioBox::OnAutoGoto(wxCommandEvent &event) {
|
||||||
audioDisplay->SetFocus();
|
audioDisplay->SetFocus();
|
||||||
Options.SetBool(_T("Audio Autoscroll"),AutoScroll->GetValue());
|
OPT_SET("Audio/Auto/Scroll")->SetBool(AutoScroll->GetValue());
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -694,8 +692,7 @@ void AudioBox::OnAutoGoto(wxCommandEvent &event) {
|
||||||
///
|
///
|
||||||
void AudioBox::OnAutoCommit(wxCommandEvent &event) {
|
void AudioBox::OnAutoCommit(wxCommandEvent &event) {
|
||||||
audioDisplay->SetFocus();
|
audioDisplay->SetFocus();
|
||||||
Options.SetBool(_T("Audio Autocommit"),AutoCommit->GetValue());
|
OPT_SET("Audio/Auto/Commit")->SetBool(AutoCommit->GetValue());
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -705,8 +702,7 @@ void AudioBox::OnAutoCommit(wxCommandEvent &event) {
|
||||||
///
|
///
|
||||||
void AudioBox::OnNextLineCommit(wxCommandEvent &event) {
|
void AudioBox::OnNextLineCommit(wxCommandEvent &event) {
|
||||||
audioDisplay->SetFocus();
|
audioDisplay->SetFocus();
|
||||||
Options.SetBool(_T("Audio Next Line on Commit"),NextCommit->GetValue());
|
OPT_SET("Audio/Next Line on Commit")->SetBool(NextCommit->GetValue());
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -716,8 +712,7 @@ void AudioBox::OnNextLineCommit(wxCommandEvent &event) {
|
||||||
///
|
///
|
||||||
void AudioBox::OnMedusaMode(wxCommandEvent &event) {
|
void AudioBox::OnMedusaMode(wxCommandEvent &event) {
|
||||||
audioDisplay->SetFocus();
|
audioDisplay->SetFocus();
|
||||||
Options.SetBool(_T("Audio Medusa Timing Hotkeys"),MedusaMode->GetValue());
|
OPT_SET("Audio/Medusa Timing Hotkeys")->SetBool(MedusaMode->GetValue());
|
||||||
Options.Save();
|
|
||||||
frameMain->SetAccelerators();
|
frameMain->SetAccelerators();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -727,8 +722,7 @@ void AudioBox::OnMedusaMode(wxCommandEvent &event) {
|
||||||
/// @param event
|
/// @param event
|
||||||
///
|
///
|
||||||
void AudioBox::OnSpectrumMode(wxCommandEvent &event) {
|
void AudioBox::OnSpectrumMode(wxCommandEvent &event) {
|
||||||
Options.SetBool(_T("Audio Spectrum"),SpectrumMode->GetValue());
|
OPT_SET("Audio/Spectrum")->SetBool(SpectrumMode->GetValue());
|
||||||
Options.Save();
|
|
||||||
audioDisplay->UpdateImage(false);
|
audioDisplay->UpdateImage(false);
|
||||||
audioDisplay->SetFocus();
|
audioDisplay->SetFocus();
|
||||||
audioDisplay->Refresh(false);
|
audioDisplay->Refresh(false);
|
||||||
|
|
|
@ -55,8 +55,10 @@
|
||||||
#endif
|
#endif
|
||||||
#include "audio_provider_stream.h"
|
#include "audio_provider_stream.h"
|
||||||
#include "colorspace.h"
|
#include "colorspace.h"
|
||||||
|
#include "compat.h"
|
||||||
#include "fft.h"
|
#include "fft.h"
|
||||||
#include "hotkeys.h"
|
#include "hotkeys.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "standard_paths.h"
|
#include "standard_paths.h"
|
||||||
#include "subs_edit_box.h"
|
#include "subs_edit_box.h"
|
||||||
|
@ -79,7 +81,7 @@
|
||||||
/// @brief Constructor
|
/// @brief Constructor
|
||||||
/// @param parent
|
/// @param parent
|
||||||
AudioDisplay::AudioDisplay(wxWindow *parent)
|
AudioDisplay::AudioDisplay(wxWindow *parent)
|
||||||
: wxWindow (parent, -1, wxDefaultPosition, wxSize(200,Options.AsInt(_T("Audio Display Height"))), AudioDisplayWindowStyle , _T("Audio Display"))
|
: wxWindow (parent, -1, wxDefaultPosition, wxSize(200,OPT_GET("Audio/Display Height")->GetInt()), AudioDisplayWindowStyle , _T("Audio Display"))
|
||||||
{
|
{
|
||||||
// Set variables
|
// Set variables
|
||||||
origImage = NULL;
|
origImage = NULL;
|
||||||
|
@ -118,7 +120,7 @@ AudioDisplay::AudioDisplay(wxWindow *parent)
|
||||||
// Init
|
// Init
|
||||||
UpdateTimer.SetOwner(this,Audio_Update_Timer);
|
UpdateTimer.SetOwner(this,Audio_Update_Timer);
|
||||||
GetClientSize(&w,&h);
|
GetClientSize(&w,&h);
|
||||||
h -= Options.AsBool(_T("Audio Draw Timeline")) ? 20 : 0;
|
h -= OPT_GET("Audio/Display/Draw/Timeline")->GetBool() ? 20 : 0;
|
||||||
SetSamplesPercent(50,false);
|
SetSamplesPercent(50,false);
|
||||||
|
|
||||||
// Set cursor
|
// Set cursor
|
||||||
|
@ -188,7 +190,7 @@ void AudioDisplay::DoUpdateImage() {
|
||||||
bool weak = needImageUpdateWeak;
|
bool weak = needImageUpdateWeak;
|
||||||
|
|
||||||
// Prepare bitmap
|
// Prepare bitmap
|
||||||
int timelineHeight = Options.AsBool(_T("Audio Draw Timeline")) ? 20 : 0;
|
int timelineHeight = OPT_GET("Audio/Display/Draw/Timeline")->GetBool() ? 20 : 0;
|
||||||
int displayH = h+timelineHeight;
|
int displayH = h+timelineHeight;
|
||||||
if (origImage) {
|
if (origImage) {
|
||||||
if (origImage->GetWidth() != w || origImage->GetHeight() != displayH) {
|
if (origImage->GetWidth() != w || origImage->GetHeight() != displayH) {
|
||||||
|
@ -198,9 +200,9 @@ void AudioDisplay::DoUpdateImage() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Options
|
// Options
|
||||||
bool draw_boundary_lines = Options.AsBool(_T("Audio Draw Secondary Lines"));
|
bool draw_boundary_lines = OPT_GET("Audio/Display/Draw/Secondary Lines")->GetBool();
|
||||||
bool draw_selection_background = Options.AsBool(_T("Audio Draw Selection Background"));
|
bool draw_selection_background = OPT_GET("Audio/Display/Draw/Selection Background")->GetBool();
|
||||||
bool drawKeyframes = Options.AsBool(_T("Audio Draw Keyframes"));
|
bool drawKeyframes = OPT_GET("Audio/Display/Draw/Keyframes")->GetBool();
|
||||||
|
|
||||||
// Invalid dimensions
|
// Invalid dimensions
|
||||||
if (w == 0 || displayH == 0) return;
|
if (w == 0 || displayH == 0) return;
|
||||||
|
@ -210,7 +212,7 @@ void AudioDisplay::DoUpdateImage() {
|
||||||
|
|
||||||
// Is spectrum?
|
// Is spectrum?
|
||||||
bool spectrum = false;
|
bool spectrum = false;
|
||||||
if (provider && Options.AsBool(_T("Audio Spectrum"))) {
|
if (provider && OPT_GET("Audio/Spectrum")->GetBool()) {
|
||||||
spectrum = true;
|
spectrum = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,7 +222,7 @@ void AudioDisplay::DoUpdateImage() {
|
||||||
|
|
||||||
// Black background
|
// Black background
|
||||||
dc.SetPen(*wxTRANSPARENT_PEN);
|
dc.SetPen(*wxTRANSPARENT_PEN);
|
||||||
dc.SetBrush(wxBrush(Options.AsColour(_T("Audio Background"))));
|
dc.SetBrush(wxBrush(lagi_wxColour(OPT_GET("Colour/Audio Display/Background/Background")->GetColour())));
|
||||||
dc.DrawRectangle(0,0,w,h);
|
dc.DrawRectangle(0,0,w,h);
|
||||||
|
|
||||||
// Selection position
|
// Selection position
|
||||||
|
@ -254,8 +256,8 @@ void AudioDisplay::DoUpdateImage() {
|
||||||
|
|
||||||
// Draw selection bg
|
// Draw selection bg
|
||||||
if (hasSel && drawSelStart < drawSelEnd && draw_selection_background) {
|
if (hasSel && drawSelStart < drawSelEnd && draw_selection_background) {
|
||||||
if (NeedCommit && !karaoke->enabled) dc.SetBrush(wxBrush(Options.AsColour(_T("Audio Selection Background Modified"))));
|
if (NeedCommit && !karaoke->enabled) dc.SetBrush(wxBrush(lagi_wxColour(OPT_GET("Colour/Audio Display/Background/Selection Modified")->GetColour())));
|
||||||
else dc.SetBrush(wxBrush(Options.AsColour(_T("Audio Selection Background"))));
|
else dc.SetBrush(wxBrush(lagi_wxColour(OPT_GET("Colour/Audio Display/Background/Background")->GetColour())));
|
||||||
dc.DrawRectangle(drawSelStart,0,drawSelEnd-drawSelStart,h);
|
dc.DrawRectangle(drawSelStart,0,drawSelEnd-drawSelStart,h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,7 +281,7 @@ void AudioDisplay::DoUpdateImage() {
|
||||||
int64_t start = Position*samples;
|
int64_t start = Position*samples;
|
||||||
int rate = provider->GetSampleRate();
|
int rate = provider->GetSampleRate();
|
||||||
int pixBounds = rate / samples;
|
int pixBounds = rate / samples;
|
||||||
dc.SetPen(wxPen(Options.AsColour(_T("Audio Seconds Boundaries")),1,wxDOT));
|
dc.SetPen(wxPen(lagi_wxColour(OPT_GET("Colour/Audio Display/Seconds Boundaries")->GetColour()),1,wxDOT));
|
||||||
if (pixBounds >= 8) {
|
if (pixBounds >= 8) {
|
||||||
for (int x=0;x<w;x++) {
|
for (int x=0;x<w;x++) {
|
||||||
if (((x*samples)+start) % rate < samples) {
|
if (((x*samples)+start) % rate < samples) {
|
||||||
|
@ -290,9 +292,9 @@ void AudioDisplay::DoUpdateImage() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw current frame
|
// Draw current frame
|
||||||
if (Options.AsBool(_T("Audio Draw Video Position"))) {
|
if (OPT_GET("Audio/Display/Draw/Video Position")->GetBool()) {
|
||||||
if (VideoContext::Get()->IsLoaded()) {
|
if (VideoContext::Get()->IsLoaded()) {
|
||||||
dc.SetPen(wxPen(Options.AsColour(_T("Audio Play Cursor")),2,wxLONG_DASH));
|
dc.SetPen(wxPen(lagi_wxColour(OPT_GET("Colour/Audio Display/Play Cursor")->GetColour())));
|
||||||
int x = GetXAtMS(VFR_Output.GetTimeAtFrame(VideoContext::Get()->GetFrameN()));
|
int x = GetXAtMS(VFR_Output.GetTimeAtFrame(VideoContext::Get()->GetFrameN()));
|
||||||
dc.DrawLine(x,0,x,h);
|
dc.DrawLine(x,0,x,h);
|
||||||
}
|
}
|
||||||
|
@ -310,9 +312,9 @@ void AudioDisplay::DoUpdateImage() {
|
||||||
// Draw boundaries
|
// Draw boundaries
|
||||||
if (true) {
|
if (true) {
|
||||||
// Draw start boundary
|
// Draw start boundary
|
||||||
int selWidth = Options.AsInt(_T("Audio Line boundaries Thickness"));
|
int selWidth = OPT_GET("Audio/Line Boundaries Thickness")->GetInt();
|
||||||
dc.SetPen(wxPen(Options.AsColour(_T("Audio Line boundary start"))));
|
dc.SetPen(wxPen(lagi_wxColour(OPT_GET("Colour/Audio Display/Line boundary Start")->GetColour())));
|
||||||
dc.SetBrush(wxBrush(Options.AsColour(_T("Audio Line boundary start"))));
|
dc.SetBrush(wxBrush(lagi_wxColour(OPT_GET("Colour/Audio Display/Line boundary Start")->GetColour())));
|
||||||
dc.DrawRectangle(lineStart-selWidth/2+1,0,selWidth,h);
|
dc.DrawRectangle(lineStart-selWidth/2+1,0,selWidth,h);
|
||||||
wxPoint points1[3] = { wxPoint(lineStart,0), wxPoint(lineStart+10,0), wxPoint(lineStart,10) };
|
wxPoint points1[3] = { wxPoint(lineStart,0), wxPoint(lineStart+10,0), wxPoint(lineStart,10) };
|
||||||
wxPoint points2[3] = { wxPoint(lineStart,h-1), wxPoint(lineStart+10,h-1), wxPoint(lineStart,h-11) };
|
wxPoint points2[3] = { wxPoint(lineStart,h-1), wxPoint(lineStart+10,h-1), wxPoint(lineStart,h-11) };
|
||||||
|
@ -320,8 +322,8 @@ void AudioDisplay::DoUpdateImage() {
|
||||||
dc.DrawPolygon(3,points2);
|
dc.DrawPolygon(3,points2);
|
||||||
|
|
||||||
// Draw end boundary
|
// Draw end boundary
|
||||||
dc.SetPen(wxPen(Options.AsColour(_T("Audio Line boundary end"))));
|
dc.SetPen(wxPen(lagi_wxColour(OPT_GET("Colour/Audio Display/Line boundary End")->GetColour())));
|
||||||
dc.SetBrush(wxBrush(Options.AsColour(_T("Audio Line boundary end"))));
|
dc.SetBrush(wxBrush(lagi_wxColour(OPT_GET("Colour/Audio Display/Line boundary End")->GetColour())));
|
||||||
dc.DrawRectangle(lineEnd-selWidth/2+1,0,selWidth,h);
|
dc.DrawRectangle(lineEnd-selWidth/2+1,0,selWidth,h);
|
||||||
wxPoint points3[3] = { wxPoint(lineEnd,0), wxPoint(lineEnd-10,0), wxPoint(lineEnd,10) };
|
wxPoint points3[3] = { wxPoint(lineEnd,0), wxPoint(lineEnd-10,0), wxPoint(lineEnd,10) };
|
||||||
wxPoint points4[3] = { wxPoint(lineEnd,h-1), wxPoint(lineEnd-10,h-1), wxPoint(lineEnd,h-11) };
|
wxPoint points4[3] = { wxPoint(lineEnd,h-1), wxPoint(lineEnd-10,h-1), wxPoint(lineEnd,h-11) };
|
||||||
|
@ -333,11 +335,11 @@ void AudioDisplay::DoUpdateImage() {
|
||||||
if (hasKaraoke) {
|
if (hasKaraoke) {
|
||||||
try {
|
try {
|
||||||
// Prepare
|
// Prepare
|
||||||
wxPen curPen(Options.AsColour(_T("Audio Syllable boundaries")),1,wxDOT);
|
wxPen curPen(lagi_wxColour(OPT_GET("Colour/Audio Display/Syllable Boundaries")->GetColour()),1,wxDOT);
|
||||||
dc.SetPen(curPen);
|
dc.SetPen(curPen);
|
||||||
wxFont curFont(9,wxFONTFAMILY_DEFAULT,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_BOLD,false,_T("Verdana"),wxFONTENCODING_SYSTEM);
|
wxFont curFont(9,wxFONTFAMILY_DEFAULT,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_BOLD,false,_T("Verdana"),wxFONTENCODING_SYSTEM);
|
||||||
dc.SetFont(curFont);
|
dc.SetFont(curFont);
|
||||||
if (!spectrum) dc.SetTextForeground(Options.AsColour(_T("Audio Syllable text")));
|
if (!spectrum) dc.SetTextForeground(lagi_wxColour(OPT_GET("Colour/Audio Display/Syllable Text")->GetColour()));
|
||||||
else dc.SetTextForeground(wxColour(255,255,255));
|
else dc.SetTextForeground(wxColour(255,255,255));
|
||||||
size_t karn = karaoke->syllables.size();
|
size_t karn = karaoke->syllables.size();
|
||||||
int64_t pos1,pos2;
|
int64_t pos1,pos2;
|
||||||
|
@ -403,18 +405,18 @@ void AudioDisplay::DoUpdateImage() {
|
||||||
/// Draws markers for inactive lines, eg. the previous line, per configuration.
|
/// Draws markers for inactive lines, eg. the previous line, per configuration.
|
||||||
void AudioDisplay::DrawInactiveLines(wxDC &dc) {
|
void AudioDisplay::DrawInactiveLines(wxDC &dc) {
|
||||||
// Check if there is anything to do
|
// Check if there is anything to do
|
||||||
int shadeType = Options.AsInt(_T("Audio Inactive Lines Display Mode"));
|
int shadeType = OPT_GET("Audio/Inactive Lines Display Mode")->GetInt();
|
||||||
if (shadeType == 0) return;
|
if (shadeType == 0) return;
|
||||||
|
|
||||||
// Spectrum?
|
// Spectrum?
|
||||||
bool spectrum = false;
|
bool spectrum = false;
|
||||||
if (provider && Options.AsBool(_T("Audio Spectrum"))) {
|
if (provider && OPT_GET("Audio/Spectrum")->GetBool()) {
|
||||||
spectrum = true;
|
spectrum = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set options
|
// Set options
|
||||||
dc.SetBrush(wxBrush(Options.AsColour(_T("Audio Line boundary inactive line"))));
|
dc.SetBrush(wxBrush(lagi_wxColour(OPT_GET("Colour/Audio Display/Line Boundary Inactive Line")->GetColour())));
|
||||||
int selWidth = Options.AsInt(_T("Audio Line boundaries Thickness"));
|
int selWidth = OPT_GET("Audio/Line Boundaries Thickness")->GetInt();
|
||||||
AssDialogue *shade;
|
AssDialogue *shade;
|
||||||
int shadeX1,shadeX2;
|
int shadeX1,shadeX2;
|
||||||
int shadeFrom,shadeTo;
|
int shadeFrom,shadeTo;
|
||||||
|
@ -459,13 +461,13 @@ void AudioDisplay::DrawInactiveLines(wxDC &dc) {
|
||||||
x2 = MIN(x2,selX1);
|
x2 = MIN(x2,selX1);
|
||||||
|
|
||||||
// Set pen and draw
|
// Set pen and draw
|
||||||
dc.SetPen(wxPen(Options.AsColour(_T("Audio Waveform Inactive"))));
|
dc.SetPen(wxPen(lagi_wxColour(OPT_GET("Colour/Audio Display/Waveform Inactive")->GetColour())));
|
||||||
for (int i=x1;i<x2;i++) dc.DrawLine(i,peak[i],i,min[i]-1);
|
for (int i=x1;i<x2;i++) dc.DrawLine(i,peak[i],i,min[i]-1);
|
||||||
for (int i=x3;i<x4;i++) dc.DrawLine(i,peak[i],i,min[i]-1);
|
for (int i=x3;i<x4;i++) dc.DrawLine(i,peak[i],i,min[i]-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw boundaries
|
// Draw boundaries
|
||||||
dc.SetPen(wxPen(Options.AsColour(_T("Audio Line boundary inactive line"))));
|
dc.SetPen(wxPen(lagi_wxColour(OPT_GET("Colour/Audio Display/Line Boundary Inactive Line")->GetColour())));
|
||||||
dc.DrawRectangle(shadeX1-selWidth/2+1,0,selWidth,h);
|
dc.DrawRectangle(shadeX1-selWidth/2+1,0,selWidth,h);
|
||||||
dc.DrawRectangle(shadeX2-selWidth/2+1,0,selWidth,h);
|
dc.DrawRectangle(shadeX2-selWidth/2+1,0,selWidth,h);
|
||||||
}
|
}
|
||||||
|
@ -498,7 +500,7 @@ void AudioDisplay::DrawKeyframes(wxDC &dc) {
|
||||||
/// @param dc The DC to draw to.
|
/// @param dc The DC to draw to.
|
||||||
void AudioDisplay::DrawTimescale(wxDC &dc) {
|
void AudioDisplay::DrawTimescale(wxDC &dc) {
|
||||||
// Set size
|
// Set size
|
||||||
int timelineHeight = Options.AsBool(_T("Audio Draw Timeline")) ? 20 : 0;
|
int timelineHeight = OPT_GET("Audio/Display/Draw/Timeline")->GetBool() ? 20 : 0;
|
||||||
|
|
||||||
// Set colours
|
// Set colours
|
||||||
dc.SetBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
|
dc.SetBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
|
||||||
|
@ -577,23 +579,23 @@ void AudioDisplay::DrawWaveform(wxDC &dc,bool weak) {
|
||||||
|
|
||||||
// Draw pre-selection
|
// Draw pre-selection
|
||||||
if (!hasSel) selStartCap = w;
|
if (!hasSel) selStartCap = w;
|
||||||
dc.SetPen(wxPen(Options.AsColour(_T("Audio Waveform"))));
|
dc.SetPen(wxPen(lagi_wxColour(OPT_GET("Colour/Audio Display/Waveform")->GetColour())));
|
||||||
for (int64_t i=0;i<selStartCap;i++) {
|
for (int64_t i=0;i<selStartCap;i++) {
|
||||||
dc.DrawLine(i,peak[i],i,min[i]-1);
|
dc.DrawLine(i,peak[i],i,min[i]-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasSel) {
|
if (hasSel) {
|
||||||
// Draw selection
|
// Draw selection
|
||||||
if (Options.AsBool(_T("Audio Draw Selection Background"))) {
|
if (OPT_GET("Audio/Display/Draw/Selection Background")->GetBool()) {
|
||||||
if (NeedCommit && !karaoke->enabled) dc.SetPen(wxPen(Options.AsColour(_T("Audio Waveform Modified"))));
|
if (NeedCommit && !karaoke->enabled) dc.SetPen(wxPen(lagi_wxColour(OPT_GET("Colour/Audio Display/Waveform Modified")->GetColour())));
|
||||||
else dc.SetPen(wxPen(Options.AsColour(_T("Audio Waveform Selected"))));
|
else dc.SetPen(wxPen(lagi_wxColour(OPT_GET("Colour/Audio Display/Waveform Selected")->GetColour())));
|
||||||
}
|
}
|
||||||
for (int64_t i=selStartCap;i<selEndCap;i++) {
|
for (int64_t i=selStartCap;i<selEndCap;i++) {
|
||||||
dc.DrawLine(i,peak[i],i,min[i]-1);
|
dc.DrawLine(i,peak[i],i,min[i]-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw post-selection
|
// Draw post-selection
|
||||||
dc.SetPen(wxPen(Options.AsColour(_T("Audio Waveform"))));
|
dc.SetPen(wxPen(lagi_wxColour(OPT_GET("Colour/Audio Display/Waveform")->GetColour())));
|
||||||
for (int64_t i=selEndCap;i<w;i++) {
|
for (int64_t i=selEndCap;i<w;i++) {
|
||||||
dc.DrawLine(i,peak[i],i,min[i]-1);
|
dc.DrawLine(i,peak[i],i,min[i]-1);
|
||||||
}
|
}
|
||||||
|
@ -707,7 +709,7 @@ void AudioDisplay::GetKaraokePos(int64_t &karStart,int64_t &karEnd, bool cap) {
|
||||||
void AudioDisplay::Update() {
|
void AudioDisplay::Update() {
|
||||||
if (blockUpdate) return;
|
if (blockUpdate) return;
|
||||||
if (loaded) {
|
if (loaded) {
|
||||||
if (Options.AsBool(_T("Audio Autoscroll")))
|
if (OPT_GET("Audio/Auto/Scroll")->GetBool())
|
||||||
MakeDialogueVisible();
|
MakeDialogueVisible();
|
||||||
else
|
else
|
||||||
UpdateImage(true);
|
UpdateImage(true);
|
||||||
|
@ -717,7 +719,7 @@ void AudioDisplay::Update() {
|
||||||
/// @brief Recreate the image
|
/// @brief Recreate the image
|
||||||
void AudioDisplay::RecreateImage() {
|
void AudioDisplay::RecreateImage() {
|
||||||
GetClientSize(&w,&h);
|
GetClientSize(&w,&h);
|
||||||
h -= Options.AsBool(_T("Audio Draw Timeline")) ? 20 : 0;
|
h -= OPT_GET("Audio/Display/Draw/Timeline")->GetBool() ? 20 : 0;
|
||||||
delete origImage;
|
delete origImage;
|
||||||
origImage = NULL;
|
origImage = NULL;
|
||||||
UpdateImage(false);
|
UpdateImage(false);
|
||||||
|
@ -919,7 +921,7 @@ void AudioDisplay::SetFile(wxString file) {
|
||||||
// Add to recent
|
// Add to recent
|
||||||
if (!is_dummy) {
|
if (!is_dummy) {
|
||||||
wxLogDebug(_T("AudioDisplay::SetFile: add to recent"));
|
wxLogDebug(_T("AudioDisplay::SetFile: add to recent"));
|
||||||
Options.AddToRecentList(file,_T("Recent aud"));
|
AegisubApp::Get()->mru->Add("Audio", STD_STR(file));
|
||||||
wxFileName fn(file);
|
wxFileName fn(file);
|
||||||
StandardPaths::SetPathValue(_T("?audio"),fn.GetPath());
|
StandardPaths::SetPathValue(_T("?audio"),fn.GetPath());
|
||||||
}
|
}
|
||||||
|
@ -1140,7 +1142,7 @@ void AudioDisplay::SetDialogue(SubtitlesGrid *_grid,AssDialogue *diag,int n) {
|
||||||
NeedCommit = false;
|
NeedCommit = false;
|
||||||
|
|
||||||
// Set times
|
// Set times
|
||||||
if (dialogue && !dontReadTimes && Options.AsBool(_T("Audio grab times on select"))) {
|
if (dialogue && !dontReadTimes && OPT_GET("Audio/Grab Times on Select")->GetBool()) {
|
||||||
wxLogDebug(_T("AudioDisplay::SetDialogue: grabbing times"));
|
wxLogDebug(_T("AudioDisplay::SetDialogue: grabbing times"));
|
||||||
int s = dialogue->Start.GetMS();
|
int s = dialogue->Start.GetMS();
|
||||||
int e = dialogue->End.GetMS();
|
int e = dialogue->End.GetMS();
|
||||||
|
@ -1249,7 +1251,7 @@ void AudioDisplay::CommitChanges (bool nextLine) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Next line (ugh what a condition, can this be simplified?)
|
// Next line (ugh what a condition, can this be simplified?)
|
||||||
if (nextLine && !karaoke->enabled && Options.AsBool(_T("Audio Next Line on Commit")) && !wasKaraSplitting) {
|
if (nextLine && !karaoke->enabled && OPT_GET("Audio/Next Line on Commit")->GetBool() && !wasKaraSplitting) {
|
||||||
wxLogDebug(_T("AudioDisplay::CommitChanges: going to next line"));
|
wxLogDebug(_T("AudioDisplay::CommitChanges: going to next line"));
|
||||||
// Insert a line if it doesn't exist
|
// Insert a line if it doesn't exist
|
||||||
int nrows = grid->GetRows();
|
int nrows = grid->GetRows();
|
||||||
|
@ -1258,15 +1260,15 @@ void AudioDisplay::CommitChanges (bool nextLine) {
|
||||||
AssDialogue *def = new AssDialogue;
|
AssDialogue *def = new AssDialogue;
|
||||||
def->Start = grid->GetDialogue(line_n)->End;
|
def->Start = grid->GetDialogue(line_n)->End;
|
||||||
def->End = grid->GetDialogue(line_n)->End;
|
def->End = grid->GetDialogue(line_n)->End;
|
||||||
def->End.SetMS(def->End.GetMS()+Options.AsInt(_T("Timing Default Duration")));
|
def->End.SetMS(def->End.GetMS()+OPT_GET("Timing/Default Duration")->GetInt());
|
||||||
def->Style = grid->GetDialogue(line_n)->Style;
|
def->Style = grid->GetDialogue(line_n)->Style;
|
||||||
grid->InsertLine(def,line_n,true);
|
grid->InsertLine(def,line_n,true);
|
||||||
curStartMS = curEndMS;
|
curStartMS = curEndMS;
|
||||||
curEndMS = curStartMS + Options.AsInt(_T("Timing Default Duration"));
|
curEndMS = curStartMS + OPT_GET("Timing/Default Duration")->GetInt();
|
||||||
}
|
}
|
||||||
else if (grid->GetDialogue(line_n+1)->Start.GetMS() == 0 && grid->GetDialogue(line_n+1)->End.GetMS() == 0) {
|
else if (grid->GetDialogue(line_n+1)->Start.GetMS() == 0 && grid->GetDialogue(line_n+1)->End.GetMS() == 0) {
|
||||||
curStartMS = curEndMS;
|
curStartMS = curEndMS;
|
||||||
curEndMS = curStartMS + Options.AsInt(_T("Timing Default Duration"));
|
curEndMS = curStartMS + OPT_GET("Timing/Default Duration")->GetInt();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
curStartMS = grid->GetDialogue(line_n+1)->Start.GetMS();
|
curStartMS = grid->GetDialogue(line_n+1)->Start.GetMS();
|
||||||
|
@ -1289,19 +1291,19 @@ void AudioDisplay::CommitChanges (bool nextLine) {
|
||||||
void AudioDisplay::AddLead(bool in,bool out) {
|
void AudioDisplay::AddLead(bool in,bool out) {
|
||||||
// Lead in
|
// Lead in
|
||||||
if (in) {
|
if (in) {
|
||||||
curStartMS -= Options.AsInt(_T("Audio Lead in"));
|
curStartMS -= OPT_GET("Audio/Lead/IN")->GetInt();
|
||||||
if (curStartMS < 0) curStartMS = 0;
|
if (curStartMS < 0) curStartMS = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lead out
|
// Lead out
|
||||||
if (out) {
|
if (out) {
|
||||||
curEndMS += Options.AsInt(_T("Audio Lead out"));
|
curEndMS += OPT_GET("Audio/Lead/OUT")->GetInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set changes
|
// Set changes
|
||||||
UpdateTimeEditCtrls();
|
UpdateTimeEditCtrls();
|
||||||
NeedCommit = true;
|
NeedCommit = true;
|
||||||
if (Options.AsBool(_T("Audio Autocommit"))) CommitChanges();
|
if (OPT_GET("Audio/Auto/Commit")->GetBool()) CommitChanges();
|
||||||
Update();
|
Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1337,7 +1339,7 @@ void AudioDisplay::OnMouseEvent(wxMouseEvent& event) {
|
||||||
int64_t y = event.GetY();
|
int64_t y = event.GetY();
|
||||||
bool karMode = karaoke->enabled;
|
bool karMode = karaoke->enabled;
|
||||||
bool shiftDown = event.m_shiftDown;
|
bool shiftDown = event.m_shiftDown;
|
||||||
int timelineHeight = Options.AsBool(_T("Audio Draw Timeline")) ? 20 : 0;
|
int timelineHeight = OPT_GET("Audio/Display/Draw/Timeline")->GetBool() ? 20 : 0;
|
||||||
|
|
||||||
// Leaving event
|
// Leaving event
|
||||||
if (event.Leaving()) {
|
if (event.Leaving()) {
|
||||||
|
@ -1358,7 +1360,7 @@ void AudioDisplay::OnMouseEvent(wxMouseEvent& event) {
|
||||||
inside = true;
|
inside = true;
|
||||||
|
|
||||||
// Get focus
|
// Get focus
|
||||||
if (wxWindow::FindFocus() != this && Options.AsBool(_T("Audio Autofocus"))) SetFocus();
|
if (wxWindow::FindFocus() != this && OPT_GET("Audio/Auto/Focus")->GetBool()) SetFocus();
|
||||||
}
|
}
|
||||||
else if (y < h+timelineHeight) onScale = true;
|
else if (y < h+timelineHeight) onScale = true;
|
||||||
}
|
}
|
||||||
|
@ -1387,7 +1389,7 @@ void AudioDisplay::OnMouseEvent(wxMouseEvent& event) {
|
||||||
if (event.GetWheelRotation() != 0) {
|
if (event.GetWheelRotation() != 0) {
|
||||||
// Zoom or scroll?
|
// Zoom or scroll?
|
||||||
bool zoom = shiftDown;
|
bool zoom = shiftDown;
|
||||||
if (Options.AsBool(_T("Audio Wheel Default To Zoom"))) zoom = !zoom;
|
if (OPT_GET("Audio/Wheel Default to Zoom")->GetBool()) zoom = !zoom;
|
||||||
|
|
||||||
// Zoom
|
// Zoom
|
||||||
if (zoom) {
|
if (zoom) {
|
||||||
|
@ -1423,7 +1425,7 @@ void AudioDisplay::OnMouseEvent(wxMouseEvent& event) {
|
||||||
dc.DrawLine(x,0,x,h);
|
dc.DrawLine(x,0,x,h);
|
||||||
|
|
||||||
// Time
|
// Time
|
||||||
if (Options.AsBool(_T("Audio Draw Cursor Time"))) {
|
if (OPT_GET("Audio/Display/Draw/Cursor")->GetBool()) {
|
||||||
// Time string
|
// Time string
|
||||||
AssTime time;
|
AssTime time;
|
||||||
time.SetMS(GetMSAtX(x));
|
time.SetMS(GetMSAtX(x));
|
||||||
|
@ -1525,7 +1527,7 @@ void AudioDisplay::OnMouseEvent(wxMouseEvent& event) {
|
||||||
// Line timing mode
|
// Line timing mode
|
||||||
if (!karTime) {
|
if (!karTime) {
|
||||||
// Grab start
|
// Grab start
|
||||||
if (abs64 (x - selStart) < 6 && Options.AsBool(_T("Disable Dragging Times"))==false) {
|
if (abs64 (x - selStart) < 6 && OPT_GET("Audio/Display/Dragging Times")->GetBool()==false) {
|
||||||
wxCursor cursor(wxCURSOR_SIZEWE);
|
wxCursor cursor(wxCURSOR_SIZEWE);
|
||||||
SetCursor(cursor);
|
SetCursor(cursor);
|
||||||
defCursor = false;
|
defCursor = false;
|
||||||
|
@ -1536,7 +1538,7 @@ void AudioDisplay::OnMouseEvent(wxMouseEvent& event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Grab end
|
// Grab end
|
||||||
else if (abs64 (x - selEnd) < 6 && Options.AsBool(_T("Disable Dragging Times"))==false) {
|
else if (abs64 (x - selEnd) < 6 && OPT_GET("Audio/Display/Dragging Times")->GetBool()==false) {
|
||||||
wxCursor cursor(wxCURSOR_SIZEWE);
|
wxCursor cursor(wxCURSOR_SIZEWE);
|
||||||
SetCursor(cursor);
|
SetCursor(cursor);
|
||||||
defCursor = false;
|
defCursor = false;
|
||||||
|
@ -1608,7 +1610,7 @@ void AudioDisplay::OnMouseEvent(wxMouseEvent& event) {
|
||||||
updated = true;
|
updated = true;
|
||||||
diagUpdated = true;
|
diagUpdated = true;
|
||||||
|
|
||||||
if (leftIsDown && abs((long)(x-lastX)) > Options.AsInt(_T("Audio Start Drag Sensitivity"))) {
|
if (leftIsDown && abs((long)(x-lastX)) > OPT_GET("Audio/Start Drag Sensitivity")->GetInt()) {
|
||||||
selStart = lastX;
|
selStart = lastX;
|
||||||
selEnd = x;
|
selEnd = x;
|
||||||
curStartMS = GetBoundarySnap(GetMSAtX(lastX),10,event.ShiftDown(),true);
|
curStartMS = GetBoundarySnap(GetMSAtX(lastX),10,event.ShiftDown(),true);
|
||||||
|
@ -1697,7 +1699,7 @@ void AudioDisplay::OnMouseEvent(wxMouseEvent& event) {
|
||||||
NeedCommit = true;
|
NeedCommit = true;
|
||||||
if (curStartMS <= curEndMS) {
|
if (curStartMS <= curEndMS) {
|
||||||
UpdateTimeEditCtrls();
|
UpdateTimeEditCtrls();
|
||||||
if (Options.AsBool(_T("Audio Autocommit"))) CommitChanges();
|
if (OPT_GET("Audio/Auto/Commit")->GetBool()) CommitChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
else UpdateImage(true);
|
else UpdateImage(true);
|
||||||
|
@ -1750,9 +1752,9 @@ int AudioDisplay::GetBoundarySnap(int ms,int rangeX,bool shiftHeld,bool start) {
|
||||||
|
|
||||||
// Keyframe boundaries
|
// Keyframe boundaries
|
||||||
wxArrayInt boundaries;
|
wxArrayInt boundaries;
|
||||||
bool snapKey = Options.AsBool(_T("Audio snap to keyframes"));
|
bool snapKey = OPT_GET("Audio/Display/Snap/Keyframes")->GetBool();
|
||||||
if (shiftHeld) snapKey = !snapKey;
|
if (shiftHeld) snapKey = !snapKey;
|
||||||
if (snapKey && VideoContext::Get()->KeyFramesLoaded() && Options.AsBool(_T("Audio Draw Keyframes"))) {
|
if (snapKey && VideoContext::Get()->KeyFramesLoaded() && OPT_GET("Audio/Display/Draw/Keyframes")->GetBool()) {
|
||||||
int64_t keyMS;
|
int64_t keyMS;
|
||||||
wxArrayInt keyFrames = VideoContext::Get()->GetKeyFrames();
|
wxArrayInt keyFrames = VideoContext::Get()->GetKeyFrames();
|
||||||
int frame;
|
int frame;
|
||||||
|
@ -1767,8 +1769,8 @@ int AudioDisplay::GetBoundarySnap(int ms,int rangeX,bool shiftHeld,bool start) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Other subtitles' boundaries
|
// Other subtitles' boundaries
|
||||||
int inactiveType = Options.AsInt(_T("Audio Inactive Lines Display Mode"));
|
int inactiveType = OPT_GET("Audio/Inactive Lines Display Mode")->GetInt();
|
||||||
bool snapLines = Options.AsBool(_T("Audio snap to other lines"));
|
bool snapLines = OPT_GET("Audio/Display/Snap/Other Lines")->GetBool();
|
||||||
if (shiftHeld) snapLines = !snapLines;
|
if (shiftHeld) snapLines = !snapLines;
|
||||||
if (snapLines && (inactiveType == 1 || inactiveType == 2)) {
|
if (snapLines && (inactiveType == 1 || inactiveType == 2)) {
|
||||||
AssDialogue *shade;
|
AssDialogue *shade;
|
||||||
|
@ -1932,7 +1934,7 @@ int AudioDisplay::GetBoundarySnap(int ms,int rangeX,bool shiftHeld,bool start) {
|
||||||
void AudioDisplay::OnSize(wxSizeEvent &event) {
|
void AudioDisplay::OnSize(wxSizeEvent &event) {
|
||||||
// Set size
|
// Set size
|
||||||
GetClientSize(&w,&h);
|
GetClientSize(&w,&h);
|
||||||
h -= Options.AsBool(_T("Audio Draw Timeline")) ? 20 : 0;
|
h -= OPT_GET("Audio/Display/Draw/Timeline")->GetBool() ? 20 : 0;
|
||||||
|
|
||||||
// Update image
|
// Update image
|
||||||
UpdateSamples();
|
UpdateSamples();
|
||||||
|
@ -1973,7 +1975,7 @@ void AudioDisplay::OnUpdateTimer(wxTimerEvent &event) {
|
||||||
int posX = GetXAtSample(curPos);
|
int posX = GetXAtSample(curPos);
|
||||||
bool fullDraw = false;
|
bool fullDraw = false;
|
||||||
bool centerLock = false;
|
bool centerLock = false;
|
||||||
bool scrollToCursor = Options.AsBool(_T("Audio lock scroll on cursor"));
|
bool scrollToCursor = OPT_GET("Audio/Lock Scroll on Cursor")->GetBool();
|
||||||
if (centerLock) {
|
if (centerLock) {
|
||||||
int goTo = MAX(0,curPos - w*samples/2);
|
int goTo = MAX(0,curPos - w*samples/2);
|
||||||
if (goTo >= 0) {
|
if (goTo >= 0) {
|
||||||
|
@ -1999,7 +2001,7 @@ void AudioDisplay::OnUpdateTimer(wxTimerEvent &event) {
|
||||||
wxMemoryDC src;
|
wxMemoryDC src;
|
||||||
curpos = GetXAtSample(curPos);
|
curpos = GetXAtSample(curPos);
|
||||||
if (curpos >= 0 && curpos < GetClientSize().GetWidth()) {
|
if (curpos >= 0 && curpos < GetClientSize().GetWidth()) {
|
||||||
dc.SetPen(wxPen(Options.AsColour(_T("Audio Play cursor"))));
|
dc.SetPen(wxPen(lagi_wxColour(OPT_GET("Colour/Audio Display/Play Cursor")->GetColour())));
|
||||||
src.SelectObject(*origImage);
|
src.SelectObject(*origImage);
|
||||||
if (fullDraw) {
|
if (fullDraw) {
|
||||||
//dc.Blit(0,0,w,h,&src,0,0);
|
//dc.Blit(0,0,w,h,&src,0,0);
|
||||||
|
@ -2195,7 +2197,7 @@ void AudioDisplay::OnKeyDown(wxKeyEvent &event) {
|
||||||
if (diagUpdated) {
|
if (diagUpdated) {
|
||||||
diagUpdated = false;
|
diagUpdated = false;
|
||||||
NeedCommit = true;
|
NeedCommit = true;
|
||||||
if (Options.AsBool(_T("Audio Autocommit")) && curStartMS <= curEndMS) CommitChanges();
|
if (OPT_GET("Audio/Auto/Commit")->GetBool() && curStartMS <= curEndMS) CommitChanges();
|
||||||
else UpdateImage(true);
|
else UpdateImage(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,6 +59,8 @@
|
||||||
#ifdef WITH_PULSEAUDIO
|
#ifdef WITH_PULSEAUDIO
|
||||||
#include "audio_player_pulse.h"
|
#include "audio_player_pulse.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "compat.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -151,7 +153,7 @@ void AudioPlayer::OnStopAudio(wxCommandEvent &event) {
|
||||||
///
|
///
|
||||||
AudioPlayer* AudioPlayerFactoryManager::GetAudioPlayer() {
|
AudioPlayer* AudioPlayerFactoryManager::GetAudioPlayer() {
|
||||||
// List of providers
|
// List of providers
|
||||||
wxArrayString list = GetFactoryList(Options.AsText(_T("Audio player")));
|
wxArrayString list = GetFactoryList(lagi_wxString(OPT_GET("Audio/Player")->GetString()));
|
||||||
|
|
||||||
// None available
|
// None available
|
||||||
if (list.Count() == 0) throw _T("No audio players are available.");
|
if (list.Count() == 0) throw _T("No audio players are available.");
|
||||||
|
|
|
@ -85,7 +85,7 @@ void AlsaPlayer::OpenStream()
|
||||||
// We want playback
|
// We want playback
|
||||||
stream = SND_PCM_STREAM_PLAYBACK;
|
stream = SND_PCM_STREAM_PLAYBACK;
|
||||||
// And get a device name
|
// And get a device name
|
||||||
wxString device = Options.AsText(_T("Audio Alsa Device"));
|
wxString device = lagi_wxString(OPT_GET("Player/Audio/ALSA/Device")->GetString());
|
||||||
|
|
||||||
// Open device for blocking access
|
// Open device for blocking access
|
||||||
if (snd_pcm_open(&pcm_handle, device.mb_str(wxConvUTF8), stream, 0) < 0) { // supposedly we don't want SND_PCM_ASYNC even for async playback
|
if (snd_pcm_open(&pcm_handle, device.mb_str(wxConvUTF8), stream, 0) < 0) { // supposedly we don't want SND_PCM_ASYNC even for async playback
|
||||||
|
|
|
@ -863,8 +863,8 @@ DirectSoundPlayer2::DirectSoundPlayer2()
|
||||||
thread = 0;
|
thread = 0;
|
||||||
|
|
||||||
// The buffer will hold BufferLength times WantedLatency milliseconds of audio
|
// The buffer will hold BufferLength times WantedLatency milliseconds of audio
|
||||||
WantedLatency = Options.AsInt(_T("Audio dsound buffer latency"));
|
WantedLatency = OPT_GET("Player/Audio/DirectSound/Buffer Latency")->GetInt();
|
||||||
BufferLength = Options.AsInt(_T("Audio dsound buffer length"));
|
BufferLength = OPT_GET("Player/Audio/DirectSound/Buffer Length")->GetInt();
|
||||||
|
|
||||||
// sanity checking
|
// sanity checking
|
||||||
if (WantedLatency <= 0)
|
if (WantedLatency <= 0)
|
||||||
|
|
|
@ -43,6 +43,8 @@
|
||||||
#include "audio_player_oss.h"
|
#include "audio_player_oss.h"
|
||||||
#include "audio_provider_manager.h"
|
#include "audio_provider_manager.h"
|
||||||
#include "frame_main.h"
|
#include "frame_main.h"
|
||||||
|
#include "compat.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
@ -81,7 +83,7 @@ void OSSPlayer::OpenStream()
|
||||||
bpf = provider->GetChannels() * provider->GetBytesPerSample();
|
bpf = provider->GetChannels() * provider->GetBytesPerSample();
|
||||||
|
|
||||||
// Open device
|
// Open device
|
||||||
wxString device = Options.AsText(_T("Audio OSS Device"));
|
wxString device = lagi_wxString(OPT_GET("Audio/OSS/Device")->GetString());
|
||||||
dspdev = ::open(device.mb_str(wxConvUTF8), O_WRONLY, 0);
|
dspdev = ::open(device.mb_str(wxConvUTF8), O_WRONLY, 0);
|
||||||
if (dspdev < 0) {
|
if (dspdev < 0) {
|
||||||
throw _T("OSS player: opening device failed");
|
throw _T("OSS player: opening device failed");
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include "audio_player_portaudio.h"
|
#include "audio_player_portaudio.h"
|
||||||
#include "audio_provider_manager.h"
|
#include "audio_provider_manager.h"
|
||||||
#include "charset_conv.h"
|
#include "charset_conv.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include <wx/log.h>
|
#include <wx/log.h>
|
||||||
|
@ -84,7 +85,7 @@ void PortAudioPlayer::OpenStream() {
|
||||||
// Open stream
|
// Open stream
|
||||||
PaStreamParameters pa_output_p;
|
PaStreamParameters pa_output_p;
|
||||||
|
|
||||||
int pa_config_default = Options.AsInt(_T("Audio PortAudio Device"));
|
int pa_config_default = OPT_GET("Player/Audio/PortAudio/Device")->GetInt();
|
||||||
PaDeviceIndex pa_device;
|
PaDeviceIndex pa_device;
|
||||||
|
|
||||||
if (pa_config_default < 0) {
|
if (pa_config_default < 0) {
|
||||||
|
|
|
@ -57,6 +57,8 @@
|
||||||
#include "audio_provider_quicktime.h"
|
#include "audio_provider_quicktime.h"
|
||||||
#endif
|
#endif
|
||||||
#include "audio_provider_ram.h"
|
#include "audio_provider_ram.h"
|
||||||
|
#include "compat.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -243,7 +245,7 @@ AudioProvider *AudioProviderFactoryManager::GetAudioProvider(wxString filename,
|
||||||
// Prepare provider
|
// Prepare provider
|
||||||
AudioProvider *provider = NULL;
|
AudioProvider *provider = NULL;
|
||||||
|
|
||||||
if (!Options.AsBool(_T("Audio Disable PCM Provider"))) {
|
if (!OPT_GET("Provider/Audio/PCM/Disable")->GetBool()) {
|
||||||
// Try a PCM provider first
|
// Try a PCM provider first
|
||||||
provider = CreatePCMAudioProvider(filename);
|
provider = CreatePCMAudioProvider(filename);
|
||||||
if (provider) {
|
if (provider) {
|
||||||
|
@ -257,7 +259,7 @@ AudioProvider *AudioProviderFactoryManager::GetAudioProvider(wxString filename,
|
||||||
}
|
}
|
||||||
|
|
||||||
// List of providers
|
// List of providers
|
||||||
wxArrayString list = GetFactoryList(Options.AsText(_T("Audio provider")));
|
wxArrayString list = GetFactoryList(lagi_wxString(OPT_GET("Audio/Provider")->GetString()));
|
||||||
|
|
||||||
// None available
|
// None available
|
||||||
if (list.Count() == 0) throw _T("No audio providers are available.");
|
if (list.Count() == 0) throw _T("No audio providers are available.");
|
||||||
|
@ -285,7 +287,7 @@ AudioProvider *AudioProviderFactoryManager::GetAudioProvider(wxString filename,
|
||||||
provider = CreateConvertAudioProvider(provider);
|
provider = CreateConvertAudioProvider(provider);
|
||||||
|
|
||||||
// Change provider to RAM/HD cache if needed
|
// Change provider to RAM/HD cache if needed
|
||||||
if (cache == -1) cache = Options.AsInt(_T("Audio Cache"));
|
if (cache == -1) cache = OPT_GET("Audio/Cache/Type")->GetInt();
|
||||||
if (cache) {
|
if (cache) {
|
||||||
AudioProvider *final = NULL;
|
AudioProvider *final = NULL;
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,8 @@
|
||||||
|
|
||||||
#include "audio_provider_avs.h"
|
#include "audio_provider_avs.h"
|
||||||
#include "charset_conv.h"
|
#include "charset_conv.h"
|
||||||
|
#include "compat.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "standard_paths.h"
|
#include "standard_paths.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
@ -152,7 +154,7 @@ void AvisynthAudioProvider::LoadFromClip(AVSValue _clip) {
|
||||||
|
|
||||||
// Convert to one channel
|
// Convert to one channel
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
strcpy(buffer,Options.AsText(_T("Audio Downmixer")).mb_str(csConvLocal));
|
strcpy(buffer,lagi_wxString(OPT_GET("Audio/Downmixer")->GetString()).mb_str(csConvLocal));
|
||||||
script = env->Invoke(buffer, _clip);
|
script = env->Invoke(buffer, _clip);
|
||||||
|
|
||||||
// Convert to 16 bits per sample
|
// Convert to 16 bits per sample
|
||||||
|
@ -160,7 +162,7 @@ void AvisynthAudioProvider::LoadFromClip(AVSValue _clip) {
|
||||||
vi = script.AsClip()->GetVideoInfo();
|
vi = script.AsClip()->GetVideoInfo();
|
||||||
|
|
||||||
// Convert sample rate
|
// Convert sample rate
|
||||||
int setsample = Options.AsInt(_T("Audio Sample Rate"));
|
int setsample = OPT_GET("Provider/Audio/AVS/Sample Rate")->GetInt();
|
||||||
if (vi.SamplesPerSecond() < 32000) setsample = 44100;
|
if (vi.SamplesPerSecond() < 32000) setsample = 44100;
|
||||||
if (setsample != 0) {
|
if (setsample != 0) {
|
||||||
AVSValue args[2] = { script, setsample };
|
AVSValue args[2] = { script, setsample };
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
|
|
||||||
#include "audio_provider_ffmpegsource.h"
|
#include "audio_provider_ffmpegsource.h"
|
||||||
#include "include/aegisub/aegisub.h"
|
#include "include/aegisub/aegisub.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -164,7 +165,7 @@ void FFmpegSourceAudioProvider::LoadAudio(wxString filename) {
|
||||||
// moment of truth
|
// moment of truth
|
||||||
if (!IndexIsValid) {
|
if (!IndexIsValid) {
|
||||||
int TrackMask;
|
int TrackMask;
|
||||||
if (Options.AsBool(_T("FFmpegSource always index all tracks")) || TrackNumber == FFMS_TRACKMASK_ALL)
|
if (OPT_GET("Provider/FFmpegSource/Index All Tracks")->GetBool() || TrackNumber == FFMS_TRACKMASK_ALL)
|
||||||
TrackMask = FFMS_TRACKMASK_ALL;
|
TrackMask = FFMS_TRACKMASK_ALL;
|
||||||
else
|
else
|
||||||
TrackMask = (1 << TrackNumber);
|
TrackMask = (1 << TrackNumber);
|
||||||
|
|
|
@ -47,6 +47,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "audio_provider_hd.h"
|
#include "audio_provider_hd.h"
|
||||||
|
#include "compat.h"
|
||||||
#include "dialog_progress.h"
|
#include "dialog_progress.h"
|
||||||
#include "frame_main.h"
|
#include "frame_main.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
@ -159,7 +160,7 @@ void HDAudioProvider::GetAudio(void *buf, int64_t start, int64_t count) {
|
||||||
///
|
///
|
||||||
wxString HDAudioProvider::DiskCachePath() {
|
wxString HDAudioProvider::DiskCachePath() {
|
||||||
// Default
|
// Default
|
||||||
wxString path = Options.AsText(_T("Audio HD Cache Location"));
|
wxString path = lagi_wxString(OPT_GET("Audio/Cache/HD/Location")->GetString());
|
||||||
if (path == _T("default")) return StandardPaths::DecodePath(_T("?temp/"));
|
if (path == _T("default")) return StandardPaths::DecodePath(_T("?temp/"));
|
||||||
|
|
||||||
// Specified
|
// Specified
|
||||||
|
@ -172,7 +173,7 @@ wxString HDAudioProvider::DiskCachePath() {
|
||||||
///
|
///
|
||||||
wxString HDAudioProvider::DiskCacheName() {
|
wxString HDAudioProvider::DiskCacheName() {
|
||||||
// Get pattern
|
// Get pattern
|
||||||
wxString pattern = Options.AsText(_T("Audio HD Cache Name"));
|
wxString pattern = lagi_wxString(OPT_GET("Audio/Cache/HD/Name")->GetString());
|
||||||
if (pattern.Find(_T("%02i")) == wxNOT_FOUND) pattern = _T("audio%02i.tmp");
|
if (pattern.Find(_T("%02i")) == wxNOT_FOUND) pattern = _T("audio%02i.tmp");
|
||||||
|
|
||||||
// Try from 00 to 99
|
// Try from 00 to 99
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
#include "audio_renderer_spectrum.h"
|
#include "audio_renderer_spectrum.h"
|
||||||
#include "colorspace.h"
|
#include "colorspace.h"
|
||||||
#include "fft.h"
|
#include "fft.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
@ -565,7 +566,7 @@ public:
|
||||||
cache_root = new IntermediateSpectrumCache(provider, 0, num_lines, num_overlaps, 0);
|
cache_root = new IntermediateSpectrumCache(provider, 0, num_lines, num_overlaps, 0);
|
||||||
|
|
||||||
// option is stored in megabytes, but we want number of bytes
|
// option is stored in megabytes, but we want number of bytes
|
||||||
unsigned long max_cache_size = Options.AsInt(_T("Audio Spectrum Memory Max"));
|
unsigned long max_cache_size = OPT_GET("Audio/Renderer/Spectrum/Memory Max")->GetInt();
|
||||||
// It can't go too low
|
// It can't go too low
|
||||||
if (max_cache_size < 5) max_cache_size = 128;
|
if (max_cache_size < 5) max_cache_size = 128;
|
||||||
max_cache_size *= 1024 * 1024;
|
max_cache_size *= 1024 * 1024;
|
||||||
|
@ -590,7 +591,7 @@ AudioSpectrum::AudioSpectrum(AudioProvider *_provider)
|
||||||
provider = _provider;
|
provider = _provider;
|
||||||
|
|
||||||
// Determine the quality of the spectrum rendering based on an index
|
// Determine the quality of the spectrum rendering based on an index
|
||||||
int quality_index = Options.AsInt(_T("Audio Spectrum Quality"));
|
int quality_index = OPT_GET("Audio/Renderer/Spectrum/Quality")->GetInt();
|
||||||
if (quality_index < 0) quality_index = 0;
|
if (quality_index < 0) quality_index = 0;
|
||||||
if (quality_index > 5) quality_index = 5; // no need to go freaking insane
|
if (quality_index > 5) quality_index = 5; // no need to go freaking insane
|
||||||
|
|
||||||
|
@ -655,7 +656,7 @@ AudioSpectrum::AudioSpectrum(AudioProvider *_provider)
|
||||||
cache = new AudioSpectrumCacheManager(provider, line_length, num_lines, fft_overlaps);
|
cache = new AudioSpectrumCacheManager(provider, line_length, num_lines, fft_overlaps);
|
||||||
|
|
||||||
power_scale = 1;
|
power_scale = 1;
|
||||||
minband = Options.AsInt(_T("Audio Spectrum Cutoff"));
|
minband = OPT_GET("Audio/Renderer/Spectrum/Cutoff")->GetInt();
|
||||||
maxband = line_length - minband * 2/3; // TODO: make this customisable?
|
maxband = line_length - minband * 2/3; // TODO: make this customisable?
|
||||||
|
|
||||||
// Generate colour maps
|
// Generate colour maps
|
||||||
|
|
|
@ -68,6 +68,8 @@
|
||||||
#include "ass_file.h"
|
#include "ass_file.h"
|
||||||
#include "ass_style.h"
|
#include "ass_style.h"
|
||||||
#include "auto4_base.h"
|
#include "auto4_base.h"
|
||||||
|
#include "compat.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "standard_paths.h"
|
#include "standard_paths.h"
|
||||||
#include "string_codec.h"
|
#include "string_codec.h"
|
||||||
|
@ -491,7 +493,7 @@ namespace Automation4 {
|
||||||
Center();
|
Center();
|
||||||
|
|
||||||
// Init trace level
|
// Init trace level
|
||||||
trace_level = Options.AsInt(_T("Automation Trace Level"));
|
trace_level = OPT_GET("Automation/Trace Level")->GetInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -678,7 +680,7 @@ namespace Automation4 {
|
||||||
// copied from auto3
|
// copied from auto3
|
||||||
include_path.clear();
|
include_path.clear();
|
||||||
include_path.EnsureFileAccessible(filename);
|
include_path.EnsureFileAccessible(filename);
|
||||||
wxStringTokenizer toker(Options.AsText(_T("Automation Include Path")), _T("|"), wxTOKEN_STRTOK);
|
wxStringTokenizer toker(lagi_wxString(OPT_GET("Path/Automation/Include")->GetString()), _T("|"), wxTOKEN_STRTOK);
|
||||||
while (toker.HasMoreTokens()) {
|
while (toker.HasMoreTokens()) {
|
||||||
// todo? make some error reporting here
|
// todo? make some error reporting here
|
||||||
wxFileName path(StandardPaths::DecodePath(toker.GetNextToken()));
|
wxFileName path(StandardPaths::DecodePath(toker.GetNextToken()));
|
||||||
|
|
|
@ -58,6 +58,7 @@
|
||||||
#include "auto4_lua.h"
|
#include "auto4_lua.h"
|
||||||
#include "auto4_lua_factory.h"
|
#include "auto4_lua_factory.h"
|
||||||
#include "auto4_lua_scriptreader.h"
|
#include "auto4_lua_scriptreader.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "standard_paths.h"
|
#include "standard_paths.h"
|
||||||
#include "text_file_reader.h"
|
#include "text_file_reader.h"
|
||||||
|
@ -196,7 +197,7 @@ namespace Automation4 {
|
||||||
lua_pushstring(L, "path");
|
lua_pushstring(L, "path");
|
||||||
lua_gettable(L, -3);
|
lua_gettable(L, -3);
|
||||||
|
|
||||||
wxStringTokenizer toker(Options.AsText(_T("Automation Include Path")), _T("|"), wxTOKEN_STRTOK);
|
wxStringTokenizer toker(lagi_wxString(OPT_GET("Path/Automation/Include")->GetString()), _T("|"), wxTOKEN_STRTOK);
|
||||||
while (toker.HasMoreTokens()) {
|
while (toker.HasMoreTokens()) {
|
||||||
wxFileName path(StandardPaths::DecodePath(toker.GetNextToken()));
|
wxFileName path(StandardPaths::DecodePath(toker.GetNextToken()));
|
||||||
if (path.IsOk() && !path.IsRelative() && path.DirExists()) {
|
if (path.IsOk() && !path.IsRelative() && path.DirExists()) {
|
||||||
|
@ -563,7 +564,7 @@ namespace Automation4 {
|
||||||
, nargs(_nargs)
|
, nargs(_nargs)
|
||||||
, nresults(_nresults)
|
, nresults(_nresults)
|
||||||
{
|
{
|
||||||
int prio = Options.AsInt(_T("Automation Thread Priority"));
|
int prio = OPT_GET("Automation/Lua/Thread Priority")->GetInt();
|
||||||
if (prio == 0) prio = 50; // normal
|
if (prio == 0) prio = 50; // normal
|
||||||
else if (prio == 1) prio = 30; // below normal
|
else if (prio == 1) prio = 30; // below normal
|
||||||
else if (prio == 2) prio = 10; // lowest
|
else if (prio == 2) prio = 10; // lowest
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
#include <wx/thread.h>
|
#include <wx/thread.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "compat.h"
|
||||||
#include "auto4_base.h"
|
#include "auto4_base.h"
|
||||||
|
|
||||||
#ifdef __WINDOWS__
|
#ifdef __WINDOWS__
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
|
|
||||||
#ifdef WITH_AVISYNTH
|
#ifdef WITH_AVISYNTH
|
||||||
#include "avisynth_wrap.h"
|
#include "avisynth_wrap.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
|
||||||
#ifdef DEBUG_AVISYNTH_CODE
|
#ifdef DEBUG_AVISYNTH_CODE
|
||||||
|
@ -101,7 +102,7 @@ AviSynthWrapper::AviSynthWrapper() {
|
||||||
AVSTRACE(_T("Got address of CreateScriptEnv"));
|
AVSTRACE(_T("Got address of CreateScriptEnv"));
|
||||||
|
|
||||||
// Require Avisynth 2.5.6+?
|
// Require Avisynth 2.5.6+?
|
||||||
if (Options.AsBool(_T("Allow Ancient Avisynth")))
|
if (OPT_GET("Provider/Avisynth/Allow Ancient")->GetBool())
|
||||||
env = CreateScriptEnv(AVISYNTH_INTERFACE_VERSION-1);
|
env = CreateScriptEnv(AVISYNTH_INTERFACE_VERSION-1);
|
||||||
else
|
else
|
||||||
env = CreateScriptEnv(AVISYNTH_INTERFACE_VERSION);
|
env = CreateScriptEnv(AVISYNTH_INTERFACE_VERSION);
|
||||||
|
@ -112,7 +113,7 @@ AviSynthWrapper::AviSynthWrapper() {
|
||||||
}
|
}
|
||||||
AVSTRACE(_T("Created script environment"));
|
AVSTRACE(_T("Created script environment"));
|
||||||
// Set memory limit
|
// Set memory limit
|
||||||
int memoryMax = Options.AsInt(_T("Avisynth MemoryMax"));
|
const int memoryMax = OPT_GET("Provider/Avisynth/Memory Max")->GetInt();
|
||||||
if (memoryMax != 0) {
|
if (memoryMax != 0) {
|
||||||
env->SetMemoryMax(memoryMax);
|
env->SetMemoryMax(memoryMax);
|
||||||
AVSTRACE(_T("Set Avisynth memory limit"));
|
AVSTRACE(_T("Set Avisynth memory limit"));
|
||||||
|
|
|
@ -48,7 +48,9 @@
|
||||||
#include "ass_style.h"
|
#include "ass_style.h"
|
||||||
#include "audio_display.h"
|
#include "audio_display.h"
|
||||||
#include "base_grid.h"
|
#include "base_grid.h"
|
||||||
|
#include "compat.h"
|
||||||
#include "frame_main.h"
|
#include "frame_main.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "subs_edit_box.h"
|
#include "subs_edit_box.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
@ -106,10 +108,10 @@ BaseGrid::~BaseGrid() {
|
||||||
///
|
///
|
||||||
void BaseGrid::UpdateStyle() {
|
void BaseGrid::UpdateStyle() {
|
||||||
// Set font
|
// Set font
|
||||||
wxString fontname = Options.AsText(_T("Grid Font Face"));
|
wxString fontname = lagi_wxString(OPT_GET("Subtitle/Grid/Font Face")->GetString());
|
||||||
if (fontname.IsEmpty()) fontname = _T("Tahoma");
|
if (fontname.IsEmpty()) fontname = _T("Tahoma");
|
||||||
font.SetFaceName(fontname);
|
font.SetFaceName(fontname);
|
||||||
font.SetPointSize(Options.AsInt(_T("Grid font size")));
|
font.SetPointSize(OPT_GET("Subtitle/Grid/Font Size")->GetInt());
|
||||||
font.SetWeight(wxFONTWEIGHT_NORMAL);
|
font.SetWeight(wxFONTWEIGHT_NORMAL);
|
||||||
|
|
||||||
// Set line height
|
// Set line height
|
||||||
|
@ -122,7 +124,9 @@ void BaseGrid::UpdateStyle() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set column widths
|
// Set column widths
|
||||||
for (int i=0;i<10;i++) showCol[i] = Options.AsBool(_T("Grid show column ") + AegiIntegerToString(i));
|
std::vector<bool> column_array;
|
||||||
|
OPT_GET("Subtitle/Grid/Column")->GetListBool(column_array);
|
||||||
|
for (int i=0;i<10;i++) showCol[i] = column_array.at(i);
|
||||||
SetColumnWidths();
|
SetColumnWidths();
|
||||||
|
|
||||||
// Update
|
// Update
|
||||||
|
@ -418,12 +422,12 @@ void BaseGrid::DrawImage(wxDC &dc) {
|
||||||
dc.SetFont(font);
|
dc.SetFont(font);
|
||||||
|
|
||||||
// Clear background
|
// Clear background
|
||||||
dc.SetBackground(wxBrush(Options.AsColour(_T("Grid Background"))));
|
dc.SetBackground(wxBrush(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Background/Background")->GetColour())));
|
||||||
dc.Clear();
|
dc.Clear();
|
||||||
|
|
||||||
// Draw labels
|
// Draw labels
|
||||||
dc.SetPen(*wxTRANSPARENT_PEN);
|
dc.SetPen(*wxTRANSPARENT_PEN);
|
||||||
dc.SetBrush(wxBrush(Options.AsColour(_T("Grid left column"))));
|
dc.SetBrush(wxBrush(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Left Column")->GetColour())));
|
||||||
dc.DrawRectangle(0,lineHeight,colWidth[0],h-lineHeight);
|
dc.DrawRectangle(0,lineHeight,colWidth[0],h-lineHeight);
|
||||||
|
|
||||||
// Visible lines
|
// Visible lines
|
||||||
|
@ -434,23 +438,23 @@ void BaseGrid::DrawImage(wxDC &dc) {
|
||||||
// Row colors
|
// Row colors
|
||||||
std::vector<wxBrush> rowColors;
|
std::vector<wxBrush> rowColors;
|
||||||
std::vector<wxColor> foreColors;
|
std::vector<wxColor> foreColors;
|
||||||
rowColors.push_back(wxBrush(Options.AsColour(_T("Grid Background")))); // 0 = Standard
|
rowColors.push_back(wxBrush(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Background/Background")->GetColour()))); // 0 = Standard
|
||||||
foreColors.push_back(Options.AsColour(_T("Grid standard foreground")));
|
foreColors.push_back(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Standard")->GetColour()));
|
||||||
rowColors.push_back(wxBrush(Options.AsColour(_T("Grid Header")))); // 1 = Header
|
rowColors.push_back(wxBrush(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Header")->GetColour()))); // 1 = Header
|
||||||
foreColors.push_back(Options.AsColour(_T("Grid standard foreground")));
|
foreColors.push_back(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Standard")->GetColour()));
|
||||||
rowColors.push_back(wxBrush(Options.AsColour(_T("Grid selection background")))); // 2 = Selected
|
rowColors.push_back(wxBrush(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Background/Selection")->GetColour()))); // 2 = Selected
|
||||||
foreColors.push_back(Options.AsColour(_T("Grid selection foreground")));
|
foreColors.push_back(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Selection")->GetColour()));
|
||||||
rowColors.push_back(wxBrush(Options.AsColour(_T("Grid comment background")))); // 3 = Commented
|
rowColors.push_back(wxBrush(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Background/Comment")->GetColour()))); // 3 = Commented
|
||||||
foreColors.push_back(Options.AsColour(_T("Grid selection foreground")));
|
foreColors.push_back(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Selection")->GetColour()));
|
||||||
rowColors.push_back(wxBrush(Options.AsColour(_T("Grid inframe background")))); // 4 = Video Highlighted
|
rowColors.push_back(wxBrush(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Background/Inframe")->GetColour()))); // 4 = Video Highlighted
|
||||||
foreColors.push_back(Options.AsColour(_T("Grid selection foreground")));
|
foreColors.push_back(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Selection")->GetColour()));
|
||||||
rowColors.push_back(wxBrush(Options.AsColour(_T("Grid selected comment background")))); // 5 = Commented & selected
|
rowColors.push_back(wxBrush(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Background/Selected Comment")->GetColour()))); // 5 = Commented & selected
|
||||||
foreColors.push_back(Options.AsColour(_T("Grid selection foreground")));
|
foreColors.push_back(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Selection")->GetColour()));
|
||||||
|
|
||||||
// First grid row
|
// First grid row
|
||||||
bool drawGrid = true;
|
bool drawGrid = true;
|
||||||
if (drawGrid) {
|
if (drawGrid) {
|
||||||
dc.SetPen(wxPen(Options.AsColour(_T("Grid lines"))));
|
dc.SetPen(wxPen(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Lines")->GetColour())));
|
||||||
dc.DrawLine(0,0,w,0);
|
dc.DrawLine(0,0,w,0);
|
||||||
dc.SetPen(*wxTRANSPARENT_PEN);
|
dc.SetPen(*wxTRANSPARENT_PEN);
|
||||||
}
|
}
|
||||||
|
@ -516,12 +520,12 @@ void BaseGrid::DrawImage(wxDC &dc) {
|
||||||
strings.Add(curDiag->GetMarginString(2));
|
strings.Add(curDiag->GetMarginString(2));
|
||||||
|
|
||||||
// Set text
|
// Set text
|
||||||
int mode = Options.AsInt(_T("Grid Hide Overrides"));
|
int mode = OPT_GET("Subtitle/Grid/Hide Overrides")->GetInt();
|
||||||
wxString value = _T("");
|
wxString value = _T("");
|
||||||
|
|
||||||
// Hidden overrides
|
// Hidden overrides
|
||||||
if (mode == 1 || mode == 2) {
|
if (mode == 1 || mode == 2) {
|
||||||
wxString replaceWith = Options.AsText(_T("Grid hide overrides char"));
|
wxString replaceWith = lagi_wxString(OPT_GET("Subtitle/Grid/Hide Overrides Char")->GetString());
|
||||||
int textlen = curDiag->Text.Length();
|
int textlen = curDiag->Text.Length();
|
||||||
int depth = 0;
|
int depth = 0;
|
||||||
wxChar curChar;
|
wxChar curChar;
|
||||||
|
@ -550,7 +554,7 @@ void BaseGrid::DrawImage(wxDC &dc) {
|
||||||
if (inSel && curDiag->Comment) curColor = 5;
|
if (inSel && curDiag->Comment) curColor = 5;
|
||||||
else if (inSel) curColor = 2;
|
else if (inSel) curColor = 2;
|
||||||
else if (curDiag->Comment) curColor = 3;
|
else if (curDiag->Comment) curColor = 3;
|
||||||
else if (Options.AsBool(_T("Highlight subs in frame")) && IsDisplayed(curDiag)) curColor = 4;
|
else if (OPT_GET("Subtitle/Grid/Highlight Subtitles in Frame")->GetBool() && IsDisplayed(curDiag)) curColor = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
|
@ -564,7 +568,7 @@ void BaseGrid::DrawImage(wxDC &dc) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set text color
|
// Set text color
|
||||||
if (collides) dc.SetTextForeground(Options.AsColour(_T("Grid collision foreground")));
|
if (collides) dc.SetTextForeground(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Collision")->GetColour()));
|
||||||
else {
|
else {
|
||||||
dc.SetTextForeground(foreColors[curColor]);
|
dc.SetTextForeground(foreColors[curColor]);
|
||||||
}
|
}
|
||||||
|
@ -595,7 +599,7 @@ void BaseGrid::DrawImage(wxDC &dc) {
|
||||||
// Draw grid
|
// Draw grid
|
||||||
dc.DestroyClippingRegion();
|
dc.DestroyClippingRegion();
|
||||||
if (drawGrid) {
|
if (drawGrid) {
|
||||||
dc.SetPen(wxPen(Options.AsColour(_T("Grid lines"))));
|
dc.SetPen(wxPen(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Lines")->GetColour())));
|
||||||
dc.DrawLine(0,dy+lineHeight,w,dy+lineHeight);
|
dc.DrawLine(0,dy+lineHeight,w,dy+lineHeight);
|
||||||
dc.SetPen(*wxTRANSPARENT_PEN);
|
dc.SetPen(*wxTRANSPARENT_PEN);
|
||||||
}
|
}
|
||||||
|
@ -604,7 +608,7 @@ void BaseGrid::DrawImage(wxDC &dc) {
|
||||||
// Draw grid columns
|
// Draw grid columns
|
||||||
dx = 0;
|
dx = 0;
|
||||||
if (drawGrid) {
|
if (drawGrid) {
|
||||||
dc.SetPen(wxPen(Options.AsColour(_T("Grid lines"))));
|
dc.SetPen(wxPen(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Lines")->GetColour())));
|
||||||
for (int i=0;i<10;i++) {
|
for (int i=0;i<10;i++) {
|
||||||
dx += colWidth[i];
|
dx += colWidth[i];
|
||||||
dc.DrawLine(dx,0,dx,maxH);
|
dc.DrawLine(dx,0,dx,maxH);
|
||||||
|
@ -614,7 +618,7 @@ void BaseGrid::DrawImage(wxDC &dc) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw currently active line border
|
// Draw currently active line border
|
||||||
dc.SetPen(wxPen(Options.AsColour(_T("Grid Active border"))));
|
dc.SetPen(wxPen(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Active Border")->GetColour())));
|
||||||
dc.SetBrush(*wxTRANSPARENT_BRUSH);
|
dc.SetBrush(*wxTRANSPARENT_BRUSH);
|
||||||
dy = (editBox->linen+1-yPos) * lineHeight;
|
dy = (editBox->linen+1-yPos) * lineHeight;
|
||||||
dc.DrawRectangle(0,dy,w,lineHeight+1);
|
dc.DrawRectangle(0,dy,w,lineHeight+1);
|
||||||
|
@ -677,7 +681,7 @@ void BaseGrid::OnMouseEvent(wxMouseEvent &event) {
|
||||||
|
|
||||||
// Get focus
|
// Get focus
|
||||||
if (event.ButtonDown()) {
|
if (event.ButtonDown()) {
|
||||||
if (Options.AsBool(_T("Grid Allow Focus"))) {
|
if (OPT_GET("Subtitle/Grid/Focus Allow")->GetBool()) {
|
||||||
SetFocus();
|
SetFocus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
14
aegisub/src/compat.cpp
Normal file
14
aegisub/src/compat.cpp
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#include "compat.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
wxArrayString lagi_MRU_wxAS(const wxString &list) {
|
||||||
|
wxArrayString work;
|
||||||
|
|
||||||
|
const agi::MRUManager::MRUListMap *map_list = AegisubApp::Get()->mru->Get(STD_STR(list));
|
||||||
|
|
||||||
|
for (agi::MRUManager::MRUListMap::const_iterator i_lst = map_list->begin(); i_lst != map_list->end(); ++i_lst) {
|
||||||
|
work.Add(wxString(i_lst->second));
|
||||||
|
}
|
||||||
|
|
||||||
|
return work;
|
||||||
|
}
|
15
aegisub/src/compat.h
Normal file
15
aegisub/src/compat.h
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#ifndef AGI_PRE
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <wx/colour.h>
|
||||||
|
#include <wx/arrstr.h>
|
||||||
|
#include <wx/string.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <libaegisub/colour.h>
|
||||||
|
|
||||||
|
#define STD_STR(x) std::string(x.mb_str())
|
||||||
|
|
||||||
|
inline wxColour lagi_wxColour(const agi::Colour &colour) { return wxColour(colour); }
|
||||||
|
inline wxString lagi_wxString(const std::string &str) { return wxString(str); }
|
||||||
|
wxArrayString lagi_MRU_wxAS(const wxString &list);
|
|
@ -50,9 +50,11 @@
|
||||||
|
|
||||||
#include "ass_attachment.h"
|
#include "ass_attachment.h"
|
||||||
#include "ass_file.h"
|
#include "ass_file.h"
|
||||||
|
#include "compat.h"
|
||||||
#include "dialog_attachments.h"
|
#include "dialog_attachments.h"
|
||||||
#include "help_button.h"
|
#include "help_button.h"
|
||||||
#include "libresrc/libresrc.h"
|
#include "libresrc/libresrc.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
@ -153,7 +155,7 @@ void DialogAttachments::OnAttachFont(wxCommandEvent &event) {
|
||||||
wxArrayString filenames;
|
wxArrayString filenames;
|
||||||
wxArrayString paths;
|
wxArrayString paths;
|
||||||
{
|
{
|
||||||
wxFileDialog diag (this,_("Choose file to be attached"), Options.AsText(_T("Fonts Collector Destination")), _T(""), _T("Font Files (*.ttf)|*.ttf"), wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE);
|
wxFileDialog diag (this,_("Choose file to be attached"), lagi_wxString(OPT_GET("Path/Fonts Collector Destination")->GetString()), _T(""), _T("Font Files (*.ttf)|*.ttf"), wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE);
|
||||||
if (diag.ShowModal() == wxID_CANCEL) return;
|
if (diag.ShowModal() == wxID_CANCEL) return;
|
||||||
diag.GetFilenames(filenames);
|
diag.GetFilenames(filenames);
|
||||||
diag.GetPaths(paths);
|
diag.GetPaths(paths);
|
||||||
|
@ -230,11 +232,11 @@ void DialogAttachments::OnExtract(wxCommandEvent &event) {
|
||||||
bool fullPath = false;
|
bool fullPath = false;
|
||||||
|
|
||||||
// Multiple or single?
|
// Multiple or single?
|
||||||
if (listView->GetNextSelected(i) != -1) path = wxDirSelector(_("Select the path to save the files to:"),Options.AsText(_T("Fonts Collector Destination"))) + _T("/");
|
if (listView->GetNextSelected(i) != -1) path = wxDirSelector(_("Select the path to save the files to:"),lagi_wxString(OPT_GET("Path/Fonts Collector Destination")->GetString())) + _T("/");
|
||||||
else {
|
else {
|
||||||
// Default path
|
// Default path
|
||||||
wxString defPath = ((AssAttachment*) wxUIntToPtr(listView->GetItemData(i)))->GetFileName();
|
wxString defPath = ((AssAttachment*) wxUIntToPtr(listView->GetItemData(i)))->GetFileName();
|
||||||
path = wxFileSelector(_("Select the path to save the file to:"),Options.AsText(_T("Fonts Collector Destination")),defPath);
|
path = wxFileSelector(_("Select the path to save the file to:"),lagi_wxString(OPT_GET("Path/Fonts Collector Destination")->GetString()),defPath);
|
||||||
fullPath = true;
|
fullPath = true;
|
||||||
}
|
}
|
||||||
if (path.IsEmpty()) return;
|
if (path.IsEmpty()) return;
|
||||||
|
|
|
@ -47,6 +47,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "auto4_base.h"
|
#include "auto4_base.h"
|
||||||
|
#include "compat.h"
|
||||||
#include "dialog_automation.h"
|
#include "dialog_automation.h"
|
||||||
#include "help_button.h"
|
#include "help_button.h"
|
||||||
#include "libresrc/libresrc.h"
|
#include "libresrc/libresrc.h"
|
||||||
|
@ -230,12 +231,12 @@ void DialogAutomation::OnAdd(wxCommandEvent &evt)
|
||||||
fnfilter = _T("All supported scripts|") + catchall + _T("|") + fnfilter;
|
fnfilter = _T("All supported scripts|") + catchall + _T("|") + fnfilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString fname = wxFileSelector(_("Add Automation script"), Options.AsText(_T("Last open automation path")), wxEmptyString, wxEmptyString, fnfilter, wxFD_OPEN|wxFD_FILE_MUST_EXIST, this);
|
wxString fname = wxFileSelector(_("Add Automation script"), lagi_wxString(OPT_GET("Path/Last/Automation")->GetString()), wxEmptyString, wxEmptyString, fnfilter, wxFD_OPEN|wxFD_FILE_MUST_EXIST, this);
|
||||||
|
|
||||||
if (!fname.IsEmpty()) {
|
if (!fname.IsEmpty()) {
|
||||||
|
|
||||||
wxFileName fnpath(fname);
|
wxFileName fnpath(fname);
|
||||||
Options.SetText(_T("Last open automation path"), fnpath.GetPath());
|
OPT_SET("Path/Last/Automation")->SetString(STD_STR(fnpath.GetPath()));
|
||||||
|
|
||||||
// TODO: make sure each script is only loaded once. check in both local and global managers!!
|
// TODO: make sure each script is only loaded once. check in both local and global managers!!
|
||||||
// it doesn't break for macros, but will for export filters, and maybe for file formats,
|
// it doesn't break for macros, but will for export filters, and maybe for file formats,
|
||||||
|
|
|
@ -56,9 +56,11 @@
|
||||||
|
|
||||||
#include "ass_style.h"
|
#include "ass_style.h"
|
||||||
#include "colorspace.h"
|
#include "colorspace.h"
|
||||||
|
#include "compat.h"
|
||||||
#include "dialog_colorpicker.h"
|
#include "dialog_colorpicker.h"
|
||||||
#include "help_button.h"
|
#include "help_button.h"
|
||||||
#include "libresrc/libresrc.h"
|
#include "libresrc/libresrc.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
@ -723,7 +725,7 @@ DialogColorPicker::DialogColorPicker(wxWindow *parent, wxColour initial_color)
|
||||||
|
|
||||||
wxSizer *recent_sizer = new wxBoxSizer(wxVERTICAL);
|
wxSizer *recent_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
recent_sizer->Add(recent_box, 1, wxEXPAND);
|
recent_sizer->Add(recent_box, 1, wxEXPAND);
|
||||||
if (Options.AsBool(_T("RGBAdjust Tool"))) recent_sizer->Add(new wxButton(this,BUTTON_RGBADJUST,_T("rgbadjust()")), 0, wxEXPAND);
|
if (OPT_GET("Tool/Colour Picker/RGBAdjust Tool")->GetBool()) recent_sizer->Add(new wxButton(this,BUTTON_RGBADJUST,_T("rgbadjust()")), 0, wxEXPAND);
|
||||||
|
|
||||||
wxSizer *picker_sizer = new wxBoxSizer(wxHORIZONTAL);
|
wxSizer *picker_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
picker_sizer->AddStretchSpacer();
|
picker_sizer->AddStretchSpacer();
|
||||||
|
@ -764,11 +766,11 @@ DialogColorPicker::DialogColorPicker(wxWindow *parent, wxColour initial_color)
|
||||||
|
|
||||||
// Fill the controls
|
// Fill the controls
|
||||||
updating_controls = false;
|
updating_controls = false;
|
||||||
int mode = Options.AsInt(_T("Color Picker Mode"));
|
int mode = OPT_GET("Tool/Colour Picker/Mode")->GetInt();
|
||||||
if (mode < 0 || mode > 4) mode = 3; // HSL default
|
if (mode < 0 || mode > 4) mode = 3; // HSL default
|
||||||
colorspace_choice->SetSelection(mode);
|
colorspace_choice->SetSelection(mode);
|
||||||
SetColor(initial_color);
|
SetColor(initial_color);
|
||||||
recent_box->LoadFromString(Options.AsText(_T("Color Picker Recent")));
|
recent_box->LoadFromString(lagi_wxString(OPT_GET("Tool/Colour Picker/Recent")->GetString()));
|
||||||
|
|
||||||
// The mouse event handler for the Dropper control must be manually assigned
|
// The mouse event handler for the Dropper control must be manually assigned
|
||||||
// The EVT_MOUSE_EVENTS macro can't take a control id
|
// The EVT_MOUSE_EVENTS macro can't take a control id
|
||||||
|
@ -821,8 +823,7 @@ void DialogColorPicker::SetColor(wxColour new_color)
|
||||||
wxColour DialogColorPicker::GetColor()
|
wxColour DialogColorPicker::GetColor()
|
||||||
{
|
{
|
||||||
recent_box->AddColor(cur_color);
|
recent_box->AddColor(cur_color);
|
||||||
Options.SetText(_T("Color Picker Recent"), recent_box->StoreToString());
|
OPT_SET("Tool/Colour Picker/Recent")->SetString(STD_STR(recent_box->StoreToString()));
|
||||||
Options.Save();
|
|
||||||
return cur_color;
|
return cur_color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1326,7 +1327,7 @@ void DialogColorPicker::OnChangeMode(wxCommandEvent &evt)
|
||||||
{
|
{
|
||||||
if (!updating_controls)
|
if (!updating_controls)
|
||||||
spectrum_dirty = true;
|
spectrum_dirty = true;
|
||||||
Options.SetInt(_T("Color Picker Mode"), colorspace_choice->GetSelection());
|
OPT_SET("Tool/Colour Picker/Mode")->SetInt(colorspace_choice->GetSelection());
|
||||||
UpdateSpectrumDisplay();
|
UpdateSpectrumDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
|
|
||||||
#include "dialog_detached_video.h"
|
#include "dialog_detached_video.h"
|
||||||
#include "frame_main.h"
|
#include "frame_main.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "video_box.h"
|
#include "video_box.h"
|
||||||
#include "video_context.h"
|
#include "video_context.h"
|
||||||
|
@ -63,10 +64,10 @@ DialogDetachedVideo::DialogDetachedVideo(FrameMain *par, const wxSize &initialDi
|
||||||
parent = par;
|
parent = par;
|
||||||
|
|
||||||
// Set up window
|
// Set up window
|
||||||
int x = Options.AsInt(_T("Detached video last x"));
|
int x = OPT_GET("Video/Detached/Last/X")->GetInt();
|
||||||
int y = Options.AsInt(_T("Detached video last y"));
|
int y = OPT_GET("Video/Detached/Last/Y")->GetInt();
|
||||||
if (x != -1 && y != -1) SetPosition(wxPoint(x,y));
|
if (x != -1 && y != -1) SetPosition(wxPoint(x,y));
|
||||||
if (Options.AsBool(_T("Detached video maximized"))) Maximize();
|
if (OPT_GET("Video/Detached/Maximized")->GetBool()) Maximize();
|
||||||
|
|
||||||
// Set obscure stuff
|
// Set obscure stuff
|
||||||
SetExtraStyle((GetExtraStyle() & ~wxWS_EX_BLOCK_EVENTS) | wxWS_EX_PROCESS_UI_UPDATES);
|
SetExtraStyle((GetExtraStyle() & ~wxWS_EX_BLOCK_EVENTS) | wxWS_EX_PROCESS_UI_UPDATES);
|
||||||
|
@ -127,10 +128,9 @@ DialogDetachedVideo::DialogDetachedVideo(FrameMain *par, const wxSize &initialDi
|
||||||
// Update
|
// Update
|
||||||
parent->SetDisplayMode(0, -1);
|
parent->SetDisplayMode(0, -1);
|
||||||
GetPosition(&x, &y);
|
GetPosition(&x, &y);
|
||||||
Options.SetInt(_T("Detached video last x"), x);
|
OPT_SET("Video/Detached/Last/X")->SetInt(x);
|
||||||
Options.SetInt(_T("Detached video last y"), y);
|
OPT_SET("Video/Detached/Last/Y")->SetInt(y);
|
||||||
Options.SetBool(_T("Detached video"),true);
|
OPT_SET("Video/Detached/Enabled")->SetBool(true);
|
||||||
Options.Save();
|
|
||||||
|
|
||||||
// Copy the main accelerator table to this dialog
|
// Copy the main accelerator table to this dialog
|
||||||
wxAcceleratorTable *table = par->GetAcceleratorTable();
|
wxAcceleratorTable *table = par->GetAcceleratorTable();
|
||||||
|
@ -139,8 +139,7 @@ DialogDetachedVideo::DialogDetachedVideo(FrameMain *par, const wxSize &initialDi
|
||||||
|
|
||||||
/// @brief Destructor
|
/// @brief Destructor
|
||||||
DialogDetachedVideo::~DialogDetachedVideo() {
|
DialogDetachedVideo::~DialogDetachedVideo() {
|
||||||
Options.SetBool(_T("Detached video maximized"),IsMaximized());
|
OPT_SET("Video/Detached/Maximized")->SetBool(IsMaximized());
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Event table
|
// Event table
|
||||||
|
@ -154,7 +153,7 @@ END_EVENT_TABLE()
|
||||||
/// @param event UNUSED
|
/// @param event UNUSED
|
||||||
void DialogDetachedVideo::OnClose(wxCloseEvent &WXUNUSED(event)) {
|
void DialogDetachedVideo::OnClose(wxCloseEvent &WXUNUSED(event)) {
|
||||||
FrameMain *par = parent;
|
FrameMain *par = parent;
|
||||||
Options.SetBool(_T("Detached video"),false);
|
OPT_SET("Video/Detached/Enabled")->SetBool(false);
|
||||||
Destroy();
|
Destroy();
|
||||||
par->detachedVideo = NULL;
|
par->detachedVideo = NULL;
|
||||||
par->SetDisplayMode(1,-1);
|
par->SetDisplayMode(1,-1);
|
||||||
|
@ -164,8 +163,8 @@ void DialogDetachedVideo::OnClose(wxCloseEvent &WXUNUSED(event)) {
|
||||||
/// @param event
|
/// @param event
|
||||||
void DialogDetachedVideo::OnMove(wxMoveEvent &event) {
|
void DialogDetachedVideo::OnMove(wxMoveEvent &event) {
|
||||||
wxPoint pos = event.GetPosition();
|
wxPoint pos = event.GetPosition();
|
||||||
Options.SetInt(_T("Detached video last x"),pos.x);
|
OPT_SET("Video/Detached/Last/X")->SetInt(pos.x);
|
||||||
Options.SetInt(_T("Detached video last y"),pos.y);
|
OPT_SET("Video/Detached/Last/Y")->SetInt(pos.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief Minimize event handler
|
/// @brief Minimize event handler
|
||||||
|
|
|
@ -44,10 +44,12 @@
|
||||||
#include <wx/statline.h>
|
#include <wx/statline.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "compat.h"
|
||||||
#include "dialog_dummy_video.h"
|
#include "dialog_dummy_video.h"
|
||||||
#include "help_button.h"
|
#include "help_button.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
/// DOCME
|
/// DOCME
|
||||||
struct ResolutionShortcut {
|
struct ResolutionShortcut {
|
||||||
|
@ -123,12 +125,12 @@ bool DialogDummyVideo::CreateDummyVideo(wxWindow *parent, wxString &out_filename
|
||||||
pattern = dlg.pattern->GetValue();
|
pattern = dlg.pattern->GetValue();
|
||||||
|
|
||||||
// Write to options
|
// Write to options
|
||||||
Options.SetFloat(_T("Video Dummy Last FPS"), fps);
|
OPT_SET("Video/Dummy/FPS")->SetDouble(fps);
|
||||||
Options.SetInt(_T("Video Dummy Last Width"), width);
|
OPT_SET("Video/Dummy/Last/Width")->SetInt(width);
|
||||||
Options.SetInt(_T("Video Dummy Last Height"), height);
|
OPT_SET("Video/Dummy/Last/Height")->SetInt(height);
|
||||||
Options.SetInt(_T("Video Dummy Last Length"), length);
|
OPT_SET("Video/Dummy/Last/Length")->SetInt(length);
|
||||||
Options.SetColour(_T("Video Dummy Last Colour"), colour);
|
OPT_SET("Colour/Video Dummy/Last Colour")->SetColour(STD_STR(colour.GetAsString(wxC2S_CSS_SYNTAX)));
|
||||||
Options.SetBool(_T("Video Dummy Pattern"), pattern);
|
OPT_SET("Video/Dummy/Pattern")->SetBool(pattern);
|
||||||
|
|
||||||
out_filename = DummyVideoProvider::MakeFilename(fps, length, width, height, colour, pattern);
|
out_filename = DummyVideoProvider::MakeFilename(fps, length, width, height, colour, pattern);
|
||||||
return true;
|
return true;
|
||||||
|
@ -150,10 +152,10 @@ DialogDummyVideo::DialogDummyVideo(wxWindow *parent)
|
||||||
resolution_shortcuts = new wxComboBox(this, Dummy_Video_Resolution_Shortcut, _T(""), wxDefaultPosition, wxDefaultSize, 0, 0, wxCB_READONLY);
|
resolution_shortcuts = new wxComboBox(this, Dummy_Video_Resolution_Shortcut, _T(""), wxDefaultPosition, wxDefaultSize, 0, 0, wxCB_READONLY);
|
||||||
width = new wxTextCtrl(this, -1);
|
width = new wxTextCtrl(this, -1);
|
||||||
height = new wxTextCtrl(this, -1);
|
height = new wxTextCtrl(this, -1);
|
||||||
colour = new ColourButton(this, -1, wxSize(30, 17), Options.AsColour(_T("Video Dummy Last Colour")));
|
colour = new ColourButton(this, -1, wxSize(30, 17), lagi_wxColour(OPT_GET("Colour/Video Dummy/Last Colour")->GetColour()));
|
||||||
pattern = new wxCheckBox(this, -1, _("Checkerboard pattern"));
|
pattern = new wxCheckBox(this, -1, _("Checkerboard pattern"));
|
||||||
//fps = new wxComboBox(this, Dummy_Video_FPS, Options.AsText(_T("Video Dummy Last FPS")), wxDefaultPosition, wxDefaultSize, 0, 0, wxCB_DROPDOWN);
|
//fps = new wxComboBox(this, Dummy_Video_FPS, Options.AsText(_T("Video Dummy Last FPS")), wxDefaultPosition, wxDefaultSize, 0, 0, wxCB_DROPDOWN);
|
||||||
fps = new wxTextCtrl(this, Dummy_Video_FPS, Options.AsText(_T("Video Dummy Last FPS")));
|
fps = new wxTextCtrl(this, Dummy_Video_FPS, wxString::Format("%f", OPT_GET("Video/Dummy/FPS")->GetDouble()));
|
||||||
length = new wxSpinCtrl(this, Dummy_Video_Length);
|
length = new wxSpinCtrl(this, Dummy_Video_Length);
|
||||||
length_display = new wxStaticText(this, -1, _T(""));
|
length_display = new wxStaticText(this, -1, _T(""));
|
||||||
|
|
||||||
|
@ -195,24 +197,24 @@ DialogDummyVideo::DialogDummyVideo(wxWindow *parent)
|
||||||
|
|
||||||
// Initialise controls
|
// Initialise controls
|
||||||
int lastwidth, lastheight, lastres = 0;
|
int lastwidth, lastheight, lastres = 0;
|
||||||
lastwidth = Options.AsInt(_T("Video Dummy Last Width"));
|
lastwidth = OPT_GET("Video/Dummy/Last/Width")->GetInt();
|
||||||
lastheight = Options.AsInt(_T("Video Dummy Last Height"));
|
lastheight = OPT_GET("Video/Dummy/Last/Height")->GetInt();
|
||||||
for (ResolutionShortcut *res = resolutions; res->name; ++res) {
|
for (ResolutionShortcut *res = resolutions; res->name; ++res) {
|
||||||
resolution_shortcuts->Append(res->name);
|
resolution_shortcuts->Append(res->name);
|
||||||
if (res->width == lastwidth && res->height == lastheight)
|
if (res->width == lastwidth && res->height == lastheight)
|
||||||
resolution_shortcuts->SetSelection(lastres);
|
resolution_shortcuts->SetSelection(lastres);
|
||||||
lastres++;
|
lastres++;
|
||||||
}
|
}
|
||||||
pattern->SetValue(Options.AsBool(_T("Video Dummy Pattern")));
|
pattern->SetValue(OPT_GET("Video/Dummy/Pattern")->GetBool());
|
||||||
/*fps->Append(_T("23.976"));
|
/*fps->Append(_T("23.976"));
|
||||||
fps->Append(_T("29.97"));
|
fps->Append(_T("29.97"));
|
||||||
fps->Append(_T("24"));
|
fps->Append(_T("24"));
|
||||||
fps->Append(_T("25"));
|
fps->Append(_T("25"));
|
||||||
fps->Append(_T("30"));*/
|
fps->Append(_T("30"));*/
|
||||||
width->ChangeValue(Options.AsText(_T("Video Dummy Last Width")));
|
width->ChangeValue(AegiIntegerToString(OPT_GET("Video/Dummy/Last/Width")->GetInt()));
|
||||||
height->ChangeValue(Options.AsText(_T("Video Dummy Last Height")));
|
height->ChangeValue(AegiIntegerToString(OPT_GET("Video/Dummy/Last/Height")->GetInt()));
|
||||||
length->SetRange(0, 0x10000000);
|
length->SetRange(0, 0x10000000);
|
||||||
length->SetValue(Options.AsInt(_T("Video Dummy Last Length")));
|
length->SetValue(OPT_GET("Video/Dummy/Last/Length")->GetInt());
|
||||||
UpdateLengthDisplay();
|
UpdateLengthDisplay();
|
||||||
|
|
||||||
// Layout
|
// Layout
|
||||||
|
|
|
@ -51,11 +51,13 @@
|
||||||
#include "ass_file.h"
|
#include "ass_file.h"
|
||||||
#include "ass_override.h"
|
#include "ass_override.h"
|
||||||
#include "ass_style.h"
|
#include "ass_style.h"
|
||||||
|
#include "compat.h"
|
||||||
#include "dialog_fonts_collector.h"
|
#include "dialog_fonts_collector.h"
|
||||||
#include "font_file_lister.h"
|
#include "font_file_lister.h"
|
||||||
#include "frame_main.h"
|
#include "frame_main.h"
|
||||||
#include "help_button.h"
|
#include "help_button.h"
|
||||||
#include "libresrc/libresrc.h"
|
#include "libresrc/libresrc.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "scintilla_text_ctrl.h"
|
#include "scintilla_text_ctrl.h"
|
||||||
#include "subs_grid.h"
|
#include "subs_grid.h"
|
||||||
|
@ -96,7 +98,7 @@ DialogFontsCollector::DialogFontsCollector(wxWindow *parent)
|
||||||
main = (FrameMain*) parent;
|
main = (FrameMain*) parent;
|
||||||
|
|
||||||
// Destination box
|
// Destination box
|
||||||
wxString dest = Options.AsText(_T("Fonts Collector Destination"));
|
wxString dest = lagi_wxString(OPT_GET("Path/Fonts Collector Destination")->GetString());
|
||||||
if (dest == _T("?script")) {
|
if (dest == _T("?script")) {
|
||||||
wxFileName filename(AssFile::top->filename);
|
wxFileName filename(AssFile::top->filename);
|
||||||
dest = filename.GetPath();
|
dest = filename.GetPath();
|
||||||
|
@ -122,7 +124,7 @@ DialogFontsCollector::DialogFontsCollector(wxWindow *parent)
|
||||||
choices.Add(_("DEBUG: Verify all fonts in system"));
|
choices.Add(_("DEBUG: Verify all fonts in system"));
|
||||||
#endif
|
#endif
|
||||||
CollectAction = new wxRadioBox(this,RADIO_BOX,_T("Action"),wxDefaultPosition,wxDefaultSize,choices,1);
|
CollectAction = new wxRadioBox(this,RADIO_BOX,_T("Action"),wxDefaultPosition,wxDefaultSize,choices,1);
|
||||||
size_t lastAction = Options.AsInt(_T("Fonts Collector Action"));
|
size_t lastAction = OPT_GET("Tool/Fonts Collector/Action")->GetInt();
|
||||||
if (lastAction >= choices.GetCount()) lastAction = 0;
|
if (lastAction >= choices.GetCount()) lastAction = 0;
|
||||||
CollectAction->SetSelection(lastAction);
|
CollectAction->SetSelection(lastAction);
|
||||||
|
|
||||||
|
@ -241,10 +243,9 @@ void DialogFontsCollector::OnStart(wxCommandEvent &event) {
|
||||||
if (filename.GetPath() == dest) {
|
if (filename.GetPath() == dest) {
|
||||||
dest = _T("?script");
|
dest = _T("?script");
|
||||||
}
|
}
|
||||||
Options.SetText(_T("Fonts Collector Destination"),dest);
|
OPT_SET("Path/Fonts Collector Destination")->SetString(STD_STR(dest));
|
||||||
}
|
}
|
||||||
Options.SetInt(_T("Fonts Collector Action"),action);
|
OPT_SET("Tool/Fonts Collector/Action")->SetInt(action);
|
||||||
Options.Save();
|
|
||||||
|
|
||||||
// Set buttons
|
// Set buttons
|
||||||
StartButton->Enable(false);
|
StartButton->Enable(false);
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
#include "dialog_kara_timing_copy.h"
|
#include "dialog_kara_timing_copy.h"
|
||||||
#include "help_button.h"
|
#include "help_button.h"
|
||||||
#include "libresrc/libresrc.h"
|
#include "libresrc/libresrc.h"
|
||||||
|
#include "main.h"
|
||||||
#include "subs_grid.h"
|
#include "subs_grid.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "validators.h"
|
#include "validators.h"
|
||||||
|
@ -852,7 +853,7 @@ DialogKanjiTimer::DialogKanjiTimer(wxWindow *parent, SubtitlesGrid *_grid)
|
||||||
|
|
||||||
//Checkbox
|
//Checkbox
|
||||||
Interpolate = new wxCheckBox(this,-1,_("Attempt to interpolate kanji."),wxDefaultPosition,wxDefaultSize,wxALIGN_LEFT);
|
Interpolate = new wxCheckBox(this,-1,_("Attempt to interpolate kanji."),wxDefaultPosition,wxDefaultSize,wxALIGN_LEFT);
|
||||||
Interpolate->SetValue(Options.AsBool(_T("kanji timer interpolation")));
|
Interpolate->SetValue(OPT_GET("Tool/Kanji Timer/Interpolation")->GetBool());
|
||||||
|
|
||||||
SourceStyle=new wxComboBox(this,-1,_T(""),wxDefaultPosition,wxSize(160,-1),
|
SourceStyle=new wxComboBox(this,-1,_T(""),wxDefaultPosition,wxSize(160,-1),
|
||||||
subs->GetStyles(),wxCB_READONLY,wxDefaultValidator,_("Source Style"));
|
subs->GetStyles(),wxCB_READONLY,wxDefaultValidator,_("Source Style"));
|
||||||
|
@ -934,8 +935,7 @@ END_EVENT_TABLE()
|
||||||
/// @param event
|
/// @param event
|
||||||
///
|
///
|
||||||
void DialogKanjiTimer::OnClose(wxCommandEvent &event) {
|
void DialogKanjiTimer::OnClose(wxCommandEvent &event) {
|
||||||
Options.SetBool(_T("kanji timer interpolation"),Interpolate->IsChecked());
|
OPT_SET("Tool/Kanji Timer/Interpolation")->SetBool(Interpolate->IsChecked());
|
||||||
Options.Save();
|
|
||||||
bool modified = !LinesToChange.empty();
|
bool modified = !LinesToChange.empty();
|
||||||
|
|
||||||
while(LinesToChange.empty()==false) {
|
while(LinesToChange.empty()==false) {
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,186 +0,0 @@
|
||||||
// Copyright (c) 2006, Rodrigo Braz Monteiro
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright notice,
|
|
||||||
// this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
// this list of conditions and the following disclaimer in the documentation
|
|
||||||
// and/or other materials provided with the distribution.
|
|
||||||
// * Neither the name of the Aegisub Group nor the names of its contributors
|
|
||||||
// may be used to endorse or promote products derived from this software
|
|
||||||
// without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
// Aegisub Project http://www.aegisub.org/
|
|
||||||
//
|
|
||||||
// $Id$
|
|
||||||
|
|
||||||
/// @file dialog_options.h
|
|
||||||
/// @see dialog_options.cpp
|
|
||||||
/// @ingroup configuration_ui
|
|
||||||
///
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////////////
|
|
||||||
// Includes
|
|
||||||
#ifndef AGI_PRE
|
|
||||||
#include <map>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include <wx/dialog.h>
|
|
||||||
#include <wx/listctrl.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "hotkeys.h"
|
|
||||||
#include "options.h"
|
|
||||||
|
|
||||||
|
|
||||||
//////////////
|
|
||||||
// Prototypes
|
|
||||||
class FrameMain;
|
|
||||||
class DialogInputHotkey;
|
|
||||||
#if wxUSE_TREEBOOK
|
|
||||||
class wxTreebook;
|
|
||||||
#else
|
|
||||||
#include <wx/choicebk.h>
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
typedef wxChoicebook wxTreebook;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
/// @class OptionsBind
|
|
||||||
/// @brief DOCME
|
|
||||||
///
|
|
||||||
/// DOCME
|
|
||||||
class OptionsBind {
|
|
||||||
public:
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
wxControl *ctrl;
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
wxString option;
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
int param;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
enum TextType {
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
TEXT_TYPE_PLAIN,
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
TEXT_TYPE_NUMBER,
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
TEXT_TYPE_FILE,
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
TEXT_TYPE_FOLDER,
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
TEXT_TYPE_FONT
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
/// @class DialogOptions
|
|
||||||
/// @brief DOCME
|
|
||||||
///
|
|
||||||
/// DOCME
|
|
||||||
class DialogOptions: public wxDialog {
|
|
||||||
private:
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
bool needsRestart;
|
|
||||||
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
wxTreebook *book;
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
std::vector<OptionsBind> binds;
|
|
||||||
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
std::map<wxString,HotkeyType> origKeys;
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
wxListView *Shortcuts;
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
bool hotkeysModified;
|
|
||||||
|
|
||||||
void Bind(wxControl *ctrl,wxString option,int param=0);
|
|
||||||
void WriteToOptions(bool justApply=false);
|
|
||||||
void ReadFromOptions();
|
|
||||||
|
|
||||||
void AddTextControl(wxWindow *parent,wxSizer *sizer,wxString label,wxString option,TextType type=TEXT_TYPE_PLAIN);
|
|
||||||
void AddComboControl(wxWindow *parent,wxSizer *sizer,wxString label,wxString option,wxArrayString choices,bool readOnly=true,int bindParam=0);
|
|
||||||
void AddCheckBox(wxWindow *parent,wxSizer *sizer,wxString label,wxString option);
|
|
||||||
|
|
||||||
void OnOK(wxCommandEvent &event);
|
|
||||||
void OnCancel(wxCommandEvent &event);
|
|
||||||
void OnApply(wxCommandEvent &event);
|
|
||||||
void OnDefaults(wxCommandEvent &event);
|
|
||||||
|
|
||||||
void OnEditHotkey(wxCommandEvent &event);
|
|
||||||
void OnClearHotkey(wxCommandEvent &event);
|
|
||||||
void OnDefaultHotkey(wxCommandEvent &event);
|
|
||||||
void OnDefaultAllHotkey(wxCommandEvent &event);
|
|
||||||
|
|
||||||
public:
|
|
||||||
DialogOptions(wxWindow *parent);
|
|
||||||
~DialogOptions();
|
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
/// @class DialogInputHotkey
|
|
||||||
/// @brief DOCME
|
|
||||||
///
|
|
||||||
/// DOCME
|
|
||||||
class DialogInputHotkey : public wxDialog {
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
HotkeyType *key;
|
|
||||||
|
|
||||||
/// DOCME
|
|
||||||
wxListView *shortcuts;
|
|
||||||
|
|
||||||
void OnKeyDown(wxKeyEvent &event);
|
|
||||||
|
|
||||||
public:
|
|
||||||
DialogInputHotkey(wxWindow *parent, HotkeyType *key, wxString name, wxListView *Shortcuts);
|
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
|
|
||||||
#include "dialog_paste_over.h"
|
#include "dialog_paste_over.h"
|
||||||
#include "help_button.h"
|
#include "help_button.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,7 +88,10 @@ DialogPasteOver::DialogPasteOver (wxWindow *parent)
|
||||||
ListSizer->Add(ListBox,0,wxEXPAND|wxTOP,5);
|
ListSizer->Add(ListBox,0,wxEXPAND|wxTOP,5);
|
||||||
|
|
||||||
// Load checked items
|
// Load checked items
|
||||||
for (unsigned int i=0;i<choices.Count();i++) ListBox->Check(i,Options.AsBool(wxString::Format(_T("Paste Over #%i"),i)));
|
/// @todo This assumes a static set of fields.
|
||||||
|
std::vector<bool> choice_array;
|
||||||
|
OPT_GET("Tool/Paste Lines Over/Fields")->GetListBool(choice_array);
|
||||||
|
for (unsigned int i=0;i<choices.Count();i++) ListBox->Check(i,choice_array.at(i));
|
||||||
|
|
||||||
// Top buttons
|
// Top buttons
|
||||||
wxSizer *TopButtonSizer = new wxBoxSizer(wxHORIZONTAL);
|
wxSizer *TopButtonSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
@ -138,15 +142,13 @@ END_EVENT_TABLE()
|
||||||
/// @param event
|
/// @param event
|
||||||
///
|
///
|
||||||
void DialogPasteOver::OnOK(wxCommandEvent &event) {
|
void DialogPasteOver::OnOK(wxCommandEvent &event) {
|
||||||
// Set options
|
|
||||||
options.SetCount(10);
|
|
||||||
for (int i=0;i<10;i++) {
|
|
||||||
options[i] = ListBox->IsChecked(i) ? 1 : 0;
|
|
||||||
Options.SetBool(wxString::Format(_T("Paste Over #%i"),i),options[i]==1);
|
|
||||||
}
|
|
||||||
Options.Save();
|
|
||||||
|
|
||||||
// End
|
std::vector<bool> map;
|
||||||
|
for (int i=0;i<10;i++) {
|
||||||
|
map[i] = ListBox->IsChecked(i);
|
||||||
|
}
|
||||||
|
OPT_SET("Tool/Paste Lines Over/Fields")->SetListBool(map);
|
||||||
|
|
||||||
EndModal(1);
|
EndModal(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include <wx/string.h>
|
#include <wx/string.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "compat.h"
|
||||||
#include "ass_dialogue.h"
|
#include "ass_dialogue.h"
|
||||||
#include "ass_file.h"
|
#include "ass_file.h"
|
||||||
#include "dialog_search_replace.h"
|
#include "dialog_search_replace.h"
|
||||||
|
@ -68,14 +69,14 @@ DialogSearchReplace::DialogSearchReplace (wxWindow *parent,bool _hasReplace,wxSt
|
||||||
|
|
||||||
// Find sizer
|
// Find sizer
|
||||||
wxSizer *FindSizer = new wxFlexGridSizer(2,2,5,15);
|
wxSizer *FindSizer = new wxFlexGridSizer(2,2,5,15);
|
||||||
wxArrayString FindHistory = Options.GetRecentList(_T("Recent find"));
|
wxArrayString FindHistory = lagi_MRU_wxAS("Find");
|
||||||
FindEdit = new wxComboBox(this,-1,_T(""),wxDefaultPosition,wxSize(300,-1),FindHistory,wxCB_DROPDOWN);
|
FindEdit = new wxComboBox(this,-1,_T(""),wxDefaultPosition,wxSize(300,-1),FindHistory,wxCB_DROPDOWN);
|
||||||
//if (FindHistory.Count()) FindEdit->SetStringSelection(FindHistory[0]);
|
//if (FindHistory.Count()) FindEdit->SetStringSelection(FindHistory[0]);
|
||||||
FindEdit->SetSelection(0);
|
FindEdit->SetSelection(0);
|
||||||
FindSizer->Add(new wxStaticText(this,-1,_("Find what:")),0,wxRIGHT | wxALIGN_CENTER_VERTICAL,0);
|
FindSizer->Add(new wxStaticText(this,-1,_("Find what:")),0,wxRIGHT | wxALIGN_CENTER_VERTICAL,0);
|
||||||
FindSizer->Add(FindEdit,0,wxRIGHT,0);
|
FindSizer->Add(FindEdit,0,wxRIGHT,0);
|
||||||
if (hasReplace) {
|
if (hasReplace) {
|
||||||
wxArrayString ReplaceHistory = Options.GetRecentList(_T("Recent replace"));
|
wxArrayString ReplaceHistory = lagi_MRU_wxAS("Replace");
|
||||||
ReplaceEdit = new wxComboBox(this,-1,_T(""),wxDefaultPosition,wxSize(300,-1),ReplaceHistory,wxCB_DROPDOWN);
|
ReplaceEdit = new wxComboBox(this,-1,_T(""),wxDefaultPosition,wxSize(300,-1),ReplaceHistory,wxCB_DROPDOWN);
|
||||||
FindSizer->Add(new wxStaticText(this,-1,_("Replace with:")),0,wxRIGHT | wxALIGN_CENTER_VERTICAL,0);
|
FindSizer->Add(new wxStaticText(this,-1,_("Replace with:")),0,wxRIGHT | wxALIGN_CENTER_VERTICAL,0);
|
||||||
FindSizer->Add(ReplaceEdit,0,wxRIGHT,0);
|
FindSizer->Add(ReplaceEdit,0,wxRIGHT,0);
|
||||||
|
@ -87,10 +88,10 @@ DialogSearchReplace::DialogSearchReplace (wxWindow *parent,bool _hasReplace,wxSt
|
||||||
CheckMatchCase = new wxCheckBox(this,CHECK_MATCH_CASE,_("Match case"));
|
CheckMatchCase = new wxCheckBox(this,CHECK_MATCH_CASE,_("Match case"));
|
||||||
CheckRegExp = new wxCheckBox(this,CHECK_MATCH_CASE,_("Use regular expressions"));
|
CheckRegExp = new wxCheckBox(this,CHECK_MATCH_CASE,_("Use regular expressions"));
|
||||||
CheckUpdateVideo = new wxCheckBox(this,CHECK_UPDATE_VIDEO,_("Update Video (slow)"));
|
CheckUpdateVideo = new wxCheckBox(this,CHECK_UPDATE_VIDEO,_("Update Video (slow)"));
|
||||||
CheckMatchCase->SetValue(Options.AsBool(_T("Find Match Case")));
|
CheckMatchCase->SetValue(OPT_GET("Tool/Search Replace/Match Case")->GetBool());
|
||||||
CheckRegExp->SetValue(Options.AsBool(_T("Find RegExp")));
|
CheckRegExp->SetValue(OPT_GET("Tool/Search Replace/RegExp")->GetBool());
|
||||||
//CheckRegExp->Enable(false);
|
//CheckRegExp->Enable(false);
|
||||||
CheckUpdateVideo->SetValue(Options.AsBool(_T("Find Update Video")));
|
CheckUpdateVideo->SetValue(OPT_GET("Tool/Search Replace/Video Update")->GetBool());
|
||||||
// CheckUpdateVideo->Enable(Search.grid->video->loaded);
|
// CheckUpdateVideo->Enable(Search.grid->video->loaded);
|
||||||
OptionsSizer->Add(CheckMatchCase,0,wxBOTTOM,5);
|
OptionsSizer->Add(CheckMatchCase,0,wxBOTTOM,5);
|
||||||
OptionsSizer->Add(CheckRegExp,0,wxBOTTOM,5);
|
OptionsSizer->Add(CheckRegExp,0,wxBOTTOM,5);
|
||||||
|
@ -110,8 +111,8 @@ DialogSearchReplace::DialogSearchReplace (wxWindow *parent,bool _hasReplace,wxSt
|
||||||
wxSizer *LimitSizer = new wxBoxSizer(wxHORIZONTAL);
|
wxSizer *LimitSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
LimitSizer->Add(Field,1,wxEXPAND | wxRIGHT,5);
|
LimitSizer->Add(Field,1,wxEXPAND | wxRIGHT,5);
|
||||||
LimitSizer->Add(Affect,0,wxEXPAND | wxRIGHT,0);
|
LimitSizer->Add(Affect,0,wxEXPAND | wxRIGHT,0);
|
||||||
Field->SetSelection(Options.AsInt(_T("Find Field")));
|
Field->SetSelection(OPT_GET("Tool/Search Replace/Field")->GetInt());
|
||||||
Affect->SetSelection(Options.AsInt(_T("Find Affect")));
|
Affect->SetSelection(OPT_GET("Tool/Search Replace/Affect")->GetInt());
|
||||||
|
|
||||||
// Left sizer
|
// Left sizer
|
||||||
wxSizer *LeftSizer = new wxBoxSizer(wxVERTICAL);
|
wxSizer *LeftSizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
@ -160,12 +161,11 @@ void DialogSearchReplace::UpdateSettings() {
|
||||||
Search.isReg = CheckRegExp->IsChecked() && CheckRegExp->IsEnabled();
|
Search.isReg = CheckRegExp->IsChecked() && CheckRegExp->IsEnabled();
|
||||||
Search.matchCase = CheckMatchCase->IsChecked();
|
Search.matchCase = CheckMatchCase->IsChecked();
|
||||||
Search.updateVideo = CheckUpdateVideo->IsChecked() && CheckUpdateVideo->IsEnabled();
|
Search.updateVideo = CheckUpdateVideo->IsChecked() && CheckUpdateVideo->IsEnabled();
|
||||||
Options.SetBool(_T("Find Match Case"),CheckMatchCase->IsChecked());
|
OPT_SET("Tool/Search Replace/Match Case")->SetBool(CheckMatchCase->IsChecked());
|
||||||
Options.SetBool(_T("Find RegExp"),CheckRegExp->IsChecked());
|
OPT_SET("Tool/Search Replace/RegExp")->SetBool(CheckRegExp->IsChecked());
|
||||||
Options.SetBool(_T("Find Update Video"),CheckUpdateVideo->IsChecked());
|
OPT_SET("Tool/Search Replace/Video Update")->SetBool(CheckUpdateVideo->IsChecked());
|
||||||
Options.SetInt(_T("Find Field"),Field->GetSelection());
|
OPT_SET("Tool/Search Replace/Field")->SetInt(Field->GetSelection());
|
||||||
Options.SetInt(_T("Find Affect"),Affect->GetSelection());
|
OPT_SET("Tool/Search Replace/Affect")->SetInt(Affect->GetSelection());
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -234,7 +234,7 @@ void DialogSearchReplace::FindReplace(int mode) {
|
||||||
if (hasReplace) {
|
if (hasReplace) {
|
||||||
wxString ReplaceWith = ReplaceEdit->GetValue();
|
wxString ReplaceWith = ReplaceEdit->GetValue();
|
||||||
Search.ReplaceWith = ReplaceWith;
|
Search.ReplaceWith = ReplaceWith;
|
||||||
Options.AddToRecentList(ReplaceWith,_T("Recent replace"));
|
AegisubApp::Get()->mru->Add("Replace", STD_STR(ReplaceWith));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,11 +244,11 @@ void DialogSearchReplace::FindReplace(int mode) {
|
||||||
Search.ReplaceWith = ReplaceWith;
|
Search.ReplaceWith = ReplaceWith;
|
||||||
if (mode == 1) Search.ReplaceNext();
|
if (mode == 1) Search.ReplaceNext();
|
||||||
else Search.ReplaceAll();
|
else Search.ReplaceAll();
|
||||||
Options.AddToRecentList(ReplaceWith,_T("Recent replace"));
|
AegisubApp::Get()->mru->Add("Replace", STD_STR(ReplaceWith));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add to history
|
// Add to history
|
||||||
Options.AddToRecentList(LookFor,_T("Recent find"));
|
AegisubApp::Get()->mru->Add("Find", STD_STR(LookFor));
|
||||||
UpdateDropDowns();
|
UpdateDropDowns();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,7 +287,7 @@ void DialogSearchReplace::UpdateDropDowns() {
|
||||||
// Find
|
// Find
|
||||||
FindEdit->Freeze();
|
FindEdit->Freeze();
|
||||||
FindEdit->Clear();
|
FindEdit->Clear();
|
||||||
FindEdit->Append(Options.GetRecentList(_T("Recent find")));
|
FindEdit->Append(lagi_MRU_wxAS("Find"));
|
||||||
FindEdit->SetSelection(0);
|
FindEdit->SetSelection(0);
|
||||||
FindEdit->Thaw();
|
FindEdit->Thaw();
|
||||||
|
|
||||||
|
@ -295,7 +295,7 @@ void DialogSearchReplace::UpdateDropDowns() {
|
||||||
if (hasReplace) {
|
if (hasReplace) {
|
||||||
ReplaceEdit->Freeze();
|
ReplaceEdit->Freeze();
|
||||||
ReplaceEdit->Clear();
|
ReplaceEdit->Clear();
|
||||||
ReplaceEdit->Append(Options.GetRecentList(_T("Recent replace")));
|
ReplaceEdit->Append(lagi_MRU_wxAS("Replace"));
|
||||||
ReplaceEdit->SetSelection(0);
|
ReplaceEdit->SetSelection(0);
|
||||||
ReplaceEdit->Thaw();
|
ReplaceEdit->Thaw();
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,8 +45,10 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "ass_dialogue.h"
|
#include "ass_dialogue.h"
|
||||||
|
#include "compat.h"
|
||||||
#include "dialog_selection.h"
|
#include "dialog_selection.h"
|
||||||
#include "help_button.h"
|
#include "help_button.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "subs_grid.h"
|
#include "subs_grid.h"
|
||||||
#include "subs_edit_box.h"
|
#include "subs_edit_box.h"
|
||||||
|
@ -70,7 +72,7 @@ wxDialog (parent,-1,_("Select"),wxDefaultPosition,wxDefaultSize,wxCAPTION)
|
||||||
// Matches box
|
// Matches box
|
||||||
Matches = new wxRadioButton(this,-1,_("Matches"),wxDefaultPosition,wxDefaultSize,wxRB_GROUP);
|
Matches = new wxRadioButton(this,-1,_("Matches"),wxDefaultPosition,wxDefaultSize,wxRB_GROUP);
|
||||||
DoesntMatch = new wxRadioButton(this,-1,_("Doesn't Match"),wxDefaultPosition,wxDefaultSize,0);
|
DoesntMatch = new wxRadioButton(this,-1,_("Doesn't Match"),wxDefaultPosition,wxDefaultSize,0);
|
||||||
Match = new wxTextCtrl(this,-1,Options.AsText(_T("Select Text")),wxDefaultPosition,wxSize(200,-1));
|
Match = new wxTextCtrl(this,-1,lagi_wxString(OPT_GET("Tool/Select Lines/Text")->GetString()),wxDefaultPosition,wxSize(200,-1));
|
||||||
MatchCase = new wxCheckBox(this,-1,_("Match case"));
|
MatchCase = new wxCheckBox(this,-1,_("Match case"));
|
||||||
Exact = new wxRadioButton(this,-1,_("Exact match"),wxDefaultPosition,wxDefaultSize,wxRB_GROUP);
|
Exact = new wxRadioButton(this,-1,_("Exact match"),wxDefaultPosition,wxDefaultSize,wxRB_GROUP);
|
||||||
Contains = new wxRadioButton(this,-1,_("Contains"));
|
Contains = new wxRadioButton(this,-1,_("Contains"));
|
||||||
|
@ -130,13 +132,13 @@ wxDialog (parent,-1,_("Select"),wxDefaultPosition,wxDefaultSize,wxCAPTION)
|
||||||
CenterOnParent();
|
CenterOnParent();
|
||||||
|
|
||||||
// Load settings
|
// Load settings
|
||||||
Field->SetSelection(Options.AsInt(_T("Select Field")));
|
Field->SetSelection(OPT_GET("Tool/Select/Field")->GetInt());
|
||||||
Action->SetSelection(Options.AsInt(_T("Select Action")));
|
Action->SetSelection(OPT_GET("Tool/Select/Action")->GetInt());
|
||||||
MatchCase->SetValue(Options.AsBool(_T("Select Match case")));
|
MatchCase->SetValue(OPT_GET("Tool/Select Lines/Match/Case")->GetBool());
|
||||||
MatchDialogues->SetValue(Options.AsBool(_T("Select Match dialogues")));
|
MatchDialogues->SetValue(OPT_GET("Tool/Select Lines/Match/Dialogue")->GetBool());
|
||||||
MatchComments->SetValue(Options.AsBool(_T("Select Match comments")));
|
MatchComments->SetValue(OPT_GET("Tool/Select Lines/Match/Comment")->GetBool());
|
||||||
int condition = Options.AsInt(_T("Select Condition"));
|
int condition = OPT_GET("Tool/Select/Condition")->GetInt();
|
||||||
int mode = Options.AsInt(_T("Select Mode"));
|
int mode = OPT_GET("Tool/Select/Mode")->GetInt();
|
||||||
if (condition == 1) DoesntMatch->SetValue(true);
|
if (condition == 1) DoesntMatch->SetValue(true);
|
||||||
if (mode == 1) Contains->SetValue(true);
|
if (mode == 1) Contains->SetValue(true);
|
||||||
else if (mode == 2) RegExp->SetValue(true);
|
else if (mode == 2) RegExp->SetValue(true);
|
||||||
|
@ -303,14 +305,14 @@ void DialogSelection::SaveSettings() {
|
||||||
else condition = 1;
|
else condition = 1;
|
||||||
|
|
||||||
// Store
|
// Store
|
||||||
Options.SetText(_T("Select Text"),Match->GetValue());
|
OPT_SET("Tool/Select Lines/Text")->SetString(STD_STR(Match->GetValue()));
|
||||||
Options.SetInt(_T("Select Condition"),condition);
|
OPT_SET("Tool/Select/Condition")->SetInt(condition);
|
||||||
Options.SetInt(_T("Select Field"),field);
|
OPT_SET("Tool/Select/Field")->SetInt(field);
|
||||||
Options.SetInt(_T("Select Action"),action);
|
OPT_SET("Tool/Select/Action")->SetInt(action);
|
||||||
Options.SetInt(_T("Select Mode"),mode);
|
OPT_SET("Tool/Select/Mode")->SetInt(mode);
|
||||||
Options.SetBool(_T("Select Match case"),MatchCase->IsChecked());
|
OPT_SET("Tool/Select Lines/Match/Case")->SetBool(MatchCase->IsChecked());
|
||||||
Options.SetBool(_T("Select Match dialogues"),MatchDialogues->IsChecked());
|
OPT_SET("Tool/Select Lines/Match/Dialogue")->SetBool(MatchDialogues->IsChecked());
|
||||||
Options.SetBool(_T("Select Match comments"),MatchComments->IsChecked());
|
OPT_SET("Tool/Select Lines/Match/Comment")->SetBool(MatchComments->IsChecked());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,7 @@
|
||||||
#include "dialog_shift_times.h"
|
#include "dialog_shift_times.h"
|
||||||
#include "help_button.h"
|
#include "help_button.h"
|
||||||
#include "libresrc/libresrc.h"
|
#include "libresrc/libresrc.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "standard_paths.h"
|
#include "standard_paths.h"
|
||||||
#include "subs_edit_box.h"
|
#include "subs_edit_box.h"
|
||||||
|
@ -154,20 +155,20 @@ DialogShiftTimes::DialogShiftTimes (wxWindow *parent,SubtitlesGrid *_grid)
|
||||||
CenterOnParent();
|
CenterOnParent();
|
||||||
|
|
||||||
// Load values from options
|
// Load values from options
|
||||||
if (!Options.AsBool(_T("Shift Times ByTime"))) {
|
if (!OPT_GET("Tools/Shift Times/ByTime")->GetBool()) {
|
||||||
if (RadioFrames->IsEnabled()) {
|
if (RadioFrames->IsEnabled()) {
|
||||||
RadioFrames->SetValue(true);
|
RadioFrames->SetValue(true);
|
||||||
ShiftFrame->Enable(true);
|
ShiftFrame->Enable(true);
|
||||||
ShiftTime->Enable(false);
|
ShiftTime->Enable(false);
|
||||||
ShiftFrame->SetValue(Options.AsText(_T("Shift Times Length")));
|
ShiftFrame->SetValue(AegiIntegerToString(OPT_GET("Tool/Shift Times/Length")->GetInt()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ShiftTime->SetTime(Options.AsInt(_T("Shift Times Length")));
|
ShiftTime->SetTime(OPT_GET("Tool/Shift Times/Length")->GetInt());
|
||||||
}
|
}
|
||||||
TimesChoice->SetSelection(Options.AsInt(_T("Shift Times Type")));
|
TimesChoice->SetSelection(OPT_GET("Tool/Shift Times/Type")->GetInt());
|
||||||
SelChoice->SetSelection(Options.AsInt(_T("Shift Times Affect")));
|
SelChoice->SetSelection(OPT_GET("Tool/Shift Times/Affect")->GetInt());
|
||||||
if (Options.AsBool(_T("Shift Times Direction"))) DirectionBackward->SetValue(true);
|
if (OPT_GET("Tools/Shift Times/Direction")->GetBool()) DirectionBackward->SetValue(true);
|
||||||
|
|
||||||
// Has selection?
|
// Has selection?
|
||||||
wxArrayInt sel = grid->GetSelection();
|
wxArrayInt sel = grid->GetSelection();
|
||||||
|
@ -304,12 +305,11 @@ void DialogShiftTimes::OnOK(wxCommandEvent &event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store modifications
|
// Store modifications
|
||||||
Options.SetBool(_T("Shift Times ByTime"),byTime);
|
OPT_SET("Tools/Shift Times/ByTime")->SetBool(byTime);
|
||||||
Options.SetInt(_T("Shift Times Type"),type);
|
OPT_SET("Tool/Shift Times/Type")->SetInt(type);
|
||||||
Options.SetInt(_T("Shift Times Length"),len);
|
OPT_SET("Tool/Shift Times/Length")->SetInt(len);
|
||||||
Options.SetInt(_T("Shift Times Affect"),affect);
|
OPT_SET("Tool/Shift Times/Affect")->SetInt(affect);
|
||||||
Options.SetBool(_T("Shift Times Direction"),backward);
|
OPT_SET("Tools/Shift Times/Direction")->SetBool(backward);
|
||||||
Options.Save();
|
|
||||||
|
|
||||||
// End dialog
|
// End dialog
|
||||||
grid->ass->FlagAsModified(_("shifting"));
|
grid->ass->FlagAsModified(_("shifting"));
|
||||||
|
|
|
@ -44,10 +44,12 @@
|
||||||
|
|
||||||
#include "ass_dialogue.h"
|
#include "ass_dialogue.h"
|
||||||
#include "ass_file.h"
|
#include "ass_file.h"
|
||||||
|
#include "compat.h"
|
||||||
#include "dialog_spellchecker.h"
|
#include "dialog_spellchecker.h"
|
||||||
#include "frame_main.h"
|
#include "frame_main.h"
|
||||||
#include "help_button.h"
|
#include "help_button.h"
|
||||||
#include "libresrc/libresrc.h"
|
#include "libresrc/libresrc.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "spellchecker_manager.h"
|
#include "spellchecker_manager.h"
|
||||||
#include "subs_edit_box.h"
|
#include "subs_edit_box.h"
|
||||||
|
@ -114,7 +116,7 @@ DialogSpellChecker::DialogSpellChecker(wxFrame *parent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get current language
|
// Get current language
|
||||||
wxString curLang = Options.AsText(_T("Spell checker language"));
|
wxString curLang = lagi_wxString(OPT_GET("Tool/Spell Checker/Language")->GetString());
|
||||||
int curLangPos = langCodes.Index(curLang);
|
int curLangPos = langCodes.Index(curLang);
|
||||||
if (curLangPos == wxNOT_FOUND) {
|
if (curLangPos == wxNOT_FOUND) {
|
||||||
curLangPos = langCodes.Index(_T("en"));
|
curLangPos = langCodes.Index(_T("en"));
|
||||||
|
@ -401,8 +403,7 @@ void DialogSpellChecker::OnChangeLanguage(wxCommandEvent &event) {
|
||||||
// Change language code
|
// Change language code
|
||||||
wxString code = langCodes[language->GetSelection()];
|
wxString code = langCodes[language->GetSelection()];
|
||||||
spellchecker->SetLanguage(code);
|
spellchecker->SetLanguage(code);
|
||||||
Options.SetText(_T("Spell checker language"),code);
|
OPT_SET("Tool/Spell Checker/Language")->SetString(STD_STR(code));
|
||||||
Options.Save();
|
|
||||||
|
|
||||||
// Go back to first match
|
// Go back to first match
|
||||||
GetFirstMatch();
|
GetFirstMatch();
|
||||||
|
|
|
@ -50,10 +50,12 @@
|
||||||
#include "ass_override.h"
|
#include "ass_override.h"
|
||||||
#include "ass_style.h"
|
#include "ass_style.h"
|
||||||
#include "ass_style_storage.h"
|
#include "ass_style_storage.h"
|
||||||
|
#include "compat.h"
|
||||||
#include "dialog_colorpicker.h"
|
#include "dialog_colorpicker.h"
|
||||||
#include "dialog_style_editor.h"
|
#include "dialog_style_editor.h"
|
||||||
#include "help_button.h"
|
#include "help_button.h"
|
||||||
#include "libresrc/libresrc.h"
|
#include "libresrc/libresrc.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "subs_grid.h"
|
#include "subs_grid.h"
|
||||||
#include "subs_preview.h"
|
#include "subs_preview.h"
|
||||||
|
@ -362,9 +364,9 @@ DialogStyleEditor::DialogStyleEditor (wxWindow *parent, AssStyle *_style, Subtit
|
||||||
SubsPreview = NULL;
|
SubsPreview = NULL;
|
||||||
PreviewText = NULL;
|
PreviewText = NULL;
|
||||||
if (SubtitlesProviderFactoryManager::ProviderAvailable()) {
|
if (SubtitlesProviderFactoryManager::ProviderAvailable()) {
|
||||||
PreviewText = new wxTextCtrl(this,TEXT_PREVIEW,Options.AsText(_T("Style editor preview text")));
|
PreviewText = new wxTextCtrl(this,TEXT_PREVIEW,lagi_wxString(OPT_GET("Tool/Style Editor/Preview Text")->GetString()));
|
||||||
previewButton = new ColourButton(this,BUTTON_PREVIEW_COLOR,wxSize(45,16),Options.AsColour(_T("Style editor preview background")));
|
previewButton = new ColourButton(this,BUTTON_PREVIEW_COLOR,wxSize(45,16),lagi_wxColour(OPT_GET("Colour/Style Editor/Background/Preview")->GetColour()));
|
||||||
SubsPreview = new SubtitlesPreview(this,-1,wxDefaultPosition,wxSize(100,60),wxSUNKEN_BORDER,Options.AsColour(_T("Style editor preview background")));
|
SubsPreview = new SubtitlesPreview(this,-1,wxDefaultPosition,wxSize(100,60),wxSUNKEN_BORDER,lagi_wxColour(OPT_GET("Colour/Style Editor/Background/Preview")->GetColour()));
|
||||||
|
|
||||||
SubsPreview->SetToolTip(_("Preview of current style."));
|
SubsPreview->SetToolTip(_("Preview of current style."));
|
||||||
SubsPreview->SetStyle(style);
|
SubsPreview->SetStyle(style);
|
||||||
|
@ -588,8 +590,7 @@ void DialogStyleEditor::Apply (bool apply,bool close) {
|
||||||
// Exit
|
// Exit
|
||||||
if (close) {
|
if (close) {
|
||||||
EndModal(1);
|
EndModal(1);
|
||||||
if (PreviewText) Options.SetText(_T("Style editor preview text"),PreviewText->GetValue());
|
if (PreviewText) OPT_SET("Tool/Style Editor/Preview Text")->SetString(STD_STR(PreviewText->GetValue()));
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update preview
|
// Update preview
|
||||||
|
@ -600,8 +601,7 @@ void DialogStyleEditor::Apply (bool apply,bool close) {
|
||||||
else {
|
else {
|
||||||
if (close) {
|
if (close) {
|
||||||
EndModal(0);
|
EndModal(0);
|
||||||
if (PreviewText) Options.SetText(_T("Style editor preview text"),PreviewText->GetValue());
|
if (PreviewText) OPT_SET("Tool/Style Editor/Preview Text")->SetString(STD_STR(PreviewText->GetValue()));
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -722,8 +722,7 @@ void DialogStyleEditor::OnPreviewTextChange (wxCommandEvent &event) {
|
||||||
///
|
///
|
||||||
void DialogStyleEditor::OnPreviewColourChange (wxCommandEvent &event) {
|
void DialogStyleEditor::OnPreviewColourChange (wxCommandEvent &event) {
|
||||||
if (SubsPreview) SubsPreview->SetColour(previewButton->GetColour());
|
if (SubsPreview) SubsPreview->SetColour(previewButton->GetColour());
|
||||||
Options.SetColour(_T("Style editor preview background"),previewButton->GetColour());
|
OPT_SET("Colour/Style Editor/Background/Preview")->SetColour(STD_STR(previewButton->GetColour().GetAsString(wxC2S_CSS_SYNTAX)));
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief Command event to update preview
|
/// @brief Command event to update preview
|
||||||
|
|
|
@ -47,10 +47,12 @@
|
||||||
#include "ass_dialogue.h"
|
#include "ass_dialogue.h"
|
||||||
#include "ass_file.h"
|
#include "ass_file.h"
|
||||||
#include "ass_style.h"
|
#include "ass_style.h"
|
||||||
|
#include "compat.h"
|
||||||
#include "dialog_style_editor.h"
|
#include "dialog_style_editor.h"
|
||||||
#include "dialog_style_manager.h"
|
#include "dialog_style_manager.h"
|
||||||
#include "help_button.h"
|
#include "help_button.h"
|
||||||
#include "libresrc/libresrc.h"
|
#include "libresrc/libresrc.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "standard_paths.h"
|
#include "standard_paths.h"
|
||||||
#include "subs_grid.h"
|
#include "subs_grid.h"
|
||||||
|
@ -829,14 +831,13 @@ void DialogStyleManager::OnCurrentDelete (wxCommandEvent &) {
|
||||||
/// @brief Import styles from another script
|
/// @brief Import styles from another script
|
||||||
void DialogStyleManager::OnCurrentImport(wxCommandEvent &) {
|
void DialogStyleManager::OnCurrentImport(wxCommandEvent &) {
|
||||||
// Get file name
|
// Get file name
|
||||||
wxString path = Options.AsText(_T("Last open subtitles path"));
|
wxString path = lagi_wxString(OPT_GET("Path/Last/Subtitles")->GetString());
|
||||||
wxString filename = wxFileSelector(_("Open subtitles file"),path,_T(""),_T(""),AssFile::GetWildcardList(0),wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
wxString filename = wxFileSelector(_("Open subtitles file"),path,_T(""),_T(""),AssFile::GetWildcardList(0),wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
||||||
|
|
||||||
if (!filename.IsEmpty()) {
|
if (!filename.IsEmpty()) {
|
||||||
// Save path
|
// Save path
|
||||||
wxFileName filepath(filename);
|
wxFileName filepath(filename);
|
||||||
Options.SetText(_T("Last open subtitles path"), filepath.GetPath());
|
OPT_SET("Path/Last/Subtitles")->SetString(STD_STR(filepath.GetPath()));
|
||||||
Options.Save();
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Load file
|
// Load file
|
||||||
|
|
|
@ -44,7 +44,9 @@
|
||||||
#include <wx/stattext.h>
|
#include <wx/stattext.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "compat.h"
|
||||||
#include "dialog_text_import.h"
|
#include "dialog_text_import.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -56,8 +58,8 @@ DialogTextImport::DialogTextImport()
|
||||||
// Main controls
|
// Main controls
|
||||||
wxFlexGridSizer *fg = new wxFlexGridSizer(2, 5, 5);
|
wxFlexGridSizer *fg = new wxFlexGridSizer(2, 5, 5);
|
||||||
wxBoxSizer *main_sizer = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer *main_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
edit_separator = new wxTextCtrl(this, EDIT_ACTOR_SEPARATOR, Options.AsText(_T("text actor separator")));
|
edit_separator = new wxTextCtrl(this, EDIT_ACTOR_SEPARATOR, lagi_wxString(OPT_GET("Tool/Import/Text/Actor Separator")->GetString()));
|
||||||
edit_comment = new wxTextCtrl(this, EDIT_COMMENT_STARTER, Options.AsText(_T("text comment starter")));
|
edit_comment = new wxTextCtrl(this, EDIT_COMMENT_STARTER, lagi_wxString(OPT_GET("Tool/Import/Text/Comment Starter")->GetString()));
|
||||||
|
|
||||||
// Dialog layout
|
// Dialog layout
|
||||||
fg->Add(new wxStaticText(this, -1, _("Actor separator:")), 0, wxALIGN_CENTRE_VERTICAL);
|
fg->Add(new wxStaticText(this, -1, _("Actor separator:")), 0, wxALIGN_CENTRE_VERTICAL);
|
||||||
|
@ -85,9 +87,8 @@ DialogTextImport::~DialogTextImport()
|
||||||
void DialogTextImport::OnOK(wxCommandEvent &event)
|
void DialogTextImport::OnOK(wxCommandEvent &event)
|
||||||
{
|
{
|
||||||
// Set options
|
// Set options
|
||||||
Options.SetText(_T("text actor separator"), edit_separator->GetValue());
|
OPT_SET("Tool/Import/Text/Actor Separator")->SetString(STD_STR(edit_separator->GetValue()));
|
||||||
Options.SetText(_T("text comment starter"), edit_comment->GetValue());
|
OPT_SET("Tool/Import/Text/Comment Starter")->SetString(STD_STR(edit_comment->GetValue()));
|
||||||
Options.Save();
|
|
||||||
|
|
||||||
EndModal(wxID_OK);
|
EndModal(wxID_OK);
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include "dialog_timing_processor.h"
|
#include "dialog_timing_processor.h"
|
||||||
#include "help_button.h"
|
#include "help_button.h"
|
||||||
#include "libresrc/libresrc.h"
|
#include "libresrc/libresrc.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "subs_grid.h"
|
#include "subs_grid.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
@ -66,13 +67,14 @@ DialogTimingProcessor::DialogTimingProcessor(wxWindow *parent,SubtitlesGrid *_gr
|
||||||
|
|
||||||
// Set variables
|
// Set variables
|
||||||
grid = _grid;
|
grid = _grid;
|
||||||
leadInTime = Options.AsText(_T("Audio lead in"));
|
leadInTime = AegiIntegerToString(OPT_GET("Audio/Lead/IN")->GetInt());
|
||||||
leadOutTime = Options.AsText(_T("Audio lead out"));
|
leadOutTime = AegiIntegerToString(OPT_GET("Audio/Lead/OUT")->GetInt());
|
||||||
thresStartBefore = Options.AsText(_T("Timing processor key start before thres"));
|
thresStartBefore = AegiIntegerToString(OPT_GET("Tool/Timing Post Processor/Threshold/Key Start Before")->GetInt());
|
||||||
thresStartAfter = Options.AsText(_T("Timing processor key start after thres"));
|
thresStartAfter = AegiIntegerToString(OPT_GET("Tool/Timing Post Processor/Threshold/Key Start After")->GetInt());
|
||||||
thresEndBefore = Options.AsText(_T("Timing processor key end before thres"));
|
thresEndBefore = AegiIntegerToString(OPT_GET("Tool/Timing Post Processor/Threshold/Key End Before")->GetInt());
|
||||||
thresEndAfter = Options.AsText(_T("Timing processor key end after thres"));
|
thresEndAfter = AegiIntegerToString(OPT_GET("Tool/Timing Post Processor/Threshold/Key End After")->GetInt());
|
||||||
adjsThresTime = Options.AsText(_T("Timing processor adjacent thres"));
|
adjsThresTime = AegiIntegerToString(OPT_GET("Tool/Timing Post Processor/Threshold/Adjacent")->GetInt());
|
||||||
|
|
||||||
|
|
||||||
// Styles box
|
// Styles box
|
||||||
wxSizer *LeftSizer = new wxStaticBoxSizer(wxVERTICAL,this,_("Apply to styles"));
|
wxSizer *LeftSizer = new wxStaticBoxSizer(wxVERTICAL,this,_("Apply to styles"));
|
||||||
|
@ -87,19 +89,19 @@ DialogTimingProcessor::DialogTimingProcessor(wxWindow *parent,SubtitlesGrid *_gr
|
||||||
// Options box
|
// Options box
|
||||||
wxSizer *optionsSizer = new wxStaticBoxSizer(wxHORIZONTAL,this,_("Options"));
|
wxSizer *optionsSizer = new wxStaticBoxSizer(wxHORIZONTAL,this,_("Options"));
|
||||||
onlySelection = new wxCheckBox(this,-1,_("Affect selection only"));
|
onlySelection = new wxCheckBox(this,-1,_("Affect selection only"));
|
||||||
onlySelection->SetValue(Options.AsBool(_T("Timing processor Only Selection")));
|
onlySelection->SetValue(OPT_GET("Tool/Timing Post Processor/Only Selection")->GetBool());
|
||||||
optionsSizer->Add(onlySelection,1,wxALL,0);
|
optionsSizer->Add(onlySelection,1,wxALL,0);
|
||||||
|
|
||||||
// Lead-in/out box
|
// Lead-in/out box
|
||||||
wxSizer *LeadSizer = new wxStaticBoxSizer(wxHORIZONTAL,this,_("Lead-in/Lead-out"));
|
wxSizer *LeadSizer = new wxStaticBoxSizer(wxHORIZONTAL,this,_("Lead-in/Lead-out"));
|
||||||
hasLeadIn = new wxCheckBox(this,CHECK_ENABLE_LEADIN,_("Add lead in:"));
|
hasLeadIn = new wxCheckBox(this,CHECK_ENABLE_LEADIN,_("Add lead in:"));
|
||||||
hasLeadIn->SetToolTip(_("Enable adding of lead-ins to lines."));
|
hasLeadIn->SetToolTip(_("Enable adding of lead-ins to lines."));
|
||||||
hasLeadIn->SetValue(Options.AsBool(_T("Timing processor Enable lead-in")));
|
hasLeadIn->SetValue(OPT_GET("Tool/Timing Post Processor/Enable/Lead/IN")->GetBool());
|
||||||
leadIn = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(80,-1),0,NumValidator(&leadInTime));
|
leadIn = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(80,-1),0,NumValidator(&leadInTime));
|
||||||
leadIn->SetToolTip(_("Lead in to be added, in milliseconds."));
|
leadIn->SetToolTip(_("Lead in to be added, in milliseconds."));
|
||||||
hasLeadOut = new wxCheckBox(this,CHECK_ENABLE_LEADOUT,_("Add lead out:"));
|
hasLeadOut = new wxCheckBox(this,CHECK_ENABLE_LEADOUT,_("Add lead out:"));
|
||||||
hasLeadOut->SetToolTip(_("Enable adding of lead-outs to lines."));
|
hasLeadOut->SetToolTip(_("Enable adding of lead-outs to lines."));
|
||||||
hasLeadOut->SetValue(Options.AsBool(_T("Timing processor Enable lead-out")));
|
hasLeadOut->SetValue(OPT_GET("Tool/Timing Post Processor/Enable/Lead/OUT")->GetBool());
|
||||||
leadOut = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(80,-1),0,NumValidator(&leadOutTime));
|
leadOut = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(80,-1),0,NumValidator(&leadOutTime));
|
||||||
leadOut->SetToolTip(_("Lead out to be added, in milliseconds."));
|
leadOut->SetToolTip(_("Lead out to be added, in milliseconds."));
|
||||||
LeadSizer->Add(hasLeadIn,0,wxRIGHT|wxEXPAND,5);
|
LeadSizer->Add(hasLeadIn,0,wxRIGHT|wxEXPAND,5);
|
||||||
|
@ -112,11 +114,11 @@ DialogTimingProcessor::DialogTimingProcessor(wxWindow *parent,SubtitlesGrid *_gr
|
||||||
wxSizer *AdjacentSizer = new wxStaticBoxSizer(wxHORIZONTAL,this,_("Make adjacent subtitles continuous"));
|
wxSizer *AdjacentSizer = new wxStaticBoxSizer(wxHORIZONTAL,this,_("Make adjacent subtitles continuous"));
|
||||||
adjsEnable = new wxCheckBox(this,CHECK_ENABLE_ADJASCENT,_("Enable"));
|
adjsEnable = new wxCheckBox(this,CHECK_ENABLE_ADJASCENT,_("Enable"));
|
||||||
adjsEnable->SetToolTip(_("Enable snapping of subtitles together if they are within a certain distance of each other."));
|
adjsEnable->SetToolTip(_("Enable snapping of subtitles together if they are within a certain distance of each other."));
|
||||||
adjsEnable->SetValue(Options.AsBool(_T("Timing processor Enable adjacent")));
|
adjsEnable->SetValue(OPT_GET("Tool/Timing Post Processor/Enable/Adjacent")->GetBool());
|
||||||
wxStaticText *adjsThresText = new wxStaticText(this,-1,_("Threshold:"),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE);
|
wxStaticText *adjsThresText = new wxStaticText(this,-1,_("Threshold:"),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE);
|
||||||
adjacentThres = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(60,-1),0,NumValidator(&adjsThresTime));
|
adjacentThres = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(60,-1),0,NumValidator(&adjsThresTime));
|
||||||
adjacentThres->SetToolTip(_("Maximum difference between start and end time for two subtitles to be made continuous, in milliseconds."));
|
adjacentThres->SetToolTip(_("Maximum difference between start and end time for two subtitles to be made continuous, in milliseconds."));
|
||||||
adjacentBias = new wxSlider(this,-1,MID(0,int(Options.AsFloat(_T("Timing processor adjacent bias"))*100),100),0,100,wxDefaultPosition,wxSize(-1,20));
|
adjacentBias = new wxSlider(this,-1,MID(0,int(OPT_GET("Tool/Timing Post Processor/Adjacent Bias")->GetDouble()*100),100),0,100,wxDefaultPosition,wxSize(-1,20));
|
||||||
adjacentBias->SetToolTip(_("Sets how to set the adjoining of lines. If set totally to left, it will extend start time of the second line; if totally to right, it will extend the end time of the first line."));
|
adjacentBias->SetToolTip(_("Sets how to set the adjoining of lines. If set totally to left, it will extend start time of the second line; if totally to right, it will extend the end time of the first line."));
|
||||||
AdjacentSizer->Add(adjsEnable,0,wxRIGHT|wxEXPAND,10);
|
AdjacentSizer->Add(adjsEnable,0,wxRIGHT|wxEXPAND,10);
|
||||||
AdjacentSizer->Add(adjsThresText,0,wxRIGHT|wxALIGN_CENTER,5);
|
AdjacentSizer->Add(adjsThresText,0,wxRIGHT|wxALIGN_CENTER,5);
|
||||||
|
@ -130,7 +132,7 @@ DialogTimingProcessor::DialogTimingProcessor(wxWindow *parent,SubtitlesGrid *_gr
|
||||||
wxSizer *KeyframesFlexSizer = new wxFlexGridSizer(2,5,5,0);
|
wxSizer *KeyframesFlexSizer = new wxFlexGridSizer(2,5,5,0);
|
||||||
keysEnable = new wxCheckBox(this,CHECK_ENABLE_KEYFRAME,_("Enable"));
|
keysEnable = new wxCheckBox(this,CHECK_ENABLE_KEYFRAME,_("Enable"));
|
||||||
keysEnable->SetToolTip(_("Enable snapping of subtitles to nearest keyframe, if distance is within threshold."));
|
keysEnable->SetToolTip(_("Enable snapping of subtitles to nearest keyframe, if distance is within threshold."));
|
||||||
keysEnable->SetValue(Options.AsBool(_T("Timing processor Enable keyframe")));
|
keysEnable->SetValue(OPT_GET("Tool/Timing Post Processor/Enable/Keyframe")->GetBool());
|
||||||
wxStaticText *textStartBefore = new wxStaticText(this,-1,_("Starts before thres.:"),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE);
|
wxStaticText *textStartBefore = new wxStaticText(this,-1,_("Starts before thres.:"),wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE);
|
||||||
keysStartBefore = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(60,-1),0,NumValidator(&thresStartBefore));
|
keysStartBefore = new wxTextCtrl(this,-1,_T(""),wxDefaultPosition,wxSize(60,-1),0,NumValidator(&thresStartBefore));
|
||||||
keysStartBefore->SetToolTip(_("Threshold for 'before start' distance, that is, how many frames a subtitle must start before a keyframe to snap to it."));
|
keysStartBefore->SetToolTip(_("Threshold for 'before start' distance, that is, how many frames a subtitle must start before a keyframe to snap to it."));
|
||||||
|
@ -293,26 +295,25 @@ void DialogTimingProcessor::OnApply(wxCommandEvent &event) {
|
||||||
// Save settings
|
// Save settings
|
||||||
long temp = 0;
|
long temp = 0;
|
||||||
leadIn->GetValue().ToLong(&temp);
|
leadIn->GetValue().ToLong(&temp);
|
||||||
Options.SetInt(_T("Audio lead in"),temp);
|
OPT_SET("Audio/Lead/IN")->SetInt(temp);
|
||||||
leadOut->GetValue().ToLong(&temp);
|
leadOut->GetValue().ToLong(&temp);
|
||||||
Options.SetInt(_T("Audio lead out"),temp);
|
OPT_SET("Audio/Lead/OUT")->SetInt(temp);
|
||||||
keysStartBefore->GetValue().ToLong(&temp);
|
keysStartBefore->GetValue().ToLong(&temp);
|
||||||
Options.SetInt(_T("Timing processor key start before thres"),temp);
|
OPT_SET("Tool/Timing Post Processor/Threshold/Key Start Before")->SetInt(temp);
|
||||||
keysStartAfter->GetValue().ToLong(&temp);
|
keysStartAfter->GetValue().ToLong(&temp);
|
||||||
Options.SetInt(_T("Timing processor key start after thres"),temp);
|
OPT_SET("Tool/Timing Post Processor/Threshold/Key Start After")->SetInt(temp);
|
||||||
keysEndBefore->GetValue().ToLong(&temp);
|
keysEndBefore->GetValue().ToLong(&temp);
|
||||||
Options.SetInt(_T("Timing processor key end before thres"),temp);
|
OPT_SET("Tool/Timing Post Processor/Threshold/Key End Before")->SetInt(temp);
|
||||||
keysEndAfter->GetValue().ToLong(&temp);
|
keysEndAfter->GetValue().ToLong(&temp);
|
||||||
Options.SetInt(_T("Timing processor key end after thres"),temp);
|
OPT_SET("Tool/Timing Post Processor/Threshold/Key End After")->SetInt(temp);
|
||||||
adjacentThres->GetValue().ToLong(&temp);
|
adjacentThres->GetValue().ToLong(&temp);
|
||||||
Options.SetInt(_T("Timing processor adjacent thres"),temp);
|
OPT_SET("Tool/Timing Post Processor/Threshold/Adjacent")->SetInt(temp);
|
||||||
Options.SetFloat(_T("Timing processor adjacent bias"),adjacentBias->GetValue() / 100.0);
|
OPT_SET("Tool/Timing Post Processor/Adjacent Bias")->SetDouble(adjacentBias->GetValue() / 100.0);
|
||||||
Options.SetBool(_T("Timing processor Enable lead-in"),hasLeadIn->IsChecked());
|
OPT_SET("Tool/Timing Post Processor/Enable/Lead/IN")->SetBool(hasLeadIn->IsChecked());
|
||||||
Options.SetBool(_T("Timing processor Enable lead-out"),hasLeadOut->IsChecked());
|
OPT_SET("Tool/Timing Post Processor/Enable/Lead/OUT")->SetBool(hasLeadOut->IsChecked());
|
||||||
if (keysEnable->IsEnabled()) Options.SetBool(_T("Timing processor Enable keyframe"),keysEnable->IsChecked());
|
if (keysEnable->IsEnabled()) OPT_SET("Tool/Timing Post Processor/Enable/Keyframe")->SetBool(keysEnable->IsChecked());
|
||||||
Options.SetBool(_T("Timing processor Enable adjacent"),adjsEnable->IsChecked());
|
OPT_SET("Tool/Timing Post Processor/Enable/Adjacent")->SetBool(adjsEnable->IsChecked());
|
||||||
Options.SetBool(_T("Timing processor Only Selection"),onlySelection->IsChecked());
|
OPT_SET("Tool/Timing Post Processor/Only Selection")->SetBool(onlySelection->IsChecked());
|
||||||
Options.Save();
|
|
||||||
|
|
||||||
// Check if rows are valid
|
// Check if rows are valid
|
||||||
bool valid = true;
|
bool valid = true;
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "dialog_tip.h"
|
#include "dialog_tip.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -99,12 +100,11 @@ wxString TipOfTheDay::GetTip() {
|
||||||
///
|
///
|
||||||
void TipOfTheDay::Show(wxWindow *parent) {
|
void TipOfTheDay::Show(wxWindow *parent) {
|
||||||
try {
|
try {
|
||||||
if (Options.AsBool(_T("Tips enabled"))) {
|
if (OPT_GET("App/Tips")->GetBool()) {
|
||||||
TipOfTheDay *tip = new TipOfTheDay(Options.AsInt(_T("Tips current")));
|
TipOfTheDay *tip = new TipOfTheDay(OPT_GET("Tool/Tip of the Day/Current")->GetInt());
|
||||||
bool show = wxShowTip(parent, tip, true);
|
bool show = wxShowTip(parent, tip, true);
|
||||||
if (!show) Options.SetBool(_T("Tips enabled"),false);
|
if (!show) OPT_SET("App/Tips")->SetBool(false);
|
||||||
Options.SetInt(_T("Tips current"),tip->curTip);
|
OPT_SET("Tool/Tip of the Day/Current")->SetInt(tip->curTip);
|
||||||
Options.Save();
|
|
||||||
delete tip;
|
delete tip;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,12 +64,14 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "compat.h"
|
||||||
#include "dialog_version_check.h"
|
#include "dialog_version_check.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "include/aegisub/exception.h"
|
|
||||||
#include "string_codec.h"
|
#include "string_codec.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
|
#include <libaegisub/exception.h>
|
||||||
|
|
||||||
/* *** Public API is implemented here *** */
|
/* *** Public API is implemented here *** */
|
||||||
|
|
||||||
|
@ -138,7 +140,7 @@ public:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
DEFINE_SIMPLE_EXCEPTION_NOINNER(VersionCheckError, Aegisub::Exception, "versioncheck")
|
DEFINE_SIMPLE_EXCEPTION_NOINNER(VersionCheckError, agi::Exception, "versioncheck")
|
||||||
|
|
||||||
|
|
||||||
class AegisubVersionCheckEventHandler : public wxEvtHandler {
|
class AegisubVersionCheckEventHandler : public wxEvtHandler {
|
||||||
|
@ -169,11 +171,11 @@ wxThread::ExitCode AegisubVersionCheckerThread::Entry()
|
||||||
if (!interactive)
|
if (!interactive)
|
||||||
{
|
{
|
||||||
// Automatic checking enabled?
|
// Automatic checking enabled?
|
||||||
if (!Options.AsBool(_T("auto check for updates")))
|
if (!OPT_GET("App/Auto/Check For Updates")->GetInt())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// Is it actually time for a check?
|
// Is it actually time for a check?
|
||||||
time_t next_check = Options.AsInt(_T("Updates Next Check Time"));
|
time_t next_check = OPT_GET("Version/Next Check")->GetInt();
|
||||||
if ((time_t)next_check > wxDateTime::GetTimeNow())
|
if ((time_t)next_check > wxDateTime::GetTimeNow())
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -183,10 +185,10 @@ wxThread::ExitCode AegisubVersionCheckerThread::Entry()
|
||||||
try {
|
try {
|
||||||
DoCheck();
|
DoCheck();
|
||||||
}
|
}
|
||||||
catch (const Aegisub::Exception &e) {
|
catch (const agi::Exception &e) {
|
||||||
PostErrorEvent(wxString::Format(
|
PostErrorEvent(wxString::Format(
|
||||||
_("There was an error checking for updates to Aegisub:\n%s\n\nIf other applications can access the Internet fine, this is probably a temporary server problem on our end."),
|
_("There was an error checking for updates to Aegisub:\n%s\n\nIf other applications can access the Internet fine, this is probably a temporary server problem on our end."),
|
||||||
e.GetMessage().c_str()));
|
e.GetMessage()));
|
||||||
}
|
}
|
||||||
catch (...) {
|
catch (...) {
|
||||||
PostErrorEvent(_("An unknown error occurred while checking for updates to Aegisub."));
|
PostErrorEvent(_("An unknown error occurred while checking for updates to Aegisub."));
|
||||||
|
@ -201,7 +203,7 @@ wxThread::ExitCode AegisubVersionCheckerThread::Entry()
|
||||||
// because the tree only depends on the keys.
|
// because the tree only depends on the keys.
|
||||||
// Lastly, writing options to disk only happens when Options.Save() is called.
|
// Lastly, writing options to disk only happens when Options.Save() is called.
|
||||||
time_t new_next_check_time = wxDateTime::GetTimeNow() + 60*60; // in one hour
|
time_t new_next_check_time = wxDateTime::GetTimeNow() + 60*60; // in one hour
|
||||||
Options.SetInt(_T("Updates Next Check Time"), (int)new_next_check_time);
|
OPT_SET("Version/Next Check")->SetInt((int)new_next_check_time);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -338,12 +340,14 @@ void AegisubVersionCheckerThread::DoCheck()
|
||||||
http.SetFlags(wxSOCKET_WAITALL|wxSOCKET_BLOCK);
|
http.SetFlags(wxSOCKET_WAITALL|wxSOCKET_BLOCK);
|
||||||
|
|
||||||
if (!http.Connect(servername))
|
if (!http.Connect(servername))
|
||||||
throw VersionCheckError(_("Could not connect to updates server."));
|
throw VersionCheckError(STD_STR(_("Could not connect to updates server.")));
|
||||||
|
|
||||||
std::auto_ptr<wxInputStream> stream(http.GetInputStream(path));
|
std::auto_ptr<wxInputStream> stream(http.GetInputStream(path));
|
||||||
|
|
||||||
if (http.GetResponse() < 200 || http.GetResponse() >= 300)
|
if (http.GetResponse() < 200 || http.GetResponse() >= 300) {
|
||||||
throw VersionCheckError(wxString::Format(_("HTTP request failed, got HTTP response %d."), http.GetResponse()));
|
const std::string str_err = STD_STR(wxString::Format(_("HTTP request failed, got HTTP response %d."), http.GetResponse()));
|
||||||
|
throw VersionCheckError(str_err);
|
||||||
|
}
|
||||||
|
|
||||||
wxTextInputStream text(*stream);
|
wxTextInputStream text(*stream);
|
||||||
|
|
||||||
|
@ -485,7 +489,7 @@ VersionCheckerResultDialog::VersionCheckerResultDialog(const wxString &main_text
|
||||||
}
|
}
|
||||||
|
|
||||||
automatic_check_checkbox = new wxCheckBox(this, -1, _("Auto Check for Updates"));
|
automatic_check_checkbox = new wxCheckBox(this, -1, _("Auto Check for Updates"));
|
||||||
automatic_check_checkbox->SetValue(Options.AsBool(_T("Auto check for updates")));
|
automatic_check_checkbox->SetValue(!!OPT_GET("App/Auto/Check For Updates")->GetInt());
|
||||||
|
|
||||||
wxButton *remind_later_button = 0;
|
wxButton *remind_later_button = 0;
|
||||||
if (updates.size() > 0)
|
if (updates.size() > 0)
|
||||||
|
@ -523,7 +527,7 @@ void VersionCheckerResultDialog::OnRemindMeLater(wxCommandEvent &evt)
|
||||||
{
|
{
|
||||||
// In one week
|
// In one week
|
||||||
time_t new_next_check_time = wxDateTime::Today().GetTicks() + 7*24*60*60;
|
time_t new_next_check_time = wxDateTime::Today().GetTicks() + 7*24*60*60;
|
||||||
Options.SetInt(_T("Updates Next Check Time"), (int)new_next_check_time);
|
OPT_SET("Version/Next Check")->SetInt((int)new_next_check_time);
|
||||||
|
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
@ -531,7 +535,7 @@ void VersionCheckerResultDialog::OnRemindMeLater(wxCommandEvent &evt)
|
||||||
|
|
||||||
void VersionCheckerResultDialog::OnClose(wxCloseEvent &evt)
|
void VersionCheckerResultDialog::OnClose(wxCloseEvent &evt)
|
||||||
{
|
{
|
||||||
Options.SetBool(_T("Auto check for updates"), automatic_check_checkbox->GetValue());
|
OPT_SET("App/Auto/Check For Updates")->SetBool(automatic_check_checkbox->GetValue());
|
||||||
Destroy();
|
Destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
#include <wx/choicdlg.h> // Keep this last so wxUSE_CHOICEDLG is set.
|
#include <wx/choicdlg.h> // Keep this last so wxUSE_CHOICEDLG is set.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "compat.h"
|
||||||
#include "ffmpegsource_common.h"
|
#include "ffmpegsource_common.h"
|
||||||
#include "frame_main.h"
|
#include "frame_main.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
@ -176,7 +177,7 @@ int FFmpegSourceProvider::AskForTrackSelection(const std::map<int,wxString> &Tra
|
||||||
|
|
||||||
/// @brief Set ffms2 log level according to setting in config.dat
|
/// @brief Set ffms2 log level according to setting in config.dat
|
||||||
void FFmpegSourceProvider::SetLogLevel() {
|
void FFmpegSourceProvider::SetLogLevel() {
|
||||||
wxString LogLevel = Options.AsText(_T("FFmpegSource log level"));
|
wxString LogLevel = lagi_wxString(OPT_GET("Provider/FFmpegSource/Log Level")->GetString());
|
||||||
|
|
||||||
if (!LogLevel.CmpNoCase(_T("panic")))
|
if (!LogLevel.CmpNoCase(_T("panic")))
|
||||||
FFMS_SetLogLevel(FFMS_LOG_PANIC);
|
FFMS_SetLogLevel(FFMS_LOG_PANIC);
|
||||||
|
@ -198,7 +199,7 @@ void FFmpegSourceProvider::SetLogLevel() {
|
||||||
|
|
||||||
|
|
||||||
FFMS_IndexErrorHandling FFmpegSourceProvider::GetErrorHandlingMode() {
|
FFMS_IndexErrorHandling FFmpegSourceProvider::GetErrorHandlingMode() {
|
||||||
wxString Mode = Options.AsText(_T("FFmpegSource audio decoding error handling"));
|
wxString Mode = lagi_wxString(OPT_GET("Provider/Audio/FFMpegSource/Decode Error Handling")->GetString());
|
||||||
|
|
||||||
if (!Mode.CmpNoCase(_T("ignore")))
|
if (!Mode.CmpNoCase(_T("ignore")))
|
||||||
return FFMS_IEH_IGNORE;
|
return FFMS_IEH_IGNORE;
|
||||||
|
@ -310,9 +311,9 @@ wxThread::ExitCode FFmpegSourceCacheCleaner::Entry() {
|
||||||
|
|
||||||
// the option is in megabytes, we need bytes
|
// the option is in megabytes, we need bytes
|
||||||
// shift left by 20 is CLEARLY more efficient than multiplying by 1048576
|
// shift left by 20 is CLEARLY more efficient than multiplying by 1048576
|
||||||
int64_t maxsize = Options.AsInt(_T("FFmpegSource max cache size")) << 20;
|
int64_t maxsize = OPT_GET("Provider/FFmpegSource/Cache/Size")->GetInt() << 20;
|
||||||
int64_t cursize = wxDir::GetTotalSize(cachedirname).GetValue();
|
int64_t cursize = wxDir::GetTotalSize(cachedirname).GetValue();
|
||||||
int maxfiles = Options.AsInt(_T("FFmpegSource max cache files"));
|
int maxfiles = OPT_GET("Provider/FFmpegSource/Cache/Files")->GetInt();
|
||||||
|
|
||||||
if (!cachedir.HasFiles(_T("*.ffindex"))) {
|
if (!cachedir.HasFiles(_T("*.ffindex"))) {
|
||||||
wxLogDebug(_T("FFmpegSourceCacheCleaner: no index files in cache folder, exiting"));
|
wxLogDebug(_T("FFmpegSourceCacheCleaner: no index files in cache folder, exiting"));
|
||||||
|
|
|
@ -62,6 +62,7 @@
|
||||||
#include "avisynth_wrap.h"
|
#include "avisynth_wrap.h"
|
||||||
#endif
|
#endif
|
||||||
#include "charset_conv.h"
|
#include "charset_conv.h"
|
||||||
|
#include "compat.h"
|
||||||
#include "dialog_detached_video.h"
|
#include "dialog_detached_video.h"
|
||||||
#include "dialog_search_replace.h"
|
#include "dialog_search_replace.h"
|
||||||
#include "dialog_splash.h"
|
#include "dialog_splash.h"
|
||||||
|
@ -145,7 +146,7 @@ FrameMain::FrameMain (wxArrayString args)
|
||||||
|
|
||||||
// Create menu and tool bars
|
// Create menu and tool bars
|
||||||
StartupLog(_T("Apply saved Maximized state"));
|
StartupLog(_T("Apply saved Maximized state"));
|
||||||
if (Options.AsBool(_T("Maximized"))) Maximize(true);
|
if (OPT_GET("App/Maximized")->GetBool()) Maximize(true);
|
||||||
StartupLog(_T("Initialize toolbar"));
|
StartupLog(_T("Initialize toolbar"));
|
||||||
InitToolbar();
|
InitToolbar();
|
||||||
StartupLog(_T("Initialize menu bar"));
|
StartupLog(_T("Initialize menu bar"));
|
||||||
|
@ -179,7 +180,7 @@ FrameMain::FrameMain (wxArrayString args)
|
||||||
// It doesn't work properly on wxMac, and the jumping dock icon
|
// It doesn't work properly on wxMac, and the jumping dock icon
|
||||||
// signals the same as the splash screen either way.
|
// signals the same as the splash screen either way.
|
||||||
#if !_DEBUG && !__WXMAC__
|
#if !_DEBUG && !__WXMAC__
|
||||||
if (Options.AsBool(_T("Show Splash"))) {
|
if (OPT_GET("App/Splash")->GetBool()) {
|
||||||
SplashScreen *splash = new SplashScreen(this);
|
SplashScreen *splash = new SplashScreen(this);
|
||||||
splash->Show(true);
|
splash->Show(true);
|
||||||
splash->Update();
|
splash->Update();
|
||||||
|
@ -192,7 +193,7 @@ FrameMain::FrameMain (wxArrayString args)
|
||||||
// Set autosave timer
|
// Set autosave timer
|
||||||
StartupLog(_T("Set up Auto Save"));
|
StartupLog(_T("Set up Auto Save"));
|
||||||
AutoSave.SetOwner(this,AutoSave_Timer);
|
AutoSave.SetOwner(this,AutoSave_Timer);
|
||||||
int time = Options.AsInt(_T("Auto save every seconds"));
|
int time = OPT_GET("App/Auto/Save Every Seconds")->GetInt();
|
||||||
if (time > 0) {
|
if (time > 0) {
|
||||||
AutoSave.Start(time*1000);
|
AutoSave.Start(time*1000);
|
||||||
}
|
}
|
||||||
|
@ -214,12 +215,11 @@ FrameMain::FrameMain (wxArrayString args)
|
||||||
|
|
||||||
// Version checker
|
// Version checker
|
||||||
StartupLog(_T("Possibly perform automatic updates check"));
|
StartupLog(_T("Possibly perform automatic updates check"));
|
||||||
int option = Options.AsInt(_T("Auto check for updates"));
|
int option = OPT_GET("App/Auto/Check For Updates")->GetInt();
|
||||||
if (option == -1) {
|
if (option == -1) {
|
||||||
int result = wxMessageBox(_("Do you want Aegisub to check for updates whenever it starts? You can still do it manually via the Help menu."),_("Check for updates?"),wxYES_NO);
|
int result = wxMessageBox(_("Do you want Aegisub to check for updates whenever it starts? You can still do it manually via the Help menu."),_("Check for updates?"),wxYES_NO);
|
||||||
option = (result == wxYES);
|
option = (result == wxYES);
|
||||||
Options.SetInt(_T("Auto check for updates"),option);
|
OPT_SET("App/Auto/Check For Updates")->SetInt(option);
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PerformVersionCheck(false);
|
PerformVersionCheck(false);
|
||||||
|
@ -609,7 +609,7 @@ void FrameMain::InitContents() {
|
||||||
videoBox->videoSlider->grid = SubsBox;
|
videoBox->videoSlider->grid = SubsBox;
|
||||||
VideoContext::Get()->grid = SubsBox;
|
VideoContext::Get()->grid = SubsBox;
|
||||||
StartupLog(_T("Reset video zoom"));
|
StartupLog(_T("Reset video zoom"));
|
||||||
videoBox->videoDisplay->SetZoom(Options.AsInt(_T("Video Default Zoom")) * .125 + .125);
|
videoBox->videoDisplay->SetZoom(OPT_GET("Video/Default Zoom")->GetInt() * .125 + .125);
|
||||||
Search.grid = SubsBox;
|
Search.grid = SubsBox;
|
||||||
|
|
||||||
// Audio area
|
// Audio area
|
||||||
|
@ -718,7 +718,7 @@ void FrameMain::LoadSubtitles (wxString filename,wxString charset) {
|
||||||
wxString cur = testSubs.ReadLineFromFile();
|
wxString cur = testSubs.ReadLineFromFile();
|
||||||
if (cur.Left(10) == _T("# timecode")) {
|
if (cur.Left(10) == _T("# timecode")) {
|
||||||
LoadVFR(filename);
|
LoadVFR(filename);
|
||||||
Options.SetText(_T("Last open timecodes path"), fileCheck.GetPath());
|
OPT_SET("Path/Last/Timecodes")->SetString(STD_STR(fileCheck.GetPath()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -737,7 +737,7 @@ void FrameMain::LoadSubtitles (wxString filename,wxString charset) {
|
||||||
SubsBox->LoadFromAss(AssFile::top,false,true);
|
SubsBox->LoadFromAss(AssFile::top,false,true);
|
||||||
wxFileName fn(filename);
|
wxFileName fn(filename);
|
||||||
StandardPaths::SetPathValue(_T("?script"),fn.GetPath());
|
StandardPaths::SetPathValue(_T("?script"),fn.GetPath());
|
||||||
Options.SetText(_T("Last open subtitles path"), fn.GetPath());
|
OPT_SET("Path/Last/Subtitles")->SetString(STD_STR(fn.GetPath()));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SubsBox->LoadDefault(AssFile::top);
|
SubsBox->LoadDefault(AssFile::top);
|
||||||
|
@ -759,9 +759,9 @@ void FrameMain::LoadSubtitles (wxString filename,wxString charset) {
|
||||||
|
|
||||||
// Save copy
|
// Save copy
|
||||||
wxFileName origfile(filename);
|
wxFileName origfile(filename);
|
||||||
if (!isBinary && Options.AsBool(_T("Auto backup")) && origfile.FileExists()) {
|
if (!isBinary && OPT_GET("App/Auto/Backup")->GetBool() && origfile.FileExists()) {
|
||||||
// Get path
|
// Get path
|
||||||
wxString path = Options.AsText(_T("Auto backup path"));
|
wxString path = lagi_wxString(OPT_GET("Path/Auto/Backup")->GetString());
|
||||||
if (path.IsEmpty()) path = origfile.GetPath();
|
if (path.IsEmpty()) path = origfile.GetPath();
|
||||||
wxFileName dstpath(path);
|
wxFileName dstpath(path);
|
||||||
if (!dstpath.IsAbsolute()) path = StandardPaths::DecodePathMaybeRelative(path, _T("?user/"));
|
if (!dstpath.IsAbsolute()) path = StandardPaths::DecodePathMaybeRelative(path, _T("?user/"));
|
||||||
|
@ -796,7 +796,7 @@ bool FrameMain::SaveSubtitles(bool saveas,bool withCharset) {
|
||||||
// Failed, ask user
|
// Failed, ask user
|
||||||
if (filename.IsEmpty()) {
|
if (filename.IsEmpty()) {
|
||||||
VideoContext::Get()->Stop();
|
VideoContext::Get()->Stop();
|
||||||
wxString path = Options.AsText(_T("Last open subtitles path"));
|
wxString path = lagi_wxString(OPT_GET("Path/Last/Subtitles")->GetString());
|
||||||
wxFileName origPath(AssFile::top->filename);
|
wxFileName origPath(AssFile::top->filename);
|
||||||
filename = wxFileSelector(_("Save subtitles file"),path,origPath.GetName() + _T(".ass"),_T("ass"),AssFile::GetWildcardList(1),wxFD_SAVE | wxFD_OVERWRITE_PROMPT,this);
|
filename = wxFileSelector(_("Save subtitles file"),path,origPath.GetName() + _T(".ass"),_T("ass"),AssFile::GetWildcardList(1),wxFD_SAVE | wxFD_OVERWRITE_PROMPT,this);
|
||||||
}
|
}
|
||||||
|
@ -805,7 +805,7 @@ bool FrameMain::SaveSubtitles(bool saveas,bool withCharset) {
|
||||||
if (!filename.empty()) {
|
if (!filename.empty()) {
|
||||||
// Store path
|
// Store path
|
||||||
wxFileName filepath(filename);
|
wxFileName filepath(filename);
|
||||||
Options.SetText(_T("Last open subtitles path"), filepath.GetPath());
|
OPT_SET("Path/Last/Subtitles")->SetString(STD_STR(filepath.GetPath()));
|
||||||
|
|
||||||
// Fix me, ghetto hack for correct relative path generation in SynchronizeProject()
|
// Fix me, ghetto hack for correct relative path generation in SynchronizeProject()
|
||||||
AssFile::top->filename = filename;
|
AssFile::top->filename = filename;
|
||||||
|
@ -979,7 +979,7 @@ void FrameMain::SynchronizeProject(bool fromSubs) {
|
||||||
wxString AutoScriptString = subs->GetScriptInfo(_T("Automation Scripts"));
|
wxString AutoScriptString = subs->GetScriptInfo(_T("Automation Scripts"));
|
||||||
|
|
||||||
// Check if there is anything to change
|
// Check if there is anything to change
|
||||||
int autoLoadMode = Options.AsInt(_T("Autoload linked files"));
|
int autoLoadMode = OPT_GET("App/Auto/Load Linked Files")->GetInt();
|
||||||
bool hasToLoad = false;
|
bool hasToLoad = false;
|
||||||
if (curSubsAudio != audioBox->audioName ||
|
if (curSubsAudio != audioBox->audioName ||
|
||||||
curSubsVFR != VFR_Output.GetFilename() ||
|
curSubsVFR != VFR_Output.GetFilename() ||
|
||||||
|
@ -1034,7 +1034,7 @@ void FrameMain::SynchronizeProject(bool fromSubs) {
|
||||||
local_scripts->RemoveAll();
|
local_scripts->RemoveAll();
|
||||||
wxStringTokenizer tok(AutoScriptString, _T("|"), wxTOKEN_STRTOK);
|
wxStringTokenizer tok(AutoScriptString, _T("|"), wxTOKEN_STRTOK);
|
||||||
wxFileName subsfn(subs->filename);
|
wxFileName subsfn(subs->filename);
|
||||||
wxString autobasefn(Options.AsText(_T("Automation Base Path")));
|
wxString autobasefn(lagi_wxString(OPT_GET("Path/Automation/Base")->GetString()));
|
||||||
while (tok.HasMoreTokens()) {
|
while (tok.HasMoreTokens()) {
|
||||||
wxString sfnames = tok.GetNextToken().Trim(true).Trim(false);
|
wxString sfnames = tok.GetNextToken().Trim(true).Trim(false);
|
||||||
wxString sfnamel = sfnames.Left(1);
|
wxString sfnamel = sfnames.Left(1);
|
||||||
|
@ -1102,7 +1102,7 @@ void FrameMain::SynchronizeProject(bool fromSubs) {
|
||||||
// 4. Otherwise, use path relative to subs ("~")
|
// 4. Otherwise, use path relative to subs ("~")
|
||||||
#ifdef WITH_AUTOMATION
|
#ifdef WITH_AUTOMATION
|
||||||
wxString scripts_string;
|
wxString scripts_string;
|
||||||
wxString autobasefn(Options.AsText(_T("Automation Base Path")));
|
wxString autobasefn(lagi_wxString(OPT_GET("Path/Automation/Base")->GetString()));
|
||||||
|
|
||||||
const std::vector<Automation4::Script*> &scripts = local_scripts->GetScripts();
|
const std::vector<Automation4::Script*> &scripts = local_scripts->GetScripts();
|
||||||
for (unsigned int i = 0; i < scripts.size(); i++) {
|
for (unsigned int i = 0; i < scripts.size(); i++) {
|
||||||
|
@ -1182,7 +1182,7 @@ void FrameMain::LoadVideo(wxString file,bool autoload) {
|
||||||
int scriptx = SubsBox->ass->GetScriptInfoAsInt(_T("PlayResX"));
|
int scriptx = SubsBox->ass->GetScriptInfoAsInt(_T("PlayResX"));
|
||||||
int scripty = SubsBox->ass->GetScriptInfoAsInt(_T("PlayResY"));
|
int scripty = SubsBox->ass->GetScriptInfoAsInt(_T("PlayResY"));
|
||||||
if (scriptx != vidx || scripty != vidy) {
|
if (scriptx != vidx || scripty != vidy) {
|
||||||
switch (Options.AsInt(_T("Video Check Script Res"))) {
|
switch (OPT_GET("Video/Check Script Res")->GetInt()) {
|
||||||
case 1:
|
case 1:
|
||||||
// Ask to change on mismatch
|
// Ask to change on mismatch
|
||||||
if (wxMessageBox(wxString::Format(_("The resolution of the loaded video and the resolution specified for the subtitles don't match.\n\nVideo resolution:\t%d x %d\nScript resolution:\t%d x %d\n\nChange subtitles resolution to match video?"), vidx, vidy, scriptx, scripty), _("Resolution mismatch"), wxYES_NO, this) != wxYES)
|
if (wxMessageBox(wxString::Format(_("The resolution of the loaded video and the resolution specified for the subtitles don't match.\n\nVideo resolution:\t%d x %d\nScript resolution:\t%d x %d\n\nChange subtitles resolution to match video?"), vidx, vidy, scriptx, scripty), _("Resolution mismatch"), wxYES_NO, this) != wxYES)
|
||||||
|
@ -1207,7 +1207,7 @@ void FrameMain::LoadVideo(wxString file,bool autoload) {
|
||||||
SetDisplayMode(1,-1);
|
SetDisplayMode(1,-1);
|
||||||
EditBox->UpdateFrameTiming();
|
EditBox->UpdateFrameTiming();
|
||||||
|
|
||||||
DetachVideo(VideoContext::Get()->IsLoaded() && Options.AsBool(_T("Detached Video")));
|
DetachVideo(VideoContext::Get()->IsLoaded() && OPT_GET("Video/Detached/Enabled")->GetBool());
|
||||||
Thaw();
|
Thaw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1345,7 +1345,7 @@ void FrameMain::SetAccelerators() {
|
||||||
entry.push_back(Hotkeys.GetAccelerator(_T("Edit box commit"),Edit_Box_Commit));
|
entry.push_back(Hotkeys.GetAccelerator(_T("Edit box commit"),Edit_Box_Commit));
|
||||||
|
|
||||||
// Medusa
|
// Medusa
|
||||||
bool medusaPlay = Options.AsBool(_T("Audio Medusa Timing Hotkeys"));
|
bool medusaPlay = OPT_GET("Audio/Medusa Timing Hotkeys")->GetBool();
|
||||||
if (medusaPlay && audioBox->audioDisplay->loaded) {
|
if (medusaPlay && audioBox->audioDisplay->loaded) {
|
||||||
entry.push_back(Hotkeys.GetAccelerator(_T("Audio Medusa Play"),Medusa_Play));
|
entry.push_back(Hotkeys.GetAccelerator(_T("Audio Medusa Play"),Medusa_Play));
|
||||||
entry.push_back(Hotkeys.GetAccelerator(_T("Audio Medusa Stop"),Medusa_Stop));
|
entry.push_back(Hotkeys.GetAccelerator(_T("Audio Medusa Stop"),Medusa_Stop));
|
||||||
|
|
|
@ -295,7 +295,7 @@ private:
|
||||||
void OnOpenVideoDetails (wxCommandEvent &event);
|
void OnOpenVideoDetails (wxCommandEvent &event);
|
||||||
void OnOpenASSDraw (wxCommandEvent &event);
|
void OnOpenASSDraw (wxCommandEvent &event);
|
||||||
|
|
||||||
void OnOpenOptions (wxCommandEvent &event);
|
void OnOpenPreferences (wxCommandEvent &event);
|
||||||
void OnGridEvent (wxCommandEvent &event);
|
void OnGridEvent (wxCommandEvent &event);
|
||||||
|
|
||||||
void OnOpenAutomation (wxCommandEvent &event);
|
void OnOpenAutomation (wxCommandEvent &event);
|
||||||
|
|
|
@ -57,6 +57,7 @@
|
||||||
#include "auto4_base.h"
|
#include "auto4_base.h"
|
||||||
#endif
|
#endif
|
||||||
#include "charset_conv.h"
|
#include "charset_conv.h"
|
||||||
|
#include "compat.h"
|
||||||
#include "dialog_about.h"
|
#include "dialog_about.h"
|
||||||
#include "dialog_attachments.h"
|
#include "dialog_attachments.h"
|
||||||
#include "dialog_automation.h"
|
#include "dialog_automation.h"
|
||||||
|
@ -65,7 +66,6 @@
|
||||||
#include "dialog_fonts_collector.h"
|
#include "dialog_fonts_collector.h"
|
||||||
#include "dialog_jumpto.h"
|
#include "dialog_jumpto.h"
|
||||||
#include "dialog_kara_timing_copy.h"
|
#include "dialog_kara_timing_copy.h"
|
||||||
#include "dialog_options.h"
|
|
||||||
#include "dialog_progress.h"
|
#include "dialog_progress.h"
|
||||||
#include "dialog_properties.h"
|
#include "dialog_properties.h"
|
||||||
#include "dialog_resample.h"
|
#include "dialog_resample.h"
|
||||||
|
@ -80,10 +80,12 @@
|
||||||
#include "dialog_version_check.h"
|
#include "dialog_version_check.h"
|
||||||
#include "dialog_video_details.h"
|
#include "dialog_video_details.h"
|
||||||
#include "frame_main.h"
|
#include "frame_main.h"
|
||||||
|
#include "hotkeys.h"
|
||||||
#include "keyframe.h"
|
#include "keyframe.h"
|
||||||
#include "libresrc/libresrc.h"
|
#include "libresrc/libresrc.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
#include "preferences.h"
|
||||||
#include "standard_paths.h"
|
#include "standard_paths.h"
|
||||||
#include "subs_edit_box.h"
|
#include "subs_edit_box.h"
|
||||||
#include "subs_grid.h"
|
#include "subs_grid.h"
|
||||||
|
@ -192,7 +194,7 @@ BEGIN_EVENT_TABLE(FrameMain, wxFrame)
|
||||||
EVT_MENU(Menu_Tools_Resample, FrameMain::OnOpenResample)
|
EVT_MENU(Menu_Tools_Resample, FrameMain::OnOpenResample)
|
||||||
EVT_MENU(Menu_Tools_Timing_Processor, FrameMain::OnOpenTimingProcessor)
|
EVT_MENU(Menu_Tools_Timing_Processor, FrameMain::OnOpenTimingProcessor)
|
||||||
EVT_MENU(Menu_Tools_Kanji_Timer, FrameMain::OnOpenKanjiTimer)
|
EVT_MENU(Menu_Tools_Kanji_Timer, FrameMain::OnOpenKanjiTimer)
|
||||||
EVT_MENU(Menu_Tools_Options, FrameMain::OnOpenOptions)
|
EVT_MENU(Menu_Tools_Options, FrameMain::OnOpenPreferences)
|
||||||
EVT_MENU(Menu_Tools_ASSDraw, FrameMain::OnOpenASSDraw)
|
EVT_MENU(Menu_Tools_ASSDraw, FrameMain::OnOpenASSDraw)
|
||||||
|
|
||||||
EVT_MENU(Menu_Subs_Snap_Start_To_Video, FrameMain::OnSnapSubsStartToVid)
|
EVT_MENU(Menu_Subs_Snap_Start_To_Video, FrameMain::OnSnapSubsStartToVid)
|
||||||
|
@ -272,7 +274,7 @@ void FrameMain::RebuildRecentList(wxString listName,wxMenu *menu,int startID) {
|
||||||
// Rebuild
|
// Rebuild
|
||||||
int added = 0;
|
int added = 0;
|
||||||
wxString n;
|
wxString n;
|
||||||
wxArrayString entries = Options.GetRecentList(listName);
|
wxArrayString entries = lagi_MRU_wxAS(listName);
|
||||||
for (size_t i=0;i<entries.Count();i++) {
|
for (size_t i=0;i<entries.Count();i++) {
|
||||||
n = wxString::Format(_T("%i"),i+1);
|
n = wxString::Format(_T("%i"),i+1);
|
||||||
if (i < 9) n = _T("&") + n;
|
if (i < 9) n = _T("&") + n;
|
||||||
|
@ -299,7 +301,7 @@ void FrameMain::OnMenuOpen (wxMenuEvent &event) {
|
||||||
// File menu
|
// File menu
|
||||||
if (curMenu == fileMenu) {
|
if (curMenu == fileMenu) {
|
||||||
// Rebuild recent
|
// Rebuild recent
|
||||||
RebuildRecentList(_T("Recent sub"),RecentSubs,Menu_File_Recent);
|
RebuildRecentList(_T("Subtitle"),RecentSubs,Menu_File_Recent);
|
||||||
|
|
||||||
MenuBar->Enable(Menu_File_Open_Subtitles_From_Video,VideoContext::Get()->HasSubtitles());
|
MenuBar->Enable(Menu_File_Open_Subtitles_From_Video,VideoContext::Get()->HasSubtitles());
|
||||||
}
|
}
|
||||||
|
@ -321,7 +323,7 @@ void FrameMain::OnMenuOpen (wxMenuEvent &event) {
|
||||||
else if (showAudio && showVideo) MenuBar->Check(Menu_View_Standard,true);
|
else if (showAudio && showVideo) MenuBar->Check(Menu_View_Standard,true);
|
||||||
else MenuBar->Check(Menu_View_Audio,true);
|
else MenuBar->Check(Menu_View_Audio,true);
|
||||||
|
|
||||||
MenuBar->Check(Options.AsInt(L"Grid hide overrides") + Menu_View_FullTags, true);
|
MenuBar->Check(OPT_GET("Subtitle/Grid/Hide Overrides")->GetInt() + Menu_View_FullTags, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Video menu
|
// Video menu
|
||||||
|
@ -368,12 +370,12 @@ void FrameMain::OnMenuOpen (wxMenuEvent &event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set overscan mask
|
// Set overscan mask
|
||||||
MenuBar->Check(Menu_Video_Overscan,Options.AsBool(_T("Show Overscan Mask")));
|
MenuBar->Check(Menu_Video_Overscan,OPT_GET("Video/Overscan Mask")->GetBool());
|
||||||
|
|
||||||
// Rebuild recent lists
|
// Rebuild recent lists
|
||||||
RebuildRecentList(_T("Recent vid"),RecentVids,Menu_Video_Recent);
|
RebuildRecentList(_T("Video"),RecentVids,Menu_Video_Recent);
|
||||||
RebuildRecentList(_T("Recent timecodes"),RecentTimecodes,Menu_Timecodes_Recent);
|
RebuildRecentList(_T("Timecodes"),RecentTimecodes,Menu_Timecodes_Recent);
|
||||||
RebuildRecentList(_T("Recent Keyframes"),RecentKeyframes,Menu_Keyframes_Recent);
|
RebuildRecentList(_T("Keyframes"),RecentKeyframes,Menu_Keyframes_Recent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Audio menu
|
// Audio menu
|
||||||
|
@ -385,7 +387,7 @@ void FrameMain::OnMenuOpen (wxMenuEvent &event) {
|
||||||
MenuBar->Enable(Menu_Audio_Close,state);
|
MenuBar->Enable(Menu_Audio_Close,state);
|
||||||
|
|
||||||
// Rebuild recent
|
// Rebuild recent
|
||||||
RebuildRecentList(_T("Recent aud"),RecentAuds,Menu_Audio_Recent);
|
RebuildRecentList(_T("Audio"),RecentAuds,Menu_Audio_Recent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Subtitles menu
|
// Subtitles menu
|
||||||
|
@ -534,8 +536,7 @@ int FrameMain::AddMacroMenuItems(wxMenu *menu, const std::vector<Automation4::Fe
|
||||||
///
|
///
|
||||||
void FrameMain::OnOpenRecentSubs(wxCommandEvent &event) {
|
void FrameMain::OnOpenRecentSubs(wxCommandEvent &event) {
|
||||||
int number = event.GetId()-Menu_File_Recent;
|
int number = event.GetId()-Menu_File_Recent;
|
||||||
wxString key = _T("Recent sub #") + wxString::Format(_T("%i"),number+1);
|
LoadSubtitles(AegisubApp::Get()->mru->GetEntry("Subtitle", number));
|
||||||
LoadSubtitles(Options.AsText(key));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -545,8 +546,7 @@ void FrameMain::OnOpenRecentSubs(wxCommandEvent &event) {
|
||||||
///
|
///
|
||||||
void FrameMain::OnOpenRecentVideo(wxCommandEvent &event) {
|
void FrameMain::OnOpenRecentVideo(wxCommandEvent &event) {
|
||||||
int number = event.GetId()-Menu_Video_Recent;
|
int number = event.GetId()-Menu_Video_Recent;
|
||||||
wxString key = _T("Recent vid #") + wxString::Format(_T("%i"),number+1);
|
LoadSubtitles(AegisubApp::Get()->mru->GetEntry("Video", number));
|
||||||
LoadVideo(Options.AsText(key));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -556,8 +556,7 @@ void FrameMain::OnOpenRecentVideo(wxCommandEvent &event) {
|
||||||
///
|
///
|
||||||
void FrameMain::OnOpenRecentTimecodes(wxCommandEvent &event) {
|
void FrameMain::OnOpenRecentTimecodes(wxCommandEvent &event) {
|
||||||
int number = event.GetId()-Menu_Timecodes_Recent;
|
int number = event.GetId()-Menu_Timecodes_Recent;
|
||||||
wxString key = _T("Recent timecodes #") + wxString::Format(_T("%i"),number+1);
|
LoadSubtitles(AegisubApp::Get()->mru->GetEntry("Timecodes", number));
|
||||||
LoadVFR(Options.AsText(key));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -567,8 +566,7 @@ void FrameMain::OnOpenRecentTimecodes(wxCommandEvent &event) {
|
||||||
///
|
///
|
||||||
void FrameMain::OnOpenRecentKeyframes(wxCommandEvent &event) {
|
void FrameMain::OnOpenRecentKeyframes(wxCommandEvent &event) {
|
||||||
int number = event.GetId()-Menu_Keyframes_Recent;
|
int number = event.GetId()-Menu_Keyframes_Recent;
|
||||||
wxString key = _T("Recent Keyframes #") + wxString::Format(_T("%i"),number+1);
|
LoadSubtitles(AegisubApp::Get()->mru->GetEntry("Keyframes", number));
|
||||||
KeyFrameFile::Load(Options.AsText(key));
|
|
||||||
videoBox->videoSlider->Refresh();
|
videoBox->videoSlider->Refresh();
|
||||||
audioBox->audioDisplay->Update();
|
audioBox->audioDisplay->Update();
|
||||||
Refresh();
|
Refresh();
|
||||||
|
@ -581,8 +579,7 @@ void FrameMain::OnOpenRecentKeyframes(wxCommandEvent &event) {
|
||||||
///
|
///
|
||||||
void FrameMain::OnOpenRecentAudio(wxCommandEvent &event) {
|
void FrameMain::OnOpenRecentAudio(wxCommandEvent &event) {
|
||||||
int number = event.GetId()-Menu_Audio_Recent;
|
int number = event.GetId()-Menu_Audio_Recent;
|
||||||
wxString key = _T("Recent aud #") + wxString::Format(_T("%i"),number+1);
|
LoadSubtitles(AegisubApp::Get()->mru->GetEntry("Audio", number));
|
||||||
LoadAudio(Options.AsText(key));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -706,14 +703,13 @@ void FrameMain::OnVideoPlay(wxCommandEvent &event) {
|
||||||
/// @param event
|
/// @param event
|
||||||
///
|
///
|
||||||
void FrameMain::OnOpenVideo(wxCommandEvent& WXUNUSED(event)) {
|
void FrameMain::OnOpenVideo(wxCommandEvent& WXUNUSED(event)) {
|
||||||
wxString path = Options.AsText(_T("Last open video path"));
|
wxString path = lagi_wxString(OPT_GET("Path/Last/Video")->GetString());
|
||||||
wxString str = wxString(_("Video Formats")) + _T(" (*.avi,*.mkv,*.mp4,*.avs,*.d2v,*.ogm,*.mpeg,*.mpg,*.vob,*.mov)|*.avi;*.avs;*.d2v;*.mkv;*.ogm;*.mp4;*.mpeg;*.mpg;*.vob;*.mov|")
|
wxString str = wxString(_("Video Formats")) + _T(" (*.avi,*.mkv,*.mp4,*.avs,*.d2v,*.ogm,*.mpeg,*.mpg,*.vob,*.mov)|*.avi;*.avs;*.d2v;*.mkv;*.ogm;*.mp4;*.mpeg;*.mpg;*.vob;*.mov|")
|
||||||
+ _("All Files") + _T(" (*.*)|*.*");
|
+ _("All Files") + _T(" (*.*)|*.*");
|
||||||
wxString filename = wxFileSelector(_("Open video file"),path,_T(""),_T(""),str,wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
wxString filename = wxFileSelector(_("Open video file"),path,_T(""),_T(""),str,wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
||||||
if (!filename.empty()) {
|
if (!filename.empty()) {
|
||||||
LoadVideo(filename);
|
LoadVideo(filename);
|
||||||
Options.SetText(_T("Last open video path"), filename);
|
OPT_SET("Path/Last/Video")->SetString(STD_STR(filename));
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -732,15 +728,14 @@ void FrameMain::OnCloseVideo(wxCommandEvent& WXUNUSED(event)) {
|
||||||
/// @param event
|
/// @param event
|
||||||
///
|
///
|
||||||
void FrameMain::OnOpenAudio (wxCommandEvent& WXUNUSED(event)) {
|
void FrameMain::OnOpenAudio (wxCommandEvent& WXUNUSED(event)) {
|
||||||
wxString path = Options.AsText(_T("Last open audio path"));
|
wxString path = lagi_wxString(OPT_GET("Path/Last/Audio")->GetString());
|
||||||
wxString str = wxString(_("Audio Formats")) + _T(" (*.wav,*.mp3,*.ogg,*.flac,*.mp4,*.ac3,*.aac,*.mka,*.m4a,*.w64)|*.wav;*.mp3;*.ogg;*.flac;*.mp4;*.ac3;*.aac;*.mka;*.m4a;*.w64|")
|
wxString str = wxString(_("Audio Formats")) + _T(" (*.wav,*.mp3,*.ogg,*.flac,*.mp4,*.ac3,*.aac,*.mka,*.m4a,*.w64)|*.wav;*.mp3;*.ogg;*.flac;*.mp4;*.ac3;*.aac;*.mka;*.m4a;*.w64|")
|
||||||
+ _("Video Formats") + _T(" (*.avi,*.mkv,*.ogm,*.mpg,*.mpeg)|*.avi;*.mkv;*.ogm;*.mp4;*.mpeg;*.mpg|")
|
+ _("Video Formats") + _T(" (*.avi,*.mkv,*.ogm,*.mpg,*.mpeg)|*.avi;*.mkv;*.ogm;*.mp4;*.mpeg;*.mpg|")
|
||||||
+ _("All files") + _T(" (*.*)|*.*");
|
+ _("All files") + _T(" (*.*)|*.*");
|
||||||
wxString filename = wxFileSelector(_("Open audio file"),path,_T(""),_T(""),str,wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
wxString filename = wxFileSelector(_("Open audio file"),path,_T(""),_T(""),str,wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
||||||
if (!filename.empty()) {
|
if (!filename.empty()) {
|
||||||
LoadAudio(filename);
|
LoadAudio(filename);
|
||||||
Options.SetText(_T("Last open audio path"), filename);
|
OPT_SET("Path/Last/Audio")->SetString(STD_STR(filename));
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -785,13 +780,12 @@ void FrameMain::OnOpenDummyNoiseAudio (wxCommandEvent& WXUNUSED(event)) {
|
||||||
/// @param event
|
/// @param event
|
||||||
///
|
///
|
||||||
void FrameMain::OnOpenSubtitles(wxCommandEvent& WXUNUSED(event)) {
|
void FrameMain::OnOpenSubtitles(wxCommandEvent& WXUNUSED(event)) {
|
||||||
wxString path = Options.AsText(_T("Last open subtitles path"));
|
wxString path = lagi_wxString(OPT_GET("Path/Last/Subtitles")->GetString());
|
||||||
wxString filename = wxFileSelector(_("Open subtitles file"),path,_T(""),_T(""),AssFile::GetWildcardList(0),wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
wxString filename = wxFileSelector(_("Open subtitles file"),path,_T(""),_T(""),AssFile::GetWildcardList(0),wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
||||||
if (!filename.empty()) {
|
if (!filename.empty()) {
|
||||||
LoadSubtitles(filename);
|
LoadSubtitles(filename);
|
||||||
wxFileName filepath(filename);
|
wxFileName filepath(filename);
|
||||||
Options.SetText(_T("Last open subtitles path"), filepath.GetPath());
|
OPT_SET("Path/Last/Subtitles")->SetString(STD_STR(filepath.GetPath()));
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -803,7 +797,7 @@ void FrameMain::OnOpenSubtitles(wxCommandEvent& WXUNUSED(event)) {
|
||||||
void FrameMain::OnOpenSubtitlesCharset(wxCommandEvent& WXUNUSED(event)) {
|
void FrameMain::OnOpenSubtitlesCharset(wxCommandEvent& WXUNUSED(event)) {
|
||||||
// Initialize charsets
|
// Initialize charsets
|
||||||
wxArrayString choices = AegisubCSConv::GetEncodingsList();
|
wxArrayString choices = AegisubCSConv::GetEncodingsList();
|
||||||
wxString path = Options.AsText(_T("Last open subtitles path"));
|
wxString path = lagi_wxString(OPT_GET("Path/Last/Subtitles")->GetString());
|
||||||
|
|
||||||
// Get options and load
|
// Get options and load
|
||||||
wxString filename = wxFileSelector(_("Open subtitles file"),path,_T(""),_T(""),AssFile::GetWildcardList(0),wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
wxString filename = wxFileSelector(_("Open subtitles file"),path,_T(""),_T(""),AssFile::GetWildcardList(0),wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
||||||
|
@ -812,8 +806,7 @@ void FrameMain::OnOpenSubtitlesCharset(wxCommandEvent& WXUNUSED(event)) {
|
||||||
if (!charset.empty()) {
|
if (!charset.empty()) {
|
||||||
LoadSubtitles(filename,charset);
|
LoadSubtitles(filename,charset);
|
||||||
}
|
}
|
||||||
Options.SetText(_T("Last open subtitles path"), filename);
|
OPT_SET("Path/Last/Subtitles")->SetString(STD_STR(filename));
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -865,7 +858,7 @@ void FrameMain::OnNewSubtitles(wxCommandEvent& WXUNUSED(event)) {
|
||||||
///
|
///
|
||||||
void FrameMain::OnExportSubtitles(wxCommandEvent & WXUNUSED(event)) {
|
void FrameMain::OnExportSubtitles(wxCommandEvent & WXUNUSED(event)) {
|
||||||
#ifdef WITH_AUTOMATION
|
#ifdef WITH_AUTOMATION
|
||||||
int autoreload = Options.AsInt(_T("Automation Autoreload Mode"));
|
int autoreload = OPT_GET("Automation/Autoreload Mode")->GetInt();
|
||||||
if (autoreload & 1) {
|
if (autoreload & 1) {
|
||||||
// Local scripts
|
// Local scripts
|
||||||
const std::vector<Automation4::Script*> scripts = local_scripts->GetScripts();
|
const std::vector<Automation4::Script*> scripts = local_scripts->GetScripts();
|
||||||
|
@ -897,14 +890,13 @@ void FrameMain::OnExportSubtitles(wxCommandEvent & WXUNUSED(event)) {
|
||||||
/// @param event
|
/// @param event
|
||||||
///
|
///
|
||||||
void FrameMain::OnOpenVFR(wxCommandEvent &event) {
|
void FrameMain::OnOpenVFR(wxCommandEvent &event) {
|
||||||
wxString path = Options.AsText(_T("Last open timecodes path"));
|
wxString path = lagi_wxString(OPT_GET("Path/Last/Timecodes")->GetString());
|
||||||
wxString str = wxString(_("All Supported Types")) + _T("(*.txt)|*.txt|")
|
wxString str = wxString(_("All Supported Types")) + _T("(*.txt)|*.txt|")
|
||||||
+ _("All Files") + _T(" (*.*)|*.*");
|
+ _("All Files") + _T(" (*.*)|*.*");
|
||||||
wxString filename = wxFileSelector(_("Open timecodes file"),path,_T(""),_T(""),str,wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
wxString filename = wxFileSelector(_("Open timecodes file"),path,_T(""),_T(""),str,wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
||||||
if (!filename.empty()) {
|
if (!filename.empty()) {
|
||||||
LoadVFR(filename);
|
LoadVFR(filename);
|
||||||
Options.SetText(_T("Last open timecodes path"), filename);
|
OPT_SET("Path/Last/Timecodes")->SetString(STD_STR(filename));
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -914,14 +906,13 @@ void FrameMain::OnOpenVFR(wxCommandEvent &event) {
|
||||||
/// @param event
|
/// @param event
|
||||||
///
|
///
|
||||||
void FrameMain::OnSaveVFR(wxCommandEvent &event) {
|
void FrameMain::OnSaveVFR(wxCommandEvent &event) {
|
||||||
wxString path = Options.AsText(_T("Last open timecodes path"));
|
wxString path = lagi_wxString(OPT_GET("Path/Last/Timecodes")->GetString());
|
||||||
wxString str = wxString(_("All Supported Types")) + _T("(*.txt)|*.txt|")
|
wxString str = wxString(_("All Supported Types")) + _T("(*.txt)|*.txt|")
|
||||||
+ _("All Files") + _T(" (*.*)|*.*");
|
+ _("All Files") + _T(" (*.*)|*.*");
|
||||||
wxString filename = wxFileSelector(_("Save timecodes file"),path,_T(""),_T(""),str,wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
|
wxString filename = wxFileSelector(_("Save timecodes file"),path,_T(""),_T(""),str,wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
|
||||||
if (!filename.empty()) {
|
if (!filename.empty()) {
|
||||||
SaveVFR(filename);
|
SaveVFR(filename);
|
||||||
Options.SetText(_T("Last open timecodes path"), filename);
|
OPT_SET("Path/Last/Timecodes")->SetString(STD_STR(filename));
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -943,11 +934,10 @@ void FrameMain::OnCloseVFR(wxCommandEvent &event) {
|
||||||
///
|
///
|
||||||
void FrameMain::OnOpenKeyframes (wxCommandEvent &event) {
|
void FrameMain::OnOpenKeyframes (wxCommandEvent &event) {
|
||||||
// Pick file
|
// Pick file
|
||||||
wxString path = Options.AsText(_T("Last open keyframes path"));
|
wxString path = lagi_wxString(OPT_GET("Path/Last/Keyframes")->GetString());
|
||||||
wxString filename = wxFileSelector(_T("Select the keyframes file to open"),path,_T(""),_T(".txt"),_T("All supported formats (*.txt, *.pass, *.stats, *.log)|*.txt;*.pass;*.stats;*.log|All files (*.*)|*.*"),wxFD_FILE_MUST_EXIST | wxFD_OPEN);
|
wxString filename = wxFileSelector(_T("Select the keyframes file to open"),path,_T(""),_T(".txt"),_T("All supported formats (*.txt, *.pass, *.stats, *.log)|*.txt;*.pass;*.stats;*.log|All files (*.*)|*.*"),wxFD_FILE_MUST_EXIST | wxFD_OPEN);
|
||||||
if (filename.IsEmpty()) return;
|
if (filename.IsEmpty()) return;
|
||||||
Options.SetText(_T("Last open keyframes path"),filename);
|
OPT_SET("Path/Last/Keyframes")->SetString(STD_STR(filename));
|
||||||
Options.Save();
|
|
||||||
|
|
||||||
// Load
|
// Load
|
||||||
KeyFrameFile::Load(filename);
|
KeyFrameFile::Load(filename);
|
||||||
|
@ -976,11 +966,10 @@ void FrameMain::OnCloseKeyframes (wxCommandEvent &event) {
|
||||||
///
|
///
|
||||||
void FrameMain::OnSaveKeyframes (wxCommandEvent &event) {
|
void FrameMain::OnSaveKeyframes (wxCommandEvent &event) {
|
||||||
// Pick file
|
// Pick file
|
||||||
wxString path = Options.AsText(_T("Last open keyframes path"));
|
wxString path = lagi_wxString(OPT_GET("Path/Last/Keyframes")->GetString());
|
||||||
wxString filename = wxFileSelector(_T("Select the Keyframes file to open"),path,_T(""),_T("*.key.txt"),_T("Text files (*.txt)|*.txt"),wxFD_OVERWRITE_PROMPT | wxFD_SAVE);
|
wxString filename = wxFileSelector(_T("Select the Keyframes file to open"),path,_T(""),_T("*.key.txt"),_T("Text files (*.txt)|*.txt"),wxFD_OVERWRITE_PROMPT | wxFD_SAVE);
|
||||||
if (filename.IsEmpty()) return;
|
if (filename.IsEmpty()) return;
|
||||||
Options.SetText(_T("Last open keyframes path"),filename);
|
OPT_SET("Path/Last/Keyframes")->SetString(STD_STR(filename));
|
||||||
Options.Save();
|
|
||||||
|
|
||||||
// Save
|
// Save
|
||||||
KeyFrameFile::Save(filename);
|
KeyFrameFile::Save(filename);
|
||||||
|
@ -1067,8 +1056,7 @@ void FrameMain::OnDummyVideo (wxCommandEvent &event) {
|
||||||
/// @param event
|
/// @param event
|
||||||
///
|
///
|
||||||
void FrameMain::OnOverscan (wxCommandEvent &event) {
|
void FrameMain::OnOverscan (wxCommandEvent &event) {
|
||||||
Options.SetBool(_T("Show overscan mask"),event.IsChecked());
|
OPT_SET("Video/Overscan Mask")->SetBool(event.IsChecked());
|
||||||
Options.Save();
|
|
||||||
VideoContext::Get()->Stop();
|
VideoContext::Get()->Stop();
|
||||||
videoBox->videoDisplay->Render();
|
videoBox->videoDisplay->Render();
|
||||||
}
|
}
|
||||||
|
@ -1217,13 +1205,13 @@ void FrameMain::OnOpenKanjiTimer (wxCommandEvent &event) {
|
||||||
/// @brief Open Options dialog
|
/// @brief Open Options dialog
|
||||||
/// @param event
|
/// @param event
|
||||||
///
|
///
|
||||||
void FrameMain::OnOpenOptions (wxCommandEvent &event) {
|
void FrameMain::OnOpenPreferences (wxCommandEvent &event) {
|
||||||
try {
|
try {
|
||||||
DialogOptions options(this);
|
Preferences pref(this);
|
||||||
options.ShowModal();
|
pref.ShowModal();
|
||||||
}
|
|
||||||
catch (const wxChar *e) {
|
} catch (agi::Exception& e) {
|
||||||
wxLogError(e);
|
wxPrintf("Caught agi::Exception: %s -> %s\n", e.GetName(), e.GetMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1615,8 +1603,7 @@ void FrameMain::OnCloseWindow (wxCloseEvent &event) {
|
||||||
int result = TryToCloseSubs(canVeto);
|
int result = TryToCloseSubs(canVeto);
|
||||||
|
|
||||||
// Store maximization state
|
// Store maximization state
|
||||||
Options.SetBool(_T("Maximized"),IsMaximized());
|
OPT_SET("App/Maximized")->SetBool(IsMaximized());
|
||||||
Options.Save();
|
|
||||||
|
|
||||||
// Abort/destroy
|
// Abort/destroy
|
||||||
if (canVeto) {
|
if (canVeto) {
|
||||||
|
@ -1738,7 +1725,7 @@ void FrameMain::OnAutoSave(wxTimerEvent &event) {
|
||||||
if (AssFile::top->loaded) {
|
if (AssFile::top->loaded) {
|
||||||
// Set path
|
// Set path
|
||||||
wxFileName origfile(AssFile::top->filename);
|
wxFileName origfile(AssFile::top->filename);
|
||||||
wxString path = Options.AsText(_T("Auto save path"));
|
wxString path = lagi_wxString(OPT_GET("Path/Auto/Save")->GetString());
|
||||||
if (path.IsEmpty()) path = origfile.GetPath();
|
if (path.IsEmpty()) path = origfile.GetPath();
|
||||||
wxFileName dstpath(path);
|
wxFileName dstpath(path);
|
||||||
if (!dstpath.IsAbsolute()) path = StandardPaths::DecodePathMaybeRelative(path, _T("?user/"));
|
if (!dstpath.IsAbsolute()) path = StandardPaths::DecodePathMaybeRelative(path, _T("?user/"));
|
||||||
|
@ -1848,7 +1835,7 @@ void FrameMain::OnNextLine(wxCommandEvent &event) {
|
||||||
|
|
||||||
/// @brief Cycle through tag hiding modes
|
/// @brief Cycle through tag hiding modes
|
||||||
void FrameMain::OnToggleTags(wxCommandEvent &) {
|
void FrameMain::OnToggleTags(wxCommandEvent &) {
|
||||||
int tagMode = Options.AsInt(_T("Grid hide overrides"));
|
int tagMode = OPT_GET("Subtitle/Grid/Hide Overrides")->GetInt();
|
||||||
|
|
||||||
// Cycle to next
|
// Cycle to next
|
||||||
tagMode = (tagMode+1)%3;
|
tagMode = (tagMode+1)%3;
|
||||||
|
@ -1861,15 +1848,13 @@ void FrameMain::OnToggleTags(wxCommandEvent &) {
|
||||||
StatusTimeout(message,10000);
|
StatusTimeout(message,10000);
|
||||||
|
|
||||||
// Set option
|
// Set option
|
||||||
Options.SetInt(_T("Grid hide overrides"),tagMode);
|
OPT_SET("Subtitle/Grid/Hide Overrides")->SetInt(tagMode);
|
||||||
Options.Save();
|
|
||||||
|
|
||||||
// Refresh grid
|
// Refresh grid
|
||||||
SubsBox->Refresh(false);
|
SubsBox->Refresh(false);
|
||||||
}
|
}
|
||||||
void FrameMain::OnSetTags(wxCommandEvent &event) {
|
void FrameMain::OnSetTags(wxCommandEvent &event) {
|
||||||
Options.SetInt(_T("Grid hide overrides"), event.GetId() - Menu_View_FullTags);
|
OPT_SET("Subtitle/Grid/Hide Overrides")->SetInt(event.GetId() - Menu_View_FullTags);
|
||||||
Options.Save();
|
|
||||||
SubsBox->Refresh(false);
|
SubsBox->Refresh(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1914,8 +1899,7 @@ void FrameMain::OnChooseLanguage (wxCommandEvent &event) {
|
||||||
// Is OK?
|
// Is OK?
|
||||||
if (newCode != -1) {
|
if (newCode != -1) {
|
||||||
// Set code
|
// Set code
|
||||||
Options.SetInt(_T("Locale Code"),newCode);
|
OPT_SET("App/Locale")->SetInt(newCode);
|
||||||
Options.Save();
|
|
||||||
|
|
||||||
// Language actually changed?
|
// Language actually changed?
|
||||||
if (newCode != old) {
|
if (newCode != old) {
|
||||||
|
|
|
@ -39,7 +39,9 @@
|
||||||
// Includes
|
// Includes
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "compat.h"
|
||||||
#include "hilimod_textctrl.h"
|
#include "hilimod_textctrl.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -111,7 +113,7 @@ void HiliModTextCtrl::Modified() {
|
||||||
// Different from original
|
// Different from original
|
||||||
if (!isModified && !match) {
|
if (!isModified && !match) {
|
||||||
isModified = true;
|
isModified = true;
|
||||||
SetBackgroundColour(Options.AsColour(_T("Edit Box Need Enter Background")));
|
SetBackgroundColour(lagi_wxColour(OPT_GET("Colour/Background/Modified")->GetColour()));
|
||||||
Refresh(false);
|
Refresh(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,9 @@
|
||||||
#include <wx/msgdlg.h>
|
#include <wx/msgdlg.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "compat.h"
|
||||||
#include "keyframe.h"
|
#include "keyframe.h"
|
||||||
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "text_file_reader.h"
|
#include "text_file_reader.h"
|
||||||
#include "text_file_writer.h"
|
#include "text_file_writer.h"
|
||||||
|
@ -74,7 +76,7 @@ void KeyFrameFile::Load(wxString filename) {
|
||||||
VideoContext::Get()->SetKeyFramesName(filename);
|
VideoContext::Get()->SetKeyFramesName(filename);
|
||||||
|
|
||||||
// Add to recent
|
// Add to recent
|
||||||
Options.AddToRecentList(filename,_T("Recent keyframes"));
|
AegisubApp::Get()->mru->Add("Keyframes", STD_STR(filename));
|
||||||
}
|
}
|
||||||
// Fail
|
// Fail
|
||||||
catch (const wchar_t *error) {
|
catch (const wchar_t *error) {
|
||||||
|
@ -106,7 +108,7 @@ void KeyFrameFile::Save(wxString filename) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add to recent
|
// Add to recent
|
||||||
Options.AddToRecentList(filename,_T("Recent keyframes"));
|
AegisubApp::Get()->mru->Add("Keyframes", STD_STR(filename));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,10 +9,10 @@ BUILT_SOURCES = bitmap.cpp default_config.cpp
|
||||||
bitmap.cpp: ../../tools/common-respack
|
bitmap.cpp: ../../tools/common-respack
|
||||||
../../tools/common-respack bitmap.cpp ../bitmaps/16 ../bitmaps/24 ../bitmaps/misc/splash.png ../bitmaps/misc/wxicon.png
|
../../tools/common-respack bitmap.cpp ../bitmaps/16 ../bitmaps/24 ../bitmaps/misc/splash.png ../bitmaps/misc/wxicon.png
|
||||||
|
|
||||||
default_config.cpp: ../../tools/common-respack
|
default_config.cpp: ../../tools/common-respack *.json
|
||||||
../../tools/common-respack default_config.cpp ./default_mru.json
|
../../tools/common-respack default_config.cpp ./default_mru.json ./default_config.json
|
||||||
|
|
||||||
EXTRA_DIST = default_mru.json
|
EXTRA_DIST = *.json
|
||||||
|
|
||||||
CLEANFILES= \
|
CLEANFILES= \
|
||||||
bitmap.cpp \
|
bitmap.cpp \
|
||||||
|
|
191
aegisub/src/libresrc/OLD_TO_NEW_OPTION_MAP.txt
Normal file
191
aegisub/src/libresrc/OLD_TO_NEW_OPTION_MAP.txt
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
Allow Ancient Avisynth Provider/Avisynth/Allow Ancient
|
||||||
|
Audio Alsa Device Player/Audio/ALSA/Device
|
||||||
|
Audio Autocommit Audio/Auto/Commit
|
||||||
|
Audio Autofocus Audio/Auto/Focus
|
||||||
|
Audio Autoscroll Audio/Auto/Scroll
|
||||||
|
Audio Background Colour/Audio Display/Background/Background
|
||||||
|
Audio Cache Audio/Cache/Type
|
||||||
|
Audio Disable PCM Provider Provider/Audio/PCM/Disable
|
||||||
|
Audio Display Height Audio/Display Height
|
||||||
|
Audio Downmixer Audio/Downmixer
|
||||||
|
Audio Draw Cursor Time Audio/Display/Draw/Cursor Time
|
||||||
|
Audio Draw Keyframes Audio/Display/Draw/Keyframes
|
||||||
|
Audio Draw Secondary Lines Audio/Display/Draw/Secondary Lines
|
||||||
|
Audio Draw Selection Background Audio/Display/Draw/Selection Background
|
||||||
|
Audio Draw Timeline Audio/Display/Draw/Timeline
|
||||||
|
Audio Draw Video Position Audio/Display/Draw/Video Position
|
||||||
|
Audio dsound buffer latency Player/Audio/DirectSound/Buffer Latency
|
||||||
|
Audio dsound buffer length Player/Audio/DirectSound/Buffer Length
|
||||||
|
Audio grab times on select Audio/Grab Times on Select
|
||||||
|
Audio HD Cache Location Audio/Cache/HD/Location
|
||||||
|
Audio HD Cache Name Audio/Cache/HD/Name
|
||||||
|
Audio Inactive Lines Display Mode Audio/Inactive Lines Display Mode
|
||||||
|
Audio Lead in Audio/Lead/IN
|
||||||
|
Audio Lead out Audio/Lead/OUT
|
||||||
|
Audio Line boundaries Thickness Audio/Line Boundaries Thickness
|
||||||
|
Audio Line boundary end Colour/Audio Display/Line boundary End
|
||||||
|
Audio Line boundary inactive line Colour/Audio Display/Line Boundary Inactive Line
|
||||||
|
Audio Line boundary start Colour/Audio Display/Line boundary Start
|
||||||
|
Audio Link Audio/Link
|
||||||
|
Audio lock scroll on cursor Audio/Lock Scroll on Cursor
|
||||||
|
Audio Medusa Timing Hotkeys Audio/Medusa Timing Hotkeys
|
||||||
|
Audio Next Line on Commit Audio/Next Line on Commit
|
||||||
|
Audio OSS Device Audio/OSS/Device
|
||||||
|
Audio Play Cursor Colour/Audio Display/Play Cursor
|
||||||
|
Audio player Audio/Player
|
||||||
|
Audio Plays When Stepping Video Audio/Plays When Stepping
|
||||||
|
Audio PortAudio Device Player/Audio/PortAudio/Device
|
||||||
|
Audio provider Audio/Provider
|
||||||
|
Audio Sample Rate Provider/Audio/AVS/Sample Rate
|
||||||
|
Audio Seconds Boundaries Colour/Audio Display/Seconds Boundaries
|
||||||
|
Audio Selection Background Colour/Audio Display/Background/Background
|
||||||
|
Audio Selection Background Modified Colour/Audio Display/Background/Selection Modified
|
||||||
|
Audio snap to keyframes Audio/Display/Snap/Keyframes
|
||||||
|
Audio snap to other lines Audio/Display/Snap/Other Lines
|
||||||
|
Audio Spectrum Audio/Spectrum
|
||||||
|
Audio Spectrum Cutoff Audio/Renderer/Spectrum/Cutoff
|
||||||
|
Audio Spectrum Memory Max Audio/Renderer/Spectrum/Memory Max
|
||||||
|
Audio Spectrum Quality Audio/Renderer/Spectrum/Quality
|
||||||
|
Audio Start Drag Sensitivity Audio/Start Drag Sensitivity
|
||||||
|
Audio Syllable boundaries Colour/Audio Display/Syllable Boundaries
|
||||||
|
Audio Syllable text Colour/Audio Display/Syllable Text
|
||||||
|
Audio Waveform Colour/Audio Display/Waveform
|
||||||
|
Audio Waveform Inactive Colour/Audio Display/Waveform Inactive
|
||||||
|
Audio Waveform Modified Colour/Audio Display/Waveform Modified
|
||||||
|
Audio Waveform Selected Colour/Audio Display/Waveform Selected
|
||||||
|
Audio Wheel Default To Zoom Audio/Wheel Default to Zoom
|
||||||
|
Auto backup App/Auto/Backup
|
||||||
|
Auto backup path Path/Auto/Backup
|
||||||
|
Auto check for updates App/Auto/Check For Updates
|
||||||
|
Auto save every seconds App/Auto/Save Every Seconds
|
||||||
|
Auto Save on Every Change App/Auto/Save on Every Change
|
||||||
|
Auto save path Path/Auto/Save
|
||||||
|
Autoload linked files App/Auto/Load Linked Files
|
||||||
|
Automation Autoload Path Path/Automation/Autoload
|
||||||
|
Automation Autoreload Mode Automation/Autoreload Mode
|
||||||
|
Automation Base Path Path/Automation/Base
|
||||||
|
Automation Include Path Path/Automation/Include
|
||||||
|
Automation Thread Priority Automation/Lua/Thread Priority
|
||||||
|
Automation Trace Level Automation/Trace Level
|
||||||
|
Avisynth MemoryMax Provider/Avisynth/Memory Max
|
||||||
|
Call tips enabled App/Call Tips
|
||||||
|
Color Picker Mode Tool/Colour Picker/Mode
|
||||||
|
Color Picker Recent Tool/Colour Picker/Recent
|
||||||
|
Colour/Subtitle/Syntax/Error Colour/Subtitle/Syntax/Background/Error
|
||||||
|
Detached Video Video/Detached/Enabled
|
||||||
|
Detached video last x Video/Detached/Last/X
|
||||||
|
Detached video last y Video/Detached/Last/Y
|
||||||
|
Detached video maximized Video/Detached/Maximized
|
||||||
|
Dictionaries path Path/Dictionary
|
||||||
|
Disable Dragging Times Audio/Display/Dragging Times
|
||||||
|
Edit Box Need Enter Background Color/Background/Modified
|
||||||
|
Edit Font Face Subtitle/Edit Box/Font Face
|
||||||
|
Edit Font Size Subtitle/Edit Box/Font Size
|
||||||
|
FFmpeg allow unsafe seeking Provider/Video/FFMpegSource/Unsafe Seeking
|
||||||
|
FFmpegSource always index all tracks Provider/FFmpegSource/Index All Tracks
|
||||||
|
FFmpegSource audio decoding error handling Provider/Audio/FFMpegSource/Decode Error Handling
|
||||||
|
FFmpegSource decoding threads Provider/Video/FFmpegSource/Decoding Threads
|
||||||
|
FFmpegSource log level Provider/FFmpegSource/Log Level
|
||||||
|
FFmpegSource max cache files Provider/FFmpegSource/Cache/Files
|
||||||
|
FFmpegSource max cache size Provider/FFmpegSource/Cache/Size
|
||||||
|
Find Affect Tool/Search Replace/Affect
|
||||||
|
Find Field Tool/Search Replace/Field
|
||||||
|
Find Match Case Tool/Search Replace/Match Case
|
||||||
|
Find RegExp Tool/Search Replace/RegExp
|
||||||
|
Find Update Video Tool/Search Replace/Video Update
|
||||||
|
Fonts Collector Action Tool/Fonts Collector/Action
|
||||||
|
Fonts Collector Destination Path/Fonts Collector Destination
|
||||||
|
Grid Active border Colour/Subtitle Grid/Active Border
|
||||||
|
Grid Allow Focus Subtitle/Grid/Focus Allow
|
||||||
|
Grid Background Colour/Subtitle Grid/Background/Background
|
||||||
|
Grid collision foreground Colour/Subtitle Grid/Collision
|
||||||
|
Grid Font Face Subtitle/Grid/Font Face
|
||||||
|
Grid font size Subtitle/Grid/Font Size
|
||||||
|
Grid Hide Overrides Subtitle/Grid/Hide Overrides
|
||||||
|
Grid hide overrides char Subtitle/Grid/Hide Overrides Char
|
||||||
|
Grid left column Colour/Subtitle Grid/Left Column
|
||||||
|
Grid lines Colour/Subtitle Grid/Lines
|
||||||
|
Grid selection background Colour/Subtitle Grid/Background/Selection
|
||||||
|
Grid selection foreground Colour/Subtitle Grid/Selection
|
||||||
|
Grid standard foreground Colour/Subtitle Grid/Standard
|
||||||
|
Highlight subs in frame Subtitle/Grid/Highlight Subtitles in Frame
|
||||||
|
Insert Mode on Time Boxes Subtitle/Time Edit/Insert Mode
|
||||||
|
kanji timer interpolation Tool/Kanji Timer/Interpolation
|
||||||
|
Last open audio path Path/Last/Audio
|
||||||
|
Last open automation path Path/Last/Automation
|
||||||
|
Last open keyframes path Path/Last/Keyframes
|
||||||
|
Last open subtitles path Path/Last/Subtitles
|
||||||
|
Last open timecodes path Path/Last/Timecodes
|
||||||
|
Last open video path Path/Last/Video
|
||||||
|
Link Time Boxes Commit Subtitle/Edit Box/Link Time Boxes Commit
|
||||||
|
Local config App/Local Config
|
||||||
|
Locale Code App/Locale
|
||||||
|
Maximized App/Maximized
|
||||||
|
Recent timecodes Timecodes
|
||||||
|
RGBAdjust Tool Tool/Colour Picker/RGBAdjust Tool
|
||||||
|
Save Charset App/Save Charset
|
||||||
|
Select Action Tool/Select/Action
|
||||||
|
Select Condition Tool/Select/Condition
|
||||||
|
Select Field Tool/Select/Field
|
||||||
|
Select Match case Tool/Select Lines/Match/Case
|
||||||
|
Select Match comments Tool/Select Lines/Match/Comment
|
||||||
|
Select Match dialogues Tool/Select Lines/Match/Dialogue
|
||||||
|
Select Mode Tool/Select/Mode
|
||||||
|
Select Text Tool/Select Lines/Text
|
||||||
|
Shift Times Affect Tool/Shift Times/Affect
|
||||||
|
Shift Times ByTime Tools/Shift Times/ByTime
|
||||||
|
Shift Times Direction Tools/Shift Times/Direction
|
||||||
|
Shift Times Length Tool/Shift Times/Length
|
||||||
|
Shift Times Type Tool/Shift Times/Type
|
||||||
|
Show keyframes on video slider Video/Slider/Show Keyframes
|
||||||
|
Show Overscan Mask Video/Overscan Mask
|
||||||
|
Show Splash App/Splash
|
||||||
|
Spell Checker Tool/Spell Checker/Backend
|
||||||
|
Spell checker Language Tool/Spell Checker/Language
|
||||||
|
Style editor preview background Colour/Style Editor/Background/Preview
|
||||||
|
Style editor preview text Tool/Style Editor/Preview Text
|
||||||
|
Subtitles provider Subtitle/Provider
|
||||||
|
Sync video with subs Video/Subtitle Sync
|
||||||
|
|
||||||
|
Syntax Highlight Brackets Colour/Subtitle/Syntax/Brackets
|
||||||
|
Syntax Highlight Enabled Subtitle/Highlight/Syntax
|
||||||
|
Syntax Highlight Error Syntax Highlight Error Background
|
||||||
|
Syntax Highlight Karaoke Template Colour/Subtitle/Syntax/Karaoke Template
|
||||||
|
Syntax Highlight Line Break Colour/Subtitle/Syntax/Line Break
|
||||||
|
Syntax Highlight Normal Colour/Subtitle/Syntax/Normal
|
||||||
|
Syntax Highlight Parameters Colour/Subtitle/Syntax/Parameters
|
||||||
|
Syntax Highlight Slashes Colour/Subtitle/Syntax/Slashes
|
||||||
|
Syntax Highlight Tags Colour/Subtitle/Syntax/Highlight Tags
|
||||||
|
Text actor separator Tool/Import/Text/Actor Separator
|
||||||
|
|
||||||
|
Text comment starter Tool/Import/Text/Comment Starter
|
||||||
|
Thesaurus Language Tool/Thesaurus/Language
|
||||||
|
Timing Default Duration Timing/Default Duration
|
||||||
|
Timing processor adjacent bias Tool/Timing Post Processor/Adjacent Bias
|
||||||
|
Timing processor adjacent thres Tool/Timing Post Processor/Threshold/Adjacent
|
||||||
|
Timing processor Enable adjacent Tool/Timing Post Processor/Enable/Adjacent
|
||||||
|
Timing processor Enable keyframe Tool/Timing Post Processor/Enable/Keyframe
|
||||||
|
Timing processor Enable lead-in Tool/Timing Post Processor/Enable/Lead/IN
|
||||||
|
Timing processor Enable lead-out Tool/Timing Post Processor/Enable/Lead/OUT
|
||||||
|
Timing processor key end after thres Tool/Timing Post Processor/Threshold/Key End After
|
||||||
|
Timing processor key end before thres Tool/Timing Post Processor/Threshold/Key End Before
|
||||||
|
Timing processor key start after thres Tool/Timing Post Processor/Threshold/Key Start After
|
||||||
|
Timing processor key start before thres Tool/Timing Post Processor/Threshold/Key Start Before
|
||||||
|
Timing processor Only Selection Tool/Timing Post Processor/Only Selection
|
||||||
|
Tips current Tool/Tip of the Day/Current
|
||||||
|
Tips enabled App/Tips
|
||||||
|
Undo levels Subtitle/Undo Levels
|
||||||
|
Updates Next Check Time Version/Next Check
|
||||||
|
Use nonstandard Milisecond Times App/Nonstandard Milisecond Times
|
||||||
|
Video Check Script Res Video/Check Script Res
|
||||||
|
Video Default Zoom Video/Default Zoom
|
||||||
|
Video Dummy Last Colour Colour/Video Dummy/Last Colour
|
||||||
|
Video Dummy Last FPS Video/Dummy/FPS
|
||||||
|
Video Dummy Last Height Video/Dummy/Last/Height
|
||||||
|
Video Dummy Last Length Video/Dummy/Last/Length
|
||||||
|
Video Dummy Last Width Video/Dummy/Last/Width
|
||||||
|
Video Dummy Pattern Video/Dummy/Pattern
|
||||||
|
Video Fast Jump Step Video/Slider/Fast Jump Step
|
||||||
|
Video provider Video/Provider
|
||||||
|
Video Screenshot Path Path/Screenshot
|
||||||
|
Video Visual Realtime Video/Visual Realtime
|
415
aegisub/src/libresrc/default_config.json
Normal file
415
aegisub/src/libresrc/default_config.json
Normal file
|
@ -0,0 +1,415 @@
|
||||||
|
{
|
||||||
|
"App" : {
|
||||||
|
"Auto" : {
|
||||||
|
"Backup" : true,
|
||||||
|
"Check For Updates" : -1,
|
||||||
|
"Load Linked Files" : 2,
|
||||||
|
"Save Every Seconds" : 60,
|
||||||
|
"Save on Every Change" : false
|
||||||
|
},
|
||||||
|
"Call Tips" : false,
|
||||||
|
"Local Config" : false,
|
||||||
|
"Locale" : -1,
|
||||||
|
"Maximized" : false,
|
||||||
|
"Nonstandard Milisecond Times" : false,
|
||||||
|
"Save Charset" : "UTF-8",
|
||||||
|
"Splash" : true,
|
||||||
|
"Tips" : false
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
"Audio" : {
|
||||||
|
"Auto" : {
|
||||||
|
"Commit" : false,
|
||||||
|
"Focus" : false,
|
||||||
|
"Scroll" : true
|
||||||
|
},
|
||||||
|
"Cache" : {
|
||||||
|
"HD" : {
|
||||||
|
"Location" : "default",
|
||||||
|
"Name" : "audio%02i.tmp"
|
||||||
|
},
|
||||||
|
"Type" : 1
|
||||||
|
},
|
||||||
|
"Display Height" : 200,
|
||||||
|
"Display" : {
|
||||||
|
"Dragging Times" : false,
|
||||||
|
"Draw" : {
|
||||||
|
"Cursor Time" : true,
|
||||||
|
"Keyframes" : true,
|
||||||
|
"Secondary Lines" : true,
|
||||||
|
"Selection Background" : true,
|
||||||
|
"Timeline" : true,
|
||||||
|
"Video Position" : false
|
||||||
|
},
|
||||||
|
"Snap" : {
|
||||||
|
"Keyframes" : false,
|
||||||
|
"Other Lines" : false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Downmixer" : "ConvertToMono",
|
||||||
|
"Grab Times on Select" : true,
|
||||||
|
"Inactive Lines Display Mode" : 1,
|
||||||
|
"Lead" : {
|
||||||
|
"IN" : 200,
|
||||||
|
"OUT" : 300
|
||||||
|
},
|
||||||
|
"Line Boundaries Thickness" : 2,
|
||||||
|
"Line Boundary Inactive Line" : "grey",
|
||||||
|
"Link" : true,
|
||||||
|
"Lock Scroll on Cursor" : false,
|
||||||
|
"Medusa Timing Hotkeys" : false,
|
||||||
|
"Next Line on Commit" : true,
|
||||||
|
"Player" : "portaudio",
|
||||||
|
"Plays When Stepping Video" : false,
|
||||||
|
"Provider" : "ffmpegsource",
|
||||||
|
"Renderer" : {
|
||||||
|
"Spectrum" : {
|
||||||
|
"Cutoff" : 0,
|
||||||
|
"Memory Max" : 128,
|
||||||
|
"Quality" : 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Spectrum" : true,
|
||||||
|
"Start Drag Sensitivity" : 2,
|
||||||
|
"Wheel Default to Zoom" : false
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
"Automation" : {
|
||||||
|
"Autoreload Mode" : 1,
|
||||||
|
"Lua" : {
|
||||||
|
"Thread Priority" : 1
|
||||||
|
},
|
||||||
|
"Trace Level" : 3
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
"Colour" : {
|
||||||
|
"Audio Display" : {
|
||||||
|
"Background" : {
|
||||||
|
"Background" : "rgb(0,0,0)",
|
||||||
|
"Selection" : "rgb(64, 64, 64)",
|
||||||
|
"Selection Modified" : "rgb(92, 0, 0)"
|
||||||
|
},
|
||||||
|
"Line Boundary Inactive Line" : "rgb(190,190,190)",
|
||||||
|
"Line boundary End" : "rgb(230, 125, 0)",
|
||||||
|
"Line boundary Start" : "rgb(216, 0, 0)",
|
||||||
|
"Play Cursor" : "rgb(255,255,255)",
|
||||||
|
"Seconds Boundaries" : "rgb(0, 100, 255)",
|
||||||
|
"Syllable Boundaries" : "rgb(255,255,0)",
|
||||||
|
"Syllable Text" : "rgb(255,0,0)",
|
||||||
|
"Waveform" : "rgb(0, 200, 0)",
|
||||||
|
"Waveform Inactive" : "rgb(0, 80, 0)",
|
||||||
|
"Waveform Modified" : "rgb(255, 230, 230)",
|
||||||
|
"Waveform Selected" : "rgb(255,255,255)"
|
||||||
|
},
|
||||||
|
"Background" : {
|
||||||
|
"Modified" : "rgb(192, 192, 255)"
|
||||||
|
},
|
||||||
|
"Style Editor" : {
|
||||||
|
"Background" : {
|
||||||
|
"Preview" : "rgb(125, 153, 176)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Subtitle Grid" : {
|
||||||
|
"Active Border" : "rgb(255, 91, 239)",
|
||||||
|
"Background" : {
|
||||||
|
"Background" : "rgb(255,255,255)",
|
||||||
|
"Comment" : "rgb(216, 222, 245)",
|
||||||
|
"Inframe" : "rgb(255, 253, 234)",
|
||||||
|
"Selected Comment" : "rgb(211, 238, 238)",
|
||||||
|
"Selection" : "rgb(206, 255, 231)"
|
||||||
|
},
|
||||||
|
"Collision" : "rgb(255,0,0)",
|
||||||
|
"Header" : "rgb(165, 207, 231)",
|
||||||
|
"Left Column" : "rgb(196, 236, 201)",
|
||||||
|
"Lines" : "rgb(190,190,190)",
|
||||||
|
"Selection" : "rgb(0,0,0)",
|
||||||
|
"Standard" : "rgb(0,0,0)"
|
||||||
|
},
|
||||||
|
"Subtitle" : {
|
||||||
|
"Syntax" : {
|
||||||
|
"Background" : {
|
||||||
|
"Error" : "rgb(255, 200, 200)"
|
||||||
|
},
|
||||||
|
"Brackets" : "rgb(20, 50, 255)",
|
||||||
|
"Error" : "rgb(200, 0, 0)",
|
||||||
|
"Highlight Tags" : "rgb(90, 90, 90)",
|
||||||
|
"Karaoke Template" : "rgb(128, 0, 192)",
|
||||||
|
"Line Break" : "rgb(160, 160, 160)",
|
||||||
|
"Normal" : "rgb(0,0,0)",
|
||||||
|
"Parameters" : "rgb(40, 90, 40)",
|
||||||
|
"Slashes" : "rgb(255, 0, 200)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Video Dummy" : {
|
||||||
|
"Last Colour" : "rgb(47, 163, 254)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Limits" : {
|
||||||
|
"Find Replace" : 16,
|
||||||
|
"MRU" : 16,
|
||||||
|
"Undo Levels" : 8
|
||||||
|
},
|
||||||
|
|
||||||
|
"Path" : {
|
||||||
|
"Auto" : {
|
||||||
|
"Backup" : "?user/autoback",
|
||||||
|
"Save" : "?user/autosave"
|
||||||
|
},
|
||||||
|
"Automation" : {
|
||||||
|
"Autoload" : "?user/automation/autoload/|?data/automation/autoload/",
|
||||||
|
"Base" : "?data/automation/",
|
||||||
|
"Include" : "?user/automation/include/|?data/automation/include/"
|
||||||
|
},
|
||||||
|
"Dictionary" : "?user/dictionary",
|
||||||
|
"Fonts Collector Destination" : "?script",
|
||||||
|
"Last" : {
|
||||||
|
"Audio" : "",
|
||||||
|
"Automation" : "",
|
||||||
|
"Keyframes" : "",
|
||||||
|
"Subtitles" : "",
|
||||||
|
"Timecodes" : "",
|
||||||
|
"Video" : ""
|
||||||
|
},
|
||||||
|
"Screenshot" : "?video"
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
"Player" : {
|
||||||
|
"Audio" : {
|
||||||
|
"ALSA" : {
|
||||||
|
"Device" : "default"
|
||||||
|
},
|
||||||
|
"DirectSound" : {
|
||||||
|
"Buffer Latency" : 100,
|
||||||
|
"Buffer Length" : 5
|
||||||
|
},
|
||||||
|
"OSS" : {
|
||||||
|
"Device" : "/dev/dsp"
|
||||||
|
},
|
||||||
|
"PortAudio" : {
|
||||||
|
"Device" : -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
"Provider" : {
|
||||||
|
"Audio" : {
|
||||||
|
"AVS" : {
|
||||||
|
"Sample Rate" : 0
|
||||||
|
},
|
||||||
|
"FFMpegSource" : {
|
||||||
|
"Decode Error Handling" : "stop"
|
||||||
|
},
|
||||||
|
"PCM" : {
|
||||||
|
"Disable" : false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Avisynth" : {
|
||||||
|
"Allow Ancient" : false,
|
||||||
|
"Memory Max" : 64
|
||||||
|
},
|
||||||
|
"FFmpegSource" : {
|
||||||
|
"Cache" : {
|
||||||
|
"Files" : 20,
|
||||||
|
"Size" : 42
|
||||||
|
},
|
||||||
|
"Index All Tracks" : true,
|
||||||
|
"Log Level" : "quiet"
|
||||||
|
},
|
||||||
|
"Video" : {
|
||||||
|
"Cache" : {
|
||||||
|
"Size" : 32
|
||||||
|
},
|
||||||
|
"FFMpegSource" : {
|
||||||
|
"Decoding Threads" : 1,
|
||||||
|
"Unsafe Seeking" : false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
"Subtitle" : {
|
||||||
|
"Edit Box" : {
|
||||||
|
"Font Face" : "",
|
||||||
|
"Font Size" : 10,
|
||||||
|
"Link Time Boxes Commit" : true
|
||||||
|
},
|
||||||
|
"Grid" : {
|
||||||
|
"Column" : [
|
||||||
|
{"bool" : true},
|
||||||
|
{"bool" : true},
|
||||||
|
{"bool" : true},
|
||||||
|
{"bool" : true},
|
||||||
|
{"bool" : true},
|
||||||
|
{"bool" : true},
|
||||||
|
{"bool" : true},
|
||||||
|
{"bool" : true},
|
||||||
|
{"bool" : true},
|
||||||
|
{"bool" : true}
|
||||||
|
],
|
||||||
|
"Focus Allow" : true,
|
||||||
|
"Font Face" : "",
|
||||||
|
"Font Size" : 10,
|
||||||
|
"Hide Overrides" : 1,
|
||||||
|
"Hide Overrides Char" : "☀",
|
||||||
|
"Highlight Subtitles in Frame" : true
|
||||||
|
},
|
||||||
|
"Highlight" : {
|
||||||
|
"Syntax" : true
|
||||||
|
},
|
||||||
|
"Provider" : "libass",
|
||||||
|
"Time Edit" : {
|
||||||
|
"Insert Mode" : true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
"Timing" : {
|
||||||
|
"Default Duration" : 2000
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
"Tool" : {
|
||||||
|
"Colour Picker" : {
|
||||||
|
"Mode" : 4,
|
||||||
|
"RGBAdjust Tool" : false,
|
||||||
|
"Recent" : "&H000000& &H0000FF& &H00FFFF& &H00FF00& &HFFFF00& &HFF0000& &HFF00FF& &HFFFFFF&"
|
||||||
|
},
|
||||||
|
"Fonts Collector" : {
|
||||||
|
"Action" : 0
|
||||||
|
},
|
||||||
|
"Import" : {
|
||||||
|
"Text" : {
|
||||||
|
"Actor Separator" : ":",
|
||||||
|
"Comment Starter" : "#"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Kanji Timer" : {
|
||||||
|
"Interpolation" : true
|
||||||
|
},
|
||||||
|
"Paste Lines Over" : {
|
||||||
|
"Fields" : [
|
||||||
|
{"bool" : false},
|
||||||
|
{"bool" : false},
|
||||||
|
{"bool" : false},
|
||||||
|
{"bool" : false},
|
||||||
|
{"bool" : false},
|
||||||
|
{"bool" : false},
|
||||||
|
{"bool" : false},
|
||||||
|
{"bool" : false},
|
||||||
|
{"bool" : false},
|
||||||
|
{"bool" : true}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Preferences" : {
|
||||||
|
"Page" : 0
|
||||||
|
},
|
||||||
|
"Search Replace" : {
|
||||||
|
"Affect" : 0,
|
||||||
|
"Field" : 0,
|
||||||
|
"Match Case" : false,
|
||||||
|
"RegExp" : false,
|
||||||
|
"Video Update" : false
|
||||||
|
},
|
||||||
|
"Select Lines" : {
|
||||||
|
"Match" : {
|
||||||
|
"Case" : false,
|
||||||
|
"Comment" : false,
|
||||||
|
"Dialogue" : true
|
||||||
|
},
|
||||||
|
"Text" : ""
|
||||||
|
},
|
||||||
|
"Select" : {
|
||||||
|
"Action" : 0,
|
||||||
|
"Condition" : 0,
|
||||||
|
"Field" : 0,
|
||||||
|
"Mode" : 1
|
||||||
|
},
|
||||||
|
"Shift Times" : {
|
||||||
|
"Affect" : 0,
|
||||||
|
"ByTime" : true,
|
||||||
|
"Direction" : true,
|
||||||
|
"Length" : 0,
|
||||||
|
"Type" : 0
|
||||||
|
},
|
||||||
|
"Spell Checker" : {
|
||||||
|
"Backend" : "hunspell",
|
||||||
|
"Language" : "en_US"
|
||||||
|
},
|
||||||
|
"Style Editor" : {
|
||||||
|
"Preview Text" : "Aegisub\\N0123 月語"
|
||||||
|
},
|
||||||
|
"Thesaurus" : {
|
||||||
|
"Language" : "en_US"
|
||||||
|
},
|
||||||
|
"Timing Post Processor" : {
|
||||||
|
"Adjacent Bias" : 0.9000000000000000222,
|
||||||
|
"Enable" : {
|
||||||
|
"Adjacent" : true,
|
||||||
|
"Keyframe" : true,
|
||||||
|
"Lead" : {
|
||||||
|
"IN" : true,
|
||||||
|
"OUT" : true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Only Selection" : false,
|
||||||
|
"Threshold" : {
|
||||||
|
"Adjacent" : 300,
|
||||||
|
"Key End After" : 6,
|
||||||
|
"Key End Before" : 5,
|
||||||
|
"Key Start After" : 4,
|
||||||
|
"Key Start Before" : 5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Tip of the Day" : {
|
||||||
|
"Current" : 0
|
||||||
|
},
|
||||||
|
"Visual" : {
|
||||||
|
"Always Show": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
"Version" : {
|
||||||
|
"Id" : "$Id$",
|
||||||
|
"Last Version" : 4040,
|
||||||
|
"Next Check" : 0
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
"Video" : {
|
||||||
|
"Check Script Res" : 0,
|
||||||
|
"Default Zoom" : 7,
|
||||||
|
"Detached" : {
|
||||||
|
"Enabled" : false,
|
||||||
|
"Last" : {
|
||||||
|
"X" : -1,
|
||||||
|
"Y" : -1
|
||||||
|
},
|
||||||
|
"Maximized" : false
|
||||||
|
},
|
||||||
|
"Dummy" : {
|
||||||
|
"FPS" : 23.975999999999999091,
|
||||||
|
"Last" : {
|
||||||
|
"Height" : 480,
|
||||||
|
"Length" : 40000,
|
||||||
|
"Width" : 640
|
||||||
|
},
|
||||||
|
"Pattern" : false
|
||||||
|
},
|
||||||
|
"Overscan Mask" : false,
|
||||||
|
"Provider" : "ffmpegsource",
|
||||||
|
"Slider" : {
|
||||||
|
"Fast Jump Step" : 10,
|
||||||
|
"Show Keyframes" : true
|
||||||
|
},
|
||||||
|
"Subtitle Sync" : true,
|
||||||
|
"Threaded" : false,
|
||||||
|
"Visual Realtime" : true
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,9 @@
|
||||||
{
|
{
|
||||||
"Audio" : [],
|
"Audio" : [],
|
||||||
"Video" : [],
|
"Find" : [],
|
||||||
"Scripts" : []
|
"Keyframes" : [],
|
||||||
|
"Replace" : [],
|
||||||
|
"Subtitle" : [],
|
||||||
|
"Timecodes" : [],
|
||||||
|
"Video" : []
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,11 +60,12 @@
|
||||||
#include "auto4_base.h"
|
#include "auto4_base.h"
|
||||||
#endif
|
#endif
|
||||||
#include "charset_conv.h"
|
#include "charset_conv.h"
|
||||||
|
#include "compat.h"
|
||||||
#include "export_framerate.h"
|
#include "export_framerate.h"
|
||||||
#include "frame_main.h"
|
#include "frame_main.h"
|
||||||
#include "hotkeys.h"
|
#include "hotkeys.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "options.h"
|
#include "libresrc/libresrc.h"
|
||||||
#include "plugin_manager.h"
|
#include "plugin_manager.h"
|
||||||
#include "standard_paths.h"
|
#include "standard_paths.h"
|
||||||
#include "subs_grid.h"
|
#include "subs_grid.h"
|
||||||
|
@ -72,6 +73,7 @@
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "video_context.h"
|
#include "video_context.h"
|
||||||
|
|
||||||
|
#include <libaegisub/io.h>
|
||||||
|
|
||||||
///////////////////
|
///////////////////
|
||||||
// wxWidgets macro
|
// wxWidgets macro
|
||||||
|
@ -140,6 +142,32 @@ bool AegisubApp::OnInit() {
|
||||||
StartupLog(_T("Inside OnInit"));
|
StartupLog(_T("Inside OnInit"));
|
||||||
frame = NULL;
|
frame = NULL;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
const std::string conf_mru(StandardPaths::DecodePath(_T("?user/mru.json")));
|
||||||
|
mru = new agi::MRUManager(conf_mru, GET_DEFAULT_CONFIG(default_mru));
|
||||||
|
|
||||||
|
// Set config file
|
||||||
|
StartupLog(_T("Load configuration"));
|
||||||
|
try {
|
||||||
|
const std::string conf_user(StandardPaths::DecodePath(_T("?user/config.json")));
|
||||||
|
opt = new agi::Options(conf_user, GET_DEFAULT_CONFIG(default_config));
|
||||||
|
opt->ConfigUser();
|
||||||
|
/*
|
||||||
|
#ifdef _DEBUG
|
||||||
|
const std::string conf_default("default_config.json");
|
||||||
|
std::istream *stream = agi::io::Open(conf_default);
|
||||||
|
opt->ConfigDefault(*stream);
|
||||||
|
delete stream;
|
||||||
|
#else
|
||||||
|
opt->ConfigDefault(GET_DEFAULT_CONFIG(default_config));
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
// opt->ConfigDefault(GET_DEFAULT_CONFIG(default_config));
|
||||||
|
|
||||||
|
} catch (agi::Exception& e) {
|
||||||
|
wxPrintf("Caught agi::Exception: %s -> %s\n", e.GetName(), e.GetMessage());
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize randomizer
|
// Initialize randomizer
|
||||||
StartupLog(_T("Initialize random generator"));
|
StartupLog(_T("Initialize random generator"));
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
|
@ -166,36 +194,9 @@ bool AegisubApp::OnInit() {
|
||||||
wxHandleFatalExceptions(true);
|
wxHandleFatalExceptions(true);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Set config file
|
|
||||||
StartupLog(_T("Load configuration"));
|
|
||||||
Options.LoadDefaults();
|
|
||||||
#ifdef __WXMSW__
|
|
||||||
// Try loading configuration from the install dir if one exists there
|
|
||||||
if (wxFileName::FileExists(StandardPaths::DecodePath(_T("?data/config.dat")))) {
|
|
||||||
Options.SetFile(StandardPaths::DecodePath(_T("?data/config.dat")));
|
|
||||||
Options.Load();
|
|
||||||
|
|
||||||
if (Options.AsBool(_T("Local config"))) {
|
|
||||||
// Local config, make ?user mean ?data so all user settings are placed in install dir
|
|
||||||
StandardPaths::SetPathValue(_T("?user"), StandardPaths::DecodePath(_T("?data")));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Not local config, we don't want that config.dat file here any more
|
|
||||||
// It might be a leftover from a really old install
|
|
||||||
wxRemoveFile(StandardPaths::DecodePath(_T("?data/config.dat")));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// TODO: Check if we can write to config.dat and warn the user if we can't
|
|
||||||
// If we had local config, ?user now means ?data so this will still be loaded from the correct location
|
|
||||||
Options.SetFile(StandardPaths::DecodePath(_T("?user/config.dat")));
|
|
||||||
Options.Load();
|
|
||||||
|
|
||||||
StartupLog(_T("Store options back"));
|
StartupLog(_T("Store options back"));
|
||||||
Options.SetInt(_T("Last Version"),GetSVNRevision());
|
OPT_SET("Version/Last Version")->SetInt(GetSVNRevision());
|
||||||
Options.LoadDefaults(false,true); // Override options based on version number
|
AssTime::UseMSPrecision = OPT_GET("App/Nonstandard Milisecond Times")->GetBool();
|
||||||
Options.Save();
|
|
||||||
AssTime::UseMSPrecision = Options.AsBool(_T("Use nonstandard Milisecond Times"));
|
|
||||||
|
|
||||||
// Set hotkeys file
|
// Set hotkeys file
|
||||||
StartupLog(_T("Load hotkeys"));
|
StartupLog(_T("Load hotkeys"));
|
||||||
|
@ -205,11 +206,10 @@ bool AegisubApp::OnInit() {
|
||||||
StartupLog(_T("Initialize final locale"));
|
StartupLog(_T("Initialize final locale"));
|
||||||
|
|
||||||
// Set locale
|
// Set locale
|
||||||
int lang = Options.AsInt(_T("Locale Code"));
|
int lang = OPT_GET("App/Locale")->GetInt();
|
||||||
if (lang == -1) {
|
if (lang == -1) {
|
||||||
lang = locale.PickLanguage();
|
lang = locale.PickLanguage();
|
||||||
Options.SetInt(_T("Locale Code"),lang);
|
OPT_SET("App/Locale")->SetInt(lang);
|
||||||
Options.Save();
|
|
||||||
}
|
}
|
||||||
locale.Init(lang);
|
locale.Init(lang);
|
||||||
|
|
||||||
|
@ -220,7 +220,7 @@ bool AegisubApp::OnInit() {
|
||||||
// Load Automation scripts
|
// Load Automation scripts
|
||||||
#ifdef WITH_AUTOMATION
|
#ifdef WITH_AUTOMATION
|
||||||
StartupLog(_T("Load global Automation scripts"));
|
StartupLog(_T("Load global Automation scripts"));
|
||||||
global_scripts = new Automation4::AutoloadScriptManager(Options.AsText(_T("Automation Autoload Path")));
|
global_scripts = new Automation4::AutoloadScriptManager(lagi_wxString(OPT_GET("Path/Automation/Autoload")->GetString()));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Load export filters
|
// Load export filters
|
||||||
|
@ -263,7 +263,8 @@ int AegisubApp::OnExit() {
|
||||||
SubtitleFormat::DestroyFormats();
|
SubtitleFormat::DestroyFormats();
|
||||||
VideoContext::Clear();
|
VideoContext::Clear();
|
||||||
delete plugins;
|
delete plugins;
|
||||||
Options.Clear();
|
delete opt;
|
||||||
|
delete mru;
|
||||||
#ifdef WITH_AUTOMATION
|
#ifdef WITH_AUTOMATION
|
||||||
delete global_scripts;
|
delete global_scripts;
|
||||||
#endif
|
#endif
|
||||||
|
@ -461,7 +462,7 @@ void AegisubApp::MacOpenFile(const wxString &filename) {
|
||||||
if (frame != NULL && !filename.empty()) {
|
if (frame != NULL && !filename.empty()) {
|
||||||
frame->LoadSubtitles(filename);
|
frame->LoadSubtitles(filename);
|
||||||
wxFileName filepath(filename);
|
wxFileName filepath(filename);
|
||||||
Options.SetText(_T("Last open subtitles path"), filepath.GetPath());
|
OPT_SET("Path/Last/Subtitles")->SetString(STD_STR(filepath.GetPath()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue