add autocompletion for system names
This commit is contained in:
parent
fca1e607ec
commit
14c14f7626
59
EDDB/API.cs
Normal file
59
EDDB/API.cs
Normal file
@ -0,0 +1,59 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
|
||||
namespace NonaBGS.EDDB {
|
||||
public class API {
|
||||
private static readonly string EDDB_SYSTEMS_ARCHIVE = "https://eddb.io/archive/v6/systems_populated.json";
|
||||
private string cache_folder = null;
|
||||
private readonly WebClient client = new WebClient();
|
||||
|
||||
private string systems_file = null;
|
||||
|
||||
public string SystemsFile => systems_file;
|
||||
|
||||
public string Cache {
|
||||
get => cache_folder;
|
||||
set => cache_folder = value;
|
||||
}
|
||||
|
||||
public API(string cache_folder) {
|
||||
Initialise(cache_folder);
|
||||
}
|
||||
|
||||
private void Initialise(string cache_folder) {
|
||||
this.cache_folder = cache_folder;
|
||||
systems_file = Path.Combine(this.cache_folder, "systems_populated.json");
|
||||
client.DownloadDataCompleted += Client_DownloadDataCompleted;
|
||||
}
|
||||
|
||||
private void DownloadFile(string url, string file) {
|
||||
client.DownloadFileAsync(new Uri(url), file);
|
||||
}
|
||||
|
||||
public void Download(bool force) {
|
||||
if (!HaveSystemsFile || force) {
|
||||
DownloadFile(EDDB_SYSTEMS_ARCHIVE, systems_file);
|
||||
}
|
||||
}
|
||||
|
||||
public void Download() {
|
||||
Download(false);
|
||||
}
|
||||
|
||||
public bool HaveSystemsFile {
|
||||
get { return systems_file != null && File.Exists(systems_file); }
|
||||
}
|
||||
|
||||
public PopulatedSystems MakePopulatedSystems() {
|
||||
if (!HaveSystemsFile) {
|
||||
throw new InvalidOperationException("no local systems file downloaded");
|
||||
}
|
||||
|
||||
return PopulatedSystems.FromFile(SystemsFile);
|
||||
}
|
||||
|
||||
private void Client_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e) {
|
||||
}
|
||||
}
|
||||
}
|
59
EDDB/PopulatedSystems.cs
Normal file
59
EDDB/PopulatedSystems.cs
Normal file
@ -0,0 +1,59 @@
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace NonaBGS.EDDB {
|
||||
public class PopulatedSystems {
|
||||
private string json_file = null;
|
||||
private JArray root = null;
|
||||
private string[] system_names = null;
|
||||
|
||||
public static PopulatedSystems FromFile(string file) {
|
||||
PopulatedSystems pop = new PopulatedSystems();
|
||||
string content = File.ReadAllText(file);
|
||||
|
||||
pop.json_file = file;
|
||||
pop.root = JArray.Parse(content);
|
||||
|
||||
return pop;
|
||||
}
|
||||
|
||||
private void MakeSystemNames() {
|
||||
if (root == null) {
|
||||
throw new InvalidDataException("no JSON loaded");
|
||||
}
|
||||
|
||||
if (system_names != null && system_names.Length > 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
var names = root.Children<JObject>().Select(x => x.Value<string>("name"));
|
||||
system_names = names.ToArray();
|
||||
}
|
||||
|
||||
public string[] SystemNames {
|
||||
get {
|
||||
MakeSystemNames();
|
||||
return system_names;
|
||||
}
|
||||
}
|
||||
|
||||
public string[] SystemNamesByFilter(string filter) {
|
||||
MakeSystemNames();
|
||||
var culture = CultureInfo.InvariantCulture;
|
||||
return system_names.Where(x => culture.CompareInfo.IndexOf(x, filter, CompareOptions.IgnoreCase) > -1)
|
||||
.ToArray()
|
||||
;
|
||||
}
|
||||
|
||||
public string JSONFile {
|
||||
get => json_file;
|
||||
}
|
||||
|
||||
public JArray Root {
|
||||
get => root;
|
||||
}
|
||||
}
|
||||
}
|
@ -3,6 +3,7 @@
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:abc="http://wpfcontrols.com/"
|
||||
xmlns:local="clr-namespace:NonaBGS"
|
||||
xmlns:BGS="clr-namespace:NonaBGS.BGS" xmlns:Util="clr-namespace:NonaBGS.Util" d:DataContext="{d:DesignInstance Type=Util:AppConfig}" x:Name="window" x:Class="NonaBGS.MainWindow"
|
||||
mc:Ignorable="d"
|
||||
@ -29,11 +30,11 @@
|
||||
</Grid.ColumnDefinitions>
|
||||
<ToolBar VerticalAlignment="Top" Grid.Row="0" Width="Auto" Grid.ColumnSpan="3" Height="Auto" Margin="0,0,0,0" HorizontalAlignment="Left">
|
||||
<Label Content="System:" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
||||
<TextBox x:Name="system" HorizontalAlignment="Center" TextWrapping="Wrap" VerticalAlignment="Center" Margin="0,0,0,3.286" MinWidth="120" VerticalContentAlignment="Center" KeyDown="Filter_KeyDown"/>
|
||||
<abc:AutoCompleteTextBox x:Name="system" VerticalAlignment="Center" MinWidth="120" MinHeight="22" KeyDown="Filter_KeyDown"/>
|
||||
<Label Content="Station:" Height="26.2857142857143" VerticalAlignment="Top"/>
|
||||
<TextBox x:Name="station" Margin="0" TextWrapping="Wrap" VerticalAlignment="Center" MinWidth="120" KeyDown="Filter_KeyDown"/>
|
||||
<abc:AutoCompleteTextBox x:Name="station" Margin="0" VerticalAlignment="Center" MinWidth="120" MinHeight="22" KeyDown="Filter_KeyDown"/>
|
||||
<Label Content="Faction:" Height="26.2857142857143" VerticalAlignment="Top"/>
|
||||
<TextBox x:Name="faction" Margin="0" TextWrapping="Wrap" VerticalAlignment="Center" MinWidth="120" KeyDown="Filter_KeyDown"/>
|
||||
<abc:AutoCompleteTextBox x:Name="faction" Margin="0" VerticalAlignment="Center" MinWidth="120" MinHeight="22" KeyDown="Filter_KeyDown"/>
|
||||
<Separator Height="26.2857142857143" Margin="0" VerticalAlignment="Top"/>
|
||||
<Button x:Name="AddFilter" Content="Add Objective" VerticalAlignment="Stretch" Click="AddFilter_Click" Margin="0,0,0,0.286" RenderTransformOrigin="0.5,0.505"/>
|
||||
</ToolBar>
|
||||
|
@ -1,23 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
using Ookii.Dialogs.Wpf;
|
||||
|
||||
using NonaBGS.Journal;
|
||||
using NonaBGS.BGS;
|
||||
using NonaBGS.Util;
|
||||
using NonaBGS.EDDB;
|
||||
using NonaBGS.UI;
|
||||
|
||||
namespace NonaBGS {
|
||||
/// <summary>
|
||||
@ -27,7 +19,9 @@ namespace NonaBGS {
|
||||
private PlayerJournal journal = null;
|
||||
private Report report = new Report();
|
||||
private Config config = new Config();
|
||||
private EDDB eddb = null;
|
||||
private API api = null;
|
||||
private PopulatedSystems systems_db = null;
|
||||
private SystemSuggestionProvider systems_provider = null;
|
||||
|
||||
public Config Config => config;
|
||||
|
||||
@ -44,7 +38,7 @@ namespace NonaBGS {
|
||||
|
||||
report.OnLog += Report_OnLog;
|
||||
|
||||
eddb = new EDDB(config.ConfigPath);
|
||||
api = new API(config.ConfigPath);
|
||||
journal = new PlayerJournal(config.Global.JournalLocation);
|
||||
|
||||
// Set both to now
|
||||
@ -56,10 +50,18 @@ namespace NonaBGS {
|
||||
try {
|
||||
config.LoadObjectives(Report);
|
||||
RefreshObjectives();
|
||||
} catch (Exception e) {
|
||||
Log(e.Message);
|
||||
}
|
||||
|
||||
try {
|
||||
SyncDatabases();
|
||||
} catch (Exception) {
|
||||
/* ignored */
|
||||
|
||||
systems_db = api.MakePopulatedSystems();
|
||||
systems_provider = new SystemSuggestionProvider(systems_db);
|
||||
system.Provider = systems_provider;
|
||||
} catch (Exception e) {
|
||||
Log(e.Message);
|
||||
}
|
||||
}
|
||||
|
||||
@ -74,12 +76,16 @@ namespace NonaBGS {
|
||||
log.AppendText(builder.ToString());
|
||||
}
|
||||
|
||||
private void Log(string message) {
|
||||
Report_OnLog(message);
|
||||
}
|
||||
|
||||
private void SyncDatabases() {
|
||||
if (!config.Global.UseEDDB) {
|
||||
return;
|
||||
}
|
||||
|
||||
eddb.Download();
|
||||
|
||||
api.Download();
|
||||
}
|
||||
|
||||
private void RefreshObjectives() {
|
||||
|
23
UI/SystemSuggestionProvider.cs
Normal file
23
UI/SystemSuggestionProvider.cs
Normal file
@ -0,0 +1,23 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using AutoCompleteTextBox.Editors;
|
||||
using NonaBGS.EDDB;
|
||||
|
||||
namespace NonaBGS.UI {
|
||||
public class SystemSuggestionProvider : ISuggestionProvider {
|
||||
private PopulatedSystems systems = null;
|
||||
|
||||
public SystemSuggestionProvider(PopulatedSystems systems) {
|
||||
this.systems = systems;
|
||||
}
|
||||
|
||||
public PopulatedSystems Data {
|
||||
get => systems;
|
||||
set => systems = value;
|
||||
}
|
||||
|
||||
public IEnumerable GetSuggestions(string filter) {
|
||||
return systems.SystemNamesByFilter(filter);
|
||||
}
|
||||
}
|
||||
}
|
48
Util/EDDB.cs
48
Util/EDDB.cs
@ -1,48 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using System.Net;
|
||||
|
||||
namespace NonaBGS.Util {
|
||||
public class EDDB {
|
||||
private static readonly string EDDB_SYSTEMS_ARCHIVE = "https://eddb.io/archive/v6/systems_populated.json";
|
||||
private string cache_folder = null;
|
||||
private WebClient client = new WebClient();
|
||||
|
||||
private string systems_file = null;
|
||||
|
||||
public string SystemsFile => systems_file;
|
||||
|
||||
public string Cache {
|
||||
get => cache_folder;
|
||||
set => cache_folder = value;
|
||||
}
|
||||
|
||||
public EDDB(string cache_folder) {
|
||||
this.cache_folder = cache_folder;
|
||||
Initialise();
|
||||
}
|
||||
|
||||
public void Initialise() {
|
||||
client.DownloadDataCompleted += Client_DownloadDataCompleted;
|
||||
}
|
||||
|
||||
private void DownloadFile(string url) {
|
||||
Uri uri = new Uri(url);
|
||||
string name = Path.GetFileName(uri.AbsolutePath);
|
||||
systems_file = Path.Combine(this.cache_folder, name);
|
||||
|
||||
client.DownloadFileAsync(new Uri(EDDB_SYSTEMS_ARCHIVE), systems_file);
|
||||
}
|
||||
|
||||
public void Download() {
|
||||
DownloadFile(EDDB_SYSTEMS_ARCHIVE);
|
||||
}
|
||||
|
||||
private void Client_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e) {
|
||||
}
|
||||
}
|
||||
}
|
@ -38,6 +38,9 @@
|
||||
<StartupObject>NonaBGSApplication</StartupObject>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="AutoCompleteTextBox, Version=1.1.1.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>packages\AutoCompleteTextBox.1.1.1\lib\net472\AutoCompleteTextBox.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
@ -70,14 +73,16 @@
|
||||
<Compile Include="BGS\DiscordLogGenerator.cs" />
|
||||
<Compile Include="BGS\NonaDiscordLog.cs" />
|
||||
<Compile Include="BGS\SellMicroResources.cs" />
|
||||
<Compile Include="EDDB\PopulatedSystems.cs" />
|
||||
<Compile Include="Journal\EliteDangerous.cs" />
|
||||
<Compile Include="Journal\MarketSellEntry.cs" />
|
||||
<Compile Include="Journal\MultiSellExplorationDataEntry.cs" />
|
||||
<Compile Include="Journal\RedeemVoucherEntry.cs" />
|
||||
<Compile Include="Journal\SellMicroResourcesEntry.cs" />
|
||||
<Compile Include="UI\SystemSuggestionProvider.cs" />
|
||||
<Compile Include="Util\AppConfig.cs" />
|
||||
<Compile Include="Util\Config.cs" />
|
||||
<Compile Include="Util\EDDB.cs" />
|
||||
<Compile Include="EDDB\API.cs" />
|
||||
<Page Include="MainWindow.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
@ -133,8 +138,6 @@
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="UI\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="AutoCompleteTextBox" version="1.1.1" targetFramework="net472" />
|
||||
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net472" />
|
||||
<package id="Ookii.Dialogs.Wpf" version="3.1.0" targetFramework="net472" />
|
||||
</packages>
|
Reference in New Issue
Block a user