Skip to content

Commit

Permalink
Merge pull request #47 from lizaalert/dev
Browse files Browse the repository at this point in the history
Dev 0.3.0 release
  • Loading branch information
gosha20777 authored Sep 26, 2019
2 parents 9d0b142 + eda8512 commit 599d2b1
Show file tree
Hide file tree
Showing 8 changed files with 339 additions and 9 deletions.
2 changes: 1 addition & 1 deletion DataUtils/LaddGenerator/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ static void Main(string[] args)
if (dstAnnotation.Objects == null || dstAnnotation.Objects.Count <= 0)
{
dstAnnotation.Objects = new List<Object>();
//throw new Exception("no objects in the image!");
throw new Exception("no objects in the image!");
}
foreach (var obj in dstAnnotation.Objects)
{
Expand Down
2 changes: 1 addition & 1 deletion RescuerLaApp/Models/Docker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ public async Task Remove(string imageName = "gosha20777/test", string tag = "1")
}
}

var images = await _client.Images.ListImagesAsync(new ImagesListParameters(){MatchName = imageName});
var images = await _client.Images.ListImagesAsync(new ImagesListParameters(){MatchName = $"{imageName}:{tag}"});
foreach (var image in images)
{
await _client.Images.DeleteImageAsync(image.ID, new ImageDeleteParameters {Force = true});
Expand Down
118 changes: 118 additions & 0 deletions RescuerLaApp/Models/TextTableBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace RescuerLaApp.Models
{
public interface ITextRow
{
String Output();
void Output(StringBuilder sb);
Object Tag { get; set; }
}

public class TextTableBuilder : IEnumerable<ITextRow>
{
protected class TextRow : List<String>, ITextRow
{
protected TextTableBuilder owner = null;
public TextRow(TextTableBuilder Owner)
{
owner = Owner;
if (owner == null) throw new ArgumentException("Owner");
}
public String Output()
{
StringBuilder sb = new StringBuilder();
Output(sb);
return sb.ToString();
}
public void Output(StringBuilder sb)
{
sb.AppendFormat(owner.FormatString, this.ToArray());
}
public Object Tag { get; set; }
}

public String Separator { get; set; }

protected List<ITextRow> rows = new List<ITextRow>();
protected List<int> colLength = new List<int>();

public TextTableBuilder()
{
Separator = " ";
}

public TextTableBuilder(String separator)
: this()
{
Separator = separator;
}

public ITextRow AddRow(params object[] cols)
{
TextRow row = new TextRow(this);
foreach (object o in cols)
{
String str = o.ToString().Trim();
row.Add(str);
if (colLength.Count >= row.Count)
{
int curLength = colLength[row.Count - 1];
if (str.Length > curLength) colLength[row.Count - 1] = str.Length;
}
else
{
colLength.Add(str.Length);
}
}
rows.Add(row);
return row;
}

protected String _fmtString = null;
public String FormatString
{
get
{
if (_fmtString == null)
{
String format = "";
int i = 0;
foreach (int len in colLength)
{
format += String.Format("{{{0},-{1}}}{2}", i++, len, Separator);
}
format += "\r\n";
_fmtString = format;
}
return _fmtString;
}
}

public String Output()
{
StringBuilder sb = new StringBuilder();
foreach (TextRow row in rows)
{
row.Output(sb);
}
return sb.ToString();
}

#region IEnumerable Members

public IEnumerator<ITextRow> GetEnumerator()
{
return rows.GetEnumerator();
}

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return rows.GetEnumerator();
}

#endregion
}
}
2 changes: 1 addition & 1 deletion RescuerLaApp/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ internal static class Program
{
private static void Main(string[] args)
{
Console.WriteLine("Lacmus desktop application. Version 0.2.9 alpha. \nCopyright (c) 2019 Georgy Perevozghikov <[email protected]>\nGithub page: https://github.com/lizaalert/lacmus/.\nProvided by Yandex Cloud: https://cloud.yandex.com/.");
Console.WriteLine("Lacmus desktop application. Version 0.3.0 alpha. \nCopyright (c) 2019 Georgy Perevozghikov <[email protected]>\nGithub page: https://github.com/lizaalert/lacmus/.\nProvided by Yandex Cloud: https://cloud.yandex.com/.");
Console.WriteLine("This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.");
Console.WriteLine("This is free software, and you are welcome to redistribute it\nunder certain conditions; type `show c' for details.");
Console.WriteLine("------------------------------------");
Expand Down
2 changes: 2 additions & 0 deletions RescuerLaApp/RescuerLaApp.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
<PackageReference Include="Avalonia.ReactiveUI" Version="0.8.2" />
<PackageReference Include="Avalonia.Skia.Linux.Natives" Version="1.68.0.2" />
<PackageReference Include="Docker.DotNet" Version="3.125.2" />
<PackageReference Include="MessageBox.Avalonia" Version="0.8.3" />
<PackageReference Include="MetadataExtractor" Version="2.1.0" />
<PackageReference Include="NewtonSoft.Json" Version="12.0.2" />
<PackageReference Include="ReactiveUI.Fody" Version="9.16.3" />
</ItemGroup>
Expand Down
202 changes: 202 additions & 0 deletions RescuerLaApp/ViewModels/MainWindowViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,21 @@
using System.Linq;
using System.Reactive;
using System.Reactive.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Media.Imaging;
using Docker.DotNet;
using MessageBox.Avalonia.DTO;
using MessageBox.Avalonia.Enums;
using MessageBox.Avalonia.Models;
using MetadataExtractor;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using Newtonsoft.Json;
using Directory = System.IO.Directory;

namespace RescuerLaApp.ViewModels
{
Expand Down Expand Up @@ -61,6 +70,12 @@ public MainWindowViewModel()
UpdateModelCommand = ReactiveCommand.Create(UpdateModel, canExecute);
ShowPerestriansCommand = ReactiveCommand.Create(ShowPedestrians, canExecute);
ImportAllCommand = ReactiveCommand.Create(ImportAll, canExecute);
SaveAllImagesWithObjectsCommand = ReactiveCommand.Create(SaveAllImagesWithObjects, canExecute);
ShowAllMetadataCommand = ReactiveCommand.Create(ShowAllMetadata, canExecute);
ShowGeoDataCommand = ReactiveCommand.Create(ShowGeoData, canExecute);
HelpCommand = ReactiveCommand.Create(Help);
AboutCommand = ReactiveCommand.Create(About);
ExitCommand = ReactiveCommand.Create(Exit, canExecute);
}

public void UpdateFramesRepo()
Expand Down Expand Up @@ -118,6 +133,16 @@ public void UpdateFramesRepo()
public ReactiveCommand<Unit, Unit> UpdateModelCommand { get; }

public ReactiveCommand<Unit, Unit> ShowPerestriansCommand { get; }

public ReactiveCommand<Unit, Unit> SaveAllImagesWithObjectsCommand { get; }

public ReactiveCommand<Unit, Unit> ShowAllMetadataCommand { get; }
public ReactiveCommand<Unit, Unit> ShowGeoDataCommand { get; }
public ReactiveCommand<Unit, Unit> HelpCommand { get; }
public ReactiveCommand<Unit, Unit> AboutCommand { get; }
public ReactiveCommand<Unit, Unit> ExitCommand { get; }



#endregion

Expand Down Expand Up @@ -368,6 +393,49 @@ private async void SaveAll()
};
}
}

