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 @@ - - - - - - - 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 @@ - - - - - - - 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)))); + } +}