gnttree.h

Mon, 05 Aug 2024 23:38:25 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Mon, 05 Aug 2024 23:38:25 -0500
changeset 1478
e2f689237c38
parent 1474
03532a6ed456
permissions
-rw-r--r--

Add a turtles target

Since there are no translations or tests this just runs the all target, but
this makes this project consistent with all of the others.

Testing Done:
Ran the turtles.

Reviewed at https://reviews.imfreedom.org/r/3341/

/*
 * GNT - The GLib Ncurses Toolkit
 *
 * GNT is the legal property of its developers, whose names are too numerous
 * to list here.  Please refer to the COPYRIGHT file distributed with this
 * source distribution.
 *
 * This library 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 2 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 <https://www.gnu.org/licenses/>.
 */

#if !defined(GNT_GLOBAL_HEADER_INSIDE) && !defined(GNT_COMPILATION)
# error "only <gnt.h> may be included directly"
#endif

#ifndef GNT_TREE_H
#define GNT_TREE_H

#include "gntcolors.h"
#include "gntkeys.h"
#include "gnttextview.h"
#include "gntwidget.h"

#define GNT_TYPE_TREE gnt_tree_get_type()

#define GNT_TYPE_TREE_ROW			(gnt_tree_row_get_type())

typedef struct _GntTreeRow		GntTreeRow;

G_BEGIN_DECLS

G_DECLARE_DERIVABLE_TYPE(GntTree, gnt_tree, GNT, TREE, GntWidget)

/**
 * GntTreeClass:
 * @selection_changed: The class closure for the #GntTree::selection-changed
 *                     signal.
 * @toggled: The class closure for the #GntTree::toggled signal.
 *
 * The class structure for #GntTree.
 */
struct _GntTreeClass
{
	/*< private >*/
	GntWidgetClass parent;

	/*< public >*/
	void (*selection_changed)(GntTreeRow *old, GntTreeRow * current);
	void (*toggled)(GntTree *tree, gpointer key);

	/*< private >*/
	gpointer reserved[4];
};

/**
 * GntTreeSearchFunc:
 * @tree: The tree being searched.
 * @key: The key of a row.
 * @search: The search string.
 * @current: The content of row in the search column.
 *
 * A custom tree search function.
 *
 * Returns: If %TRUE, the row should be displayed, otherwise it's not.
 */
typedef gboolean (*GntTreeSearchFunc)(GntTree *tree, gpointer key,
                                      const gchar *search,
                                      const gchar *current);

/**
 * gnt_tree_row_get_type:
 *
 * Returns: The #GType for the #GntTreeRow boxed structure.
 */
GType gnt_tree_row_get_type(void);

/**
 * gnt_tree_new:
 *
 * Create a tree with one column.
 *
 * See gnt_tree_new_with_columns().
 *
 * Returns: The newly created tree
 */
GntWidget * gnt_tree_new(void);

/**
 * gnt_tree_new_with_columns:
 * @columns:  Number of columns
 *
 * Create a tree with a specified number of columns.
 *
 * See gnt_tree_new().
 *
 * Returns:  The newly created tree
 */
GntWidget * gnt_tree_new_with_columns(int columns);

/**
 * gnt_tree_set_visible_rows:
 * @tree:  The tree
 * @rows:  The number of rows
 *
 * The number of rows the tree should display at a time.
 */
void gnt_tree_set_visible_rows(GntTree *tree, int rows);

/**
 * gnt_tree_get_visible_rows:
 * @tree:  The tree
 *
 * Get the number visible rows.
 *
 * Returns:  The number of visible rows
 */
int gnt_tree_get_visible_rows(GntTree *tree);

/**
 * gnt_tree_scroll:
 * @tree:   The tree
 * @count:  If positive, the tree will be scrolled down by count rows,
 *               otherwise, it will be scrolled up by count rows.
 *
 * Scroll the contents of the tree.
 */
void gnt_tree_scroll(GntTree *tree, int count);

