Make PpNewPrinterDialog a GtkDialog instead of GObject

This is accomplished by moving the calls to pp_printer_add_async
directly to CcPrintersPanel. pp_printer_delete_async calls are already
done directly in the CcPrintersPanel so there is consistency gained by
this implementation in addition to PpNewPrinterDialog actually being a
GtkDialog.

A pp_new_printer_dialog_get_new_print_device method has been added to
PpNewPrinterDialog to allow getting the PpPrintDevice selected by the
user to add. This can be called anytime after a response callback
with a GTK_RESPONSE_OK reponse_id.

PpNewPrinterDialog still does asynchronous operations to populate the
dialog, but the create dialog -> receive signal -> destroy dialog flow
can all be handled like a traditional GtkDialog without additional
callbacks or signalling.
This commit is contained in:
Brandon Nielsen 2021-06-21 18:57:48 -05:00 committed by Marek Kašík
parent aceaa40432
commit 179bda1b64
5 changed files with 381 additions and 495 deletions

View file

@ -40,10 +40,13 @@
#include "pp-cups.h"
#include "pp-printer-entry.h"
#include "pp-job.h"
#include "pp-new-printer.h"
#include "cc-permission-infobar.h"
#include "cc-util.h"
#include <gdk/gdkx.h>
#define RENEW_INTERVAL 500
#define SUBSCRIPTION_DURATION 600
@ -296,7 +299,6 @@ cc_printers_panel_dispose (GObject *object)
}
g_clear_object (&self->cups);
g_clear_object (&self->pp_new_printer_dialog);
g_clear_pointer (&self->new_printer_name, g_free);
g_clear_pointer (&self->renamed_printer_name, g_free);
g_clear_pointer (&self->old_printer_name, g_free);
@ -900,26 +902,22 @@ actualize_printers_list (CcPrintersPanel *self)
}
static void
new_printer_dialog_pre_response_cb (CcPrintersPanel *self,
const gchar *device_name,
const gchar *device_location,
const gchar *device_make_and_model,
gboolean is_network_device)
printer_add_async_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
self->new_printer_name = g_strdup (device_name);
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
gboolean success;
g_autoptr(GError) error = NULL;
actualize_printers_list (self);
}
success = pp_new_printer_add_finish (PP_NEW_PRINTER (source_object), res, &error);
static void
new_printer_dialog_response_cb (CcPrintersPanel *self,
gint response_id)
{
if (self->pp_new_printer_dialog)
g_clear_object (&self->pp_new_printer_dialog);
if (response_id == GTK_RESPONSE_REJECT)
if (!success)
{
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
{
g_warning ("%s", error->message);
GtkWidget *message_dialog;
message_dialog = gtk_message_dialog_new (NULL,
@ -934,31 +932,70 @@ new_printer_dialog_response_cb (CcPrintersPanel *self,
NULL);
gtk_widget_show (message_dialog);
}
}
actualize_printers_list (self);
}
static void
new_printer_dialog_response_cb (GtkDialog *_dialog,
gint response_id,
gpointer user_data)
{
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
PpNewPrinterDialog *pp_new_printer_dialog = PP_NEW_PRINTER_DIALOG (_dialog);
g_autoptr(PpPrintDevice) new_device = NULL;
g_autoptr(PpNewPrinter) new_printer = NULL;
guint window_id = 0;
if (response_id == GTK_RESPONSE_OK) {
new_device = pp_new_printer_dialog_get_new_print_device (pp_new_printer_dialog);
self->new_printer_name = g_strdup (pp_print_device_get_device_name (new_device));
actualize_printers_list (self);
window_id = (guint) GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (gtk_window_get_transient_for (GTK_WINDOW (pp_new_printer_dialog)))));
new_printer = pp_new_printer_new ();
g_object_set (new_printer,
"name", pp_print_device_get_device_name (new_device),
"original-name", pp_print_device_get_device_original_name (new_device),
"device-uri", pp_print_device_get_device_uri (new_device),
"device-id", pp_print_device_get_device_id (new_device),
"ppd-name", pp_print_device_get_device_ppd (new_device),
"ppd-file-name", pp_print_device_get_device_ppd (new_device),
"info", pp_print_device_get_device_info (new_device),
"location", pp_print_device_get_device_location (new_device),
"make-and-model", pp_print_device_get_device_make_and_model (new_device),
"host-name", pp_print_device_get_host_name (new_device),
"host-port", pp_print_device_get_host_port (new_device),
"is-network-device", pp_print_device_is_network_device (new_device),
"window-id", window_id,
NULL);
pp_new_printer_add_async (new_printer,
cc_panel_get_cancellable (CC_PANEL (self)),
printer_add_async_cb,
self);
}
gtk_widget_destroy (GTK_WIDGET (pp_new_printer_dialog));
self->pp_new_printer_dialog = NULL;
}
static void
printer_add_cb (CcPrintersPanel *self)
{
GtkWidget *toplevel;
toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
self->pp_new_printer_dialog = PP_NEW_PRINTER_DIALOG (
pp_new_printer_dialog_new (GTK_WINDOW (toplevel),
self->all_ppds_list));
self->pp_new_printer_dialog = pp_new_printer_dialog_new (self->all_ppds_list,
new_printer_dialog_response_cb,
self);
g_signal_connect_object (self->pp_new_printer_dialog,
"pre-response",
G_CALLBACK (new_printer_dialog_pre_response_cb),
self,
G_CONNECT_SWAPPED);
gtk_window_set_transient_for (GTK_WINDOW (self->pp_new_printer_dialog),
GTK_WINDOW (toplevel));
g_signal_connect_object (self->pp_new_printer_dialog,
"response",
G_CALLBACK (new_printer_dialog_response_cb),
self,
G_CONNECT_SWAPPED);
gtk_dialog_run (GTK_DIALOG (self->pp_new_printer_dialog));
}
static void

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="3.14"/>
<object class="GtkListStore" id="devices-liststore">
<object class="GtkListStore" id="devices_liststore">
<columns>
<!-- column-name device_gicon -->
<column type="GIcon"/>
@ -19,10 +19,10 @@
<column type="PpPrintDevice"/>
</columns>
</object>
<object class="GtkTreeModelFilter" id="devices-model-filter">
<property name="child_model">devices-liststore</property>
<object class="GtkTreeModelFilter" id="devices_model_filter">
<property name="child_model">devices_liststore</property>
</object>
<object class="GtkDialog" id="dialog">
<template class="PpNewPrinterDialog" parent="GtkDialog">
<property name="width_request">480</property>
<property name="height_request">490</property>
<property name="can_focus">False</property>
@ -37,11 +37,11 @@
<property name="visible">True</property>
<property name="show-close-button">False</property>
<child>
<object class="GtkStack" id="headerbar-topleft-buttons">
<object class="GtkStack" id="headerbar_topleft_buttons">
<property name="visible">True</property>
<property name="valign">center</property>
<child>
<object class="GtkButton" id="new-printer-cancel-button">
<object class="GtkButton" id="new_printer_cancel_button">
<property name="label" translatable="yes">_Cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
@ -53,7 +53,7 @@
</packing>
</child>
<child>
<object class="GtkButton" id="go-back-button">
<object class="GtkButton" id="go_back_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
@ -72,11 +72,11 @@
</object>
</child>
<child>
<object class="GtkStack" id="headerbar-topright-buttons">
<object class="GtkStack" id="headerbar_topright_buttons">
<property name="visible">True</property>
<property name="valign">center</property>
<child>
<object class="GtkButton" id="new-printer-add-button">
<object class="GtkButton" id="new_printer_add_button">
<property name="label" translatable="yes">_Add</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
@ -92,7 +92,7 @@
</packing>
</child>
<child>
<object class="GtkButton" id="unlock-button">
<object class="GtkButton" id="unlock_button">
<property name="label" translatable="yes" comments="Translators: This button opens authentication dialog for selected server.">_Unlock</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
@ -103,11 +103,11 @@
</style>
</object>
<packing>
<property name="name">unlock-button</property>
<property name="name">unlock_button</property>
</packing>
</child>
<child>
<object class="GtkButton" id="authenticate-button">
<object class="GtkButton" id="authenticate_button">
<property name="label" translatable="yes" comments="Translators: This buttons submits the credentials for the selected server.">_Unlock</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
@ -138,7 +138,7 @@
<property name="spacing">10</property>
<property name="border_width">0</property>
<child>
<object class="GtkStack" id="dialog-stack">
<object class="GtkStack" id="dialog_stack">
<property name="visible">True</property>
<property name="border_width">0</property>
<child>
@ -162,10 +162,10 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkTreeView" id="devices-treeview">
<object class="GtkTreeView" id="devices_treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="model">devices-model-filter</property>
<property name="model">devices_model_filter</property>
<property name="headers_visible">False</property>
<property name="enable-grid-lines">GTK_TREE_VIEW_GRID_LINES_HORIZONTAL</property>
<child internal-child="selection">
@ -274,7 +274,7 @@
<property name="can_focus">False</property>
<property name="border_width">4</property>
<child>
<object class="GtkSearchEntry" id="search-entry">
<object class="GtkSearchEntry" id="search_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="has_tooltip">True</property>
@ -334,7 +334,7 @@
</packing>
</child>
<child>
<object class="GtkLabel" id="authentication-title">
<object class="GtkLabel" id="authentication_title">
<property name="visible">True</property>
<property name="label" translatable="yes">Authentication Required</property>
<property name="xalign">0</property>
@ -348,7 +348,7 @@
</packing>
</child>
<child>
<object class="GtkLabel" id="authentication-text">
<object class="GtkLabel" id="authentication_text">
<property name="visible">True</property>
<property name="wrap">True</property>
<property name="max_width_chars">36</property>
@ -371,7 +371,7 @@
</packing>
</child>
<child>
<object class="GtkEntry" id="username-entry">
<object class="GtkEntry" id="username_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">●</property>
@ -394,7 +394,7 @@
</packing>
</child>
<child>
<object class="GtkEntry" id="password-entry">
<object class="GtkEntry" id="password_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="visibility">False</property>
@ -417,14 +417,14 @@
</object>
</child>
<action-widgets>
<action-widget response="-6">new-printer-cancel-button</action-widget>
<action-widget response="-5">new-printer-add-button</action-widget>
<action-widget response="-6">new_printer_cancel_button</action-widget>
<action-widget response="-5">new_printer_add_button</action-widget>
</action-widgets>
</object>
</template>
<object class="GtkSizeGroup">
<widgets>
<widget name="new-printer-cancel-button"/>
<widget name="headerbar-topright-buttons"/>
<widget name="new_printer_cancel_button"/>
<widget name="headerbar_topright_buttons"/>
</widgets>
</object>
</interface>