private async void SaveAllImagesWithObjects()
{
try
{
if (Frames == null || Frames.Count < 1)
{
Status = new AppStatusInfo() {Status = Enums.Status.Ready};
return;
}
Status = new AppStatusInfo() {Status = Enums.Status.Working};

var openDig = new OpenFolderDialog()
{
Title = "Choose a directory to save images with objects"
};
var dirName = await openDig.ShowAsync(new Window());


if (string.IsNullOrEmpty(dirName) || !Directory.Exists(dirName))
{
Status = new AppStatusInfo() {Status = Enums.Status.Ready};
return;
}

foreach (var frame in Frames)
{
if (frame.Rectangles == null || frame.Rectangles.Count <= 0)
continue;
File.Copy(frame.Patch, Path.Combine(dirName, Path.GetFileName(frame.Patch)));
}
Console.WriteLine($"Saved to {dirName}");
Status = new AppStatusInfo() {Status = Enums.Status.Ready, StringStatus = $"Success | saved to {dirName}"};
}
catch (Exception ex)
{
Status = new AppStatusInfo()
{
Status = Enums.Status.Error,
StringStatus = $"Error | {ex.Message.Replace('\n', ' ')}"
};
}
}

private async void ImportAll()
{
Expand Down Expand Up @@ -478,6 +546,140 @@ private void FrameLoadingProgressUpdate()
}
}