/**
 * gnt_tree_add_row_after:
 * @tree:    The tree
 * @key:     The key for the row
 * @row:     The row to insert
 * @parent:  The key for the parent row
 * @bigbro:  The key for the row to insert the new row after.
 *
 * Insert a row in the tree.
 *
 * See gnt_tree_create_row(), gnt_tree_add_row_last(), gnt_tree_add_choice().
 *
 * Returns:  The inserted row
 */
GntTreeRow * gnt_tree_add_row_after(GntTree *tree, void *key, GntTreeRow *row, void *parent, void *bigbro);

/**
 * gnt_tree_add_row_last:
 * @tree:    The tree
 * @key:     The key for the row
 * @row:     The row to insert
 * @parent:  The key for the parent row
 *
 * Insert a row at the end of the tree.
 *
 * See gnt_tree_create_row(), gnt_tree_add_row_after(), gnt_tree_add_choice().
 *
 * Returns: The inserted row
 */
GntTreeRow * gnt_tree_add_row_last(GntTree *tree, void *key, GntTreeRow *row, void *parent);

/**
 * gnt_tree_get_selection_data:
 * @tree:  The tree
 *
 * Get the key for the selected row.
 *
 * Returns: (transfer none): The key for the selected row
 */
gpointer gnt_tree_get_selection_data(GntTree *tree);

/**
 * gnt_tree_get_selection_text:
 * @tree:  The tree
 *
 * Get the text displayed for the selected row.
 *
 * See gnt_tree_get_row_text_list(), gnt_tree_get_selection_text_list().
 *
 * Returns:  The text, which needs to be freed by the caller
 */
char * gnt_tree_get_selection_text(GntTree *tree);

/**
 * gnt_tree_get_row_text_list:
 * @tree:  The tree
 * @key:   A key corresponding to the row in question. If key
 *         is %NULL, the text list for the selected row will
 *         be returned.
 *
 * Get a list of text for a row.
 *
 * See gnt_tree_get_selection_text_list(), gnt_tree_get_selection_text().
 *
 * Returns: (transfer container) (element-type utf8): A list of texts of a row.
 *          The list and its data should be freed by the caller. The caller
 *          should make sure that if any column of the tree contains binary
 *          data, it's not freed.
 */
/* TODO This leaks when used from introspection. The transfer mode for the
        return type here should be 'full', but that would free binary data as
        well. */
GList * gnt_tree_get_row_text_list(GntTree *tree, gpointer key);

/**
 * gnt_tree_row_get_key:
 * @tree:   The tree
 * @row:    The GntTreeRow object
 *
 * Get the key of a row.
 *
 * Returns: (transfer none): The key of the row.
 *
 * Since: 2.7.3
 */
gpointer gnt_tree_row_get_key(GntTree *tree, GntTreeRow *row);

/**
 * gnt_tree_row_get_next:
 * @tree: The tree
 * @row:  The GntTreeRow object
 *
 * Get the next row.
 *
 * Returns: The next row.
 *
 * Since: 2.7.3
 */
GntTreeRow * gnt_tree_row_get_next(GntTree *tree, GntTreeRow *row);

/**
 * gnt_tree_row_get_prev:
 * @tree: The tree
 * @row:  The GntTreeRow object
 *
 * Get the previous row.
 *
 * Returns: The previous row.
 *
 * Since: 2.7.3
 */
GntTreeRow * gnt_tree_row_get_prev(GntTree *tree, GntTreeRow *row);

/**
 * gnt_tree_row_get_child:
 * @tree: The tree
 * @row:  The GntTreeRow object
 *
 * Get the child row.
 *
 * Returns: The child row.
 *
 * Since: 2.7.3
 */
GntTreeRow * gnt_tree_row_get_child(GntTree *tree, GntTreeRow *row);

/**
 * gnt_tree_row_get_parent:
 * @tree: The tree
 * @row:  The GntTreeRow object
 *
 * Get the parent row.
 *
 * Returns: The parent row.
 *
 * Since: 2.7.3
 */
