/* * Form1_EventHandler.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.Drawing; using System.IO; using System.Windows.Forms; namespace LipSync { partial class Form1 : Form { /// /// テロップを追加します /// /// /// private void h_addTelop( object sender, EventArgs e ) { if ( m_text_edit && m_text != null ) { Command run = Command.GCommandEditTelop( m_text_id, AppManager.SaveData[m_text_id] ); AppManager.SaveData[m_text_id].Text = m_text_original; AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; m_text.Dispose(); m_text = null; m_text_edit = false; } int id = AppManager.SaveData.GetNextID(); Telop work = new Telop( id ); work.Text = "(none)"; work.Start = Now; work.End = work.Start + 1f; Command run2 = Command.GCommandAddTelop( work ); Command inv = AppManager.SaveData.Execute( run2 ); Telop.DecideLane( AppManager.SaveData.m_telop_ex2 ); property.Editing = new ZorderItem( work.Text, ZorderItemType.telop, id ); AppManager.Register( inv ); UpdateObjectList(); UpdateEditHandle(); SetVScrollRange(); AppManager.Edited = true; } /// /// エントリのON/OFFを反転してコピーします /// /// /// void h_copyTimeTableInvert( object sender, EventArgs e ) { int group = m_clicked.group; int track = m_clicked.track; if ( m_copied_timetable != null ) { m_copied_timetable.Dispose(); m_copied_timetable = null; } TimeTableType type = m_clicked.type; if( type != TimeTableType.vsq && type != TimeTableType.character && type != TimeTableType.another && type != TimeTableType.plugin ){ return; } TimeTable table = (TimeTable)AppManager.SaveData[m_clicked.type, m_clicked.group][m_clicked.track].Clone(); table.Type = TimeTableType.another; m_copied_timetable = (TimeTable)table.Clone(); m_copied_timetable.Clear(); for ( int i = 0; i < table.Count; i++ ) { if ( i > 0 ) { m_copied_timetable.Add( new TimeTableEntry( table[i - 1].end, table[i].begin, "" ) ); } else { if ( table[0].begin > 0f ) { m_copied_timetable.Add( new TimeTableEntry( 0f, table[0].begin, "" ) ); } } } if ( table[table.Count - 1].end < AppManager.SaveData.m_totalSec ) { m_copied_timetable.Add( new TimeTableEntry( table[table.Count - 1].end, AppManager.SaveData.m_totalSec, "" ) ); } } private void h_shiftEntries( object sender, EventArgs e ) { int group = m_clicked.group; int track = m_clicked.track; int entry = m_clicked.entry; TimeTableType type = m_clicked.type; if ( type != TimeTableType.vsq && type != TimeTableType.character && type != TimeTableType.another && type != TimeTableType.plugin && type != TimeTableType.telop ) { return; } using ( InputBox ib = new InputBox( _( "Shift all time-tables" ), _( "Input shift time in second (you can enter minus value)" ) ) ) { if ( ib.ShowDialog() == DialogResult.OK ) { float shift; try { shift = float.Parse( ib.rText ); } catch { MessageBox.Show( _( "Invalid value has been entered" ), _( "Error" ), MessageBoxButtons.OK, MessageBoxIcon.Exclamation ); return; } Command run = Command.GCommandShiftTimeTable( type, (type == TimeTableType.character ? group : track), shift ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } } } private void h_splitEntry( object sender, EventArgs e ) { TimeTableType type = m_clicked.type; int group = m_clicked.group; int track = m_clicked.track; int entry = m_clicked.entry; if ( type != TimeTableType.character && type != TimeTableType.another && type != TimeTableType.plugin && type != TimeTableType.telop ) { return; } if ( type == TimeTableType.telop ) { Telop edit = (Telop)AppManager.SaveData[entry].Clone(); float split_position = SecFromXCoord( m_mousePosition.X ); edit.End = split_position; Telop adding = (Telop)AppManager.SaveData[entry].Clone(); adding.Start = split_position; Command run = Command.GCommandEditTelop( entry, edit ); run.child = Command.GCommandAddTelop( adding ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } else { TimeTable table = (TimeTable)AppManager.SaveData[type, group][track].Clone(); float begin = SecFromXCoord( m_mousePosition.X ); float buf = table[entry].end; table[entry].end = begin; table.Add( new TimeTableEntry( begin, buf, table[entry].body ) ); table.Sort(); Command run = Command.GCommandEditTimeTable( m_clicked.type, group, track, table ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; table.Dispose(); } } /// /// テキストからのインポート /// /// /// private void h_importFromText( object sender, EventArgs e ) { TimeTableType type = m_clicked.type; int group = m_clicked.group; int track = m_clicked.track; using ( OpenFileDialog dlg = new OpenFileDialog() ) { try { dlg.Filter = _( "Text file(*.txt)|*.txt" ) + "|" + _( "All Files(*.*)|*.*" ); } catch { dlg.Filter = "Text file(*.txt)|*.txt|All Files(*.*)|*.*"; } if ( dlg.ShowDialog() == DialogResult.OK ) { string file = dlg.FileName; // 編集対象をコピー if ( type != TimeTableType.vsq && type != TimeTableType.another && type != TimeTableType.character && type != TimeTableType.plugin ) { return; } TimeTableGroup table = (TimeTableGroup)AppManager.SaveData[type, group].Clone(); //int target_group = -1; using ( StreamReader sr = new StreamReader( file ) ) { float begin, end; string line; while ( sr.Peek() > -1 ) { line = sr.ReadLine(); string[] spl = line.Split( new char[] { ' ', '\t', ',' }, StringSplitOptions.RemoveEmptyEntries ); if ( spl.Length >= 2 ) { if ( m_clicked.type == TimeTableType.vsq ) { try { begin = float.Parse( spl[0] ); end = float.Parse( spl[1] ); } catch { continue; } string body = ""; if ( spl.Length >= 3 ) { body = spl[2]; } table.Interrup( track, begin, end, body ); } else { try { begin = float.Parse( spl[0] ); end = float.Parse( spl[1] ); table.Interrup( track, begin, end ); } catch { } } } } } Command run = Command.GCommandEditGroup( m_clicked.type, group, table ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; table.Dispose(); table = null; } } } /// /// テキストへの出力 /// /// /// private void h_exportToText( object sender, EventArgs e ) { TimeTableType type = m_clicked.type; int group = m_clicked.group; int track = m_clicked.track; using ( SaveFileDialog dlg = new SaveFileDialog() ) { try { dlg.Filter = _( "Text file(*.txt)|*.txt" ) + "|" + _( "All Files(*.*)|*.*" ); } catch { dlg.Filter = "Text file(*.txt)|*.txt|All Files(*.*)|*.*"; } dlg.AddExtension = true; if ( dlg.ShowDialog() == DialogResult.OK ) { string file = dlg.FileName; TimeTable table = null; using ( StreamWriter sw = new StreamWriter( file ) ) { table = AppManager.SaveData[type, group][track]; if ( table == null ) { return; } for ( int entry = 0; entry < table.Count; entry++ ) { if ( m_clicked.type == TimeTableType.vsq ) { sw.WriteLine( table[entry].begin + "\t" + table[entry].end + "\t" + table[entry].body ); } else { sw.WriteLine( table[entry].begin + "\t" + table[entry].end ); } } } } } } /// /// エントリの貼付け /// /// /// private void h_pasteEntry( object sender, EventArgs e ) { int group = m_clicked.group; int track = m_clicked.track; int entry = m_clicked.entry; float begin = SecFromXCoord( m_mousePosition.X ); switch ( m_clicked.type ) { case TimeTableType.another: if ( m_copied.type == TimeTableType.telop ) { TimeTableEntry ent = new TimeTableEntry(); ent.end = begin + m_copied_telop.End - m_copied_telop.Start; ent.begin = begin; ent.body = AppManager.SaveData.m_group_another[track].Text; TimeTableGroup ttg = (TimeTableGroup)AppManager.SaveData.m_group_another.Clone(); ttg.Interrup( track, ent.begin, ent.end, ent.body ); Command run = Command.GCommandEditTimeTable( TimeTableType.another, -1, track, ttg[track] ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } else { using ( TimeTableEntry ent = (TimeTableEntry)m_copied_entry.Clone() ) using ( TimeTableGroup tablegroup = (TimeTableGroup)AppManager.SaveData.m_group_another.Clone() ) { ent.end = begin + (ent.end - ent.begin); ent.begin = begin; ent.body = AppManager.SaveData.m_group_another[track].Text; tablegroup.Interrup( track, ent.begin, ent.end, ent.body ); Command run = Command.GCommandEditTimeTable( TimeTableType.another, -1, track, tablegroup[track] ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } } break; case TimeTableType.character: if ( m_copied.type == TimeTableType.telop ) { TimeTableEntry tte = new TimeTableEntry(); tte.end = begin + m_copied_telop.End - m_copied_telop.Start; tte.begin = begin; TimeTableGroup ttg = (TimeTableGroup)AppManager.SaveData.m_groups_character[group].Clone(); ttg.Interrup( track, tte.begin, tte.end ); Command run = Command.GCommandEditGroup( TimeTableType.character, group, ttg ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } else { using ( TimeTableEntry ent = (TimeTableEntry)m_copied_entry.Clone() ) using ( TimeTableGroup tablegroup = (TimeTableGroup)AppManager.SaveData.m_groups_character[group].Clone() ) { ent.end = begin + (ent.end - ent.begin); ent.begin = begin; tablegroup.Interrup( track, ent.begin, ent.end ); Command run = Command.GCommandEditGroup( TimeTableType.character, group, tablegroup ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } } break; case TimeTableType.plugin: if ( m_copied.type == TimeTableType.telop ) { TimeTableEntry tte = new TimeTableEntry(); tte.end = begin + m_copied_telop.End - m_copied_telop.Start; tte.begin = begin; TimeTableGroup ttg = (TimeTableGroup)AppManager.SaveData.m_group_plugin.Clone(); ttg.Interrup( track, tte.begin, tte.end ); Command run = Command.GCommandEditTimeTable( TimeTableType.plugin, -1, track, ttg[track] ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } else { using ( TimeTableEntry ent = (TimeTableEntry)m_copied_entry.Clone() ) using ( TimeTableGroup tablegroup = (TimeTableGroup)AppManager.SaveData.m_group_plugin.Clone() ) { ent.end = begin + (ent.end - ent.begin); ent.begin = begin; if ( m_copied.track == m_clicked.track && m_copied.type == TimeTableType.plugin ) { ent.body = m_copied_entry.body; } else { ent.body = ""; } tablegroup.Interrup( track, ent.begin, ent.end, ent.body ); Command run = Command.GCommandEditTimeTable( TimeTableType.plugin, -1, track, tablegroup[track] ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } } break; case TimeTableType.telop: if ( m_copied.type == TimeTableType.telop ) { Telop edited = (Telop)m_copied_telop.Clone(); edited.End = begin + m_copied_telop.End - m_copied_telop.Start; edited.Start = begin; Command run = Command.GCommandAddTelop( edited ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } break; } UpdateObjectList(); } /// /// エントリの切取 /// /// /// private void h_cutEntry( object sender, EventArgs e ) { TimeTableType type = m_clicked.type; int group = m_clicked.group; int track = m_clicked.track; int entry = m_clicked.entry; if ( type == TimeTableType.telop ) { m_copied_telop = (Telop)AppManager.SaveData[entry].Clone(); m_copied = m_clicked; Command run = Command.GCommandDeleteTelop( m_copied_telop ); AppManager.Register( AppManager.SaveData.Execute( run ) ); } else { m_copied_entry = (TimeTableEntry)AppManager.SaveData[type, group][track][entry].Clone(); m_copied = m_clicked; Command run = Command.GCommandDeleteTimeTableEntry( type, group, track, AppManager.SaveData[type, group][track][entry] ); AppManager.Register( AppManager.SaveData.Execute( run ) ); } UpdateObjectList(); AppManager.Edited = true; } /// /// エントリのコピー /// /// /// private void h_copyEntry( object sender, EventArgs e ) { TimeTableType type = m_clicked.type; int group = m_clicked.group; int track = m_clicked.track; int entry = m_clicked.entry; if ( type == TimeTableType.telop ) { m_copied_telop = (Telop)AppManager.SaveData[entry].Clone(); } else { m_copied_entry = (TimeTableEntry)AppManager.SaveData[type, group][track][entry].Clone(); } m_copied = m_clicked; } /// /// タイムラインのグループごとの折りたたみを行う /// /// /// private void h_foldAll( object sender, EventArgs e ) { AppManager.SaveData.m_group_vsq.Folded = true; for ( int group = 0; group < AppManager.SaveData.m_groups_character.Count; group++ ) { AppManager.SaveData.m_groups_character[group].Folded = true; } AppManager.SaveData.m_group_another.Folded = true; AppManager.SaveData.m_group_plugin.Folded = true; AppManager.SaveData.TelopListFolded = true; this.Invalidate(); } /// /// 折りたたまれたタイムライン・グループを展開する /// /// /// private void h_expandAll( object sender, EventArgs e ) { AppManager.SaveData.m_group_vsq.Folded = false; for ( int group = 0; group < AppManager.SaveData.m_groups_character.Count; group++ ) { AppManager.SaveData.m_groups_character[group].Folded = false; } AppManager.SaveData.m_group_another.Folded = false; AppManager.SaveData.m_group_plugin.Folded = false; AppManager.SaveData.TelopListFolded = false; SetVScrollRange(); this.Invalidate(); } /// /// 選択されたエントリを可能な限り拡張する /// /// /// private void h_expandEntry( object sender, EventArgs e ) { PointF px; float time = SecFromXCoord( m_mousePosition.X ); if ( m_clicked.type == TimeTableType.character ) { px = GetEntryLimit( m_clicked, time, true ); } else { px = GetEntryLimitSingle( m_clicked, time, true ); } Command run, inv; TimeTableType type = m_clicked.type; int group = m_clicked.group; int track = m_clicked.track; int entry = m_clicked.entry; TimeTableEntry item = new TimeTableEntry( px.X, px.Y, "" ); if ( type != TimeTableType.another && type != TimeTableType.character && type != TimeTableType.plugin ) { return; } if ( type == TimeTableType.plugin ) { item.body = ""; } else { item.body = AppManager.SaveData[type, group][track].Text; } run = Command.GCommandEditTimeTableEntry( type, group, track, entry, item ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } /// /// タイムテーブルの貼付け /// /// /// private void h_pasteTimeTable( object sender, EventArgs e ) { if ( m_copied_timetable == null ) { return; } TimeTableType type = m_clicked.type; int group = m_clicked.group; int track = m_clicked.track; bool overwrite = false; TimeTableGroup tmp; TimeTableType command_target; int target_group; if ( AppManager.SaveData[type, group][track].Count > 0 ) { overwrite = true; } command_target = type; if ( type == TimeTableType.character ) { target_group = group; } else { target_group = -1; } tmp = (TimeTableGroup)AppManager.SaveData[type, group].Clone(); if ( overwrite ) { using ( PasteModeDialog dlg = new PasteModeDialog() ) { dlg.ShowDialog(); PasteModeDialogResult result = dlg.DialogResult; switch ( result ) { case PasteModeDialogResult.Cancel: tmp.Dispose(); tmp = null; return; case PasteModeDialogResult.Overwrite: tmp[track].Clear(); break; } } } for ( int entry = 0; entry < m_copied_timetable.Count; entry++ ) { if ( command_target == TimeTableType.vsq && m_copied_timetable.Type == TimeTableType.vsq ) { tmp.Interrup( track, m_copied_timetable[entry].begin, m_copied_timetable[entry].end, m_copied_timetable[entry].body ); } else { tmp.Interrup( track, m_copied_timetable[entry].begin, m_copied_timetable[entry].end ); } } Command run = Command.GCommandEditGroup( command_target, target_group, tmp ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; if ( tmp != null ) { tmp.Dispose(); tmp = null; } this.Invalidate(); } /// /// タイムテーブルのコピー /// /// /// private void h_copyTimeTable( object sender, EventArgs e ){ int group = m_clicked.group; int track = m_clicked.track; if ( m_copied_timetable != null ) { m_copied_timetable.Dispose(); m_copied_timetable = null; } m_copied_timetable = (TimeTable)AppManager.SaveData[m_clicked.type, group][track].Clone(); } /// /// 表示倍率の設定 /// /// /// private void h_setScale( object sender, EventArgs e ) { TimeTableType type = m_clicked.type; int group = m_clicked.group; int track = m_clicked.track; if ( type != TimeTableType.character && type != TimeTableType.another ) { return; } using ( InputBox ib = new InputBox( _( "Scale setting" ), _( "Please enter scale. (If entered value is minus, character or image will be flipped horizontally.)" ) ) ) { float sscale; switch ( m_clicked.type ) { case TimeTableType.character: sscale = AppManager.SaveData.m_groups_character[group].Scale; break; case TimeTableType.another: sscale = AppManager.SaveData.m_group_another[track].Scale; break; default: return; } ib.rText = sscale.ToString(); if ( ib.ShowDialog() == DialogResult.OK ) { //float scale = 1.0f; try { sscale = float.Parse( ib.rText ); } catch { MessageBox.Show( _( "Invalid value has been entered" ), _( "Error" ), MessageBoxButtons.OK, MessageBoxIcon.Exclamation ); return; } Command run = Command.GCommandChangeScale( type, group, track, sscale ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; UpdateEditHandle(); } } } /// /// クリックされたトラック上のエントリをクリアします /// /// /// private void h_clearEntry( object sender, EventArgs e ) { TimeTableType type = m_clicked.type; int group = m_clicked.group; int track = m_clicked.track; if ( MessageBox.Show( _( "...clearing entries of selected time-table.\nWould you like to continue?" ), _( "Confirmation" ), MessageBoxButtons.OKCancel, MessageBoxIcon.Question ) == DialogResult.OK ) { if ( type == TimeTableType.telop ) { Telop[] edit = AppManager.SaveData.m_telop_ex2.ToArray(); Command run = Command.GCommandDeleteTelopRange( edit ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } else { using ( TimeTable table = (TimeTable)AppManager.SaveData[type, group][track].Clone() ) { table.Clear(); Command run = Command.GCommandEditTimeTable( type, group, track, table ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } } } } private void h_editEntry( object sender, EventArgs e ) { TimeTableType type = m_clicked.type; int group = m_clicked.group; int track = m_clicked.track; int entry = m_clicked.entry; if ( type != TimeTableType.character && type != TimeTableType.another && type != TimeTableType.plugin && type != TimeTableType.telop ) { return; } PointF bound; float begin, end; if ( type == TimeTableType.telop ) { begin = AppManager.SaveData[entry].Start; end = AppManager.SaveData[entry].End; } else { begin = AppManager.SaveData[type, group][track][entry].begin; end = AppManager.SaveData[type, group][track][entry].end; } if ( type == TimeTableType.character ) { bound = GetEntryLimit( m_clicked, (begin + end) / 2f, true ); } else if ( type == TimeTableType.telop ) { bound = new PointF( 0f, AppManager.SaveData.m_totalSec ); } else { bound = GetEntryLimitSingle( m_clicked, (begin + end) / 2f, true ); } using ( EditEntry eden = new EditEntry( begin, end, bound.X, bound.Y ) ) { if ( eden.ShowDialog() == DialogResult.OK ) { if ( type == TimeTableType.telop ) { Telop edited = (Telop)AppManager.SaveData[entry].Clone(); edited.Start = eden.Start; edited.End = eden.End; Command run = Command.GCommandEditTelop( entry, edited ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } else { using ( TimeTableEntry item = new TimeTableEntry( eden.Start, eden.End, AppManager.SaveData[type, group][track][entry].body ) ) { Command run = Command.GCommandEditTimeTableEntry( type, group, track, entry, item ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } } } } } private void h_pluginSetting( object sender, EventArgs e ) { ToolStripDropDownItem item = (ToolStripDropDownItem)sender; string plugin_name = item.Text; for ( int i = 0; i < AppManager.SaveData.m_plugins_config.Count; i++ ) { if ( plugin_name == AppManager.SaveData.m_plugins_config[i].ID ) { string old_config = AppManager.SaveData.m_plugins[i].Instance.Config; if ( AppManager.SaveData.m_plugins[i].Instance.BaseSetting() == DialogResult.OK ) { string new_config = AppManager.SaveData.m_plugins[i].Instance.Config; AppManager.SaveData.m_plugins[i].Instance.Config = old_config; //ちょっとセコイなw if ( old_config != new_config ) { Command run = Command.GCommandChangePluginConfig( i, new_config ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.SaveData.m_plugins[i].Instance.Config = new_config; AppManager.Edited = true; } } break; } } } private void h_entrySetting( object sender, EventArgs e ) { int track = m_clicked.track; int entry = m_clicked.entry; string current = AppManager.SaveData.m_group_plugin[track][entry].body; if ( AppManager.SaveData.m_plugins[track].Instance.EntrySetting( ref current ) == DialogResult.OK ) { using ( TimeTableEntry tmp = new TimeTableEntry( AppManager.SaveData.m_group_plugin[track][entry].begin, AppManager.SaveData.m_group_plugin[track][entry].end, current ) ) { Command run = Command.GCommandEditTimeTableEntry( TimeTableType.plugin, -1, track, entry, tmp ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } } } /// /// 目パチを自動で追加します。 /// /// /// private void h_addWink( object sender, EventArgs e ) { List titles = new List(); foreach ( ImageEntry img in AppManager.SaveData.m_groups_character[m_clicked.group].Character ) { titles.Add( img.title ); } using ( Winker winkconfig = new Winker( titles.ToArray(), AppManager.SaveData.m_totalSec ) ) { if ( winkconfig.ShowDialog() != DialogResult.OK ) { return; } bool randomize = winkconfig.Randomize; float interval = winkconfig.WinkInterval; float begin; if ( winkconfig.BeginForced ) { begin = winkconfig.ForcedBegin; } else { begin = 0.0f; } float end; if ( winkconfig.EndForced ) { end = winkconfig.ForcedEnd; } else { end = AppManager.SaveData.m_totalSec; } string closed = winkconfig.ClosedEye; string in_between = winkconfig.InBetween; float close_frames = winkconfig.CloseFrames; Random rnd = new Random(); float total; if ( begin == 0.0f ) { total = nextInterval( ref rnd, interval, randomize ); } else { total = begin; } //titleがclosedであるImagesのインデクスを検索 int track = -1; for ( int i = 0; i < AppManager.SaveData.m_groups_character[m_clicked.group].Count; i++ ) { if ( AppManager.SaveData.m_groups_character[m_clicked.group][i].Text == closed ) { track = i; break; } } if ( track < 0 ) { winkconfig.Dispose(); return; } //titleがin_betweenであるImagesのインデクスを検索 int bet_track = -1; for ( int i = 0; i < AppManager.SaveData.m_groups_character[m_clicked.group].Count; i++ ) { if ( AppManager.SaveData.m_groups_character[m_clicked.group][i].Text == in_between ) { bet_track = i; break; } } using ( TimeTableGroup temp = (TimeTableGroup)AppManager.SaveData.m_groups_character[m_clicked.group].Clone() ) { float unit_frame; if ( bet_track < 0 ) { unit_frame = close_frames / AppManager.SaveData.FrameRate; } else { unit_frame = close_frames / 2f / AppManager.SaveData.FrameRate; } while ( total <= end ) { temp.Interrup( track, total, total + unit_frame ); if ( bet_track >= 0 ) { temp.Interrup( bet_track, total + unit_frame, total + 2f * unit_frame ); } total += (close_frames / AppManager.SaveData.FrameRate + nextInterval( ref rnd, interval, randomize )); } temp[track].Sort(); if ( bet_track >= 0 ) { temp[bet_track].Sort(); } Command run = Command.GCommandEditGroup( TimeTableType.character, m_clicked.group, temp ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } this.Invalidate(); } } /// /// 新しいトラックを追加します /// /// /// private void h_addTrack( object sender, EventArgs e ) { switch ( m_clicked.type ) { case TimeTableType.another: using ( TimeTable temp = new TimeTable( "test track", 0, TimeTableType.another, null ) ) { Command run = Command.GCommandAddTimeTable( TimeTableType.another, -1, AppManager.SaveData.m_group_another.Count, temp ); AppManager.Register( AppManager.SaveData.Execute( run ) ); } AppManager.SaveData.UpdateZorder(); AppManager.Edited = true; UpdateObjectList(); SetVScrollRange(); break; } } /// /// クリックされた位置のトラックが担当する画像を変更します /// /// /// private void h_setImage( object sender, EventArgs e ) { int group = m_clicked.group; int track = m_clicked.track; if ( group < 0 ) { return; } switch ( m_clicked.type ) { case TimeTableType.another: if ( dialogImage.ShowDialog() == DialogResult.OK ) { if ( track >= 0 ) { string file = dialogImage.FileName; if ( Path.GetExtension( file ).ToLower() == ".avi" ) { Command run = Command.GCommandSetAvi( track, file ); AppManager.Register( AppManager.SaveData.Execute( run ) ); #if DEBUG Common.DebugWriteLine( "Form1.h_setImage; mode avi" ); #endif } else { Command run = Command.GCommandSetImage( track, new Bitmap( Common.ImageFromFile( dialogImage.FileName ) ) ); AppManager.Register( AppManager.SaveData.Execute( run ) ); #if DEBUG Common.DebugWriteLine( "Form1.h_setImage; mode image" ); #endif } AppManager.Edited = true; } } UpdateEditHandle(); break; } } private void h_previewImage( object sender, EventArgs e ) { int group = m_clicked.group; int track = m_clicked.track; if ( group < 0 ) { return; } switch ( m_clicked.type ) { case TimeTableType.character: if ( track < 0 ) { ShowPreviewPictureBox( AppManager.SaveData.m_groups_character[group].Character.DefaultFace, m_mousePosition ); } else { string title = AppManager.SaveData[m_clicked.type, group][track].Text; Character3 ch = AppManager.SaveData.m_groups_character[group].Character; if ( ch == null ) { return; } List list = new List(); list.Add( track ); string tag = ch[title].tag; foreach ( ImageEntry ie in ch ) { if ( tag != "" ) { if ( ie.IsDefault ) { list.Add( ie.Z ); } } else { if ( ie.IsDefault && (tag != "" && ie.tag == tag) ) { list.Add( ie.Z ); } } } /*for ( int i = 0; i < ch.Count; i++ ) { if ( tag != "" ) { if ( ch[i].IsDefault ) { list.Add( i ); } } else { if ( ch[i].IsDefault && (tag != "" && ch[i].tag == tag) ) { list.Add( i ); } } }*/ Image img = AppManager.SaveData.m_groups_character[group].Character.Face( list.ToArray() ); ShowPreviewPictureBox( img, m_mousePosition ); } break; case TimeTableType.another: if ( track >= 0 ) { ShowPreviewPictureBox( AppManager.SaveData.m_group_another[track].Image, m_mousePosition ); //showPreviewPictureBox( s.m_group_another[track].GetImage( 0f ), m_mousePosition ); } break; default: break; } } /// /// time_tableに格納されている歌詞の情報から、口パクトラックを作成し、追加します /// アンドゥ・リドゥ用の処理はgenMouthFromVsqでやってる。 /// /// /// private void h_genMouthFromVsq( object sender, EventArgs e ) { if ( m_clicked.type != TimeTableType.vsq ) { return; } List plugins = new List(); 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 ) { //if ( sc.SaveCharacterConfigOutside ) { // genMouthFromVsq( s.m_group_vsq[m_clicked.track], sc.Character, true, sc.Path ); //} else { GenerateLipsyncFromVsq( AppManager.SaveData.m_group_vsq[m_clicked.track], sc.Character, true ); //} AppManager.Edited = true; SetVScrollRange(); this.Invalidate(); } } } /// /// vsqファイルから、トラックを読み込みます /// /// /// private void h_readVsq( object sender, EventArgs e ) { 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 ) { AppManager.Config.LastVsqPath = openVsqDialog.FileName; string file_name = openVsqDialog.FileName; ReadVsq( file_name ); } } /// /// /// /// /// private void h_setVideoSize( object sender, EventArgs e ) { sizeChange(); } private void h_setImagePosition( object sender, EventArgs e ) { TimeTableType type = m_clicked.type; Point point; if ( type == TimeTableType.another ) { point = AppManager.SaveData.m_group_another[m_clicked.track].Position; } else if ( type == TimeTableType.character ) { point = AppManager.SaveData.m_groups_character[m_clicked.group].Position; } else { return; } using ( SetSize setsize = new SetSize( _( "Image placement" ), "X", "Y", point.X, point.Y ) ) { if ( setsize.ShowDialog() == DialogResult.OK ) { Point point_new = new Point( setsize.ResultWidth, setsize.ResultHeight ); Command run = Command.GCommandSetPosition( type, m_clicked.group, m_clicked.track, point_new ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } } } private void h_editCharacter( object sender, EventArgs e ) { if ( AppManager.SaveData.m_groups_character[m_clicked.group].Character.Type == CharacterType.def ) { int prev = AppManager.SaveData.m_groups_character[m_clicked.group].Character.Count; int group = m_clicked.group; using ( GenerateCharacter gc = new GenerateCharacter( AppManager.SaveData.m_groups_character[group] ) ) { gc.LastPath = AppManager.Config.LastCharacterPath; if ( gc.ShowDialog() == DialogResult.OK ) { AppManager.Config.LastCharacterPath = gc.LastPath; /*List old = new List(); for ( int i = 0; i < AppManager.SaveData.m_groups_character[group].Count; i++ ) { old.Add( (TimeTable)AppManager.SaveData.m_groups_character[group][i].Clone() ); } TimeTableGroup ttg = (TimeTableGroup)AppManager.SaveData.m_groups_character[group].Clone(); ttg.list.Clear(); foreach ( ImageEntry ie in gc.EditedResult.Character ) { for ( int j = 0; j < old.Count; j++ ) { if ( ie.title == old[j].Text ) { ttg.list.Add( old[j] ); break; } } }*/ /*for ( int i = 0; i < gc.EditedResult.Count; i++ ) { for ( int j = 0; j < old.Count; j++ ) { if ( gc.EditedResult[i].title == old[j].Text ) { ttg.list.Add( old[j] ); break; } } }*/ /*using ( TimeTableGroup temp = (TimeTableGroup)AppManager.SaveData.m_groups_character[group].Clone() ) { temp.Character = gc.EditedResult.Character; //temp.Character = (Character3)gc.Character.Clone(); temp.Clear(); bool found = false; // Images foreach ( ImageEntry item in temp.Character ) { found = false; for ( int track = 0; track < AppManager.SaveData.m_groups_character[group].Count; track++ ) { if ( AppManager.SaveData.m_groups_character[group][track].Text == item.title ) { temp.Add( (TimeTable)AppManager.SaveData.m_groups_character[group][track].Clone() ); found = true; break; } } if ( !found ) { temp.Add( new TimeTable( item.title, 0, TimeTableType.character, null ) ); } } temp.Text = gc.Character.Name; Command run = Command.GCommandEditGroup( TimeTableType.character, group, temp ); AppManager.Register( AppManager.SaveData.Execute( run ) ); }*/ TimeTableGroup ttg = gc.EditedResult; ttg.Text = ttg.Character.Name; Command run = Command.GCommandEditGroup( TimeTableType.character, group, ttg ); AppManager.Register( AppManager.SaveData.Execute( run ) ); SetVScrollRange(); this.Invalidate(); AppManager.Edited = true; } } } else { string id = AppManager.SaveData.m_groups_character[m_clicked.group].Character.PluginConfig.ID; int index = -1; for ( int i = 0; i < AppManager.SaveData.m_plugins_config.Count; i++ ) { if ( id == AppManager.SaveData.m_plugins_config[i].ID ) { index = i; break; } } if ( index >= 0 ) { if ( AppManager.SaveData.m_plugins[index].Instance.BaseSetting() == DialogResult.OK ) { Command run = Command.GCommandChangePluginConfig( index, AppManager.SaveData.m_plugins[index].Instance.Config ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; } } } } /// /// m_clickedで指定されたトラック、またはトラックグループを削除します。 /// /// /// private void h_deleteTrack( object sender, EventArgs e ) { #if DEBUG Common.DebugWriteLine( "Form1+h_deleteTrack" ); Common.DebugWriteLine( " m_curve.comboObjects.SelectedIndex=" + m_curve.comboObjects.SelectedIndex ); #endif if ( m_curve.comboObjects.SelectedIndex < 0 ) { m_curve.SetSelectedNone(); } TimeTableType type = m_clicked.type; int group = m_clicked.group; int track = m_clicked.track; bool deleted = false; StopPauseCore(); m_player.Pause(); if ( type == TimeTableType.character ) { if ( track < 0 ) { if ( MessageBox.Show( _( "...deleting selected character.\nWould you like to continue?" ), _( "Confirmation" ), MessageBoxButtons.OKCancel, MessageBoxIcon.Question ) == DialogResult.OK ) { Command run = Command.GCommandDeleteTimeTableGroup( TimeTableType.character, group ); AppManager.Register( AppManager.SaveData.Execute( run ) ); deleted = true; } } } else if ( type == TimeTableType.another || type == TimeTableType.vsq ) { if ( MessageBox.Show( _( "...deleting selected track.\nWould you like to continue?" ), _( "Confirmation" ), MessageBoxButtons.OKCancel, MessageBoxIcon.Question ) == DialogResult.OK ) { Command run = Command.GCommandDeleteTimeTable( type, -1, track ); AppManager.Register( AppManager.SaveData.Execute( run ) ); deleted = true; } } #if DEBUG Common.DebugWriteLine( " deleted=" + deleted ); #endif if ( deleted ) { if ( m_curve.comboObjects.SelectedItem != null ) { bool clear_required = false; TagForTreeNode t = (TagForTreeNode)m_curve.comboObjects.SelectedItem; if ( type == TimeTableType.character && t.type == ZorderItemType.character && t.id_or_index == group ) { clear_required = true; } else if ( type == TimeTableType.another && t.type == ZorderItemType.character && t.id_or_index == track ) { clear_required = true; } if ( clear_required ) { m_curve.SetSelectedNone(); } } AppManager.SaveData.UpdateZorder(); AppManager.Edited = true; UpdateObjectList(); this.Invalidate(); } } private void h_noteON( object sender, EventArgs e ) { TimeTableType type = m_clicked.type; int group = m_clicked.group; int track = m_clicked.track; int entry = m_clicked.entry; float begin = SecFromXCoord( m_mousePosition.X ); PointF bound; string body; if ( type == TimeTableType.character ) { body = AppManager.SaveData.m_groups_character[group][track].Text; bound = GetEntryLimit( m_clicked, begin, false ); } else if ( type == TimeTableType.another || type == TimeTableType.plugin ) { body = AppManager.SaveData[type, -1][track].Text; bound = GetEntryLimitSingle( m_clicked, begin, false ); } else { return; } if ( bound.Y > begin ) { Command run = Command.GCommandAddTimeTableEntry( type, group, track, new TimeTableEntry( begin, bound.Y, body ) ); AppManager.Register( AppManager.SaveData.Execute( run ) ); AppManager.Edited = true; this.Invalidate(); } } private void h_pluginInfo( object sender, EventArgs e ) { ToolStripMenuItem c_sender = (ToolStripMenuItem)sender; int index = -1; for ( int i = 0; i < AppManager.SaveData.m_plugins.Length; i++ ) { if ( AppManager.SaveData.m_plugins[i].Instance.Name == c_sender.Text ) { index = i; break; } } if ( index >= 0 ) { VersionBox info = new VersionBox( AppManager.SaveData.m_plugins[index].Instance.Name, AppManager.SaveData.m_plugins[index].Instance.Abstract ); info.ShowDialog(); info.Dispose(); } } private void h_noteOFF( object sender, EventArgs e ) { TimeTableType type = m_clicked.type; int group = m_clicked.group; int track = m_clicked.track; int entry = m_clicked.entry; float end = (m_mousePosition.X + m_startToDrawX) / AppManager.Config.PixelPerSec; if ( type != TimeTableType.character && type != TimeTableType.another && type != TimeTableType.plugin && type != TimeTableType.telop ) { return; } if ( type == TimeTableType.telop ) { Telop item = (Telop)AppManager.SaveData[entry].Clone(); item.End = end; Command run = Command.GCommandEditTelop( entry, item ); AppManager.Register( AppManager.SaveData.Execute( run ) ); } else { TimeTableEntry item; item = (TimeTableEntry)AppManager.SaveData[type, group][track][entry].Clone(); item.end = end; Command run = Command.GCommandEditTimeTableEntry( type, group, track, entry, item ); AppManager.Register( AppManager.SaveData.Execute( run ) ); } AppManager.Edited = true; this.Invalidate(); } } }