Merge branch 'columnview-printdialog' into 'master'

Port the printdialog to column view

See merge request GNOME/gtk!2010
This commit is contained in:
Matthias Clasen
2020-06-03 21:47:58 +00:00
2 changed files with 287 additions and 528 deletions

View File

@@ -35,7 +35,6 @@
#include "gtkspinbutton.h"
#include "gtkimage.h"
#include "gtktreeselection.h"
#include "gtknotebook.h"
#include "gtkscrolledwindow.h"
#include "gtkcombobox.h"
@@ -136,14 +135,12 @@ static void gtk_print_unix_dialog_get_property (GObject *object,
GValue *value,
GParamSpec *pspec);
static void unschedule_idle_mark_conflicts (GtkPrintUnixDialog *dialog);
static void selected_printer_changed (GtkTreeSelection *selection,
GtkPrintUnixDialog *dialog);
static void selected_printer_changed (GtkPrintUnixDialog *dialog);
static void clear_per_printer_ui (GtkPrintUnixDialog *dialog);
static void printer_added_cb (GtkPrintBackend *backend,
GtkPrinter *printer,
GtkPrintUnixDialog *dialog);
static void printer_removed_cb (GtkPrintBackend *backend,
GtkPrinter *printer,
static void printer_added_cb (GListModel *model,
guint position,
guint removed,
guint added,
GtkPrintUnixDialog *dialog);
static void printer_status_cb (GtkPrintBackend *backend,
GtkPrinter *printer,
@@ -171,12 +168,10 @@ static void draw_collate (GtkDrawingArea *da,
int width,
int height,
gpointer data);
static gboolean is_printer_active (GtkTreeModel *model,
GtkTreeIter *iter,
GtkPrintUnixDialog *dialog);
static gint default_printer_list_sort_func (GtkTreeModel *model,
GtkTreeIter *a,
GtkTreeIter *b,
static gboolean is_printer_active (gpointer item,
gpointer data);
static int default_printer_list_sort_func (gconstpointer a,
gconstpointer b,
gpointer user_data);
static gboolean paper_size_row_is_separator (GtkTreeModel *model,
GtkTreeIter *iter,
@@ -198,20 +193,10 @@ static gboolean dialog_get_collate (GtkPrintUnixDialog *dialog);
static gboolean dialog_get_reverse (GtkPrintUnixDialog *dialog);
static gint dialog_get_n_copies (GtkPrintUnixDialog *dialog);
static void set_cell_sensitivity_func (GtkTreeViewColumn *tree_column,
GtkCellRenderer *cell,
GtkTreeModel *model,
GtkTreeIter *iter,
gpointer data);
static gboolean set_active_printer (GtkPrintUnixDialog *dialog,
const gchar *printer_name);
static void redraw_page_layout_preview (GtkPrintUnixDialog *dialog);
static void load_print_backends (GtkPrintUnixDialog *dialog);
static gboolean printer_compare (GtkTreeModel *model,
gint column,
const gchar *key,
GtkTreeIter *iter,
gpointer search_data);
static GListModel *load_print_backends (GtkPrintUnixDialog *dialog);
/* GtkBuildable */
static void gtk_print_unix_dialog_buildable_init (GtkBuildableIface *iface);
@@ -272,22 +257,11 @@ struct _GtkPrintUnixDialog
GtkWidget *notebook;
GtkWidget *printer_treeview;
GtkTreeViewColumn *printer_icon_column;
GtkTreeViewColumn *printer_name_column;
GtkTreeViewColumn *printer_location_column;
GtkTreeViewColumn *printer_status_column;
GtkCellRenderer *printer_icon_renderer;
GtkCellRenderer *printer_name_renderer;
GtkCellRenderer *printer_location_renderer;
GtkCellRenderer *printer_status_renderer;
GtkWidget *printer_list;
GtkPrintCapabilities manual_capabilities;
GtkPrintCapabilities printer_capabilities;
GtkTreeModel *printer_list;
GtkTreeModelFilter *printer_list_filter;
GtkPageSetup *page_setup;
gboolean page_setup_set;
gboolean embed_page_setup;
@@ -491,19 +465,9 @@ gtk_print_unix_dialog_class_init (GtkPrintUnixDialogClass *class)
"/org/gtk/libgtk/ui/gtkprintunixdialog.ui");
/* GtkTreeView / GtkTreeModel */
gtk_widget_class_bind_template_child (widget_class, GtkPrintUnixDialog, printer_treeview);
gtk_widget_class_bind_template_child (widget_class, GtkPrintUnixDialog, printer_list);
gtk_widget_class_bind_template_child (widget_class, GtkPrintUnixDialog, printer_list_filter);
gtk_widget_class_bind_template_child (widget_class, GtkPrintUnixDialog, page_setup_list);
gtk_widget_class_bind_template_child(widget_class, GtkPrintUnixDialog, page_setup_list);
gtk_widget_class_bind_template_child (widget_class, GtkPrintUnixDialog, custom_paper_list);
gtk_widget_class_bind_template_child (widget_class, GtkPrintUnixDialog, printer_icon_column);
gtk_widget_class_bind_template_child (widget_class, GtkPrintUnixDialog, printer_name_column);
gtk_widget_class_bind_template_child (widget_class, GtkPrintUnixDialog, printer_location_column);
gtk_widget_class_bind_template_child (widget_class, GtkPrintUnixDialog, printer_status_column);
gtk_widget_class_bind_template_child (widget_class, GtkPrintUnixDialog, printer_icon_renderer);
gtk_widget_class_bind_template_child (widget_class, GtkPrintUnixDialog, printer_name_renderer);
gtk_widget_class_bind_template_child (widget_class, GtkPrintUnixDialog, printer_location_renderer);
gtk_widget_class_bind_template_child (widget_class, GtkPrintUnixDialog, printer_status_renderer);
/* General Widgetry */
gtk_widget_class_bind_template_child (widget_class, GtkPrintUnixDialog, notebook);
@@ -558,7 +522,6 @@ gtk_print_unix_dialog_class_init (GtkPrintUnixDialogClass *class)
gtk_widget_class_bind_template_callback (widget_class, redraw_page_layout_preview);
gtk_widget_class_bind_template_callback (widget_class, error_dialogs);
gtk_widget_class_bind_template_callback (widget_class, emit_ok_response);
gtk_widget_class_bind_template_callback (widget_class, selected_printer_changed);
gtk_widget_class_bind_template_callback (widget_class, page_range_entry_focus_changed);
gtk_widget_class_bind_template_callback (widget_class, update_page_range_entry_sensitivity);
gtk_widget_class_bind_template_callback (widget_class, update_print_at_entry_sensitivity);
@@ -729,11 +692,24 @@ error_dialogs (GtkPrintUnixDialog *dialog,
}
}
static char *
get_printer_key (GtkPrinter *printer)
{
return g_strconcat ("", gtk_printer_get_name (printer), " ", gtk_printer_get_location (printer), NULL);
}
static void
gtk_print_unix_dialog_init (GtkPrintUnixDialog *dialog)
{
GtkTreeSortable *sort;
GtkWidget *widget;
GListModel *model;
GListModel *sorted;
GListModel *filtered;
GListModel *selection;
GtkSorter *sorter;
GtkFilter *filter;
GtkFilter *filter1;
GtkExpression *expression;
dialog->print_backends = NULL;
dialog->current_page = -1;
@@ -767,43 +743,7 @@ gtk_print_unix_dialog_init (GtkPrintUnixDialog *dialog)
gtk_widget_set_visible (dialog->selection_radio, FALSE);
gtk_widget_set_visible (dialog->conflicts_widget, FALSE);
/* Treeview auxiliary functions need to be setup here */
gtk_tree_model_filter_set_visible_func (dialog->printer_list_filter,
(GtkTreeModelFilterVisibleFunc) is_printer_active,
dialog,
NULL);
sort = GTK_TREE_SORTABLE (dialog->printer_list);
gtk_tree_sortable_set_default_sort_func (sort,
default_printer_list_sort_func,
NULL,
NULL);
gtk_tree_sortable_set_sort_column_id (sort,
GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
GTK_SORT_ASCENDING);
gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (dialog->printer_treeview),
printer_compare, NULL, NULL);
gtk_tree_view_column_set_cell_data_func (dialog->printer_icon_column,
dialog->printer_icon_renderer,
set_cell_sensitivity_func, NULL, NULL);
gtk_tree_view_column_set_cell_data_func (dialog->printer_name_column,
dialog->printer_name_renderer,
set_cell_sensitivity_func, NULL, NULL);
gtk_tree_view_column_set_cell_data_func (dialog->printer_location_column,
dialog->printer_location_renderer,
set_cell_sensitivity_func, NULL, NULL);
gtk_tree_view_column_set_cell_data_func (dialog->printer_status_column,
dialog->printer_status_renderer,
set_cell_sensitivity_func, NULL, NULL);
/* Paper size combo auxiliary funcs */
/* Paper size combo auxilary funcs */
gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (dialog->paper_size_combo),
paper_size_row_is_separator, NULL, NULL);
gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (dialog->paper_size_combo),
@@ -811,7 +751,39 @@ gtk_print_unix_dialog_init (GtkPrintUnixDialog *dialog)
page_name_func, NULL, NULL);
/* Load backends */
load_print_backends (dialog);
model = load_print_backends (dialog);
sorter = gtk_custom_sorter_new (default_printer_list_sort_func, NULL, NULL);
sorted = G_LIST_MODEL (gtk_sort_list_model_new (model, sorter));
g_object_unref (sorter);
filter = gtk_every_filter_new ();
filter1 = gtk_string_filter_new ();
gtk_string_filter_set_match_mode (GTK_STRING_FILTER (filter1), GTK_STRING_FILTER_MATCH_MODE_SUBSTRING);
gtk_string_filter_set_ignore_case (GTK_STRING_FILTER (filter1), TRUE);
expression = gtk_cclosure_expression_new (G_TYPE_STRING,
NULL, 0, NULL,
G_CALLBACK (get_printer_key),
NULL, NULL);
gtk_string_filter_set_expression (GTK_STRING_FILTER (filter1), expression);
gtk_expression_unref (expression);
gtk_multi_filter_append (GTK_MULTI_FILTER (filter), filter1);
filter1 = gtk_custom_filter_new (is_printer_active, dialog, NULL);
gtk_multi_filter_append (GTK_MULTI_FILTER (filter), filter1);
filtered = G_LIST_MODEL (gtk_filter_list_model_new (sorted, filter));
g_object_unref (filter);
selection = G_LIST_MODEL (gtk_single_selection_new (filtered));
gtk_single_selection_set_autoselect (GTK_SINGLE_SELECTION (selection), FALSE);
gtk_single_selection_set_selected (GTK_SINGLE_SELECTION (selection), GTK_INVALID_LIST_POSITION);
gtk_column_view_set_model (GTK_COLUMN_VIEW (dialog->printer_list), selection);
g_signal_connect (selection, "items-changed", G_CALLBACK (printer_added_cb), dialog);
g_signal_connect_swapped (selection, "notify::selected", G_CALLBACK (selected_printer_changed), dialog);
g_object_unref (selection);
g_object_unref (filtered);
g_object_unref (model);
/* Load custom papers */
_gtk_print_load_custom_papers (dialog->custom_paper_list);
@@ -884,21 +856,8 @@ disconnect_printer_details_request (GtkPrintUnixDialog *dialog,
dialog->request_details_tag = 0;
set_busy_cursor (dialog, FALSE);
if (details_failed)
gtk_list_store_set (GTK_LIST_STORE (dialog->printer_list),
g_object_get_data (G_OBJECT (dialog->request_details_printer),
"gtk-print-tree-iter"),
PRINTER_LIST_COL_STATE,
_("Getting printer information failed"),
-1);
else
gtk_list_store_set (GTK_LIST_STORE (dialog->printer_list),
g_object_get_data (G_OBJECT (dialog->request_details_printer),
"gtk-print-tree-iter"),
PRINTER_LIST_COL_STATE,
gtk_printer_get_state_message (dialog->request_details_printer),
-1);
g_object_unref (dialog->request_details_printer);
dialog->request_details_printer = NULL;
gtk_printer_set_state_message (dialog->request_details_printer, _("Getting printer information failed"));
g_clear_object (&dialog->request_details_printer);
}
}
@@ -906,8 +865,6 @@ static void
gtk_print_unix_dialog_finalize (GObject *object)
{
GtkPrintUnixDialog *dialog = GTK_PRINT_UNIX_DIALOG (object);
GtkPrintBackend *backend;
GList *node;
unschedule_idle_mark_conflicts (dialog);
disconnect_printer_details_request (dialog, FALSE);
@@ -933,18 +890,6 @@ gtk_print_unix_dialog_finalize (GObject *object)
g_clear_pointer (&dialog->waiting_for_printer, (GDestroyNotify)g_free);
g_clear_pointer (&dialog->format_for_printer, (GDestroyNotify)g_free);
for (node = dialog->print_backends; node != NULL; node = node->next)
{
backend = GTK_PRINT_BACKEND (node->data);
g_signal_handlers_disconnect_by_func (backend, printer_added_cb, dialog);
g_signal_handlers_disconnect_by_func (backend, printer_removed_cb, dialog);
g_signal_handlers_disconnect_by_func (backend, printer_status_cb, dialog);
gtk_print_backend_destroy (backend);
g_object_unref (backend);
}
g_list_free (dialog->print_backends);
dialog->print_backends = NULL;
@@ -953,17 +898,6 @@ gtk_print_unix_dialog_finalize (GObject *object)
G_OBJECT_CLASS (gtk_print_unix_dialog_parent_class)->finalize (object);
}
static void
printer_removed_cb (GtkPrintBackend *backend,
GtkPrinter *printer,
GtkPrintUnixDialog *dialog)
{
GtkTreeIter *iter;
iter = g_object_get_data (G_OBJECT (printer), "gtk-print-tree-iter");
gtk_list_store_remove (GTK_LIST_STORE (dialog->printer_list), iter);
}
static void
gtk_print_unix_dialog_buildable_init (GtkBuildableIface *iface)
{
@@ -985,157 +919,68 @@ gtk_print_unix_dialog_buildable_get_internal_child (GtkBuildable *buildable,
return parent_buildable_iface->get_internal_child (buildable, builder, childname);
}
/* This function controls "sensitive" property of GtkCellRenderer
* based on pause state of printers.
*/
void set_cell_sensitivity_func (GtkTreeViewColumn *tree_column,
GtkCellRenderer *cell,
GtkTreeModel *tree_model,
GtkTreeIter *iter,
gpointer data)
{
GtkPrinter *printer;
gtk_tree_model_get (tree_model, iter,
PRINTER_LIST_COL_PRINTER_OBJ, &printer,
-1);
if (printer != NULL && !gtk_printer_is_accepting_jobs (printer))
g_object_set (cell, "sensitive", FALSE, NULL);
else
g_object_set (cell, "sensitive", TRUE, NULL);
g_clear_object (&printer);
}
static void
printer_status_cb (GtkPrintBackend *backend,
GtkPrinter *printer,
GtkPrintUnixDialog *dialog)
{
GtkTreeIter *iter;
GtkTreeSelection *selection;
GIcon *icon;
iter = g_object_get_data (G_OBJECT (printer), "gtk-print-tree-iter");
icon = g_themed_icon_new ("printer");
g_themed_icon_prepend_name (G_THEMED_ICON (icon), gtk_printer_get_icon_name (printer));
gtk_list_store_set (GTK_LIST_STORE (dialog->printer_list), iter,
PRINTER_LIST_COL_ICON, icon,
PRINTER_LIST_COL_STATE, gtk_printer_get_state_message (printer),
PRINTER_LIST_COL_JOBS, gtk_printer_get_job_count (printer),
PRINTER_LIST_COL_LOCATION, gtk_printer_get_location (printer),
-1);
g_object_unref (icon);
GListModel *model;
/* When the pause state change then we need to update sensitive property
* of GTK_RESPONSE_OK button inside of selected_printer_changed function.
*/
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->printer_treeview));
dialog->internal_printer_change = TRUE;
selected_printer_changed (selection, dialog);
dialog->internal_printer_change = FALSE;
selected_printer_changed (dialog);
model = gtk_column_view_get_model (GTK_COLUMN_VIEW (dialog->printer_list));
if (gtk_print_backend_printer_list_is_done (backend) &&
gtk_printer_is_default (printer) &&
(gtk_tree_selection_count_selected_rows (selection) == 0))
gtk_single_selection_get_selected (GTK_SINGLE_SELECTION (model)) == GTK_INVALID_LIST_POSITION)
set_active_printer (dialog, gtk_printer_get_name (printer));
}
static void
printer_added_cb (GtkPrintBackend *backend,
GtkPrinter *printer,
printer_added_cb (GListModel *model,
guint position,
guint removed,
guint added,
GtkPrintUnixDialog *dialog)
{
GtkTreeIter iter, filter_iter;
GtkTreeSelection *selection;
GtkTreePath *path;
GIcon *icon;
guint i;
gtk_list_store_append (GTK_LIST_STORE (dialog->printer_list), &iter);
g_object_set_data_full (G_OBJECT (printer),
"gtk-print-tree-iter",
gtk_tree_iter_copy (&iter),
(GDestroyNotify) gtk_tree_iter_free);
icon = g_themed_icon_new ("printer");
g_themed_icon_prepend_name (G_THEMED_ICON (icon), gtk_printer_get_icon_name (printer));
gtk_list_store_set (GTK_LIST_STORE (dialog->printer_list), &iter,
PRINTER_LIST_COL_ICON, icon,
PRINTER_LIST_COL_NAME, gtk_printer_get_name (printer),
PRINTER_LIST_COL_STATE, gtk_printer_get_state_message (printer),
PRINTER_LIST_COL_JOBS, gtk_printer_get_job_count (printer),
PRINTER_LIST_COL_LOCATION, gtk_printer_get_location (printer),
PRINTER_LIST_COL_PRINTER_OBJ, printer,
-1);
g_object_unref (icon);
gtk_tree_model_filter_convert_child_iter_to_iter (dialog->printer_list_filter,
&filter_iter, &iter);
path = gtk_tree_model_get_path (GTK_TREE_MODEL (dialog->printer_list_filter), &filter_iter);
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->printer_treeview));
if (dialog->waiting_for_printer != NULL &&
strcmp (gtk_printer_get_name (printer), dialog->waiting_for_printer) == 0)
for (i = position; i < position + added; i++)
{
dialog->internal_printer_change = TRUE;
gtk_tree_selection_select_iter (selection, &filter_iter);
gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (dialog->printer_treeview),
path, NULL, TRUE, 0.5, 0.0);
dialog->internal_printer_change = FALSE;
g_free (dialog->waiting_for_printer);
dialog->waiting_for_printer = NULL;
}
else if (is_default_printer (dialog, printer) &&
gtk_tree_selection_count_selected_rows (selection) == 0)
{
dialog->internal_printer_change = TRUE;
gtk_tree_selection_select_iter (selection, &filter_iter);
gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (dialog->printer_treeview),
path, NULL, TRUE, 0.5, 0.0);
dialog->internal_printer_change = FALSE;
}
GtkPrinter *printer = g_list_model_get_item (model, i);
gtk_tree_path_free (path);
if (dialog->waiting_for_printer != NULL &&
strcmp (gtk_printer_get_name (printer), dialog->waiting_for_printer) == 0)
{
gtk_single_selection_set_selected (GTK_SINGLE_SELECTION (model), i);
g_free (dialog->waiting_for_printer);
dialog->waiting_for_printer = NULL;
g_object_unref (printer);
return;
}
else if (is_default_printer (dialog, printer) &&
gtk_single_selection_get_selected (GTK_SINGLE_SELECTION (model)) == GTK_INVALID_LIST_POSITION)
{
gtk_single_selection_set_selected (GTK_SINGLE_SELECTION (model), i);
g_object_unref (printer);
return;
}
g_object_unref (printer);
}
}
static void
printer_list_initialize (GtkPrintUnixDialog *dialog,
GtkPrintBackend *print_backend)
{
GList *list;
GList *node;
g_return_if_fail (print_backend != NULL);
g_signal_connect_object (print_backend, "printer-added",
(GCallback) printer_added_cb, G_OBJECT (dialog), 0);
g_signal_connect_object (print_backend, "printer-removed",
(GCallback) printer_removed_cb, G_OBJECT (dialog), 0);
g_signal_connect_object (print_backend, "printer-status-changed",
(GCallback) printer_status_cb, G_OBJECT (dialog), 0);
list = gtk_print_backend_get_printer_list (print_backend);
node = list;
while (node != NULL)
{
printer_added_cb (print_backend, node->data, dialog);
node = node->next;
}
g_list_free (list);
}
static void
static GListModel *
load_print_backends (GtkPrintUnixDialog *dialog)
{
GList *node;
GListStore *lists;
GListModel *model;
lists = g_list_store_new (G_TYPE_LIST_MODEL);
if (g_module_supported ())
dialog->print_backends = gtk_print_backend_load_modules ();
@@ -1143,8 +988,17 @@ load_print_backends (GtkPrintUnixDialog *dialog)
for (node = dialog->print_backends; node != NULL; node = node->next)
{
GtkPrintBackend *backend = node->data;
printer_list_initialize (dialog, backend);
g_signal_connect_object (backend, "printer-status-changed",
G_CALLBACK (printer_status_cb), G_OBJECT (dialog), 0);
g_list_store_append (lists, gtk_print_backend_get_printers (backend));
}
model = G_LIST_MODEL (gtk_flatten_list_model_new (GTK_TYPE_PRINTER, G_LIST_MODEL (lists)));
g_object_unref (lists);
return model;
}
static void
@@ -1226,19 +1080,11 @@ gtk_print_unix_dialog_get_property (GObject *object,
}
static gboolean
is_printer_active (GtkTreeModel *model,
GtkTreeIter *iter,
GtkPrintUnixDialog *dialog)
is_printer_active (gpointer item, gpointer data)
{
GtkPrinter *printer = item;
GtkPrintUnixDialog *dialog = data;
gboolean result;
GtkPrinter *printer;
gtk_tree_model_get (model, iter,
PRINTER_LIST_COL_PRINTER_OBJ, &printer,
-1);
if (printer == NULL)
return FALSE;
result = gtk_printer_is_active (printer);
@@ -1255,61 +1101,44 @@ is_printer_active (GtkTreeModel *model,
gtk_printer_accepts_ps (printer));
}
g_object_unref (printer);
return result;
}
static gint
default_printer_list_sort_func (GtkTreeModel *model,
GtkTreeIter *a,
GtkTreeIter *b,
static int
default_printer_list_sort_func (gconstpointer a,
gconstpointer b,
gpointer user_data)
{
gchar *a_name;
gchar *b_name;
GtkPrinter *a_printer;
GtkPrinter *b_printer;
gint result;
gtk_tree_model_get (model, a,
PRINTER_LIST_COL_NAME, &a_name,
PRINTER_LIST_COL_PRINTER_OBJ, &a_printer,
-1);
gtk_tree_model_get (model, b,
PRINTER_LIST_COL_NAME, &b_name,
PRINTER_LIST_COL_PRINTER_OBJ, &b_printer,
-1);
GtkPrinter *a_printer = (gpointer)a;
GtkPrinter *b_printer = (gpointer)b;
const char *a_name;
const char *b_name;
if (a_printer == NULL && b_printer == NULL)
result = 0;
return 0;
else if (a_printer == NULL)
result = G_MAXINT;
return 1;
else if (b_printer == NULL)
result = G_MININT;
else if (gtk_printer_is_virtual (a_printer) && gtk_printer_is_virtual (b_printer))
result = 0;
return -1;
if (gtk_printer_is_virtual (a_printer) && gtk_printer_is_virtual (b_printer))
return 0;
else if (gtk_printer_is_virtual (a_printer) && !gtk_printer_is_virtual (b_printer))
result = G_MININT;
return -1;
else if (!gtk_printer_is_virtual (a_printer) && gtk_printer_is_virtual (b_printer))
result = G_MAXINT;
else if (a_name == NULL && b_name == NULL)
result = 0;
return 1;
a_name = gtk_printer_get_name (a_printer);
b_name = gtk_printer_get_name (b_printer);
if (a_name == NULL && b_name == NULL)
return 0;
else if (a_name == NULL && b_name != NULL)
result = 1;
return 1;
else if (a_name != NULL && b_name == NULL)
result = -1;
else
result = g_ascii_strcasecmp (a_name, b_name);
return -1;
g_free (a_name);
g_free (b_name);
if (a_printer)
g_object_unref (a_printer);
if (b_printer)
g_object_unref (b_printer);
return result;
return g_ascii_strcasecmp (a_name, b_name);
}
static GtkWidget *
@@ -1697,8 +1526,6 @@ update_dialog_from_capabilities (GtkPrintUnixDialog *dialog)
gtk_widget_set_visible (button, (caps & GTK_PRINT_CAPABILITY_PREVIEW) != 0);
update_collate_icon (NULL, dialog);
gtk_tree_model_filter_refilter (dialog->printer_list_filter);
}
static gboolean
@@ -1901,17 +1728,12 @@ mark_conflicts (GtkPrintUnixDialog *dialog)
if (printer)
{
g_signal_handler_block (dialog->options,
dialog->options_changed_handler);
g_signal_handler_block (dialog->options, dialog->options_changed_handler);
gtk_printer_option_set_clear_conflicts (dialog->options);
have_conflict = _gtk_printer_mark_conflicts (printer, dialog->options);
have_conflict = _gtk_printer_mark_conflicts (printer,
dialog->options);
g_signal_handler_unblock (dialog->options,
dialog->options_changed_handler);
g_signal_handler_unblock (dialog->options, dialog->options_changed_handler);
}
if (have_conflict)
@@ -1989,20 +1811,14 @@ printer_details_acquired (GtkPrinter *printer,
disconnect_printer_details_request (dialog, !success);
if (success)
{
GtkTreeSelection *selection;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->printer_treeview));
selected_printer_changed (selection, dialog);
}
selected_printer_changed (dialog);
}
static void
selected_printer_changed (GtkTreeSelection *selection,
GtkPrintUnixDialog *dialog)
selected_printer_changed (GtkPrintUnixDialog *dialog)
{
GListModel *model = gtk_column_view_get_model (GTK_COLUMN_VIEW (dialog->printer_list));
GtkPrinter *printer;
GtkTreeIter iter, filter_iter;
/* Whenever the user selects a printer we stop looking for
* the printer specified in the initial settings
@@ -2016,17 +1832,7 @@ selected_printer_changed (GtkTreeSelection *selection,
disconnect_printer_details_request (dialog, FALSE);
printer = NULL;
if (gtk_tree_selection_get_selected (selection, NULL, &filter_iter))
{
gtk_tree_model_filter_convert_iter_to_child_iter (dialog->printer_list_filter,
&iter,
&filter_iter);
gtk_tree_model_get (dialog->printer_list, &iter,
PRINTER_LIST_COL_PRINTER_OBJ, &printer,
-1);
}
printer = gtk_single_selection_get_selected_item (GTK_SINGLE_SELECTION (model));
/* sets GTK_RESPONSE_OK button sensitivity depending on whether the printer
* accepts/rejects jobs
@@ -2036,33 +1842,24 @@ selected_printer_changed (GtkTreeSelection *selection,
if (!gtk_printer_is_accepting_jobs (printer))
gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, FALSE);
else if (dialog->current_printer == printer && gtk_printer_has_details (printer))
gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, TRUE);
}
if (printer != NULL && !gtk_printer_has_details (printer))
{
gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, FALSE);
dialog->request_details_tag =
g_signal_connect (printer, "details-acquired",
G_CALLBACK (printer_details_acquired), dialog);
/* take the reference */
dialog->request_details_printer = printer;
dialog->request_details_tag = g_signal_connect (printer, "details-acquired",
G_CALLBACK (printer_details_acquired), dialog);
dialog->request_details_printer = g_object_ref (printer);
set_busy_cursor (dialog, TRUE);
gtk_list_store_set (GTK_LIST_STORE (dialog->printer_list),
g_object_get_data (G_OBJECT (printer), "gtk-print-tree-iter"),
PRINTER_LIST_COL_STATE, _("Getting printer information…"),
-1);
gtk_printer_set_state_message (printer, _("Getting printer information…"));
gtk_printer_request_details (printer);
return;
}
if (printer == dialog->current_printer)
{
if (printer)
g_object_unref (printer);
return;
}
return;
if (dialog->options)
{
@@ -2075,7 +1872,7 @@ selected_printer_changed (GtkTreeSelection *selection,
if (printer != NULL && gtk_printer_is_accepting_jobs (printer))
gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, TRUE);
dialog->current_printer = printer;
dialog->current_printer = g_object_ref (printer);
if (printer != NULL)
{
@@ -2114,86 +1911,7 @@ selected_printer_changed (GtkTreeSelection *selection,
update_paper_sizes (dialog);
dialog->internal_page_setup_change = FALSE;
g_object_notify ( G_OBJECT(dialog), "selected-printer");
}
static gboolean
printer_compare (GtkTreeModel *model,
gint column,
const gchar *key,
GtkTreeIter *iter,
gpointer search_data)
{
gboolean matches = FALSE;
if (key != NULL)
{
gchar *name = NULL;
gchar *location = NULL;
gchar *casefold_key = NULL;
gchar *casefold_name = NULL;
gchar *casefold_location = NULL;
gchar **keys;
gchar *tmp1, *tmp2;
gint i;
gtk_tree_model_get (model, iter,
PRINTER_LIST_COL_NAME, &name,
PRINTER_LIST_COL_LOCATION, &location,
-1);
casefold_key = g_utf8_casefold (key, -1);
if (name != NULL)
{
casefold_name = g_utf8_casefold (name, -1);
g_free (name);
}
if (location != NULL)
{
casefold_location = g_utf8_casefold (location, -1);
g_free (location);
}
if (casefold_name != NULL ||
casefold_location != NULL)
{
keys = g_strsplit_set (casefold_key, " \t", 0);
if (keys != NULL)
{
matches = TRUE;
for (i = 0; keys[i] != NULL; i++)
{
if (keys[i][0] != '\0')
{
tmp1 = tmp2 = NULL;
if (casefold_name != NULL)
tmp1 = g_strstr_len (casefold_name, -1, keys[i]);
if (casefold_location != NULL)
tmp2 = g_strstr_len (casefold_location, -1, keys[i]);
if (tmp1 == NULL && tmp2 == NULL)
{
matches = FALSE;
break;
}
}
}
g_strfreev (keys);
}
}
g_free (casefold_location);
g_free (casefold_name);
g_free (casefold_key);
}
return !matches;
g_object_notify (G_OBJECT (dialog), "selected-printer");
}
static void
@@ -3488,42 +3206,28 @@ static gboolean
set_active_printer (GtkPrintUnixDialog *dialog,
const gchar *printer_name)
{
GtkTreeModel *model;
GtkTreeIter iter, filter_iter;
GtkTreeSelection *selection;
GListModel *model;
GtkPrinter *printer;
guint i;
model = GTK_TREE_MODEL (dialog->printer_list);
model = gtk_column_view_get_model (GTK_COLUMN_VIEW (dialog->printer_list));
if (gtk_tree_model_get_iter_first (model, &iter))
for (i = 0; i < g_list_model_get_n_items (model); i++)
{
do
printer = g_list_model_get_item (model, i);
if (strcmp (gtk_printer_get_name (printer), printer_name) == 0)
{
gtk_tree_model_get (GTK_TREE_MODEL (dialog->printer_list), &iter,
PRINTER_LIST_COL_PRINTER_OBJ, &printer,
-1);
if (printer == NULL)
continue;
gtk_single_selection_set_selected (GTK_SINGLE_SELECTION (model), i);
if (strcmp (gtk_printer_get_name (printer), printer_name) == 0)
{
gtk_tree_model_filter_convert_child_iter_to_iter (dialog->printer_list_filter,
&filter_iter, &iter);
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->printer_treeview));
dialog->internal_printer_change = TRUE;
gtk_tree_selection_select_iter (selection, &filter_iter);
dialog->internal_printer_change = FALSE;
g_free (dialog->waiting_for_printer);
dialog->waiting_for_printer = NULL;
g_object_unref (printer);
return TRUE;
}
g_free (dialog->waiting_for_printer);
dialog->waiting_for_printer = NULL;
g_object_unref (printer);
return TRUE;
}
} while (gtk_tree_model_iter_next (model, &iter));
g_object_unref (printer);
}
return FALSE;
@@ -3697,13 +3401,8 @@ gtk_print_unix_dialog_set_manual_capabilities (GtkPrintUnixDialog *dialog,
if (dialog->current_printer)
{
GtkTreeSelection *selection;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dialog->printer_treeview));
g_clear_object (&dialog->current_printer);
dialog->internal_printer_change = TRUE;
selected_printer_changed (selection, dialog);
dialog->internal_printer_change = FALSE;
selected_printer_changed (dialog);
}
g_object_notify (G_OBJECT (dialog), "manual-capabilities");