public void Help()
{
OpenUrl("https://github.com/lizaalert/lacmus/wiki");
}

public void ShowGeoData()
{
string msg = string.Empty;
int rows = 0;
var directories = ImageMetadataReader.ReadMetadata(Frames[SelectedIndex].Patch);
foreach (var directory in directories)
foreach (var tag in directory.Tags)
{
if (directory.Name.ToLower() == "gps")
{
if (tag.Name.ToLower() == "gps latitude" ||
tag.Name.ToLower() == "gps longitude" ||
tag.Name.ToLower() == "gps altitude")
{
rows++;
msg += $"{tag.Name}: {tag.Description}\n";
}
}
}

if (rows != 3)
msg = "This image have hot geo tags.\nUse `Show all metadata` more for more details.";
var msgbox = new MessageBox.Avalonia.MessageBoxWindow(new MessageBoxParams
{
Button = ButtonEnum.Ok,
ContentTitle = $"Geo position of {Path.GetFileName(Frames[SelectedIndex].Patch)}",
ContentMessage = msg,
Icon = Icon.Info,
Style = Style.None,
ShowInCenter = true
});
msgbox.Show();
}

public void ShowAllMetadata()
{
var tb = new TextTableBuilder();
tb.AddRow("Group", "Tag name", "Description");
tb.AddRow("-----", "--------", "-----------");


var directories = ImageMetadataReader.ReadMetadata(Frames[SelectedIndex].Patch);
foreach (var directory in directories)
foreach (var tag in directory.Tags)
tb.AddRow(directory.Name, tag.Name, tag.Description);

var msgbox = new MessageBox.Avalonia.MessageBoxWindow(new MessageBoxParams
{
Button = ButtonEnum.Ok,
ContentTitle = $"Metadata of {Path.GetFileName(Frames[SelectedIndex].Patch)}",
ContentMessage = tb.Output(),
Icon = Icon.Info,
Style = Style.None,
ShowInCenter = true
});
msgbox.Show();
}

public async void About()
{
var message =
"Copyright (c) 2019 Georgy Perevozghikov <[email protected]>\nGithub page: https://github.com/lizaalert/lacmus/. Press `Github` button for more details.\nProvided by Yandex Cloud: https://cloud.yandex.com/." +
"\nThis program comes with ABSOLUTELY NO WARRANTY." +
"\nThis is free software, and you are welcome to redistribute it under GNU GPLv3 conditions.\nPress `License` button to learn more about the license";

var msgBoxCustomParams = new MessageBoxCustomParams
{
ButtonDefinitions = new []
{
new ButtonDefinition{Name = "Ok", Type = ButtonType.Colored},
new ButtonDefinition{Name = "License"},
new ButtonDefinition{Name = "Github"}
},
ContentTitle = "About",
ContentHeader = "Lacmus desktop application. Version 0.3.0 alpha.",
ContentMessage = message,
Icon = Icon.Avalonia,
Style = Style.None,
ShowInCenter = true
};
var msgbox = MessageBox.Avalonia.MessageBoxWindow.CreateCustomWindow(msgBoxCustomParams);
var result = await msgbox.Show();
switch (result.ToLower())
{
case "ok": return;
case "license": OpenUrl("https://github.com/lizaalert/lacmus/blob/master/LICENSE"); break;
case "github": OpenUrl("https://github.com/lizaalert/lacmus"); break;
}
}

public async void Exit()
{
var message = "Do you really want to exit?";

var msgbox = new MessageBox.Avalonia.MessageBoxWindow(new MessageBoxParams
{
Button = ButtonEnum.YesNo,
ContentTitle = "Exit",
ContentMessage = message,
Icon = Icon.Info,
Style = Style.None,
ShowInCenter = true
});
var result = await msgbox.Show();
if(result.ToLower() == "yes")
Application.Current.MainWindow.Close();
}

private void OpenUrl(string url)
{
try
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
System.Diagnostics.Process.Start(url);
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ||
RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
System.Diagnostics.Process.Start("x-www-browser", url);
}
}
catch (Exception e)
{
Console.WriteLine(e);
}

}

private void UpdateUi()
{
/*TODO: Вынести сюда все функции обновления UI*/
Expand Down
Loading

0 comments on commit 599d2b1

Please sign in to comment.