Quellcode durchsuchen

Add sign in dialog

Matthias Vogelgesang vor 7 Jahren
Ursprung
Commit
9d9d7e821a

+ 74 - 0
src/iridium-signin-dialog.c

@@ -0,0 +1,74 @@
+/* iridium-signin_dialog.c
+ *
+ * Copyright 2018 Matthias Vogelgesang
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "iridium-config.h"
+#include "iridium-signin-dialog.h"
+
+struct _IridiumSigninDialog
+{
+  GtkDialog  parent_instance;
+  GtkEntry  *server_entry;
+  GtkEntry  *email_entry;
+  GtkEntry  *password_entry;
+};
+
+G_DEFINE_TYPE (IridiumSigninDialog, iridium_signin_dialog, GTK_TYPE_DIALOG)
+
+GtkDialog *
+iridium_signin_dialog_new (void)
+{
+  return GTK_DIALOG (g_object_new (IRIDIUM_TYPE_SIGNIN_DIALOG, NULL));
+}
+
+const gchar *
+iridium_signin_dialog_get_server (IridiumSigninDialog *dialog)
+{
+  return gtk_entry_get_text (dialog->server_entry);
+}
+
+const gchar *
+iridium_signin_dialog_get_email (IridiumSigninDialog *dialog)
+{
+  return gtk_entry_get_text (dialog->email_entry);
+}
+
+const gchar *
+iridium_signin_dialog_get_password (IridiumSigninDialog *dialog)
+{
+  return gtk_entry_get_text (dialog->password_entry);
+}
+
+static void
+iridium_signin_dialog_class_init (IridiumSigninDialogClass *klass)
+{
+  GtkWidgetClass *widget_class;
+  
+  widget_class = GTK_WIDGET_CLASS (klass);
+
+  gtk_widget_class_set_template_from_resource (widget_class, "/net/bloerg/Iridium/iridium-signin-dialog.ui");
+  gtk_widget_class_bind_template_child (widget_class, IridiumSigninDialog, server_entry);
+  gtk_widget_class_bind_template_child (widget_class, IridiumSigninDialog, email_entry);
+  gtk_widget_class_bind_template_child (widget_class, IridiumSigninDialog, password_entry);
+}
+
+static void
+iridium_signin_dialog_init (IridiumSigninDialog *self)
+{
+  gtk_widget_init_template (GTK_WIDGET (self));
+}
+

+ 17 - 0
src/iridium-signin-dialog.h

@@ -0,0 +1,17 @@
+#pragma once
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define IRIDIUM_TYPE_SIGNIN_DIALOG (iridium_signin_dialog_get_type())
+
+G_DECLARE_FINAL_TYPE (IridiumSigninDialog, iridium_signin_dialog, IRIDIUM, SIGNIN_DIALOG, GtkDialog)
+
+GtkDialog   *iridium_signin_dialog_new          (void);
+const gchar *iridium_signin_dialog_get_server   (IridiumSigninDialog *dialog);
+const gchar *iridium_signin_dialog_get_email    (IridiumSigninDialog *dialog);
+const gchar *iridium_signin_dialog_get_password (IridiumSigninDialog *dialog);
+
+G_END_DECLS
+

+ 105 - 0
src/iridium-signin-dialog.ui

@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <template class="IridiumSigninDialog" parent="GtkDialog">
+    <property name="modal">True</property>
+    <property name="resizable">False</property>
+    <property name="can-default">True</property>
+    <property name="window-position">center-on-parent</property>
+    <property name="destroy-with-parent">True</property>
+    <property name="width-request">400</property>
+    <child type="action">
+      <object class="GtkButton" id="sign_in_button">
+        <property name="visible">True</property>
+        <property name="label">Sign in</property>
+        <property name="sensitive">False</property>
+        <style>
+          <class name="suggested-action"/>
+        </style>
+      </object>
+    </child>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="vbox">
+        <property name="spacing">18</property>
+        <property name="margin">18</property>
+        <child>
+          <object class="GtkGrid">
+            <property name="visible">True</property>
+            <property name="row-spacing">6</property>
+            <property name="column-spacing">12</property>
+            <property name="margin">6</property>
+            <child>
+              <object class="GtkLabel">
+                <property name="visible">True</property>
+                <property name="label">Server</property>
+                <property name="halign">GTK_ALIGN_END</property>
+              </object>
+              <packing>
+                <property name="left-attach">0</property>
+                <property name="top-attach">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="server_entry">
+                <property name="visible">True</property>
+                <property name="hexpand">True</property>
+                <property name="input-purpose">GTK_INPUT_PURPOSE_URL</property>
+              </object>
+              <packing>
+                <property name="left-attach">1</property>
+                <property name="top-attach">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel">
+                <property name="visible">True</property>
+                <property name="label">Email</property>
+                <property name="halign">GTK_ALIGN_END</property>
+              </object>
+              <packing>
+                <property name="left-attach">0</property>
+                <property name="top-attach">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="email_entry">
+                <property name="visible">True</property>
+                <property name="hexpand">True</property>
+                <property name="input-purpose">GTK_INPUT_PURPOSE_EMAIL</property>
+              </object>
+              <packing>
+                <property name="left-attach">1</property>
+                <property name="top-attach">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel">
+                <property name="visible">True</property>
+                <property name="label">Password</property>
+                <property name="halign">GTK_ALIGN_END</property>
+              </object>
+              <packing>
+                <property name="left-attach">0</property>
+                <property name="top-attach">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="password_entry">
+                <property name="visible">True</property>
+                <property name="hexpand">True</property>
+                <property name="visibility">False</property>
+                <property name="input-purpose">GTK_INPUT_PURPOSE_PASSWORD</property>
+              </object>
+              <packing>
+                <property name="left-attach">1</property>
+                <property name="top-attach">2</property>
+              </packing>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="ok" default="true">sign_in_button</action-widget>
+    </action-widgets>
+  </template>
+</interface>

+ 32 - 19
src/iridium-window.c

@@ -24,6 +24,7 @@
 #include "iridium-note.h"
 #include "iridium-note-row.h"
 #include "iridium-standard-file.h"
+#include "iridium-signin-dialog.h"
 #include "iridium-tag-row.h"
 #include "iridium-window.h"
 
@@ -190,6 +191,34 @@ on_standard_file_connected (GObject *object,
   gtk_revealer_set_reveal_child (self->notification_revealer, FALSE);
 }
 
+static void
+on_show (IridiumWindow *self, gpointer user_data)
+{
+  GtkDialog *dialog;
+  const gchar *server;
+  const gchar *email;
+  gchar *password;
+  GError *error = NULL;
+
+  dialog = iridium_signin_dialog_new ();
+  gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (self));
+  gtk_dialog_run (dialog);
+
+  server = iridium_signin_dialog_get_server (IRIDIUM_SIGNIN_DIALOG (dialog));
+  email = iridium_signin_dialog_get_email (IRIDIUM_SIGNIN_DIALOG (dialog));
+  password = secret_password_lookup_sync (STANDARD_FILE_SCHEMA, NULL, &error,
+      "email", email, "server", server, NULL);
+
+  gtk_revealer_set_reveal_child (self->notification_revealer, TRUE);
+
+  iridium_standard_file_connect_async (self->client, server, email, password, NULL,
+      on_standard_file_connected, self);
+
+  secret_password_free (password);
+
+  gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
 static void
 on_notification_close_clicked (IridiumWindow *self,
                                GtkButton *button)
@@ -238,6 +267,7 @@ iridium_window_class_init (IridiumWindowClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, on_note_selected);
   gtk_widget_class_bind_template_callback (widget_class, on_search_changed);
   gtk_widget_class_bind_template_callback (widget_class, on_notification_close_clicked);
+  gtk_widget_class_bind_template_callback (widget_class, on_show);
 }
 
 static void
@@ -247,16 +277,13 @@ iridium_window_init (IridiumWindow *self)
   GtkStyleProvider *provider;
   GtkSourceBuffer *buffer;
   GSimpleAction *action;
-  const gchar *server;
-  const gchar *email;
-  gchar *password;
-  GError *error = NULL;
 
   gtk_widget_init_template (GTK_WIDGET (self));
 
   self->title_binding = NULL;
   self->content_binding = NULL;
   self->markdown = iridium_markdown_new ();
+  self->client = iridium_standard_file_new ();
 
   action = g_simple_action_new ("search", NULL);
   g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (action));
@@ -276,25 +303,11 @@ iridium_window_init (IridiumWindow *self)
   gtk_css_provider_load_from_resource (GTK_CSS_PROVIDER (provider), "/net/bloerg/Iridium/iridium.css");
   gtk_style_context_add_provider_for_screen (gtk_window_get_screen (GTK_WINDOW (self)), provider, GTK_STYLE_PROVIDER_PRIORITY_USER);
 
-  self->client = iridium_standard_file_new ();
-  server = "https://sf.bloerg.net";
-  email = "matthias.vogelgesang@gmail.com";
-
-  /* TODO: add dialog */
-  password = secret_password_lookup_sync (STANDARD_FILE_SCHEMA, NULL, &error,
-      "email", email, "server", server, NULL);
-
-  gtk_revealer_set_reveal_child (self->notification_revealer, TRUE);
-
-  iridium_standard_file_connect_async (self->client, server, email, password, NULL,
-      on_standard_file_connected, self);
-
-  secret_password_free (password);
-
   gtk_list_box_set_filter_func (self->note_list, (GtkListBoxFilterFunc) note_visible, self, NULL);
 
   gtk_list_box_set_sort_func (self->note_list, (GtkListBoxSortFunc) note_date_cmp, NULL, NULL);
 
   gtk_widget_show_all (GTK_WIDGET (self->tag_list));
   gtk_widget_show_all (GTK_WIDGET (self->note_list));
+
 }

+ 3 - 2
src/iridium-window.ui

@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <template class="IridiumWindow" parent="GtkApplicationWindow">
-    <property name="default-width">800</property>
-    <property name="default-height">600</property>
+    <property name="width-request">800</property>
+    <property name="height-request">600</property>
+    <signal name="show" handler="on_show"/>
     <child type="titlebar">
       <object class="GtkHeaderBar" id="header_bar">
         <property name="visible">True</property>

+ 1 - 0
src/iridium.gresource.xml

@@ -4,6 +4,7 @@
     <file>iridium.css</file>
     <file>iridium-menu.ui</file>
     <file>iridium-note-row.ui</file>
+    <file>iridium-signin-dialog.ui</file>
     <file>iridium-tag-row.ui</file>
     <file>iridium-window.ui</file>
   </gresource>

+ 1 - 0
src/meson.build

@@ -7,6 +7,7 @@ iridium_sources = [
   'iridium-note-row.c',
   'iridium-tag.c',
   'iridium-tag-row.c',
+  'iridium-signin-dialog.c',
   'iridium-standard-file.c',
   'iridium-storage.c',
   'iridium-markdown.c',