mirror of
				https://git.femboyfinancial.jp/james/lipsync.git
				synced 2025-10-30 22:03:42 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			3728 lines
		
	
	
		
			186 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			3728 lines
		
	
	
		
			186 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| /*
 | ||
|  * Form1.cs
 | ||
|  * Copyright (c) 2007-2009 kbinani
 | ||
|  *
 | ||
|  * This file is part of LipSync.
 | ||
|  *
 | ||
|  * LipSync is free software; you can redistribute it and/or
 | ||
|  * modify it under the terms of the BSD License.
 | ||
|  *
 | ||
|  * LipSync is distributed in the hope that it will be useful,
 | ||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | ||
|  */
 | ||
| using System;
 | ||
| using System.Collections.Generic;
 | ||
| using System.ComponentModel;
 | ||
| using System.Diagnostics;
 | ||
| using System.Drawing;
 | ||
| using System.Drawing.Drawing2D;
 | ||
| using System.IO;
 | ||
| using System.Reflection;
 | ||
| using System.Text;
 | ||
| using System.Threading;
 | ||
| using System.Windows.Forms;
 | ||
| 
 | ||
| using Boare.Lib.AppUtil;
 | ||
| using Boare.Lib.Media;
 | ||
| using Boare.Lib.Vsq;
 | ||
| using Plugin;
 | ||
| #if DEBUG
 | ||
| using Boare.Lib.Swf;
 | ||
| #endif
 | ||
| 
 | ||
