Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
- name: Install Dependencies
run: |
apt update
apt install -y libadwaita-1-dev libcamel1.2-dev libedataserver1.2-dev libedataserverui4-dev libgranite-7-dev libgtk-4-dev meson valac
apt install -y libadwaita-1-dev libcamel1.2-dev libedataserver1.2-dev libedataserverui4-dev libgranite-7-dev libgtk-4-dev libwebkitgtk-6.0-dev meson valac
- name: Build and Test
env:
DESTDIR: out
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ You'll need the following dependencies:
* libadwaita-1 >= 1.4
* libedataserver-1.2 >= 3.28
* libedataserverui4-1.0 >=3.45.1
* webkitgtk-6.0
* meson
* valac

Expand Down
6 changes: 6 additions & 0 deletions data/meson.build
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
install_data(
'notes.apparmor',
install_dir: get_option('sysconfdir') / 'apparmor.d',
rename: meson.project_name()
)

install_data(
'notes.gschema.xml',
install_dir: get_option('datadir') / 'glib-2.0' / 'schemas',
Expand Down
9 changes: 9 additions & 0 deletions data/notes.apparmor
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
abi <abi/4.0>,
include <tunables/global>

profile io.elementary.notes /usr/bin/io.elementary.notes flags=(unconfined) {
userns,

# Site-specific additions and overrides. See local/README for details.
include if exists <local/io.elementary.notes>
}
4 changes: 2 additions & 2 deletions data/notes.gschema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
<schemalist>
<schema path="/io/elementary/notes/" id="io.elementary.notes">
<key name="window-height" type="i">
<default>475</default>
<default>500</default>
<summary>Most recent window height</summary>
<description>Most recent window height</description>
</key>
<key name="window-width" type="i">
<default>650</default>
<default>900</default>
<summary>Most recent window width</summary>
<description>Most recent window width</description>
</key>
Expand Down
Binary file modified data/screenshot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 3 additions & 1 deletion meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,16 @@ edataserver_dep = dependency('libedataserver-1.2', version: '>= 3.28')
edataserverui_dep = dependency('libedataserverui4-1.0', version: '>=3.45.1')
granite_dep = dependency('granite-7', version: '>=7.6.0')
gtk_dep = dependency('gtk4')
webkit_dep = dependency('webkitgtk-6.0')

dependencies = [
adw_dep,
camel_dep,
edataserver_dep,
edataserverui_dep,
granite_dep,
gtk_dep
gtk_dep,
webkit_dep
]

gnome.post_install(
Expand Down
3 changes: 2 additions & 1 deletion src/Backend/FolderItem.vala
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
public class Notes.FolderItem : Object {
public Camel.Store store { get; construct; }
public Camel.FolderInfo info { get; construct; }
public Camel.Folder folder { get; private set; }

public GLib.ListStore message_infos { get; private set; }

Expand All @@ -24,7 +25,7 @@ public class Notes.FolderItem : Object {

private async void init () {
try {
var folder = yield store.get_folder (info.full_name, NONE, GLib.Priority.DEFAULT, null);
folder = yield store.get_folder (info.full_name, NONE, GLib.Priority.DEFAULT, null);

yield folder.refresh_info (GLib.Priority.DEFAULT, null);

Expand Down
71 changes: 69 additions & 2 deletions src/EditorPage.vala
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,83 @@
*/

public class Notes.EditorPage : Adw.NavigationPage {
private WebKit.WebView web_view;

construct {
var headerbar = new Adw.HeaderBar ();

var scrolled_window = new Gtk.ScrolledWindow ();
web_view = new WebKit.WebView ();

var toolbarview = new Adw.ToolbarView () {
content = scrolled_window
content = web_view
};
toolbarview.add_top_bar (headerbar);

child = toolbarview;
add_css_class (Granite.STYLE_CLASS_VIEW);
}

public async void open_message (Camel.Folder folder, Camel.MessageInfo message_info) {
title = message_info.subject;

try {
var message = yield folder.get_message (message_info.uid, GLib.Priority.DEFAULT, null);
var message_content = yield handle_text_mime (message.content);
if (message_content == "") {
return;
}

web_view.load_html (message_content, "elementary-notes:body");
} catch (Error e) {
critical (e.message);
}
}

private async string handle_text_mime (Camel.DataWrapper part) {
var field = part.get_mime_type_field ();
var os = new GLib.MemoryOutputStream.resizable ();
try {
yield part.decode_to_output_stream (os, GLib.Priority.DEFAULT, null);
os.close ();
} catch (Error e) {
warning ("Possible error decoding email message: %s", e.message);
return "";
}

// Convert the message to UTF-8 to ensure we have a valid GLib string.
return convert_to_utf8 (os, field.param ("charset"));
}

private static string convert_to_utf8 (GLib.MemoryOutputStream os, string? encoding) {
var num_bytes = (int) os.get_data_size ();
var bytes = (string) os.steal_data ();

string? utf8 = null;

if (encoding != null) {
string? iconv_encoding = Camel.iconv_charset_name (encoding);
if (iconv_encoding != null) {
try {
utf8 = GLib.convert (bytes, num_bytes, "UTF-8", iconv_encoding);
} catch (ConvertError e) {
// Nothing to do - result will be assigned below.
}
}
}

if (utf8 == null || !utf8.validate ()) {
/*
* If message_content is not valid UTF-8 at this point, assume that
* it is ISO-8859-1 encoded by default, and convert it to UTF-8.
*/
try {
utf8 = GLib.convert (bytes, num_bytes, "UTF-8", "ISO-8859-1");
} catch (ConvertError e) {
critical ("Every string should be valid ISO-8859-1. ConvertError: %s", e.message);
utf8 = "";
}
}

return utf8;
}
}
5 changes: 2 additions & 3 deletions src/MainWindow.vala
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,12 @@ public class Notes.MainWindow : Adw.ApplicationWindow {

folders_page.row_activated.connect ((folder_item) => {
notes_page.folder_item = folder_item;
notes_page.title = folder_item.info.display_name;
nav_split_view.show_content = true;
});

notes_page.row_activated.connect ((message_info) => {
editor_page.title = message_info.subject;
notes_page.row_activated.connect ((folder, message_info) => {
content_split_view.show_content = true;
editor_page.open_message.begin (folder, message_info);
});
}
}
10 changes: 8 additions & 2 deletions src/NotesPage.vala
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,16 @@
*/

public class Notes.NotesPage : Adw.NavigationPage {
public signal void row_activated (Camel.MessageInfo message_info);
public signal void row_activated (Camel.Folder folder, Camel.MessageInfo message_info);

private Notes.FolderItem? _folder_item = null;
public Notes.FolderItem folder_item {
get {
return _folder_item;
}
set {
_folder_item = value;
title = value.info.display_name;
selection_model.model = value.message_infos;
}
}
Expand Down Expand Up @@ -42,7 +48,7 @@ public class Notes.NotesPage : Adw.NavigationPage {
title = _("Notes");

list_view.activate.connect ((pos) => {
row_activated ((Camel.MessageInfo) selection_model.get_item (pos));
row_activated (folder_item.folder, (Camel.MessageInfo) selection_model.get_item (pos));
});
}

Expand Down