GntTreeRow * gnt_tree_row_get_parent(GntTree *tree, GntTreeRow *row);

/**
 * gnt_tree_get_selection_text_list:
 * @tree:  The tree
 *
 * Get a list of text of the current row.
 *
 * See gnt_tree_get_row_text_list(), gnt_tree_get_selection_text().
 *
 * Returns: (transfer container) (element-type utf8): A list of texts of the
 *          currently selected row. The list and its data should be freed by
 *          the caller. The caller should make sure that if any column of the
 *          tree contains binary data, it's not freed.
 */
/* TODO This leaks when used from introspection. The transfer mode for the
        return type here should be 'full', but that would free binary data as
        well. */
GList * gnt_tree_get_selection_text_list(GntTree *tree);

/**
 * gnt_tree_get_rows:
 * @tree:  The tree
 *
 * Returns the list of rows in the tree.
 *
 * Returns: (transfer none) (element-type Gnt.TreeRow): The list of the rows.
 *          The list should not be modified by the caller.
 */
GList *gnt_tree_get_rows(GntTree *tree);

/**
 * gnt_tree_remove:
 * @tree:  The tree
 * @key:   The key for the row to remove
 *
 * Remove a row from the tree.
 */
void gnt_tree_remove(GntTree *tree, gpointer key);

/**
 * gnt_tree_remove_all:
 * @tree:  The tree
 *
 * Remove all the item from the tree.
 */
void gnt_tree_remove_all(GntTree *tree);

/**
 * gnt_tree_get_selection_visible_line:
 * @tree:  The tree
 *
 * Get the visible line number of the selected row.
 *
 * Returns:  The line number of the currently selected row
 */
int gnt_tree_get_selection_visible_line(GntTree *tree);

/**
 * gnt_tree_change_text:
 * @tree:   The tree
 * @key:    The key for the row
 * @colno:  The index of the column
 * @text:   The new text
 *
 * Change the text of a column in a row.
 */
void gnt_tree_change_text(GntTree *tree, gpointer key, int colno, const char *text);

/**
 * gnt_tree_add_choice:
 * @tree:    The tree
 * @key:     The key for the row
 * @row:     The row to add
 * @parent:  The parent of the row, or %NULL
 * @bigbro:  The row to insert after, or %NULL
 *
 * Add a checkable item in the tree.
 *
 * See gnt_tree_create_row(), gnt_tree_create_row_from_list(),
 *     gnt_tree_add_row_last(), gnt_tree_add_row_after().
 *
 * Returns:  The row inserted.
 */
GntTreeRow * gnt_tree_add_choice(GntTree *tree, void *key, GntTreeRow *row, void *parent, void *bigbro);

/**
 * gnt_tree_set_choice:
 * @tree:   The tree
 * @key:    The key for the row
 * @set:    %TRUE if the item should be checked, %FALSE if not
 *
 * Set whether a checkable item is checked or not.
 */
void gnt_tree_set_choice(GntTree *tree, void *key, gboolean set);

/**
 * gnt_tree_get_choice:
 * @tree:  The tree
 * @key:   The key for the row
 *
 * Return whether a row is selected or not, where the row is a checkable item.
 *
 * Returns:    %TRUE if the row is checked, %FALSE otherwise.
 */
gboolean gnt_tree_get_choice(GntTree *tree, void *key);

/**
 * gnt_tree_set_row_flags:
 * @tree:   The tree
 * @key:    The key for the row
 * @flags:  The flags to set
 *
 * Set flags for the text in a row in the tree.
 */
void gnt_tree_set_row_flags(GntTree *tree, void *key, GntTextFormatFlags flags);

/**
 * gnt_tree_set_row_color:
 * @tree:   The tree
 * @key:    The key for the row
 * @color:  The color
 *
 * Set color for the text in a row in the tree.
 *
 * Since: 2.4
 */
