diff --git a/App.config b/App.config
index a7aaca76..ddb4269b 100644
--- a/App.config
+++ b/App.config
@@ -76,6 +76,9 @@
Visible
+
+ PNG
+
diff --git a/ConvertImages.xaml b/ConvertImages.xaml
new file mode 100644
index 00000000..af669997
--- /dev/null
+++ b/ConvertImages.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ConvertImages.xaml.cs b/ConvertImages.xaml.cs
new file mode 100644
index 00000000..19dc2c50
--- /dev/null
+++ b/ConvertImages.xaml.cs
@@ -0,0 +1,41 @@
+using System.Diagnostics;
+using System.Linq;
+using System.Windows;
+using System.Windows.Controls;
+using GameRes;
+using GARbro.GUI.Properties;
+
+namespace GARbro.GUI
+{
+ ///
+ /// Interaction logic for ConvertImages.xaml
+ ///
+ public partial class ConvertImages : Window
+ {
+ public ConvertImages ()
+ {
+ InitializeComponent ();
+ InitImageFormats (this.ImageConversionFormat);
+ }
+
+ void InitImageFormats (ComboBox image_format)
+ {
+ /*
+ var formats = FormatCatalog.Instance.ImageFormats;
+ var models = formats.Select (f => new ImageFormatModel (f)).ToList();
+ var selected_format = Settings.Default.appLastImageFormat;
+ var selected = models.FirstOrDefault (f => f.Tag.Equals (selected_format));
+ image_format.ItemsSource = models;
+ if (null != selected)
+ image_format.SelectedItem = selected;
+ else if (models.Any())
+ image_format.SelectedIndex = 0;
+ */
+ }
+
+ private void ConvertButton_Click (object sender, RoutedEventArgs e)
+ {
+ this.DialogResult = true;
+ }
+ }
+}
diff --git a/GARbro.GUI.csproj b/GARbro.GUI.csproj
index 61017c08..18915791 100644
--- a/GARbro.GUI.csproj
+++ b/GARbro.GUI.csproj
@@ -120,6 +120,9 @@
ArcParameters.xaml
+
+ ConvertImages.xaml
+
CreateArchive.xaml
@@ -131,6 +134,7 @@
ExtractFile.xaml
+
@@ -154,6 +158,10 @@
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
Designer
MSBuild:Compile
diff --git a/GarConvert.cs b/GarConvert.cs
new file mode 100644
index 00000000..c8cc1ac3
--- /dev/null
+++ b/GarConvert.cs
@@ -0,0 +1,158 @@
+//! \file GarConvert.cs
+//! \date Fri Aug 22 08:22:47 2014
+//! \brief Game resources conversion methods.
+//
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Windows;
+using System.Windows.Input;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using GameRes;
+using GARbro.GUI.Strings;
+using GARbro.GUI.Properties;
+using Ookii.Dialogs.Wpf;
+
+namespace GARbro.GUI
+{
+ public partial class MainWindow : Window
+ {
+ ///
+ /// Convert selected images to another format.
+ ///
+ void ConvertImageExec (object sender, ExecutedRoutedEventArgs e)
+ {
+ if (ViewModel.IsArchive)
+ return;
+ var source = CurrentDirectory.SelectedItems.Cast()
+ .Where (f => f.Type == "image").Select (f => f.Name);
+ var convert_dialog = new ConvertImages();
+ convert_dialog.Owner = this;
+ var result = convert_dialog.ShowDialog() ?? false;
+ if (!result)
+ return;
+ var selected = convert_dialog.ImageConversionFormat.SelectedValue as string;
+ var format = FormatCatalog.Instance.ImageFormats.FirstOrDefault (f => f.Tag == selected);
+ if (null == format)
+ {
+ Trace.WriteLine ("Format is not selected", "ConvertImageExec");
+ return;
+ }
+ try
+ {
+ Directory.SetCurrentDirectory (ViewModel.Path);
+ var converter = new GarConvertImages (this);
+ converter.Convert (source, format);
+ }
+ catch (Exception X)
+ {
+ PopupError (X.Message, guiStrings.TextImageConvertError);
+ }
+ }
+ }
+
+ internal class GarConvertImages
+ {
+ private MainWindow m_main;
+ private ProgressDialog m_progress_dialog;
+ private IEnumerable m_source;
+ private ImageFormat m_image_format;
+ private Exception m_pending_error;
+
+ public bool IgnoreErrors { get; set; }
+
+ public GarConvertImages (MainWindow parent)
+ {
+ m_main = parent;
+ }
+
+ public void Convert (IEnumerable images, ImageFormat format)
+ {
+ m_main.StopWatchDirectoryChanges();
+ m_source = images;
+ m_image_format = format;
+ m_progress_dialog = new ProgressDialog ()
+ {
+ WindowTitle = guiStrings.TextTitle,
+ Text = "Converting image",
+ Description = "",
+ MinimizeBox = true,
+ };
+ m_progress_dialog.DoWork += ConvertWorker;
+ m_progress_dialog.RunWorkerCompleted += OnConvertComplete;
+ m_progress_dialog.ShowDialog (m_main);
+ }
+
+ void ConvertWorker (object sender, DoWorkEventArgs e)
+ {
+ m_pending_error = null;
+ try
+ {
+ string target_ext = m_image_format.Extensions.First();
+ int total = m_source.Count();
+ int i = 0;
+ foreach (var filename in m_source)
+ {
+ if (m_progress_dialog.CancellationPending)
+ throw new OperationCanceledException();
+ int progress = i++*100/total;
+ string target_name = Path.ChangeExtension (filename, target_ext);
+ if (filename == target_name)
+ continue;
+ string source_ext = Path.GetExtension (filename).TrimStart ('.').ToLowerInvariant();
+ if (m_image_format.Extensions.Any (ext => ext == source_ext))
+ continue;
+ try
+ {
+ using (var file = File.OpenRead (filename))
+ {
+ m_progress_dialog.ReportProgress (progress, string.Format (guiStrings.MsgConvertingImage,
+ filename), target_name);
+ var image = ImageFormat.Read (file);
+ if (null == image)
+ continue;
+ try
+ {
+ using (var output = File.Create (target_name))
+ m_image_format.Write (output, image);
+ }
+ catch // delete destination file on conversion failure
+ {
+ File.Delete (target_name);
+ throw;
+ }
+ }
+ }
+ catch (Exception X)
+ {
+ if (!IgnoreErrors)
+ throw;
+ m_pending_error = X;
+ }
+ }
+ }
+ catch (Exception X)
+ {
+ m_pending_error = X;
+ }
+ }
+
+ void OnConvertComplete (object sender, RunWorkerCompletedEventArgs e)
+ {
+ m_main.ResumeWatchDirectoryChanges();
+ m_progress_dialog.Dispose();
+ if (null != m_pending_error)
+ {
+ if (m_pending_error is OperationCanceledException)
+ m_main.SetStatusText (m_pending_error.Message);
+ else
+ m_main.PopupError (m_pending_error.Message, guiStrings.TextImageConvertError);
+ }
+ m_main.Activate();
+ m_main.RefreshView();
+ }
+ }
+}
diff --git a/MainWindow.xaml b/MainWindow.xaml
index 3feefd0d..fa16fde2 100644
--- a/MainWindow.xaml
+++ b/MainWindow.xaml
@@ -90,6 +90,9 @@
-->
+
@@ -356,6 +359,7 @@
+
diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs
index 3a04a097..7a2db48e 100644
--- a/MainWindow.xaml.cs
+++ b/MainWindow.xaml.cs
@@ -289,12 +289,12 @@ namespace GARbro.GUI
m_watcher.EnableRaisingEvents = true;
}
- void StopWatchDirectoryChanges()
+ public void StopWatchDirectoryChanges()
{
m_watcher.EnableRaisingEvents = false;
}
- void ResumeWatchDirectoryChanges ()
+ public void ResumeWatchDirectoryChanges ()
{
m_watcher.EnableRaisingEvents = true;
}
@@ -794,7 +794,7 @@ namespace GARbro.GUI
RefreshView();
}
- private void RefreshView ()
+ public void RefreshView ()
{
m_app.ResetCache();
var pos = GetCurrentPosition();
@@ -962,6 +962,12 @@ namespace GARbro.GUI
e.CanExecute = CurrentDirectory.SelectedIndex != -1;
}
+ private void CanExecuteOnImage (object sender, CanExecuteRoutedEventArgs e)
+ {
+ var entry = CurrentDirectory.SelectedItem as EntryViewModel;
+ e.CanExecute = !ViewModel.IsArchive && entry != null && entry.Type == "image";
+ }
+
private void CanExecuteInArchive (object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = ViewModel.IsArchive && CurrentDirectory.SelectedIndex != -1;
@@ -1171,6 +1177,7 @@ namespace GARbro.GUI
public static readonly RoutedCommand DeleteItem = new RoutedCommand();
public static readonly RoutedCommand RenameItem = new RoutedCommand();
public static readonly RoutedCommand ExploreItem = new RoutedCommand();
+ public static readonly RoutedCommand ConvertImage = new RoutedCommand();
public static readonly RoutedCommand Refresh = new RoutedCommand();
public static readonly RoutedCommand Browse = new RoutedCommand();
public static readonly RoutedCommand FitWindow = new RoutedCommand();
diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs
index bf402948..a98d5392 100644
--- a/Properties/Settings.Designer.cs
+++ b/Properties/Settings.Designer.cs
@@ -297,5 +297,17 @@ namespace GARbro.GUI.Properties {
this["winStatusBarVisibility"] = value;
}
}
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("PNG")]
+ public string appLastImageFormat {
+ get {
+ return ((string)(this["appLastImageFormat"]));
+ }
+ set {
+ this["appLastImageFormat"] = value;
+ }
+ }
}
}
diff --git a/Properties/Settings.settings b/Properties/Settings.settings
index 3b4f1e7b..34934d30 100644
--- a/Properties/Settings.settings
+++ b/Properties/Settings.settings
@@ -71,5 +71,8 @@
Visible
+
+ PNG
+
\ No newline at end of file
diff --git a/Strings/guiStrings.Designer.cs b/Strings/guiStrings.Designer.cs
index 171551f3..79295ca0 100644
--- a/Strings/guiStrings.Designer.cs
+++ b/Strings/guiStrings.Designer.cs
@@ -69,6 +69,15 @@ namespace GARbro.GUI.Strings {
}
}
+ ///
+ /// Looks up a localized string similar to Convert.
+ ///
+ public static string ButtonConvert {
+ get {
+ return ResourceManager.GetString("ButtonConvert", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Extract.
///
@@ -96,6 +105,15 @@ namespace GARbro.GUI.Strings {
}
}
+ ///
+ /// Looks up a localized string similar to Convert images....
+ ///
+ public static string CtxMenuConvert {
+ get {
+ return ResourceManager.GetString("CtxMenuConvert", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Copy.
///
@@ -285,6 +303,15 @@ namespace GARbro.GUI.Strings {
}
}
+ ///
+ /// Looks up a localized string similar to Choose destination format.
+ ///
+ public static string LabelDestinationFormat {
+ get {
+ return ResourceManager.GetString("LabelDestinationFormat", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Extract files from {0} to.
///
@@ -420,6 +447,15 @@ namespace GARbro.GUI.Strings {
}
}
+ ///
+ /// Looks up a localized string similar to Converting image {0}.
+ ///
+ public static string MsgConvertingImage {
+ get {
+ return ResourceManager.GetString("MsgConvertingImage", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Creating archive {0}.
///
@@ -711,6 +747,15 @@ namespace GARbro.GUI.Strings {
}
}
+ ///
+ /// Looks up a localized string similar to Convert images.
+ ///
+ public static string TextConvertImages {
+ get {
+ return ResourceManager.GetString("TextConvertImages", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Create archive.
///
@@ -774,6 +819,15 @@ namespace GARbro.GUI.Strings {
}
}
+ ///
+ /// Looks up a localized string similar to Image conversion error.
+ ///
+ public static string TextImageConvertError {
+ get {
+ return ResourceManager.GetString("TextImageConvertError", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Archive parameters.
///
diff --git a/Strings/guiStrings.resx b/Strings/guiStrings.resx
index d786285c..497c5bd6 100644
--- a/Strings/guiStrings.resx
+++ b/Strings/guiStrings.resx
@@ -378,4 +378,22 @@ Overwrite?
_View
+
+ Convert images...
+
+
+ Convert
+
+
+ Choose destination format
+
+
+ Convert images
+
+
+ Converting image {0}
+
+
+ Image conversion error
+
\ No newline at end of file
diff --git a/Strings/guiStrings.ru-RU.resx b/Strings/guiStrings.ru-RU.resx
index 3c2209cc..05d411cf 100644
--- a/Strings/guiStrings.ru-RU.resx
+++ b/Strings/guiStrings.ru-RU.resx
@@ -393,4 +393,22 @@
Просмотр
+
+ Конверсия изображений...
+
+
+ Преобразовать
+
+
+ Формат преобразования
+
+
+ Преобразовать изображения
+
+
+ Преобразование файла {0}
+
+
+ Ошибка конверсии изображения
+
\ No newline at end of file