aboutsummarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gtk_win.c86
-rw-r--r--gtk_win.h10
-rw-r--r--window_main.glade176
3 files changed, 251 insertions, 21 deletions
diff --git a/gtk_win.c b/gtk_win.c
index e45edbd950e4..2c635a8933c3 100644
--- a/gtk_win.c
+++ b/gtk_win.c
@@ -121,6 +121,92 @@ void on_load_button_clicked(GtkButton* button) {
api_info_array_store_check_data(app.portfolio_data);
check_list_add_api_data();
}
+
+ GtkButton* lock_button = GTK_BUTTON(gtk_builder_get_object(app.builder, "lock_button"));
+ gtk_widget_set_sensitive(GTK_WIDGET(lock_button), TRUE);
+ if (app.password[0] == '\0') // Plaintext
+ gtk_button_set_label(lock_button, "Encrypt");
+ else gtk_button_set_label(lock_button, "Decrypt");
+}
+
+void on_lock_button_clicked(GtkButton* button) {
+ if (strcmp(gtk_button_get_label(button), "Encrypt") == 0) {
+ gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object(app.builder, "set_password_entry1")),
+ "");
+ gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object(app.builder, "set_password_entry2")),
+ "");
+ gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(app.builder, "set_password_dialog")));
+ } else {
+ gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object(app.builder, "decrypt_password_entry")),
+ "");
+ gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(app.builder, "decrypt_dialog")));
+ }
+}
+
+void on_set_password_dialog_response(GtkDialog* dialog, gint response_id) {
+ if (response_id == GTK_RESPONSE_CANCEL)
+ gtk_widget_hide(GTK_WIDGET(dialog));
+ else on_set_password_entry_activate(NULL);
+}
+
+void on_set_password_entry_activate(GtkEntry* entry) {
+ gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(app.builder, "set_password_dialog")));
+ GtkEntry* pass = GTK_ENTRY(gtk_builder_get_object(app.builder, "set_password_entry1"));
+ GtkEntry* pass_check = GTK_ENTRY(gtk_builder_get_object(app.builder, "set_password_entry2"));
+ const gchar* pass_str = gtk_entry_get_text(pass);
+ GValue gtext = G_VALUE_INIT;
+ g_value_init(&gtext, G_TYPE_STRING);
+ GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(
+ app.builder, "generic_check_window_error_dialog"));
+ if (strlen(pass_str) < 6 || strlen(pass_str) > 30)
+ g_value_set_string(&gtext, "Your password must be between 6 and 30 characters.");
+ else if (strcmp(pass_str, gtk_entry_get_text(pass_check)) != 0)
+ g_value_set_string(&gtext, "Your passwords did not match.");
+ else { // If passwords match
+ sprintf(app.password, "%s\n", pass_str);
+ g_value_set_string(&gtext, "Success! Your portfolio will be encrypted when you close the "
+ "program.");
+ dialog = GTK_WIDGET(gtk_builder_get_object(
+ app.builder, "generic_check_window_success_dialog"));
+
+ gtk_button_set_label(GTK_BUTTON(gtk_builder_get_object(app.builder, "lock_button")),
+ "Decrypt");
+ }
+
+ g_object_set_property(G_OBJECT(dialog), "text", &gtext);
+ gtk_widget_show(dialog);
+}
+
+void on_decrypt_dialog_response(GtkDialog* dialog, gint response_id) {
+ if (response_id == GTK_RESPONSE_CANCEL)
+ gtk_widget_hide(GTK_WIDGET(dialog));
+ else on_decrypt_password_entry_activate(NULL);
+}
+
+void on_decrypt_password_entry_activate(GtkEntry* entry) {
+ gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(app.builder, "decrypt_dialog")));
+ GValue gtext = G_VALUE_INIT;
+ g_value_init(&gtext, G_TYPE_STRING);
+ GtkDialog* dialog;
+ const gchar* pass = gtk_entry_get_text(GTK_ENTRY(
+ gtk_builder_get_object(app.builder, "decrypt_password_entry")));
+ gchar mod_pass[strlen(pass) + 1];
+ sprintf(mod_pass, "%s\n", pass);
+ if (strcmp(app.password, mod_pass) == 0) { // Success
+ memset(app.password, '\0', PASS_MAX);
+ g_value_set_string(&gtext, "Successfully decrypted.");
+ dialog = GTK_DIALOG(gtk_builder_get_object(app.builder,
+ "generic_check_window_success_dialog"));
+
+ gtk_button_set_label(GTK_BUTTON(gtk_builder_get_object(app.builder, "lock_button")),
+ "Encrypt");
+ } else {
+ g_value_set_string(&gtext, "Wrong password!.");
+ dialog = GTK_DIALOG(gtk_builder_get_object(app.builder,
+ "generic_check_window_error_dialog"));
+ }
+ g_object_set_property(G_OBJECT(dialog), "text", &gtext);
+ gtk_widget_show(GTK_WIDGET(dialog));
}
void on_modify_button_clicked(GtkButton* button) {
diff --git a/gtk_win.h b/gtk_win.h
index b8f5110af4a5..254291575928 100644
--- a/gtk_win.h
+++ b/gtk_win.h
@@ -29,6 +29,16 @@ void check_list_add_api_data(void);
void on_load_button_clicked(GtkButton* button);
+void on_lock_button_clicked(GtkButton* button);
+
+void on_set_password_dialog_response(GtkDialog* dialog, gint response_id);
+
+void on_set_password_entry_activate(GtkEntry* entry);
+
+void on_decrypt_dialog_response(GtkDialog* dialog, gint response_id);
+
+void on_decrypt_password_entry_activate(GtkEntry* entry);
+
void on_modify_button_clicked(GtkButton* button);
void on_modify_entry_activate(GtkEntry* entry, gpointer dialog);
diff --git a/window_main.glade b/window_main.glade
index ad596b15c22e..a877bc127e13 100644
--- a/window_main.glade
+++ b/window_main.glade
@@ -98,11 +98,13 @@ https://github.com/aokellermann/
</packing>
</child>
<child>
- <object class="GtkLockButton" id="lock_button">
+ <object class="GtkButton" id="lock_button">
+ <property name="label" translatable="yes">Encrypt/Decrypt</property>
<property name="visible">True</property>
+ <property name="sensitive">False</property>
<property name="can_focus">True</property>
- <property name="text_lock" translatable="yes">Lock Portfolio</property>
- <property name="text_unlock" translatable="yes">Unlock Portfolio</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_lock_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
@@ -159,24 +161,6 @@ https://github.com/aokellermann/
<property name="position">0</property>
</packing>
</child>
- <child>
- <object class="GtkSearchEntry" id="search_entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="halign">end</property>
- <property name="hexpand">True</property>
- <property name="caps_lock_warning">False</property>
- <property name="primary_icon_name">edit-find-symbolic</property>
- <property name="primary_icon_activatable">False</property>
- <property name="primary_icon_sensitive">False</property>
- <property name="input_purpose">alpha</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
</object>
<packing>
<property name="resize">False</property>
@@ -494,6 +478,35 @@ https://github.com/aokellermann/
</object>
</child>
</object>
+ <object class="GtkMessageDialog" id="generic_check_window_success_dialog">
+ <property name="can_focus">False</property>
+ <property name="type_hint">dialog</property>
+ <property name="transient_for">check_window</property>
+ <property name="buttons">ok</property>
+ <signal name="delete-event" handler="gtk_widget_hide_on_delete" swapped="no"/>
+ <signal name="response" handler="gtk_widget_hide" swapped="no"/>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox">
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
<object class="GtkMessageDialog" id="get_password_dialog">
<property name="can_focus">False</property>
<property name="modal">True</property>
@@ -627,4 +640,125 @@ https://github.com/aokellermann/
</object>
</child>
</object>
+ <object class="GtkMessageDialog" id="set_password_dialog">
+ <property name="can_focus">False</property>
+ <property name="modal">True</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="urgency_hint">True</property>
+ <property name="transient_for">check_window</property>
+ <property name="message_type">question</property>
+ <property name="buttons">ok-cancel</property>
+ <property name="text" translatable="yes">Choose a password:</property>
+ <signal name="close" handler="gtk_widget_hide" swapped="no"/>
+ <signal name="delete-event" handler="gtk_widget_hide_on_delete" swapped="no"/>
+ <signal name="response" handler="on_set_password_dialog_response" swapped="no"/>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox">
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="set_password_entry1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="invisible_char">●</property>
+ <property name="max_width_chars">31</property>
+ <property name="placeholder_text" translatable="yes">password</property>
+ <property name="input_purpose">password</property>
+ <signal name="activate" handler="on_set_password_entry_activate" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="set_password_entry2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="invisible_char">●</property>
+ <property name="max_width_chars">31</property>
+ <property name="placeholder_text" translatable="yes">enter the password again</property>
+ <signal name="activate" handler="on_set_password_entry_activate" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkMessageDialog" id="decrypt_dialog">
+ <property name="can_focus">False</property>
+ <property name="modal">True</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="urgency_hint">True</property>
+ <property name="transient_for">check_window</property>
+ <property name="message_type">question</property>
+ <property name="buttons">ok-cancel</property>
+ <property name="text" translatable="yes">Enter your password:</property>
+ <signal name="close" handler="gtk_widget_hide" swapped="no"/>
+ <signal name="destroy-event" handler="gtk_widget_hide_on_delete" swapped="no"/>
+ <signal name="response" handler="on_decrypt_dialog_response" swapped="no"/>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="vbox">
+ <object class="GtkBox">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox">
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="decrypt_password_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="invisible_char">●</property>
+ <property name="max_width_chars">31</property>
+ <property name="input_purpose">password</property>
+ <signal name="activate" handler="on_decrypt_password_entry_activate" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
</interface>