void gnt_tree_set_row_color(GntTree *tree, void *key, int color);

/**
 * gnt_tree_set_selected:
 * @tree:  The tree
 * @key:   The key of the row to select
 *
 * Select a row.
 */
void gnt_tree_set_selected(GntTree *tree , void *key);

/**
 * gnt_tree_create_row:
 * @tree: The tree
 * @...:  A string for each column in the tree
 *
 * Create a row to insert in the tree.
 *
 * See gnt_tree_create_row_from_list(), gnt_tree_add_row_after(),
 *     gnt_tree_add_row_last(), gnt_tree_add_choice().
 *
 * Returns:   The row
 */
GntTreeRow * gnt_tree_create_row(GntTree *tree, ...);

/**
 * gnt_tree_create_row_from_list:
 * @tree: The tree
 * @list: (element-type utf8): The list containing the text for each column
 *
 * Create a row from a list of text.
 *
 * See gnt_tree_create_row(), gnt_tree_add_row_after(), gnt_tree_add_row_last(),
 *     gnt_tree_add_choice().
 *
 * Returns: (transfer full): The row
 */
GntTreeRow * gnt_tree_create_row_from_list(GntTree *tree, GList *list);

/**
 * gnt_tree_set_col_width:
 * @tree:   The tree
 * @col:    The index of the column
 * @width:  The width for the column
 *
 * Set the width of a column in the tree.
 *
 * See gnt_tree_set_column_width_ratio(), gnt_tree_set_column_resizable()
 */
void gnt_tree_set_col_width(GntTree *tree, int col, int width);

/**
 * gnt_tree_set_column_title:
 * @tree:   The tree
 * @index:  The index of the column
 * @title:  The title for the column
 *
 * Set the title for a column.
 *
 * See gnt_tree_set_column_titles(), gnt_tree_set_show_title().
 *
 * Since: 2.1
 */
void gnt_tree_set_column_title(GntTree *tree, int index, const char *title);

/**
 * gnt_tree_set_column_titles:
 * @tree:  The tree
 * @...:   One title for each column in the tree
 *
 * Set the titles of the columns
 *
 * See gnt_tree_set_column_title(), gnt_tree_set_show_title().
 */
void gnt_tree_set_column_titles(GntTree *tree, ...);

/**
 * gnt_tree_set_show_title:
 * @tree:  The tree
 * @set:   If %TRUE, the column titles are displayed
 *
 * Set whether to display the title of the columns.
 *
 * See gnt_tree_set_column_title(), gnt_tree_set_column_titles().
 */
void gnt_tree_set_show_title(GntTree *tree, gboolean set);

/**
 * gnt_tree_set_compare_func:
 * @tree: The tree.
 * @func: (scope forever): The comparison function, which is used to compare
 *        the keys.
 *
 * Set the compare function for sorting the data.
 *
 * See gnt_tree_sort_row().
 */
void gnt_tree_set_compare_func(GntTree *tree, GCompareFunc func);

/**
 * gnt_tree_set_expanded:
 * @tree:      The tree
 * @key:       The key of the row
 * @expanded:  Whether to expand the child rows
 *
 * Set whether a row, which has child rows, should be expanded.
 */
void gnt_tree_set_expanded(GntTree *tree, void *key, gboolean expanded);

/**
 * gnt_tree_set_show_separator:
 * @tree:  The tree
 * @set:   If %TRUE, the column separators are displayed
 *
 * Set whether to show column separators.
 */
void gnt_tree_set_show_separator(GntTree *tree, gboolean set);

/**
 * gnt_tree_sort_row:
 * @tree:  The tree
 * @row:   The row to sort
 *
 * Sort a row in the tree.
 *
 * See gnt_tree_set_compare_func().
 */
void gnt_tree_sort_row(GntTree *tree, void *row);

/**
 * gnt_tree_adjust_columns:
 * @tree:  The tree
 *
 * Automatically adjust the width of the columns in the tree.
 */
void gnt_tree_adjust_columns(GntTree *tree);