View File

@@ -17,19 +17,6 @@
<column type="gboolean"/>
</columns>
</object>
<object class="GtkListStore" id="printer_list">
<columns>
<column type="GIcon"/>
<column type="gchararray"/>
<column type="gchararray"/>
<column type="gint"/>
<column type="gchararray"/>
<column type="GObject"/>
</columns>
</object>
<object class="GtkTreeModelFilter" id="printer_list_filter">
<property name="child-model">printer_list</property>
</object>
<object class="GtkAdjustment" id="scale_spin_adjustment">
<property name="lower">1</property>
<property name="upper">1000</property>
@@ -72,58 +59,131 @@
<property name="has-frame">1</property>
<property name="vexpand">1</property>
<child>
<object class="GtkTreeView" id="printer_treeview">
<property name="model">printer_list_filter</property>
<signal name="row-activated" handler="emit_ok_response" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection" id="treeview-selection1">
<property name="mode">browse</property>
<signal name="changed" handler="selected_printer_changed" swapped="no"/>
</object>
</child>
<object class="GtkColumnView" id="printer_list">
<property name="can-focus">1</property>
<property name="halign">fill</property>
<child>
<object class="GtkTreeViewColumn" id="printer_icon_column">
<child>
<object class="GtkCellRendererPixbuf" id="printer_icon_renderer"/>
<attributes>
<attribute name="gicon">0</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="printer_name_column">
<property name="title" translatable="yes">Printer</property>
<child>
<object class="GtkCellRendererText" id="printer_name_renderer"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="printer_location_column">
<property name="title" translatable="yes" comments="this is the header for the location column in the print dialog">Location</property>
<child>
<object class="GtkCellRendererText" id="printer_location_renderer"/>
<attributes>
<attribute name="text">4</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="printer_status_column">
<property name="title" translatable="yes" comments="this is the header for the printer status column in the print dialog">Status</property>
<child>
<object class="GtkCellRendererText" id="printer_status_renderer">
<property name="ellipsize">end</property>
<object class="GtkColumnViewColumn">
<property name="factory">
<object class="GtkBuilderListItemFactory">
<property name="bytes"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<template class="GtkListItem">
<property name="child">
<object class="GtkImage">
<binding name="icon-name">
<lookup name="icon-name" type="GtkPrinter">
<lookup name="item">GtkListItem</lookup>
</lookup>
</binding>
<binding name="sensitive">
<lookup name="accepting-jobs" type="GtkPrinter">
<lookup name="item">GtkListItem</lookup>
</lookup>
</binding>
</object>
</property>
</template>
</interface>
]]></property>
</object>
<attributes>
<attribute name="text">2</attribute>
</attributes>
</child>
</property>
</object>
</child>
<child>
<object class="GtkColumnViewColumn">
<property name="title" translatable="yes">Name</property>
<property name="factory">
<object class="GtkBuilderListItemFactory">
<property name="bytes"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<template class="GtkListItem">
<property name="child">
<object class="GtkLabel">
<property name="xalign">0</property>
<binding name="label">
<lookup name="name" type="GtkPrinter">
<lookup name="item">GtkListItem</lookup>
</lookup>
</binding>
<binding name="sensitive">
<lookup name="accepting-jobs" type="GtkPrinter">
<lookup name="item">GtkListItem</lookup>
</lookup>
</binding>
</object>
</property>
</template>
</interface>
]]></property>
</object>
</property>
</object>
</child>
<child>
<object class="GtkColumnViewColumn">
<property name="title" translatable="yes" comments="this is the header for the location column in the print dialog">Location</property>
<property name="factory">
<object class="GtkBuilderListItemFactory">
<property name="bytes"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<template class="GtkListItem">
<property name="child">
<object class="GtkLabel">
<property name="xalign">0</property>
<binding name="label">
<lookup name="location" type="GtkPrinter">
<lookup name="item">GtkListItem</lookup>
</lookup>
</binding>
<binding name="sensitive">
<lookup name="accepting-jobs" type="GtkPrinter">
<lookup name="item">GtkListItem</lookup>
</lookup>
</binding>
</object>
</property>
</template>
</interface>
]]></property>
</object>
</property>
</object>
</child>
<child>
<object class="GtkColumnViewColumn">
<property name="title" translatable="yes" comments="this is the header for the printer status column in the print dialog">Status</property>
<property name="expand">1</property>
<property name="factory">
<object class="GtkBuilderListItemFactory">
<property name="bytes"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<template class="GtkListItem">
<property name="child">
<object class="GtkLabel">
<property name="xalign">0</property>
<property name="ellipsize">end</property>
<binding name="label">
<lookup name="state-message" type="GtkPrinter">
<lookup name="item">GtkListItem</lookup>
</lookup>
</binding>
<binding name="sensitive">
<lookup name="accepting-jobs" type="GtkPrinter">
<lookup name="item">GtkListItem</lookup>
</lookup>
</binding>
</object>
</property>
</template>
</interface>
]]></property>
</object>
</property>
</object>
</child>
</object>