Skip to content

Commit

Permalink
feat(all): Add RTF file export and new settings
Browse files Browse the repository at this point in the history
  • Loading branch information
AamuLumi committed Nov 15, 2022
1 parent f1fa959 commit 1e83e23
Show file tree
Hide file tree
Showing 17 changed files with 1,396 additions and 16 deletions.
Binary file modified Assemblies/Diary.dll
Binary file not shown.
8 changes: 8 additions & 0 deletions Languages/English/Keyed/Diary.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,12 @@ Please create the folder or edit folder path in mod settings.</Diary_Directory_N
<Diary_Error_During_Export>Error during export : an error happened.

Please check write access to the folder are correct au dossier or edit folder path in mod settings.</Diary_Error_During_Export>
<Diary_Export_Format>Export file format</Diary_Export_Format>
<Diary_Format_Text>Text (.txt)</Diary_Format_Text>
<Diary_Format_RTF>Rich Text File (.rtf)</Diary_Format_RTF>
<Diary_Default_Entry_Message>Default entry message</Diary_Default_Entry_Message>
<Diary_No_Entry_Found_Message>"No entry found" message</Diary_No_Entry_Found_Message>
<Diary_Empty>Empty</Diary_Empty>
<Diary_File_Created_Available_At>File is available at this path</Diary_File_Created_Available_At>
<Diary_Reset_To_Default_Path>Reset to default path</Diary_Reset_To_Default_Path>
</LanguageData>
8 changes: 8 additions & 0 deletions Languages/French/Keyed/Diary.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,12 @@ Veuillez créer le dossier ou modifier le chemin dans les réglages du mod.</Dia
<Diary_Error_During_Export>Erreur pendant l'export : une erreur est survenue.

Veuillez vérifier que les droits d'accès au dossier sont corrects ou modifier le chemin dans les réglages du mod.</Diary_Error_During_Export>
<Diary_Export_Format>Format du fichier d'export</Diary_Export_Format>
<Diary_Format_Text>Texte (.txt)</Diary_Format_Text>
<Diary_Format_RTF>Rich Text File (.rtf)</Diary_Format_RTF>
<Diary_Default_Entry_Message>Message d'une entrée par défaut</Diary_Default_Entry_Message>
<Diary_No_Entry_Found_Message>Message "Pas d'entrée trouvée"</Diary_No_Entry_Found_Message>
<Diary_Empty>Vide</Diary_Empty>
<Diary_File_Created_Available_At>Le fichier est disponible à l'endroit suivant</Diary_File_Created_Available_At>
<Diary_Reset_To_Default_Path>Réinitialiser le chemin d'export</Diary_Reset_To_Default_Path>
</LanguageData>
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ You can write freely what happened during these days, and export the whole diary

- Read and write your diary for each day of your colony.
- Check events that happen for each day.
- Export to a single .txt file.
- Export to a single .txt or .rtf file.

## Compatibility

Expand All @@ -20,4 +20,7 @@ You can write freely what happened during these days, and export the whole diary

## Suggestions / Issues

