Move status information from the title bar to the new status bar (#948)
* Move status information from the title bar to the new status bar * jd's requested changes * Ack's requested changes * gdk's requested changes * Remove frame time statistics
This commit is contained in:
parent
ab3b6ea6d4
commit
e2bb5e8091
4 changed files with 145 additions and 36 deletions
|
@ -24,6 +24,8 @@ namespace Ryujinx.Ui
|
||||||
|
|
||||||
public ManualResetEvent WaitEvent { get; set; }
|
public ManualResetEvent WaitEvent { get; set; }
|
||||||
|
|
||||||
|
public static event EventHandler<StatusUpdatedEventArgs> StatusUpdatedEvent;
|
||||||
|
|
||||||
public bool IsActive { get; set; }
|
public bool IsActive { get; set; }
|
||||||
public bool IsStopped { get; set; }
|
public bool IsStopped { get; set; }
|
||||||
public bool IsFocused { get; set; }
|
public bool IsFocused { get; set; }
|
||||||
|
@ -32,12 +34,8 @@ namespace Ryujinx.Ui
|
||||||
private double _mouseY;
|
private double _mouseY;
|
||||||
private bool _mousePressed;
|
private bool _mousePressed;
|
||||||
|
|
||||||
private bool _titleEvent;
|
|
||||||
|
|
||||||
private bool _toggleFullscreen;
|
private bool _toggleFullscreen;
|
||||||
|
|
||||||
private string _newTitle;
|
|
||||||
|
|
||||||
private readonly long _ticksPerFrame;
|
private readonly long _ticksPerFrame;
|
||||||
|
|
||||||
private long _ticks = 0;
|
private long _ticks = 0;
|
||||||
|
@ -179,6 +177,14 @@ namespace Ryujinx.Ui
|
||||||
Gtk.Application.Invoke(delegate
|
Gtk.Application.Invoke(delegate
|
||||||
{
|
{
|
||||||
parent.Present();
|
parent.Present();
|
||||||
|
|
||||||
|
string titleNameSection = string.IsNullOrWhiteSpace(_device.System.TitleName) ? string.Empty
|
||||||
|
: " | " + _device.System.TitleName;
|
||||||
|
|
||||||
|
string titleIdSection = string.IsNullOrWhiteSpace(_device.System.TitleIdText) ? string.Empty
|
||||||
|
: " | " + _device.System.TitleIdText.ToUpper();
|
||||||
|
|
||||||
|
parent.Title = $"Ryujinx {Program.Version}{titleNameSection}{titleIdSection}";
|
||||||
});
|
});
|
||||||
|
|
||||||
Thread renderLoopThread = new Thread(Render)
|
Thread renderLoopThread = new Thread(Render)
|
||||||
|
@ -319,19 +325,10 @@ namespace Ryujinx.Ui
|
||||||
|
|
||||||
_device.Statistics.RecordSystemFrameTime();
|
_device.Statistics.RecordSystemFrameTime();
|
||||||
|
|
||||||
double hostFps = _device.Statistics.GetSystemFrameRate();
|
StatusUpdatedEvent?.Invoke(this, new StatusUpdatedEventArgs(
|
||||||
double gameFps = _device.Statistics.GetGameFrameRate();
|
_device.EnableDeviceVsync,
|
||||||
|
$"Host: {_device.Statistics.GetSystemFrameRate():00.00} FPS",
|
||||||
string titleNameSection = string.IsNullOrWhiteSpace(_device.System.TitleName) ? string.Empty
|
$"Game: {_device.Statistics.GetGameFrameRate():00.00} FPS"));
|
||||||
: " | " + _device.System.TitleName;
|
|
||||||
|
|
||||||
string titleIdSection = string.IsNullOrWhiteSpace(_device.System.TitleIdText) ? string.Empty
|
|
||||||
: " | " + _device.System.TitleIdText.ToUpper();
|
|
||||||
|
|
||||||
_newTitle = $"Ryujinx {Program.Version}{titleNameSection}{titleIdSection} | Host FPS: {hostFps:0.0} | Game FPS: {gameFps:0.0} | " +
|
|
||||||
$"Game Vsync: {(_device.EnableDeviceVsync ? "On" : "Off")}";
|
|
||||||
|
|
||||||
_titleEvent = true;
|
|
||||||
|
|
||||||
_device.System.SignalVsync();
|
_device.System.SignalVsync();
|
||||||
|
|
||||||
|
@ -351,16 +348,6 @@ namespace Ryujinx.Ui
|
||||||
{
|
{
|
||||||
while (IsActive)
|
while (IsActive)
|
||||||
{
|
{
|
||||||
if (_titleEvent)
|
|
||||||
{
|
|
||||||
_titleEvent = false;
|
|
||||||
|
|
||||||
Gtk.Application.Invoke(delegate
|
|
||||||
{
|
|
||||||
this.ParentWindow.Title = _newTitle;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateFrame();
|
UpdateFrame();
|
||||||
|
|
||||||
// Polling becomes expensive if it's not slept
|
// Polling becomes expensive if it's not slept
|
||||||
|
|
|
@ -51,10 +51,12 @@ namespace Ryujinx.Ui
|
||||||
[GUI] MenuBar _menuBar;
|
[GUI] MenuBar _menuBar;
|
||||||
[GUI] Box _footerBox;
|
[GUI] Box _footerBox;
|
||||||
[GUI] MenuItem _fullScreen;
|
[GUI] MenuItem _fullScreen;
|
||||||
|
[GUI] Box _statusBar;
|
||||||
[GUI] MenuItem _stopEmulation;
|
[GUI] MenuItem _stopEmulation;
|
||||||
[GUI] CheckMenuItem _favToggle;
|
[GUI] CheckMenuItem _favToggle;
|
||||||
[GUI] MenuItem _firmwareInstallFile;
|
[GUI] MenuItem _firmwareInstallFile;
|
||||||
[GUI] MenuItem _firmwareInstallDirectory;
|
[GUI] MenuItem _firmwareInstallDirectory;
|
||||||
|
[GUI] Label _hostStatus;
|
||||||
[GUI] MenuItem _openDebugger;
|
[GUI] MenuItem _openDebugger;
|
||||||
[GUI] CheckMenuItem _iconToggle;
|
[GUI] CheckMenuItem _iconToggle;
|
||||||
[GUI] CheckMenuItem _appToggle;
|
[GUI] CheckMenuItem _appToggle;
|
||||||
|
@ -65,6 +67,7 @@ namespace Ryujinx.Ui
|
||||||
[GUI] CheckMenuItem _fileExtToggle;
|
[GUI] CheckMenuItem _fileExtToggle;
|
||||||
[GUI] CheckMenuItem _fileSizeToggle;
|
[GUI] CheckMenuItem _fileSizeToggle;
|
||||||
[GUI] CheckMenuItem _pathToggle;
|
[GUI] CheckMenuItem _pathToggle;
|
||||||
|
[GUI] Label _gameStatus;
|
||||||
[GUI] TreeView _gameTable;
|
[GUI] TreeView _gameTable;
|
||||||
[GUI] ScrolledWindow _gameTableWindow;
|
[GUI] ScrolledWindow _gameTableWindow;
|
||||||
[GUI] TreeSelection _gameTableSelection;
|
[GUI] TreeSelection _gameTableSelection;
|
||||||
|
@ -72,6 +75,7 @@ namespace Ryujinx.Ui
|
||||||
[GUI] Label _firmwareVersionLabel;
|
[GUI] Label _firmwareVersionLabel;
|
||||||
[GUI] LevelBar _progressBar;
|
[GUI] LevelBar _progressBar;
|
||||||
[GUI] Box _viewBox;
|
[GUI] Box _viewBox;
|
||||||
|
[GUI] Label _vSyncStatus;
|
||||||
[GUI] Box _listStatusBox;
|
[GUI] Box _listStatusBox;
|
||||||
|
|
||||||
#pragma warning restore CS0649
|
#pragma warning restore CS0649
|
||||||
|
@ -83,10 +87,12 @@ namespace Ryujinx.Ui
|
||||||
{
|
{
|
||||||
builder.Autoconnect(this);
|
builder.Autoconnect(this);
|
||||||
|
|
||||||
DeleteEvent += Window_Close;
|
this.DeleteEvent += Window_Close;
|
||||||
|
_fullScreen.Activated += FullScreen_Toggled;
|
||||||
|
|
||||||
ApplicationLibrary.ApplicationAdded += Application_Added;
|
ApplicationLibrary.ApplicationAdded += Application_Added;
|
||||||
ApplicationLibrary.ApplicationCountUpdated += ApplicationCount_Updated;
|
ApplicationLibrary.ApplicationCountUpdated += ApplicationCount_Updated;
|
||||||
|
GLRenderer.StatusUpdatedEvent += Update_StatusBar;
|
||||||
|
|
||||||
_gameTable.ButtonReleaseEvent += Row_Clicked;
|
_gameTable.ButtonReleaseEvent += Row_Clicked;
|
||||||
|
|
||||||
|
@ -161,7 +167,7 @@ namespace Ryujinx.Ui
|
||||||
|
|
||||||
Task.Run(RefreshFirmwareLabel);
|
Task.Run(RefreshFirmwareLabel);
|
||||||
|
|
||||||
_fullScreen.Activated += FullScreen_Toggled;
|
_statusBar.Hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_DEBUGGING
|
#if USE_DEBUGGING
|
||||||
|
@ -401,7 +407,7 @@ namespace Ryujinx.Ui
|
||||||
_viewBox.Child = _gLWidget;
|
_viewBox.Child = _gLWidget;
|
||||||
|
|
||||||
_gLWidget.ShowAll();
|
_gLWidget.ShowAll();
|
||||||
ClearFooterForGameRender();
|
EditFooterForGameRender();
|
||||||
});
|
});
|
||||||
|
|
||||||
_gLWidget.WaitEvent.WaitOne();
|
_gLWidget.WaitEvent.WaitOne();
|
||||||
|
@ -451,12 +457,14 @@ namespace Ryujinx.Ui
|
||||||
|
|
||||||
private void RecreateFooterForMenu()
|
private void RecreateFooterForMenu()
|
||||||
{
|
{
|
||||||
_footerBox.Add(_listStatusBox);
|
_listStatusBox.Show();
|
||||||
|
_statusBar.Hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ClearFooterForGameRender()
|
private void EditFooterForGameRender()
|
||||||
{
|
{
|
||||||
_footerBox.Remove(_listStatusBox);
|
_listStatusBox.Hide();
|
||||||
|
_statusBar.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ToggleExtraWidgets(bool show)
|
public void ToggleExtraWidgets(bool show)
|
||||||
|
@ -466,7 +474,8 @@ namespace Ryujinx.Ui
|
||||||
if (show)
|
if (show)
|
||||||
{
|
{
|
||||||
_menuBar.ShowAll();
|
_menuBar.ShowAll();
|
||||||
_footerBox.ShowAll();
|
_footerBox.Show();
|
||||||
|
_statusBar.Show();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -590,6 +599,26 @@ namespace Ryujinx.Ui
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Update_StatusBar(object sender, StatusUpdatedEventArgs args)
|
||||||
|
{
|
||||||
|
Application.Invoke(delegate
|
||||||
|
{
|
||||||
|
_hostStatus.Text = args.HostStatus;
|
||||||
|
_gameStatus.Text = args.GameStatus;
|
||||||
|
|
||||||
|
if (args.VSyncEnabled)
|
||||||
|
{
|
||||||
|
_vSyncStatus.Attributes = new Pango.AttrList();
|
||||||
|
_vSyncStatus.Attributes.Insert(new Pango.AttrForeground(11822, 60138, 51657));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_vSyncStatus.Attributes = new Pango.AttrList();
|
||||||
|
_vSyncStatus.Attributes.Insert(new Pango.AttrForeground(ushort.MaxValue, 17733, 21588));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private void FavToggle_Toggled(object sender, ToggledArgs args)
|
private void FavToggle_Toggled(object sender, ToggledArgs args)
|
||||||
{
|
{
|
||||||
_tableStore.GetIter(out TreeIter treeIter, new TreePath(args.Path));
|
_tableStore.GetIter(out TreeIter treeIter, new TreePath(args.Path));
|
||||||
|
|
|
@ -399,10 +399,10 @@
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="_footerBox">
|
<object class="GtkBox" id="_footerBox">
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="width_request">1280</property>
|
<property name="width_request">1280</property>
|
||||||
<property name="height_request">19</property>
|
<property name="height_request">19</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="_listStatusBox">
|
<object class="GtkBox" id="_listStatusBox">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
@ -460,6 +460,81 @@
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox" id="_statusBar">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="_vSyncStatus">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="margin_left">10</property>
|
||||||
|
<property name="margin_right">5</property>
|
||||||
|
<property name="label" translatable="yes">VSync</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSeparator">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="_hostStatus">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="margin_left">5</property>
|
||||||
|
<property name="margin_right">5</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSeparator">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">3</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="_gameStatus">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="margin_left">5</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">4</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
|
|
18
Ryujinx/Ui/StatusUpdatedEventArgs.cs
Normal file
18
Ryujinx/Ui/StatusUpdatedEventArgs.cs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Ryujinx.Ui
|
||||||
|
{
|
||||||
|
public class StatusUpdatedEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
public bool VSyncEnabled;
|
||||||
|
public string HostStatus;
|
||||||
|
public string GameStatus;
|
||||||
|
|
||||||
|
public StatusUpdatedEventArgs(bool vSyncEnabled, string hostStatus, string gameStatus)
|
||||||
|
{
|
||||||
|
VSyncEnabled = vSyncEnabled;
|
||||||
|
HostStatus = hostStatus;
|
||||||
|
GameStatus = gameStatus;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue