Skip to content
This repository has been archived by the owner on Apr 13, 2023. It is now read-only.

Commit

Permalink
UI Redesign (#253)
Browse files Browse the repository at this point in the history
List view for selecting video source and encoder.
Window Picker and Screen Picker used instead of dropdowns.
Quality, FPS options shown only when relevant.
and more...
  • Loading branch information
MathewSachin authored Sep 9, 2018
1 parent ab07e34 commit 7e13fed
Show file tree
Hide file tree
Showing 73 changed files with 1,397 additions and 962 deletions.
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,13 @@ Dev builds can be unstable and should be used for testing purposes only.

## System Requirements

- Verified on **Windows 10**. Might work on earlier versions also.
- Verified on **Windows 10**. Atleast Windows Vista is required.
- If you are on Windows 7 or earlier, make sure Aero is enabled.
- **Desktop Duplication API** is only available on **Windows 8** and above.
- 2 GHz CPU (Recommended).
- 4 GB RAM (Recommended).
- **.Net Framework v4.6.1** is required. You will be prompted to install if it is not already present on your system.
- Using the **FFmpeg Intel QSV HEVC** encoder requires the processor to be **Skylake (6th generation)** or later.
- **Desktop Duplication API** is only available on **Windows 8** and above.
- For using `SharpAvi | Lagarith` codec, the Lagarith codec should be installed on your system and configured to use RGB mode with Null Frames disabled.

## FFmpeg
Expand Down
2 changes: 2 additions & 0 deletions src/Captura.Base/Services/IRegionProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,7 @@ public interface IRegionProvider
void Release();

event Action SelectorHidden;

IntPtr Handle { get; }
}
}
6 changes: 3 additions & 3 deletions src/Captura.Base/Video/IVideoSourceProvider.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
using System.Collections.Generic;

namespace Captura.Models
{
public interface IVideoSourceProvider : IEnumerable<IVideoItem>
public interface IVideoSourceProvider
{
string Name { get; }

IVideoItem Source { get; }
}
}
2 changes: 2 additions & 0 deletions src/Captura.Base/Video/IVideoWriterItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ public interface IVideoWriterItem
// file extension including the leading dot
string Extension { get; }

string Description { get; }

IVideoFileWriter GetVideoFileWriter(VideoWriterArgs Args);
}
}
2 changes: 2 additions & 0 deletions src/Captura.Base/Video/IVideoWriterProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,7 @@ namespace Captura.Models
public interface IVideoWriterProvider : IEnumerable<IVideoWriterItem>
{
string Name { get; }

string Description { get; }
}
}
39 changes: 16 additions & 23 deletions src/Captura.Console/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Threading;
Expand Down Expand Up @@ -162,12 +161,10 @@ static void List()
#region Windows
WriteLine("AVAILABLE WINDOWS" + underline);

var winProvider = ServiceProvider.Get<WindowSourceProvider>();

// Window Picker is skipped automatically
foreach (var source in winProvider.OfType<WindowItem>())
foreach (var source in Window.EnumerateVisible())
{
WriteLine($"{source.Window.Handle.ToString().PadRight(10)}: {source}");
WriteLine($"{source.Handle.ToString().PadRight(10)}: {source.Title}");
}

WriteLine();
Expand All @@ -176,14 +173,12 @@ static void List()
#region Screens
WriteLine("AVAILABLE SCREENS" + underline);

var scrProvider = ServiceProvider.Get<ScreenSourceProvider>();

var j = 0;

// First is Full Screen, Second is Screen Picker
foreach (var screen in scrProvider.Skip(2))
foreach (var screen in ScreenItem.Enumerate())
{
WriteLine($"{j.ToString().PadRight(2)}: {screen}");
WriteLine($"{j.ToString().PadRight(2)}: {screen.Name}");

++j;
}
Expand Down Expand Up @@ -276,10 +271,11 @@ static void HandleVideoSource(MainViewModel ViewModel, CommonCmdOptions CommonOp

if (index < ScreenItem.Count)
{
video.SelectedVideoSourceKind = ServiceProvider.Get<ScreenSourceProvider>();
var screenSourceProvider = ServiceProvider.Get<ScreenSourceProvider>();

// First item is Full Screen, Second is Screen Picker
video.SelectedVideoSource = video.AvailableVideoSources[index + 2];
screenSourceProvider.Set(index);

video.SelectedVideoSourceKind = screenSourceProvider;
}
}

Expand All @@ -290,14 +286,9 @@ static void HandleVideoSource(MainViewModel ViewModel, CommonCmdOptions CommonOp

var winProvider = ServiceProvider.Get<WindowSourceProvider>();

var matchingWin = winProvider.OfType<WindowItem>().FirstOrDefault(M => M.Window.Handle == handle);
winProvider.Set(handle);

if (matchingWin != null)
{
video.SelectedVideoSourceKind = winProvider;

video.SelectedVideoSource = matchingWin;
}
video.SelectedVideoSourceKind = winProvider;
}

// Start command only
Expand All @@ -310,9 +301,11 @@ static void HandleVideoSource(MainViewModel ViewModel, CommonCmdOptions CommonOp

if (index < ScreenItem.Count)
{
video.SelectedVideoSourceKind = ServiceProvider.Get<DeskDuplSourceProvider>();
var deskDuplSourceProvider = ServiceProvider.Get<DeskDuplSourceProvider>();

deskDuplSourceProvider.Set(new ScreenWrapper(Screen.AllScreens[index]));

video.SelectedVideoSource = video.AvailableVideoSources[index];
video.SelectedVideoSourceKind = deskDuplSourceProvider;
}
}

