Make spell checking a setting, store language per conversation
This commit is contained in:
parent
0d30706438
commit
f12fc371a3
|
@ -11,6 +11,7 @@ public class Settings : Object {
|
||||||
send_marker_ = col_to_bool_or_default("send_marker", true);
|
send_marker_ = col_to_bool_or_default("send_marker", true);
|
||||||
notifications_ = col_to_bool_or_default("notifications", true);
|
notifications_ = col_to_bool_or_default("notifications", true);
|
||||||
convert_utf8_smileys_ = col_to_bool_or_default("convert_utf8_smileys", true);
|
convert_utf8_smileys_ = col_to_bool_or_default("convert_utf8_smileys", true);
|
||||||
|
check_spelling = col_to_bool_or_default("check_spelling", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool col_to_bool_or_default(string key, bool def) {
|
private bool col_to_bool_or_default(string key, bool def) {
|
||||||
|
@ -65,6 +66,18 @@ public class Settings : Object {
|
||||||
convert_utf8_smileys_ = value;
|
convert_utf8_smileys_ = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool check_spelling_;
|
||||||
|
public bool check_spelling {
|
||||||
|
get { return check_spelling_; }
|
||||||
|
set {
|
||||||
|
db.settings.upsert()
|
||||||
|
.value(db.settings.key, "check_spelling", true)
|
||||||
|
.value(db.settings.value, value.to_string())
|
||||||
|
.perform();
|
||||||
|
check_spelling_ = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ using Dino.Entities;
|
||||||
namespace Dino {
|
namespace Dino {
|
||||||
|
|
||||||
public class Database : Qlite.Database {
|
public class Database : Qlite.Database {
|
||||||
private const int VERSION = 18;
|
private const int VERSION = 19;
|
||||||
|
|
||||||
public class AccountTable : Table {
|
public class AccountTable : Table {
|
||||||
public Column<int> id = new Column.Integer("id") { primary_key = true, auto_increment = true };
|
public Column<int> id = new Column.Integer("id") { primary_key = true, auto_increment = true };
|
||||||
|
@ -254,6 +254,19 @@ public class Database : Qlite.Database {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ConversationSettingsTable : Table {
|
||||||
|
public Column<int> id = new Column.Integer("id") { primary_key = true, auto_increment = true };
|
||||||
|
public Column<int> conversation_id = new Column.Integer("conversation_id") {not_null=true};
|
||||||
|
public Column<string> key = new Column.Text("key") { not_null=true };
|
||||||
|
public Column<string> value = new Column.Text("value");
|
||||||
|
|
||||||
|
internal ConversationSettingsTable(Database db) {
|
||||||
|
base(db, "conversation_settings");
|
||||||
|
init({id, conversation_id, key, value});
|
||||||
|
index("settings_conversationid_key", { conversation_id, key }, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public AccountTable account { get; private set; }
|
public AccountTable account { get; private set; }
|
||||||
public JidTable jid { get; private set; }
|
public JidTable jid { get; private set; }
|
||||||
public EntityTable entity { get; private set; }
|
public EntityTable entity { get; private set; }
|
||||||
|
@ -269,6 +282,7 @@ public class Database : Qlite.Database {
|
||||||
public RosterTable roster { get; private set; }
|
public RosterTable roster { get; private set; }
|
||||||
public MamCatchupTable mam_catchup { get; private set; }
|
public MamCatchupTable mam_catchup { get; private set; }
|
||||||
public SettingsTable settings { get; private set; }
|
public SettingsTable settings { get; private set; }
|
||||||
|
public ConversationSettingsTable conversation_settings { get; private set; }
|
||||||
|
|
||||||
public Map<int, Jid> jid_table_cache = new HashMap<int, Jid>();
|
public Map<int, Jid> jid_table_cache = new HashMap<int, Jid>();
|
||||||
public Map<Jid, int> jid_table_reverse = new HashMap<Jid, int>(Jid.hash_func, Jid.equals_func);
|
public Map<Jid, int> jid_table_reverse = new HashMap<Jid, int>(Jid.hash_func, Jid.equals_func);
|
||||||
|
@ -291,7 +305,8 @@ public class Database : Qlite.Database {
|
||||||
roster = new RosterTable(this);
|
roster = new RosterTable(this);
|
||||||
mam_catchup = new MamCatchupTable(this);
|
mam_catchup = new MamCatchupTable(this);
|
||||||
settings = new SettingsTable(this);
|
settings = new SettingsTable(this);
|
||||||
init({ account, jid, entity, content_item, message, message_correction, real_jid, file_transfer, conversation, avatar, entity_identity, entity_feature, roster, mam_catchup, settings });
|
conversation_settings = new ConversationSettingsTable(this);
|
||||||
|
init({ account, jid, entity, content_item, message, message_correction, real_jid, file_transfer, conversation, avatar, entity_identity, entity_feature, roster, mam_catchup, settings, conversation_settings });
|
||||||
|
|
||||||
try {
|
try {
|
||||||
exec("PRAGMA journal_mode = WAL");
|
exec("PRAGMA journal_mode = WAL");
|
||||||
|
|
|
@ -65,6 +65,18 @@
|
||||||
<property name="height">1</property>
|
<property name="height">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckButton" id="check_spelling_checkbutton">
|
||||||
|
<property name="label" translatable="yes">Check spelling</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">0</property>
|
||||||
|
<property name="top_attach">4</property>
|
||||||
|
<property name="width">1</property>
|
||||||
|
<property name="height">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
|
|
@ -9,26 +9,64 @@ namespace Dino.Ui {
|
||||||
public class SpellChecker {
|
public class SpellChecker {
|
||||||
|
|
||||||
private Conversation? conversation;
|
private Conversation? conversation;
|
||||||
private TextView gspell_view;
|
private TextView text_view;
|
||||||
private HashMap<Conversation, Language> language_cache = new HashMap<Conversation, Language>(Conversation.hash_func, Conversation.equals_func);
|
private TextBuffer text_buffer;
|
||||||
|
|
||||||
public SpellChecker(Gtk.TextView text_input) {
|
public SpellChecker(Gtk.TextView text_input) {
|
||||||
this.gspell_view = TextView.get_from_gtk_text_view(text_input);
|
this.text_view = TextView.get_from_gtk_text_view(text_input);
|
||||||
gspell_view.basic_setup();
|
this.text_buffer = TextBuffer.get_from_gtk_text_buffer(text_view.view.buffer);
|
||||||
|
|
||||||
|
text_view.basic_setup();
|
||||||
|
text_buffer.spell_checker.notify["language"].connect(lang_changed);
|
||||||
|
|
||||||
|
// Enable/Disable spell checking live
|
||||||
|
Dino.Application.get_default().settings.notify["check-spelling"].connect((obj, _) => {
|
||||||
|
if (((Dino.Entities.Settings) obj).check_spelling) {
|
||||||
|
initialize_for_conversation(this.conversation);
|
||||||
|
} else {
|
||||||
|
text_buffer.set_spell_checker(null);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initialize_for_conversation(Conversation conversation) {
|
public void initialize_for_conversation(Conversation conversation) {
|
||||||
Checker spell_checker = TextBuffer.get_from_gtk_text_buffer(gspell_view.view.buffer).spell_checker;
|
|
||||||
|
|
||||||
if (this.conversation != null) language_cache[this.conversation] = spell_checker.language;
|
|
||||||
|
|
||||||
this.conversation = conversation;
|
this.conversation = conversation;
|
||||||
|
|
||||||
if (language_cache.has_key(this.conversation)) {
|
if (!Dino.Application.get_default().settings.check_spelling) {
|
||||||
spell_checker.language = language_cache[conversation];
|
text_buffer.set_spell_checker(null);
|
||||||
} else {
|
return;
|
||||||
spell_checker.language = null;
|
|
||||||
}
|
}
|
||||||
|
if (text_buffer.spell_checker == null) text_buffer.spell_checker = new Checker(null);
|
||||||
|
|
||||||
|
// Set the conversation language (from cache or db)
|
||||||
|
text_buffer.spell_checker.notify["language"].disconnect(lang_changed);
|
||||||
|
|
||||||
|
var db = Dino.Application.get_default().db;
|
||||||
|
Qlite.RowOption row_option = db.conversation_settings.select()
|
||||||
|
.with(db.conversation_settings.conversation_id, "=", conversation.id)
|
||||||
|
.with(db.conversation_settings.key, "=", "lang")
|
||||||
|
.single().row();
|
||||||
|
if (row_option.is_present()) {
|
||||||
|
string lang_code = row_option.inner[db.conversation_settings.value];
|
||||||
|
Language? lang = Language.lookup(lang_code);
|
||||||
|
text_buffer.spell_checker.language = lang;
|
||||||
|
} else {
|
||||||
|
text_buffer.spell_checker.language = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
text_buffer.spell_checker.notify["language"].connect(lang_changed);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void lang_changed() {
|
||||||
|
var db = Dino.Application.get_default().db;
|
||||||
|
|
||||||
|
Checker spell_checker = text_buffer.spell_checker;
|
||||||
|
if (spell_checker.language.get_code() == null) return;
|
||||||
|
db.conversation_settings.upsert()
|
||||||
|
.value(db.conversation_settings.conversation_id, conversation.id, true)
|
||||||
|
.value(db.conversation_settings.key, "lang", true)
|
||||||
|
.value(db.conversation_settings.value, spell_checker.language.get_code())
|
||||||
|
.perform();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ class SettingsDialog : Dialog {
|
||||||
[GtkChild] private CheckButton marker_checkbutton;
|
[GtkChild] private CheckButton marker_checkbutton;
|
||||||
[GtkChild] private CheckButton notification_checkbutton;
|
[GtkChild] private CheckButton notification_checkbutton;
|
||||||
[GtkChild] private CheckButton emoji_checkbutton;
|
[GtkChild] private CheckButton emoji_checkbutton;
|
||||||
|
[GtkChild] private CheckButton check_spelling_checkbutton;
|
||||||
|
|
||||||
Dino.Entities.Settings settings = Dino.Application.get_default().settings;
|
Dino.Entities.Settings settings = Dino.Application.get_default().settings;
|
||||||
|
|
||||||
|
@ -19,11 +20,13 @@ class SettingsDialog : Dialog {
|
||||||
marker_checkbutton.active = settings.send_marker;
|
marker_checkbutton.active = settings.send_marker;
|
||||||
notification_checkbutton.active = settings.notifications;
|
notification_checkbutton.active = settings.notifications;
|
||||||
emoji_checkbutton.active = settings.convert_utf8_smileys;
|
emoji_checkbutton.active = settings.convert_utf8_smileys;
|
||||||
|
check_spelling_checkbutton.active = settings.check_spelling;
|
||||||
|
|
||||||
typing_checkbutton.toggled.connect(() => { settings.send_typing = typing_checkbutton.active; } );
|
typing_checkbutton.toggled.connect(() => { settings.send_typing = typing_checkbutton.active; } );
|
||||||
marker_checkbutton.toggled.connect(() => { settings.send_marker = marker_checkbutton.active; } );
|
marker_checkbutton.toggled.connect(() => { settings.send_marker = marker_checkbutton.active; } );
|
||||||
notification_checkbutton.toggled.connect(() => { settings.notifications = notification_checkbutton.active; } );
|
notification_checkbutton.toggled.connect(() => { settings.notifications = notification_checkbutton.active; } );
|
||||||
emoji_checkbutton.toggled.connect(() => { settings.convert_utf8_smileys = emoji_checkbutton.active; });
|
emoji_checkbutton.toggled.connect(() => { settings.convert_utf8_smileys = emoji_checkbutton.active; });
|
||||||
|
check_spelling_checkbutton.toggled.connect(() => { settings.check_spelling = check_spelling_checkbutton.active; });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue