New features
This commit is contained in:
parent
55eba3087f
commit
e42b68977f
11 changed files with 735 additions and 319 deletions
|
@ -33,6 +33,7 @@ namespace Ryujinx
|
|||
public string Version;
|
||||
public string TimePlayed;
|
||||
public string LastPlayed;
|
||||
public string FileExt;
|
||||
public string FileSize;
|
||||
public string Path;
|
||||
}
|
||||
|
@ -105,54 +106,45 @@ namespace Ryujinx
|
|||
{
|
||||
if ((Path.GetExtension(applicationPath) == ".nsp") || (Path.GetExtension(applicationPath) == ".pfs0") || (Path.GetExtension(applicationPath) == ".xci"))
|
||||
{
|
||||
IFileSystem controlFs = null;
|
||||
|
||||
// Store the ControlFS in variable called controlFs
|
||||
if (Path.GetExtension(applicationPath) == ".xci")
|
||||
{
|
||||
Xci xci = new Xci(KeySet, file.AsStorage());
|
||||
controlFs = GetControlFs(xci.OpenPartition(XciPartitionType.Secure));
|
||||
}
|
||||
else { controlFs = GetControlFs(new PartitionFileSystem(file.AsStorage())); }
|
||||
|
||||
// Creates NACP class from the NACP file
|
||||
IFile controlFile = controlFs.OpenFile("/control.nacp", OpenMode.Read);
|
||||
Nacp controlData = new Nacp(controlFile.AsStream());
|
||||
|
||||
// Get the title name, title ID, developer name and version number from the NACP
|
||||
version = controlData.DisplayVersion;
|
||||
|
||||
titleName = controlData.Descriptions[(int)DesiredTitleLanguage].Title;
|
||||
if (string.IsNullOrWhiteSpace(titleName))
|
||||
{
|
||||
titleName = controlData.Descriptions.ToList().Find(x => !string.IsNullOrWhiteSpace(x.Title)).Title;
|
||||
}
|
||||
|
||||
titleId = controlData.PresenceGroupId.ToString("x16");
|
||||
if (string.IsNullOrWhiteSpace(titleId)) { titleId = controlData.SaveDataOwnerId.ToString("x16"); }
|
||||
if (string.IsNullOrWhiteSpace(titleId)) { titleId = (controlData.AddOnContentBaseId - 0x1000).ToString("x16"); }
|
||||
|
||||
developer = controlData.Descriptions[(int)DesiredTitleLanguage].Developer;
|
||||
if (string.IsNullOrWhiteSpace(developer))
|
||||
{
|
||||
developer = controlData.Descriptions.ToList().Find(x => !string.IsNullOrWhiteSpace(x.Developer)).Developer;
|
||||
}
|
||||
|
||||
// Read the icon from the ControlFS and store it as a byte array
|
||||
try
|
||||
{
|
||||
IFile icon = controlFs.OpenFile($"/icon_{DesiredTitleLanguage}.dat", OpenMode.Read);
|
||||
using (MemoryStream ms = new MemoryStream())
|
||||
IFileSystem controlFs = null;
|
||||
|
||||
// Store the ControlFS in variable called controlFs
|
||||
if (Path.GetExtension(applicationPath) == ".xci")
|
||||
{
|
||||
icon.AsStream().CopyTo(ms);
|
||||
applicationIcon = ms.ToArray();
|
||||
Xci xci = new Xci(KeySet, file.AsStorage());
|
||||
controlFs = GetControlFs(xci.OpenPartition(XciPartitionType.Secure));
|
||||
}
|
||||
}
|
||||
catch (FileNotFoundException)
|
||||
{
|
||||
else { controlFs = GetControlFs(new PartitionFileSystem(file.AsStorage())); }
|
||||
|
||||
// Creates NACP class from the NACP file
|
||||
IFile controlNacp = controlFs.OpenFile("/control.nacp", OpenMode.Read);
|
||||
Nacp controlData = new Nacp(controlNacp.AsStream());
|
||||
|
||||
// Get the title name, title ID, developer name and version number from the NACP
|
||||
version = controlData.DisplayVersion;
|
||||
|
||||
titleName = controlData.Descriptions[(int)DesiredTitleLanguage].Title;
|
||||
if (string.IsNullOrWhiteSpace(titleName))
|
||||
{
|
||||
titleName = controlData.Descriptions.ToList().Find(x => !string.IsNullOrWhiteSpace(x.Title)).Title;
|
||||
}
|
||||
|
||||
titleId = controlData.PresenceGroupId.ToString("x16");
|
||||
if (string.IsNullOrWhiteSpace(titleId)) { titleId = controlData.SaveDataOwnerId.ToString("x16"); }
|
||||
if (string.IsNullOrWhiteSpace(titleId)) { titleId = (controlData.AddOnContentBaseId - 0x1000).ToString("x16"); }
|
||||
|
||||
developer = controlData.Descriptions[(int)DesiredTitleLanguage].Developer;
|
||||
if (string.IsNullOrWhiteSpace(developer))
|
||||
{
|
||||
developer = controlData.Descriptions.ToList().Find(x => !string.IsNullOrWhiteSpace(x.Developer)).Developer;
|
||||
}
|
||||
|
||||
// Read the icon from the ControlFS and store it as a byte array
|
||||
try
|
||||
{
|
||||
IFile icon = controlFs.OpenFile($"/icon_AmericanEnglish.dat", OpenMode.Read);
|
||||
IFile icon = controlFs.OpenFile($"/icon_{DesiredTitleLanguage}.dat", OpenMode.Read);
|
||||
using (MemoryStream ms = new MemoryStream())
|
||||
{
|
||||
icon.AsStream().CopyTo(ms);
|
||||
|
@ -161,10 +153,52 @@ namespace Ryujinx
|
|||
}
|
||||
catch (FileNotFoundException)
|
||||
{
|
||||
if (Path.GetExtension(applicationPath) == ".xci") { applicationIcon = RyujinxXciIcon; }
|
||||
else { applicationIcon = RyujinxNspIcon; }
|
||||
IDirectory controlDir = controlFs.OpenDirectory("./", OpenDirectoryMode.All);
|
||||
foreach (DirectoryEntry entry in controlDir.Read())
|
||||
{
|
||||
if (entry.Name == "control.nacp") { continue; }
|
||||
|
||||
IFile icon = controlFs.OpenFile(entry.FullPath, OpenMode.Read);
|
||||
using (MemoryStream ms = new MemoryStream())
|
||||
{
|
||||
icon.AsStream().CopyTo(ms);
|
||||
applicationIcon = ms.ToArray();
|
||||
}
|
||||
|
||||
if (applicationIcon != null) { break; }
|
||||
}
|
||||
|
||||
if (applicationIcon == null)
|
||||
{
|
||||
if (Path.GetExtension(applicationPath) == ".xci") { applicationIcon = RyujinxXciIcon; }
|
||||
else { applicationIcon = RyujinxNspIcon; }
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (MissingKeyException exception)
|
||||
{
|
||||
titleName = "Unknown";
|
||||
titleId = "Unknown";
|
||||
developer = "Unknown";
|
||||
version = "?";
|
||||
|
||||
if (Path.GetExtension(applicationPath) == ".xci") { applicationIcon = RyujinxXciIcon; }
|
||||
else { applicationIcon = RyujinxNspIcon; }
|
||||
|
||||
Logger.PrintError(LogClass.Application, $"Your key set is missing a key with the name: {exception.Name}");
|
||||
}
|
||||
catch (InvalidDataException)
|
||||
{
|
||||
titleName = "Unknown";
|
||||
titleId = "Unknown";
|
||||
developer = "Unknown";
|
||||
version = "?";
|
||||
|
||||
if (Path.GetExtension(applicationPath) == ".xci") { applicationIcon = RyujinxXciIcon; }
|
||||
else { applicationIcon = RyujinxNspIcon; }
|
||||
|
||||
Logger.PrintError(LogClass.Application, $"Unable to decrypt NCA header. The header key must be incorrect. File: {applicationPath}");
|
||||
}
|
||||
}
|
||||
|
||||
else if (Path.GetExtension(applicationPath) == ".nro")
|
||||
|
@ -250,6 +284,7 @@ namespace Ryujinx
|
|||
Version = version,
|
||||
TimePlayed = playedData[0],
|
||||
LastPlayed = playedData[1],
|
||||
FileExt = Path.GetExtension(applicationPath).ToUpper().Remove(0 ,1),
|
||||
FileSize = (filesize < 1) ? (filesize * 1024).ToString("0.##") + "MB" : filesize.ToString("0.##") + "GB",
|
||||
Path = applicationPath,
|
||||
};
|
||||
|
@ -289,42 +324,46 @@ namespace Ryujinx
|
|||
|
||||
private static string[] GetPlayedData(string TitleId, string UserId)
|
||||
{
|
||||
string[] playedData = new string[2];
|
||||
string appdataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
|
||||
string savePath = Path.Combine(appdataPath, "RyuFs", "nand", "user", "save", "0000000000000000", UserId, TitleId);
|
||||
try
|
||||
{
|
||||
string[] playedData = new string[2];
|
||||
string appdataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
|
||||
string savePath = Path.Combine(appdataPath, "RyuFs", "nand", "user", "save", "0000000000000000", UserId, TitleId);
|
||||
|
||||
if (File.Exists(Path.Combine(savePath, "TimePlayed.dat")) == false)
|
||||
{
|
||||
Directory.CreateDirectory(savePath);
|
||||
using (FileStream file = File.OpenWrite(Path.Combine(savePath, "TimePlayed.dat"))) { file.Write(Encoding.ASCII.GetBytes("0")); }
|
||||
}
|
||||
using (FileStream fs = File.OpenRead(Path.Combine(savePath, "TimePlayed.dat")))
|
||||
{
|
||||
using (StreamReader sr = new StreamReader(fs))
|
||||
if (File.Exists(Path.Combine(savePath, "TimePlayed.dat")) == false)
|
||||
{
|
||||
float timePlayed = float.Parse(sr.ReadLine());
|
||||
|
||||
if (timePlayed <= 60.0) { playedData[0] = $"{timePlayed}s"; }
|
||||
else if(timePlayed <= 3600.0) { playedData[0] = $"{Math.Round(timePlayed / 60 , 2, MidpointRounding.AwayFromZero)} mins"; }
|
||||
else if(timePlayed <= 86400.0) { playedData[0] = $"{Math.Round(timePlayed / 3600 , 2, MidpointRounding.AwayFromZero)} hrs"; }
|
||||
else { playedData[0] = $"{Math.Round(timePlayed / 86400, 2, MidpointRounding.AwayFromZero)} days"; }
|
||||
Directory.CreateDirectory(savePath);
|
||||
using (FileStream file = File.OpenWrite(Path.Combine(savePath, "TimePlayed.dat"))) { file.Write(Encoding.ASCII.GetBytes("0")); }
|
||||
}
|
||||
}
|
||||
|
||||
if (File.Exists(Path.Combine(savePath, "LastPlayed.dat")) == false)
|
||||
{
|
||||
Directory.CreateDirectory(savePath);
|
||||
using (FileStream file = File.OpenWrite(Path.Combine(savePath, "LastPlayed.dat"))) { file.Write(Encoding.ASCII.GetBytes("Never")); }
|
||||
}
|
||||
using (FileStream fs = File.OpenRead(Path.Combine(savePath, "LastPlayed.dat")))
|
||||
{
|
||||
using (StreamReader sr = new StreamReader(fs))
|
||||
using (FileStream fs = File.OpenRead(Path.Combine(savePath, "TimePlayed.dat")))
|
||||
{
|
||||
playedData[1] = sr.ReadLine();
|
||||
}
|
||||
}
|
||||
using (StreamReader sr = new StreamReader(fs))
|
||||
{
|
||||
float timePlayed = float.Parse(sr.ReadLine());
|
||||
|
||||
return playedData;
|
||||
if (timePlayed <= 60.0) { playedData[0] = $"{timePlayed}s"; }
|
||||
else if (timePlayed <= 3600.0) { playedData[0] = $"{Math.Round(timePlayed / 60 , 2, MidpointRounding.AwayFromZero)} mins"; }
|
||||
else if (timePlayed <= 86400.0) { playedData[0] = $"{Math.Round(timePlayed / 3600 , 2, MidpointRounding.AwayFromZero)} hrs"; }
|
||||
else { playedData[0] = $"{Math.Round(timePlayed / 86400, 2, MidpointRounding.AwayFromZero)} days"; }
|
||||
}
|
||||
}
|
||||
|
||||
if (File.Exists(Path.Combine(savePath, "LastPlayed.dat")) == false)
|
||||
{
|
||||
Directory.CreateDirectory(savePath);
|
||||
using (FileStream file = File.OpenWrite(Path.Combine(savePath, "LastPlayed.dat"))) { file.Write(Encoding.ASCII.GetBytes("Never")); }
|
||||
}
|
||||
using (FileStream fs = File.OpenRead(Path.Combine(savePath, "LastPlayed.dat")))
|
||||
{
|
||||
using (StreamReader sr = new StreamReader(fs))
|
||||
{
|
||||
playedData[1] = sr.ReadLine();
|
||||
}
|
||||
}
|
||||
|
||||
return playedData;
|
||||
}
|
||||
catch { return new string[] { "Unknown", "Unknown" }; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -591,11 +591,11 @@ namespace Ryujinx.HLE.HOS
|
|||
staticObject = new NxStaticObject(input);
|
||||
}
|
||||
|
||||
ContentManager.LoadEntries();
|
||||
|
||||
TitleName = CurrentTitle = metaData.TitleName;
|
||||
TitleID = metaData.Aci0.TitleId.ToString("x16");
|
||||
|
||||
ContentManager.LoadEntries();
|
||||
|
||||
ProgramLoader.LoadStaticObjects(this, metaData, new IExecutable[] { staticObject });
|
||||
}
|
||||
|
||||
|
|
|
@ -4,8 +4,8 @@ using System.Text;
|
|||
|
||||
namespace Ryujinx.HLE.Loaders.Npdm
|
||||
{
|
||||
// https://github.com/SciresM/hactool/blob/master/npdm.c
|
||||
// https://github.com/SciresM/hactool/blob/master/npdm.h
|
||||
// https://github.com/SciresM/hactool/blob/master/npdm.c
|
||||
// https://github.com/SciresM/hactool/blob/master/npdm.h
|
||||
// http://switchbrew.org/index.php?title=NPDM
|
||||
class Npdm
|
||||
{
|
||||
|
@ -18,7 +18,7 @@ namespace Ryujinx.HLE.Loaders.Npdm
|
|||
public int PersonalMmHeapSize { get; private set; }
|
||||
public int ProcessCategory { get; private set; }
|
||||
public int MainThreadStackSize { get; private set; }
|
||||
public string TitleName { get; set; }
|
||||
public string TitleName { get; set; }
|
||||
public byte[] ProductCode { get; private set; }
|
||||
|
||||
public Aci0 Aci0 { get; private set; }
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
"enable_legacy_jit": false,
|
||||
"ignore_missing_services": false,
|
||||
"controller_type": "Handheld",
|
||||
"gui_columns": [ true, true, true, true, true, true, true, true, true ],
|
||||
"game_dirs": [],
|
||||
"enable_custom_theme": false,
|
||||
"custom_theme_path": "",
|
||||
|
@ -55,7 +56,7 @@
|
|||
}
|
||||
},
|
||||
"joystick_controls": {
|
||||
"enabled": false,
|
||||
"enabled": true,
|
||||
"index": 0,
|
||||
"deadzone": 0.05,
|
||||
"trigger_threshold": 0.5,
|
||||
|
|
|
@ -60,17 +60,17 @@ namespace Ryujinx
|
|||
/// <summary>
|
||||
/// Enables printing guest log messages
|
||||
/// </summary>
|
||||
public bool LoggingEnableGuest { get; private set; }
|
||||
public bool LoggingEnableGuest { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Enables printing FS access log messages
|
||||
/// </summary>
|
||||
public bool LoggingEnableFsAccessLog { get; private set; }
|
||||
public bool LoggingEnableFsAccessLog { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Controls which log messages are written to the log targets
|
||||
/// </summary>
|
||||
public LogClass[] LoggingFilteredClasses { get; private set; }
|
||||
public LogClass[] LoggingFilteredClasses { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Enables or disables logging to a file on disk
|
||||
|
@ -125,7 +125,12 @@ namespace Ryujinx
|
|||
/// <summary>
|
||||
/// The primary controller's type
|
||||
/// </summary>
|
||||
public ControllerStatus ControllerType { get; private set; }
|
||||
public ControllerStatus ControllerType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Used to toggle columns in the GUI
|
||||
/// </summary>
|
||||
public List<bool> GuiColumns { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// A list of directories containing games to be used to load games into the games list
|
||||
|
|
|
@ -11,6 +11,7 @@ namespace Ryujinx.UI
|
|||
{
|
||||
#pragma warning disable 649
|
||||
[GUI] Window AboutWin;
|
||||
[GUI] Label VersionText;
|
||||
[GUI] Image RyujinxLogo;
|
||||
[GUI] Image PatreonLogo;
|
||||
[GUI] Image GitHubLogo;
|
||||
|
@ -23,12 +24,15 @@ namespace Ryujinx.UI
|
|||
private AboutWindow(Builder builder) : base(builder.GetObject("AboutWin").Handle)
|
||||
{
|
||||
builder.Autoconnect(this);
|
||||
|
||||
AboutWin.Icon = new Gdk.Pixbuf(Assembly.GetExecutingAssembly(), "Ryujinx.Ui.assets.ryujinxIcon.png");
|
||||
RyujinxLogo.Pixbuf = new Gdk.Pixbuf(Assembly.GetExecutingAssembly(), "Ryujinx.Ui.assets.ryujinxIcon.png", 220, 220);
|
||||
RyujinxLogo.Pixbuf = new Gdk.Pixbuf(Assembly.GetExecutingAssembly(), "Ryujinx.Ui.assets.ryujinxIcon.png", 100, 100);
|
||||
PatreonLogo.Pixbuf = new Gdk.Pixbuf(Assembly.GetExecutingAssembly(), "Ryujinx.Ui.assets.PatreonLogo.png", 30 , 30 );
|
||||
GitHubLogo.Pixbuf = new Gdk.Pixbuf(Assembly.GetExecutingAssembly(), "Ryujinx.Ui.assets.GitHubLogo.png" , 30 , 30 );
|
||||
DiscordLogo.Pixbuf = new Gdk.Pixbuf(Assembly.GetExecutingAssembly(), "Ryujinx.Ui.assets.DiscordLogo.png", 30 , 30 );
|
||||
TwitterLogo.Pixbuf = new Gdk.Pixbuf(Assembly.GetExecutingAssembly(), "Ryujinx.Ui.assets.TwitterLogo.png", 30 , 30 );
|
||||
|
||||
VersionText.Text = "Version x.x.x (Commit Number)";
|
||||
}
|
||||
|
||||
public void OpenUrl(string url)
|
||||
|
|
|
@ -7,47 +7,18 @@
|
|||
<property name="resizable">False</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="default_width">800</property>
|
||||
<property name="default_height">400</property>
|
||||
<property name="default_height">350</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<child>
|
||||
<child type="titlebar">
|
||||
<placeholder/>
|
||||
</child>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">2</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes"> </property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkToggleButton" id="CloseToggle">
|
||||
<property name="label" translatable="yes">Close</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<signal name="toggled" handler="CloseToggle_Activated" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
|
@ -63,98 +34,159 @@
|
|||
<object class="GtkBox" id="leftBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_left">10</property>
|
||||
<property name="margin_right">15</property>
|
||||
<property name="margin_top">10</property>
|
||||
<property name="margin_bottom">15</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">start</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkImage" id="RyujinxLogo">
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<object class="GtkImage" id="RyujinxLogo">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_left">10</property>
|
||||
<property name="margin_right">10</property>
|
||||
<property name="margin_top">10</property>
|
||||
<property name="margin_bottom">10</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Ryujinx</property>
|
||||
<property name="justify">center</property>
|
||||
<attributes>
|
||||
<attribute name="scale" value="2.7000000000000002"/>
|
||||
</attributes>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">(REE-YOU-JI-NX)</property>
|
||||
<property name="justify">center</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEventBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<signal name="button-press-event" handler="RyujinxButton_Pressed" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">www.ryujinx.org</property>
|
||||
<property name="justify">center</property>
|
||||
<attributes>
|
||||
<attribute name="underline" value="True"/>
|
||||
</attributes>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<object class="GtkLabel" id="VersionText">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Ryujinx</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">(REE-YOU-JI-NX)</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Version x.x.x
|
||||
Unlicenced</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEventBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<signal name="button-press-event" handler="RyujinxButton_Pressed" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">https://ryujinx.org</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<property name="label" translatable="yes">Version x.x.x (Commit Number)</property>
|
||||
<property name="justify">center</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">2</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Unlicenced</property>
|
||||
<property name="justify">center</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Ryujinx is not affiliated with Nintendo,
|
||||
or any of its partners, in any way</property>
|
||||
<property name="justify">center</property>
|
||||
<attributes>
|
||||
<attribute name="scale" value="0.80000000000000004"/>
|
||||
</attributes>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
@ -162,6 +194,7 @@ Unlicenced</property>
|
|||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_top">25</property>
|
||||
<child>
|
||||
<object class="GtkEventBox" id="PatreonButton">
|
||||
<property name="visible">True</property>
|
||||
|
@ -331,47 +364,51 @@ Unlicenced</property>
|
|||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Ryujinx is not affiliated with Nintendo
|
||||
or any of its partners in any way</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparator">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_top">10</property>
|
||||
<property name="margin_bottom">10</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="rightBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_left">15</property>
|
||||
<property name="margin_right">10</property>
|
||||
<property name="margin_top">40</property>
|
||||
<property name="margin_bottom">15</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="label" translatable="yes">Ryujinx is an emulator for the Nintendo Switch.
|
||||
Please support us on Patreon.
|
||||
Get all the latest news on Twitter.
|
||||
Developers interested in contributing can find out more on our discord.</property>
|
||||
<property name="label" translatable="yes">About</property>
|
||||
<attributes>
|
||||
<attribute name="weight" value="bold"/>
|
||||
</attributes>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
|
@ -381,77 +418,148 @@ Developers interested in contributing can find out more on our discord.</propert
|
|||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="label" translatable="yes">Created By:</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">[Devs go here]</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<property name="halign">start</property>
|
||||
<property name="margin_left">10</property>
|
||||
<property name="label" translatable="yes">Ryujinx is an emulator for the Nintendo Switch.
|
||||
Please support us on Patreon.
|
||||
Get all the latest news on our Twitter or Discord.
|
||||
Developers interested in contributing can find out more on our Discord.</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEventBox" id="ContributersButton">
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<signal name="button-press-event" handler="ContributersButton_Pressed" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">end</property>
|
||||
<property name="margin_right">5</property>
|
||||
<property name="label" translatable="yes">All Contributers</property>
|
||||
</object>
|
||||
</child>
|
||||
<property name="halign">start</property>
|
||||
<property name="label" translatable="yes">Created By:</property>
|
||||
<attributes>
|
||||
<attribute name="weight" value="bold"/>
|
||||
</attributes>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_left">10</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<child>
|
||||
<object class="GtkViewport">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="baseline_position">top</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="label" translatable="yes">gdkchan
|
||||
LDj3SNuD
|
||||
Ac_K
|
||||
Thog</property>
|
||||
<property name="yalign">0</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="label" translatable="yes">»jD«
|
||||
emmaus
|
||||
Thealexbarney
|
||||
Andy A (BaronKiko)</property>
|
||||
<property name="yalign">0</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEventBox" id="ContributersButton">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="valign">start</property>
|
||||
<signal name="button-press-event" handler="ContributersButton_Pressed" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">end</property>
|
||||
<property name="margin_right">5</property>
|
||||
<property name="label" translatable="yes">All Contributors...</property>
|
||||
<attributes>
|
||||
<attribute name="underline" value="True"/>
|
||||
</attributes>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">10</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
|
|
@ -96,17 +96,18 @@ namespace Ryujinx.UI
|
|||
|
||||
//Temporary code section start, remove this section and uncomment above line when game is rendered to the glarea in the gui
|
||||
Box.Remove(GlScreen);
|
||||
Nfc.Sensitive = false;
|
||||
Nfc.Sensitive = false;
|
||||
ReturnMain.Sensitive = false;
|
||||
GameTable.AppendColumn("Icon", new CellRendererPixbuf(), "pixbuf", 0);
|
||||
GameTable.AppendColumn("Application", new CellRendererText(), "text", 1);
|
||||
GameTable.AppendColumn("Developer", new CellRendererText(), "text", 2);
|
||||
GameTable.AppendColumn("Version", new CellRendererText(), "text", 3);
|
||||
GameTable.AppendColumn("Time Played", new CellRendererText(), "text", 4);
|
||||
GameTable.AppendColumn("Last Played", new CellRendererText(), "text", 5);
|
||||
GameTable.AppendColumn("File Size", new CellRendererText(), "text", 6);
|
||||
GameTable.AppendColumn("Path", new CellRendererText(), "text", 7);
|
||||
_TableStore = new ListStore(typeof(Gdk.Pixbuf), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string));
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[0]) { GameTable.AppendColumn("Icon" , new CellRendererPixbuf(), "pixbuf", 0); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[1]) { GameTable.AppendColumn("Application", new CellRendererText() , "text" , 1); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[2]) { GameTable.AppendColumn("Developer" , new CellRendererText() , "text" , 2); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[3]) { GameTable.AppendColumn("Version" , new CellRendererText() , "text" , 3); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[4]) { GameTable.AppendColumn("Time Played", new CellRendererText() , "text" , 4); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[5]) { GameTable.AppendColumn("Last Played", new CellRendererText() , "text" , 5); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[6]) { GameTable.AppendColumn("File Ext" , new CellRendererText() , "text" , 6); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[7]) { GameTable.AppendColumn("File Size" , new CellRendererText() , "text" , 7); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[8]) { GameTable.AppendColumn("Path" , new CellRendererText() , "text" , 8); }
|
||||
_TableStore = new ListStore(typeof(Gdk.Pixbuf), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string));
|
||||
GameTable.Model = _TableStore;
|
||||
UpdateGameTable();
|
||||
//Temporary code section end
|
||||
|
@ -120,16 +121,17 @@ namespace Ryujinx.UI
|
|||
Nfc.Sensitive = false;
|
||||
ReturnMain.Sensitive = false;
|
||||
|
||||
GameTable.AppendColumn("Icon" , new CellRendererPixbuf(), "pixbuf", 0);
|
||||
GameTable.AppendColumn("Application", new CellRendererText() , "text" , 1);
|
||||
GameTable.AppendColumn("Developer" , new CellRendererText() , "text" , 2);
|
||||
GameTable.AppendColumn("Version" , new CellRendererText() , "text" , 3);
|
||||
GameTable.AppendColumn("Time Played", new CellRendererText() , "text" , 4);
|
||||
GameTable.AppendColumn("Last Played", new CellRendererText() , "text" , 5);
|
||||
GameTable.AppendColumn("File Size" , new CellRendererText() , "text" , 6);
|
||||
GameTable.AppendColumn("Path" , new CellRendererText() , "text" , 7);
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[0]) { GameTable.AppendColumn("Icon" , new CellRendererPixbuf(), "pixbuf", 0); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[1]) { GameTable.AppendColumn("Application", new CellRendererText() , "text" , 1); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[2]) { GameTable.AppendColumn("Developer" , new CellRendererText() , "text" , 2); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[3]) { GameTable.AppendColumn("Version" , new CellRendererText() , "text" , 3); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[4]) { GameTable.AppendColumn("Time Played", new CellRendererText() , "text" , 4); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[5]) { GameTable.AppendColumn("Last Played", new CellRendererText() , "text" , 5); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[6]) { GameTable.AppendColumn("File Ext" , new CellRendererText() , "text" , 6); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[7]) { GameTable.AppendColumn("File Size" , new CellRendererText() , "text" , 7); }
|
||||
if (SwitchSettings.SwitchConfig.GuiColumns[8]) { GameTable.AppendColumn("Path" , new CellRendererText() , "text" , 8); }
|
||||
|
||||
_TableStore = new ListStore(typeof(Gdk.Pixbuf), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string));
|
||||
_TableStore = new ListStore(typeof(Gdk.Pixbuf), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string));
|
||||
GameTable.Model = _TableStore;
|
||||
|
||||
UpdateGameTable();
|
||||
|
@ -143,7 +145,7 @@ namespace Ryujinx.UI
|
|||
|
||||
foreach (ApplicationLibrary.ApplicationData AppData in ApplicationLibrary.ApplicationLibraryData)
|
||||
{
|
||||
_TableStore.AppendValues(new Gdk.Pixbuf(AppData.Icon, 75, 75), $"{AppData.TitleName}\n{AppData.TitleId.ToUpper()}", AppData.Developer, AppData.Version, AppData.TimePlayed, AppData.LastPlayed, AppData.FileSize, AppData.Path);
|
||||
_TableStore.AppendValues(new Gdk.Pixbuf(AppData.Icon, 75, 75), $"{AppData.TitleName}\n{AppData.TitleId.ToUpper()}", AppData.Developer, AppData.Version, AppData.TimePlayed, AppData.LastPlayed, AppData.FileExt, AppData.FileSize, AppData.Path);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -180,7 +182,7 @@ namespace Ryujinx.UI
|
|||
{
|
||||
if (_GameLoaded)
|
||||
{
|
||||
MessageDialog eRrOr = new MessageDialog(null, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, "A game has already been loaded, please unload the game and try again");
|
||||
MessageDialog eRrOr = new MessageDialog(null, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, "A game has already been loaded. Please close the emulator and try again");
|
||||
eRrOr.SetSizeRequest(100, 20);
|
||||
eRrOr.Title = "Ryujinx - Error";
|
||||
eRrOr.Icon = new Gdk.Pixbuf(Assembly.GetExecutingAssembly(), "Ryujinx.Ui.assets.ryujinxIcon.png");
|
||||
|
@ -352,7 +354,7 @@ namespace Ryujinx.UI
|
|||
private void Row_Activated(object o, RowActivatedArgs args)
|
||||
{
|
||||
_TableStore.GetIter(out TreeIter treeiter, new TreePath(args.Path.ToString()));
|
||||
string path = (string)_TableStore.GetValue(treeiter, 7);
|
||||
string path = (string)_TableStore.GetValue(treeiter, 8);
|
||||
|
||||
LoadApplication(path);
|
||||
|
||||
|
|
|
@ -23,6 +23,15 @@ namespace Ryujinx.UI
|
|||
|
||||
#pragma warning disable 649
|
||||
[GUI] Window SettingsWin;
|
||||
[GUI] CheckButton IconToggle;
|
||||
[GUI] CheckButton TitleToggle;
|
||||
[GUI] CheckButton DeveloperToggle;
|
||||
[GUI] CheckButton VersionToggle;
|
||||
[GUI] CheckButton TimePlayedToggle;
|
||||
[GUI] CheckButton LastPlayedToggle;
|
||||
[GUI] CheckButton FileExtToggle;
|
||||
[GUI] CheckButton FileSizeToggle;
|
||||
[GUI] CheckButton PathToggle;
|
||||
[GUI] CheckButton ErrorLogToggle;
|
||||
[GUI] CheckButton WarningLogToggle;
|
||||
[GUI] CheckButton InfoLogToggle;
|
||||
|
@ -120,6 +129,16 @@ namespace Ryujinx.UI
|
|||
ZR1.Clicked += (o, args) => Button_Pressed(o, args, ZR1);
|
||||
|
||||
//Setup Currents
|
||||
if (SwitchConfig.GuiColumns[0]) { IconToggle.Click(); }
|
||||
if (SwitchConfig.GuiColumns[1]) { TitleToggle.Click(); }
|
||||
if (SwitchConfig.GuiColumns[2]) { DeveloperToggle.Click(); }
|
||||
if (SwitchConfig.GuiColumns[3]) { VersionToggle.Click(); }
|
||||
if (SwitchConfig.GuiColumns[4]) { TimePlayedToggle.Click(); }
|
||||
if (SwitchConfig.GuiColumns[5]) { LastPlayedToggle.Click(); }
|
||||
if (SwitchConfig.GuiColumns[6]) { FileExtToggle.Click(); }
|
||||
if (SwitchConfig.GuiColumns[7]) { FileSizeToggle.Click(); }
|
||||
if (SwitchConfig.GuiColumns[8]) { PathToggle.Click(); }
|
||||
if (SwitchConfig.EnableFileLog) { FileLogToggle.Click(); }
|
||||
if (SwitchConfig.LoggingEnableError) { ErrorLogToggle.Click(); }
|
||||
if (SwitchConfig.LoggingEnableWarn) { WarningLogToggle.Click(); }
|
||||
if (SwitchConfig.LoggingEnableInfo) { InfoLogToggle.Click(); }
|
||||
|
@ -127,7 +146,7 @@ namespace Ryujinx.UI
|
|||
if (SwitchConfig.LoggingEnableDebug) { DebugLogToggle.Click(); }
|
||||
if (SwitchConfig.EnableFileLog) { FileLogToggle.Click(); }
|
||||
if (SwitchConfig.DockedMode) { DockedModeToggle.Click(); }
|
||||
if (SwitchConfig.EnableDiscordIntergration) { DiscordToggle.Click(); }
|
||||
if (SwitchConfig.EnableDiscordIntegration) { DiscordToggle.Click(); }
|
||||
if (SwitchConfig.EnableVsync) { VSyncToggle.Click(); }
|
||||
if (SwitchConfig.EnableMulticoreScheduling) { MultiSchedToggle.Click(); }
|
||||
if (SwitchConfig.EnableFsIntegrityChecks) { FSICToggle.Click(); }
|
||||
|
@ -272,19 +291,25 @@ namespace Ryujinx.UI
|
|||
_GameDirsBoxStore.IterNext(ref iter);
|
||||
}
|
||||
|
||||
if (IconToggle.Active) { SwitchConfig.GuiColumns[0] = true; }
|
||||
if (TitleToggle.Active) { SwitchConfig.GuiColumns[1] = true; }
|
||||
if (DeveloperToggle.Active) { SwitchConfig.GuiColumns[2] = true; }
|
||||
if (VersionToggle.Active) { SwitchConfig.GuiColumns[3] = true; }
|
||||
if (TimePlayedToggle.Active) { SwitchConfig.GuiColumns[4] = true; }
|
||||
if (LastPlayedToggle.Active) { SwitchConfig.GuiColumns[5] = true; }
|
||||
if (FileExtToggle.Active) { SwitchConfig.GuiColumns[6] = true; }
|
||||
if (FileSizeToggle.Active) { SwitchConfig.GuiColumns[7] = true; }
|
||||
if (PathToggle.Active) { SwitchConfig.GuiColumns[8] = true; }
|
||||
if (ErrorLogToggle.Active) { SwitchConfig.LoggingEnableError = true; }
|
||||
if (WarningLogToggle.Active) { SwitchConfig.LoggingEnableWarn = true; }
|
||||
if (InfoLogToggle.Active) { SwitchConfig.LoggingEnableInfo = true; }
|
||||
if (StubLogToggle.Active) { SwitchConfig.LoggingEnableStub = true; }
|
||||
if (DebugLogToggle.Active) { SwitchConfig.LoggingEnableDebug = true; }
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
if (GuestLogToggle.Active) { SwitchConfig.LoggingEnableGuest = true; }
|
||||
if (FsAccessLogToggle.Active) { SwitchConfig.LoggingEnableFsAccessLog = true; }
|
||||
>>>>>>> added spin button for new option and tooltips to settings
|
||||
if (FileLogToggle.Active) { SwitchConfig.EnableFileLog = true; }
|
||||
if (DockedModeToggle.Active) { SwitchConfig.DockedMode = true; }
|
||||
if (DiscordToggle.Active) { SwitchConfig.EnableDiscordIntergration = true; }
|
||||
if (DiscordToggle.Active) { SwitchConfig.EnableDiscordIntegration = true; }
|
||||
if (VSyncToggle.Active) { SwitchConfig.EnableVsync = true; }
|
||||
if (MultiSchedToggle.Active) { SwitchConfig.EnableMulticoreScheduling = true; }
|
||||
if (FSICToggle.Active) { SwitchConfig.EnableFsIntegrityChecks = true; }
|
||||
|
@ -293,6 +318,15 @@ namespace Ryujinx.UI
|
|||
if (DirectKeyboardAccess.Active) { SwitchConfig.EnableKeyboard = true; }
|
||||
if (CustThemeToggle.Active) { SwitchConfig.EnableCustomTheme = true; }
|
||||
|
||||
if (IconToggle.Active == false) { SwitchConfig.GuiColumns[0] = false; }
|
||||
if (TitleToggle.Active == false) { SwitchConfig.GuiColumns[1] = false; }
|
||||
if (DeveloperToggle.Active == false) { SwitchConfig.GuiColumns[2] = false; }
|
||||
if (VersionToggle.Active == false) { SwitchConfig.GuiColumns[3] = false; }
|
||||
if (TimePlayedToggle.Active == false) { SwitchConfig.GuiColumns[4] = false; }
|
||||
if (LastPlayedToggle.Active == false) { SwitchConfig.GuiColumns[5] = false; }
|
||||
if (FileExtToggle.Active == false) { SwitchConfig.GuiColumns[6] = false; }
|
||||
if (FileSizeToggle.Active == false) { SwitchConfig.GuiColumns[7] = false; }
|
||||
if (PathToggle.Active == false) { SwitchConfig.GuiColumns[8] = false; }
|
||||
if (ErrorLogToggle.Active == false) { SwitchConfig.LoggingEnableError = false; }
|
||||
if (WarningLogToggle.Active == false) { SwitchConfig.LoggingEnableWarn = false; }
|
||||
if (InfoLogToggle.Active == false) { SwitchConfig.LoggingEnableInfo = false; }
|
||||
|
@ -300,7 +334,7 @@ namespace Ryujinx.UI
|
|||
if (DebugLogToggle.Active == false) { SwitchConfig.LoggingEnableDebug = false; }
|
||||
if (FileLogToggle.Active == false) { SwitchConfig.EnableFileLog = false; }
|
||||
if (DockedModeToggle.Active == false) { SwitchConfig.DockedMode = false; }
|
||||
if (DiscordToggle.Active == false) { SwitchConfig.EnableDiscordIntergration = false; }
|
||||
if (DiscordToggle.Active == false) { SwitchConfig.EnableDiscordIntegration = false; }
|
||||
if (VSyncToggle.Active == false) { SwitchConfig.EnableVsync = false; }
|
||||
if (MultiSchedToggle.Active == false) { SwitchConfig.EnableMulticoreScheduling = false; }
|
||||
if (FSICToggle.Active == false) { SwitchConfig.EnableFsIntegrityChecks = false; }
|
||||
|
@ -342,7 +376,7 @@ namespace Ryujinx.UI
|
|||
};
|
||||
|
||||
SwitchConfig.SystemLanguage = (SystemLanguage)Enum.Parse(typeof(SystemLanguage), SystemLanguageSelect.ActiveId);
|
||||
SwitchConfig.ControllerType = (HidControllerType)Enum.Parse(typeof(HidControllerType), Controller1Type.ActiveId);
|
||||
SwitchConfig.ControllerType = (ControllerStatus)Enum.Parse(typeof(ControllerStatus), Controller1Type.ActiveId);
|
||||
SwitchConfig.CustomThemePath = CustThemeDir.Buffer.Text;
|
||||
SwitchConfig.GameDirs = gameDirs;
|
||||
SwitchConfig.FsGlobalAccessLogMode = (int)FGALMSpinAdjustment.Value;
|
||||
|
|
|
@ -103,24 +103,64 @@
|
|||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="box1">
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_left">10</property>
|
||||
<property name="margin_right">5</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<object class="GtkBox" id="box1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_left">5</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Change System Language</property>
|
||||
<property name="halign">end</property>
|
||||
<property name="label" translatable="yes">System Language:</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Change System Language</property>
|
||||
<property name="halign">end</property>
|
||||
<property name="label" translatable="yes">System Language:</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkComboBoxText" id="SystemLanguageSelect">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Change System Language</property>
|
||||
<property name="margin_left">10</property>
|
||||
<items>
|
||||
<item id="AmericanEnglish" translatable="yes">American English</item>
|
||||
<item id="BritishEnglish" translatable="yes">British English</item>
|
||||
<item id="CanadianFrench" translatable="yes">Canadian French</item>
|
||||
<item id="Chinese" translatable="yes">Chinese</item>
|
||||
<item id="Dutch" translatable="yes">Dutch</item>
|
||||
<item id="French" translatable="yes">French</item>
|
||||
<item id="German" translatable="yes">German</item>
|
||||
<item id="Italian" translatable="yes">Italian</item>
|
||||
<item id="Japanese" translatable="yes">Japanese</item>
|
||||
<item id="Korean" translatable="yes">Korean</item>
|
||||
<item id="LatinAmericanSpanish" translatable="yes">Latin American Spanish</item>
|
||||
<item id="Portuguese" translatable="yes">Portuguese</item>
|
||||
<item id="Russian" translatable="yes">Russian</item>
|
||||
<item id="SimplifiedChinese" translatable="yes">Simplified Chinese</item>
|
||||
<item id="Spanish" translatable="yes">Spanish</item>
|
||||
<item id="Taiwanese" translatable="yes">Taiwanese</item>
|
||||
<item id="TraditionalChinese" translatable="yes">Traditional Chinese</item>
|
||||
</items>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
|
@ -129,65 +169,241 @@
|
|||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkComboBoxText" id="SystemLanguageSelect">
|
||||
<object class="GtkCheckButton" id="DiscordToggle">
|
||||
<property name="label" translatable="yes">Enable Discord Integration</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Change System Language</property>
|
||||
<property name="margin_left">5</property>
|
||||
<items>
|
||||
<item id="AmericanEnglish" translatable="yes">American English</item>
|
||||
<item id="BritishEnglish" translatable="yes">British English</item>
|
||||
<item id="CanadianFrench" translatable="yes">Canadian French</item>
|
||||
<item id="Chinese" translatable="yes">Chinese</item>
|
||||
<item id="Dutch" translatable="yes">Dutch</item>
|
||||
<item id="French" translatable="yes">French</item>
|
||||
<item id="German" translatable="yes">German</item>
|
||||
<item id="Italian" translatable="yes">Italian</item>
|
||||
<item id="Japanese" translatable="yes">Japanese</item>
|
||||
<item id="Korean" translatable="yes">Korean</item>
|
||||
<item id="LatinAmericanSpanish" translatable="yes">Latin American Spanish</item>
|
||||
<item id="Portuguese" translatable="yes">Portuguese</item>
|
||||
<item id="Russian" translatable="yes">Russian</item>
|
||||
<item id="SimplifiedChinese" translatable="yes">Simplified Chinese</item>
|
||||
<item id="Spanish" translatable="yes">Spanish</item>
|
||||
<item id="Taiwanese" translatable="yes">Taiwanese</item>
|
||||
<item id="TraditionalChinese" translatable="yes">Traditional Chinese</item>
|
||||
</items>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Enables or disables Discord Rich Presense</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="DiscordToggle">
|
||||
<property name="label" translatable="yes">Enable Discord Integration</property>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Enables or disables Discord Rich Presense</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="margin_left">5</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="IconToggle">
|
||||
<property name="label" translatable="yes">Enable Icon Column</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Enable or Disable aggressive CPU optimizations</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="margin_top">5</property>
|
||||
<property name="margin_bottom">5</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="DeveloperToggle">
|
||||
<property name="label" translatable="yes">Enable Developer Column</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Enable or Disable aggressive CPU optimizations</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="margin_top">5</property>
|
||||
<property name="margin_bottom">5</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="TimePlayedToggle">
|
||||
<property name="label" translatable="yes">Enable Time Played Column</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Enable or Disable aggressive CPU optimizations</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="margin_top">5</property>
|
||||
<property name="margin_bottom">5</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="TitleToggle">
|
||||
<property name="label" translatable="yes">Enable Title Name/ID Column</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Enable or Disable aggressive CPU optimizations</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="margin_top">5</property>
|
||||
<property name="margin_bottom">5</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="VersionToggle">
|
||||
<property name="label" translatable="yes">Enable Version Column</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Enable or Disable aggressive CPU optimizations</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="margin_top">5</property>
|
||||
<property name="margin_bottom">5</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="LastPlayedToggle">
|
||||
<property name="label" translatable="yes">Enable Last Played Column</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Enable or Disable aggressive CPU optimizations</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="margin_top">5</property>
|
||||
<property name="margin_bottom">5</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="FileExtToggle">
|
||||
<property name="label" translatable="yes">Enable File Ext Column</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Enable or Disable aggressive CPU optimizations</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="margin_top">5</property>
|
||||
<property name="margin_bottom">5</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="FileSizeToggle">
|
||||
<property name="label" translatable="yes">Enable File Size Column</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Enable or Disable aggressive CPU optimizations</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="margin_top">5</property>
|
||||
<property name="margin_bottom">5</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="PathToggle">
|
||||
<property name="label" translatable="yes">Enable Path Column</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Enable or Disable aggressive CPU optimizations</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="margin_top">5</property>
|
||||
<property name="margin_bottom">5</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
|
|
|
@ -501,6 +501,13 @@
|
|||
"description": "A list of directories containing games to be used to load games into the games list",
|
||||
"default": []
|
||||
},
|
||||
"gui_columns": {
|
||||
"$id": "#/properties/gui_columns",
|
||||
"type": "bool list",
|
||||
"title": "Used to toggle columns in the GUI",
|
||||
"description": "Used to toggle columns in the GUI",
|
||||
"default": [ true, true, true, true, true, true, true, true, true ]
|
||||
},
|
||||
"enable_custom_theme": {
|
||||
"$id": "#/properties/enable_custom_theme",
|
||||
"type": "boolean",
|
||||
|
|
Loading…
Add table
Reference in a new issue