diff --git a/simplelogin-gui/data/main_panel.blp b/simplelogin-gui/data/main_panel.blp
new file mode 100644
index 0000000..c4899ee
--- /dev/null
+++ b/simplelogin-gui/data/main_panel.blp
@@ -0,0 +1,162 @@
+using Gtk 4.0;
+
+template $MainPanel : Box {
+ Overlay overlay {
+ child: Box content_wrapper {
+ orientation: vertical;
+ vexpand: true;
+
+ Box {
+ SearchEntry search_box {
+ hexpand: true;
+ placeholder-text: "Filter by email, description, etc.";
+ }
+
+ DropDown view_dropdown {
+ hexpand: true;
+ selected: 0;
+ model: StringList {
+ strings ["All aliases", "Pinned only", "Enabled only", "Disabled only",]
+ };
+ }
+
+ Button search_button {
+ label: "Search";
+ }
+ }
+
+ Box {
+ Button new_button {
+ label: "New";
+ }
+
+ Button edit_button {
+ label: "Edit";
+ }
+
+ Button delete_button {
+ label: "Delete";
+ }
+
+ Button prev_page_button {
+ halign: end;
+ hexpand: true;
+ icon-name: "go-previous-symbolic";
+ }
+
+ Entry page_label {
+ has-frame: false;
+ input-hints: no_emoji | no_spellcheck;
+ input-purpose: digits;
+ max-width-chars: 0;
+ text: "1";
+ truncate-multiline: true;
+ width-chars: 5;
+ xalign: 0.5;
+ }
+
+ Button next_page_button {
+ icon-name: "go-next-symbolic";
+ }
+ }
+
+ Overlay scroll_overlay {
+ child: ScrolledWindow {
+ vexpand: true;
+
+ ListView alias_list_view {
+ factory: SignalListItemFactory alias_item_factory {
+ };
+
+ model: MultiSelection alias_selection_model {
+ };
+ }
+ };
+
+ [overlay]
+ Label no_content_label {
+ hexpand: true;
+ label: "No more results";
+ vexpand: true;
+
+ 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",
+ ]
+ }
+ }
+
+ [overlay]
+ 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/main-panel.ui b/simplelogin-gui/res.old/main-panel.ui
index 873787e..eb5a30f 100644
--- a/simplelogin-gui/res.old/main-panel.ui
+++ b/simplelogin-gui/res.old/main-panel.ui
@@ -21,16 +21,16 @@
diff --git a/simplelogin-gui/res.old/totp-dialog.blp b/simplelogin-gui/res.old/totp-dialog.blp
new file mode 100644
index 0000000..43b4d0c
--- /dev/null
+++ b/simplelogin-gui/res.old/totp-dialog.blp
@@ -0,0 +1,121 @@
+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/src/application.rs b/simplelogin-gui/src/application.rs
index 68c1513..d98033d 100644
--- a/simplelogin-gui/src/application.rs
+++ b/simplelogin-gui/src/application.rs
@@ -20,7 +20,7 @@ mod imp {
impl Application {
fn api_key(&self) -> Option {
- self.settings.borrow().value("api-key").get()
+ self.settings.borrow().value("api-key").get::