Fill an issue [on the project repository on Github](https://github.com/AamuLumi/Rimworld-Diary/issues).
Fill an issue [on the project repository on Github](https://github.com/AamuLumi/Rimworld-Diary/issues).

## Thanks to :
- [brunurd for RTFExporter library](https://github.com/brunurd/RTFExporter)
17 changes: 16 additions & 1 deletion Source/Dialog_ExportDiary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,34 @@ namespace Diary
public class Dialog_ExportDiary : Window
{
private string message;
private string pathCreated;

public Dialog_ExportDiary(string message)
{
this.doCloseButton = true;
this.message = message;
}

public Dialog_ExportDiary(string message, string pathCreated)
{
this.doCloseButton = true;
this.message = message;
this.pathCreated = pathCreated;
}

public override void DoWindowContents(Rect inRect)
{
string messageToDisplay = message;

if (pathCreated != null)
{
messageToDisplay += $"\n\n{"Diary_File_Created_Available_At".Translate()} : \n\n{pathCreated}";
}

Listing_Standard listingStandard = new Listing_Standard();
listingStandard.Begin(inRect);

listingStandard.Label(message);
listingStandard.Label(messageToDisplay);

listingStandard.End();
}
Expand Down
91 changes: 83 additions & 8 deletions Source/DiaryService.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
using System;
using System.Collections.Generic;
using System.IO;

using UnityEngine;
using System.IO.Packaging;
using System.Xml;
using RimWorld;
using RTFExporter;
using Verse;

namespace Diary
Expand All @@ -17,7 +18,7 @@ public DiaryService(Game game)
entries = new Dictionary<string, string>();
}

private string[] GetEntriesToExport()
private string[] GetTextEntriesToExport()
{
int currentItem = 0;
string[] entriesToExport = new string[entries.Count];
Expand All @@ -37,14 +38,71 @@ private string[] GetEntriesToExport()
return entriesToExport;
}

private void ExportToText(string filePath)
{
File.WriteAllLines(filePath, GetTextEntriesToExport());
}

private void ExportToRTF(string filePath)
{
using (RTFDocument doc = new RTFDocument(filePath))
{
var p = doc.AppendParagraph();

p.style.alignment = Alignment.Center;
p.style.spaceAfter = 600;
p.style.indent = new Indent(0, 0, 0);

var title = p.AppendText($"{Faction.OfPlayer.Name}");

title.style.bold = true;
title.style.fontFamily = "Times New Roman";
title.style.fontSize = 18;

foreach (KeyValuePair<string, string> item in entries)
{
string[] strings = item.Key.Split('-');
int day = int.Parse(strings[0]);
Quadrum quadrum = (Quadrum)Quadrum.Parse(typeof(Quadrum), strings[1]);
int year = int.Parse(strings[2]);

var entryParagraph = doc.AppendParagraph();

entryParagraph.style.alignment = Alignment.Left;
entryParagraph.style.spaceAfter = 600;
entryParagraph.style.indent = new Indent(0, 0, 0);

var t = entryParagraph.AppendText($"{Find.ActiveLanguageWorker.OrdinalNumber(day + 1)} {QuadrumUtility.Label(quadrum)} {year}");

t.style.bold = true;
t.style.fontFamily = "Times New Roman";
t.style.fontSize = 16;

var t2 = entryParagraph.AppendText($"\n\n{item.Value}");

t2.style.fontFamily = "Times New Roman";
t2.style.fontSize = 12;
}
}
}

private string GetDictionaryKey(int day, Quadrum quadrum, int year)
{
return day.ToString() + '-' + quadrum.ToString() + '-' + year.ToString();
}

public string ReadEntry(int day, Quadrum quadrum, int year)
{
return entries.TryGetValue(GetDictionaryKey(day, quadrum, year), "Diary_No_Entry_Found".Translate());
DefaultMessage defaultMessageSetting = LoadedModManager.GetMod<Diary>().GetSettings<DiarySettings>().DefaultMessage;

string defaultMessage = "";

if (defaultMessageSetting == DefaultMessage.NoEntryFound)
{
defaultMessage = "Diary_No_Entry_Found".Translate();
}

return entries.TryGetValue(GetDictionaryKey(day, quadrum, year), defaultMessage);
}
public void WriteEntry(string data, int day, Quadrum quadrum, int year)
{
Expand All @@ -53,14 +111,29 @@ public void WriteEntry(string data, int day, Quadrum quadrum, int year)

public void Export()
{
string savename = Faction.OfPlayer.Name;
string folder = LoadedModManager.GetMod<Diary>().GetSettings<DiarySettings>().FolderPath;
ExportFormat format = LoadedModManager.GetMod<Diary>().GetSettings<DiarySettings>().ExportFormat;

Log.Message($"{folder} {format}");

string savename = Faction.OfPlayer.Name;
string savePath = Path.Combine(folder, "diary-" + savename + "-" + DateTime.Now.Ticks);

try
{
File.WriteAllLines(Path.Combine(folder, "diary-" + savename + "-" + DateTime.Now.Ticks + ".txt"), GetEntriesToExport());

Find.WindowStack.Add(new Dialog_ExportDiary("Diary_Export_Successful".Translate()));
switch (format)
{
case ExportFormat.Text:
savePath += ".txt";
ExportToText(savePath);
break;
case ExportFormat.RTF:
savePath += ".rtf";
ExportToRTF(savePath);
break;
}

Find.WindowStack.Add(new Dialog_ExportDiary("Diary_Export_Successful".Translate(), savePath));
}
catch (DirectoryNotFoundException)
{
Expand All @@ -82,6 +155,8 @@ public override void ExposeData()
base.ExposeData();

Scribe_Collections.Look(ref entries, "entries", LookMode.Value, LookMode.Value);

Log.Message(entries.ToStringFullContents());
}

public override void FinalizeInit()
Expand Down
84 changes: 79 additions & 5 deletions Source/DiarySettings.cs
Original file line number Diff line number Diff line change
@@ -1,31 +1,70 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using UnityEngine;
using HarmonyLib;
using RimWorld;
using Verse;
using Verse.AI;

namespace Diary
{
public class DiarySettings : ModSettings
{
private string folderPath;
private ExportFormat exportFormat;
private DefaultMessage defaultMessage;

public string FolderPath
{
get { return folderPath; }
}

public ExportFormat ExportFormat
{
get { return exportFormat; }
}

public DefaultMessage DefaultMessage
{
get { return defaultMessage; }
}

public override void ExposeData()
{
base.ExposeData();

Scribe_Values.Look(ref folderPath, "folderPath", Application.dataPath);
Scribe_Values.Look(ref exportFormat, "exportFormat", ExportFormat.Text);
Scribe_Values.Look(ref defaultMessage, "defaultMessage", DefaultMessage.Empty);
}

public string GetFormatName(ExportFormat format)
{
switch (format)
{
case ExportFormat.Text: return "Diary_Format_Text".Translate();
case ExportFormat.RTF: return "Diary_Format_RTF".Translate();
default: return "";
}
}

public string GetDefaultMessageName(DefaultMessage m)
{
switch (m)
{
case DefaultMessage.Empty: return "Diary_Empty".Translate();
case DefaultMessage.NoEntryFound: return "Diary_No_Entry_Found_Message".Translate();
default: return "";
}
}

public void SetFormat(ExportFormat f)
{
exportFormat = f;
}

public void SetDefaultMessage(DefaultMessage m)
{
defaultMessage = m;
}

public void DoSettingsWindowContents(Rect inRect)
Expand All @@ -36,6 +75,41 @@ public void DoSettingsWindowContents(Rect inRect)
listingStandard.Label("Diary_Export_Folder_Path".Translate());
folderPath = listingStandard.TextEntry(folderPath);

if (listingStandard.ButtonText("Diary_Reset_To_Default_Path".Translate()))
{
folderPath = Application.dataPath;
}

listingStandard.Label("Diary_Export_Format".Translate());
if (listingStandard.ButtonText(GetFormatName(exportFormat)))
{
List<FloatMenuOption> list = new List<FloatMenuOption>();
foreach (int i in Enum.GetValues(typeof(ExportFormat)))
{
int current = i;
list.Add(new FloatMenuOption(GetFormatName((ExportFormat)i), delegate
{
SetFormat((ExportFormat)current);
}));
}
Find.WindowStack.Add(new FloatMenu(list));
}

listingStandard.Label("Diary_Default_Entry_Message".Translate());
if (listingStandard.ButtonText(GetDefaultMessageName(defaultMessage)))
{
List<FloatMenuOption> list = new List<FloatMenuOption>();
foreach (int i in Enum.GetValues(typeof(DefaultMessage)))
{
int current = i;
list.Add(new FloatMenuOption(GetDefaultMessageName((DefaultMessage)i), delegate
{
SetDefaultMessage((DefaultMessage)current);
}));
}
Find.WindowStack.Add(new FloatMenu(list));
}

listingStandard.End();
}
}
Expand Down
30 changes: 30 additions & 0 deletions Source/DiaryTypes.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

using UnityEngine;
using HarmonyLib;
using RimWorld;
using Verse;
using Verse.AI;
using Verse.Sound;
using RimWorld.Planet;

namespace Diary
{
public enum ExportFormat
{
Text,
RTF,
}
public enum DefaultMessage
{
NoEntryFound,
Empty,
}

}

0 comments on commit 1e83e23

Please sign in to comment.