diff options
Diffstat (limited to 'clients/tui/nmt-editor-grid.c')
| -rw-r--r-- | clients/tui/nmt-editor-grid.c | 582 |
1 files changed, 288 insertions, 294 deletions
diff --git a/clients/tui/nmt-editor-grid.c b/clients/tui/nmt-editor-grid.c index ac00c82b..3b4b9b20 100644 --- a/clients/tui/nmt-editor-grid.c +++ b/clients/tui/nmt-editor-grid.c @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: GPL-2.0+ +/* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright (C) 2013 Red Hat, Inc. */ @@ -28,25 +28,26 @@ #include "nmt-editor-grid.h" -G_DEFINE_TYPE (NmtEditorGrid, nmt_editor_grid, NMT_TYPE_NEWT_CONTAINER) +G_DEFINE_TYPE(NmtEditorGrid, nmt_editor_grid, NMT_TYPE_NEWT_CONTAINER) -#define NMT_EDITOR_GRID_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMT_TYPE_EDITOR_GRID, NmtEditorGridPrivate)) +#define NMT_EDITOR_GRID_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE((o), NMT_TYPE_EDITOR_GRID, NmtEditorGridPrivate)) typedef struct { - GArray *rows; - int *row_heights; - int indent; + GArray *rows; + int * row_heights; + int indent; } NmtEditorGridPrivate; typedef struct { - NmtNewtWidget *label; - NmtNewtWidget *widget; - NmtNewtWidget *extra; - NmtEditorGridRowFlags flags; + NmtNewtWidget * label; + NmtNewtWidget * widget; + NmtNewtWidget * extra; + NmtEditorGridRowFlags flags; } NmtEditorGridRow; typedef struct { - int col_widths[3]; + int col_widths[3]; } NmtEditorGridFormState; /** @@ -57,29 +58,28 @@ typedef struct { * Returns: a new #NmtEditorGrid */ NmtNewtWidget * -nmt_editor_grid_new (void) +nmt_editor_grid_new(void) { - return g_object_new (NMT_TYPE_EDITOR_GRID, - NULL); + return g_object_new(NMT_TYPE_EDITOR_GRID, NULL); } static void -nmt_editor_grid_init (NmtEditorGrid *grid) +nmt_editor_grid_init(NmtEditorGrid *grid) { - NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (grid); + NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE(grid); - priv->rows = g_array_new (FALSE, TRUE, sizeof (NmtEditorGridRow)); + priv->rows = g_array_new(FALSE, TRUE, sizeof(NmtEditorGridRow)); } static void -nmt_editor_grid_finalize (GObject *object) +nmt_editor_grid_finalize(GObject *object) { - NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (object); + NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE(object); - g_array_unref (priv->rows); - nm_clear_g_free (&priv->row_heights); + g_array_unref(priv->rows); + nm_clear_g_free(&priv->row_heights); - G_OBJECT_CLASS (nmt_editor_grid_parent_class)->finalize (object); + G_OBJECT_CLASS(nmt_editor_grid_parent_class)->finalize(object); } /** @@ -101,60 +101,61 @@ nmt_editor_grid_finalize (GObject *object) * See also nmt_editor_grid_set_row_flags(). */ void -nmt_editor_grid_append (NmtEditorGrid *grid, - const char *label, - NmtNewtWidget *widget, - NmtNewtWidget *extra) +nmt_editor_grid_append(NmtEditorGrid *grid, + const char * label, + NmtNewtWidget *widget, + NmtNewtWidget *extra) { - NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (grid); - NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS (nmt_editor_grid_parent_class); - NmtNewtContainer *container = NMT_NEWT_CONTAINER (grid); - NmtEditorGridRow row; - - g_return_if_fail (label != NULL || widget != NULL); - - memset (&row, 0, sizeof (row)); - - if (label && !widget) { - widget = nmt_newt_label_new (label); - label = NULL; - } - - if (label) { - row.label = nmt_newt_label_new (label); - parent_class->add (container, row.label); - } - - row.widget = widget; - parent_class->add (container, widget); - if (row.label) { - g_object_bind_property (row.widget, "valid", - row.label, "highlight", - G_BINDING_INVERT_BOOLEAN | G_BINDING_SYNC_CREATE); - } - - if (extra) { - row.extra = extra; - parent_class->add (container, extra); - } - - g_array_append_val (priv->rows, row); + NmtEditorGridPrivate * priv = NMT_EDITOR_GRID_GET_PRIVATE(grid); + NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS(nmt_editor_grid_parent_class); + NmtNewtContainer * container = NMT_NEWT_CONTAINER(grid); + NmtEditorGridRow row; + + g_return_if_fail(label != NULL || widget != NULL); + + memset(&row, 0, sizeof(row)); + + if (label && !widget) { + widget = nmt_newt_label_new(label); + label = NULL; + } + + if (label) { + row.label = nmt_newt_label_new(label); + parent_class->add(container, row.label); + } + + row.widget = widget; + parent_class->add(container, widget); + if (row.label) { + g_object_bind_property(row.widget, + "valid", + row.label, + "highlight", + G_BINDING_INVERT_BOOLEAN | G_BINDING_SYNC_CREATE); + } + + if (extra) { + row.extra = extra; + parent_class->add(container, extra); + } + + g_array_append_val(priv->rows, row); } static int -nmt_editor_grid_find_widget (NmtEditorGrid *grid, - NmtNewtWidget *widget) +nmt_editor_grid_find_widget(NmtEditorGrid *grid, NmtNewtWidget *widget) { - NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (grid); - NmtEditorGridRow *rows = (NmtEditorGridRow *) priv->rows->data; - int i; + NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE(grid); + NmtEditorGridRow * rows = (NmtEditorGridRow *) priv->rows->data; + int i; - for (i = 0; i < priv->rows->len; i++) { - if (rows[i].label == widget || rows[i].widget == widget || rows[i].extra == widget) - return i; - } + for (i = 0; i < priv->rows->len; i++) { + if (rows[i].label == widget || rows[i].widget == widget || rows[i].extra == widget) + return i; + } - return -1; + return -1; } /** @@ -176,272 +177,265 @@ nmt_editor_grid_find_widget (NmtEditorGrid *grid, * Sets flags to adjust the layout of @widget's row in @grid. */ void -nmt_editor_grid_set_row_flags (NmtEditorGrid *grid, - NmtNewtWidget *widget, - NmtEditorGridRowFlags flags) +nmt_editor_grid_set_row_flags(NmtEditorGrid * grid, + NmtNewtWidget * widget, + NmtEditorGridRowFlags flags) { - NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (grid); - NmtEditorGridRow *rows = (NmtEditorGridRow *) priv->rows->data; - int i; + NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE(grid); + NmtEditorGridRow * rows = (NmtEditorGridRow *) priv->rows->data; + int i; - i = nmt_editor_grid_find_widget (grid, widget); - if (i != -1) - rows[i].flags = flags; + i = nmt_editor_grid_find_widget(grid, widget); + if (i != -1) + rows[i].flags = flags; } static void -nmt_editor_grid_remove (NmtNewtContainer *container, - NmtNewtWidget *widget) +nmt_editor_grid_remove(NmtNewtContainer *container, NmtNewtWidget *widget) { - NmtEditorGrid *grid = NMT_EDITOR_GRID (container); - NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (grid); - NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS (nmt_editor_grid_parent_class); - NmtEditorGridRow *rows = (NmtEditorGridRow *) priv->rows->data; - int i; - - i = nmt_editor_grid_find_widget (grid, widget); - if (i != -1) { - if (rows[i].label) - parent_class->remove (container, rows[i].label); - parent_class->remove (container, rows[i].widget); - if (rows[i].extra) - parent_class->remove (container, rows[i].extra); - - g_array_remove_index (priv->rows, i); - return; - } - - // FIXME: shouldn't happen - parent_class->remove (container, widget); + NmtEditorGrid * grid = NMT_EDITOR_GRID(container); + NmtEditorGridPrivate * priv = NMT_EDITOR_GRID_GET_PRIVATE(grid); + NmtNewtContainerClass *parent_class = NMT_NEWT_CONTAINER_CLASS(nmt_editor_grid_parent_class); + NmtEditorGridRow * rows = (NmtEditorGridRow *) priv->rows->data; + int i; + + i = nmt_editor_grid_find_widget(grid, widget); + if (i != -1) { + if (rows[i].label) + parent_class->remove(container, rows[i].label); + parent_class->remove(container, rows[i].widget); + if (rows[i].extra) + parent_class->remove(container, rows[i].extra); + + g_array_remove_index(priv->rows, i); + return; + } + + // FIXME: shouldn't happen + parent_class->remove(container, widget); } static newtComponent * -nmt_editor_grid_get_components (NmtNewtWidget *widget) +nmt_editor_grid_get_components(NmtNewtWidget *widget) { - NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (widget); - NmtEditorGridRow *rows = (NmtEditorGridRow *) priv->rows->data; - newtComponent *child_cos; - GPtrArray *cos; - int i, c; - - cos = g_ptr_array_new (); - - for (i = 0; i < priv->rows->len; i++) { - if (!nmt_newt_widget_get_visible (rows[i].widget)) - continue; - - if (rows[i].label) { - child_cos = nmt_newt_widget_get_components (rows[i].label); - g_assert (child_cos[0] && !child_cos[1]); - g_ptr_array_add (cos, child_cos[0]); - g_free (child_cos); - } - - child_cos = nmt_newt_widget_get_components (rows[i].widget); - for (c = 0; child_cos[c]; c++) - g_ptr_array_add (cos, child_cos[c]); - g_free (child_cos); - - if (rows[i].extra) { - child_cos = nmt_newt_widget_get_components (rows[i].extra); - for (c = 0; child_cos[c]; c++) - g_ptr_array_add (cos, child_cos[c]); - g_free (child_cos); - } - } - - g_ptr_array_add (cos, NULL); - return (newtComponent *) g_ptr_array_free (cos, FALSE); + NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE(widget); + NmtEditorGridRow * rows = (NmtEditorGridRow *) priv->rows->data; + newtComponent * child_cos; + GPtrArray * cos; + int i, c; + + cos = g_ptr_array_new(); + + for (i = 0; i < priv->rows->len; i++) { + if (!nmt_newt_widget_get_visible(rows[i].widget)) + continue; + + if (rows[i].label) { + child_cos = nmt_newt_widget_get_components(rows[i].label); + g_assert(child_cos[0] && !child_cos[1]); + g_ptr_array_add(cos, child_cos[0]); + g_free(child_cos); + } + + child_cos = nmt_newt_widget_get_components(rows[i].widget); + for (c = 0; child_cos[c]; c++) + g_ptr_array_add(cos, child_cos[c]); + g_free(child_cos); + + if (rows[i].extra) { + child_cos = nmt_newt_widget_get_components(rows[i].extra); + for (c = 0; child_cos[c]; c++) + g_ptr_array_add(cos, child_cos[c]); + g_free(child_cos); + } + } + + g_ptr_array_add(cos, NULL); + return (newtComponent *) g_ptr_array_free(cos, FALSE); } static NmtEditorGridFormState * -get_form_state (NmtNewtWidget *widget) +get_form_state(NmtNewtWidget *widget) { - NmtNewtForm *form = nmt_newt_widget_get_form (widget); - NmtEditorGridFormState *state; + NmtNewtForm * form = nmt_newt_widget_get_form(widget); + NmtEditorGridFormState *state; - if (!form) - return NULL; + if (!form) + return NULL; - state = g_object_get_data (G_OBJECT (form), "NmtEditorGridFormState"); - if (state) - return state; + state = g_object_get_data(G_OBJECT(form), "NmtEditorGridFormState"); + if (state) + return state; - state = g_new0 (NmtEditorGridFormState, 1); - g_object_set_data_full (G_OBJECT (form), "NmtEditorGridFormState", state, g_free); - return state; + state = g_new0(NmtEditorGridFormState, 1); + g_object_set_data_full(G_OBJECT(form), "NmtEditorGridFormState", state, g_free); + return state; } static void -nmt_editor_grid_realize (NmtNewtWidget *widget) +nmt_editor_grid_realize(NmtNewtWidget *widget) { - NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (widget); - NmtNewtWidget *parent; - - NMT_NEWT_WIDGET_CLASS (nmt_editor_grid_parent_class)->realize (widget); - - /* This is a hack, but it's the simplest way to make it work... */ - priv->indent = 0; - - parent = nmt_newt_widget_get_parent (widget); - while (parent) { - if (NMT_IS_NEWT_SECTION (parent)) { - priv->indent = 2; - break; - } - parent = nmt_newt_widget_get_parent (parent); - } + NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE(widget); + NmtNewtWidget * parent; + + NMT_NEWT_WIDGET_CLASS(nmt_editor_grid_parent_class)->realize(widget); + + /* This is a hack, but it's the simplest way to make it work... */ + priv->indent = 0; + + parent = nmt_newt_widget_get_parent(widget); + while (parent) { + if (NMT_IS_NEWT_SECTION(parent)) { + priv->indent = 2; + break; + } + parent = nmt_newt_widget_get_parent(parent); + } } static void -nmt_editor_grid_unrealize (NmtNewtWidget *widget) +nmt_editor_grid_unrealize(NmtNewtWidget *widget) { - NmtEditorGridFormState *state = get_form_state (widget); + NmtEditorGridFormState *state = get_form_state(widget); - if (state) - memset (state->col_widths, 0, sizeof (state->col_widths)); + if (state) + memset(state->col_widths, 0, sizeof(state->col_widths)); - NMT_NEWT_WIDGET_CLASS (nmt_editor_grid_parent_class)->unrealize (widget); + NMT_NEWT_WIDGET_CLASS(nmt_editor_grid_parent_class)->unrealize(widget); } static void -nmt_editor_grid_size_request (NmtNewtWidget *widget, - int *width, - int *height) +nmt_editor_grid_size_request(NmtNewtWidget *widget, int *width, int *height) { - NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (widget); - NmtEditorGridRow *rows = (NmtEditorGridRow *) priv->rows->data; - NmtEditorGridFormState *state = get_form_state (widget); - gboolean add_padding = FALSE; - int i; - - g_free (priv->row_heights); - priv->row_heights = g_new0 (int, priv->rows->len); - - *height = 0; - for (i = 0; i < priv->rows->len; i++) { - int lwidth, lheight, wwidth, wheight, ewidth, eheight; - - if (!nmt_newt_widget_get_visible (rows[i].widget)) - continue; - - if (rows[i].label) { - nmt_newt_widget_size_request (rows[i].label, &lwidth, &lheight); - lwidth += priv->indent; - state->col_widths[0] = MAX (state->col_widths[0], lwidth); - - nmt_newt_widget_size_request (rows[i].widget, &wwidth, &wheight); - state->col_widths[1] = MAX (state->col_widths[1], wwidth); - priv->row_heights[i] = wheight; - - add_padding = TRUE; - } else { - nmt_newt_widget_size_request (rows[i].widget, &wwidth, &wheight); - priv->row_heights[i] = wheight; - } - - if (rows[i].extra) { - nmt_newt_widget_size_request (rows[i].extra, &ewidth, &eheight); - state->col_widths[2] = MAX (state->col_widths[2], ewidth); - priv->row_heights[i] = MAX (priv->row_heights[i], eheight); - } - - *height += priv->row_heights[i]; - } - - *width = state->col_widths[0] + state->col_widths[1] + state->col_widths[2]; - if (add_padding) - *width += 2; + NmtEditorGridPrivate * priv = NMT_EDITOR_GRID_GET_PRIVATE(widget); + NmtEditorGridRow * rows = (NmtEditorGridRow *) priv->rows->data; + NmtEditorGridFormState *state = get_form_state(widget); + gboolean add_padding = FALSE; + int i; + + g_free(priv->row_heights); + priv->row_heights = g_new0(int, priv->rows->len); + + *height = 0; + for (i = 0; i < priv->rows->len; i++) { + int lwidth, lheight, wwidth, wheight, ewidth, eheight; + + if (!nmt_newt_widget_get_visible(rows[i].widget)) + continue; + + if (rows[i].label) { + nmt_newt_widget_size_request(rows[i].label, &lwidth, &lheight); + lwidth += priv->indent; + state->col_widths[0] = MAX(state->col_widths[0], lwidth); + + nmt_newt_widget_size_request(rows[i].widget, &wwidth, &wheight); + state->col_widths[1] = MAX(state->col_widths[1], wwidth); + priv->row_heights[i] = wheight; + + add_padding = TRUE; + } else { + nmt_newt_widget_size_request(rows[i].widget, &wwidth, &wheight); + priv->row_heights[i] = wheight; + } + + if (rows[i].extra) { + nmt_newt_widget_size_request(rows[i].extra, &ewidth, &eheight); + state->col_widths[2] = MAX(state->col_widths[2], ewidth); + priv->row_heights[i] = MAX(priv->row_heights[i], eheight); + } + + *height += priv->row_heights[i]; + } + + *width = state->col_widths[0] + state->col_widths[1] + state->col_widths[2]; + if (add_padding) + *width += 2; } static void -nmt_editor_grid_size_allocate (NmtNewtWidget *widget, - int x, - int y, - int width, - int height) +nmt_editor_grid_size_allocate(NmtNewtWidget *widget, int x, int y, int width, int height) { - NmtEditorGridPrivate *priv = NMT_EDITOR_GRID_GET_PRIVATE (widget); - NmtEditorGridRow *rows = (NmtEditorGridRow *) priv->rows->data; - NmtEditorGridFormState *state = get_form_state (widget); - int col0_width, col1_width, col2_width; - int i, row; - - col0_width = state->col_widths[0] - priv->indent; - col1_width = state->col_widths[1]; - col2_width = state->col_widths[2]; - - for (i = row = 0; i < priv->rows->len; i++) { - if (!nmt_newt_widget_get_visible (rows[i].widget)) - continue; - - if (rows[i].label) { - int lwidth, lheight, lx; - - if (rows[i].flags & NMT_EDITOR_GRID_ROW_LABEL_ALIGN_LEFT) - lx = x; - else { - nmt_newt_widget_size_request (rows[i].label, &lwidth, &lheight); - lx = x + col0_width - lwidth; - } - - nmt_newt_widget_size_allocate (rows[i].label, - lx, - y + row, - col0_width, - priv->row_heights[i]); - - nmt_newt_widget_size_allocate (rows[i].widget, - x + col0_width + 1, - y + row, - col1_width, - priv->row_heights[i]); - } else { - nmt_newt_widget_size_allocate (rows[i].widget, - x, - y + row, - col0_width + col1_width + 1, - priv->row_heights[i]); - } - - if (rows[i].extra) { - int wwidth, wheight, ex; - - if (rows[i].flags & NMT_EDITOR_GRID_ROW_EXTRA_ALIGN_RIGHT) - ex = x + col0_width + col1_width + 2; - else { - nmt_newt_widget_size_request (rows[i].widget, &wwidth, &wheight); - ex = x + col0_width + wwidth + 2; - } - - nmt_newt_widget_size_allocate (rows[i].extra, - ex, - y + row, - col2_width, - priv->row_heights[i]); - } - - row += priv->row_heights[i]; - } + NmtEditorGridPrivate * priv = NMT_EDITOR_GRID_GET_PRIVATE(widget); + NmtEditorGridRow * rows = (NmtEditorGridRow *) priv->rows->data; + NmtEditorGridFormState *state = get_form_state(widget); + int col0_width, col1_width, col2_width; + int i, row; + + col0_width = state->col_widths[0] - priv->indent; + col1_width = state->col_widths[1]; + col2_width = state->col_widths[2]; + + for (i = row = 0; i < priv->rows->len; i++) { + if (!nmt_newt_widget_get_visible(rows[i].widget)) + continue; + + if (rows[i].label) { + int lwidth, lheight, lx; + + if (rows[i].flags & NMT_EDITOR_GRID_ROW_LABEL_ALIGN_LEFT) + lx = x; + else { + nmt_newt_widget_size_request(rows[i].label, &lwidth, &lheight); + lx = x + col0_width - lwidth; + } + + nmt_newt_widget_size_allocate(rows[i].label, + lx, + y + row, + col0_width, + priv->row_heights[i]); + + nmt_newt_widget_size_allocate(rows[i].widget, + x + col0_width + 1, + y + row, + col1_width, + priv->row_heights[i]); + } else { + nmt_newt_widget_size_allocate(rows[i].widget, + x, + y + row, + col0_width + col1_width + 1, + priv->row_heights[i]); + } + + if (rows[i].extra) { + int wwidth, wheight, ex; + + if (rows[i].flags & NMT_EDITOR_GRID_ROW_EXTRA_ALIGN_RIGHT) + ex = x + col0_width + col1_width + 2; + else { + nmt_newt_widget_size_request(rows[i].widget, &wwidth, &wheight); + ex = x + col0_width + wwidth + 2; + } + + nmt_newt_widget_size_allocate(rows[i].extra, + ex, + y + row, + col2_width, + priv->row_heights[i]); + } + + row += priv->row_heights[i]; + } } static void -nmt_editor_grid_class_init (NmtEditorGridClass *grid_class) +nmt_editor_grid_class_init(NmtEditorGridClass *grid_class) { - GObjectClass *object_class = G_OBJECT_CLASS (grid_class); - NmtNewtWidgetClass *widget_class = NMT_NEWT_WIDGET_CLASS (grid_class); - NmtNewtContainerClass *container_class = NMT_NEWT_CONTAINER_CLASS (grid_class); + GObjectClass * object_class = G_OBJECT_CLASS(grid_class); + NmtNewtWidgetClass * widget_class = NMT_NEWT_WIDGET_CLASS(grid_class); + NmtNewtContainerClass *container_class = NMT_NEWT_CONTAINER_CLASS(grid_class); - g_type_class_add_private (grid_class, sizeof (NmtEditorGridPrivate)); + g_type_class_add_private(grid_class, sizeof(NmtEditorGridPrivate)); - /* virtual methods */ - object_class->finalize = nmt_editor_grid_finalize; + /* virtual methods */ + object_class->finalize = nmt_editor_grid_finalize; - widget_class->realize = nmt_editor_grid_realize; - widget_class->unrealize = nmt_editor_grid_unrealize; - widget_class->get_components = nmt_editor_grid_get_components; - widget_class->size_request = nmt_editor_grid_size_request; - widget_class->size_allocate = nmt_editor_grid_size_allocate; + widget_class->realize = nmt_editor_grid_realize; + widget_class->unrealize = nmt_editor_grid_unrealize; + widget_class->get_components = nmt_editor_grid_get_components; + widget_class->size_request = nmt_editor_grid_size_request; + widget_class->size_allocate = nmt_editor_grid_size_allocate; - container_class->remove = nmt_editor_grid_remove; + container_class->remove = nmt_editor_grid_remove; } |