Expand Down Expand Up @@ -355,7 +348,7 @@ static void HandleVideoEncoder(MainViewModel ViewModel, StartCmdOptions StartOpt

video.SelectedVideoWriterKind = ServiceProvider.Get<FFmpegWriterProvider>();

if (index < video.AvailableVideoSources.Count)
if (index < video.AvailableVideoWriters.Count)
video.SelectedVideoWriter = video.AvailableVideoWriters[index];
}

Expand All @@ -366,7 +359,7 @@ static void HandleVideoEncoder(MainViewModel ViewModel, StartCmdOptions StartOpt

video.SelectedVideoWriterKind = ServiceProvider.Get<SharpAviWriterProvider>();

if (index < video.AvailableVideoSources.Count)
if (index < video.AvailableVideoWriters.Count)
video.SelectedVideoWriter = video.AvailableVideoWriters[index];
}

Expand Down
1 change: 1 addition & 0 deletions src/Captura.Core/Captura.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@
<Compile Include="Settings\Settings.cs" />
<Compile Include="Settings\Models\VisualSettings.cs" />
<Compile Include="Settings\Models\ScreenShotSettings.cs" />
<Compile Include="ViewModels\VideoSourceModel.cs" />
<Compile Include="ViewModels\CustomImageOverlaysViewModel.cs" />
<Compile Include="ViewModels\CensorOverlaysViewModel.cs" />
<Compile Include="Models\RememberByName.cs" />
Expand Down
31 changes: 11 additions & 20 deletions src/Captura.Core/CoreModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,30 +48,21 @@ public void OnLoad(IBinder Binder)
Binder.Bind<IImageWriterItem>(ServiceProvider.Get<ImgurWriter>);

// Video Writer Providers
Binder.Bind<IVideoWriterProvider, FFmpegWriterProvider>();
Binder.Bind<IVideoWriterProvider, GifWriterProvider>();
Binder.Bind<IVideoWriterProvider, StreamingWriterProvider>();
Binder.BindSingleton<FFmpegWriterProvider>();
Binder.BindSingleton<GifWriterProvider>();
Binder.BindSingleton<StreamingWriterProvider>();
Binder.BindSingleton<DiscardWriterProvider>();
Binder.BindSingleton<SharpAviWriterProvider>();

#if DEBUG
Binder.Bind<IVideoWriterProvider, DiscardWriterProvider>();
#endif

// Check if SharpAvi is available
if (ServiceProvider.FileExists("SharpAvi.dll"))
{
Binder.Bind<IVideoWriterProvider, SharpAviWriterProvider>();
}

Binder.BindSingleton<WindowPickerItem>();
Binder.BindSingleton<ScreenPickerItem>();
Binder.BindSingleton<FullScreenItem>();

// Video Source Providers
Binder.Bind<IVideoSourceProvider, ScreenSourceProvider>();
Binder.Bind<IVideoSourceProvider, RegionSourceProvider>();
Binder.Bind<IVideoSourceProvider, WindowSourceProvider>();
Binder.Bind<IVideoSourceProvider, DeskDuplSourceProvider>();
Binder.Bind<IVideoSourceProvider, NoVideoSourceProvider>();
Binder.BindSingleton<ScreenSourceProvider>();
Binder.BindSingleton<FullScreenSourceProvider>();
Binder.BindSingleton<RegionSourceProvider>();
Binder.BindSingleton<WindowSourceProvider>();
Binder.BindSingleton<DeskDuplSourceProvider>();
Binder.BindSingleton<NoVideoSourceProvider>();

// Folder Browser Dialog
Binder.Bind<IDialogService, DialogService>();
Expand Down
2 changes: 2 additions & 0 deletions src/Captura.Core/Fakes/FakeRegionProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,7 @@ public bool SelectorVisible
public void Lock() { }

public void Release() { }

public IntPtr Handle => IntPtr.Zero;
}
}
2 changes: 2 additions & 0 deletions src/Captura.Core/Models/Discard/DiscardWriterItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,7 @@ public IVideoFileWriter GetVideoFileWriter(VideoWriterArgs Args)
}

public override string ToString() => "Discard";

public string Description => "For testing purposes.";
}
}
4 changes: 4 additions & 0 deletions src/Captura.Core/Models/Discard/DiscardWriterProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,9 @@ IEnumerator IEnumerable.GetEnumerator()
}

public string Name { get; } = "Discard";

public string Description => "For testing purposes.";

public override string ToString() => Name;
}
}
28 changes: 21 additions & 7 deletions src/Captura.Core/Models/NoVideoSourceProvider.cs
Original file line number Diff line number Diff line change
@@ -1,22 +1,36 @@
using System.Collections.Generic;
using System.Linq;

namespace Captura.Models
{
// ReSharper disable once ClassNeverInstantiated.Global
public class NoVideoSourceProvider : VideoSourceProviderBase
{
public NoVideoSourceProvider(LanguageManager Loc) : base(Loc) { }

public override IEnumerator<IVideoItem> GetEnumerator()
public NoVideoSourceProvider(LanguageManager Loc) : base(Loc)
{
yield return WaveItem.Instance;
Sources = new IVideoItem[] {WaveItem.Instance}
.Concat(FFmpegAudioItem.Items)
.ToArray();
}

public IVideoItem[] Sources { get; }

IVideoItem _selectedSource = WaveItem.Instance;

foreach (var item in FFmpegAudioItem.Items)
public IVideoItem SelectedSource
{
get => _selectedSource;
set
{
yield return item;
_selectedSource = value;

OnPropertyChanged();

RaisePropertyChanged(nameof(Source));
}
}

public override IVideoItem Source => _selectedSource;

public override string Name => Loc.OnlyAudio;
}
}
Loading

0 comments on commit 7e13fed

Please sign in to comment.