| namespace LipSync {
 | ||
| 
 | ||
|     public partial class Form1 : Form, IMultiLanguageControl {
 | ||
|         #region Constants
 | ||
|         private const byte FILEFORMAT = 1;
 | ||
|         /// <summary>
 | ||
|         /// プレビューとタイムラインのシンクロを行うとき、次の画面へ移動する時の両側の重複部分の幅
 | ||
|         /// </summary>
 | ||
|         private const float SIDE_WIDTH = 0.15f;
 | ||
|         /// <summary>
 | ||
|         /// m_editHandleLeft, Rightの幅
 | ||
|         /// </summary>
 | ||
|         private const int HANDLE_WIDTH = 8;
 | ||
|         /// <summary>
 | ||
|         /// 自動スクロール適用直後、画面の中央が、現在の再生時刻位置まで滑らかに移動するブレンド時間
 | ||
|         /// </summary>
 | ||
|         private const float FIT_CENTER_BREND_TIME = 2f;
 | ||
|         const int BUF_LEN = 10;
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region Static Readonly Field
 | ||
|         private static readonly AuthorListEntry[] m_credit = new AuthorListEntry[]{
 | ||
|             new AuthorListEntry( "is developped by:", FontStyle.Italic ),
 | ||
|             new AuthorListEntry( "kbinani" ),
 | ||
|             new AuthorListEntry( "and he thanks to:", FontStyle.Italic ),
 | ||
|             new AuthorListEntry(),
 | ||
|             new AuthorListEntry( "author of embedded character", FontStyle.Italic ),
 | ||
|             new AuthorListEntry( "さなり" ),
 | ||
|             new AuthorListEntry(),
 | ||
|             new AuthorListEntry( "contributors", FontStyle.Italic ),
 | ||
|             new AuthorListEntry( "evm" ),
 | ||
|             new AuthorListEntry( "鈴村優" ),
 | ||
|             new AuthorListEntry( "そろそろP" ),
 | ||
|             new AuthorListEntry( "めがね110" ),
 | ||
|             new AuthorListEntry( "上総" ),
 | ||
|             new AuthorListEntry( "NOIKE" ),
 | ||
|             new AuthorListEntry( "逃亡者" ),
 | ||
|             new AuthorListEntry(),
 | ||
|             new AuthorListEntry( "translator", FontStyle.Italic ),
 | ||
|             new AuthorListEntry( "E-Avalance" ),
 | ||
|             new AuthorListEntry(),
 | ||
|             new AuthorListEntry( "bugs and suggestions reporters", FontStyle.Italic ),
 | ||
|             new AuthorListEntry( "だんちゃん" ),
 | ||
|             new AuthorListEntry( "灰" ),
 | ||
|             new AuthorListEntry( "sanryo" ),
 | ||
|             new AuthorListEntry( "やなぎがうら" ),
 | ||
|             new AuthorListEntry( "elthy" ),
 | ||
|             new AuthorListEntry( "fyfy" ),
 | ||
|             new AuthorListEntry( "k-roh" ),
 | ||
|             new AuthorListEntry( "さえ" ),
 | ||
|             new AuthorListEntry( "上総" ),
 | ||
|             new AuthorListEntry( "MI" ),
 | ||
|             new AuthorListEntry( "ほとほと" ),
 | ||
|             new AuthorListEntry( "IGASIO" ),
 | ||
|             new AuthorListEntry( "PEX" ),
 | ||
|             new AuthorListEntry(),
 | ||
|             new AuthorListEntry( "and you.", FontStyle.Bold | FontStyle.Italic ),
 | ||
|         };
 | ||
|         private static readonly Pen HILIGHT = new Pen( Color.Gray, 2 );
 | ||
|         private static readonly Pen HILIGHT_EDIT = new Pen( Color.Red, 2 );
 | ||
|         private static readonly Color REPEAT_AREA = Color.FromArgb( 105, 139, 105 );
 | ||
|         private static readonly Pen _PEN_123_123_123 = new Pen( Color.FromArgb( 123, 123, 123 ) );
 | ||
|         private static readonly SolidBrush _BRS_TRACKBG_ODD = new SolidBrush( Color.FromArgb( 240, 240, 240 ) );
 | ||
|         private static readonly SolidBrush _BRS_TRACKBG_EVEN = new SolidBrush( Color.FromArgb( 212, 212, 212 ) );
 | ||
|         private static readonly SolidBrush _BRS_TRACK_NAME = new SolidBrush( Color.FromArgb( 80, 80, 80 ) );
 | ||
|         private static readonly Pen _PEN_BOUNDS = new Pen( new HatchBrush( HatchStyle.Percent50, Color.Black, Color.White ), 4 );
 | ||
|         private static readonly Pen _PEN_FIXED_BOUNDS = new Pen( new HatchBrush( HatchStyle.Percent50, Color.Red, Color.White ), 4 );
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region Static Field
 | ||
|         //private static Color CANVAS_BACKGROUND_HILIGHT = Color.Black;
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region Field
 | ||
|         /// <summary>
 | ||
|         /// ファイルには保存されていたが、現在の環境では使えないプラグインのトラック情報。
 | ||
|         /// 読込時に判定して作成し、保存時には一応保存する。
 | ||
|         /// </summary>
 | ||
|         private List<TimeTable> m_not_used_plugin = new List<TimeTable>();
 | ||
|         private List<PluginConfig> m_not_used_plugin_config = new List<PluginConfig>();
 | ||
|         /// <summary>
 | ||
|         /// 変更可能な設定値 
 | ||
|         /// </summary>
 | ||
|         //private EnvSettings AppManager.Config = new EnvSettings();
 | ||
|         private Color TRIANGLE_COLOR = Color.SteelBlue;
 | ||
|         /// <summary>
 | ||
|         /// pictureBox1上のマウスの位置
 | ||
|         /// </summary>
 | ||
|         private Point m_mousePosition;
 | ||
|         /// <summary>
 | ||
|         /// pictureBox1上のクリックされたアイテムの場所
 | ||
|         /// </summary>
 | ||
|         private Item m_clicked;
 | ||
|         private Rectangle m_rcHilight;
 | ||
|         /// <summary>
 | ||
|         /// エントリの編集モードで、マウスカーソルを変更するべきエリア
 | ||
|         /// </summary>
 | ||
|         private Rectangle m_editHandleLeft = new Rectangle();
 | ||
|         private Rectangle m_editHandleRight = new Rectangle();
 | ||
|         private Item m_edit_handle_ed_item;
 | ||
|         private string m_filePath = "";
 | ||
|         private int m_startToDrawX = 0;
 | ||
|         private int m_startToDrawY = 0;
 | ||
|         private PointF m_expandRange;
 | ||
|         private bool m_initialized = false;
 | ||
|         //private bool m_edited = false;
 | ||
|         /// <summary>
 | ||
|         /// コピーされたタイムテーブル
 | ||
|         /// </summary>
 | ||
|         private TimeTable m_copied_timetable = null;
 | ||
|         private Color TOOL_COLOR = Color.DarkGray;
 | ||
|         /// <summary>
 | ||
|         /// トラック上のドラッグによりエントリを追加するもーど中に保持される、もともとのタイムテーブルグループのキャッシュ
 | ||
|         /// </summary>
 | ||
|         private TimeTableGroup m_editing_group;
 | ||
|         /// <summary>
 | ||
|         /// ドラッグ中のアイテム
 | ||
|         /// </summary>
 | ||
|         private Item m_dragging;
 | ||
|         private float m_editing_t1, m_editing_t2;
 | ||
|         private TimeTableEntry m_copied_entry = null;
 | ||
|         private Telop m_copied_telop = null;
 | ||
|         private Item m_copied;
 | ||
|         private EditMode m_edit_mode = EditMode.None;
 | ||
|         /// <summary>
 | ||
|         /// ドラッグによりエントリをスライドするモードで、スライド開始前の、エントリのもともとのbegin時刻
 | ||
|         /// </summary>
 | ||
|         private TimeTableEntry m_slide_original = null;
 | ||
|         private bool m_slide_moved = false;
 | ||
|         //private float m_total_memory = 0f;
 | ||
| #if DEBUG
 | ||
|         private long m_counter = 0L;
 | ||
| #endif
 | ||
|         private DateTime m_preview_time;
 | ||
|         private VersionInfo m_version_form = null;
 | ||
| 
 | ||
|         private bool m_avi_writing = false;
 | ||
|         private Keys m_last_key = Keys.None;
 | ||
|         private int m_realtime_group = 0;
 | ||
|         private int m_realtime_track;
 | ||
|         private int m_realtime_entry;
 | ||
|         private DisplacementControl m_curve;
 | ||
|         private bool m_is_repeat_mode = false;
 | ||
|         /// <summary>
 | ||
|         /// Paintイベントをスキップする必要のある時true
 | ||
|         /// </summary>
 | ||
|         private bool m_skip_paint = false;
 | ||
|         /// <summary>
 | ||
|         /// クオンタイズする際のグリッド時刻のリスト。スクロールバーが移動した時、更新
 | ||
|         /// </summary>
 | ||
|         private float[] m_grids;
 | ||
|         /// <summary>
 | ||
|         /// VSQトラックを固定表示する場合の、VSQトラック表示部分の高さ
 | ||
|         /// </summary>
 | ||
|         private int m_vsq_height = 0;
 | ||
|         private FormPreview m_form_preview;
 | ||
|         bool m_avi_cancel = false;
 | ||
|         Thread m_stdout;
 | ||
|         Process m_ffmpeg;
 | ||
|         Process m_mencoder;
 | ||
|         bool m_is_rawmode = false;
 | ||
|         private int m_current_frame = 0;
 | ||
|         private MediaPlayer m_player;
 | ||
|         private ZorderItem m_editing_item = null;
 | ||
|         private EditingBounds m_editing = new EditingBounds();
 | ||
|         /// <summary>
 | ||
|         /// 最初画像がクリックされた位置の、画像座標系での位置
 | ||
|         /// </summary>
 | ||
|         private Point m_base_point;
 | ||
|         /// <summary>
 | ||
|         /// 画像がクリックされた時点での、その画像の位置設定情報
 | ||
|         /// </summary>
 | ||
|         private Point m_init_position;
 | ||
|         /// <summary>
 | ||
|         /// テキストエディットモード
 | ||
|         /// </summary>
 | ||
|         bool m_text_edit = false;
 | ||
|         /// <summary>
 | ||
|         /// 編集中のテキスト
 | ||
|         /// </summary>
 | ||
|         TextBox m_text = null;
 | ||
|         /// <summary>
 | ||
|         /// オリジナルのテキスト
 | ||
|         /// </summary>
 | ||
|         string m_text_original;
 | ||
|         /// <summary>
 | ||
|         /// 編集しているテキストのID
 | ||
|         /// </summary>
 | ||
|         int m_text_id;
 | ||
|         double[] m_buf = new double[BUF_LEN];
 | ||
|         double m_fps;
 | ||
|         DateTime m_last_ignitted = new DateTime();
 | ||
|         private DateTime m_started_date;
 | ||
|         private Thread m_preview_thread = null;
 | ||
|         private BSplitContainer m_panels;
 | ||
|         private Telop m_editing_telop_original = null;
 | ||
|         #endregion
 | ||
| 
 | ||
|         private delegate void ChangeTitleTextDelegate( string encoder_type, int percent, int current_frame, int max_frames );
 | ||
|         private delegate void ForceScreenUpdateDelegate();
 | ||
|         private delegate void Form1_AviWritingChange( bool value );
 | ||
| 
 | ||
|         public Form1( string file ) {
 | ||
|             AppManager.SaveData = new SettingsEx();
 | ||
|             m_filePath = file;
 | ||
|             InitializeComponent();
 | ||
| 
 | ||
|             m_panels = new BSplitContainer();
 | ||
| 
 | ||
|             // m_panels
 | ||
|             m_panels.Name = "m_panels";
 | ||
|             m_panels.Orientation = Orientation.Vertical;
 | ||
|             m_panels.Panel1.BorderColor = SystemColors.ControlDark;
 | ||
|             m_panels.Panel1.BorderStyle = BorderStyle.FixedSingle;
 | ||
|             m_panels.Panel2.BorderColor = SystemColors.ControlDark;
 | ||
|             m_panels.Panel2.BorderStyle = BorderStyle.FixedSingle;
 | ||
|             m_panels.FixedPanel = FixedPanel.Panel1;
 | ||
|             m_panels.Panel1.Controls.Add( previewer );
 | ||
|             m_panels.Panel2.Controls.AddRange( new Control[]{ side,
 | ||
|                                                               pictureBox1,
 | ||
|                                                               hScrollBar1,
 | ||
|                                                               vScrollBar1,
 | ||
|                                                               pictureBox2,
 | ||
|                                                               preview_image } );
 | ||
|             m_panels.Panel1MinSize = 0;
 | ||
|             m_panels.Panel2.SizeChanged += new EventHandler( Panel2_SizeChanged );
 | ||
|             m_container.FixedPanel = FixedPanel.Panel1;
 | ||
|             m_container.Panel1.Controls.Add( property );
 | ||
|             m_container.Panel2.Controls.Add( m_panels );
 | ||
|             m_panels.Dock = DockStyle.Fill;
 | ||
|             property.Dock = DockStyle.Fill;
 | ||
|             previewer.Dock = DockStyle.Fill;
 | ||
| 
 | ||
|             this.pictureBox1.MouseWheel += new MouseEventHandler( pictureBox1_MouseWheel );
 | ||
|             m_player = new MediaPlayer();
 | ||
|             previewer.TrackVolumeValue = m_player.Volume;
 | ||
|             Messaging.LoadMessages();
 | ||
|             LoadConfig();
 | ||
|             this.SizeChanged += new EventHandler( Form1_LocationOrSizeChanged );
 | ||
|             this.LocationChanged += new EventHandler( Form1_LocationOrSizeChanged );
 | ||
|             AppManager.EditedChanged += new EventHandler( AppManager_EditedChanged );
 | ||
|             m_form_preview = new FormPreview();
 | ||
|             m_form_preview.FormClosing += new FormClosingEventHandler( m_form_preview_FormClosing );
 | ||
|             m_curve = new DisplacementControl();
 | ||
|             m_curve.FormClosing += new FormClosingEventHandler( m_curve_FormClosing );
 | ||
|             menuVisualVsqTrack.Checked = AppManager.Config.FixVsqTrackPosition;
 | ||
|             ApplyLanguage();
 | ||
|         }
 | ||
| 
 | ||
|         private void m_curve_FormClosing( object sender, FormClosingEventArgs e ) {
 | ||
|             e.Cancel = true;
 | ||
|             menuVisualTransform.Checked = false;
 | ||
|         }
 | ||
| 
 | ||
|         private void AppManager_EditedChanged( object sender, EventArgs e ) {
 | ||
|             UpdateFormTitle();
 | ||
|             UpdateObjectList();
 | ||
|             menuEditRedo.Enabled = AppManager.IsRedoAvailable; //ExecuteとResiterが離れているので,ここで更新する必要がある
 | ||
|             menuEditUndo.Enabled = AppManager.IsUndoAvailable;
 | ||
|             if ( AppManager.Edited ) {
 | ||
|                 this.Invalidate();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void Panel2_SizeChanged( object sender, EventArgs e ) {
 | ||
|             ResizePanel2();
 | ||
|         }
 | ||
| 
 | ||
|         private void m_form_preview_FormClosing( object sender, FormClosingEventArgs e ) {
 | ||
|             e.Cancel = true;
 | ||
|             m_form_preview.Hide();
 | ||
|             previewer.Parent = m_panels.Panel1;
 | ||
|             int total_height = m_panels.Panel1.Height + m_panels.Panel2.Height;
 | ||
|             int new_distance = (int)(total_height * AppManager.Config.LastPreviewAspecto);
 | ||
|             m_panels.SplitterDistance = new_distance;
 | ||
|             m_panels.IsSplitterFixed = false;
 | ||
|             menuVisualPreviewSeparate.Checked = false;
 | ||
|         }
 | ||
| 
 | ||
|         #region property
 | ||
|         private void property_TelopDeleting( ZorderItem e ) {
 | ||
| #if DEBUG
 | ||
|             Common.DebugWriteLine( "property1_TelopDeleting" );
 | ||
|             Common.DebugWriteLine( "    e.Type=" + e.Type );
 | ||
| #endif
 | ||
|             if ( e.Type == ZorderItemType.telop ) {
 | ||
|                 Command run = Command.GCommandDeleteTelop( AppManager.SaveData[e.Index] );
 | ||
|                 AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                 Telop.DecideLane( AppManager.SaveData.m_telop_ex2 );
 | ||
|                 property.Editing = null;
 | ||
|                 if ( m_curve.comboObjects.SelectedItem != null ){
 | ||
|                     TagForTreeNode t = (TagForTreeNode)m_curve.comboObjects.SelectedItem;
 | ||
|                     if ( t.type == ZorderItemType.telop && t.id_or_index == e.Index ) {
 | ||
|                         m_curve.SetSelectedNone();
 | ||
|                     }
 | ||
|                 }
 | ||
|                 SetVScrollRange();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void property_EditingItemChanged( ZorderItem item ) {
 | ||
| #if DEBUG
 | ||
|             Common.DebugWriteLine( "property1_EditingItemChanged" );
 | ||
| #endif
 | ||
|             if ( item != null ) {
 | ||
|                 switch ( item.Type ) {
 | ||
|                     case ZorderItemType.another:
 | ||
|                         property.SelectedObject = AppManager.SaveData.m_group_another[item.Index].Clone();
 | ||
|                         break;
 | ||
|                     case ZorderItemType.character:
 | ||
|                         property.SelectedObject = AppManager.SaveData.m_groups_character[item.Index].Clone();
 | ||
|                         break;
 | ||
|                     case ZorderItemType.telop:
 | ||
|                         //Telop.DecideLane( AppManager.SaveData.m_telop_ex2 );
 | ||
|                         property.SelectedObject = AppManager.SaveData[item.Index].Clone();
 | ||
|                         break;
 | ||
|                 }
 | ||
|             } else {
 | ||
|                 property.SelectedObject = null;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void property_TelopAdding() {
 | ||
|             h_addTelop( this, new EventArgs() );
 | ||
|         }
 | ||
| 
 | ||
|         private void property_PropertyValueChanged( object sender, PropertyValueChangedEventArgs e ) {
 | ||
| #if DEBUG
 | ||
|             Common.DebugWriteLine( "property1_PropertyValueChanged(object,PropertyValueChangedEventArgs)" );
 | ||
| #endif
 | ||
|             int target = property.Editing.Index;
 | ||
|             string start = "";
 | ||
|             string type = "";
 | ||
|             string name = "";
 | ||
| 
 | ||
| #if DEBUG
 | ||
|             Common.DebugWriteLine( "    (property1.SelectedObject is TimeTable)     =" + (property.SelectedObject is TimeTable) );
 | ||
|             Common.DebugWriteLine( "    (property1.SelectedObject is TimeTableGroup)=" + (property.SelectedObject is TimeTableGroup) );
 | ||
|             Common.DebugWriteLine( "    (property1.SelectedObject is Telop)         =" + (property.SelectedObject is Telop) );
 | ||
| #endif
 | ||
|             // property1.SelectedObjectは,それぞれの編集対象の単なるクローンなので,
 | ||
|             // 変更されたらCommandを使って本体を更新する必要がある
 | ||
|             if ( property.SelectedObject is TimeTable ) {
 | ||
|                 Command run = Command.GCommandEditTimeTable( TimeTableType.another, -1, target, (TimeTable)property.SelectedObject );
 | ||
|                 AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                 start = AppManager.SaveData[TimeTableType.another, -1].GetFirstOn( target ) + "";
 | ||
|                 type = "another";
 | ||
|                 name = AppManager.SaveData[TimeTableType.another, -1][target].Text;
 | ||
|             } else if ( property.SelectedObject is TimeTableGroup ) {
 | ||
|                 Command run = Command.GCommandEditGroup( TimeTableType.character, target, (TimeTableGroup)property.SelectedObject );
 | ||
|                 AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                 start = "" + AppManager.SaveData[TimeTableType.character, target].GetFirstOn();
 | ||
|                 type = "character";
 | ||
|                 name = AppManager.SaveData[TimeTableType.character, target].Text;
 | ||
|             } else if ( property.SelectedObject is Telop ) {
 | ||
|                 Command run = Command.GCommandEditTelop( target, (Telop)property.SelectedObject );
 | ||
|                 AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                 start = "" + AppManager.SaveData[target].Start;
 | ||
|                 type = "telop";
 | ||
|                 name = AppManager.SaveData[target].Text;
 | ||
|             }
 | ||
| 
 | ||
|             // property1.ListViewの表示内容を更新
 | ||
|             ZorderItem editing = property.Editing;
 | ||
| #if DEBUG
 | ||
|             Common.DebugWriteLine( "    editing.Type=" + editing.Type );
 | ||
|             Common.DebugWriteLine( "    editing.Index=" + editing.Index );
 | ||
|             Common.DebugWriteLine( "    editing.Name=" + editing.Name );
 | ||
|             bool found = false;
 | ||
| #endif
 | ||
|             foreach ( ListViewItem item in property.ListView.Items ) {
 | ||
|                 if ( item.Tag is ZorderItem ) {
 | ||
|                     ZorderItem zitem = (ZorderItem)item.Tag;
 | ||
|                     if ( zitem.Type == editing.Type && zitem.Index == editing.Index ) {
 | ||
|                         item.SubItems[0].Text = start;
 | ||
|                         item.SubItems[1].Text = type;
 | ||
|                         item.SubItems[2].Text = name;
 | ||
| #if DEBUG
 | ||
|                         found = true;
 | ||
| #endif
 | ||
|                         break;
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
| #if DEBUG
 | ||
|             Common.DebugWriteLine( "found=" + found );
 | ||
| #endif
 | ||
|             UpdateEditHandle();
 | ||
|             AppManager.Edited = true;
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region hScrollBar1
 | ||
|         private void hScrollBar1_Scroll( object sender, ScrollEventArgs e ) {
 | ||
|             m_startToDrawX = StartToDrawX();
 | ||
|             UpdateGridList();
 | ||
|             pictureBox1.Invalidate();
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         private void vScrollBar1_Scroll( object sender, ScrollEventArgs e ) {
 | ||
|             m_startToDrawY = StartToDrawY();
 | ||
|             side.Refresh();
 | ||
|             pictureBox1.Refresh();
 | ||
|         }
 | ||
| 
 | ||
|         #region pictureBox1
 | ||
|         private void pictureBox1_MouseWheel( object sender, MouseEventArgs e ) {
 | ||
|             if ( (Control.ModifierKeys & Keys.Shift) == Keys.Shift ) {
 | ||
|                 if ( vScrollBar1.Enabled ) {
 | ||
|                     int prev = vScrollBar1.Value;
 | ||
|                     float add = -(float)e.Delta / AppManager.Config.WheelRatio;
 | ||
|                     int set = (int)((float)prev + add);
 | ||
|                     if ( set > vScrollBar1.Maximum + 1 - vScrollBar1.LargeChange ) {
 | ||
|                         set = vScrollBar1.Maximum + 1 - vScrollBar1.LargeChange;
 | ||
|                     } else if ( set < vScrollBar1.Minimum ) {
 | ||
|                         set = vScrollBar1.Minimum;
 | ||
|                     }
 | ||
|                     if ( prev != set ) {
 | ||
|                         vScrollBar1.Value = set;
 | ||
|                         m_startToDrawY = StartToDrawY();
 | ||
|                         pictureBox1.Invalidate();
 | ||
|                         side.Invalidate();
 | ||
|                     }
 | ||
|                 }
 | ||
|             } else {
 | ||
|                 if ( hScrollBar1.Enabled ) {
 | ||
|                     int prev = hScrollBar1.Value;
 | ||
|                     float add = -(float)e.Delta / AppManager.Config.WheelRatio;
 | ||
|                     int set = (int)((float)prev + add);
 | ||
|                     if ( set > hScrollBar1.Maximum + 1 - hScrollBar1.LargeChange ) {
 | ||
|                         set = hScrollBar1.Maximum + 1 - hScrollBar1.LargeChange;
 | ||
|                     } else if ( set < hScrollBar1.Minimum ) {
 | ||
|                         set = hScrollBar1.Minimum;
 | ||
|                     }
 | ||
|                     if ( prev != set ) {
 | ||
|                         hScrollBar1.Value = set;
 | ||
|                         m_startToDrawX = StartToDrawX();
 | ||
|                         pictureBox1.Invalidate();
 | ||
|                     }
 | ||
|                     UpdateGridList();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void pictureBox1_PreviewKeyDown( object sender, PreviewKeyDownEventArgs e ) {
 | ||
|             if ( e.KeyCode == Keys.Delete ) {
 | ||
|                 DeleteEntry();
 | ||
|             }
 | ||
|             if ( AppManager.Playing && menuEditRealTime.Checked ) {
 | ||
|                 if ( m_last_key == e.KeyCode ) {
 | ||
|                     return;
 | ||
|                 }
 | ||
|                 string target = "";
 | ||
|                 float m_end = Now;
 | ||
|                 switch ( e.KeyCode ) {
 | ||
|                     case Keys.A:
 | ||
|                         target = "a";
 | ||
|                         break;
 | ||
|                     case Keys.I:
 | ||
|                         target = "i";
 | ||
|                         break;
 | ||
|                     case Keys.U:
 | ||
|                         target = "u";
 | ||
|                         break;
 | ||
|                     case Keys.E:
 | ||
|                         target = "e";
 | ||
|                         break;
 | ||
|                     case Keys.O:
 | ||
|                         target = "o";
 | ||
|                         break;
 | ||
|                     case Keys.Space:
 | ||
|                         if ( m_last_key != Keys.None ) {
 | ||
|                             TimeTableEntry tte = (TimeTableEntry)AppManager.SaveData.m_groups_character[m_realtime_group][m_realtime_track][m_realtime_entry].Clone();
 | ||
|                             tte.end = m_end;
 | ||
|                             AppManager.SaveData.m_groups_character[m_realtime_group][m_realtime_track][m_realtime_entry].end = m_end;
 | ||
|                             AppManager.SaveData.m_groups_character[m_realtime_group][m_realtime_track].RemoveAt( m_realtime_entry );
 | ||
|                             Command run = Command.GCommandAddTimeTableEntry( TimeTableType.character,
 | ||
|                                                                              m_realtime_group,
 | ||
|                                                                              m_realtime_track,
 | ||
|                                                                              tte );
 | ||
|                             AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                         }
 | ||
|                         m_last_key = Keys.None;
 | ||
|                         return;
 | ||
|                     default:
 | ||
|                         return;
 | ||
|                 }
 | ||
|                 //まず、直前に入力されたエントリを終了させる処理
 | ||
|                 if ( m_last_key != Keys.None ) {
 | ||
|                     TimeTableEntry tte = (TimeTableEntry)AppManager.SaveData.m_groups_character[m_realtime_group][m_realtime_track][m_realtime_entry].Clone();
 | ||
|                     tte.end = m_end;
 | ||
|                     AppManager.SaveData.m_groups_character[m_realtime_group][m_realtime_track].RemoveAt( m_realtime_entry );
 | ||
|                     Command run = Command.GCommandAddTimeTableEntry( TimeTableType.character,
 | ||
|                                                                      m_realtime_group,
 | ||
|                                                                      m_realtime_track,
 | ||
|                                                                      tte );
 | ||
|                     AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                 }
 | ||
|                 //今しがた押されたキーに対応するエントリを追加。
 | ||
|                 for ( int i = 0; i < AppManager.SaveData.m_groups_character[m_realtime_group].Count; i++ ) {
 | ||
|                     if ( AppManager.SaveData.m_groups_character[m_realtime_group][i].Text == target ) {
 | ||
|                         m_realtime_track = i;
 | ||
|                         break;
 | ||
|                     }
 | ||
|                 }
 | ||
|                 AppManager.SaveData.m_groups_character[m_realtime_group][m_realtime_track].Add( new TimeTableEntry( m_end, m_end, target ) );
 | ||
|                 AppManager.SaveData.m_groups_character[m_realtime_group][m_realtime_track].Sort();
 | ||
|                 //sortしたのでm_realtime_entryを検索で探す
 | ||
|                 for ( int entry = 0; entry < AppManager.SaveData.m_groups_character[m_realtime_group][m_realtime_track].Count; entry++ ) {
 | ||
|                     if ( AppManager.SaveData.m_groups_character[m_realtime_group][m_realtime_track][entry].begin == m_end ) {
 | ||
|                         m_realtime_entry = entry;
 | ||
|                         break;
 | ||
|                     }
 | ||
|                 }
 | ||
|                 m_last_key = e.KeyCode;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void pictureBox1_MouseClick( object sender, MouseEventArgs e ) {
 | ||
|             m_mousePosition.X = e.X;
 | ||
|             m_mousePosition.Y = e.Y;
 | ||
| 
 | ||
|             if ( e.Button == MouseButtons.Right ) {
 | ||
|                 if ( 0 <= e.Y && e.Y <= AppManager.Config.TrackHeight ) {
 | ||
|                     cmenuRepeat.Show( pictureBox1, e.X, e.Y );
 | ||
|                     return;
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             if ( m_edit_mode == EditMode.Dragging ) {
 | ||
|                 return;
 | ||
|             }
 | ||
| 
 | ||
|             if ( m_edit_mode == EditMode.Sliding ) {
 | ||
|                 if ( m_slide_moved ) {
 | ||
|                     return;
 | ||
|                 }
 | ||
|                 m_edit_mode = EditMode.None;
 | ||
|             }
 | ||
| 
 | ||
|             if ( m_edit_mode == EditMode.Selected ) {
 | ||
|                 if ( e.Button == MouseButtons.Right ) {
 | ||
|                     m_edit_mode = EditMode.None;
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             if ( m_edit_mode == EditMode.None/*!m_editMode*/ ) {
 | ||
|                 m_clicked = GetGroupItem( m_mousePosition.X + m_startToDrawX, m_mousePosition.Y + m_startToDrawY );
 | ||
|                 if ( e.Button == MouseButtons.Right ) {
 | ||
|                     #region 右クリック
 | ||
|                     m_edit_mode = EditMode.None;
 | ||
|                     int group = m_clicked.group;
 | ||
|                     int track = m_clicked.track;
 | ||
|                     int entry = m_clicked.entry;
 | ||
| 
 | ||
|                     if ( !cmenu.IsDisposed || cmenu != null ) {
 | ||
|                         cmenu.Dispose();
 | ||
|                     }
 | ||
|                     cmenu = new ContextMenuStrip();
 | ||
|                     cmenu.RenderMode = ToolStripRenderMode.ManagerRenderMode;
 | ||
|                     cmenu.ShowCheckMargin = false;
 | ||
|                     cmenu.ShowImageMargin = false;
 | ||
|                     cmenu.Font = AppManager.Config.Font.GetFont();
 | ||
| 
 | ||
|                     if ( m_clicked.type == TimeTableType.top ) {
 | ||
|                         return;
 | ||
|                     }
 | ||
|                     if ( group < 0 ) {
 | ||
|                         cmenu.Items.Add( _( "Video size configuration" ),
 | ||
|                                          null,
 | ||
|                                          new EventHandler( h_setVideoSize ) );
 | ||
|                     } else {
 | ||
|                         if ( track < 0 ) {
 | ||
|                             #region タイトルがクリックされたとき
 | ||
|                             switch ( m_clicked.type ) {
 | ||
|                                 case TimeTableType.vsq:
 | ||
|                                     cmenu.Items.Add( _( "Read from VSQ file" ), null, new EventHandler( h_readVsq ) );
 | ||
|                                     break;
 | ||
|                                 case TimeTableType.character:
 | ||
|                                     if ( AppManager.SaveData.m_groups_character[group].Character != null ) {
 | ||
|                                         cmenu.Items.Add( _( "Edit character" ), null, new EventHandler( h_editCharacter ) );
 | ||
|                                         if ( AppManager.SaveData.m_groups_character[group].Character.Type == CharacterType.def ) {
 | ||
|                                             cmenu.Items.Add( "-" );
 | ||
|                                             cmenu.Items.Add( _( "Preview image" ), null, new EventHandler( h_previewImage ) );
 | ||
|                                             cmenu.Items.Add( _( "Image placement" ), null, new EventHandler( h_setImagePosition ) );
 | ||
|                                             cmenu.Items.Add( _( "Scale setting" ), null, new EventHandler( h_setScale ) );
 | ||
|                                             cmenu.Items.Add( "-" );
 | ||
|                                             cmenu.Items.Add( _( "Generate wink" ), null, new EventHandler( h_addWink ) );
 | ||
|                                         }
 | ||
|                                     }
 | ||
|                                     cmenu.Items.Add( "-" );
 | ||
|                                     cmenu.Items.Add( _( "Delete" ), null, new EventHandler( h_deleteTrack ) );
 | ||
|                                     break;
 | ||
|                                 case TimeTableType.telop:
 | ||
|                                     cmenu.Items.Add( _( "Add Telop" ), null, new EventHandler( h_addTelop ) );
 | ||
|                                     break;
 | ||
|                                 case TimeTableType.another:
 | ||
|                                     cmenu.Items.Add( _( "Add track" ), null, new EventHandler( h_addTrack ) );
 | ||
|                                     break;
 | ||
|                             }
 | ||
|                             #endregion
 | ||
|                         } else {
 | ||
|                             bool copy_enabled = true;
 | ||
|                             if ( entry < 0 ) {
 | ||
|                                 #region トラックがクリックされたとき
 | ||
|                                 switch ( m_clicked.type ) {
 | ||
|                                     case TimeTableType.vsq:
 | ||
|                                         cmenu.Items.Add( _( "Generate Lipsync from this track" ), null, new EventHandler( h_genMouthFromVsq ) );
 | ||
|                                         if ( AppManager.SaveData.m_group_vsq[track].Count == 0 ) {
 | ||
|                                             copy_enabled = false;
 | ||
|                                         }
 | ||
|                                         break;
 | ||
|                                     case TimeTableType.character:
 | ||
|                                         cmenu.Items.Add( _( "Note ON from here" ) + "(&O)",
 | ||
|                                                          null,
 | ||
|                                                          new EventHandler( h_noteON ) );
 | ||
|                                         cmenu.Items.Add( _( "Preview image" ),
 | ||
|                                                          null,
 | ||
|                                                          new EventHandler( h_previewImage ) );
 | ||
|                                         if ( AppManager.SaveData.m_groups_character[group][track].Count == 0 ) {
 | ||
|                                             copy_enabled = false;
 | ||
|                                         }
 | ||
|                                         break;
 | ||
|                                     case TimeTableType.another:
 | ||
|                                         cmenu.Items.Add( _( "Note ON from here" ) + "(&O)",
 | ||
|                                                          null,
 | ||
|                                                          new EventHandler( h_noteON ) );
 | ||
|                                         if ( AppManager.SaveData.m_group_another[track].Image == null ) {
 | ||
|                                             cmenu.Items.Add( _( "Set image" ),
 | ||
|                                                              null,
 | ||
|                                                              new EventHandler( h_setImage ) );
 | ||
|                                         } else {
 | ||
|                                             cmenu.Items.Add( _( "Preview image" ),
 | ||
|                                                              null,
 | ||
|                                                              new EventHandler( h_previewImage ) );
 | ||
|                                             cmenu.Items.Add( _( "Change image" ),
 | ||
|                                                              null,
 | ||
|                                                              new EventHandler( h_setImage ) );
 | ||
|                                         }
 | ||
|                                         ToolStripMenuItem mItemImage = new ToolStripMenuItem( _( "Image" ) );
 | ||
|                                         mItemImage.DropDown = new ContextMenuStrip();
 | ||
|                                         ((ContextMenuStrip)mItemImage.DropDown).Items.Add( _( "Image placement" ),
 | ||
|                                                                                            null,
 | ||
|                                                                                            new EventHandler( h_setImagePosition ) );
 | ||
|                                         ((ContextMenuStrip)mItemImage.DropDown).Items.Add( _( "Scale setting" ),
 | ||
|                                                                                            null,
 | ||
|                                                                                            new EventHandler( h_setScale ) );
 | ||
|                                         ((ContextMenuStrip)mItemImage.DropDown).ShowCheckMargin = false;
 | ||
|                                         ((ContextMenuStrip)mItemImage.DropDown).ShowImageMargin = false;
 | ||
|                                         cmenu.Items.Add( mItemImage );
 | ||
|                                         if ( AppManager.SaveData.m_group_another[track].Count == 0 ) {
 | ||
|                                             copy_enabled = false;
 | ||
|                                         }
 | ||
|                                         break;
 | ||
|                                     case TimeTableType.plugin:
 | ||
|                                         cmenu.Items.Add( _( "Note ON from here" ) + "(&O)",
 | ||
|                                                          null,
 | ||
|                                                          new EventHandler( h_noteON ) );
 | ||
|                                         if ( AppManager.SaveData.m_group_plugin[track].Count == 0 ) {
 | ||
|                                             copy_enabled = false;
 | ||
|                                         }
 | ||
|                                         break;
 | ||
|                                 }
 | ||
| 
 | ||
|                                 //エントリの貼付け
 | ||
|                                 if ( m_clicked.type != TimeTableType.vsq ) {
 | ||
|                                     cmenu.Items.Add( _( "Paste" ) + "(&V)",
 | ||
|                                                      null,
 | ||
|                                                      new EventHandler( h_pasteEntry ) );
 | ||
|                                     if ( m_copied_entry == null && m_copied_telop == null ) {
 | ||
|                                         cmenu.Items[cmenu.Items.Count - 1].Enabled = false;
 | ||
|                                     }
 | ||
|                                 }
 | ||
| 
 | ||
| 
 | ||
|                                 #endregion
 | ||
|                             } else {
 | ||
|                                 #region エントリがクリックされたとき
 | ||
|                                 copy_enabled = true;//エントリがクリックされたので、エントリの個数は1個以上!
 | ||
|                                 if ( m_clicked.type != TimeTableType.vsq ) {
 | ||
|                                     cmenu.Items.Add( _( "Note OFF" ) + "(&O)", null, new EventHandler( h_noteOFF ) );
 | ||
|                                     if ( m_clicked.type == TimeTableType.character ) {
 | ||
|                                         cmenu.Items.Add( _( "Image Preview" ), null, new EventHandler( h_previewImage ) );
 | ||
|                                     }
 | ||
|                                     cmenu.Items.Add( _( "Numeric Entry" ) + "(&N)", null, new EventHandler( h_editEntry ) );
 | ||
|                                     if ( m_clicked.type != TimeTableType.telop ) {
 | ||
|                                         cmenu.Items.Add( _( "Expand" ) + "(&E)", null, new EventHandler( h_expandEntry ) );
 | ||
|                                     }
 | ||
|                                     cmenu.Items.Add( "-" );
 | ||
| 
 | ||
|                                     // グループ固有の機能
 | ||
|                                     if ( m_clicked.type == TimeTableType.another ) {
 | ||
|                                         if ( AppManager.SaveData.m_group_another[track].Image == null ) {
 | ||
|                                             //if ( s.m_group_another[track].GetImage( 0f ) == null ) {
 | ||
|                                             cmenu.Items.Add( _( "Set Image" ), null, new EventHandler( h_setImage ) );
 | ||
|                                         } else {
 | ||
|                                             cmenu.Items.Add( _( "Preview Image" ), null, new EventHandler( h_previewImage ) );
 | ||
|                                             cmenu.Items.Add( _( "Change Image" ), null, new EventHandler( h_setImage ) );
 | ||
|                                         }
 | ||
|                                         ToolStripMenuItem mItemImage = new ToolStripMenuItem( _( "Image" ) );
 | ||
|                                         mItemImage.DropDown = new ContextMenuStrip();
 | ||
|                                         ((ContextMenuStrip)mItemImage.DropDown).Items.Add( _( "Image placement" ),
 | ||
|                                                                                            null,
 | ||
|                                                                                            new EventHandler( h_setImagePosition ) );
 | ||
|                                         ((ContextMenuStrip)mItemImage.DropDown).Items.Add( _( "Scale setting" ),
 | ||
|                                                                                            null,
 | ||
|                                                                                            new EventHandler( h_setScale ) );
 | ||
|                                         ((ContextMenuStrip)mItemImage.DropDown).ShowCheckMargin = false;
 | ||
|                                         ((ContextMenuStrip)mItemImage.DropDown).ShowImageMargin = false;
 | ||
|                                         cmenu.Items.Add( mItemImage );
 | ||
|                                         cmenu.Items.Add( "-" );
 | ||
|                                     } else if ( m_clicked.type == TimeTableType.plugin ) {
 | ||
|                                         if ( (AppManager.SaveData.m_plugins[m_clicked.track].Instance.Type & Constants.LS_ENABLES_ENTRY_SETTING) == Constants.LS_ENABLES_ENTRY_SETTING ) {
 | ||
|                                             cmenu.Items.Add( _( "Plugin config. of this entry" ), null, new EventHandler( h_entrySetting ) );
 | ||
|                                             cmenu.Items.Add( "-" );
 | ||
|                                         }
 | ||
|                                     }
 | ||
| 
 | ||
|                                     //編集系の共通コマンド
 | ||
|                                     cmenu.Items.Add( _( "Copy" ) + "(&C)", null, new EventHandler( h_copyEntry ) );
 | ||
|                                     cmenu.Items.Add( _( "Cut" ) + "(&X)", null, new EventHandler( h_cutEntry ) );
 | ||
|                                     cmenu.Items.Add( _( "Split Entry" ) + "(&S)", null, new EventHandler( h_splitEntry ) );
 | ||
|                                 }
 | ||
|                                 #endregion
 | ||
|                             }
 | ||
| 
 | ||
|                             #region タイムライン用の共通コマンド
 | ||
|                             //タイムライン
 | ||
|                             if ( m_clicked.type != TimeTableType.telop ) {
 | ||
|                                 ToolStripMenuItem mItemTimeline = new ToolStripMenuItem( _( "Timeline" ) );
 | ||
|                                 ContextMenuStrip cItemTimeline = new ContextMenuStrip();
 | ||
|                                 cItemTimeline.Items.Add( _( "Copy" ), null, new EventHandler( h_copyTimeTable ) );
 | ||
|                                 if ( !copy_enabled ) {
 | ||
|                                     cItemTimeline.Items[cItemTimeline.Items.Count - 1].Enabled = false;
 | ||
|                                 }
 | ||
|                                 cItemTimeline.Items.Add( _( "Copy On/Off inverted" ), null, new EventHandler( h_copyTimeTableInvert ) );
 | ||
|                                 if ( !copy_enabled ) {
 | ||
|                                     cItemTimeline.Items[cItemTimeline.Items.Count - 1].Enabled = false;
 | ||
|                                 }
 | ||
|                                 cItemTimeline.Items.Add( _( "Paste" ), null, new EventHandler( h_pasteTimeTable ) );
 | ||
|                                 if ( m_copied_timetable == null ) {
 | ||
|                                     cItemTimeline.Items[cItemTimeline.Items.Count - 1].Enabled = false;
 | ||
|                                 }
 | ||
|                                 cItemTimeline.Items.Add( _( "Import from TEXT" ), null, new EventHandler( h_importFromText ) );
 | ||
|                                 cItemTimeline.Items.Add( _( "Export to TEXT" ), null, new EventHandler( h_exportToText ) );
 | ||
|                                 cItemTimeline.ShowCheckMargin = false;
 | ||
|                                 cItemTimeline.ShowImageMargin = false;
 | ||
|                                 mItemTimeline.DropDown = cItemTimeline;
 | ||
|                                 cmenu.Items.Add( mItemTimeline );
 | ||
|                             }
 | ||
| 
 | ||
|                             //編集
 | ||
|                             ToolStripMenuItem mItemEdit = new ToolStripMenuItem( _( "Edit" ) );
 | ||
|                             ContextMenuStrip cItemEdit = new ContextMenuStrip();
 | ||
|                             if ( m_clicked.type != TimeTableType.plugin && m_clicked.type != TimeTableType.character && m_clicked.type != TimeTableType.telop ) {
 | ||
|                                 cItemEdit.Items.Add( _( "Delete" ), null, new EventHandler( h_deleteTrack ) );
 | ||
|                             }
 | ||
|                             cItemEdit.Items.Add( _( "Delete entries" ), null, new EventHandler( h_clearEntry ) );
 | ||
|                             if ( !copy_enabled ) {
 | ||
|                                 cItemEdit.Items[cItemEdit.Items.Count - 1].Enabled = false;
 | ||
|                             }
 | ||
|                             cItemEdit.Items.Add( _( "Shift this time-line" ), null, new EventHandler( h_shiftEntries ) );
 | ||
|                             if ( !copy_enabled ) {
 | ||
|                                 cItemEdit.Items[cItemEdit.Items.Count - 1].Enabled = false;
 | ||
|                             }
 | ||
|                             cItemEdit.ShowCheckMargin = false;
 | ||
|                             cItemEdit.ShowImageMargin = false;
 | ||
|                             mItemEdit.DropDown = cItemEdit;
 | ||
|                             cmenu.Items.Add( mItemEdit );
 | ||
| 
 | ||
|                             #endregion
 | ||
| 
 | ||
|                         }
 | ||
|                     }
 | ||
|                     if ( cmenu.Items.Count >= 1 ) {
 | ||
|                         cmenu.Show( pictureBox1, new Point( e.X, e.Y ) );
 | ||
|                     }
 | ||
|                     #endregion
 | ||
|                 } else if ( e.Button == MouseButtons.Left ) {
 | ||
|                     #region 左クリック
 | ||
|                     if ( m_clicked.entry >= 0 ) {
 | ||
|                         m_edit_handle_ed_item = GetGroupItem( e.X + m_startToDrawX, e.Y + m_startToDrawY );
 | ||
| #if DEBUG
 | ||
|                         Common.DebugWriteLine( "pictureBox1_MouseClick; m_edit_handle_ed_item.entry=" + m_edit_handle_ed_item.entry );
 | ||
| #endif
 | ||
|                         UpdateEditHandle( e.X, e.Y );
 | ||
|                         m_edit_mode = EditMode.Selected;
 | ||
|                         float time = SecFromXCoord( e.X );
 | ||
|                         UpdateExpandRange( time );
 | ||
|                         if ( m_clicked.type == TimeTableType.telop ) {
 | ||
|                             Telop selected = AppManager.SaveData[m_clicked.entry];
 | ||
|                             property.Editing = new ZorderItem( selected.Text, ZorderItemType.telop, selected.ID );
 | ||
|                         }
 | ||
|                         pictureBox1.Invalidate();
 | ||
|                     }
 | ||
|                     #endregion
 | ||
|                 }
 | ||
|             } else if ( m_edit_mode != EditMode.EditingLeft && m_edit_mode != EditMode.EditingRight/* !m_editEntry*/ ) {
 | ||
|                 m_clicked = GetGroupItem( e.X + m_startToDrawX, e.Y + m_startToDrawY );
 | ||
|                 if ( m_clicked.entry >= 0 ) {
 | ||
|                     UpdateEditHandle( e.X, e.Y );
 | ||
|                     float time = SecFromXCoord( e.X );
 | ||
|                     UpdateExpandRange( time );
 | ||
|                     if ( m_clicked.type == TimeTableType.telop ) {
 | ||
|                         Telop selected = AppManager.SaveData[m_clicked.entry];
 | ||
|                         property.Editing = new ZorderItem( selected.Text, ZorderItemType.telop, selected.ID );
 | ||
|                     }
 | ||
|                     pictureBox1.Invalidate();
 | ||
|                 } else {
 | ||
|                     m_edit_mode = EditMode.None;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void pictureBox1_MouseMove( object sender, MouseEventArgs e ) {
 | ||
|             if ( AppManager.Playing ) {
 | ||
|                 m_mousePosition = e.Location;
 | ||
|                 return;
 | ||
|             }
 | ||
| 
 | ||
|             Rectangle last = m_rcHilight;
 | ||
|             m_rcHilight = GetHilightRect( m_mousePosition.X, m_mousePosition.Y );
 | ||
| 
 | ||
|             if ( preview_image.Visible ) {
 | ||
|                 TimeSpan ts = DateTime.Now.Subtract( m_preview_time );
 | ||
|                 if ( ts.TotalMilliseconds > 1000 ) {
 | ||
|                     preview_image.Visible = false;
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             statusTime.Text = SecFromXCoord( e.X ).ToString( "0.00" ) + " sec";
 | ||
|             if ( m_edit_mode != EditMode.Selected ) {
 | ||
|                 m_mousePosition.X = e.X;
 | ||
|                 m_mousePosition.Y = e.Y;
 | ||
|                 if ( m_edit_mode == EditMode.Dragging ) {
 | ||
|                     // エントリを追加するモード
 | ||
|                     m_editing_t2 = SecFromXCoord( e.X );
 | ||
|                     m_slide_moved = true;
 | ||
|                     if ( AppManager.Config.QuantizeMode != QuantizeMode.off && m_grids != null ) {
 | ||
|                         m_editing_t2 = GetSnapPoint( m_editing_t2 );
 | ||
|                     }
 | ||
|                     float begin = m_editing_t1;
 | ||
|                     float end = m_editing_t2;
 | ||
|                     if ( begin > end ) {
 | ||
|                         float b = begin;
 | ||
|                         begin = end;
 | ||
|                         end = b;
 | ||
|                     }
 | ||
|                     if ( begin < 0f ) {
 | ||
|                         begin = 0f;
 | ||
|                     }
 | ||
|                     if ( AppManager.SaveData.m_totalSec < end ) {
 | ||
|                         end = AppManager.SaveData.m_totalSec;
 | ||
|                     }
 | ||
|                     if ( m_dragging.type == TimeTableType.telop ) {
 | ||
|                         AppManager.SaveData[m_editing_telop_original.ID].Start = begin;
 | ||
|                         AppManager.SaveData[m_editing_telop_original.ID].End = end;
 | ||
|                     } else if ( m_dragging.type != TimeTableType.vsq ) {
 | ||
|                         AppManager.SaveData[m_dragging.type, m_dragging.group] = null;
 | ||
|                         AppManager.SaveData[m_dragging.type, m_dragging.group] = (TimeTableGroup)m_editing_group.Clone();
 | ||
|                         AppManager.SaveData[m_dragging.type, m_dragging.group].Interrup( m_dragging.track, begin, end );
 | ||
|                     }
 | ||
|                     pictureBox1.Cursor = Cursors.Arrow;
 | ||
|                 } else if ( m_edit_mode == EditMode.Sliding ) {
 | ||
|                     // エントリをドラッグしてスライドさせるモード
 | ||
|                     m_slide_moved = true;
 | ||
|                     m_editing_t2 = SecFromXCoord( e.X );
 | ||
|                     int group = m_dragging.group;
 | ||
|                     int track = m_dragging.track;
 | ||
|                     int entry = m_dragging.entry;
 | ||
|                     float diff = (m_editing_t2 - m_editing_t1);
 | ||
|                     float original_begin;
 | ||
|                     if ( m_dragging.type == TimeTableType.telop ) {
 | ||
|                         original_begin = m_editing_telop_original.Start;
 | ||
|                     } else {
 | ||
|                         original_begin = m_slide_original.begin;
 | ||
|                     }
 | ||
|                     float begin = original_begin + diff;
 | ||
| 
 | ||
|                     if ( AppManager.Config.QuantizeMode != QuantizeMode.off && m_grids != null ) {
 | ||
|                         begin = GetSnapPoint( begin );
 | ||
|                         diff = begin - original_begin;
 | ||
|                     }
 | ||
|                     float end = 0;
 | ||
|                     float length = 0;
 | ||
| 
 | ||
|                     if ( m_dragging.type == TimeTableType.telop ) {
 | ||
|                         end = m_editing_telop_original.End + diff;
 | ||
|                         length = m_editing_telop_original.Length;
 | ||
|                     } else if ( m_dragging.type != TimeTableType.vsq ) {
 | ||
|                         end = AppManager.SaveData[m_dragging.type, group][track][entry].end + diff;
 | ||
|                         length = AppManager.SaveData[m_dragging.type, group][track][entry].Length;
 | ||
|                         if ( begin < m_expandRange.X ) {
 | ||
|                             begin = m_expandRange.X;
 | ||
|                             end = begin + length;
 | ||
|                         } else {
 | ||
|                             if ( m_expandRange.Y < end ) {
 | ||
|                                 end = m_expandRange.Y;
 | ||
|                                 begin = end - length;
 | ||
|                             } else {
 | ||
|                                 end = begin + length;
 | ||
|                             }
 | ||
|                         }
 | ||
|                     }
 | ||
| 
 | ||
|                     int ibegin = XCoordFromSec( begin );
 | ||
|                     int y = m_dragging.row_index * AppManager.Config.TrackHeight - m_startToDrawY;
 | ||
|                     int width = (int)(length * AppManager.Config.PixelPerSec);
 | ||
|                     m_rcHilight = new Rectangle( ibegin, y, width, AppManager.Config.TrackHeight );
 | ||
| 
 | ||
|                     if ( m_dragging.type == TimeTableType.telop ) {
 | ||
|                         AppManager.SaveData[m_editing_telop_original.ID].Start = begin;
 | ||
|                         AppManager.SaveData[m_editing_telop_original.ID].End = end;
 | ||
|                     } else if ( m_dragging.type != TimeTableType.vsq ) {
 | ||
|                         AppManager.SaveData[m_dragging.type, group][track][entry].begin = begin;
 | ||
|                         AppManager.SaveData[m_dragging.type, group][track][entry].end = end;
 | ||
|                     }
 | ||
|                     pictureBox1.Cursor = Cursors.Arrow;
 | ||
|                 } else if ( m_edit_mode == EditMode.EditingLeft || m_edit_mode == EditMode.EditingRight ) {
 | ||
|                     TimeTableType type = m_edit_handle_ed_item.type;
 | ||
|                     if ( type != TimeTableType.vsq ) {
 | ||
|                         int group = m_edit_handle_ed_item.group;
 | ||
|                         int track = m_edit_handle_ed_item.track;
 | ||
|                         int entry = m_edit_handle_ed_item.entry;
 | ||
|                         if ( entry < 0 ) {
 | ||
|                             m_edit_mode = EditMode.None;
 | ||
|                             return;
 | ||
|                         }
 | ||
|                         float draft_begin, draft_end;
 | ||
|                         if ( type == TimeTableType.telop ) {
 | ||
|                             draft_begin = m_editing_telop_original.Start;
 | ||
|                             draft_end = m_editing_telop_original.End;
 | ||
|                         } else {
 | ||
|                             draft_begin = m_editing_group[track][entry].begin;
 | ||
|                             draft_end = m_editing_group[track][entry].end;
 | ||
|                         }
 | ||
|                         if ( m_edit_mode == EditMode.EditingLeft ) {
 | ||
|                             draft_begin = SecFromXCoord( e.X );
 | ||
|                             if ( AppManager.Config.QuantizeMode != QuantizeMode.off && m_grids != null ) {
 | ||
|                                 draft_begin = GetSnapPoint( draft_begin );
 | ||
|                             }
 | ||
|                             if ( draft_begin < 0f ) {
 | ||
|                                 draft_begin = 0f;
 | ||
|                             }
 | ||
|                         } else {
 | ||
|                             draft_end = SecFromXCoord( e.X );
 | ||
|                             if ( AppManager.Config.QuantizeMode != QuantizeMode.off && m_grids != null ) {
 | ||
|                                 draft_end = GetSnapPoint( draft_end );
 | ||
|                             }
 | ||
|                             if ( AppManager.SaveData.m_totalSec < draft_end ) {
 | ||
|                                 draft_end = AppManager.SaveData.m_totalSec;
 | ||
|                             }
 | ||
|                         }
 | ||
|                         if ( draft_begin < draft_end ) {
 | ||
|                             if ( type == TimeTableType.telop ) {
 | ||
|                                 AppManager.SaveData[entry].Start = draft_begin;
 | ||
|                                 AppManager.SaveData[entry].End = draft_end;
 | ||
|                             } else {
 | ||
|                                 AppManager.SaveData[type, group] = null;
 | ||
|                                 AppManager.SaveData[type, group] = (TimeTableGroup)m_editing_group.Clone();
 | ||
|                                 AppManager.SaveData[type, group][track].RemoveAt( entry );
 | ||
|                                 AppManager.SaveData[type, group].Interrup( track, draft_begin, draft_end );
 | ||
|                             }
 | ||
|                         }
 | ||
|                     }
 | ||
|                     pictureBox1.Cursor = Cursors.VSplit;
 | ||
|                 }
 | ||
|             } else {
 | ||
|                 Point pt = new Point( e.X, e.Y );
 | ||
|                 if ( AppManager.IsInRectangle( pt, m_editHandleLeft ) ) {
 | ||
|                     pictureBox1.Cursor = Cursors.VSplit;
 | ||
|                 } else if ( AppManager.IsInRectangle( pt, m_editHandleRight ) ) {
 | ||
|                     pictureBox1.Cursor = Cursors.VSplit;
 | ||
|                 } else {
 | ||
|                     pictureBox1.Cursor = Cursors.Arrow;
 | ||
|                 }
 | ||
|             }
 | ||
|             pictureBox1.Refresh();
 | ||
|         }
 | ||
| 
 | ||
|         private void pictureBox1_MouseLeave( object sender, EventArgs e ) {
 | ||
|             pictureBox1.Invalidate();
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 
 | ||
|         /// </summary>
 | ||
|         /// <param name="sender"></param>
 | ||
|         /// <param name="e"></param>
 | ||
|         private void pictureBox1_MouseDown( object sender, MouseEventArgs e ) {
 | ||
|             pictureBox1.Focus();
 | ||
| 
 | ||
|             m_mousePosition.X = e.X;
 | ||
|             m_mousePosition.Y = e.Y;
 | ||
| 
 | ||
|             if ( m_edit_mode == EditMode.Selected ) {
 | ||
|                 if ( m_edit_handle_ed_item.type == TimeTableType.telop ) {
 | ||
|                     int id = m_edit_handle_ed_item.entry;
 | ||
|                     if ( AppManager.IsInRectangle( e.Location, m_editHandleLeft ) ) {
 | ||
|                         m_editing_telop_original = (Telop)AppManager.SaveData[id].Clone();
 | ||
|                         m_edit_mode = EditMode.EditingLeft;
 | ||
|                     } else if ( AppManager.IsInRectangle( e.Location, m_editHandleRight ) ) {
 | ||
|                         m_editing_telop_original = (Telop)AppManager.SaveData[id].Clone();
 | ||
|                         m_edit_mode = EditMode.EditingRight;
 | ||
|                     }
 | ||
|                 } else {
 | ||
|                     if ( AppManager.IsInRectangle( e.Location, m_editHandleLeft ) ) {
 | ||
|                         m_editing_group = null;
 | ||
|                         m_editing_group = (TimeTableGroup)AppManager.SaveData[m_edit_handle_ed_item.type, m_edit_handle_ed_item.group].Clone();
 | ||
|                         m_edit_mode = EditMode.EditingLeft;
 | ||
|                     } else if ( AppManager.IsInRectangle( e.Location, m_editHandleRight ) ) {
 | ||
|                         m_editing_group = null;
 | ||
|                         m_editing_group = (TimeTableGroup)AppManager.SaveData[m_edit_handle_ed_item.type, m_edit_handle_ed_item.group].Clone();
 | ||
|                         m_edit_mode = EditMode.EditingRight;
 | ||
|                     }
 | ||
|                 }
 | ||
| #if DEBUG
 | ||
|                 Common.DebugWriteLine( "pictureBox1_MouseDown; m_edit_handle_ed_item.entry=" + m_edit_handle_ed_item.entry );
 | ||
| #endif
 | ||
|             } else if ( e.Button == MouseButtons.Left ) {
 | ||
|                 m_editing_t1 = SecFromXCoord( e.X );
 | ||
|                 if ( AppManager.Config.QuantizeMode != QuantizeMode.off ) {
 | ||
|                     m_editing_t1 = GetSnapPoint( m_editing_t1 );
 | ||
|                 }
 | ||
|                 m_clicked = GetGroupItem( m_mousePosition.X + m_startToDrawX, m_mousePosition.Y + m_startToDrawY );
 | ||
|                 if ( m_clicked.track >= 0 ) {
 | ||
|                     int track = m_clicked.track;
 | ||
|                     int group = m_clicked.group;
 | ||
|                     int entry = m_clicked.entry;
 | ||
|                     if ( m_clicked.type == TimeTableType.vsq ) {
 | ||
|                         m_edit_mode = EditMode.None;
 | ||
|                     } else if ( m_clicked.type == TimeTableType.telop ) {
 | ||
|                         m_slide_moved = false;
 | ||
|                         m_dragging = m_clicked;
 | ||
|                         if ( m_clicked.entry < 0 ) {
 | ||
|                             int id = AppManager.SaveData.GetNextID();
 | ||
|                             m_editing_telop_original = new Telop( id );
 | ||
|                             m_editing_telop_original.Text = "(none)";
 | ||
|                             m_editing_telop_original.Start = SecFromXCoord( e.X );
 | ||
|                             m_editing_telop_original.End = m_editing_telop_original.Start;
 | ||
|                             m_editing_telop_original.Lane = m_clicked.track;
 | ||
|                             Command run2 = Command.GCommandAddTelop( m_editing_telop_original );
 | ||
|                             AppManager.SaveData.Execute( run2 );
 | ||
|                             m_edit_mode = EditMode.Dragging;
 | ||
|                         } else {
 | ||
|                             m_editing_telop_original = (Telop)AppManager.SaveData[m_clicked.entry].Clone();
 | ||
|                             m_edit_mode = EditMode.Sliding;
 | ||
|                         }
 | ||
|                     } else {
 | ||
|                         m_editing_group = null;
 | ||
|                         m_editing_group = (TimeTableGroup)AppManager.SaveData[m_clicked.type, m_clicked.group].Clone();
 | ||
|                         m_dragging = new Item( m_clicked.type, m_clicked.group, m_clicked.track, m_clicked.entry, m_clicked.row_index );
 | ||
|                         m_slide_moved = false;
 | ||
|                         if ( m_clicked.entry < 0 ) {
 | ||
|                             // エントリ追加モード
 | ||
|                             m_edit_mode = EditMode.Dragging;
 | ||
|                         } else {
 | ||
|                             // エントリスライドモード
 | ||
|                             m_edit_mode = EditMode.Sliding;
 | ||
|                             UpdateExpandRange( SecFromXCoord( e.X ) );
 | ||
|                             if ( m_clicked.type != TimeTableType.vsq ) {
 | ||
|                                 m_slide_original = (TimeTableEntry)AppManager.SaveData[m_clicked.type, group][track][entry].Clone();
 | ||
|                             }
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void pictureBox1_MouseDoubleClick( object sender, MouseEventArgs e ) {
 | ||
|             if ( m_edit_mode == EditMode.None ) {
 | ||
|                 Item clicked = GetGroupItem( e.X + m_startToDrawX, e.Y + m_startToDrawY );
 | ||
|                 if ( clicked.type == TimeTableType.top ) {
 | ||
|                     float time = SecFromXCoord( e.X );
 | ||
|                     int nof = (int)(time * AppManager.SaveData.FrameRate);
 | ||
|                     if ( previewer.TrackBarMinimum <= nof && nof <= previewer.TrackBarMaximum ) {
 | ||
|                         previewer.TrackBarValue = nof;
 | ||
|                         correctPosition();
 | ||
|                         this.Invalidate();
 | ||
|                     }
 | ||
|                 } else if ( clicked.track < 0 ) {
 | ||
|                     if ( clicked.type == TimeTableType.telop ) {
 | ||
|                         AppManager.SaveData.TelopListFolded = !AppManager.SaveData.TelopListFolded;
 | ||
|                         SetVScrollRange();
 | ||
|                         Invalidate();
 | ||
|                     } else {
 | ||
|                         if ( AppManager.SaveData[clicked.type, clicked.group] != null ) {
 | ||
|                             AppManager.SaveData[clicked.type, clicked.group].Folded = !AppManager.SaveData[clicked.type, clicked.group].Folded;
 | ||
|                             SetVScrollRange();
 | ||
|                             this.Invalidate();
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
|             } else {
 | ||
|                 Item clicked = GetGroupItem( e.X + m_startToDrawX, e.Y + m_startToDrawY );
 | ||
|                 if ( clicked.entry >= 0 ) {
 | ||
|                     m_clicked = clicked;
 | ||
|                     h_editEntry( this, new EventArgs() );
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void pictureBox1_MouseUp( object sender, MouseEventArgs e ) {
 | ||
| #if DEBUG
 | ||
|             Common.DebugWriteLine( "pictureBox1_MouseUp" );
 | ||
|             Common.DebugWriteLine( "    m_slide_moved=" + m_slide_moved );
 | ||
| #endif
 | ||
|             if ( m_edit_mode == EditMode.EditingLeft || m_edit_mode == EditMode.EditingRight/* m_editEntry*/ ) {
 | ||
|                 #region EditMode.EditingLeft EditMode.EditRight
 | ||
|                 int x = e.X;
 | ||
| 
 | ||
|                 float time = SecFromXCoord( x );
 | ||
|                 float new_begin;
 | ||
|                 float new_end;
 | ||
| 
 | ||
|                 TimeTableType type = m_edit_handle_ed_item.type;
 | ||
|                 int group = m_edit_handle_ed_item.group;
 | ||
|                 int track = m_edit_handle_ed_item.track;
 | ||
|                 int entry = m_edit_handle_ed_item.entry;
 | ||
| #if DEBUG
 | ||
|                 Common.DebugWriteLine( "pictureBox1_MouseUp; m_edit_mode==EditingLeft||EditingRight;" );
 | ||
|                 Common.DebugWriteLine( "type=" + type + "; group=" + group + "; track=" + track + "; entry=" + entry );
 | ||
| #endif
 | ||
|                 if ( track < 0 || entry < 0 ) {
 | ||
|                     AppManager.SaveData[type, group] = null;
 | ||
|                     AppManager.SaveData[type, group] = (TimeTableGroup)m_editing_group.Clone();
 | ||
|                     return;
 | ||
|                 }
 | ||
| 
 | ||
|                 if ( type == TimeTableType.telop ) {
 | ||
|                     new_begin = AppManager.SaveData[entry].Start;
 | ||
|                     new_end = AppManager.SaveData[entry].End;
 | ||
|                 } else if ( type != TimeTableType.vsq ) {
 | ||
|                     new_begin = m_editing_group[track][entry].begin;
 | ||
|                     new_end = m_editing_group[track][entry].end;
 | ||
|                 } else {
 | ||
|                     m_edit_mode = EditMode.None;
 | ||
|                     return;
 | ||
|                 }
 | ||
| 
 | ||
|                 TimeTableEntry item;
 | ||
|                 if ( new_end <= new_begin ) {
 | ||
|                     // 終了時刻として開始時刻と同じか小さい時刻を指定された場合。エントリを削除
 | ||
|                     if ( type == TimeTableType.telop ) {
 | ||
|                         Command run = Command.GCommandDeleteTelop( AppManager.SaveData[entry] );
 | ||
|                         AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                     } else if ( type != TimeTableType.vsq ) {
 | ||
|                         int g = group;
 | ||
|                         if ( type != TimeTableType.character ) {
 | ||
|                             g = -1;
 | ||
|                         }
 | ||
|                         Command run = Command.GCommandDeleteTimeTableEntry( type, g, track, AppManager.SaveData[type, group][track][entry] );
 | ||
|                         AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                     }
 | ||
|                     AppManager.Edited = true;
 | ||
|                     this.Invalidate();
 | ||
|                     m_edit_mode = EditMode.None;
 | ||
|                     return;
 | ||
|                 }
 | ||
|                 if ( type == TimeTableType.telop ) {
 | ||
|                     Telop edited = (Telop)AppManager.SaveData[entry].Clone();
 | ||
|                     AppManager.SaveData[entry] = m_editing_telop_original;
 | ||
|                     Command run = Command.GCommandEditTelop( entry, edited );
 | ||
|                     AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                 } else if ( type != TimeTableType.vsq ) {
 | ||
|                     item = (TimeTableEntry)m_editing_group[track][entry].Clone();
 | ||
|                     item.begin = new_begin;
 | ||
|                     item.end = new_end;
 | ||
|                     if ( type != TimeTableType.character ) {
 | ||
|                         group = -1;
 | ||
|                     }
 | ||
|                     Command run = Command.GCommandEditGroup( type, group, AppManager.SaveData[type, group] );
 | ||
|                     AppManager.SaveData[type, group] = (TimeTableGroup)m_editing_group.Clone();
 | ||
|                     AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
| #if DEBUG
 | ||
|                     Common.DebugWriteLine( "Command run & registered" );
 | ||
| #endif
 | ||
|                 } else {
 | ||
|                     m_edit_mode = EditMode.None;
 | ||
|                     return;
 | ||
|                 }
 | ||
|                 pictureBox1.Cursor = Cursors.Arrow;
 | ||
|                 AppManager.Edited = true;
 | ||
|                 m_rcHilight = GetHilightRect( e.X, e.Y );
 | ||
|                 this.Invalidate();
 | ||
|                 m_edit_mode = EditMode.None;
 | ||
|                 #endregion
 | ||
|             } else if ( m_edit_mode == EditMode.Dragging ) {
 | ||
|                 #region EditMode.Dragging
 | ||
|                 m_edit_mode = EditMode.None;
 | ||
|                 TimeTableType type = m_dragging.type;
 | ||
|                 int group = m_dragging.group;
 | ||
|                 int track = m_dragging.track;
 | ||
|                 if ( type == TimeTableType.telop ) {
 | ||
|                     Telop added = null;
 | ||
|                     for ( int i = 0; i < AppManager.SaveData.m_telop_ex2.Count; i++ ) {
 | ||
|                         if ( AppManager.SaveData.m_telop_ex2[i].ID == m_editing_telop_original.ID ) {
 | ||
|                             added = (Telop)AppManager.SaveData.m_telop_ex2[i].Clone();
 | ||
|                             AppManager.SaveData.m_telop_ex2.RemoveAt( i );
 | ||
|                             break;
 | ||
|                         }
 | ||
|                     }
 | ||
|                     if ( added != null && m_slide_moved ) {
 | ||
|                         Telop.DecideLane( AppManager.SaveData.m_telop_ex2 );
 | ||
|                         Command run2 = Command.GCommandAddTelop( added );
 | ||
|                         Command inv = AppManager.SaveData.Execute( run2 );
 | ||
|                         property.Editing = new ZorderItem( inv.telop.Text, ZorderItemType.telop, inv.telop.ID );
 | ||
|                         AppManager.Register( inv );
 | ||
|                         UpdateEditHandle();
 | ||
|                         SetVScrollRange();
 | ||
|                         AppManager.Edited = true;
 | ||
|                     }
 | ||
|                 } else if ( type != TimeTableType.vsq ) {
 | ||
|                     int g = group;
 | ||
|                     if ( type != TimeTableType.character ) {
 | ||
|                         g = -1;
 | ||
|                     }
 | ||
|                     Command run = Command.GCommandEditGroup( type, g, AppManager.SaveData[type, group] );
 | ||
|                     AppManager.SaveData[type, group] = null;
 | ||
|                     AppManager.SaveData[type, group] = (TimeTableGroup)m_editing_group.Clone();
 | ||
|                     if ( m_slide_moved ) {
 | ||
|                         AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                         AppManager.Edited = true;
 | ||
|                     }
 | ||
|                 }
 | ||
|                 m_slide_moved = false;
 | ||
|                 //timerTimeLine.Enabled = true;
 | ||
|                 this.Invalidate();
 | ||
|                 #endregion
 | ||
|             } else if ( m_edit_mode == EditMode.Sliding ) {
 | ||
|                 #region EditMode.Sliding
 | ||
|                 TimeTableType type = m_dragging.type;
 | ||
|                 int group = m_dragging.group;
 | ||
|                 int track = m_dragging.track;
 | ||
|                 int entry = m_dragging.entry;
 | ||
|                 m_edit_mode = EditMode.None;
 | ||
|                 m_slide_moved = false;
 | ||
|                 if ( type == TimeTableType.telop ) {
 | ||
|                     Telop edited = (Telop)AppManager.SaveData[m_editing_telop_original.ID].Clone();
 | ||
|                     AppManager.SaveData[m_editing_telop_original.ID] = (Telop)m_editing_telop_original.Clone();
 | ||
|                     Command run2 = Command.GCommandEditTelop( edited.ID, edited );
 | ||
|                     AppManager.Register( AppManager.SaveData.Execute( run2 ) );
 | ||
|                     AppManager.Edited = true;
 | ||
|                 } else if ( type != TimeTableType.vsq ) {
 | ||
|                     int g = group;
 | ||
|                     if ( type != TimeTableType.character ) {
 | ||
|                         g = -1;
 | ||
|                     }
 | ||
|                     Command run = Command.GCommandEditTimeTableEntry( type, g, track, entry, AppManager.SaveData[type, group][track][entry] );
 | ||
|                     AppManager.SaveData[type, group][track][entry] = null;
 | ||
|                     AppManager.SaveData[type, group][track][entry] = (TimeTableEntry)m_slide_original.Clone();
 | ||
|                     AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                     AppManager.Edited = true;
 | ||
|                 }
 | ||
|                 //timerTimeLine.Enabled = true;
 | ||
|                 this.Invalidate();
 | ||
|                 #endregion
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void pictureBox1_Paint( object sender, PaintEventArgs e ) {
 | ||
|             if ( m_skip_paint ) {
 | ||
|                 return;
 | ||
|             }
 | ||
|             Graphics g = e.Graphics;
 | ||
|             g.Clear( SystemColors.Control );
 | ||
| 
 | ||
|             int[] lanes = AppManager.GetTimeLineLanes();
 | ||
|             int height;
 | ||
|             bool always_show_vsq = AppManager.Config.FixVsqTrackPosition;
 | ||
|             Rectangle clip_for_vsq = new Rectangle();
 | ||
|             if ( always_show_vsq ) {
 | ||
|                 m_vsq_height = (AppManager.SaveData.m_group_vsq.VisibleTracks + 2) * AppManager.Config.TrackHeight;
 | ||
|                 clip_for_vsq = new Rectangle( 0,
 | ||
|                                               AppManager.Config.TrackHeight,
 | ||
|                                               pictureBox1.Width,
 | ||
|                                               (AppManager.SaveData.m_group_vsq.VisibleTracks + 1) * AppManager.Config.TrackHeight );
 | ||
|             }
 | ||
| 
 | ||
|             int total_height = 0;
 | ||
|             for ( int lane = 0; lane < lanes.Length; lane++ ) {
 | ||
|                 total_height += AppManager.Config.TrackHeight;
 | ||
|                 for ( int i = 2; i <= lanes[lane]; i++ ) {
 | ||
|                     int y = (i - 1) * AppManager.Config.TrackHeight - m_startToDrawY;
 | ||
|                     if ( always_show_vsq && lane == 0 ) {
 | ||
|                         y += m_startToDrawY;
 | ||
|                     }
 | ||
|                     Rectangle outline = new Rectangle( 0, total_height + y, pictureBox1.Width, AppManager.Config.TrackHeight );
 | ||
|                     if ( i % 2 == 0 ) {
 | ||
|                         g.FillRectangle( _BRS_TRACKBG_ODD, outline );
 | ||
|                     } else {
 | ||
|                         g.FillRectangle( _BRS_TRACKBG_EVEN, outline );
 | ||
|                     }
 | ||
|                 }
 | ||
|                 if ( always_show_vsq && lane == 0 ) {
 | ||
|                     g.ExcludeClip( clip_for_vsq );
 | ||
|                 }
 | ||
|                 if ( lanes[lane] >= 2 ) {
 | ||
|                     total_height += (lanes[lane] - 1) * AppManager.Config.TrackHeight;
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             // 小節毎の線
 | ||
|             g.ResetClip();
 | ||
|             if ( menuVisualBars.Checked ) {
 | ||
|                 IEnumerable<BarLineType> blte = AppManager.SaveData.GetBarLineTypeEnumerator( AppManager.Config.QuantizeMode, AppManager.Config.QuantizeTripletEnabled );
 | ||
|                 foreach ( BarLineType barsec in blte ) {
 | ||
|                     int x = (int)(barsec.Time * AppManager.Config.PixelPerSec) - m_startToDrawX;
 | ||
|                     if ( x > pictureBox1.Width ) {
 | ||
|                         break;
 | ||
|                     } else if ( 0 < x ) {
 | ||
|                         if ( barsec.IsSeparator ) {
 | ||
|                             g.DrawLine( new Pen( Color.FromArgb( 161, 157, 136 ) ),
 | ||
|                                         new Point( x, 0 ),
 | ||
|                                         new Point( x, pictureBox1.Height ) );
 | ||
|                         } else {
 | ||
|                             g.DrawLine( new Pen( Color.FromArgb( 209, 204, 172 ) ),
 | ||
|                                         new Point( x, 0 ),
 | ||
|                                         new Point( x, pictureBox1.Height ) );
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             g.ExcludeClip( clip_for_vsq );
 | ||
|             total_height = AppManager.Config.TrackHeight;
 | ||
|             if ( !always_show_vsq ) {
 | ||
|                 DrawTimeTableGroup( g,
 | ||
|                                     new Point( 0, total_height - m_startToDrawY ),
 | ||
|                                     out height,
 | ||
|                                     AppManager.SaveData.m_group_vsq,
 | ||
|                                     _( "VSQ Tracks" ) );
 | ||
|                 total_height += height;
 | ||
|             } else {
 | ||
|                 total_height = m_vsq_height;
 | ||
|             }
 | ||
| 
 | ||
|             for ( int i = 0; i < AppManager.SaveData.m_groups_character.Count; i++ ) {
 | ||
|                 DrawTimeTableGroup( g,
 | ||
|                                     new Point( 0, total_height - m_startToDrawY ),
 | ||
|                                     out height,
 | ||
|                                     AppManager.SaveData.m_groups_character[i],
 | ||
|                                     _( "Character" ) + "(" + AppManager.SaveData.m_groups_character[i].Character.Name + ")" );
 | ||
|                 total_height += height;
 | ||
|             }
 | ||
| 
 | ||
|             DrawTelop( g,
 | ||
|                        new Point( 0, total_height - m_startToDrawY ),
 | ||
|                        out height,
 | ||
|                        _( "Telop" ) );
 | ||
|             total_height += height;
 | ||
| 
 | ||
|             DrawTimeTableGroup( g,
 | ||
|                                  new Point( 0, total_height - m_startToDrawY ),
 | ||
|                                  out height,
 | ||
|                                  AppManager.SaveData.m_group_another,
 | ||
|                                  _( "Another Images" ) );
 | ||
|             total_height += height;
 | ||
| 
 | ||
|             DrawTimeTableGroup( g,
 | ||
|                                  new Point( 0, total_height - m_startToDrawY ),
 | ||
|                                  out height,
 | ||
|                                  AppManager.SaveData.m_group_plugin,
 | ||
|                                  _( "Plugin" ) );
 | ||
| 
 | ||
|             if ( always_show_vsq ) {
 | ||
|                 g.ResetClip();
 | ||
|                 DrawTimeTableGroup( g,
 | ||
|                                      new Point( 0, AppManager.Config.TrackHeight ),
 | ||
|                                      out height,
 | ||
|                                      AppManager.SaveData.m_group_vsq,
 | ||
|                                      _( "VSQ Tracks" ) );
 | ||
|                 total_height += height;
 | ||
|             }
 | ||
| 
 | ||
|             // 画面に一定時間ごとのラインを引く
 | ||
|             g.FillRectangle( new SolidBrush( TOOL_COLOR ), 0, 0, pictureBox1.Width, AppManager.Config.TrackHeight );
 | ||
|             // リピートエリアを別色で描く
 | ||
|             g.FillRectangle( new SolidBrush( REPEAT_AREA ),
 | ||
|                              new Rectangle( (int)(RepeatStart * AppManager.Config.PixelPerSec - m_startToDrawX),
 | ||
|                                             0,
 | ||
|                                             (int)((RepeatEnd - RepeatStart) * AppManager.Config.PixelPerSec),
 | ||
|                                             AppManager.Config.TrackHeight ) );
 | ||
|             int start_to_draw_x = m_startToDrawX;
 | ||
|             int start_sec = (int)((double)(start_to_draw_x) / AppManager.Config.PixelPerSec) / AppManager.Config.TimeLineInterval;
 | ||
|             if ( start_sec == 0 ) {
 | ||
|                 start_sec = 1;
 | ||
|             }
 | ||
|             int end_sec = (int)((double)(start_to_draw_x + pictureBox1.Width) / AppManager.Config.PixelPerSec) / AppManager.Config.TimeLineInterval + 1;
 | ||
|             for ( int i = start_sec; i <= end_sec; i++ ) {
 | ||
|                 int x = (int)(i * AppManager.Config.TimeLineInterval * AppManager.Config.PixelPerSec) - start_to_draw_x;
 | ||
|                 g.DrawString( i * AppManager.Config.TimeLineInterval + " sec",
 | ||
|                               AppManager.Config.Font.GetFont(),
 | ||
|                               Brushes.Black,
 | ||
|                               new Point( x, AppManager.Config.VerticalStringOffset ) );
 | ||
|                 g.DrawLine( new Pen( Color.FromArgb( 128, Color.Black ) ),
 | ||
|                             new Point( x, 0 ), new Point( x, pictureBox1.Height ) );
 | ||
|             }
 | ||
| 
 | ||
|             if ( m_edit_mode == EditMode.Selected/* m_editMode*/ ) {
 | ||
|                 g.DrawRectangle( HILIGHT_EDIT, m_rcHilight );
 | ||
|             } else {
 | ||
|                 g.DrawRectangle( HILIGHT, m_rcHilight );
 | ||
|             }
 | ||
| 
 | ||
|             // カーソル位置に縦線
 | ||
|             int cursor;
 | ||
|             float now = Now;
 | ||
|             if ( menuVisualSync.Checked && AppManager.Config.SyncAtCentre ) {
 | ||
|                 float w = pictureBox1.Width / 2 / AppManager.Config.PixelPerSec;
 | ||
|                 if ( now < w || AppManager.SaveData.m_totalSec - w < now ) {
 | ||
|                     cursor = (int)(now * AppManager.Config.PixelPerSec - m_startToDrawX);
 | ||
|                 } else {
 | ||
|                     cursor = pictureBox1.Width / 2;
 | ||
|                 }
 | ||
|             } else {
 | ||
|                 cursor = (int)(now * AppManager.Config.PixelPerSec - m_startToDrawX);
 | ||
|             }
 | ||
|             g.DrawLine( new Pen( Color.Black, 2.0f ), new Point( cursor, 0 ), new Point( cursor, pictureBox1.Height ) );
 | ||
|             g.DrawLine(
 | ||
|                     Pens.Black,
 | ||
|                     new Point( m_mousePosition.X, 0 ),
 | ||
|                     new Point( m_mousePosition.X, pictureBox1.Height ) );
 | ||
| 
 | ||
|             if ( always_show_vsq ) {
 | ||
|                 g.DrawLine( new Pen( Color.Black, 2 ),
 | ||
|                             new Point( 0, m_vsq_height ),
 | ||
|                             new Point( pictureBox1.Width, m_vsq_height ) );
 | ||
|             }
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         private void preview_image_MouseLeave( object sender, EventArgs e ) {
 | ||
|             TimeSpan ts = DateTime.Now.Subtract( m_preview_time );
 | ||
|             if ( ts.TotalMilliseconds > 200 ) {
 | ||
|                 preview_image.Visible = false;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         #region menuHelp
 | ||
|         private void menuHelpDebugExtract_Click( object sender, EventArgs e ) {
 | ||
| #if DEBUG
 | ||
|             /*            using ( OpenFileDialog dlg = new OpenFileDialog() ) {
 | ||
|                 if ( dlg.ShowDialog() == DialogResult.OK ) {
 | ||
|                     string file = dlg.FileName;
 | ||
|                     string dir = Path.GetDirectoryName( file );
 | ||
|                     string fname = Path.GetFileNameWithoutExtension( file );
 | ||
|                     float scale = 0.45f;
 | ||
|                     using ( Character3 chara = new Character3( file ) ) {
 | ||
|                         foreach ( ImageEntry img in chara ) {
 | ||
|                             float width = img.image.Width;// * scale;
 | ||
|                             float height = img.image.Height;//                            *scale;
 | ||
|                             //using ( Bitmap t = new Bitmap( (int)width, (int)height, PixelFormat.Format32bppArgb ) )
 | ||
|                             //using ( Graphics g = Graphics.FromImage( t ) ) {
 | ||
|                             //g.InterpolationMode = InterpolationMode.HighQualityBicubic;
 | ||
|                             //g.DrawImage( img.image, 0f, 0f, width, height );
 | ||
|                             img.image.Save( Path.Combine( dir, fname + "_" + img.title + ".png" ) );
 | ||
|                             //}
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
| */
 | ||
| #endif
 | ||
|         }
 | ||
| 
 | ||
|         private void menuHelpBugReport_Click( object sender, EventArgs e ) {
 | ||
|             BugReport dlg = new BugReport();
 | ||
|             dlg.Show();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuHelpDebugEditCharacter_Click( object sender, EventArgs e ) {
 | ||
| #if DEBUG
 | ||
| 
 | ||
| #endif
 | ||
|         }
 | ||
| 
 | ||
|         private void menuHelpDebugInverseImages_Click( object sender, EventArgs e ) {
 | ||
| #if DEBUG
 | ||
| 
 | ||
| #endif
 | ||
|         }
 | ||
| 
 | ||
|         private static string GetAssemblyNameAndVersion( Type t ) {
 | ||
|             Assembly a = Assembly.GetAssembly( t );
 | ||
|             AssemblyFileVersionAttribute afva = (AssemblyFileVersionAttribute)Attribute.GetCustomAttribute( a, typeof( AssemblyFileVersionAttribute ) );
 | ||
|             return a.GetName().Name + " v" + afva.Version;
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// バージョン情報を表示
 | ||
|         /// </summary>
 | ||
|         /// <param name="sender"></param>
 | ||
|         /// <param name="e"></param>
 | ||
|         private void menuHelpVersionInfo_Click( object sender, EventArgs e ) {
 | ||
|             if ( m_version_form == null ) {
 | ||
|                 string version_str = AppManager.VERSION + "\n\n" +
 | ||
|                                      GetAssemblyNameAndVersion( typeof( Boare.Lib.AppUtil.Misc ) ) + "\n" +
 | ||
|                                      GetAssemblyNameAndVersion( typeof( Boare.Lib.Media.AviWriterVcm ) ) + "\n" +
 | ||
|                                      GetAssemblyNameAndVersion( typeof( Boare.Lib.Vsq.VsqFile ) ) + "\n" +
 | ||
| #if DEBUG
 | ||
|                 GetAssemblyNameAndVersion( typeof( Boare.Lib.Swf.SwfWriter ) ) + "\n" +
 | ||
| #endif
 | ||
|                 GetAssemblyNameAndVersion( typeof( bocoree.math ) );
 | ||
|                 m_version_form = new Boare.Lib.AppUtil.VersionInfo( _( "LipSync" ), version_str );
 | ||
|                 m_version_form.Font = AppManager.Config.Font.GetFont();
 | ||
|                 m_version_form.AuthorList = m_credit;
 | ||
|                 m_version_form.AppNameColor = Color.RoyalBlue;
 | ||
|                 m_version_form.VersionColor = Color.DimGray;
 | ||
| #if !DEBUG
 | ||
|                 m_version_form.Credit = AppManager.author_list;
 | ||
| #endif
 | ||
|                 m_version_form.FormClosed += new FormClosedEventHandler( m_version_form_FormClosed );
 | ||
|                 m_version_form.Show();
 | ||
|             }
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         void m_version_form_FormClosed( object sender, FormClosedEventArgs e ) {
 | ||
|             m_version_form.Dispose();
 | ||
|             m_version_form = null;
 | ||
|         }
 | ||
| 
 | ||
|         #region Form1
 | ||
|         private void Form1_Shown( object sender, EventArgs e ) {
 | ||
|             m_initialized = true;
 | ||
|             ResizePanel2();
 | ||
|         }
 | ||
| 
 | ||
|         private void Form1_Load( object sender, EventArgs e ) {
 | ||
| #if MONO
 | ||
|             Common.DebugWriteLine( "this assembly was compiled under the define of \"NET_2_0\"" );
 | ||
| #endif
 | ||
|             ResizePanel2();
 | ||
|             ApplyFont( AppManager.Config.Font.GetFont() );
 | ||
| 
 | ||
|             // プラグインを読み込み
 | ||
|             //インストールされているプラグインを調べる
 | ||
|             //すべてのプラグインクラスのインスタンスを作成する
 | ||
|             AppManager.SaveData.m_plugins = PluginInfo.FindPlugins();
 | ||
| 
 | ||
|             AppManager.SaveData.m_group_plugin = new TimeTableGroup( _( "Plugin" ), -1, null );
 | ||
| 
 | ||
|             AppManager.SaveData.m_plugins_config = new List<PluginConfig>();
 | ||
|             for ( int i = 0; i < AppManager.SaveData.m_plugins.Length; i++ ) {
 | ||
|                 AppManager.SaveData.m_plugins_config.Add( new PluginConfig( AppManager.SaveData.m_plugins[i].Instance.Name, AppManager.SaveData.m_plugins[i].Instance.Config, Path.GetFileName( AppManager.SaveData.m_plugins[i].Location ) ) );
 | ||
|                 AppManager.SaveData.m_group_plugin.Add( new TimeTable( AppManager.SaveData.m_plugins_config[i].ID, 0, TimeTableType.plugin, null ) );
 | ||
|             }
 | ||
| 
 | ||
|             /*
 | ||
|              * プラグインの種類に応じて、メインメニューを更新
 | ||
|              */
 | ||
|             // プラグイン設定
 | ||
|             if ( AppManager.SaveData.m_plugins.Length > 0 ) {
 | ||
|                 for ( int i = 0; i < AppManager.SaveData.m_plugins.Length; i++ ) {
 | ||
|                     if ( (AppManager.SaveData.m_plugins[i].Instance.Type & Plugin.Constants.LS_NO_EVENT_HANDLER) != Plugin.Constants.LS_NO_EVENT_HANDLER ) {
 | ||
|                         menuToolPluginConfig.DropDownItems.Add( AppManager.SaveData.m_plugins_config[i].ID, null, new EventHandler( h_pluginSetting ) );
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             // プラグインの情報
 | ||
|             menuHelpPluginInfo.DropDownItems.Clear();
 | ||
|             for ( int i = 0; i < AppManager.SaveData.m_plugins.Length; i++ ) {
 | ||
|                 menuHelpPluginInfo.DropDownItems.Add( AppManager.SaveData.m_plugins[i].Instance.Name, null, new EventHandler( h_pluginInfo ) );
 | ||
|             }
 | ||
| 
 | ||
|             AppManager.SaveData.m_group_vsq = new TimeTableGroup( _( "VSQ Tracks" ), -1, null );
 | ||
|             AppManager.SaveData.m_groups_character = new List<TimeTableGroup>();
 | ||
|             AppManager.SaveData.m_group_another = new TimeTableGroup( _( "Another images" ), -1, null );
 | ||
|             SettingsEx.CommandExecuted += new CommandExecutedEventHandler( SettingsEx_CommandExecuted );
 | ||
| 
 | ||
|             AppManager.SaveData.m_screenWidth = this.Width;
 | ||
|             AppManager.SaveData.m_screenHeight = this.Height;
 | ||
| 
 | ||
|             AppManager.Edited = false;
 | ||
| 
 | ||
|             if ( m_filePath != "" ) {
 | ||
|                 Read( m_filePath );
 | ||
|             }
 | ||
|             SetHScrollRange();
 | ||
|             SetVScrollRange();
 | ||
| 
 | ||
|             AppManager.SaveData.UpdateZorder();
 | ||
| 
 | ||
|             preview_image.Parent = pictureBox1;
 | ||
| 
 | ||
|             QuantizeMenuCheckedStateUpdate();
 | ||
|             UpdateGridList();
 | ||
| 
 | ||
|             property.PropertyValueChanged += new PropertyValueChangedEventHandler( property_PropertyValueChanged );
 | ||
|             property.TelopAdding += new TelopAddingEventHandler( property_TelopAdding );
 | ||
|             property.EditingItemChanged += new EditingItemChangedEventHandler( property_EditingItemChanged );
 | ||
|             property.TelopDeleting += new TelopDeletingEventHandler( property_TelopDeleting );
 | ||
|             property.ListUpdateRequired += new ListUpdateRequiredEventHandler( UpdateObjectList );
 | ||
|             property.UpdateLayout();
 | ||
| 
 | ||
|             previewer.Image = new Bitmap( AppManager.SaveData.m_movieSize.Width, AppManager.SaveData.m_movieSize.Height );
 | ||
|             using ( Graphics g = Graphics.FromImage( previewer.Image ) ) {
 | ||
|                 AppManager.SaveData.DrawTo( g, new Size( AppManager.SaveData.m_movieSize.Width, AppManager.SaveData.m_movieSize.Height ), 0.0f, false );
 | ||
|             }
 | ||
| 
 | ||
| #if DEBUG
 | ||
|             FormCommandHistory fch = new FormCommandHistory();
 | ||
|             fch.Show();
 | ||
| #endif
 | ||
|         }
 | ||
| 
 | ||
|         private void Form1_FormClosing( object sender, FormClosingEventArgs e ) {
 | ||
|             if ( AppManager.Edited ) {
 | ||
|                 //MessageBox.Show( "Form1_FormClosing" );
 | ||
|                 DialogResult result = requestIntention();
 | ||
|                 switch ( result ) {
 | ||
|                     case DialogResult.Yes:
 | ||
|                         if ( m_filePath == "" ) {
 | ||
|                             if ( saveFileDialog1.ShowDialog() == DialogResult.OK ) {
 | ||
|                                 m_filePath = saveFileDialog1.FileName;
 | ||
|                                 Save( m_filePath );
 | ||
|                             } else {
 | ||
|                                 return;
 | ||
|                             }
 | ||
|                         } else {
 | ||
|                             Save( m_filePath );
 | ||
|                         }
 | ||
|                         break;
 | ||
|                     case DialogResult.Cancel:
 | ||
|                         e.Cancel = true;
 | ||
|                         return;
 | ||
|                 }
 | ||
|             }
 | ||
|             if ( m_player != null ) {
 | ||
|                 m_player.Stop();
 | ||
|                 m_player.Close();
 | ||
|             }
 | ||
|             if ( m_preview_thread != null ) {
 | ||
|                 m_preview_thread.Abort();
 | ||
|                 while ( m_preview_thread.IsAlive ) {
 | ||
|                     Application.DoEvents();
 | ||
|                 }
 | ||
|             }
 | ||
|             SaveConfig();
 | ||
|         }
 | ||
| 
 | ||
|         private void Form1_DragEnter( object sender, DragEventArgs e ) {
 | ||
|             e.Effect = DragDropEffects.All;
 | ||
|         }
 | ||
| 
 | ||
|         private void Form1_DragDrop( object sender, DragEventArgs e ) {
 | ||
|             if ( e.Data.GetDataPresent( DataFormats.FileDrop ) ) {
 | ||
|                 string[] filename = (string[])e.Data.GetData( DataFormats.FileDrop );
 | ||
|                 if ( Path.GetExtension( filename[0] ).ToLower() == ".vsq" || Path.GetExtension( filename[0] ).ToLower() == ".ust" ) {
 | ||
|                     // vsqファイル
 | ||
|                     ReadVsq( filename[0] );
 | ||
|                 } else if ( Path.GetExtension( filename[0] ).ToLower() == ".lse" ) {
 | ||
|                     // LipSync Editorファイル
 | ||
|                     Read( filename[0] );
 | ||
|                     m_filePath = filename[0];
 | ||
|                     UpdateFormTitle();
 | ||
|                     SetHScrollRange();
 | ||
|                     SetVScrollRange();
 | ||
|                     //rebuildDrawing();
 | ||
|                     this.Invalidate();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void Form1_Paint( object sender, PaintEventArgs e ) {
 | ||
|             if ( m_skip_paint ) {
 | ||
|                 return;
 | ||
|             }
 | ||
|             float now;
 | ||
|             if ( !AviWriting && !AppManager.Config.PreviewHidden ) {
 | ||
| #if OBSOLETE_MODE
 | ||
|                 if ( PreviewP.Image != null ) {
 | ||
|                     PreviewP.Image.Dispose();
 | ||
|                 }
 | ||
|                 PreviewP.Image = getPicture( now );
 | ||
| #endif
 | ||
|                 //PreviewP.Refresh();
 | ||
|                 //previewer.Preview.Invalidate();
 | ||
|             }
 | ||
| 
 | ||
|             float speed = m_player.Speed;
 | ||
|             previewer.LabelSpeedText = "x" + speed.ToString( "0.00" );
 | ||
| 
 | ||
|             pictureBox1.Refresh();
 | ||
|             side.Refresh();
 | ||
|         }
 | ||
| 
 | ||
|         private void Form1_LocationOrSizeChanged( object sender, EventArgs e ) {
 | ||
|             if ( AppManager.Config != null ) {
 | ||
|                 if ( this.WindowState == FormWindowState.Normal ) {
 | ||
|                     AppManager.Config.WindowPosition = this.Bounds;
 | ||
|                 }
 | ||
|                 AppManager.Config.WindowIsMaximized = (this.WindowState == FormWindowState.Maximized);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void Form1_Activated( object sender, EventArgs e ) {
 | ||
|             m_edit_mode = EditMode.None;
 | ||
|         }
 | ||
| 
 | ||
|         private void Form1_Deactivate( object sender, EventArgs e ) {
 | ||
|             m_edit_mode = EditMode.None;
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region bgWorkAvi
 | ||
|         private void bgWorkAvi_DoWork( object sender, DoWorkEventArgs e ) {
 | ||
|             IAviWriter writer = null;
 | ||
|             AviOutputArguments args = (AviOutputArguments)e.Argument;
 | ||
|             if ( File.Exists( args.AviFile ) ) {
 | ||
|                 File.Delete( args.AviFile );
 | ||
|             }
 | ||
|             Size size = AppManager.SaveData.m_movieSize;
 | ||
|             m_avi_cancel = false;
 | ||
| 
 | ||
|             long start_frame;
 | ||
|             if ( args.StartSpecified ) {
 | ||
|                 start_frame = (long)(args.Start * AppManager.SaveData.FrameRate);
 | ||
|             } else {
 | ||
|                 start_frame = 0L;
 | ||
|             }
 | ||
| 
 | ||
|             long end_frame;
 | ||
|             if ( args.EndSpecified ) {
 | ||
|                 end_frame = (long)(args.End * AppManager.SaveData.FrameRate);
 | ||
|             } else {
 | ||
|                 end_frame = (long)((AppManager.SaveData.m_totalSec) * AppManager.SaveData.FrameRate);
 | ||
|             }
 | ||
|             long total_frames = end_frame - start_frame + 1;
 | ||
| #if !DEBUG
 | ||
|             try {
 | ||
| #endif
 | ||
|             Bitmap bmp = null;
 | ||
|             if ( args.UseVfwEncoder ) {
 | ||
|                 bmp = new Bitmap( size.Width, size.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb );
 | ||
|                 AviWriterVfw awvfw = new AviWriterVfw();
 | ||
|                 bool ret = awvfw.Open( args.AviFile,
 | ||
|                                        AppManager.SaveData.DwScale,
 | ||
|                                        AppManager.SaveData.DwRate,
 | ||
|                                        size.Width,
 | ||
|                                        size.Height,
 | ||
|                                        Process.GetCurrentProcess().MainWindowHandle );
 | ||
|                 if ( !ret ) {
 | ||
|                     return;
 | ||
|                 }
 | ||
|                 writer = awvfw;
 | ||
|             } else {
 | ||
|                 bmp = args.IsTransparent ?
 | ||
|                     new Bitmap( size.Width, size.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb ) :
 | ||
|                     new Bitmap( size.Width, size.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb );
 | ||
|                 AviWriterVcm awvcm = new AviWriterVcm();
 | ||
|                 bool ret = awvcm.Open( args.AviFile, 
 | ||
|                                        AppManager.SaveData.DwScale,
 | ||
|                                        AppManager.SaveData.DwRate, 
 | ||
|                                        size.Width, 
 | ||
|                                        size.Height, 
 | ||
|                                        !m_is_rawmode, 
 | ||
|                                        args.IsTransparent, 
 | ||
|                                        Process.GetCurrentProcess().MainWindowHandle );
 | ||
|                 if ( !ret ) {
 | ||
|                     return;
 | ||
|                 }
 | ||
|                 writer = awvcm;
 | ||
|             }
 | ||
|             using ( Graphics g = Graphics.FromImage( bmp ) ) {
 | ||
|                 for ( long frame = start_frame; frame <= end_frame; frame++ ) {
 | ||
|                     float now = (float)frame / AppManager.SaveData.FrameRate;
 | ||
|                     using ( Bitmap frm = GetPicture( now, args.IsTransparent ) ) {
 | ||
|                         frm.RotateFlip( RotateFlipType.Rotate180FlipX );
 | ||
|                         g.DrawImage( frm, 0, 0, size.Width, size.Height );
 | ||
|                     }
 | ||
|                     try {
 | ||
|                         writer.AddFrame( bmp );
 | ||
|                     } catch ( Exception ex ) {
 | ||
| #if DEBUG
 | ||
|                         Common.LogPush( ex );
 | ||
| #endif
 | ||
|                         writer.Close();
 | ||
|                         this.Invoke( new Form1_AviWritingChange( ChangeAviWriting ), new object[] { false } );
 | ||
|                         return;
 | ||
|                     }
 | ||
|                     bgWorkAvi.ReportProgress( (int)((double)(frame - start_frame) / (double)(total_frames) * 100.0), new long[] { frame - start_frame, total_frames } );
 | ||
|                     if ( m_avi_cancel ) {
 | ||
|                         bmp.Dispose();
 | ||
|                         g.Dispose();
 | ||
|                         writer.Close();
 | ||
|                         m_avi_cancel = false;
 | ||
|                         return;
 | ||
|                     }
 | ||
|                 }
 | ||
|                 writer.Close();
 | ||
| 
 | ||
|                 string audio_file = AppManager.SaveData.m_audioFile;
 | ||
| 
 | ||
| #if DEBUG
 | ||
|                 Common.DebugWriteLine( "bgWorkAvi_DoWork" );
 | ||
|                 Common.DebugWriteLine( "    args.IsWaveMergeRequired=" + args.IsWaveMergeRequired );
 | ||
| #endif
 | ||
|                 if ( args.IsWaveMergeRequired ) {
 | ||
|                     #region merge wave file
 | ||
|                     if ( File.Exists( audio_file ) && AppManager.Config.PathFFmpeg != "" && File.Exists( AppManager.Config.PathFFmpeg ) ) {
 | ||
|                         string tmp_avi = Misc.GetTempFileNameIn( Path.GetDirectoryName( args.AviFile ), ".avi" );
 | ||
|                         File.Move( args.AviFile, tmp_avi );
 | ||
|                         // ffmpeg -i movie.mpeg -i audio.wav combined.avi
 | ||
|                         long frames = end_frame - start_frame + 1;
 | ||
|                         m_ffmpeg = new Process();
 | ||
|                         m_ffmpeg.StartInfo.FileName = "\"" + AppManager.Config.PathFFmpeg + "\"";
 | ||
|                         m_ffmpeg.StartInfo.Arguments = "-i \"" + audio_file + "\" -i \"" + tmp_avi + "\" -vframes " + frames + " -vcodec copy -acodec copy \"" + args.AviFile + "\"";
 | ||
| #if DEBUG
 | ||
|                         Common.DebugWriteLine( "    m_ffmpeg.StarInfo.Arguments=" + m_ffmpeg.StartInfo.Arguments );
 | ||
| #endif
 | ||
|                         m_ffmpeg.StartInfo.CreateNoWindow = true;
 | ||
|                         m_ffmpeg.StartInfo.UseShellExecute = false;
 | ||
|                         m_ffmpeg.StartInfo.RedirectStandardError = true;
 | ||
|                         m_ffmpeg.Start();
 | ||
| 
 | ||
|                         this.m_stdout = new Thread( new ParameterizedThreadStart( this.FFMpegOutputRead ) );
 | ||
|                         this.m_stdout.Name = "output_ffmpeg";
 | ||
|                         this.m_stdout.Start( end_frame - start_frame );
 | ||
|                         m_ffmpeg.WaitForExit();
 | ||
|                         if ( args.IsDeleteIntermediateRequired ) {
 | ||
|                             File.Delete( tmp_avi );
 | ||
|                         }
 | ||
|                     }
 | ||
|                     #endregion
 | ||
|                 }
 | ||
| 
 | ||
|                 if ( args.IsFlvEncodeRequired && AppManager.Config.PathMEncoder != "" && File.Exists( AppManager.Config.PathMEncoder ) ) {
 | ||
|                     #region encode flv
 | ||
|                     //string flv_file = @"C:\test.flv";
 | ||
|                     string flv_file = Path.Combine( Path.GetDirectoryName( args.AviFile ), Path.GetFileNameWithoutExtension( args.AviFile ) + ".flv" );
 | ||
|                     string arguments = "\"" + args.AviFile + "\" -of lavf -lavfopts format=flv -ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:ss:aiv:umv:preme=2:mv0:qprd:trell:v4mv:cbp -oac mp3lame -lameopts abr:br=128 -vf scale=" + size.Width + ":" + size.Height + " -sws 9 -af resample=44100 -o \"" + flv_file + "\"";
 | ||
|                     m_mencoder = new Process();
 | ||
|                     m_mencoder.StartInfo.FileName = "\"" + AppManager.Config.PathMEncoder + "\"";
 | ||
|                     m_mencoder.StartInfo.Arguments = arguments;
 | ||
|                     m_mencoder.StartInfo.CreateNoWindow = true;
 | ||
|                     m_mencoder.StartInfo.UseShellExecute = false;
 | ||
|                     m_mencoder.StartInfo.RedirectStandardOutput = true;
 | ||
|                     m_mencoder.Start();
 | ||
| 
 | ||
|                     m_stdout = new Thread( new ParameterizedThreadStart( this.MEncoderOutputRead ) );
 | ||
|                     m_stdout.Name = "stdout_mencoder";
 | ||
|                     m_stdout.Start( end_frame - start_frame );
 | ||
| 
 | ||
|                     m_mencoder.WaitForExit();
 | ||
| 
 | ||
|                     if ( args.IsDeleteIntermediateRequired ) {
 | ||
|                         File.Delete( args.AviFile );
 | ||
|                     }
 | ||
| 
 | ||
|                     #endregion
 | ||
|                 } else if ( args.IsMp4EncodeRequired && AppManager.Config.PathFFmpeg != "" && File.Exists( AppManager.Config.PathFFmpeg ) ) {
 | ||
|                     #region encode mp4
 | ||
|                     try {
 | ||
|                         // ffmpeg -i teaser8000k1280_720_3.avi -r 24 -s 512x288 -refs 1 -bf 2 -flags2 dct8x8 -partitions parti8x8+partp8x8+partb8x8 -sc_threshold 50 -qpel -trell -me hex -directpred 3 -bufsize 128 -b 472k -bt 472k -mbd 2 -preme 2         -f mp4 -vcodec libx264                 -an -pass 1 -passlogfile "passlog" enc.mp4
 | ||
|                         // ffmpeg -i teaser8000k1280_720_3.avi -r 24 -s 512x288 -refs 1 -bf 2 -flags2 dct8x8 -partitions parti8x8+partp8x8+partb8x8 -sc_threshold 50 -qpel -trell -me hex -directpred 3 -bufsize 128 -b 472k -bt 472k -mbd 2 -preme 2 -ab 64k -f mp4 -vcodec libx264 -acodec libfaac     -pass 2 -passlogfile "passlog" enc.mp4
 | ||
|                         string mp4_file = Path.Combine( Path.GetDirectoryName( args.AviFile ), Path.GetFileNameWithoutExtension( args.AviFile ) + ".mp4" );
 | ||
|                         string arguments = "";
 | ||
|                         string work_dir = Path.Combine( Application.StartupPath, "temp" );
 | ||
|                         if ( !Directory.Exists( work_dir ) ) {
 | ||
|                             Directory.CreateDirectory( work_dir );
 | ||
|                         }
 | ||
| 
 | ||
|                         // first pass
 | ||
|                         arguments = "-i \"" + args.AviFile + "\" -refs 1 -bf 2 -flags2 dct8x8 -partitions parti8x8+partp8x8+partb8x8 -sc_threshold 40 -qpel -trell -me hex -directpred 3 -bufsize 128 -b 472k -bt 472k -mbd 2 -preme 2 -f mp4 -vcodec libx264 -an -pass 1 -passlogfile \"passlog\" -y \"" + mp4_file + "\"";
 | ||
| #if DEBUG
 | ||
|                         Common.DebugWriteLine( "1st pass arguments=" + arguments );
 | ||
| #endif
 | ||
|                         m_ffmpeg = new Process();
 | ||
|                         m_ffmpeg.StartInfo.WorkingDirectory = work_dir;
 | ||
|                         m_ffmpeg.StartInfo.FileName = "\"" + AppManager.Config.PathFFmpeg + "\"";
 | ||
|                         m_ffmpeg.StartInfo.Arguments = arguments;
 | ||
|                         m_ffmpeg.StartInfo.CreateNoWindow = true;
 | ||
|                         m_ffmpeg.StartInfo.UseShellExecute = false;
 | ||
|                         m_ffmpeg.StartInfo.RedirectStandardError = true;
 | ||
|                         m_ffmpeg.Start();
 | ||
|                         this.m_stdout = new Thread( new ParameterizedThreadStart( this.FFMpegOutputRead ) );
 | ||
|                         this.m_stdout.Name = "output_ffmpeg";
 | ||
|                         this.m_stdout.Start( end_frame - start_frame );
 | ||
|                         m_ffmpeg.WaitForExit();
 | ||
| 
 | ||
|                         // 2nd pass
 | ||
|                         arguments = "-i \"" + args.AviFile + "\" -refs 1 -bf 2 -flags2 dct8x8 -partitions parti8x8+partp8x8+partb8x8 -sc_threshold 40 -qpel -trell -me hex -directpred 3 -bufsize 128 -b 472k -bt 472k -mbd 2 -preme 2 -ab 64k -f mp4 -vcodec libx264 -acodec libfaac -pass 2 -passlogfile \"passlog\" -y \"" + mp4_file + "\"";
 | ||
| #if DEBUG
 | ||
|                         Common.DebugWriteLine( "2nd pass arguments=" + arguments );
 | ||
| #endif
 | ||
|                         m_ffmpeg = new Process();
 | ||
|                         m_ffmpeg.StartInfo.WorkingDirectory = work_dir;
 | ||
|                         m_ffmpeg.StartInfo.FileName = "\"" + AppManager.Config.PathFFmpeg + "\"";
 | ||
|                         m_ffmpeg.StartInfo.Arguments = arguments;
 | ||
|                         m_ffmpeg.StartInfo.CreateNoWindow = true;
 | ||
|                         m_ffmpeg.StartInfo.UseShellExecute = false;
 | ||
|                         m_ffmpeg.StartInfo.RedirectStandardError = true;
 | ||
|                         m_ffmpeg.Start();
 | ||
|                         this.m_stdout = new Thread( new ParameterizedThreadStart( this.FFMpegOutputRead ) );
 | ||
|                         this.m_stdout.Name = "output_ffmpeg";
 | ||
|                         this.m_stdout.Start( end_frame - start_frame );
 | ||
|                         m_ffmpeg.WaitForExit();
 | ||
|                     } catch ( Exception ex ) {
 | ||
| #if DEBUG
 | ||
|                         Common.DebugWriteLine( ex.ToString() );
 | ||
| #endif
 | ||
|                     }
 | ||
|                     #endregion
 | ||
|                 }
 | ||
| 
 | ||
|             }
 | ||
| 
 | ||
| 
 | ||
|             //mencoder test.avi -of lavf -lavfopts format=flv -ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:ss:aiv:umv:preme=2:mv0:qprd:trell:v4mv:cbp -oac mp3lame -lameopts abr:br=128 -passlogfile pass.log -vf scale=512:384 -sws 9 -af resample=44100 -o test.flv
 | ||
| #if !DEBUG
 | ||
|             } catch {
 | ||
|                 writer.Close();
 | ||
|                 MessageBox.Show(
 | ||
|                     _( "Initialization of video compression failed.\nThis video codec may require image width in multiples of certain number." ),
 | ||
|                     _( "Error" ),
 | ||
|                     MessageBoxButtons.OK,
 | ||
|                     MessageBoxIcon.Exclamation
 | ||
|                 );
 | ||
|             }
 | ||
| #endif
 | ||
|         }
 | ||
| 
 | ||
|         private void bgWorkAvi_ProgressChanged( object sender, ProgressChangedEventArgs e ) {
 | ||
|             long[] stat = (long[])e.UserState;
 | ||
|             this.Text = _( "AVI Progress" ) + " " + e.ProgressPercentage + "%  [" + stat[0] + "/" + stat[1] + "]";
 | ||
|         }
 | ||
| 
 | ||
|         private void bgWorkAvi_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e ) {
 | ||
|             this.Invoke( new Form1_AviWritingChange( ChangeAviWriting ), new object[] { false } );
 | ||
|             m_avi_cancel = false;
 | ||
|             UpdateFormTitle();
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region menuEdit
 | ||
|         /// <summary>
 | ||
|         /// キャンバス背景色の変更
 | ||
|         /// </summary>
 | ||
|         /// <param name="sender"></param>
 | ||
|         /// <param name="e"></param>
 | ||
|         private void menuEditBGColor_Click( object sender, EventArgs e ) {
 | ||
|             colorDialog1.Color = AppManager.SaveData.CANVAS_BACKGROUND;
 | ||
|             if ( colorDialog1.ShowDialog() == DialogResult.OK ) {
 | ||
|                 Command run = Command.GCommandChangeBackgroundColor( colorDialog1.Color );
 | ||
|                 AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                 AppManager.Edited = true;
 | ||
|                 this.Invalidate();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void menuEditAddCharacter_Click( object sender, EventArgs e ) {
 | ||
|             List<string> plugins = new List<string>();
 | ||
|             for ( int i = 0; i < AppManager.SaveData.m_plugins.Length; i++ ) {
 | ||
|                 if ( (AppManager.SaveData.m_plugins[i].Instance.Type & Plugin.Constants.LS_TYPE_CHARACTER) == Plugin.Constants.LS_TYPE_CHARACTER ) {
 | ||
|                     plugins.Add( AppManager.SaveData.m_plugins_config[i].ID );
 | ||
|                 }
 | ||
|             }
 | ||
|             using ( SelectCharacater sc = new SelectCharacater( plugins ) ) {
 | ||
|                 if ( sc.ShowDialog() == DialogResult.OK ) {
 | ||
|                     using ( TimeTable tempo = new TimeTable( "", 0, TimeTableType.vsq, null ) ) {
 | ||
|                         GenerateLipsyncFromVsq( tempo, sc.Character, true );
 | ||
|                     }
 | ||
|                     AppManager.Edited = true;
 | ||
|                     AppManager.Config.LastCharacterPath = sc.Path;
 | ||
|                     UpdateObjectList();
 | ||
|                     SetVScrollRange();
 | ||
|                     this.Invalidate();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void menuEditVideoLength_Click( object sender, EventArgs e ) {
 | ||
|             using ( InputBox box = new InputBox( _( "Video size configuration" ), _( "Input video length in second" ) ) ) {
 | ||
|                 box.rText = AppManager.SaveData.m_totalSec.ToString();
 | ||
|                 if ( box.ShowDialog() == DialogResult.OK ) {
 | ||
|                     float buff = AppManager.SaveData.m_totalSec;
 | ||
|                     try {
 | ||
|                         buff = float.Parse( box.rText );
 | ||
|                     } catch {
 | ||
|                         MessageBox.Show(
 | ||
|                             _( "Invalid value has been entered" ),
 | ||
|                             _( "Error" ),
 | ||
|                             MessageBoxButtons.OK,
 | ||
|                             MessageBoxIcon.Exclamation
 | ||
|                         );
 | ||
|                         buff = AppManager.SaveData.m_totalSec;
 | ||
|                     } finally {
 | ||
|                         AppManager.SaveData.m_totalSec = buff;
 | ||
|                     }
 | ||
|                     //rebuildDrawing();
 | ||
|                     AppManager.Edited = true;
 | ||
|                     AppManager.SaveData.UpdateZorder();
 | ||
|                     SetHScrollRange();
 | ||
|                     this.Invalidate();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void menuEditShiftTimeline_Click( object sender, EventArgs e ) {
 | ||
|             using ( InputBox ibox = new InputBox( _( "Shift all time-tables" ), _( "Input shift time in second (you can enter minus value)" ) ) ) {
 | ||
|                 if ( ibox.ShowDialog() == DialogResult.OK ) {
 | ||
|                     float shift;
 | ||
|                     try {
 | ||
|                         shift = float.Parse( ibox.rText );
 | ||
|                     } catch {
 | ||
|                         MessageBox.Show(
 | ||
|                             _( "Invalid value has been entered" ),
 | ||
|                             _( "Error" ),
 | ||
|                             MessageBoxButtons.OK,
 | ||
|                             MessageBoxIcon.Exclamation
 | ||
|                         );
 | ||
|                         return;
 | ||
|                     }
 | ||
|                     Command run = Command.GCommandShiftTimeTable( TimeTableType.whole, -1, shift );
 | ||
|                     AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                     AppManager.Edited = true;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void menuEditFrameRate_Click( object sender, EventArgs e ) {
 | ||
|             using ( FormSetFrameRate dlg = new FormSetFrameRate( AppManager.SaveData.DwRate, AppManager.SaveData.DwScale ) ) {
 | ||
|                 if ( dlg.ShowDialog() == DialogResult.OK ) {
 | ||
|                     uint rate = dlg.DwRate;
 | ||
|                     uint scale = dlg.DwScale;
 | ||
|                     if ( rate <= 0 || scale <= 0 ) {
 | ||
|                         MessageBox.Show(
 | ||
|                             _( "Invalid value has been entered" ),
 | ||
|                             _( "Error" ),
 | ||
|                             MessageBoxButtons.OK,
 | ||
|                             MessageBoxIcon.Exclamation
 | ||
|                         );
 | ||
|                     } else {
 | ||
| #if DEBUG
 | ||
|                         Common.DebugWriteLine( "menuEditFrameRate_Click; rate=" + rate + "; scale=" + scale );
 | ||
| #endif
 | ||
|                         Command run = Command.GCommandChangeFps( rate, scale );
 | ||
|                         AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                         ChangeBitrate();
 | ||
|                         AppManager.Edited = true;
 | ||
| #if DEBUG
 | ||
|                         Common.DebugWriteLine( "menuEditFrameRate_Click; s.DwRate=" + AppManager.SaveData.DwRate + "; s.DwScale=" + AppManager.SaveData.DwScale );
 | ||
| #endif
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void menuEditUndo_Click( object sender, EventArgs e ) {
 | ||
|             CommandType next = AppManager.GetNextUndoCommandType();
 | ||
|             AppManager.Undo();
 | ||
|             if ( next == CommandType.changeFps ) {
 | ||
|                 ChangeBitrate();
 | ||
|             }
 | ||
|             UpdateObjectList();
 | ||
|             AppManager.Edited = true;
 | ||
|             this.Invalidate();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuEditRedo_Click( object sender, EventArgs e ) {
 | ||
|             CommandType next = AppManager.GetNextRedoCommandType();
 | ||
|             AppManager.Redo();
 | ||
|             if ( next == CommandType.changeFps ) {
 | ||
|                 ChangeBitrate();
 | ||
|             }
 | ||
|             UpdateObjectList();
 | ||
|             AppManager.Edited = true;
 | ||
|             this.Invalidate();
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 
 | ||
|         /// </summary>
 | ||
|         /// <param name="sender"></param>
 | ||
|         /// <param name="e"></param>
 | ||
|         private void menuEditZOrder_Click( object sender, EventArgs e ) {
 | ||
|             ZOrder zorder = new ZOrder();
 | ||
|             zorder.Clear();
 | ||
|             int count = 0;
 | ||
|             int cur_z = -1;
 | ||
| 
 | ||
|             #region フォームを作成
 | ||
| 
 | ||
|             // まず、zオーダーを設定可能なオブジェクトの個数を数える
 | ||
|             // プラグイン
 | ||
|             count += AppManager.SaveData.m_plugins.Length;
 | ||
|             bool[] b_plugins = new bool[AppManager.SaveData.m_group_plugin.Count];
 | ||
|             for ( int i = 0; i < AppManager.SaveData.m_group_plugin.Count; i++ ) {
 | ||
|                 b_plugins[i] = false;
 | ||
|                 cur_z = Math.Max( cur_z, AppManager.SaveData.m_group_plugin[i].ZOrder );
 | ||
|             }
 | ||
|             // キャラクタ
 | ||
|             count += AppManager.SaveData.m_groups_character.Count;
 | ||
|             bool[] b_groups_character = new bool[AppManager.SaveData.m_groups_character.Count];
 | ||
|             for ( int i = 0; i < b_groups_character.Length; i++ ) {
 | ||
|                 b_groups_character[i] = false;
 | ||
|                 cur_z = Math.Max( cur_z, AppManager.SaveData.m_groups_character[i].ZOrder );
 | ||
|             }
 | ||
|             // その他のイメージ
 | ||
|             count += AppManager.SaveData.m_group_another.Count;
 | ||
|             bool[] b_group_another = new bool[AppManager.SaveData.m_group_another.Count];
 | ||
|             for ( int i = 0; i < b_group_another.Length; i++ ) {
 | ||
|                 b_group_another[i] = false;
 | ||
|                 cur_z = Math.Max( cur_z, AppManager.SaveData.m_group_another[i].ZOrder );
 | ||
|             }
 | ||
| 
 | ||
|             //MessageBox.Show( "count=" + count );
 | ||
| 
 | ||
|             ZorderItem[] list = new ZorderItem[count];
 | ||
|             int[] eval = new int[count];
 | ||
|             int[] order = new int[count];
 | ||
|             int index = -1;
 | ||
|             for ( int i = 0; i < AppManager.SaveData.m_plugins.Length; i++ ) {
 | ||
|                 index++;
 | ||
|                 list[index] = new ZorderItem( AppManager.SaveData.m_plugins_config[i].ID, ZorderItemType.plugin, i );
 | ||
|                 eval[index] = AppManager.SaveData.m_group_plugin[i].ZOrder;
 | ||
|             }
 | ||
|             for ( int i = 0; i < AppManager.SaveData.m_groups_character.Count; i++ ) {
 | ||
|                 index++;
 | ||
|                 list[index] = new ZorderItem( AppManager.SaveData.m_groups_character[i].Text, ZorderItemType.character, i );
 | ||
|                 eval[index] = AppManager.SaveData.m_groups_character[i].ZOrder;
 | ||
|             }
 | ||
|             for ( int i = 0; i < AppManager.SaveData.m_group_another.Count; i++ ) {
 | ||
|                 index++;
 | ||
|                 list[index] = new ZorderItem( AppManager.SaveData.m_group_another[i].Text, ZorderItemType.another, i );
 | ||
|                 eval[index] = AppManager.SaveData.m_group_another[i].ZOrder;
 | ||
|             }
 | ||
| 
 | ||
|             // 並べ変え
 | ||
|             int change = 1;
 | ||
|             ZorderItem tmp;
 | ||
|             int itemp;
 | ||
|             while ( change > 0 ) {
 | ||
|                 change = 0;
 | ||
|                 for ( int i = 0; i < count - 1; i++ ) {
 | ||
|                     if ( eval[i] > eval[i + 1] ) {
 | ||
|                         tmp = list[i];
 | ||
|                         list[i] = list[i + 1];
 | ||
|                         list[i + 1] = tmp;
 | ||
|                         itemp = eval[i];
 | ||
|                         eval[i] = eval[i + 1];
 | ||
|                         eval[i + 1] = itemp;
 | ||
|                         change++;
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             // zオーダーの大きいものから、listBox1に登録
 | ||
|             for ( int i = 0; i < count; i++ ) {
 | ||
|                 zorder.itemAdd( list[i] );
 | ||
|             }
 | ||
|             #endregion
 | ||
| 
 | ||
|             //MessageBox.Show( "zorder.Count=" + zorder.Count );
 | ||
| 
 | ||
|             if ( zorder.ShowDialog() == DialogResult.OK ) {
 | ||
| 
 | ||
|                 // フォームの応答から、zorderを再計算
 | ||
|                 for ( int i = 0; i < zorder.Count; i++ ) {
 | ||
|                     AppManager.SaveData.SetZorder( zorder[i], i + 1 );
 | ||
|                 }
 | ||
| 
 | ||
|                 AppManager.Edited = true;
 | ||
|                 AppManager.SaveData.UpdateZorder();
 | ||
|             }
 | ||
|             zorder.Dispose();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuEditRealTime_Click( object sender, EventArgs e ) {
 | ||
|             UpdateFormTitle();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuEdit_DropDownOpening( object sender, EventArgs e ) {
 | ||
|             menuEditUndo.Enabled = AppManager.IsUndoAvailable;
 | ||
|             menuEditRedo.Enabled = AppManager.IsRedoAvailable;
 | ||
|             if ( AppManager.SaveData.m_totalSec <= 0.0f ) {
 | ||
|                 menuEditShiftTimeline.Enabled = false;
 | ||
|                 menuEditAddCharacter.Enabled = false;
 | ||
|             } else {
 | ||
|                 menuEditShiftTimeline.Enabled = true;
 | ||
|                 menuEditAddCharacter.Enabled = true;
 | ||
|             }
 | ||
|             if ( AppManager.SaveData.m_groups_character.Count == 0 ) {
 | ||
|                 menuEditRealTime.Enabled = false;
 | ||
|             } else {
 | ||
|                 menuEditRealTime.Enabled = true;
 | ||
|             }
 | ||
|             menuEditAddCharacter.Enabled = !AppManager.Playing;
 | ||
|         }
 | ||
| 
 | ||
|         private void menuEditVideoSize_Click( object sender, EventArgs e ) {
 | ||
|             sizeChange();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuFileOutputAvi_Click( object sender, EventArgs e ) {
 | ||
|             if ( AppManager.Playing ) {
 | ||
|                 StopMusic();
 | ||
|             }
 | ||
|             initializeFirstEntry();
 | ||
|             m_is_rawmode = false;
 | ||
|             ShowDialogCore();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuFileOutputRawAvi_Click( object sender, EventArgs e ) {
 | ||
|             if ( AppManager.Playing ) {
 | ||
|                 StopMusic();
 | ||
|             }
 | ||
|             initializeFirstEntry();
 | ||
|             m_is_rawmode = true;
 | ||
|             ShowDialogCore();
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region xmenuFile
 | ||
|         private void xmenuFileClose_Click( object sender, EventArgs e ) {
 | ||
|             if ( AppManager.Edited ) {
 | ||
|                 //MessageBox.Show( "Form1_FormClosing" );
 | ||
|                 DialogResult result = requestIntention();
 | ||
|                 switch ( result ) {
 | ||
|                     case DialogResult.Yes:
 | ||
|                         if ( m_filePath == "" ) {
 | ||
|                             if ( saveFileDialog1.ShowDialog() == DialogResult.OK ) {
 | ||
|                                 m_filePath = saveFileDialog1.FileName;
 | ||
|                                 Save( m_filePath );
 | ||
|                             } else {
 | ||
|                                 return;
 | ||
|                             }
 | ||
|                         } else {
 | ||
|                             Save( m_filePath );
 | ||
|                         }
 | ||
|                         break;
 | ||
|                     case DialogResult.Cancel:
 | ||
|                         return;
 | ||
|                 }
 | ||
|             }
 | ||
|             if ( m_player != null ) {
 | ||
|                 m_player.Stop();
 | ||
|                 m_player.Close();
 | ||
|             }
 | ||
| 
 | ||
|             AppManager.Edited = false;
 | ||
|             m_filePath = "";
 | ||
|             UpdateFormTitle();
 | ||
|             ClearExistingData();
 | ||
|             AppManager.ClearCommandBuffer();
 | ||
|             AppManager.SaveData.UpdateZorder();
 | ||
|             this.Invalidate();
 | ||
|         }
 | ||
| 
 | ||
|         private void xmenuFileOpenVsq_Click( object sender, EventArgs e ) {
 | ||
|             // 既存のトラックがないかどうか確認。
 | ||
|             int count = 0;
 | ||
|             count += AppManager.SaveData.m_group_vsq.Count;
 | ||
|             for ( int group = 0; group < AppManager.SaveData.m_groups_character.Count; group++ ) {
 | ||
|                 count += AppManager.SaveData.m_groups_character[group].Count;
 | ||
|             }
 | ||
|             count += AppManager.SaveData.m_group_another.Count;
 | ||
|             count += AppManager.SaveData.m_telop_ex2.Count;
 | ||
|             if ( count > 0 ) {
 | ||
|                 if ( MessageBox.Show(
 | ||
|                         _( "This operation will overwrite all exisiting time-tables, and can NOT undo. Would you like to continue?" ) + "\n\n" + _( "( In case you want to append new track, please right-click [VSQ Tracks] to select [Read from VSQ file]. )" ),
 | ||
|                         _( "Confirmation" ),
 | ||
|                         MessageBoxButtons.OKCancel,
 | ||
|                         MessageBoxIcon.Question ) != DialogResult.OK ) {
 | ||
|                     return;
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             List<string> track_name = new List<string>();
 | ||
|             int tracks;
 | ||
| 
 | ||
|             // VSQファイルを開いて、解析
 | ||
|             openVsqDialog.FileName = AppManager.Config.LastVsqPath;
 | ||
|             try {
 | ||
|                 openVsqDialog.Filter = _( "VOCALOID2 Sequence File(*.vsq)|*.vsq" ) + "|" +
 | ||
|                                        _( "UTAU Script File(*.ust)|*.ust" ) + "|" +
 | ||
|                                        _( "All Files(*.*)|*.*" );
 | ||
|             } catch {
 | ||
|                 openVsqDialog.Filter = "VOCALOID2 Sequence File(*.vsq)|*.vsq|UTAU Script File(*.ust)|*.ust|All Files(*.*)|*.*";
 | ||
|             }
 | ||
|             if ( openVsqDialog.ShowDialog() != DialogResult.OK ) {
 | ||
|                 return;
 | ||
|             }
 | ||
|             AppManager.Config.LastVsqPath = openVsqDialog.FileName;
 | ||
| 
 | ||
|             // 既存のtime tableを破棄
 | ||
|             ClearExistingData();
 | ||
|             tracks = 0;
 | ||
| 
 | ||
|             if ( openVsqDialog.FilterIndex == 0 || Path.GetExtension( openVsqDialog.FileName ).ToLower() == ".vsq" ) {
 | ||
|                 // VsqFileを取得
 | ||
|                 int most_lyrics_track = 0; // 一番歌詞の文字数が多かったトラックの番号
 | ||
|                 VsqFile vsqFile = new VsqFile( openVsqDialog.FileName );
 | ||
|                 AppManager.SaveData.m_totalSec = (float)vsqFile.getTotalSec();
 | ||
| 
 | ||
|                 AppManager.SaveData.m_timesig_ex = new List<TimeSigTableEntry>( vsqFile.getTimeSigList().ToArray() );
 | ||
|                 AppManager.SaveData.m_tempo = new List<TempoTableEntry>( vsqFile.getTempoList().ToArray() );
 | ||
|                 AppManager.SaveData.m_base_tempo = vsqFile.getBaseTempo();
 | ||
| 
 | ||
|                 // 歌詞の含まれるトラック数を取得
 | ||
|                 {
 | ||
|                     int most_lyrics = 0;
 | ||
|                     for ( int i = 0; i < vsqFile.getTrackCount(); i++ ) {
 | ||
|                         int track_num = vsqFile.getTrack( i ).getLyricLength();
 | ||
|                         if ( most_lyrics < track_num ) {
 | ||
|                             most_lyrics_track = i;
 | ||
|                             most_lyrics = track_num;
 | ||
|                         }
 | ||
|                         if ( track_num > 0 ) {
 | ||
|                             track_name.Add( vsqFile.getTrack( i ).Name );
 | ||
|                             tracks++;
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
|                 most_lyrics_track--;
 | ||
| 
 | ||
|                 // tableを更新
 | ||
|                 for ( int track = 0; track < vsqFile.getTrackCount(); track++ ) {
 | ||
|                     int lyrics = vsqFile.getTrack( track ).getLyricLength();
 | ||
|                     if ( lyrics <= 0 ) {
 | ||
|                         continue;
 | ||
|                     }
 | ||
|                     addTimeLineFromTrack( vsqFile, track, false );
 | ||
|                     // todo この辺うまく行ってない?
 | ||
|                 }
 | ||
| 
 | ||
|                 if ( AppManager.Config.GenerateCharacterAutomatically ) {
 | ||
|                     // 一番歌詞の文字数が多かったトラックの歌詞をもとに
 | ||
|                     // 口の動きを決める
 | ||
|                     GenerateLipsyncFromVsq( AppManager.SaveData.m_group_vsq[most_lyrics_track], Character3.Miku, false );
 | ||
|                 }
 | ||
|             } else {
 | ||
|                 UstFile ust_file = new UstFile( openVsqDialog.FileName );
 | ||
|                 for ( int track = 0; track < ust_file.getTrackCount(); track++ ) {
 | ||
|                     foreach ( UstEvent ue in ust_file.getTrack( track ).getNoteEventEnumerator() ) {
 | ||
|                         if ( ue.Lyric == "u" ) {
 | ||
|                             ue.Lyric = "う";
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
|                 AppManager.SaveData.m_totalSec = (float)ust_file.getTotalSec();
 | ||
| 
 | ||
|                 AppManager.SaveData.m_timesig_ex = new List<TimeSigTableEntry>();
 | ||
|                 AppManager.SaveData.m_timesig_ex.Add( new TimeSigTableEntry( 0, 4, 4, 0 ) ); //todo: bar_countは零?
 | ||
|                 AppManager.SaveData.m_tempo = new List<TempoTableEntry>( ust_file.getTempoList().ToArray() );
 | ||
|                 AppManager.SaveData.m_base_tempo = ust_file.getBaseTempo();
 | ||
| 
 | ||
|                 // tableを更新
 | ||
|                 for ( int track = 0; track < ust_file.getTrackCount(); track++ ) {
 | ||
|                     AddTimeLineFromUst( ust_file, track, false );
 | ||
|                 }
 | ||
| 
 | ||
|                 if ( AppManager.Config.GenerateCharacterAutomatically ) {
 | ||
|                     // 一番歌詞の文字数が多かったトラックの歌詞をもとに
 | ||
|                     // 口の動きを決める
 | ||
|                     GenerateLipsyncFromVsq( AppManager.SaveData.m_group_vsq[0], Character3.Miku, false );
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             // そのほかのイメージトラック用のグループを追加
 | ||
|             AppManager.SaveData.m_group_another = null;
 | ||
|             AppManager.SaveData.m_group_another = new TimeTableGroup( _( "Another images" ), -1, null );
 | ||
| 
 | ||
|             // スクリーンの(仮想)サイズを更新
 | ||
|             SetHScrollRange();
 | ||
|             SetVScrollRange();
 | ||
| 
 | ||
|             AppManager.ClearCommandBuffer();
 | ||
|             AppManager.SaveData.UpdateZorder();
 | ||
|             AppManager.Edited = true;
 | ||
|             UpdateGridList();
 | ||
|             UpdateObjectList();
 | ||
| 
 | ||
|             // 再描画を要求
 | ||
|             this.Invalidate();
 | ||
|         }
 | ||
| 
 | ||
|         private void xmenuFileOutputAbort_Click( object sender, EventArgs e ) {
 | ||
|             if ( !m_avi_cancel ) {
 | ||
|                 m_avi_cancel = true;
 | ||
|                 AviWriting = false;
 | ||
|                 UpdateFormTitle();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void xmenuFile_DropDownOpening( object sender, EventArgs e ) {
 | ||
|             bool value = !AviWriting && AppManager.SaveData.m_totalSec > 0.0f;
 | ||
|             xmenuFileOutputAvi.Enabled = value;
 | ||
|             xmenuFileOutputRawAvi.Enabled = value;
 | ||
|             xmenuFileSeriesBitmap.Enabled = value;
 | ||
| 
 | ||
|             if ( AppManager.SaveData.m_groups_character.Count <= 0 ) {
 | ||
|                 xmenuFileExportHatwune.Enabled = false;
 | ||
|                 xmenuFileExportVocaloMark.Enabled = false;
 | ||
|             } else {
 | ||
|                 xmenuFileExportHatwune.Enabled = true;
 | ||
|                 xmenuFileExportVocaloMark.Enabled = true;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void xmenuFileExportHatwune_Click( object sender, EventArgs e ) {
 | ||
|             int target = 0;
 | ||
|             if ( AppManager.SaveData.m_groups_character.Count > 1 ) {
 | ||
|                 string msg = _( "Specify the index of target character" );
 | ||
|                 for ( int i = 0; i < AppManager.SaveData.m_groups_character.Count; i++ ) {
 | ||
|                     msg += "\n" + i + " : " + AppManager.SaveData.m_groups_character[i].Text;
 | ||
|                 }
 | ||
|                 using ( InputBox dlg = new InputBox( msg, "LipSync" ) ) {
 | ||
|                     if ( dlg.ShowDialog() == DialogResult.OK ) {
 | ||
|                         try {
 | ||
|                             target = int.Parse( dlg.rText );
 | ||
|                         } catch {
 | ||
|                             MessageBox.Show( _( "Invalid value has been entered" ),
 | ||
|                                              _( "Error" ),
 | ||
|                                              MessageBoxButtons.OK,
 | ||
|                                              MessageBoxIcon.Exclamation );
 | ||
|                             return;
 | ||
|                         }
 | ||
|                         if ( target < 0 || AppManager.SaveData.m_groups_character.Count <= target ) {
 | ||
|                             MessageBox.Show( _( "Invalid value has been entered" ),
 | ||
|                                              _( "Error" ),
 | ||
|                                              MessageBoxButtons.OK,
 | ||
|                                              MessageBoxIcon.Exclamation );
 | ||
|                             return;
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|             using ( SaveFileDialog dlg2 = new SaveFileDialog() ) {
 | ||
|                 if ( dlg2.ShowDialog() == DialogResult.OK ) {
 | ||
|                     string file = dlg2.FileName;
 | ||
|                     using ( StreamWriter sw = new StreamWriter( file, false, Encoding.GetEncoding( "Shift_JIS" ) ) )
 | ||
|                     using ( TimeTable table = new TimeTable( "", 0, TimeTableType.none, null ) ) {
 | ||
|                         sw.WriteLine( "Init{" );
 | ||
|                         sw.WriteLine( "\tSetFog( 10.0, 180.0, 200, 225, 255 )" );
 | ||
|                         sw.WriteLine( "\tSetGlareFilter( 1.0, 1.0, 1.0, 0.20, -0.81, -0.80, -0.78, 0.0 )" );
 | ||
|                         sw.WriteLine( "\tSetDirectionLight( -1.0, -0.6, -0.4 )" );
 | ||
|                         sw.WriteLine( "\tSetAmbientLight( 1.0, 1.0, 1.0 )" );
 | ||
|                         sw.WriteLine( "\tSetBGColor( 0, 0, 0 )" );
 | ||
|                         sw.WriteLine( "\tLoadStage( \"data\\xsi\\stage01\\\", \"stage01.xsibin\" )" );
 | ||
|                         bool wave_exists = false;
 | ||
|                         if ( Path.GetExtension( AppManager.SaveData.m_audioFile ).ToLower() == ".wav" ) {
 | ||
|                             wave_exists = true;
 | ||
|                             sw.WriteLine( "\tLoadBGM( \"" + Path.GetDirectoryName( AppManager.SaveData.m_audioFile ) + "\", \"" + Path.GetFileName( AppManager.SaveData.m_audioFile ) + "\" )" );
 | ||
|                         }
 | ||
|                         sw.WriteLine( "}" );
 | ||
|                         sw.WriteLine( "Main{" );
 | ||
|                         sw.WriteLine( "\tCamera( 0, Offset, 0, 1.45, 3.2,  0, 1.0, 0, 0, Linear, 0 )" );
 | ||
|                         sw.WriteLine( "\tMotion( 0, GoMyWay, 0, 1.5,  0 )" );
 | ||
|                         if ( wave_exists ) {
 | ||
|                             sw.WriteLine( "	PlayBGM( 1.0 )" );
 | ||
|                         }
 | ||
|                         sw.WriteLine( "\tAppendTriggerUncondition( 1.0, Face_Group )" );
 | ||
|                         sw.WriteLine( "\tEnd( " + (AppManager.SaveData.m_totalSec + 1) + ", Return )" );
 | ||
|                         sw.WriteLine( "}" );
 | ||
|                         sw.WriteLine( "Face_Group{" );
 | ||
| 
 | ||
|                         // エントリを列挙
 | ||
|                         for ( int track = 0; track < AppManager.SaveData.m_groups_character[target].Count; track++ ) {
 | ||
|                             for ( int entry = 0; entry < AppManager.SaveData.m_groups_character[target][track].Count; entry++ ) {
 | ||
|                                 TimeTableEntry ent = AppManager.SaveData.m_groups_character[target][track][entry];
 | ||
|                                 table.Add( (TimeTableEntry)ent.Clone() );
 | ||
|                             }
 | ||
|                         }
 | ||
|                         table.Sort();
 | ||
| 
 | ||
|                         //繋がってる奴は連結させておく
 | ||
|                         bool change = true;
 | ||
|                         while ( change ) {
 | ||
|                             change = false;
 | ||
|                             for ( int entry = 0; entry < table.Count - 1; entry++ ) {
 | ||
|                                 if ( table[entry].body == table[entry + 1].body && table[entry].end == table[entry + 1].begin ) {
 | ||
|                                     table[entry].end = table[entry + 1].end;
 | ||
|                                     table.RemoveAt( entry + 1 );
 | ||
|                                     change = true;
 | ||
|                                     break;
 | ||
|                                 }
 | ||
|                             }
 | ||
|                         }
 | ||
| 
 | ||
|                         for ( int entry = 0; entry < table.Count; entry++ ) {
 | ||
|                             string type;
 | ||
|                             float begin = table[entry].begin;
 | ||
|                             float end = table[entry].end;
 | ||
|                             switch ( table[entry].body ) {
 | ||
|                                 case "a":
 | ||
|                                     type = "L_A";
 | ||
|                                     break;
 | ||
|                                 case "i":
 | ||
|                                     type = "L_I";
 | ||
|                                     break;
 | ||
|                                 case "u":
 | ||
|                                     type = "L_U";
 | ||
|                                     break;
 | ||
|                                 case "e":
 | ||
|                                     type = "L_E";
 | ||
|                                     break;
 | ||
|                                 case "o":
 | ||
|                                 case "xo":
 | ||
|                                     type = "L_O";
 | ||
|                                     break;
 | ||
|                                 case "nn":
 | ||
|                                     type = "L_Default";
 | ||
|                                     break;
 | ||
|                                 default:
 | ||
|                                     type = "";
 | ||
|                                     break;
 | ||
|                             }
 | ||
|                             if ( type != "" ) {
 | ||
|                                 bool force_default = true;
 | ||
|                                 if ( entry + 1 < table.Count ) {
 | ||
|                                     if ( end == table[entry + 1].begin ) {
 | ||
|                                         force_default = false;
 | ||
|                                     }
 | ||
|                                 }
 | ||
| 
 | ||
|                                 if ( force_default ) {
 | ||
|                                     //todo: 0.30より短い場合は?
 | ||
|                                     sw.WriteLine( "\tFace( " + begin + ", " + type + ", " + 0.15 + " )" );
 | ||
|                                     sw.WriteLine( "\tFace( " + (end - 0.15) + ", L_Default, " + 0.15 + " )" );
 | ||
|                                 } else {
 | ||
|                                     sw.WriteLine( "\tFace( " + begin + ", " + type + ", " + 0.15 + " )" );
 | ||
|                                 }
 | ||
|                             }
 | ||
|                         }
 | ||
|                         sw.WriteLine( "}" );
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void xmenuFileExportVocaloMark_Click( object sender, EventArgs e ) {
 | ||
|             using ( FormVocalomark fv = new FormVocalomark( AppManager.SaveData.m_groups_character[0].Character ) ) {
 | ||
|                 fv.ShowDialog();
 | ||
|                 int target = 0;
 | ||
|                 if ( AppManager.SaveData.m_groups_character.Count > 1 ) {
 | ||
|                     string msg = _( "Specify the index of target character" );
 | ||
|                     for ( int i = 0; i < AppManager.SaveData.m_groups_character.Count; i++ ) {
 | ||
|                         msg += "\n" + i + " : " + AppManager.SaveData.m_groups_character[i].Text;
 | ||
|                     }
 | ||
|                     using ( InputBox dlg = new InputBox( msg, "LipSync" ) ) {
 | ||
|                         if ( dlg.ShowDialog() == DialogResult.OK ) {
 | ||
|                             try {
 | ||
|                                 target = int.Parse( dlg.rText );
 | ||
|                             } catch {
 | ||
|                                 MessageBox.Show( _( "Invalid value has been entered" ),
 | ||
|                                                  _( "Error" ),
 | ||
|                                                  MessageBoxButtons.OK,
 | ||
|                                                  MessageBoxIcon.Exclamation );
 | ||
|                                 return;
 | ||
|                             }
 | ||
|                             if ( target < 0 || AppManager.SaveData.m_groups_character.Count <= target ) {
 | ||
|                                 MessageBox.Show( _( "Invalid value has been entered" ),
 | ||
|                                                  _( "Error" ),
 | ||
|                                                  MessageBoxButtons.OK,
 | ||
|                                                  MessageBoxIcon.Exclamation );
 | ||
|                                 return;
 | ||
|                             }
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
|                 using ( SaveFileDialog dlg2 = new SaveFileDialog() ) {
 | ||
|                     if ( dlg2.ShowDialog() == DialogResult.OK ) {
 | ||
|                         string file = dlg2.FileName;
 | ||
|                         using ( StreamWriter sw = new StreamWriter( file, false, Encoding.GetEncoding( "Shift_JIS" ) ) )
 | ||
|                         using ( TimeTable table = new TimeTable( "", 0, TimeTableType.none, null ) ) {
 | ||
|                             // エントリを列挙
 | ||
|                             for ( int track = 0; track < AppManager.SaveData.m_groups_character[target].Count; track++ ) {
 | ||
|                                 for ( int entry = 0; entry < AppManager.SaveData.m_groups_character[target][track].Count; entry++ ) {
 | ||
|                                     TimeTableEntry ent = AppManager.SaveData.m_groups_character[target][track][entry];
 | ||
|                                     table.Add( (TimeTableEntry)ent.Clone() );
 | ||
|                                 }
 | ||
|                             }
 | ||
|                             table.Sort();
 | ||
| 
 | ||
|                             //繋がってる奴は連結させておく
 | ||
|                             bool change = true;
 | ||
|                             while ( change ) {
 | ||
|                                 change = false;
 | ||
|                                 for ( int entry = 0; entry < table.Count - 1; entry++ ) {
 | ||
|                                     if ( table[entry].body == table[entry + 1].body && table[entry].end == table[entry + 1].begin ) {
 | ||
|                                         table[entry].end = table[entry + 1].end;
 | ||
|                                         table.RemoveAt( entry + 1 );
 | ||
|                                         change = true;
 | ||
|                                         break;
 | ||
|                                     }
 | ||
|                                 }
 | ||
|                             }
 | ||
| 
 | ||
|                             Dictionary<string, string> dict = new Dictionary<string, string>();
 | ||
|                             foreach ( KeyValuePair<string, string> kvp in fv.Assignment ) {
 | ||
|                                 dict.Add( kvp.Value, kvp.Key );
 | ||
|                             }
 | ||
| 
 | ||
|                             sw.WriteLine( "ShapeAnime_LipSync{" );
 | ||
|                             for ( int i = 0; i < table.Count; i++ ) {
 | ||
|                                 if ( dict.ContainsKey( table[i].body ) ) {
 | ||
|                                     string type = dict[table[i].body];
 | ||
|                                     float blend_from_default = 0.05f;
 | ||
|                                     float blend_to_default = 0.05f;
 | ||
|                                     string def = "L_Default";
 | ||
|                                     if ( type.StartsWith( "E_" ) ){
 | ||
|                                         blend_from_default = fv.BlendEyeFromDefault;
 | ||
|                                         blend_to_default = fv.BlendEyeToDefault;
 | ||
|                                         def = "E_Default";
 | ||
|                                     } else if ( type.StartsWith( "EB_" ) ){
 | ||
|                                         blend_from_default = fv.BlendEyebrowFromDefault;
 | ||
|                                         blend_to_default = fv.BlendEyebrowToDefault;
 | ||
|                                         def = "EB_Default";
 | ||
|                                     } else if ( type.StartsWith( "L_" ) ){
 | ||
|                                         blend_from_default = fv.BlendLipFromDefault;
 | ||
|                                         blend_to_default = fv.BlendLipToDefault;
 | ||
|                                     }
 | ||
|                                     sw.WriteLine( "\tSetShape(" + table[i].begin.ToString( "0.000000" ) + ", DefaultUnit, " + type + ", " + blend_from_default.ToString( "0.000000" ) + ")" );
 | ||
|                                     sw.WriteLine( "\tSetShape(" + table[i].end.ToString( "0.000000" ) + ", DefaultUnit, " + def + ", " + blend_to_default.ToString( "0.000000" ) + ")" );
 | ||
|                                     sw.WriteLine();
 | ||
|                                 }
 | ||
|                             }
 | ||
|                             sw.WriteLine( "}" );
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|             //todo: Form1+xmenuFileExportVocaloMark_Click
 | ||
|             //ShapeAnime_LipSync
 | ||
|             //{
 | ||
|             //    SetShape(4.195052, DefaultUnit, L_O, 0.1)
 | ||
|             //    SetShape(4.375056, DefaultUnit, L_Default, 0.2)
 | ||
| 
 | ||
|             //ShapeAnime_Eye
 | ||
|             //{
 | ||
|             //    SetShape(1.945060, DefaultUnit, E_Close, 0.05)
 | ||
|             //    SetShape(2.020068, DefaultUnit, E_Default, 0.05)
 | ||
|             //E_Close
 | ||
|             //E_Default
 | ||
|             //E_Sad
 | ||
|             //E_Serious
 | ||
|             //E_Smile
 | ||
|             //E_Surprise
 | ||
|             //E_WinkL
 | ||
|             //E_WinkR
 | ||
|             //EB_Confuse
 | ||
|             //EB_Default
 | ||
|             //EB_Sad
 | ||
|             //EB_Serious
 | ||
|             //EB_Surprise
 | ||
|             //L_Default
 | ||
|             //L_A
 | ||
|             //L_E
 | ||
|             //L_I
 | ||
|             //L_N
 | ||
|             //L_O
 | ||
|             //L_U
 | ||
|         }
 | ||
| 
 | ||
|         private void xmenuFileImportRipsync_Click( object sender, EventArgs e ) {
 | ||
|             if ( MessageBox.Show( _( "This operation will overwrite all exisiting time-tables, and can NOT undo. Would you like to continue?" ),
 | ||
|                                   _( "Confirmation" ),
 | ||
|                                   MessageBoxButtons.OKCancel,
 | ||
|                                   MessageBoxIcon.Question ) != DialogResult.OK ) {
 | ||
|                 return;
 | ||
|             }
 | ||
|             if ( openRseDialog.ShowDialog() == DialogResult.OK ) {
 | ||
|                 string file = openRseDialog.FileName;
 | ||
|                 if ( File.Exists( file ) ) {
 | ||
|                     ClearExistingData();
 | ||
|                     RspImporter.Import( file, ref AppManager.SaveData );
 | ||
|                     AppManager.Edited = true;
 | ||
|                     SetVScrollRange();
 | ||
|                     SetHScrollRange();
 | ||
|                     if ( m_player.SoundLocation != "" ) {
 | ||
|                         m_player.Close();
 | ||
|                         AppManager.Playing = false;
 | ||
|                         StopPauseCore();
 | ||
|                         previewer.PlayPauseText = _( "Play" );
 | ||
|                     }
 | ||
|                     m_player.Load( AppManager.SaveData.m_audioFile );
 | ||
|                 } else {
 | ||
|                     MessageBox.Show( _( "File not found" ),
 | ||
|                                      _( "Error" ),
 | ||
|                                      MessageBoxButtons.OK,
 | ||
|                                      MessageBoxIcon.Exclamation );
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void xmenuFileExit_Click( object sender, EventArgs e ) {
 | ||
|             SaveConfig();
 | ||
|             this.Close();
 | ||
|         }
 | ||
| 
 | ||
|         private void xmenuFileSaveAs_Click( object sender, EventArgs e ) {
 | ||
|             if ( saveFileDialog1.ShowDialog() == DialogResult.OK ) {
 | ||
|                 if ( Path.GetExtension( saveFileDialog1.FileName ).ToLower() == ".lse" ) {
 | ||
|                     m_filePath = saveFileDialog1.FileName;
 | ||
|                     Save( m_filePath );
 | ||
|                 } else {
 | ||
|                     MessageBox.Show( _( "Extension must be *.lse" ),
 | ||
|                                      _( "Error" ),
 | ||
|                                      MessageBoxButtons.OK,
 | ||
|                                      MessageBoxIcon.Exclamation );
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void xmenuFileOpen_Click( object sender, EventArgs e ) {
 | ||
|             if ( openLse.ShowDialog() == DialogResult.OK ) {
 | ||
|                 Read( openLse.FileName );
 | ||
|                 m_filePath = openLse.FileName;
 | ||
|                 UpdateFormTitle();
 | ||
|                 SetHScrollRange();
 | ||
|                 SetVScrollRange();
 | ||
|                 AppManager.SaveData.UpdateZorder();
 | ||
|                 UpdateObjectList();
 | ||
|                 pictureBox1.Invalidate();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void xmenuFileSave_Click( object sender, EventArgs e ) {
 | ||
|             if ( m_filePath == "" ) {
 | ||
|                 if ( saveFileDialog1.ShowDialog() == DialogResult.OK ) {
 | ||
|                     if ( Path.GetExtension( saveFileDialog1.FileName ).ToLower() == ".lse" ) {
 | ||
|                         m_filePath = saveFileDialog1.FileName;
 | ||
|                         Save( m_filePath );
 | ||
|                     } else {
 | ||
|                         MessageBox.Show( _( "Extension must be *.lse" ),
 | ||
|                                          _( "Error" ),
 | ||
|                                          MessageBoxButtons.OK,
 | ||
|                                          MessageBoxIcon.Exclamation );
 | ||
|                     }
 | ||
|                 } else {
 | ||
|                     return;
 | ||
|                 }
 | ||
|             } else {
 | ||
|                 if ( Path.GetExtension( m_filePath ).ToLower() == ".lse" ) {
 | ||
|                     Save( m_filePath );
 | ||
|                 } else {
 | ||
|                     MessageBox.Show( _( "Extension must be *.lse" ),
 | ||
|                                      _( "Error" ),
 | ||
|                                      MessageBoxButtons.OK,
 | ||
|                                      MessageBoxIcon.Exclamation );
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void xmenuFileSeriesBitmap_Click( object sender, EventArgs e ) {
 | ||
|             using ( FormSeriesImage fsi = new FormSeriesImage() ) {
 | ||
|                 if ( fsi.ShowDialog() == DialogResult.OK ) {
 | ||
|                     AviWriting = true;
 | ||
|                     m_avi_cancel = false;
 | ||
|                     AviOutputArguments args = new AviOutputArguments();
 | ||
|                     args.AviFile = fsi.DirectoryName;
 | ||
|                     args.StartSpecified = fsi.StartSpecified;
 | ||
|                     args.EndSpecified = fsi.EndSpecified;
 | ||
|                     args.Start = fsi.Start;
 | ||
|                     args.End = fsi.End;
 | ||
|                     args.FileNameParser = fsi.ParserString;
 | ||
|                     args.ImageFormat = fsi.ImageFormat;
 | ||
|                     bgWorkSeriesImage.RunWorkerAsync( args );
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region side
 | ||
|         private void side_MouseClick( object sender, MouseEventArgs e ) {
 | ||
|             if ( e.Button == MouseButtons.Left ) {
 | ||
|                 int y = e.Y + m_startToDrawY;
 | ||
| 
 | ||
|                 int rows = 1;
 | ||
|                 bool vsq_fixed = AppManager.Config.FixVsqTrackPosition;
 | ||
|                 // VSQトラック
 | ||
|                 if ( vsq_fixed ) {
 | ||
|                     if ( rows * AppManager.Config.TrackHeight <= e.Y && e.Y < (rows + 1) * AppManager.Config.TrackHeight ) {
 | ||
|                         AppManager.SaveData.m_group_vsq.Folded = !AppManager.SaveData.m_group_vsq.Folded;
 | ||
|                         m_vsq_height = AppManager.Config.TrackHeight * (AppManager.SaveData.m_group_vsq.VisibleTracks + 2);
 | ||
|                         SetVScrollRange();
 | ||
|                         this.Invalidate();
 | ||
|                         return;
 | ||
|                     }
 | ||
|                 } else {
 | ||
|                     if ( rows * AppManager.Config.TrackHeight <= y && y < (rows + 1) * AppManager.Config.TrackHeight ) {
 | ||
|                         AppManager.SaveData.m_group_vsq.Folded = !AppManager.SaveData.m_group_vsq.Folded;
 | ||
|                         m_vsq_height = AppManager.Config.TrackHeight * (AppManager.SaveData.m_group_vsq.VisibleTracks + 2);
 | ||
|                         SetVScrollRange();
 | ||
|                         this.Invalidate();
 | ||
|                         return;
 | ||
|                     }
 | ||
|                 }
 | ||
|                 rows++;
 | ||
|                 if ( !AppManager.SaveData.m_group_vsq.Folded ) {
 | ||
|                     rows += AppManager.SaveData.m_group_vsq.Count;
 | ||
|                 }
 | ||
|                 // character
 | ||
|                 if ( AppManager.SaveData.m_groups_character.Count > 0 ) {
 | ||
|                     for ( int group = 0; group < AppManager.SaveData.m_groups_character.Count; group++ ) {
 | ||
|                         if ( rows * AppManager.Config.TrackHeight <= y && y < (rows + 1) * AppManager.Config.TrackHeight ) {
 | ||
|                             if ( !vsq_fixed || (vsq_fixed && e.Y >= m_vsq_height) ) {
 | ||
|                                 AppManager.SaveData.m_groups_character[group].Folded = !AppManager.SaveData.m_groups_character[group].Folded;
 | ||
|                                 SetVScrollRange();
 | ||
|                                 m_startToDrawY = StartToDrawY();
 | ||
|                                 this.Invalidate();
 | ||
|                                 return;
 | ||
|                             }
 | ||
|                         }
 | ||
|                         rows++;
 | ||
|                         if ( !AppManager.SaveData.m_groups_character[group].Folded ) {
 | ||
|                             rows += AppManager.SaveData.m_groups_character[group].Count;
 | ||
|                         }
 | ||
|                     }
 | ||
|                 }
 | ||
|                 // telop
 | ||
|                 if ( rows * AppManager.Config.TrackHeight <= y && y < (rows + 1) * AppManager.Config.TrackHeight ) {
 | ||
|                     if ( !vsq_fixed || (vsq_fixed && e.Y >= m_vsq_height) ) {
 | ||
|                         AppManager.SaveData.TelopListFolded = !AppManager.SaveData.TelopListFolded;
 | ||
|                         SetVScrollRange();
 | ||
|                         m_startToDrawY = StartToDrawY();
 | ||
|                         this.Invalidate();
 | ||
|                         return;
 | ||
|                     }
 | ||
|                 }
 | ||
|                 rows++;
 | ||
|                 if ( !AppManager.SaveData.TelopListFolded ) {
 | ||
|                     rows += AppManager.MaxTelopLanes;
 | ||
|                 }
 | ||
|                 // another
 | ||
|                 if ( rows * AppManager.Config.TrackHeight <= y && y < (rows + 1) * AppManager.Config.TrackHeight ) {
 | ||
|                     if ( !vsq_fixed || (vsq_fixed && e.Y >= m_vsq_height) ) {
 | ||
|                         AppManager.SaveData.m_group_another.Folded = !AppManager.SaveData.m_group_another.Folded;
 | ||
|                         SetVScrollRange();
 | ||
|                         m_startToDrawY = StartToDrawY();
 | ||
|                         this.Invalidate();
 | ||
|                         return;
 | ||
|                     }
 | ||
|                 }
 | ||
|                 rows++;
 | ||
|                 if ( !AppManager.SaveData.m_group_another.Folded ) {
 | ||
|                     rows += AppManager.SaveData.m_group_another.Count;
 | ||
|                 }
 | ||
|                 // plugin
 | ||
|                 if ( rows * AppManager.Config.TrackHeight <= y && y < (rows + 1) * AppManager.Config.TrackHeight ) {
 | ||
|                     if ( !vsq_fixed || (vsq_fixed && e.Y >= m_vsq_height) ) {
 | ||
|                         AppManager.SaveData.m_group_plugin.Folded = !AppManager.SaveData.m_group_plugin.Folded;
 | ||
|                         SetVScrollRange();
 | ||
|                         m_startToDrawY = StartToDrawY();
 | ||
|                         this.Invalidate();
 | ||
|                         return;
 | ||
|                     }
 | ||
|                 }
 | ||
|                 rows++;
 | ||
|                 if ( !AppManager.SaveData.m_group_plugin.Folded ) {
 | ||
|                     rows += AppManager.SaveData.m_group_plugin.Count;
 | ||
|                 }
 | ||
|             } else if ( e.Button == MouseButtons.Right ) {
 | ||
|                 if ( !cmenu.IsDisposed || cmenu != null ) {
 | ||
|                     cmenu.Dispose();
 | ||
|                 }
 | ||
|                 cmenu = new ContextMenuStrip();
 | ||
|                 cmenu.RenderMode = ToolStripRenderMode.ManagerRenderMode;
 | ||
|                 cmenu.ShowCheckMargin = false;
 | ||
|                 cmenu.ShowImageMargin = false;
 | ||
|                 cmenu.Font = AppManager.Config.Font.GetFont();
 | ||
|                 cmenu.Items.Add( _( "Expand All" ), null, new EventHandler( h_expandAll ) );
 | ||
|                 cmenu.Items.Add( _( "Fold All" ), null, new EventHandler( h_foldAll ) );
 | ||
|                 cmenu.Show( side, new Point( e.X, e.Y ) );
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void side_Paint( object sender, PaintEventArgs e ) {
 | ||
|             if ( m_skip_paint ) {
 | ||
|                 return;
 | ||
|             }
 | ||
|             Graphics g = e.Graphics;
 | ||
|             g.Clear( TOOL_COLOR );
 | ||
|             int rows = 1;
 | ||
|             // VSQトラック
 | ||
|             bool vsq_fixed = AppManager.Config.FixVsqTrackPosition;
 | ||
|             if ( !vsq_fixed ) {
 | ||
|                 DrawTriangle( g, rows * AppManager.Config.TrackHeight - m_startToDrawY, AppManager.SaveData.m_group_vsq.Folded );
 | ||
|             }
 | ||
|             rows++;
 | ||
|             if ( !AppManager.SaveData.m_group_vsq.Folded ) {
 | ||
|                 rows += AppManager.SaveData.m_group_vsq.Count;
 | ||
|             }
 | ||
| 
 | ||
|             // character
 | ||
|             if ( AppManager.SaveData.m_groups_character.Count > 0 ) {
 | ||
|                 for ( int group = 0; group < AppManager.SaveData.m_groups_character.Count; group++ ) {
 | ||
|                     DrawTriangle( g, rows * AppManager.Config.TrackHeight - m_startToDrawY, AppManager.SaveData.m_groups_character[group].Folded );
 | ||
|                     rows++;
 | ||
|                     if ( !AppManager.SaveData.m_groups_character[group].Folded ) {
 | ||
|                         rows += AppManager.SaveData.m_groups_character[group].Count;
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             // telop
 | ||
|             DrawTriangle( g, rows * AppManager.Config.TrackHeight - m_startToDrawY, AppManager.SaveData.TelopListFolded );
 | ||
|             rows++;
 | ||
|             if ( !AppManager.SaveData.TelopListFolded ) {
 | ||
|                 rows += AppManager.MaxTelopLanes;
 | ||
|             }
 | ||
| 
 | ||
|             // another
 | ||
|             DrawTriangle( g, rows * AppManager.Config.TrackHeight - m_startToDrawY, AppManager.SaveData.m_group_another.Folded );
 | ||
|             rows++;
 | ||
|             if ( !AppManager.SaveData.m_group_another.Folded ) {
 | ||
|                 rows += AppManager.SaveData.m_group_another.Count;
 | ||
|             }
 | ||
|             // plugin
 | ||
|             DrawTriangle( g, rows * AppManager.Config.TrackHeight - m_startToDrawY, AppManager.SaveData.m_group_plugin.Folded );
 | ||
|             rows++;
 | ||
|             if ( !AppManager.SaveData.m_group_plugin.Folded ) {
 | ||
|                 rows += AppManager.SaveData.m_group_plugin.Count;
 | ||
|             }
 | ||
|             if ( vsq_fixed ) {
 | ||
|                 g.FillRectangle(
 | ||
|                     new SolidBrush( TOOL_COLOR ),
 | ||
|                     new Rectangle( 0, 0, side.Width, m_vsq_height ) );
 | ||
|                 g.DrawLine(
 | ||
|                     new Pen( Color.Black, 2 ),
 | ||
|                     new Point( 0, m_vsq_height ),
 | ||
|                     new Point( side.Width, m_vsq_height ) );
 | ||
|                 DrawTriangle( g, AppManager.Config.TrackHeight, AppManager.SaveData.m_group_vsq.Folded );
 | ||
|             }
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         private void SettingsEx_CommandExecuted( TimeTableType command_target, CommandType command_type ) {
 | ||
| #if DEBUG
 | ||
|             Common.DebugWriteLine( "AppManager_CommandExecuted" );
 | ||
| #endif
 | ||
|             if ( command_type == CommandType.deleteEntry ||
 | ||
|                  command_type == CommandType.deleteGroup ||
 | ||
|                  command_type == CommandType.deleteTelop ||
 | ||
|                  command_type == CommandType.deleteTimeTable ) {
 | ||
| 
 | ||
|             }
 | ||
|             menuEditRedo.Enabled = AppManager.IsRedoAvailable;
 | ||
|             menuEditUndo.Enabled = AppManager.IsUndoAvailable;
 | ||
|             this.Refresh();
 | ||
|         }
 | ||
| 
 | ||
|         private void previewer_SpeedClicked( object sender, EventArgs e ) {
 | ||
|             previewer.TrackSpeedValue = 1000;
 | ||
|             ChangeSpeed( 1000 );
 | ||
|         }
 | ||
| 
 | ||
|         #region trackSpeed
 | ||
|         private void previewer_TrackSpeedMouseUp( object sender, MouseEventArgs e ) {
 | ||
| #if DEBUG
 | ||
|             Common.DebugWriteLine( "trackSpeed_MouseUp" );
 | ||
| #endif
 | ||
|             ChangeSpeed( previewer.TrackSpeedValue );
 | ||
|         }
 | ||
| 
 | ||
|         private void previewer_TrackSpeedScroll( object sender, EventArgs e ) {
 | ||
|             float speed = previewer.TrackSpeedValue * 0.001f;
 | ||
|             previewer.LabelSpeedText = "x" + speed.ToString( "0.00" );
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region cmenuRepeat
 | ||
|         private void cmenuRepeatStart_Click( object sender, EventArgs e ) {
 | ||
|             AppManager.SaveData.REPEAT_START = SecFromXCoord( m_mousePosition.X );
 | ||
|         }
 | ||
| 
 | ||
|         private void cmenuRepeatEnd_Click( object sender, EventArgs e ) {
 | ||
|             AppManager.SaveData.REPEAT_END = SecFromXCoord( m_mousePosition.X );
 | ||
|         }
 | ||
| 
 | ||
|         private void cmenuRepeatReset_Click( object sender, EventArgs e ) {
 | ||
|             AppManager.SaveData.REPEAT_START = 0f;
 | ||
|             AppManager.SaveData.REPEAT_END = -1f;
 | ||
|         }
 | ||
| 
 | ||
|         private void cmenuRepeat_Opening( object sender, CancelEventArgs e ) {
 | ||
|             float pos = SecFromXCoord( m_mousePosition.X );
 | ||
|             if ( RepeatEnd < pos ) {
 | ||
|                 cmenuRepeatStart.Enabled = false;
 | ||
|             } else {
 | ||
|                 cmenuRepeatStart.Enabled = true;
 | ||
|             }
 | ||
|             if ( RepeatStart > pos ) {
 | ||
|                 cmenuRepeatEnd.Enabled = false;
 | ||
|             } else {
 | ||
|                 cmenuRepeatEnd.Enabled = true;
 | ||
|             }
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region menuVisual*
 | ||
|         private void menuVisualTop_Click( object sender, EventArgs e ) {
 | ||
|             if ( hScrollBar1.Value != hScrollBar1.Minimum ) {
 | ||
|                 hScrollBar1.Value = hScrollBar1.Minimum;
 | ||
|                 m_startToDrawX = StartToDrawX();
 | ||
|                 this.Invalidate();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void menuVisualEnd_Click( object sender, EventArgs e ) {
 | ||
|             if ( hScrollBar1.Value != hScrollBar1.Maximum + 1 - hScrollBar1.LargeChange ) {
 | ||
|                 hScrollBar1.Value = hScrollBar1.Maximum + 1 - hScrollBar1.LargeChange;
 | ||
|                 m_startToDrawX = StartToDrawX();
 | ||
|                 this.Invalidate();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// タイムラインの時間拡大率をリセットします
 | ||
|         /// </summary>
 | ||
|         /// <param name="sender"></param>
 | ||
|         /// <param name="e"></param>
 | ||
|         private void menuVisualZoomReset_Click( object sender, EventArgs e ) {
 | ||
|             AppManager.Config.PixelPerSec = 150.0f;
 | ||
|             SetHScrollRange();
 | ||
|             correctPosition();
 | ||
|             //rebuildDrawing();
 | ||
|             this.Invalidate();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuVisualZoomOut_Click( object sender, EventArgs e ) {
 | ||
|             if ( AppManager.Config.PixelPerSec >= 20.0f ) {
 | ||
|                 AppManager.Config.PixelPerSec -= 10.0f;
 | ||
|                 SetHScrollRange();
 | ||
|                 correctPosition();
 | ||
|                 //rebuildDrawing();
 | ||
|                 base.Invalidate();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void menuVisualRepeatPlayPause_Click( object sender, EventArgs e ) {
 | ||
|             m_is_repeat_mode = true;
 | ||
|             if ( AppManager.Playing ) {
 | ||
|                 Pause();
 | ||
|             } else {
 | ||
|                 Play();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void menuVisualRepeatTop_Click( object sender, EventArgs e ) {
 | ||
|             m_is_repeat_mode = true;
 | ||
|             if ( AppManager.Playing ) {
 | ||
|                 Pause();
 | ||
|                 previewer.TrackBarValue = (int)(RepeatStart * AppManager.SaveData.FrameRate);
 | ||
|                 Play();
 | ||
|             } else {
 | ||
|                 previewer.TrackBarValue = (int)(RepeatStart * AppManager.SaveData.FrameRate);
 | ||
|             }
 | ||
|             this.Invalidate();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuVisualRepeatEnd_Click( object sender, EventArgs e ) {
 | ||
|             m_is_repeat_mode = true;
 | ||
|             if ( AppManager.Playing ) {
 | ||
|                 Pause();
 | ||
|             }
 | ||
|             previewer.TrackBarValue = (int)(RepeatEnd * AppManager.SaveData.FrameRate);
 | ||
|             this.Invalidate();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuVisualTransform_CheckedChanged( object sender, EventArgs e ) {
 | ||
|             m_curve.Visible = menuVisualTransform.Checked;
 | ||
|         }
 | ||
| 
 | ||
|         private void menuVisualPlayPause_Click( object sender, EventArgs e ) {
 | ||
|             m_is_repeat_mode = false;
 | ||
|             if ( AppManager.Playing ) {
 | ||
|                 Pause();
 | ||
|             } else {
 | ||
|                 Play();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void menuVisualObjectList_Click( object sender, EventArgs e ) {
 | ||
|             ChangePropertyHidden();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuVisualZoomIn_Click( object sender, EventArgs e ) {
 | ||
|             AppManager.Config.PixelPerSec += 10.0f;
 | ||
|             SetHScrollRange();
 | ||
|             correctPosition();
 | ||
|             //rebuildDrawing();
 | ||
|             base.Invalidate();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuVisualPreviewFlipVisible_Click( object sender, EventArgs e ) {
 | ||
|             ChangePreviewHidden();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuVisualPreviewSeparate_Click( object sender, EventArgs e ) {
 | ||
|             PreviewWindowFlipMode();
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region menuTool*
 | ||
|         private void menuToolMusic_Click( object sender, EventArgs e ) {
 | ||
|             if ( m_player.SoundLocation != "" ) {
 | ||
|                 m_player.Close();
 | ||
|                 AppManager.Playing = false;
 | ||
|                 StopPauseCore();//timerPreview.Enabled = false;
 | ||
|                 previewer.PlayPauseText = _( "Play" );
 | ||
|             }
 | ||
|             openMusicDialog.FileName = AppManager.Config.LastMusicPath;
 | ||
|             try {
 | ||
|                 openMusicDialog.Filter = _( "Audio File(*.mp3;*.wav)|*.mp3;*.wav" ) + "|" + _( "All Files(*.*)|*.*" );
 | ||
|             } catch {
 | ||
|                 openMusicDialog.Filter = "Audio File(*.mp3;*.wav)|*.mp3;*.wav|All Files(*.*)|*.*";
 | ||
|             }
 | ||
|             if ( openMusicDialog.ShowDialog() == DialogResult.OK ) {
 | ||
|                 AppManager.Config.LastMusicPath = openMusicDialog.FileName;
 | ||
|                 Command run = Command.GCommandSetMp3( openMusicDialog.FileName );
 | ||
|                 AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                 m_player.Load( AppManager.SaveData.m_audioFile );
 | ||
|                 AppManager.Edited = true;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void menuToolMoveTo_Click( object sender, EventArgs e ) {
 | ||
|             using ( InputBox ib = new InputBox( _( "Go to specified frame" ), _( "please input frame index" ) ) ) {
 | ||
|                 if ( ib.ShowDialog() == DialogResult.OK ) {
 | ||
|                     int frame;
 | ||
|                     try {
 | ||
|                         frame = int.Parse( ib.rText.Trim() );
 | ||
|                     } catch {
 | ||
|                         MessageBox.Show( _( "Invalid value has been entered" ),
 | ||
|                                          _( "Error" ),
 | ||
|                                          MessageBoxButtons.OK,
 | ||
|                                          MessageBoxIcon.Exclamation );
 | ||
|                         ib.Dispose();
 | ||
|                         return;
 | ||
|                     }
 | ||
|                     if ( previewer.TrackBarMaximum < frame || frame < previewer.TrackBarMinimum ) {
 | ||
|                         MessageBox.Show( _( "invalid frame index" ),
 | ||
|                                          _( "Error" ),
 | ||
|                                          MessageBoxButtons.OK,
 | ||
|                                          MessageBoxIcon.Exclamation );
 | ||
|                         return;
 | ||
|                     }
 | ||
|                     previewer.TrackBarValue = frame;
 | ||
|                     this.Invalidate();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void menuToolQuantize04_Click( object sender, EventArgs e ) {
 | ||
|             AppManager.Config.QuantizeMode = QuantizeMode.q04;
 | ||
|             QuantizeMenuCheckedStateUpdate();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuToolQuantize08_Click( object sender, EventArgs e ) {
 | ||
|             AppManager.Config.QuantizeMode = QuantizeMode.q08;
 | ||
|             QuantizeMenuCheckedStateUpdate();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuToolQuantize16_Click( object sender, EventArgs e ) {
 | ||
|             AppManager.Config.QuantizeMode = QuantizeMode.q16;
 | ||
|             QuantizeMenuCheckedStateUpdate();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuToolQuantize32_Click( object sender, EventArgs e ) {
 | ||
|             AppManager.Config.QuantizeMode = QuantizeMode.q32;
 | ||
|             QuantizeMenuCheckedStateUpdate();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuToolQuantize64_Click( object sender, EventArgs e ) {
 | ||
|             AppManager.Config.QuantizeMode = QuantizeMode.q64;
 | ||
|             QuantizeMenuCheckedStateUpdate();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuToolQuantizeOff_Click( object sender, EventArgs e ) {
 | ||
|             AppManager.Config.QuantizeMode = QuantizeMode.off;
 | ||
|             QuantizeMenuCheckedStateUpdate();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuToolQuantizeTriplet_CheckedChanged( object sender, EventArgs e ) {
 | ||
|             AppManager.Config.QuantizeTripletEnabled = menuToolQuantizeTriplet.Checked;
 | ||
|             UpdateGridList();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuToolOption_Click( object sender, EventArgs e ) {
 | ||
|             using ( EnvConfiguration env = new EnvConfiguration( AppManager.Config ) ) {
 | ||
|                 if ( env.ShowDialog() == DialogResult.OK ) {
 | ||
|                     // language
 | ||
|                     AppManager.Config = null;
 | ||
|                     AppManager.Config = (EnvSettings)env.EnvSettings.Clone();
 | ||
| 
 | ||
|                     ApplyFont( AppManager.Config.Font.GetFont() );
 | ||
|                     property.UpdateLayout();
 | ||
|                     if ( m_curve != null ) {
 | ||
|                         m_curve.ApplyFont( AppManager.Config.Font.GetFont() );
 | ||
|                     }
 | ||
|                     if ( m_version_form != null ) {
 | ||
|                         m_version_form.Font = AppManager.Config.Font.GetFont();
 | ||
|                     }
 | ||
|                     if ( m_form_preview != null ) {
 | ||
|                         m_form_preview.ApplyFont( AppManager.Config.Font.GetFont() );
 | ||
|                     }
 | ||
| 
 | ||
|                     string lang = AppManager.Config.Language;
 | ||
|                     string[] t_list = Messaging.GetRegisteredLanguage();
 | ||
|                     bool found = false;
 | ||
|                     foreach ( string lng in t_list ) {
 | ||
|                         if ( lng == lang ) {
 | ||
|                             AppManager.Config.Language = lng;
 | ||
|                             Messaging.Language = lng;
 | ||
|                             found = true;
 | ||
|                             break;
 | ||
|                         }
 | ||
|                     }
 | ||
|                     if ( !found ) {
 | ||
|                         AppManager.Config.Language = "";
 | ||
|                         Messaging.Language = "";
 | ||
|                     }
 | ||
|                     ApplyLanguage();
 | ||
|                     UpdateFormTitle();
 | ||
|                     this.Invalidate();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         private void previewer_PlayPauseClicked( object sender, EventArgs e ) {
 | ||
|             m_is_repeat_mode = false;
 | ||
|             if ( AppManager.Playing ) {
 | ||
|                 Pause();
 | ||
|             } else {
 | ||
|                 Play();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void previewer_StopClicked( object sender, EventArgs e ) {
 | ||
|             StopMusic();
 | ||
|         }
 | ||
| 
 | ||
|         private void previewer_CheckMuteCheckedChanged( object sender, EventArgs e ) {
 | ||
|             if ( previewer.CheckMuteChecked ) {
 | ||
|                 m_player.IsMuted = true;
 | ||
|             } else {
 | ||
|                 m_player.IsMuted = false;
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void previewer_TrackVolumeScroll( object sender, EventArgs e ) {
 | ||
|             int volume = previewer.TrackVolumeValue;
 | ||
|             m_player.Volume = volume;
 | ||
|         }
 | ||
| 
 | ||
|         #region previewer
 | ||
|         private void previewer_PreviewMouseDown( object sender, MouseEventArgs e ) {
 | ||
| #if DEBUG
 | ||
|             Common.DebugWriteLine( "PreviewP_MouseDown" );
 | ||
| #endif
 | ||
|             if ( AppManager.Playing || AviWriting ) {
 | ||
|                 return;
 | ||
|             }
 | ||
| 
 | ||
|             timerScreenUpdater.Enabled = true;
 | ||
|             // オブジェクトのzオーダー順に、クリックされた位置に
 | ||
|             // 表示されているオブジェクトが何かを検索する
 | ||
|             float now = Now;
 | ||
| 
 | ||
|             //最初にテロップを検索
 | ||
|             foreach ( Telop telop in AppManager.SaveData.m_telop_ex2 ) {
 | ||
|                 if ( telop.Start <= now && now <= telop.End ) {
 | ||
|                     m_editing = new EditingBounds( CRectFromIRect( new Rectangle( Common.PointFromPointF( telop.GetPosition( now ) ), 
 | ||
|                                                                                   Common.SizeFromSizeF( telop.ImageSize ) ),
 | ||
|                                                                    telop.GetScale( now ) ),
 | ||
|                                                    telop.PositionFixed,
 | ||
|                                                    telop.IsXFixedAt( now ),
 | ||
|                                                    telop.IsYFixedAt( now ) );
 | ||
| #if DEBUG
 | ||
|                     Common.DebugWriteLine( "    telop.ImageSize=" + telop.ImageSize );
 | ||
|                     Common.DebugWriteLine( "    m_editing.Bounds=" + m_editing.Bounds );
 | ||
| #endif
 | ||
|                     if ( AppManager.IsInRectangle( e.Location, m_editing.Bounds ) ) {
 | ||
|                         ZorderItem zi = new ZorderItem( telop.Text, ZorderItemType.telop, telop.ID );
 | ||
|                         property.Editing = (ZorderItem)zi.Clone();
 | ||
|                         if ( !telop.PositionFixed ) {
 | ||
|                             m_editing_item = zi;
 | ||
|                             m_init_position = Common.PointFromPointF( telop.Position );
 | ||
|                             m_base_point = ICoordFromC( e.Location );
 | ||
|                         }
 | ||
|                         return;
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             bool found = false;
 | ||
|             for ( int i = AppManager.SaveData.m_zorder.Count - 1; i >= 0; i-- ) {
 | ||
|                 #region s.m_zorderを検索
 | ||
|                 ZorderItem item = AppManager.SaveData.m_zorder[i];
 | ||
|                 switch ( item.Type ) {
 | ||
|                     case ZorderItemType.another:
 | ||
|                         for ( int entry = 0; entry < AppManager.SaveData.m_group_another[item.Index].Count; entry++ ) {
 | ||
|                             TimeTable table = AppManager.SaveData.m_group_another[item.Index];
 | ||
|                             if ( table[entry].begin <= now && now <= table[entry].end ) {
 | ||
|                                 if ( table.IsAviMode ||
 | ||
|                                     (!table.IsAviMode && table.Image != null) ) {
 | ||
|                                     m_editing = new EditingBounds( CRectFromIRect( new Rectangle( Common.PointFromPointF( table.GetPosition( now ) ),
 | ||
|                                                                                                   table.ImageSize ),
 | ||
|                                                                                    Math.Abs( table.GetScale( now ) ) ),
 | ||
|                                                                    table.PositionFixed,
 | ||
|                                                                    table.IsXFixedAt( now ),
 | ||
|                                                                    table.IsYFixedAt( now ) );
 | ||
|                                     if ( AppManager.IsInRectangle( e.Location, m_editing.Bounds ) ) {
 | ||
|                                         if ( !table.PositionFixed ) {
 | ||
|                                             m_editing_item = item;
 | ||
|                                             m_init_position = Common.PointFromPointF( table.Position );
 | ||
|                                         }
 | ||
|                                         property.Editing = (ZorderItem)item.Clone();
 | ||
|                                         found = true;
 | ||
|                                         break;
 | ||
|                                     }
 | ||
|                                 }
 | ||
|                                 m_editing = new EditingBounds();
 | ||
|                             } else {
 | ||
|                                 break;
 | ||
|                             }
 | ||
|                         }
 | ||
|                         break;
 | ||
|                     case ZorderItemType.character:
 | ||
|                         TimeTableGroup table_group = AppManager.SaveData.m_groups_character[item.Index];
 | ||
|                         string[] spl = table_group.GetDrawObjectNames( now );
 | ||
|                         if ( spl.Length > 0 ) {
 | ||
|                             m_editing = new EditingBounds( CRectFromIRect( new Rectangle( Common.PointFromPointF( table_group.GetPosition( now ) ), 
 | ||
|                                                                                           table_group.Character.Size ),
 | ||
|                                                                            Math.Abs( table_group.GetScale( now ) ) ),
 | ||
|                                                            table_group.PositionFixed,
 | ||
|                                                            table_group.IsXFixedAt( now ),
 | ||
|                                                            table_group.IsYFixedAt( now ) );
 | ||
|                             if ( AppManager.IsInRectangle( e.Location, m_editing.Bounds ) ) {
 | ||
|                                 if ( !table_group.PositionFixed ) {
 | ||
|                                     m_editing_item = item;
 | ||
|                                     m_init_position = Common.PointFromPointF( table_group.GetPosition( now ) );
 | ||
|                                 }
 | ||
|                                 property.Editing = (ZorderItem)item.Clone();
 | ||
|                                 found = true;
 | ||
|                                 break;
 | ||
|                             }
 | ||
|                             m_editing = new EditingBounds();
 | ||
|                         }
 | ||
|                         break;
 | ||
|                 }
 | ||
|                 #endregion
 | ||
|                 if ( found ) {
 | ||
|                     m_base_point = ICoordFromC( e.Location );
 | ||
|                     break;
 | ||
|                 }
 | ||
|             }
 | ||
| 
 | ||
|             if ( !found ) {
 | ||
|                 m_editing = new EditingBounds();
 | ||
|                 if ( m_text_edit && m_text != null ) {
 | ||
|                     int id = m_text_id;
 | ||
|                     Telop item = (Telop)AppManager.SaveData[id].Clone();
 | ||
|                     item.Text = m_text.Text;
 | ||
|                     Command run = Command.GCommandEditTelop( id, item );
 | ||
|                     AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                     AppManager.Edited = true;
 | ||
|                     m_text.Dispose();
 | ||
|                     m_text = null;
 | ||
|                 }
 | ||
|                 m_text_edit = false;
 | ||
|                 m_editing_item = null;
 | ||
|             }
 | ||
|             this.Invalidate();
 | ||
|         }
 | ||
| 
 | ||
|         private void previewer_PreviewMouseMove( object sender, MouseEventArgs e ) {
 | ||
|             if ( m_editing_item != null ) {
 | ||
| #if DEBUG
 | ||
|                 Common.DebugWriteLine( "PreviewP_MouseMove" );
 | ||
| #endif
 | ||
|                 float now = Now;
 | ||
|                 Point iCurrent = ICoordFromC( e.Location );
 | ||
|                 int index = m_editing_item.Index;
 | ||
| 
 | ||
|                 Point new_point = new Point( m_init_position.X + (iCurrent.X - m_base_point.X),
 | ||
|                                              m_init_position.Y + (iCurrent.Y - m_base_point.Y) );
 | ||
|                 switch ( m_editing_item.Type ) {
 | ||
|                     case ZorderItemType.telop:
 | ||
|                         if ( !m_text_edit ) {
 | ||
|                             Telop telop = AppManager.SaveData[index];
 | ||
|                             telop.Position = new_point;
 | ||
|                             m_editing = new EditingBounds( CRectFromIRect( new Rectangle( Common.PointFromPointF( telop.GetPosition( now ) ),
 | ||
|                                                                                           Common.SizeFromSizeF( telop.ImageSize ) ),
 | ||
|                                                                            telop.GetScale( now ) ),
 | ||
|                                                            telop.PositionFixed,
 | ||
|                                                            telop.IsXFixedAt( now ),
 | ||
|                                                            telop.IsYFixedAt( now ) );
 | ||
|                         }
 | ||
|                         break;
 | ||
|                     case ZorderItemType.another:
 | ||
|                         TimeTable table = AppManager.SaveData.m_group_another[index];
 | ||
|                         table.Position = new_point;
 | ||
|                         m_editing = new EditingBounds( CRectFromIRect( new Rectangle( Common.PointFromPointF( table.GetPosition( now ) ),
 | ||
|                                                                                       Common.SizeFromSizeF( table.ImageSize ) ),
 | ||
|                                                                        Math.Abs( table.GetScale( now ) ) ),
 | ||
|                                                        table.PositionFixed,
 | ||
|                                                        table.IsXFixedAt( now ),
 | ||
|                                                        table.IsYFixedAt( now ) );
 | ||
|                         break;
 | ||
|                     case ZorderItemType.character:
 | ||
| #if DEBUG
 | ||
|                         Common.DebugWriteLine( "    new_point=" + new_point );
 | ||
| #endif
 | ||
|                         TimeTableGroup table_group = AppManager.SaveData.m_groups_character[index];
 | ||
|                         table_group.Position = new_point;
 | ||
|                         m_editing = new EditingBounds( CRectFromIRect( new Rectangle( Common.PointFromPointF( table_group.GetPosition( now ) ),
 | ||
|                                                                                       Common.SizeFromSizeF( table_group.Character.Size ) ),
 | ||
|                                                                        Math.Abs( table_group.GetScale( now ) ) ),
 | ||
|                                                        table_group.PositionFixed,
 | ||
|                                                        table_group.IsXFixedAt( now ),
 | ||
|                                                        table_group.IsYFixedAt( now ) );
 | ||
|                         break;
 | ||
|                 }
 | ||
|                 previewer.Invalidate();
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void previewer_PreviewMouseUp( object sender, MouseEventArgs e ) {
 | ||
|             timerScreenUpdater.Enabled = false;
 | ||
| #if DEBUG
 | ||
|             Common.DebugWriteLine( "PreviewP_MouseUp" );
 | ||
| #endif
 | ||
|             if ( m_editing_item != null ) {
 | ||
|                 bool found = false;
 | ||
|                 int index = m_editing_item.Index;
 | ||
|                 Point new_pos;
 | ||
|                 switch ( m_editing_item.Type ) {
 | ||
|                     case ZorderItemType.telop:
 | ||
|                         new_pos = AppManager.SaveData[index].Position;
 | ||
|                         if ( new_pos.X != m_init_position.X || new_pos.Y != m_init_position.Y ) {
 | ||
|                             Command run = Command.GCommandEditTelop( index, AppManager.SaveData[index] );
 | ||
|                             AppManager.SaveData[index].Position = m_init_position;
 | ||
|                             AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                             property.Editing = new ZorderItem( "", ZorderItemType.telop, index );
 | ||
|                             AppManager.Edited = true;
 | ||
|                         }
 | ||
|                         found = true;
 | ||
|                         break;
 | ||
|                     case ZorderItemType.another:
 | ||
|                         new_pos = AppManager.SaveData.m_group_another[index].Position;
 | ||
|                         if ( new_pos.X != m_init_position.X || new_pos.Y != m_init_position.Y ) {
 | ||
|                             Command run = Command.GCommandSetPosition( TimeTableType.another, -1, index, AppManager.SaveData.m_group_another[index].Position );
 | ||
|                             AppManager.SaveData.m_group_another[index].Position = m_init_position;
 | ||
|                             AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                             property.Editing = new ZorderItem( "", ZorderItemType.another, index );
 | ||
|                             AppManager.Edited = true;
 | ||
|                         } else {
 | ||
|                             AppManager.SaveData.m_group_another[index].Position = m_init_position;
 | ||
|                         }
 | ||
|                         found = true;
 | ||
|                         break;
 | ||
|                     case ZorderItemType.character:
 | ||
|                         new_pos = AppManager.SaveData.m_groups_character[index].Position;
 | ||
| #if DEBUG
 | ||
|                         Common.DebugWriteLine( "    new_pos=" + new_pos.ToString() );
 | ||
|                         Common.DebugWriteLine( "    m_init_position=" + m_init_position );
 | ||
|                         Common.DebugWriteLine( "    AppManager.SaveData.m_groups_character[index].Position=" + AppManager.SaveData.m_groups_character[index].Position );
 | ||
| #endif
 | ||
|                         if ( new_pos.X != m_init_position.X || new_pos.Y != m_init_position.Y ) {
 | ||
|                             Command run = Command.GCommandSetPosition( TimeTableType.character, index, -1, AppManager.SaveData.m_groups_character[index].Position );
 | ||
|                             AppManager.SaveData.m_groups_character[index].Position = m_init_position;
 | ||
|                             AppManager.Register( AppManager.SaveData.Execute( run ) );
 | ||
|                             property.Editing = new ZorderItem( "", ZorderItemType.character, index );
 | ||
|                             AppManager.Edited = true;
 | ||
|                         } else {
 | ||
|                             AppManager.SaveData.m_groups_character[index].Position = m_init_position;
 | ||
|                         }
 | ||
|                         found = true;
 | ||
|                         break;
 | ||
|                 }
 | ||
| 
 | ||
|                 if ( found ) {
 | ||
|                     m_editing_item = null;
 | ||
|                     this.Invalidate();
 | ||
|                     return;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void previewer_PreviewMouseDoubleClick( object sender, MouseEventArgs e ) {
 | ||
| #if DEBUG
 | ||
|             Common.DebugWriteLine( "PreviewP_MouseDoubleClick" );
 | ||
| #endif
 | ||
|             if ( m_editing_item != null ) {
 | ||
|                 if ( m_editing_item.Type == ZorderItemType.telop ) {
 | ||
|                     Telop item = AppManager.SaveData[m_editing_item.Index];
 | ||
|                     m_text_edit = true;
 | ||
|                     m_text = new TextBox();
 | ||
|                     m_text.Visible = false;
 | ||
|                     m_text.Text = item.Text;
 | ||
|                     m_text_original = item.Text;
 | ||
|                     m_text_id = m_editing_item.Index;
 | ||
|                     Rectangle rc_telop = new Rectangle( Common.PointFromPointF( item.Position ), Common.SizeFromSizeF( item.ImageSize ) );
 | ||
|                     float dum_x, dum_y, scale;
 | ||
|                     GetScaleAndOrigin( out dum_x, out dum_y, out scale );
 | ||
|                     Rectangle rc_text = CRectFromIRect( rc_telop, scale );
 | ||
|                     m_text.Parent = previewer.Preview;
 | ||
|                     m_text.Location = new Point( (int)(rc_text.Left + 1 * scale), (int)(rc_text.Top - 3 * scale) );
 | ||
|                     m_text.Font = new Font( item.Font.FontFamily, item.Font.Size * scale, item.Font.Style );
 | ||
|                     m_text.Multiline = true;
 | ||
|                     m_text.Size = m_text.PreferredSize;
 | ||
|                     m_text.Tag = m_text.Size.Width;
 | ||
|                     m_text.ImeMode = ImeMode.NoControl;
 | ||
|                     m_text.TextChanged += new EventHandler( m_text_TextChanged );
 | ||
|                     m_text.Show();
 | ||
|                     m_text.BringToFront();
 | ||
|                     m_text.Visible = true;
 | ||
|                     m_text.Focus();
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         private void previewer_PreviewSizeChanged( object sender, EventArgs e ) {
 | ||
|             UpdateEditHandle();
 | ||
|         }
 | ||
| 
 | ||
|         private void previewer_PreviewPaint( object sender, PaintEventArgs e ) {
 | ||
|             if ( !m_avi_writing ) {
 | ||
|                 using ( Graphics g = Graphics.FromImage( previewer.Image ) ) {
 | ||
|                     string mouth = "";
 | ||
|                     if ( menuEditRealTime.Checked ) {
 | ||
|                         if ( m_last_key == Keys.A ) {
 | ||
|                             mouth = "a";
 | ||
|                         } else if ( m_last_key == Keys.I ) {
 | ||
|                             mouth = "i";
 | ||
|                         } else if ( m_last_key == Keys.U ) {
 | ||
|                             mouth = "u";
 | ||
|                         } else if ( m_last_key == Keys.E ) {
 | ||
|                             mouth = "e";
 | ||
|                         } else if ( m_last_key == Keys.O ) {
 | ||
|                             mouth = "o";
 | ||
|                         }
 | ||
|                     }
 | ||
|                     AppManager.SaveData.DrawTo( g, AppManager.SaveData.m_movieSize, Now, false, mouth, m_realtime_group );
 | ||
|                 }
 | ||
|                 bool pos_fixed = m_editing.Fixed || (m_editing.XFixed && m_editing.YFixed);
 | ||
|                 if ( pos_fixed ) {
 | ||
|                     e.Graphics.DrawRectangle( _PEN_FIXED_BOUNDS, m_editing.Bounds );
 | ||
|                 } else {
 | ||
|                     int x = m_editing.Bounds.X;
 | ||
|                     int y = m_editing.Bounds.Y;
 | ||
|                     int width = m_editing.Bounds.Width;
 | ||
|                     int height = m_editing.Bounds.Height;
 | ||
|                     int pen_width = (int)(_PEN_FIXED_BOUNDS.Width / 2f);
 | ||
| #if DEBUG
 | ||
|                     //Common.DebugWriteLine( "previewer_PreviewPaint" );
 | ||
|                     //Common.DebugWriteLine( "    m_editing.XFixed=" + m_editing.XFixed );
 | ||
|                     //Common.DebugWriteLine( "    m_Editing.YFixed=" + m_editing.YFixed );
 | ||
| #endif
 | ||
|                     if ( m_editing.XFixed ) {
 | ||
|                         e.Graphics.DrawLine( _PEN_FIXED_BOUNDS,
 | ||
|                                              new Point( x, y - pen_width ),
 | ||
|                                              new Point( x, y + height + pen_width ) );
 | ||
|                         e.Graphics.DrawLine( _PEN_FIXED_BOUNDS,
 | ||
|                                              new Point( x + width, y - pen_width ),
 | ||
|                                              new Point( x + width, y + height + pen_width ) );
 | ||
|                         e.Graphics.DrawLine( _PEN_BOUNDS,
 | ||
|                                               new Point( x + pen_width, y ),
 | ||
|                                               new Point( x - pen_width + width, y ) );
 | ||
|                         e.Graphics.DrawLine( _PEN_BOUNDS, 
 | ||
|                                              new Point( x + pen_width, y + height ),
 | ||
|                                              new Point( x - pen_width + width, y + height ) );
 | ||
|                     } else if ( m_editing.YFixed ){
 | ||
|                         e.Graphics.DrawLine( _PEN_BOUNDS,
 | ||
|                                              new Point( x, y + pen_width ),
 | ||
|                                              new Point( x, y - pen_width + height ) );
 | ||
|                         e.Graphics.DrawLine( _PEN_BOUNDS,
 | ||
|                                              new Point( x + width, y + pen_width ),
 | ||
|                                              new Point( x + width, y - pen_width + height ) );
 | ||
|                         e.Graphics.DrawLine( _PEN_FIXED_BOUNDS,
 | ||
|                                               new Point( x - pen_width, y ),
 | ||
|                                               new Point( x + pen_width + width, y ) );
 | ||
|                         e.Graphics.DrawLine( _PEN_FIXED_BOUNDS,
 | ||
|                                              new Point( x - pen_width, y + height ),
 | ||
|                                              new Point( x + pen_width + width, y + height ) );
 | ||
|                     } else {
 | ||
|                         e.Graphics.DrawRectangle( _PEN_BOUNDS, m_editing.Bounds );
 | ||
|                     }
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         private void previewer_TrackBarScroll( object sender, EventArgs e ) {
 | ||
|             if ( menuVisualSync.Checked ) {
 | ||
|                 correctPosition();
 | ||
|             }
 | ||
|             this.Invalidate();
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 
 | ||
|         /// </summary>
 | ||
|         /// <param name="sender"></param>
 | ||
|         /// <param name="e"></param>
 | ||
|         private void previewer_MenuHundredClick( object sender, EventArgs e ) {
 | ||
|             previewer.PreviewSizeMode = PictureBoxSizeMode.CenterImage;
 | ||
|             AppManager.Config.PreviewZoomMode = previewer.PreviewSizeMode;
 | ||
|         }
 | ||
| 
 | ||
|         private void previewer_MenuFitClick( object sender, EventArgs e ) {
 | ||
|             previewer.PreviewSizeMode = PictureBoxSizeMode.Zoom;
 | ||
|             AppManager.Config.PreviewZoomMode = previewer.PreviewSizeMode;
 | ||
|         }
 | ||
| 
 | ||
|         private void previewer_LabelTimeMouseDoubleClick( object sender, EventArgs e ) {
 | ||
|             PreviewWindowFlipMode();
 | ||
|         }
 | ||
| 
 | ||
|         private void m_container_Panel2_SizeChanged( object sender, EventArgs e ) {
 | ||
|             ResizePanel2();
 | ||
|         }
 | ||
| 
 | ||
|         #region bgWorkSeriesImage
 | ||
|         private void bgWorkSeriesImage_DoWork( object sender, DoWorkEventArgs e ) {
 | ||
|             Size size = AppManager.SaveData.m_movieSize;
 | ||
|             m_avi_cancel = false;
 | ||
| 
 | ||
|             long start_frame;
 | ||
|             AviOutputArguments args = (AviOutputArguments)e.Argument;
 | ||
|             if ( args.StartSpecified ) {
 | ||
|                 start_frame = (long)(args.Start * AppManager.SaveData.FrameRate);
 | ||
|             } else {
 | ||
|                 start_frame = 0L;
 | ||
|             }
 | ||
| 
 | ||
|             long end_frame;
 | ||
|             if ( args.EndSpecified ) {
 | ||
|                 end_frame = (long)(args.End * AppManager.SaveData.FrameRate);
 | ||
|             } else {
 | ||
|                 end_frame = (long)((AppManager.SaveData.m_totalSec) * AppManager.SaveData.FrameRate);
 | ||
|             }
 | ||
|             long total_frames = end_frame - start_frame + 1;
 | ||
| #if !DEBUG
 | ||
|             try {
 | ||
| #endif
 | ||
|             long count = -1;
 | ||
|             for ( long frame = start_frame; frame <= end_frame; frame++ ) {
 | ||
|                 count++;
 | ||
|                 float now = (float)frame / AppManager.SaveData.FrameRate;
 | ||
|                 Bitmap frm = GetPicture( now, false );
 | ||
|                 try {
 | ||
|                     string file = Path.Combine( args.AviFile, string.Format( args.FileNameParser, count ) );
 | ||
|                     frm.Save( file, args.ImageFormat );
 | ||
|                 } catch ( Exception ex ) {
 | ||
| #if DEBUG
 | ||
|                     Common.LogPush( ex );
 | ||
| #endif
 | ||
|                     this.Invoke( new Form1_AviWritingChange( ChangeAviWriting ), new object[] { false } );
 | ||
|                     return;
 | ||
|                 }
 | ||
|                 bgWorkSeriesImage.ReportProgress( (int)((double)(frame - start_frame) / (double)(total_frames) * 100.0), new long[] { frame - start_frame, total_frames } );
 | ||
|                 if ( m_avi_cancel ) {
 | ||
|                     m_avi_cancel = false;
 | ||
|                     return;
 | ||
|                 }
 | ||
|             }
 | ||
| #if !DEBUG
 | ||
|             } catch {
 | ||
|             }
 | ||
| #endif
 | ||
|         }
 | ||
| 
 | ||
|         private void bgWorkSeriesImage_ProgressChanged( object sender, ProgressChangedEventArgs e ) {
 | ||
|             long[] stat = (long[])e.UserState;
 | ||
|             this.Text = _( "Series Image Progress" ) + " " + e.ProgressPercentage + "%  [" + stat[0] + "/" + stat[1] + "]";
 | ||
|         }
 | ||
| 
 | ||
|         private void bgWorkSeriesImage_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e ) {
 | ||
|             this.Invoke( new Form1_AviWritingChange( ChangeAviWriting ), new object[] { false } );
 | ||
|             m_avi_cancel = false;
 | ||
|             UpdateFormTitle();
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         private void timerScreenUpdater_Tick( object sender, EventArgs e ) {
 | ||
|             previewer.Invalidate();
 | ||
|         }
 | ||
| 
 | ||
|         private void menuVisualVsqTrack_CheckedChanged( object sender, EventArgs e ) {
 | ||
|             AppManager.Config.FixVsqTrackPosition = menuVisualVsqTrack.Checked;
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
| }
 | 