/**
 * gnt_tree_set_hash_fns:
 * @tree: The tree.
 * @hash: (scope forever): The hashing function.
 * @eq: (scope forever): The function to compare keys.
 * @kd: (scope forever): The function to use to free the keys when a row is
 *      removed from the tree.
 *
 * Set the hash functions to use to hash, compare and free the keys.
 */
void gnt_tree_set_hash_fns(GntTree *tree, GHashFunc hash, GEqualFunc eq,
                           GDestroyNotify kd);

/**
 * gnt_tree_set_column_visible:
 * @tree:  The tree
 * @col:   The index of the column
 * @vis:   If %FALSE, the column will not be displayed
 *
 * Set whether a column is visible or not.
 * This can be useful when, for example, we want to store some data
 * which we don't want/need to display.
 */
void gnt_tree_set_column_visible(GntTree *tree, int col, gboolean vis);

/**
 * gnt_tree_set_column_resizable:
 * @tree:  The tree
 * @col:   The index of the column
 * @res:   If %FALSE, the column will not be resized when the
 *              tree is resized
 *
 * Set whether a column can be resized to keep the same ratio when the
 * tree is resized.
 *
 * See gnt_tree_set_col_width(), gnt_tree_set_column_width_ratio().
 *
 * Since: 2.1
 */
void gnt_tree_set_column_resizable(GntTree *tree, int col, gboolean res);

/**
 * gnt_tree_set_column_is_binary:
 * @tree:  The tree
 * @col:   The index of the column
 * @bin:   %TRUE if the data for the column is binary
 *
 * Set whether data in a column should be considered as binary data, and
 * not as strings. A column containing binary data will be display empty text.
 */
void gnt_tree_set_column_is_binary(GntTree *tree, int col, gboolean bin);

/**
 * gnt_tree_set_column_is_right_aligned:
 * @tree:  The tree
 * @col:   The index of the column
 * @right: %TRUE if the text in the column should be right aligned
 *
 * Set whether text in a column should be right-aligned.
 *
 * Since: 2.1
 */
void gnt_tree_set_column_is_right_aligned(GntTree *tree, int col, gboolean right);

/**
 * gnt_tree_set_column_width_ratio:
 * @tree:   The tree
 * @cols:   Array of widths. The width must have the same number
 *               of entries as the number of columns in the tree, or
 *               end with a negative value for a column-width.
 *
 * Set column widths to use when calculating column widths after a tree
 * is resized.
 *
 * See gnt_tree_set_col_width(), gnt_tree_set_column_resizable().
 *
 * Since: 2.1
 */
void gnt_tree_set_column_width_ratio(GntTree *tree, int cols[]);

/**
 * gnt_tree_set_search_column:
 * @tree:   The tree
 * @col:    The index of the column
 *
 * Set the column to use for typeahead searching.
 *
 * Since: 2.1
 */
void gnt_tree_set_search_column(GntTree *tree, int col);

/**
 * gnt_tree_is_searching:
 * @tree:   The tree
 *
 * Check whether the user is currently in the middle of a search.
 *
 * Returns:  %TRUE if the user is searching, %FALSE otherwise.
 *
 * Since: 2.1
 */
gboolean gnt_tree_is_searching(GntTree *tree);

/**
 * gnt_tree_set_search_function:
 * @tree: The tree.
 * @func: (scope forever): The custom search function.
 *
 * Set a custom search function.
 *
 * Since: 2.1
 */
void gnt_tree_set_search_function(GntTree *tree, GntTreeSearchFunc func);

/**
 * gnt_tree_get_parent_key:
 * @tree:  The tree
 * @key:   The key for the row.
 *
 * Get the parent key for a row.
 *
 * Returns: (transfer none): The key of the parent row.
 *
 * Since: 2.4
 */
gpointer gnt_tree_get_parent_key(GntTree *tree, gpointer key);

G_END_DECLS

#endif /* GNT_TREE_H */

mercurial