diff --git a/simplelogin-gui/data/main_panel.blp b/simplelogin-gui/data/main_panel.blp
index c4899ee..ebb036d 100644
--- a/simplelogin-gui/data/main_panel.blp
+++ b/simplelogin-gui/data/main_panel.blp
@@ -65,19 +65,17 @@ template $MainPanel : Box {
vexpand: true;
ListView alias_list_view {
- factory: SignalListItemFactory alias_item_factory {
- };
-
- model: MultiSelection alias_selection_model {
- };
+ factory: SignalListItemFactory alias_item_factory {};
+ model: SingleSelection alias_selection_model {};
}
};
[overlay]
Label no_content_label {
hexpand: true;
- label: "No more results";
vexpand: true;
+ label: "No more results";
+ visible: false;
styles [
"loading-label",
@@ -133,6 +131,7 @@ template $MainPanel : Box {
[overlay]
Box loading_overlay {
orientation: vertical;
+ visible: false;
Spinner {
spinning: true;
diff --git a/simplelogin-gui/data/settings_panel.blp b/simplelogin-gui/data/settings_panel.blp
new file mode 100644
index 0000000..34ef259
--- /dev/null
+++ b/simplelogin-gui/data/settings_panel.blp
@@ -0,0 +1,253 @@
+using Gtk 4.0;
+
+template $SettingsPanel : Box {
+ Overlay overlay {
+ hexpand: true;
+
+ child: Box content_wrapper {
+ hexpand: true;
+ vexpand: true;
+
+ Grid content {
+ hexpand: true;
+ row-homogeneous: true;
+ valign: start;
+
+ Button profile_image_button {
+ has-frame: false;
+
+ Image profile_image {
+ halign: center;
+ icon-name: "user-info-symbolic";
+ icon-size: large;
+ margin-end: 5;
+ valign: center;
+ vexpand: true;
+ }
+
+ layout {
+ column: "0";
+ column-span: "1";
+ row: "0";
+ row-span: "2";
+ }
+ }
+
+ Box {
+ Button remove_picture_button {
+ halign: start;
+ valign: center;
+ icon-name: "window-close-symbolic";
+ visible: false;
+ }
+
+ Entry name_label {
+ editable: false;
+ has-frame: false;
+ hexpand: true;
+ input-hints: no_emoji | no_spellcheck;
+ text: "Testy McTesterface";
+
+ styles [
+ "login-title-label",
+ ]
+ }
+
+ layout {
+ column: "1";
+ column-span: "1";
+ row: "0";
+ row-span: "1";
+ }
+ }
+
+ Box {
+ Button edit_button {
+ halign: start;
+ valign: center;
+ label: "Edit";
+ }
+
+ Button cancel_edit_button {
+ halign: start;
+ valign: center;
+ visible: false;
+ label: "Cancel";
+ }
+ }
+
+ Label stats_label {
+ halign: center;
+ hexpand: true;
+ label: "Stats go here";
+
+ layout {
+ column: "0";
+ column-span: "3";
+ row: "2";
+ row-span: "1";
+ }
+ }
+
+ Label email_label {
+ hexpand: true;
+ label: "mctesterface@test.tld";
+ xalign: 0.0;
+
+ layout {
+ column: "1";
+ row: "1";
+ }
+ }
+
+ Button logout_button {
+ halign: start;
+ label: "Logout";
+ valign: center;
+
+ layout {
+ column: "2";
+ row: "1";
+ }
+ }
+
+ Label {
+ label: "Account Status:";
+ margin-end: 5;
+ xalign: 1.0;
+
+ layout {
+ column: "0";
+ column-span: "1";
+ row: "3";
+ row-span: "1";
+ }
+ }
+
+ Label {
+ label: "Api Key:";
+ margin-end: 5;
+ xalign: 1.0;
+
+ layout {
+ column: "0";
+ row: "4";
+ }
+ }
+
+ PasswordEntry api_key_field {
+ editable: false;
+ enable-undo: false;
+ hexpand: true;
+ show-peek-icon: true;
+ valign: center;
+
+ layout {
+ column: "1";
+ row: "4";
+ }
+ }
+
+ Label status_label {
+ hexpand: true;
+ label: "Premium";
+ xalign: 0.0;
+
+ layout {
+ column: "1";
+ column-span: "1";
+ row: "3";
+ row-span: "1";
+ }
+ }
+
+ Button api_key_clear_button {
+ halign: start;
+ label: "Clear";
+ valign: center;
+ clicked => $clear_api_key_clicked() swapped;
+
+ layout {
+ column: "2";
+ row: "4";
+ }
+ }
+ }
+ };
+
+ [overlay]
+ Box loading_overlay {
+ hexpand: true;
+ orientation: vertical;
+ visible: false;
+
+ Spinner {
+ spinning: true;
+ valign: end;
+ vexpand: true;
+
+ styles [
+ "loading-label",
+ ]
+ }
+
+ Label {
+ label: "Loading...";
+ valign: start;
+ vexpand: true;
+
+ styles [
+ "loading-label",
+ ]
+ }
+
+ styles [
+ "loading-label",
+ ]
+ }
+
+ [overlay]
+ Box error_overlay {
+ hexpand: true;
+ orientation: vertical;
+ visible: false;
+
+ Box {
+ halign: center;
+ valign: end;
+
+ Button error_refresh_button {
+ halign: center;
+ icon-name: "view-refresh-symbolic";
+ valign: end;
+ vexpand: true;
+
+ styles [
+ "loading-label",
+ ]
+ }
+
+ Button error_close_button {
+ halign: center;
+ icon-name: "window-close-symbolic";
+ valign: end;
+
+ styles [
+ "loading-label",
+ ]
+ }
+ }
+
+ Label error_label {
+ label: "ERROR";
+ valign: start;
+ vexpand: true;
+
+ styles [
+ "error-message-label",
+ "loading-label",
+ ]
+ }
+ }
+ }
+}
diff --git a/simplelogin-gui/res.old/main-panel.ui b/simplelogin-gui/res.old/main-panel.ui
deleted file mode 100644
index eb5a30f..0000000
--- a/simplelogin-gui/res.old/main-panel.ui
+++ /dev/null
@@ -1,188 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- vertical
-
-
- True
- end
- True
-
-
-
-
-
- Loading...
- start
- True
-
-
-
-
-
-
- True
- No more results
- True
-
-
-
- True
- vertical
-
-
- center
- end
-
-
- center
- view-refresh-symbolic
- end
- True
-
-
-
-
-
- center
- window-close-symbolic
- end
-
-
-
-
-
-
-
- ERROR
- start
- True
-
-
-
-
-
-
diff --git a/simplelogin-gui/res.old/settings-panel.ui b/simplelogin-gui/res.old/settings-panel.ui
deleted file mode 100644
index 3996bee..0000000
--- a/simplelogin-gui/res.old/settings-panel.ui
+++ /dev/null
@@ -1,263 +0,0 @@
-
-
-
-
-
-
-
- content_wrapper
- True
-
-
- True
- True
-
-
- True
- True
- start
-
-
- False
-
-
- center
- user-info-symbolic
- large
- 5
- center
- True
-
-
-
-
- 0
- 1
- 0
- 2
-
-
-
-
-
-
-
- window-close-symbolic
-
-
-
-
- False
- False
- True
- no-emoji | no-spellcheck
- Testy McTesterface
-
-
-
-
- 1
- 1
- 0
- 1
-
-
-
-
-
-
-
- start
- Edit
- center
-
-
-
-
- Cancel
-
-
-
- 2
- 1
- 0
- 1
-
-
-
-
-
- center
- True
- Stats go here
-
- 0
- 3
- 2
- 1
-
-
-
-
-
- True
- mctesterface@test.tld
- 0.0
-
- 1
- 1
-
-
-
-
-
- start
- Logout
- center
-
- 2
- 1
-
-
-
-
-
- Account Status:
- 5
- 1.0
-
- 0
- 1
- 3
- 1
-
-
-
-
-
- Api Key:
- 5
- 1.0
-
-
- 0
- 4
-
-
-
-
-
- False
- False
- True
- True
- center
-
- 1
- 4
-
-
-
-
-
- True
- Premium
- 0.0
-
- 1
- 1
- 3
- 1
-
-
-
-
-
- start
- Clear
- center
-
- 2
- 4
-
-
-
-
-
-
-
-
-
-
-
- True
- vertical
-
-
- True
- end
- True
-
-
-
-
-
- Loading...
- start
- True
-
-
-
-
-
-
- True
- vertical
-
-
- center
- end
-
-
- center
- view-refresh-symbolic
- end
- True
-
-
-
-
-
- center
- window-close-symbolic
- end
-
-
-
-
-
-
-
- ERROR
- start
- True
-
-
-
-
-
diff --git a/simplelogin-gui/res.old/simplelogin.cmb b/simplelogin-gui/res.old/simplelogin.cmb
deleted file mode 100644
index c4deb09..0000000
--- a/simplelogin-gui/res.old/simplelogin.cmb
+++ /dev/null
@@ -1,531 +0,0 @@
-
-
-
-
- (1,1,"main-window.ui","main-panel.ui",None,None,None,None,None,None,""),
- (3,18,None,"settings-panel.ui",None,None,None,None,None,None,None),
- (4,13,None,"login-window.ui",None,None,None,None,None,None,None),
- (5,1,None,"totp-dialog.ui",None,None,None,None,None,None,None)
-
-
- (1,"global.css",None,1)
-
-
- (1,1),
- (1,3),
- (1,4),
- (1,5)
-
-
- (1,1,"GtkBox","SLMainPanel",None,None,None,None,None,None),
- (1,2,"GtkOverlay","overlay",1,None,None,None,None,None),
- (1,3,"GtkBox","content_wrapper",2,None,None,None,None,None),
- (1,4,"GtkBox",None,3,None,None,None,None,None),
- (1,5,"GtkSearchEntry","search_box",4,None,None,None,None,None),
- (1,8,"GtkDropDown","view_dropdown",4,None,None,None,1,None),
- (1,9,"GtkStringList",None,8,None,None,None,None,None),
- (1,10,"GtkButton","search_button",4,None,None,None,2,None),
- (1,11,"GtkBox",None,3,None,None,None,1,None),
- (1,12,"GtkButton","new_button",11,None,None,None,None,None),
- (1,13,"GtkButton","edit_button",11,None,None,None,1,None),
- (1,14,"GtkButton","delete_button",11,None,None,None,2,None),
- (1,22,"GtkBox","loading_overlay",None,None,None,None,None,None),
- (1,23,"GtkSpinner",None,22,None,None,None,None,None),
- (1,24,"GtkLabel",None,22,None,None,None,1,None),
- (1,28,"GtkButton","prev_page_button",11,None,None,None,3,None),
- (1,29,"GtkButton","next_page_button",11,None,None,None,5,None),
- (1,30,"GtkEntry","page_label",11,None,None,None,4,None),
- (1,31,"GtkOverlay","scroll_overlay",3,None,None,None,2,None),
- (1,32,"GtkScrolledWindow",None,31,None,None,None,None,None),
- (1,33,"GtkListView","alias_list_view",32,None,None,None,None,None),
- (1,34,"GtkSignalListItemFactory","alias_item_factory",33,None,None,None,None,None),
- (1,35,"GtkMultiSelection","alias_selection_model",33,None,None,None,None,None),
- (1,36,"GtkLabel","no_content_label",None,None,None,None,None,None),
- (1,37,"GtkBox","error_overlay",None,None,None,None,None,None),
- (1,38,"GtkBox",None,37,None,None,None,None,None),
- (1,39,"GtkButton","error_refresh_button",38,None,None,None,None,None),
- (1,40,"GtkButton","error_close_button",38,None,None,None,1,None),
- (1,41,"GtkLabel","error_label",37,None,None,None,1,None),
- (3,18,"GtkBox","SLSettingsPanel",None,None,None,None,None,None),
- (3,19,"GtkOverlay","overlay",18,None,None,None,None,None),
- (3,30,"GtkBox","loading_overlay",None,None,None,None,None,None),
- (3,31,"GtkSpinner",None,30,None,None,None,None,None),
- (3,32,"GtkLabel",None,30,None,None,None,1,None),
- (3,33,"GtkBox","error_overlay",None,None,None,None,None,None),
- (3,35,"GtkLabel","error_label",33,None,None,None,1,None),
- (3,45,"GtkBox",None,33,None,None,None,None,None),
- (3,46,"GtkButton","error_refresh_button",45,None,None,None,None,None),
- (3,47,"GtkButton","error_close_button",45,None,None,None,1,None),
- (3,48,"GtkBox","content_wrapper",19,None,None,None,-1,None),
- (3,49,"GtkGrid","content",48,None,None,None,None,None),
- (3,51,"GtkLabel","stats_label",49,None,None,None,1,None),
- (3,52,"GtkLabel","email_label",49,None,None,None,2,None),
- (3,53,"GtkButton","logout_button",49,None,None,None,3,None),
- (3,55,"GtkLabel",None,49,None,None,None,5,None),
- (3,57,"GtkLabel",None,49,None,None,None,7,None),
- (3,58,"GtkPasswordEntry","api_key_field",49,None,None,None,8,None),
- (3,59,"GtkLabel","status_label",49,None,None,None,9,None),
- (3,60,"GtkButton","api_key_clear_button",49,None,None,None,10,None),
- (3,63,"GtkButton","profile_image_button",49,None,None,None,None,""),
- (3,64,"GtkImage","profile_image",63,None,None,None,None,None),
- (3,65,"GtkBox",None,49,None,None,None,None,None),
- (3,66,"GtkButton","remove_picture_button",65,None,None,None,None,None),
- (3,67,"GtkEntry","name_label",65,None,None,None,1,None),
- (3,68,"GtkBox",None,49,None,None,None,None,None),
- (3,69,"GtkButton","edit_button",68,None,None,None,None,None),
- (3,70,"GtkButton","cancel_edit_button",68,None,None,None,1,None),
- (4,11,"GtkPopover","device_entry_popover",None,None,None,None,None,None),
- (4,12,"GtkLabel",None,11,None,None,None,None,None),
- (4,13,"GtkApplicationWindow","LoginWindow",None,None,None,None,None,None),
- (4,14,"GtkBox",None,13,None,None,None,-1,None),
- (4,30,"GtkLabel",None,14,None,None,None,1,None),
- (4,31,"GtkOverlay","forms_overlay",14,None,None,None,None,None),
- (4,32,"GtkBox","forms_wrapper",31,None,None,None,None,None),
- (4,33,"GtkGrid",None,32,None,None,None,None,None),
- (4,34,"GtkLabel",None,33,None,None,None,None,None),
- (4,35,"GtkLabel","error_label",33,None,None,None,1,None),
- (4,36,"GtkEntry","device_entry",33,None,None,None,2,None),
- (4,37,"GtkLabel",None,33,None,None,None,3,None),
- (4,38,"GtkLabel",None,33,None,None,None,4,None),
- (4,39,"GtkLabel",None,33,None,None,None,5,None),
- (4,40,"GtkEntry","email_entry",33,None,None,None,6,None),
- (4,41,"GtkPasswordEntry","password_entry",33,None,None,None,7,None),
- (4,42,"GtkButton","login_button",33,None,None,None,8,None),
- (4,43,"GtkLabel",None,32,None,None,None,1,None),
- (4,44,"GtkBox",None,32,None,None,None,2,None),
- (4,45,"GtkLabel",None,44,None,None,None,None,None),
- (4,46,"GtkPasswordEntry","api_key_entry",44,None,None,None,1,None),
- (4,47,"GtkButton","api_key_button",44,None,None,None,2,None),
- (4,48,"GtkBox","loading_overlay",None,None,None,None,None,None),
- (4,49,"GtkSpinner",None,48,None,None,None,None,None),
- (4,50,"GtkLabel",None,48,None,None,None,1,None),
- (5,1,"GtkWindow","SLTotpDialog",None,None,None,None,None,None),
- (5,2,"GtkOverlay","overlay",1,None,None,None,-1,None),
- (5,11,"GtkBox","loading_overlay",None,None,None,None,None,None),
- (5,12,"GtkSpinner",None,11,None,None,None,None,None),
- (5,13,"GtkLabel",None,11,None,None,None,1,None),
- (5,14,"GtkGrid","form_wrapper",2,None,None,None,None,None),
- (5,15,"GtkBox",None,14,None,None,None,None,None),
- (5,16,"GtkImage",None,15,None,None,None,None,None),
- (5,17,"GtkLabel",None,15,None,None,None,1,None),
- (5,19,"GtkButton","accept_button",14,None,None,None,2,None),
- (5,20,"GtkButton","cancel_button",14,None,None,None,3,None),
- (5,21,"GtkEntry","code_entry",14,None,None,None,4,None),
- (5,23,"GtkLabel","error_label",14,None,None,None,4,None)
-
-
- (1,3,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
- (1,3,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (1,5,"GtkSearchEntry","placeholder-text","Filter by email, description, etc.",None,None,None,None,None,None,None,None,None),
- (1,5,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (1,8,"GtkDropDown","model",None,None,None,None,None,9,None,None,None,None),
- (1,8,"GtkDropDown","selected","0",None,None,None,None,None,None,None,None,None),
- (1,8,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (1,10,"GtkButton","label","Search",None,None,None,None,None,None,None,None,None),
- (1,12,"GtkButton","label","New",None,None,None,None,None,None,None,None,None),
- (1,13,"GtkButton","label","Edit",None,None,None,None,None,None,None,None,None),
- (1,14,"GtkButton","label","Delete",None,None,None,None,None,None,None,None,None),
- (1,22,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
- (1,23,"GtkSpinner","spinning","True",None,None,None,None,None,None,None,None,None),
- (1,23,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
- (1,23,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (1,24,"GtkLabel","label","Loading...",None,None,None,None,None,None,None,None,None),
- (1,24,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
- (1,24,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (1,28,"GtkButton","icon-name","go-previous-symbolic",None,None,None,None,None,None,None,None,None),
- (1,28,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
- (1,28,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (1,29,"GtkButton","icon-name","go-next-symbolic",None,None,None,None,None,None,None,None,None),
- (1,30,"GtkEditable","max-width-chars","0",None,None,None,None,None,None,None,None,None),
- (1,30,"GtkEditable","text","1",None,None,None,None,None,None,None,None,None),
- (1,30,"GtkEditable","width-chars","5",None,None,None,None,None,None,None,None,None),
- (1,30,"GtkEditable","xalign","0.5",None,None,None,None,None,None,None,None,None),
- (1,30,"GtkEntry","has-frame","False",None,None,None,None,None,None,None,None,None),
- (1,30,"GtkEntry","input-hints","no-emoji | no-spellcheck",None,None,None,None,None,None,None,None,None),
- (1,30,"GtkEntry","input-purpose","digits",None,None,None,None,None,None,None,None,None),
- (1,30,"GtkEntry","truncate-multiline","True",None,None,None,None,None,None,None,None,None),
- (1,32,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (1,33,"GtkListView","factory",None,None,None,None,None,34,None,None,None,None),
- (1,33,"GtkListView","model",None,None,None,None,None,35,None,None,None,None),
- (1,36,"GtkLabel","label","No more results",None,None,None,None,None,None,None,None,None),
- (1,36,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (1,36,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (1,37,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
- (1,37,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (1,38,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
- (1,38,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
- (1,39,"GtkButton","icon-name","view-refresh-symbolic",None,None,None,None,None,None,None,None,None),
- (1,39,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
- (1,39,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
- (1,39,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (1,40,"GtkButton","icon-name","window-close-symbolic",None,None,None,None,None,None,None,None,None),
- (1,40,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
- (1,40,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
- (1,41,"GtkLabel","label","ERROR",None,None,None,None,None,None,None,None,None),
- (1,41,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
- (1,41,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (3,19,"GtkOverlay","child","48",None,None,None,None,None,None,None,None,None),
- (3,19,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (3,30,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
- (3,30,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (3,31,"GtkSpinner","spinning","True",None,None,None,None,None,None,None,None,None),
- (3,31,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
- (3,31,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (3,32,"GtkLabel","label","Loading...",None,None,None,None,None,None,None,None,None),
- (3,32,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
- (3,32,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (3,33,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
- (3,33,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (3,35,"GtkLabel","label","ERROR",None,None,None,None,None,None,None,None,None),
- (3,35,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
- (3,35,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (3,45,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
- (3,45,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
- (3,46,"GtkButton","icon-name","view-refresh-symbolic",None,None,None,None,None,None,None,None,None),
- (3,46,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
- (3,46,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
- (3,46,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (3,47,"GtkButton","icon-name","window-close-symbolic",None,None,None,None,None,None,None,None,None),
- (3,47,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
- (3,47,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
- (3,48,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (3,48,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (3,49,"GtkGrid","row-homogeneous","True",None,None,None,None,None,None,None,None,None),
- (3,49,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (3,49,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
- (3,51,"GtkLabel","label","Stats go here",None,None,None,None,None,None,None,None,None),
- (3,51,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
- (3,51,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (3,52,"GtkLabel","label","mctesterface@test.tld",None,None,None,None,None,None,None,None,None),
- (3,52,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None),
- (3,52,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (3,53,"GtkButton","label","Logout",None,None,None,None,None,None,None,None,None),
- (3,53,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
- (3,53,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
- (3,55,"GtkLabel","label","Account Status:",None,None,None,None,None,None,None,None,None),
- (3,55,"GtkLabel","xalign","1.0",None,None,None,None,None,None,None,None,None),
- (3,55,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
- (3,57,"GtkLabel","label","Api Key:",None,None,None,None,None,None,None,None,None),
- (3,57,"GtkLabel","xalign","1.0",None,None,None,None,None,None,None,None,None),
- (3,57,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
- (3,58,"GtkEditable","editable","False",None,None,None,None,None,None,None,None,None),
- (3,58,"GtkEditable","enable-undo","False",None,None,None,None,None,None,None,None,None),
- (3,58,"GtkPasswordEntry","show-peek-icon","True",None,None,None,None,None,None,None,None,None),
- (3,58,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (3,58,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
- (3,59,"GtkLabel","label","Premium",None,None,None,None,None,None,None,None,None),
- (3,59,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None),
- (3,59,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (3,60,"GtkButton","label","Clear",None,None,None,None,None,None,None,None,None),
- (3,60,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
- (3,60,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
- (3,63,"GtkButton","has-frame","False",None,None,None,None,None,None,None,None,None),
- (3,64,"GtkImage","icon-name","user-info-symbolic",None,None,None,None,None,None,None,None,None),
- (3,64,"GtkImage","icon-size","large",None,None,None,None,None,None,None,None,None),
- (3,64,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
- (3,64,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
- (3,64,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
- (3,64,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (3,66,"GtkButton","icon-name","window-close-symbolic",None,None,None,None,None,None,None,None,None),
- (3,67,"GtkEditable","editable","False",None,None,None,None,None,None,None,None,None),
- (3,67,"GtkEditable","text","Testy McTesterface",None,None,None,None,None,None,None,None,None),
- (3,67,"GtkEntry","has-frame","False",None,None,None,None,None,None,None,None,None),
- (3,67,"GtkEntry","input-hints","no-emoji | no-spellcheck",None,None,None,None,None,None,None,None,None),
- (3,67,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (3,69,"GtkButton","label","Edit",None,None,None,None,None,None,None,None,None),
- (3,69,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
- (3,69,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
- (3,70,"GtkButton","label","Cancel",None,None,None,None,None,None,None,None,None),
- (4,11,"GtkPopover","child",None,None,None,None,None,12,None,None,None,None),
- (4,12,"GtkAccessible","accessible-role","tooltip",None,None,None,None,None,None,None,None,None),
- (4,12,"GtkLabel","label","This is the human readable name that will show up in the API key section of the SimpleLogin website.",None,None,None,None,None,None,None,None,None),
- (4,12,"GtkLabel","max-width-chars","30",None,None,None,None,None,None,None,None,None),
- (4,12,"GtkLabel","wrap","True",None,None,None,None,None,None,None,None,None),
- (4,13,"GtkWindow","title","SimpleLogin",None,None,None,None,None,None,None,None,None),
- (4,14,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
- (4,30,"GtkLabel","label","Don't have an account? You can register <a href=\"https://app.simplelogin.io/auth/register\">here</a>.",None,None,None,None,None,None,None,None,None),
- (4,30,"GtkLabel","use-markup","True",None,None,None,None,None,None,None,None,None),
- (4,30,"GtkLabel","yalign","0.0",None,None,None,None,None,None,None,None,None),
- (4,30,"GtkWidget","margin-bottom","10",None,None,None,None,None,None,None,None,None),
- (4,30,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
- (4,30,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (4,31,"GtkOverlay","child","32",None,None,None,None,None,None,None,None,None),
- (4,31,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
- (4,31,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (4,32,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
- (4,32,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (4,33,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
- (4,33,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (4,33,"GtkWidget","margin-bottom","10",None,None,None,None,None,None,None,None,None),
- (4,33,"GtkWidget","margin-end","10",None,None,None,None,None,None,None,None,None),
- (4,33,"GtkWidget","margin-start","10",None,None,None,None,None,None,None,None,None),
- (4,33,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
- (4,33,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
- (4,34,"GtkLabel","label","Login:",None,None,None,None,None,None,None,None,None),
- (4,34,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (4,34,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
- (4,34,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (4,35,"GtkLabel","label","ERROR",None,None,None,None,None,None,None,None,None),
- (4,35,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
- (4,36,"GtkEditable","width-chars","18",None,None,None,None,None,None,None,None,None),
- (4,36,"GtkEntry","placeholder-text","My Awesome Computer",None,None,None,None,None,None,None,None,None),
- (4,36,"GtkEntry","secondary-icon-name","dialog-question-symbolic",None,None,None,None,None,None,None,None,None),
- (4,36,"GtkEntry","truncate-multiline","True",None,None,None,None,None,None,None,None,None),
- (4,36,"GtkWidget","margin-start","6",None,None,None,None,None,None,None,None,None),
- (4,37,"GtkLabel","label","Device:",None,None,None,None,None,None,None,None,None),
- (4,37,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None),
- (4,38,"GtkLabel","label","Email:",None,None,None,None,None,None,None,None,None),
- (4,38,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None),
- (4,39,"GtkLabel","label","Password:",None,None,None,None,None,None,None,None,None),
- (4,39,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None),
- (4,40,"GtkEntry","input-purpose","email",None,None,None,None,None,None,None,None,None),
- (4,40,"GtkEntry","truncate-multiline","True",None,None,None,None,None,None,None,None,None),
- (4,40,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (4,40,"GtkWidget","margin-start","6",None,None,None,None,None,None,None,None,None),
- (4,40,"GtkWidget","receives-default","True",None,None,None,None,None,None,None,None,None),
- (4,41,"GtkPasswordEntry","show-peek-icon","True",None,None,None,None,None,None,None,None,None),
- (4,41,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (4,41,"GtkWidget","margin-start","6",None,None,None,None,None,None,None,None,None),
- (4,42,"GtkButton","label","Login",None,None,None,None,None,None,None,None,None),
- (4,42,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
- (4,42,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
- (4,42,"GtkWidget","sensitive","False",None,None,None,None,None,None,None,None,None),
- (4,42,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
- (4,43,"GtkLabel","justify","center",None,None,None,None,None,None,None,None,None),
- (4,43,"GtkLabel","label","- or -",None,None,None,None,None,None,None,None,None),
- (4,43,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
- (4,44,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
- (4,44,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
- (4,44,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (4,44,"GtkWidget","margin-bottom","10",None,None,None,None,None,None,None,None,None),
- (4,44,"GtkWidget","margin-end","10",None,None,None,None,None,None,None,None,None),
- (4,44,"GtkWidget","margin-start","10",None,None,None,None,None,None,None,None,None),
- (4,44,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
- (4,44,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
- (4,45,"GtkLabel","label","Set API Key:",None,None,None,None,None,None,None,None,None),
- (4,45,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (4,45,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
- (4,46,"GtkEditable","width-chars","27",None,None,None,None,None,None,None,None,None),
- (4,46,"GtkPasswordEntry","show-peek-icon","True",None,None,None,None,None,None,None,None,None),
- (4,46,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (4,46,"GtkWidget","margin-end","3",None,None,None,None,None,None,None,None,None),
- (4,46,"GtkWidget","margin-start","8",None,None,None,None,None,None,None,None,None),
- (4,47,"GtkButton","label","Accept",None,None,None,None,None,None,None,None,None),
- (4,47,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
- (4,47,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
- (4,47,"GtkWidget","sensitive","False",None,None,None,None,None,None,None,None,None),
- (4,48,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
- (4,49,"GtkSpinner","spinning","True",None,None,None,None,None,None,None,None,None),
- (4,49,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
- (4,49,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (4,50,"GtkLabel","label","Loading...",None,None,None,None,None,None,None,None,None),
- (4,50,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
- (4,50,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (5,1,"GtkWindow","modal","True",None,None,None,None,None,None,None,None,None),
- (5,1,"GtkWindow","title","TOTP Entry",None,None,None,None,None,None,None,None,None),
- (5,2,"GtkOverlay","child","14",None,None,None,None,None,None,None,None,None),
- (5,2,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
- (5,2,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (5,2,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
- (5,2,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (5,11,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
- (5,12,"GtkSpinner","spinning","True",None,None,None,None,None,None,None,None,None),
- (5,12,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
- (5,12,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (5,13,"GtkLabel","label","Loading...",None,None,None,None,None,None,None,None,None),
- (5,13,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
- (5,13,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (5,14,"GtkGrid","column-spacing","5",None,None,None,None,None,None,None,None,None),
- (5,14,"GtkGrid","row-spacing","5",None,None,None,None,None,None,None,None,None),
- (5,14,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
- (5,14,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (5,14,"GtkWidget","margin-bottom","10",None,None,None,None,None,None,None,None,None),
- (5,14,"GtkWidget","margin-end","10",None,None,None,None,None,None,None,None,None),
- (5,14,"GtkWidget","margin-start","10",None,None,None,None,None,None,None,None,None),
- (5,14,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
- (5,14,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
- (5,14,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
- (5,15,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
- (5,15,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
- (5,16,"GtkImage","icon-name","dialog-password-symbolic",None,None,None,None,None,None,None,None,None),
- (5,16,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
- (5,17,"GtkLabel","label","TOTP",None,None,None,None,None,None,None,None,None),
- (5,19,"GtkButton","label","Accept",None,None,None,None,None,None,None,None,None),
- (5,20,"GtkButton","label","Cancel",None,None,None,None,None,None,None,None,None),
- (5,21,"GtkEntry","placeholder-text","TOTP Code",None,None,None,None,None,None,None,None,None),
- (5,23,"GtkLabel","label","ERROR",None,None,None,None,None,None,None,None,None)
-
-
- (3,49,51,"GtkGridLayoutChild","column","0",None,None,None,None),
- (3,49,51,"GtkGridLayoutChild","column-span","3",None,None,None,None),
- (3,49,51,"GtkGridLayoutChild","row","2",None,None,None,None),
- (3,49,51,"GtkGridLayoutChild","row-span","1",None,None,None,None),
- (3,49,52,"GtkGridLayoutChild","column","1",None,None,None,None),
- (3,49,52,"GtkGridLayoutChild","row","1",None,None,None,None),
- (3,49,53,"GtkGridLayoutChild","column","2",None,None,None,None),
- (3,49,53,"GtkGridLayoutChild","row","1",None,None,None,None),
- (3,49,55,"GtkGridLayoutChild","column","0",None,None,None,None),
- (3,49,55,"GtkGridLayoutChild","column-span","1",None,None,None,None),
- (3,49,55,"GtkGridLayoutChild","row","3",None,None,None,None),
- (3,49,55,"GtkGridLayoutChild","row-span","1",None,None,None,None),
- (3,49,57,"GtkGridLayoutChild","column","0",None,None,None,None),
- (3,49,57,"GtkGridLayoutChild","row","4",None,None,None,None),
- (3,49,58,"GtkGridLayoutChild","column","1",None,None,None,None),
- (3,49,58,"GtkGridLayoutChild","row","4",None,None,None,None),
- (3,49,59,"GtkGridLayoutChild","column","1",None,None,None,None),
- (3,49,59,"GtkGridLayoutChild","column-span","1",None,None,None,None),
- (3,49,59,"GtkGridLayoutChild","row","3",None,None,None,None),
- (3,49,59,"GtkGridLayoutChild","row-span","1",None,None,None,None),
- (3,49,60,"GtkGridLayoutChild","column","2",None,None,None,None),
- (3,49,60,"GtkGridLayoutChild","row","4",None,None,None,None),
- (3,49,63,"GtkGridLayoutChild","column","0",None,None,None,None),
- (3,49,63,"GtkGridLayoutChild","column-span","1",None,None,None,None),
- (3,49,63,"GtkGridLayoutChild","row-span","2",None,None,None,None),
- (3,49,65,"GtkGridLayoutChild","column","1",None,None,None,None),
- (3,49,65,"GtkGridLayoutChild","column-span","1",None,None,None,None),
- (3,49,65,"GtkGridLayoutChild","row","0",None,None,None,None),
- (3,49,65,"GtkGridLayoutChild","row-span","1",None,None,None,None),
- (3,49,68,"GtkGridLayoutChild","column","2",None,None,None,None),
- (3,49,68,"GtkGridLayoutChild","column-span","1",None,None,None,None),
- (3,49,68,"GtkGridLayoutChild","row","0",None,None,None,None),
- (3,49,68,"GtkGridLayoutChild","row-span","1",None,None,None,None),
- (4,33,34,"GtkGridLayoutChild","column","0",None,None,None,None),
- (4,33,34,"GtkGridLayoutChild","column-span","2",None,None,None,None),
- (4,33,34,"GtkGridLayoutChild","row","0",None,None,None,None),
- (4,33,35,"GtkGridLayoutChild","column","0",None,None,None,None),
- (4,33,35,"GtkGridLayoutChild","column-span","2",None,None,None,None),
- (4,33,35,"GtkGridLayoutChild","row","4",None,None,None,None),
- (4,33,36,"GtkGridLayoutChild","column","1",None,None,None,None),
- (4,33,36,"GtkGridLayoutChild","row","3",None,None,None,None),
- (4,33,37,"GtkGridLayoutChild","column","0",None,None,None,None),
- (4,33,37,"GtkGridLayoutChild","row","3",None,None,None,None),
- (4,33,38,"GtkGridLayoutChild","column","0",None,None,None,None),
- (4,33,38,"GtkGridLayoutChild","row","1",None,None,None,None),
- (4,33,39,"GtkGridLayoutChild","column","0",None,None,None,None),
- (4,33,39,"GtkGridLayoutChild","row","2",None,None,None,None),
- (4,33,40,"GtkGridLayoutChild","column","1",None,None,None,None),
- (4,33,40,"GtkGridLayoutChild","row","1",None,None,None,None),
- (4,33,41,"GtkGridLayoutChild","column","1",None,None,None,None),
- (4,33,41,"GtkGridLayoutChild","row","2",None,None,None,None),
- (4,33,42,"GtkGridLayoutChild","column","0",None,None,None,None),
- (4,33,42,"GtkGridLayoutChild","column-span","2",None,None,None,None),
- (4,33,42,"GtkGridLayoutChild","row","5",None,None,None,None),
- (5,14,15,"GtkGridLayoutChild","column","0",None,None,None,None),
- (5,14,15,"GtkGridLayoutChild","column-span","2",None,None,None,None),
- (5,14,15,"GtkGridLayoutChild","row","0",None,None,None,None),
- (5,14,19,"GtkGridLayoutChild","column","1",None,None,None,None),
- (5,14,19,"GtkGridLayoutChild","row","3",None,None,None,None),
- (5,14,20,"GtkGridLayoutChild","column","0",None,None,None,None),
- (5,14,20,"GtkGridLayoutChild","row","3",None,None,None,None),
- (5,14,21,"GtkGridLayoutChild","column","0",None,None,None,None),
- (5,14,21,"GtkGridLayoutChild","column-span","2",None,None,None,None),
- (5,14,21,"GtkGridLayoutChild","row","1",None,None,None,None),
- (5,14,23,"GtkGridLayoutChild","column-span","2",None,None,None,None),
- (5,14,23,"GtkGridLayoutChild","row","2",None,None,None,None)
-
-
- (4,34,"GtkWidget",1,1,None,None,None,None,None,None),
- (4,34,"GtkWidget",2,2,None,1,None,None,None,None),
- (4,35,"GtkWidget",1,1,None,None,None,None,None,None),
- (4,35,"GtkWidget",2,2,None,1,None,None,None,None),
- (4,40,"GtkWidget",1,1,None,None,None,None,None,None),
- (4,33,"GtkWidget",1,1,None,None,None,None,None,None),
- (4,33,"GtkWidget",2,2,None,1,None,None,None,None),
- (4,45,"GtkWidget",1,1,None,None,None,None,None,None),
- (4,45,"GtkWidget",2,2,None,1,None,None,None,None),
- (1,9,"GtkStringList",2,5,"Disabled only",1,None,None,None,None),
- (1,9,"GtkStringList",2,4,"Enabled only",1,None,None,None,None),
- (1,9,"GtkStringList",2,3,"Pinned only",1,None,None,None,None),
- (1,9,"GtkStringList",2,2,"All aliases",1,None,None,None,None),
- (1,9,"GtkStringList",1,1,None,None,None,None,None,None),
- (1,22,"GtkWidget",1,1,None,None,None,None,None,None),
- (1,22,"GtkWidget",2,2,None,1,None,None,None,None),
- (1,24,"GtkWidget",1,1,None,None,None,None,None,None),
- (1,24,"GtkWidget",2,2,None,1,None,None,None,None),
- (1,23,"GtkWidget",1,1,None,None,None,None,None,None),
- (1,23,"GtkWidget",2,2,None,1,None,None,None,None),
- (4,49,"GtkWidget",1,1,None,None,None,None,None,None),
- (4,49,"GtkWidget",2,2,None,1,None,None,None,None),
- (4,50,"GtkWidget",1,1,None,None,None,None,None,None),
- (4,50,"GtkWidget",2,2,None,1,None,None,None,None),
- (4,48,"GtkWidget",1,1,None,None,None,None,None,None),
- (4,48,"GtkWidget",2,2,None,1,None,None,None,None),
- (5,17,"GtkWidget",1,1,None,None,None,None,None,None),
- (5,17,"GtkWidget",2,2,None,1,None,None,None,None),
- (5,23,"GtkWidget",1,1,None,None,None,None,None,None),
- (5,23,"GtkWidget",2,2,None,1,None,None,None,None),
- (5,13,"GtkWidget",2,2,None,1,None,None,None,None),
- (5,13,"GtkWidget",1,1,None,None,None,None,None,None),
- (5,12,"GtkWidget",2,2,None,1,None,None,None,None),
- (5,12,"GtkWidget",1,1,None,None,None,None,None,None),
- (5,11,"GtkWidget",2,2,None,1,None,None,None,None),
- (5,11,"GtkWidget",1,1,None,None,None,None,None,None),
- (1,36,"GtkWidget",1,1,None,None,None,None,None,None),
- (1,36,"GtkWidget",2,2,None,1,None,None,None,None),
- (3,31,"GtkWidget",1,1,None,None,None,None,None,None),
- (3,31,"GtkWidget",2,2,None,1,None,None,None,None),
- (3,32,"GtkWidget",1,1,None,None,None,None,None,None),
- (3,32,"GtkWidget",2,2,None,1,None,None,None,None),
- (3,30,"GtkWidget",1,1,None,None,None,None,None,None),
- (3,30,"GtkWidget",2,2,None,1,None,None,None,None),
- (3,57,"GtkLabel",1,1,None,None,None,None,None,None),
- (1,39,"GtkWidget",1,1,None,None,None,None,None,None),
- (1,39,"GtkWidget",2,2,None,1,None,None,None,None),
- (1,40,"GtkWidget",1,1,None,None,None,None,None,None),
- (1,40,"GtkWidget",2,2,None,1,None,None,None,None),
- (1,41,"GtkWidget",1,1,None,None,None,None,None,None),
- (1,41,"GtkWidget",2,2,None,1,None,None,None,None),
- (1,41,"GtkWidget",2,3,None,1,None,None,None,None),
- (3,67,"GtkWidget",1,1,None,None,None,None,None,None),
- (3,67,"GtkWidget",2,2,None,1,None,None,None,None),
- (3,47,"GtkWidget",2,2,None,1,None,None,None,None),
- (3,47,"GtkWidget",1,1,None,None,None,None,None,None),
- (3,46,"GtkWidget",2,2,None,1,None,None,None,None),
- (3,46,"GtkWidget",1,1,None,None,None,None,None,None),
- (3,35,"GtkWidget",2,3,None,1,None,None,None,None),
- (3,35,"GtkWidget",2,2,None,1,None,None,None,None),
- (3,35,"GtkWidget",1,1,None,None,None,None,None,None)
-
-
- (4,34,"GtkWidget",2,2,"name","login-title-label"),
- (4,35,"GtkWidget",2,2,"name","error-message-label"),
- (4,33,"GtkWidget",2,2,"name","login-form-warpper"),
- (4,45,"GtkWidget",2,2,"name","login-title-label"),
- (1,9,"GtkStringList",2,5,"translatable",None),
- (1,9,"GtkStringList",2,5,"context",None),
- (1,9,"GtkStringList",2,5,"comments",None),
- (1,9,"GtkStringList",2,4,"translatable",None),
- (1,9,"GtkStringList",2,4,"context",None),
- (1,9,"GtkStringList",2,4,"comments",None),
- (1,9,"GtkStringList",2,3,"translatable",None),
- (1,9,"GtkStringList",2,3,"context",None),
- (1,9,"GtkStringList",2,3,"comments",None),
- (1,9,"GtkStringList",2,2,"translatable",None),
- (1,9,"GtkStringList",2,2,"context",None),
- (1,9,"GtkStringList",2,2,"comments",None),
- (1,24,"GtkWidget",2,2,"name","loading-label"),
- (1,22,"GtkWidget",2,2,"name","loading-label"),
- (1,23,"GtkWidget",2,2,"name","loading-label"),
- (4,49,"GtkWidget",2,2,"name","loading-label"),
- (4,50,"GtkWidget",2,2,"name","loading-label"),
- (4,48,"GtkWidget",2,2,"name","loading-label"),
- (5,17,"GtkWidget",2,2,"name","login-title-label"),
- (5,23,"GtkWidget",2,2,"name","error-message-label"),
- (5,13,"GtkWidget",2,2,"name","loading-label"),
- (5,12,"GtkWidget",2,2,"name","loading-label"),
- (5,11,"GtkWidget",2,2,"name","loading-label"),
- (1,36,"GtkWidget",2,2,"name","loading-label"),
- (3,31,"GtkWidget",2,2,"name","loading-label"),
- (3,32,"GtkWidget",2,2,"name","loading-label"),
- (3,30,"GtkWidget",2,2,"name","loading-label"),
- (1,39,"GtkWidget",2,2,"name","loading-label"),
- (1,40,"GtkWidget",2,2,"name","loading-label"),
- (1,41,"GtkWidget",2,2,"name","error-message-label"),
- (1,41,"GtkWidget",2,3,"name","loading-label"),
- (3,67,"GtkWidget",2,2,"name","login-title-label"),
- (3,47,"GtkWidget",2,2,"name","loading-label"),
- (3,46,"GtkWidget",2,2,"name","loading-label"),
- (3,35,"GtkWidget",2,3,"name","loading-label"),
- (3,35,"GtkWidget",2,2,"name","error-message-label")
-
-
diff --git a/simplelogin-gui/res.old/subprojects/blueprint-compiler.wrap b/simplelogin-gui/res.old/subprojects/blueprint-compiler.wrap
deleted file mode 100644
index 521d368..0000000
--- a/simplelogin-gui/res.old/subprojects/blueprint-compiler.wrap
+++ /dev/null
@@ -1,8 +0,0 @@
-[wrap-git]
-directory = blueprint-compiler
-url = https://gitlab.gnome.org/jwestman/blueprint-compiler.git
-revision = v0.10.0
-depth = 1
-
-[provide]
-program_names = blueprint-compiler
\ No newline at end of file
diff --git a/simplelogin-gui/res.old/totp-dialog.blp b/simplelogin-gui/res.old/totp-dialog.blp
deleted file mode 100644
index 43b4d0c..0000000
--- a/simplelogin-gui/res.old/totp-dialog.blp
+++ /dev/null
@@ -1,121 +0,0 @@
-using Gtk 4.0;
-
-template $SLTotpDialog : Window {
- modal: true;
- title: "TOTP Entry";
-
- Overlay overlay {
- child: form_wrapper;
- halign: center;
- hexpand: true;
- valign: center;
- vexpand: true;
-
- Grid form_wrapper {
- column-spacing: 5;
- halign: center;
- hexpand: true;
- margin-bottom: 10;
- margin-end: 10;
- margin-start: 10;
- margin-top: 10;
- row-spacing: 5;
- valign: center;
- vexpand: true;
-
- Box {
- halign: center;
- hexpand: true;
-
- Image {
- halign: center;
- icon-name: "dialog-password-symbolic";
- }
-
- Label {
- label: "TOTP";
-
- styles [
- "login-title-label",
- ]
- }
-
- layout {
- column: "0";
- column-span: "2";
- row: "0";
- }
- }
-
- Button accept_button {
- label: "Accept";
-
- layout {
- column: "1";
- row: "3";
- }
- }
-
- Button cancel_button {
- label: "Cancel";
-
- layout {
- column: "0";
- row: "3";
- }
- }
-
- Entry code_entry {
- placeholder-text: "TOTP Code";
-
- layout {
- column: "0";
- column-span: "2";
- row: "1";
- }
- }
-
- Label error_label {
- label: "ERROR";
-
- styles [
- "error-message-label",
- ]
-
- layout {
- column: "0";
- column-span: "2";
- row: "2";
- }
- }
- }
- }
-}
-
-Box loading_overlay {
- orientation: vertical;
-
- Spinner {
- spinning: true;
- valign: end;
- vexpand: true;
-
- styles [
- "loading-label",
- ]
- }
-
- Label {
- label: "Loading...";
- valign: start;
- vexpand: true;
-
- styles [
- "loading-label",
- ]
- }
-
- styles [
- "loading-label",
- ]
-}
diff --git a/simplelogin-gui/res.old/totp-dialog.ui b/simplelogin-gui/res.old/totp-dialog.ui
deleted file mode 100644
index e6dd234..0000000
--- a/simplelogin-gui/res.old/totp-dialog.ui
+++ /dev/null
@@ -1,124 +0,0 @@
-
-
-
-
-
- True
- TOTP Entry
-
-
- form_wrapper
- center
- True
- center
- True
-
-
- 5
- center
- True
- 10
- 10
- 10
- 10
- 5
- center
- True
-
-
- center
- True
-
-
- center
- dialog-password-symbolic
-
-
-
-
- TOTP
-
-
-
-
- 0
- 2
- 0
-
-
-
-
-
- Accept
-
- 1
- 3
-
-
-
-
-
- Cancel
-
- 0
- 3
-
-
-
-
-
- TOTP Code
-
- 0
- 2
- 1
-
-
-
-
-
- ERROR
-
-
- 0
- 2
- 2
-
-
-
-
-
-
-
-
-
- vertical
-
-
- True
- end
- True
-
-
-
-
-
- Loading...
- start
- True
-
-
-
-
-
-
diff --git a/simplelogin-gui/src/application.rs b/simplelogin-gui/src/application.rs
index d98033d..9de1610 100644
--- a/simplelogin-gui/src/application.rs
+++ b/simplelogin-gui/src/application.rs
@@ -1,4 +1,7 @@
use crate::login_window::LoginWindow;
+use crate::tabbed_window::TabbedWindow;
+use crate::main_panel::MainPanel;
+use crate::settings_panel::SettingsPanel;
use gtk4 as gtk;
use gtk::{glib, gdk, gio, prelude::*, subclass::prelude::*};
@@ -46,7 +49,25 @@ mod imp {
}
fn activate_has_api_key(&self) {
- println!("Logged in with API Key: {}", self.api_key().unwrap());
+ let obj = &self.obj();
+ let main_panel = MainPanel::new(obj);
+ let settings_panel = SettingsPanel::new(obj);
+ let window = TabbedWindow::new(obj,
+ &[("Aliases", &main_panel.upcast()),
+ ("Settings", &settings_panel.clone().upcast())]);
+ let window_closure = window.clone();
+ settings_panel.connect_closure(
+ "api-key-cleared", false,
+ closure_local!(@weak-allow-none self as opt_this
+ => move |_: SettingsPanel| {
+ window_closure.close();
+ if let Some(this) = opt_this {
+ this.context.borrow_mut().set_api_key(None);
+ this.set_api_key(None);
+ this.activate_no_api_key();
+ }
+ }));
+ window.present();
}
}
@@ -103,3 +124,9 @@ impl Application {
&self.imp().context
}
}
+
+impl Default for Application {
+ fn default() -> Self {
+ Self::new(crate::APP_ID)
+ }
+}
diff --git a/simplelogin-gui/src/main.rs b/simplelogin-gui/src/main.rs
index 061ca39..ab21b9f 100644
--- a/simplelogin-gui/src/main.rs
+++ b/simplelogin-gui/src/main.rs
@@ -2,6 +2,8 @@ mod login_window;
mod totp_window;
mod application;
mod main_panel;
+mod settings_panel;
+mod tabbed_window;
use gtk4 as gtk;
use gtk::prelude::*;
diff --git a/simplelogin-gui/src/main_panel.rs b/simplelogin-gui/src/main_panel.rs
index af3d439..010026a 100644
--- a/simplelogin-gui/src/main_panel.rs
+++ b/simplelogin-gui/src/main_panel.rs
@@ -1,22 +1,61 @@
use gtk4 as gtk;
use gtk::{glib, prelude::*, subclass::prelude::*};
+use crate::application;
mod imp {
use super::*;
- use glib::subclass::Signal;
- use once_cell::sync::Lazy;
+ use std::cell::RefCell;
- #[derive(Debug, Default, gtk::CompositeTemplate)]
+ #[derive(Debug, Default, gtk::CompositeTemplate, glib::Properties)]
#[template(file = "data/main_panel.blp")]
+ #[properties(wrapper_type = super::MainPanel)]
pub struct MainPanel {
#[template_child]
pub overlay: TemplateChild,
+ #[template_child]
+ pub search_box: TemplateChild,
+ #[template_child]
+ pub view_dropdown: TemplateChild,
+ #[template_child]
+ pub search_button: TemplateChild,
+ #[template_child]
+ pub new_button: TemplateChild,
+ #[template_child]
+ pub edit_button: TemplateChild,
+ #[template_child]
+ pub delete_button: TemplateChild,
+ #[template_child]
+ pub prev_page_button: TemplateChild,
+ #[template_child]
+ pub page_label: TemplateChild,
+ #[template_child]
+ pub next_page_button: TemplateChild,
+ #[template_child]
+ pub scroll_overlay: TemplateChild,
+ #[template_child]
+ pub alias_list_view: TemplateChild,
+ #[template_child]
+ pub alias_item_factory: TemplateChild,
+ #[template_child]
+ pub alias_selection_model: TemplateChild,
+ #[template_child]
+ pub no_content_label: TemplateChild,
+ #[template_child]
+ pub error_overlay: TemplateChild,
+ #[template_child]
+ pub error_refresh_button: TemplateChild,
+ #[template_child]
+ pub error_close_button: TemplateChild,
+ #[template_child]
+ pub error_label: TemplateChild,
+ #[template_child]
+ pub loading_overlay: TemplateChild,
+ #[property(get, construct_only)]
+ pub application: RefCell,
}
#[gtk::template_callbacks]
- impl MainPanel {
-
- }
+ impl MainPanel {}
#[glib::object_subclass]
impl ObjectSubclass for MainPanel {
@@ -34,21 +73,20 @@ mod imp {
}
}
- impl ObjectImpl for MainPanel {
- fn signals() -> &'static [Signal] {
- static SIGNALS: Lazy> = Lazy::new(||
- vec![Signal::builder("logged-out").build(),
- Signal::builder("api-key-cleared").build()]);
- SIGNALS.as_ref()
- }
- }
-
+ #[glib::derived_properties]
+ impl ObjectImpl for MainPanel {}
impl BoxImpl for MainPanel {}
impl WidgetImpl for MainPanel {}
}
glib::wrapper! {
pub struct MainPanel(ObjectSubclass)
- @extends gtk::Widget, @implements gtk::Accessible,
- gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
+ @extends gtk::Widget, gtk::Box, @implements gtk::Accessible,
+ gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
+}
+
+impl MainPanel {
+ pub fn new(app: &application::Application) -> Self {
+ glib::Object::builder().property("application", app).build()
+ }
}
diff --git a/simplelogin-gui/src/settings_panel.rs b/simplelogin-gui/src/settings_panel.rs
new file mode 100644
index 0000000..341b3c4
--- /dev/null
+++ b/simplelogin-gui/src/settings_panel.rs
@@ -0,0 +1,115 @@
+use crate::application;
+use gtk4 as gtk;
+use gtk::{glib, prelude::*, subclass::prelude::*};
+
+mod imp {
+ use super::*;
+ use std::cell::RefCell;
+ use glib::subclass::Signal;
+ use once_cell::sync::Lazy;
+
+ #[derive(Debug, Default, glib::Properties, gtk::CompositeTemplate)]
+ #[template(file = "data/settings_panel.blp")]
+ #[properties(wrapper_type = super::SettingsPanel)]
+ pub struct SettingsPanel {
+ #[template_child]
+ pub overlay: TemplateChild,
+ #[template_child]
+ pub content_wrapper: TemplateChild,
+ #[template_child]
+ pub content: TemplateChild,
+ #[template_child]
+ pub profile_image_button: TemplateChild,
+ #[template_child]
+ pub profile_image: TemplateChild,
+ #[template_child]
+ pub remove_picture_button: TemplateChild,
+ #[template_child]
+ pub name_label: TemplateChild,
+ #[template_child]
+ pub edit_button: TemplateChild,
+ #[template_child]
+ pub cancel_edit_button: TemplateChild,
+ #[template_child]
+ pub stats_label: TemplateChild,
+ #[template_child]
+ pub email_label: TemplateChild,
+ #[template_child]
+ pub logout_button: TemplateChild,
+ #[template_child]
+ pub api_key_field: TemplateChild,
+ #[template_child]
+ pub status_label: TemplateChild,
+ #[template_child]
+ pub api_key_clear_button: TemplateChild,
+ #[template_child]
+ pub loading_overlay: TemplateChild,
+ #[template_child]
+ pub error_overlay: TemplateChild,
+ #[template_child]
+ pub error_refresh_button: TemplateChild,
+ #[template_child]
+ pub error_close_button: TemplateChild,
+ #[template_child]
+ pub error_label: TemplateChild,
+ #[property(get, construct_only)]
+ pub application: RefCell,
+ }
+
+ #[gtk::template_callbacks]
+ impl SettingsPanel {
+ #[template_callback]
+ fn clear_api_key_clicked(&self, _: >k::Button) {
+ // TODO ensure user is prompted before clear
+ self.obj().emit_by_name::<()>("api-key-cleared", &[]);
+ }
+ }
+
+ #[glib::object_subclass]
+ impl ObjectSubclass for SettingsPanel {
+ const NAME: &'static str = "SettingsPanel";
+ type Type = super::SettingsPanel;
+ type ParentType = gtk::Box;
+
+ fn class_init(class: &mut Self::Class) {
+ class.bind_template();
+ class.bind_template_callbacks();
+ }
+
+ fn instance_init(obj: &glib::subclass::InitializingObject) {
+ obj.init_template();
+ }
+ }
+
+ #[glib::derived_properties]
+ impl ObjectImpl for SettingsPanel {
+ fn signals() -> &'static [Signal] {
+ static SIGNALS: Lazy> = Lazy::new(||
+ vec![Signal::builder("logged-out").build(),
+ Signal::builder("api-key-cleared").build()]);
+ SIGNALS.as_ref()
+ }
+
+ fn constructed(&self) {
+ let api_key_opt = self.application.borrow().api_key();
+ if let Some(api_key) = api_key_opt {
+ self.api_key_field.set_text(api_key.as_str());
+ }
+ }
+ }
+
+ impl WidgetImpl for SettingsPanel {}
+ impl BoxImpl for SettingsPanel {}
+}
+
+glib::wrapper! {
+ pub struct SettingsPanel(ObjectSubclass)
+ @extends gtk::Widget, gtk::Box, @implements gtk::Accessible,
+ gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
+}
+
+impl SettingsPanel {
+ pub fn new(app: &application::Application) -> Self {
+ glib::Object::builder().property("application", app).build()
+ }
+}
diff --git a/simplelogin-gui/src/tabbed_window.rs b/simplelogin-gui/src/tabbed_window.rs
new file mode 100644
index 0000000..c5998bb
--- /dev/null
+++ b/simplelogin-gui/src/tabbed_window.rs
@@ -0,0 +1,50 @@
+use gtk4 as gtk;
+use gtk::{glib, gio, prelude::*, subclass::prelude::*};
+use crate::application;
+
+mod imp {
+ use super::*;
+
+ #[derive(Default, Debug)]
+ pub struct TabbedWindow {
+ pub inner_panel: gtk::Notebook,
+ }
+
+ #[glib::object_subclass]
+ impl ObjectSubclass for TabbedWindow {
+ const NAME: &'static str = "TabbedWindow";
+ type Type = super::TabbedWindow;
+ type ParentType = gtk::ApplicationWindow;
+ }
+
+ impl ObjectImpl for TabbedWindow {
+ fn constructed(&self) {
+ self.parent_constructed();
+ self.obj().set_child(Some(&self.inner_panel));
+ }
+ }
+
+ impl WidgetImpl for TabbedWindow {}
+ impl WindowImpl for TabbedWindow {}
+ impl ApplicationWindowImpl for TabbedWindow {}
+}
+
+glib::wrapper! {
+ pub struct TabbedWindow(ObjectSubclass)
+ @extends gtk::Widget, gtk::Window, gtk::ApplicationWindow,
+ @implements gio::ActionMap, gio::ActionGroup;
+}
+
+impl TabbedWindow {
+ pub fn new(app: &application::Application, tabs: &[(&str, >k::Widget)]) -> Self {
+ let obj: Self = glib::Object::builder().property("application", app).build();
+ for tab in tabs {
+ obj.add_tab(tab.0, tab.1);
+ }
+ obj.clone()
+ }
+
+ pub fn add_tab>(&self, title: &str, content: &P) {
+ self.imp().inner_panel.append_page(content, Some(>k::Label::new(Some(title))));
+ }
+}