2020-11-23 16:51:05 +01:00
using Flowframes.Forms ;
using Flowframes.IO ;
using Flowframes.Magick ;
using Flowframes.Main ;
using Flowframes.OS ;
using Flowframes.UI ;
using Microsoft.WindowsAPICodePack.Dialogs ;
using System ;
using System.Diagnostics ;
using System.Drawing ;
using System.IO ;
using System.Linq ;
using System.Windows.Forms ;
using HTAlt.WinForms ;
using Flowframes.Data ;
2020-11-26 20:17:18 +01:00
using Microsoft.WindowsAPICodePack.Taskbar ;
2020-11-27 14:35:32 +01:00
using System.Threading.Tasks ;
2020-11-23 16:51:05 +01:00
namespace Flowframes
{
public partial class Form1 : Form
{
public bool initialized = false ;
public Form1 ( )
{
InitializeComponent ( ) ;
}
private void Form1_Load ( object sender , EventArgs e )
{
CheckForIllegalCrossThreadCalls = false ;
Text = $"Flowframes v{Program.version}" ;
// Main Tab
UIUtils . InitCombox ( interpFactorCombox , 0 ) ;
UIUtils . InitCombox ( outModeCombox , 0 ) ;
2020-11-25 17:27:15 +01:00
UIUtils . InitCombox ( tilesize , 4 ) ;
2020-11-23 16:51:05 +01:00
// Video Utils
UIUtils . InitCombox ( utilsLoopTimesCombox , 0 ) ;
UIUtils . InitCombox ( utilsSpeedCombox , 0 ) ;
UIUtils . InitCombox ( utilsConvCrf , 0 ) ;
Program . mainForm = this ;
Logger . textbox = logBox ;
InitAis ( ) ;
InterpolateUtils . preview = previewPicturebox ;
ConfigParser . LoadComboxIndex ( aiCombox ) ;
Setup . Init ( ) ;
2020-11-29 16:10:31 +01:00
UpdateStepByStepControls ( ) ;
2020-11-23 16:51:05 +01:00
Initialized ( ) ;
2020-11-26 20:17:18 +01:00
Checks ( ) ;
}
2020-11-23 16:51:05 +01:00
2020-11-26 20:17:18 +01:00
void Checks ( )
{
2020-11-25 20:31:21 +01:00
GetWebInfo . LoadNews ( newsLabel ) ;
GetWebInfo . LoadPatronList ( patronsLabel ) ;
2020-11-23 16:51:05 +01:00
Updater . AsyncUpdateCheck ( ) ;
}
public HTTabControl GetMainTabControl ( ) { return mainTabControl ; }
public bool IsInFocus ( ) { return ( ActiveForm = = this ) ; }
2020-11-25 20:31:21 +01:00
public void SetTab ( string tabName )
{
foreach ( TabPage tab in mainTabControl . TabPages )
{
if ( tab . Text . ToLower ( ) = = tabName . ToLower ( ) )
mainTabControl . SelectedTab = tab ;
}
mainTabControl . Refresh ( ) ;
mainTabControl . Update ( ) ;
}
2020-11-23 16:51:05 +01:00
public BatchEntry GetBatchEntry ( )
{
2020-12-02 01:09:41 +01:00
SetTab ( "interpolate" ) ;
2020-11-23 16:51:05 +01:00
return new BatchEntry ( inputTbox . Text . Trim ( ) , outputTbox . Text . Trim ( ) , GetAi ( ) , fpsInTbox . GetFloat ( ) , interpFactorCombox . GetInt ( ) , GetOutMode ( ) ) ;
}
public void LoadBatchEntry ( BatchEntry entry )
{
inputTbox . Text = entry . inPath ;
outputTbox . Text = entry . outPath ;
interpFactorCombox . Text = entry . interpFactor . ToString ( ) ;
aiCombox . SelectedIndex = Networks . networks . IndexOf ( entry . ai ) ;
SetOutMode ( entry . outMode ) ;
}
public void SetStatus ( string str )
{
Logger . Log ( str , true ) ;
statusLabel . Text = str ;
}
public void SetProgress ( int percent )
{
longProgBar . Value = percent . Clamp ( 0 , 100 ) ;
longProgBar . Refresh ( ) ;
}
void InitAis ( )
{
foreach ( AI ai in Networks . networks )
aiCombox . Items . Add ( ai . friendlyName + " - " + ai . description ) ;
aiCombox . SelectedIndex = 0 ;
}
public void Initialized ( )
{
initialized = true ;
runBtn . Enabled = true ;
}
private void browseInputBtn_Click ( object sender , EventArgs e )
{
CommonOpenFileDialog dialog = new CommonOpenFileDialog ( ) ;
dialog . InitialDirectory = inputTbox . Text . Trim ( ) ;
dialog . IsFolderPicker = true ;
if ( dialog . ShowDialog ( ) = = CommonFileDialogResult . Ok )
{
inputTbox . Text = dialog . FileName ;
2020-11-27 14:35:32 +01:00
MainUiFunctions . InitInput ( outputTbox , inputTbox , fpsInTbox ) ;
2020-11-23 16:51:05 +01:00
}
}
private void browseInputFileBtn_Click ( object sender , EventArgs e )
{
CommonOpenFileDialog dialog = new CommonOpenFileDialog ( ) ;
dialog . InitialDirectory = inputTbox . Text . Trim ( ) ;
dialog . IsFolderPicker = false ;
if ( dialog . ShowDialog ( ) = = CommonFileDialogResult . Ok )
{
inputTbox . Text = dialog . FileName ;
2020-11-27 14:35:32 +01:00
MainUiFunctions . InitInput ( outputTbox , inputTbox , fpsInTbox ) ;
2020-11-23 16:51:05 +01:00
}
}
private void browseOutBtn_Click ( object sender , EventArgs e )
{
CommonOpenFileDialog dialog = new CommonOpenFileDialog ( ) ;
dialog . InitialDirectory = inputTbox . Text . Trim ( ) ;
dialog . IsFolderPicker = true ;
if ( dialog . ShowDialog ( ) = = CommonFileDialogResult . Ok )
outputTbox . Text = dialog . FileName ;
}
public void runBtn_Click ( object sender , EventArgs e )
{
2020-12-02 01:09:41 +01:00
SetTab ( "interpolate" ) ;
2020-11-23 16:51:05 +01:00
if ( ! BatchProcessing . busy )
2020-11-25 20:31:21 +01:00
SetTab ( "interpolation" ) ;
2020-12-02 01:09:41 +01:00
Interpolate . SetFps ( fpsInTbox . GetFloat ( ) ) ;
Interpolate . interpFactor = interpFactorCombox . GetInt ( ) ;
2020-11-23 16:51:05 +01:00
string inPath = inputTbox . Text . Trim ( ) ;
string outPath = outputTbox . Text . Trim ( ) ;
2020-11-25 17:27:15 +01:00
Interpolate . Start ( inPath , outPath , tilesize . GetInt ( ) , GetOutMode ( ) , GetAi ( ) ) ;
2020-11-23 16:51:05 +01:00
}
Interpolate . OutMode GetOutMode ( )
{
Interpolate . OutMode outMode = Interpolate . OutMode . VidMp4 ;
if ( outModeCombox . Text . ToLower ( ) . Contains ( "gif" ) ) outMode = Interpolate . OutMode . VidGif ;
if ( outModeCombox . Text . ToLower ( ) . Contains ( "png" ) ) outMode = Interpolate . OutMode . ImgPng ;
return outMode ;
}
public void SetOutMode ( Interpolate . OutMode mode )
{
if ( mode = = Interpolate . OutMode . VidMp4 ) outModeCombox . SelectedIndex = 0 ;
if ( mode = = Interpolate . OutMode . VidGif ) outModeCombox . SelectedIndex = 1 ;
if ( mode = = Interpolate . OutMode . ImgPng ) outModeCombox . SelectedIndex = 2 ;
}
AI GetAi ( )
{
return Networks . networks [ aiCombox . SelectedIndex ] ;
}
void inputTbox_DragEnter ( object sender , DragEventArgs e ) { e . Effect = DragDropEffects . Copy ; }
private void inputTbox_DragDrop ( object sender , DragEventArgs e )
{
if ( Program . busy ) return ;
string [ ] files = ( string [ ] ) e . Data . GetData ( DataFormats . FileDrop ) ;
inputTbox . Text = files [ 0 ] ;
2020-11-27 14:35:32 +01:00
MainUiFunctions . InitInput ( outputTbox , inputTbox , fpsInTbox ) ;
2020-11-23 16:51:05 +01:00
}
void outputTbox_DragEnter ( object sender , DragEventArgs e ) { e . Effect = DragDropEffects . Copy ; }
private void outputTbox_DragDrop ( object sender , DragEventArgs e )
{
if ( Program . busy ) return ;
string [ ] files = ( string [ ] ) e . Data . GetData ( DataFormats . FileDrop ) ;
outputTbox . Text = files [ 0 ] ;
}
private void fpsInTbox_TextChanged ( object sender , EventArgs e )
{
fpsInTbox . Text = fpsInTbox . Text . TrimNumbers ( true ) ;
Interpolate . SetFps ( fpsInTbox . GetFloat ( ) ) ;
UpdateOutputFPS ( ) ;
}
public void UpdateOutputFPS ( )
{
float fpsOut = fpsInTbox . GetFloat ( ) * interpFactorCombox . GetFloat ( ) ;
fpsOutTbox . Text = fpsOut . ToString ( ) ;
Interpolate . interpFactor = interpFactorCombox . GetInt ( ) ;
}
private void interpFactorCombox_SelectedIndexChanged ( object sender , EventArgs e )
{
2020-11-25 14:04:31 +01:00
if ( initialized & & GetAi ( ) . aiName = = Networks . rifeNcnn . aiName & & interpFactorCombox . SelectedIndex ! = 0 )
2020-11-23 16:51:05 +01:00
{
2020-11-26 00:07:45 +01:00
//MessageBox.Show("RIFE-NCNN currently only supports x2 interpolation.");
//interpFactorCombox.SelectedIndex = 0; // TODO: Add RIFE 4x/8x workaround & improve CAIN workaround
2020-11-23 16:51:05 +01:00
}
UpdateOutputFPS ( ) ;
}
public void SetWorking ( bool state )
{
2020-12-02 01:09:41 +01:00
Control [ ] controlsToDisable = new Control [ ] { runBtn , runStepBtn , settingsBtn , installerBtn } ;
2020-11-23 16:51:05 +01:00
Program . busy = state ;
foreach ( Control c in controlsToDisable )
c . Enabled = ! state ;
cancelBtn . Visible = state ;
progressCircle . Visible = state ;
}
private void aiCombox_SelectedIndexChanged ( object sender , EventArgs e )
{
2020-11-25 17:27:15 +01:00
tilesize . Visible = GetAi ( ) . supportsTiling ;
tilesizeNotAvailLabel . Visible = ! tilesize . Visible ;
2020-11-23 16:51:05 +01:00
interpFactorCombox_SelectedIndexChanged ( null , null ) ;
2020-11-25 17:27:15 +01:00
if ( GetAi ( ) . supportsTiling )
tilesize . Text = Config . GetInt ( $"tilesize_{GetAi().aiName}" ) . ToString ( ) ;
2020-11-23 16:51:05 +01:00
}
private void Form1_FormClosing ( object sender , FormClosingEventArgs e )
{
ConfigParser . SaveComboxIndex ( aiCombox ) ;
}
private async void debugExtractFramesBtn_Click ( object sender , EventArgs e )
{
await UtilsTab . ExtractVideo ( inputTbox . Text . Trim ( ) , utilsExtractAudioCbox . Checked ) ;
}
private void licenseBtn_Click ( object sender , EventArgs e )
{
Process . Start ( "explorer.exe" , Path . Combine ( Paths . GetPkgPath ( ) , Path . GetFileNameWithoutExtension ( Packages . licenses . fileName ) ) ) ;
}
private async void utilsLoopVidBtn_Click ( object sender , EventArgs e )
{
await UtilsTab . LoopVideo ( inputTbox . Text . Trim ( ) , utilsLoopTimesCombox ) ;
}
private async void utilsChangeSpeedBtn_Click ( object sender , EventArgs e )
{
await UtilsTab . ChangeSpeed ( inputTbox . Text . Trim ( ) , utilsSpeedCombox ) ;
}
private void Form1_DragEnter ( object sender , DragEventArgs e ) { e . Effect = DragDropEffects . Copy ; }
private void Form1_DragDrop ( object sender , DragEventArgs e )
{
if ( Program . busy ) return ;
2020-11-25 20:31:21 +01:00
SetTab ( "interpolation" ) ;
2020-11-23 16:51:05 +01:00
string [ ] files = ( string [ ] ) e . Data . GetData ( DataFormats . FileDrop ) ;
inputTbox . Text = files [ 0 ] ;
Logger . Log ( "Selected video/directory: " + Path . GetFileName ( files [ 0 ] ) ) ;
2020-11-27 14:35:32 +01:00
MainUiFunctions . InitInput ( outputTbox , inputTbox , fpsInTbox ) ;
2020-11-23 16:51:05 +01:00
}
private async void utilsConvertMp4Btn_Click ( object sender , EventArgs e )
{
await UtilsTab . Convert ( inputTbox . Text . Trim ( ) , utilsConvCrf ) ;
}
private void utilsDedupBtn_Click ( object sender , EventArgs e )
{
UtilsTab . Dedupe ( inputTbox . Text . Trim ( ) , false ) ;
}
private void utilsDedupTestBtn_Click ( object sender , EventArgs e )
{
UtilsTab . Dedupe ( inputTbox . Text . Trim ( ) , true ) ;
}
private void installerBtn_Click ( object sender , EventArgs e )
{
new InstallerForm ( ) . ShowDialog ( ) ;
}
private void cancelBtn_Click ( object sender , EventArgs e )
{
2020-11-25 20:31:21 +01:00
SetTab ( "interpolation" ) ;
2020-11-23 16:51:05 +01:00
Interpolate . Cancel ( ) ;
}
private void discordBtn_Click ( object sender , EventArgs e )
{
Process . Start ( "https://discord.gg/eJHD2NSJRe" ) ;
}
private void paypalBtn_Click ( object sender , EventArgs e )
{
Process . Start ( "https://www.paypal.com/paypalme/nmkd/10" ) ;
}
private void patreonBtn_Click ( object sender , EventArgs e )
{
Process . Start ( "https://patreon.com/n00mkrad" ) ;
}
private void settingsBtn_Click ( object sender , EventArgs e )
{
new SettingsForm ( ) . ShowDialog ( ) ;
}
private void queueBtn_Click ( object sender , EventArgs e )
{
if ( BatchProcessing . currentBatchForm ! = null )
{
BatchProcessing . currentBatchForm . WindowState = FormWindowState . Normal ;
BatchProcessing . currentBatchForm . BringToFront ( ) ;
}
else
{
new BatchForm ( ) . Show ( ) ;
}
}
private void previewPicturebox_MouseClick ( object sender , MouseEventArgs e )
{
if ( InterpolateUtils . bigPreviewForm = = null )
{
InterpolateUtils . bigPreviewForm = new BigPreviewForm ( ) ;
InterpolateUtils . bigPreviewForm . Show ( ) ;
InterpolateUtils . bigPreviewForm . SetImage ( previewPicturebox . Image ) ;
}
}
private async void updateBtn_Click ( object sender , EventArgs e )
{
new UpdaterForm ( ) . ShowDialog ( ) ;
}
2020-11-25 17:27:15 +01:00
2020-11-27 14:35:32 +01:00
private void welcomeLabel2_Click ( object sender , EventArgs e )
{
SetTab ( "interpolation" ) ;
}
2020-11-29 16:10:31 +01:00
public void UpdateStepByStepControls ( )
{
stepSelector . Items . Clear ( ) ;
if ( Config . GetBool ( "scnDetect" ) )
2020-12-02 14:36:41 +01:00
stepSelector . Items . AddRange ( new string [ ] { "1) Extract Scene Changes" , "2) Import/Extract Video Frames" , "3) Run Interpolation" , "4) Create Output Video" , "5) Cleanup & Reset" } ) ;
2020-11-29 16:10:31 +01:00
else
2020-12-02 14:36:41 +01:00
stepSelector . Items . AddRange ( new string [ ] { "1) Import/Extract Video Frames" , "2) Run Interpolation" , "3) Create Output Video" , "4) Cleanup & Reset" } ) ;
2020-11-29 16:10:31 +01:00
stepSelector . SelectedIndex = 0 ;
bool stepByStep = Config . GetInt ( "processingMode" ) = = 1 ;
stepSelector . Visible = stepByStep ;
runStepBtn . Visible = stepByStep ;
2020-12-02 01:09:41 +01:00
runBtn . Visible = ! stepByStep ;
2020-11-29 16:10:31 +01:00
}
private async void runStepBtn_Click ( object sender , EventArgs e )
{
2020-12-02 01:09:41 +01:00
SetTab ( "interpolate" ) ;
Interpolate . SetFps ( fpsInTbox . GetFloat ( ) ) ;
2020-11-29 16:10:31 +01:00
await InterpolateSteps . Run ( stepSelector . Text ) ;
}
private void mainTabControl_SelectedIndexChanged ( object sender , EventArgs e )
{
if ( ! initialized ) return ;
aiCombox_SelectedIndexChanged ( null , null ) ;
}
2020-11-30 02:14:04 +01:00
private void tilesize_TextChanged ( object sender , EventArgs e )
{
if ( ! initialized | | ! GetAi ( ) . supportsTiling ) return ;
Config . Set ( $"tilesize_{GetAi().aiName}" , tilesize . GetInt ( ) . Clamp ( 32 , 4096 ) . ToString ( ) ) ;
}
2020-11-23 16:51:05 +01:00
}
}