File diff suppressed because it is too large Load diff

View file

@ -19,18 +19,19 @@
#pragma once
#include "pp-utils.h"
#include <gtk/gtk.h>
#include "pp-utils.h"
G_BEGIN_DECLS
#define PP_TYPE_NEW_PRINTER_DIALOG (pp_new_printer_dialog_get_type ())
G_DECLARE_FINAL_TYPE (PpNewPrinterDialog, pp_new_printer_dialog, PP, NEW_PRINTER_DIALOG, GObject)
G_DECLARE_FINAL_TYPE (PpNewPrinterDialog, pp_new_printer_dialog, PP, NEW_PRINTER_DIALOG, GtkDialog)
PpNewPrinterDialog *pp_new_printer_dialog_new (GtkWindow *parent,
PPDList *ppd_list);
PpNewPrinterDialog *pp_new_printer_dialog_new (PPDList *ppd_list,
UserResponseCallback user_callback,
gpointer user_data);
void pp_new_printer_dialog_set_ppd_list (PpNewPrinterDialog *dialog,
PPDList *list);
PpPrintDevice *pp_new_printer_dialog_get_new_print_device (PpNewPrinterDialog *dialog);
G_END_DECLS

View file

@ -30,9 +30,6 @@
#include <glib/gstdio.h>
#include <gtk/gtk.h>
#include <cups/cups.h>
#include <cups/ppd.h>
#include "pp-ppd-selection-dialog.h"
enum
@ -334,6 +331,7 @@ pp_ppd_selection_dialog_dispose (GObject *object)
g_clear_pointer (&self->ppd_name, g_free);
g_clear_pointer (&self->ppd_display_name, g_free);
g_clear_pointer (&self->manufacturer, g_free);
g_clear_pointer (&self->list, ppd_list_free);
G_OBJECT_CLASS (pp_ppd_selection_dialog_parent_class)->dispose (object);
}