forked from AuroraMiddleware/gtk
752 lines
13 KiB
C
752 lines
13 KiB
C
/* Flow Box
|
|
*
|
|
* GtkFlowBox allows flexible and responsive grids which reflow
|
|
* as needed and support sorting and filtering.
|
|
*
|
|
* The children of a GtkFlowBox are regular widgets
|
|
*/
|
|
|
|
#include <gtk/gtk.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
static void
|
|
draw_color (GtkDrawingArea *drawingarea,
|
|
cairo_t *cr,
|
|
int width,
|
|
int height,
|
|
gpointer data)
|
|
{
|
|
const char *color_name = data;
|
|
GdkRGBA rgba;
|
|
|
|
if (gdk_rgba_parse (&rgba, color_name))
|
|
{
|
|
gdk_cairo_set_source_rgba (cr, &rgba);
|
|
cairo_paint (cr);
|
|
}
|
|
}
|
|
|
|
static GtkWidget *
|
|
color_swatch_new (const gchar *color)
|
|
{
|
|
GtkWidget *button, *area;
|
|
|
|
button = gtk_button_new ();
|
|
area = gtk_drawing_area_new ();
|
|
gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (area), 24);
|
|
gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (area), 24);
|
|
gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (area), draw_color, (gpointer) color, NULL);
|
|
gtk_container_add (GTK_CONTAINER (button), area);
|
|
|
|
return button;
|
|
}
|
|
|
|
GtkWidget *
|
|
do_flowbox (GtkWidget *do_widget)
|
|
{
|
|
static GtkWidget *window = NULL;
|
|
GtkWidget *scrolled, *flowbox;
|
|
const gchar *colors[] = {
|
|
"AliceBlue",
|
|
"AntiqueWhite",
|
|
"AntiqueWhite1",
|
|
"AntiqueWhite2",
|
|
"AntiqueWhite3",
|
|
"AntiqueWhite4",
|
|
"aqua",
|
|
"aquamarine",
|
|
"aquamarine1",
|
|
"aquamarine2",
|
|
"aquamarine3",
|
|
"aquamarine4",
|
|
"azure",
|
|
"azure1",
|
|
"azure2",
|
|
"azure3",
|
|
"azure4",
|
|
"beige",
|
|
"bisque",
|
|
"bisque1",
|
|
"bisque2",
|
|
"bisque3",
|
|
"bisque4",
|
|
"black",
|
|
"BlanchedAlmond",
|
|
"blue",
|
|
"blue1",
|
|
"blue2",
|
|
"blue3",
|
|
"blue4",
|
|
"BlueViolet",
|
|
"brown",
|
|
"brown1",
|
|
"brown2",
|
|
"brown3",
|
|
"brown4",
|
|
"burlywood",
|
|
"burlywood1",
|
|
"burlywood2",
|
|
"burlywood3",
|
|
"burlywood4",
|
|
"CadetBlue",
|
|
"CadetBlue1",
|
|
"CadetBlue2",
|
|
"CadetBlue3",
|
|
"CadetBlue4",
|
|
"chartreuse",
|
|
"chartreuse1",
|
|
"chartreuse2",
|
|
"chartreuse3",
|
|
"chartreuse4",
|
|
"chocolate",
|
|
"chocolate1",
|
|
"chocolate2",
|
|
"chocolate3",
|
|
"chocolate4",
|
|
"coral",
|
|
"coral1",
|
|
"coral2",
|
|
"coral3",
|
|
"coral4",
|
|
"CornflowerBlue",
|
|
"cornsilk",
|
|
"cornsilk1",
|
|
"cornsilk2",
|
|
"cornsilk3",
|
|
"cornsilk4",
|
|
"crimson",
|
|
"cyan",
|
|
"cyan1",
|
|
"cyan2",
|
|
"cyan3",
|
|
"cyan4",
|
|
"DarkBlue",
|
|
"DarkCyan",
|
|
"DarkGoldenrod",
|
|
"DarkGoldenrod1",
|
|
"DarkGoldenrod2",
|
|
"DarkGoldenrod3",
|
|
"DarkGoldenrod4",
|
|
"DarkGray",
|
|
"DarkGreen",
|
|
"DarkGrey",
|
|
"DarkKhaki",
|
|
"DarkMagenta",
|
|
"DarkOliveGreen",
|
|
"DarkOliveGreen1",
|
|
"DarkOliveGreen2",
|
|
"DarkOliveGreen3",
|
|
"DarkOliveGreen4",
|
|
"DarkOrange",
|
|
"DarkOrange1",
|
|
"DarkOrange2",
|
|
"DarkOrange3",
|
|
"DarkOrange4",
|
|
"DarkOrchid",
|
|
"DarkOrchid1",
|
|
"DarkOrchid2",
|
|
"DarkOrchid3",
|
|
"DarkOrchid4",
|
|
"DarkRed",
|
|
"DarkSalmon",
|
|
"DarkSeaGreen",
|
|
"DarkSeaGreen1",
|
|
"DarkSeaGreen2",
|
|
"DarkSeaGreen3",
|
|
"DarkSeaGreen4",
|
|
"DarkSlateBlue",
|
|
"DarkSlateGray",
|
|
"DarkSlateGray1",
|
|
"DarkSlateGray2",
|
|
"DarkSlateGray3",
|
|
"DarkSlateGray4",
|
|
"DarkSlateGrey",
|
|
"DarkTurquoise",
|
|
"DarkViolet",
|
|
"DeepPink",
|
|
"DeepPink1",
|
|
"DeepPink2",
|
|
"DeepPink3",
|
|
"DeepPink4",
|
|
"DeepSkyBlue",
|
|
"DeepSkyBlue1",
|
|
"DeepSkyBlue2",
|
|
"DeepSkyBlue3",
|
|
"DeepSkyBlue4",
|
|
"DimGray",
|
|
"DimGrey",
|
|
"DodgerBlue",
|
|
"DodgerBlue1",
|
|
"DodgerBlue2",
|
|
"DodgerBlue3",
|
|
"DodgerBlue4",
|
|
"firebrick",
|
|
"firebrick1",
|
|
"firebrick2",
|
|
"firebrick3",
|
|
"firebrick4",
|
|
"FloralWhite",
|
|
"ForestGreen",
|
|
"fuchsia",
|
|
"gainsboro",
|
|
"GhostWhite",
|
|
"gold",
|
|
"gold1",
|
|
"gold2",
|
|
"gold3",
|
|
"gold4",
|
|
"goldenrod",
|
|
"goldenrod1",
|
|
"goldenrod2",
|
|
"goldenrod3",
|
|
"goldenrod4",
|
|
"gray",
|
|
"gray0",
|
|
"gray1",
|
|
"gray10",
|
|
"gray100",
|
|
"gray11",
|
|
"gray12",
|
|
"gray13",
|
|
"gray14",
|
|
"gray15",
|
|
"gray16",
|
|
"gray17",
|
|
"gray18",
|
|
"gray19",
|
|
"gray2",
|
|
"gray20",
|
|
"gray21",
|
|
"gray22",
|
|
"gray23",
|
|
"gray24",
|
|
"gray25",
|
|
"gray26",
|
|
"gray27",
|
|
"gray28",
|
|
"gray29",
|
|
"gray3",
|
|
"gray30",
|
|
"gray31",
|
|
"gray32",
|
|
"gray33",
|
|
"gray34",
|
|
"gray35",
|
|
"gray36",
|
|
"gray37",
|
|
"gray38",
|
|
"gray39",
|
|
"gray4",
|
|
"gray40",
|
|
"gray41",
|
|
"gray42",
|
|
"gray43",
|
|
"gray44",
|
|
"gray45",
|
|
"gray46",
|
|
"gray47",
|
|
"gray48",
|
|
"gray49",
|
|
"gray5",
|
|
"gray50",
|
|
"gray51",
|
|
"gray52",
|
|
"gray53",
|
|
"gray54",
|
|
"gray55",
|
|
"gray56",
|
|
"gray57",
|
|
"gray58",
|
|
"gray59",
|
|
"gray6",
|
|
"gray60",
|
|
"gray61",
|
|
"gray62",
|
|
"gray63",
|
|
"gray64",
|
|
"gray65",
|
|
"gray66",
|
|
"gray67",
|
|
"gray68",
|
|
"gray69",
|
|
"gray7",
|
|
"gray70",
|
|
"gray71",
|
|
"gray72",
|
|
"gray73",
|
|
"gray74",
|
|
"gray75",
|
|
"gray76",
|
|
"gray77",
|
|
"gray78",
|
|
"gray79",
|
|
"gray8",
|
|
"gray80",
|
|
"gray81",
|
|
"gray82",
|
|
"gray83",
|
|
"gray84",
|
|
"gray85",
|
|
"gray86",
|
|
"gray87",
|
|
"gray88",
|
|
"gray89",
|
|
"gray9",
|
|
"gray90",
|
|
"gray91",
|
|
"gray92",
|
|
"gray93",
|
|
"gray94",
|
|
"gray95",
|
|
"gray96",
|
|
"gray97",
|
|
"gray98",
|
|
"gray99",
|
|
"green",
|
|
"green1",
|
|
"green2",
|
|
"green3",
|
|
"green4",
|
|
"GreenYellow",
|
|
"grey",
|
|
"grey0",
|
|
"grey1",
|
|
"grey10",
|
|
"grey100",
|
|
"grey11",
|
|
"grey12",
|
|
"grey13",
|
|
"grey14",
|
|
"grey15",
|
|
"grey16",
|
|
"grey17",
|
|
"grey18",
|
|
"grey19",
|
|
"grey2",
|
|
"grey20",
|
|
"grey21",
|
|
"grey22",
|
|
"grey23",
|
|
"grey24",
|
|
"grey25",
|
|
"grey26",
|
|
"grey27",
|
|
"grey28",
|
|
"grey29",
|
|
"grey3",
|
|
"grey30",
|
|
"grey31",
|
|
"grey32",
|
|
"grey33",
|
|
"grey34",
|
|
"grey35",
|
|
"grey36",
|
|
"grey37",
|
|
"grey38",
|
|
"grey39",
|
|
"grey4",
|
|
"grey40",
|
|
"grey41",
|
|
"grey42",
|
|
"grey43",
|
|
"grey44",
|
|
"grey45",
|
|
"grey46",
|
|
"grey47",
|
|
"grey48",
|
|
"grey49",
|
|
"grey5",
|
|
"grey50",
|
|
"grey51",
|
|
"grey52",
|
|
"grey53",
|
|
"grey54",
|
|
"grey55",
|
|
"grey56",
|
|
"grey57",
|
|
"grey58",
|
|
"grey59",
|
|
"grey6",
|
|
"grey60",
|
|
"grey61",
|
|
"grey62",
|
|
"grey63",
|
|
"grey64",
|
|
"grey65",
|
|
"grey66",
|
|
"grey67",
|
|
"grey68",
|
|
"grey69",
|
|
"grey7",
|
|
"grey70",
|
|
"grey71",
|
|
"grey72",
|
|
"grey73",
|
|
"grey74",
|
|
"grey75",
|
|
"grey76",
|
|
"grey77",
|
|
"grey78",
|
|
"grey79",
|
|
"grey8",
|
|
"grey80",
|
|
"grey81",
|
|
"grey82",
|
|
"grey83",
|
|
"grey84",
|
|
"grey85",
|
|
"grey86",
|
|
"grey87",
|
|
"grey88",
|
|
"grey89",
|
|
"grey9",
|
|
"grey90",
|
|
"grey91",
|
|
"grey92",
|
|
"grey93",
|
|
"grey94",
|
|
"grey95",
|
|
"grey96",
|
|
"grey97",
|
|
"grey98",
|
|
"grey99",
|
|
"honeydew",
|
|
"honeydew1",
|
|
"honeydew2",
|
|
"honeydew3",
|
|
"honeydew4",
|
|
"HotPink",
|
|
"HotPink1",
|
|
"HotPink2",
|
|
"HotPink3",
|
|
"HotPink4",
|
|
"IndianRed",
|
|
"IndianRed1",
|
|
"IndianRed2",
|
|
"IndianRed3",
|
|
"IndianRed4",
|
|
"indigo",
|
|
"ivory",
|
|
"ivory1",
|
|
"ivory2",
|
|
"ivory3",
|
|
"ivory4",
|
|
"khaki",
|
|
"khaki1",
|
|
"khaki2",
|
|
"khaki3",
|
|
"khaki4",
|
|
"lavender",
|
|
"LavenderBlush",
|
|
"LavenderBlush1",
|
|
"LavenderBlush2",
|
|
"LavenderBlush3",
|
|
"LavenderBlush4",
|
|
"LawnGreen",
|
|
"LemonChiffon",
|
|
"LemonChiffon1",
|
|
"LemonChiffon2",
|
|
"LemonChiffon3",
|
|
"LemonChiffon4",
|
|
"LightBlue",
|
|
"LightBlue1",
|
|
"LightBlue2",
|
|
"LightBlue3",
|
|
"LightBlue4",
|
|
"LightCoral",
|
|
"LightCyan",
|
|
"LightCyan1",
|
|
"LightCyan2",
|
|
"LightCyan3",
|
|
"LightCyan4",
|
|
"LightGoldenrod",
|
|
"LightGoldenrod1",
|
|
"LightGoldenrod2",
|
|
"LightGoldenrod3",
|
|
"LightGoldenrod4",
|
|
"LightGoldenrodYellow",
|
|
"LightGray",
|
|
"LightGreen",
|
|
"LightGrey",
|
|
"LightPink",
|
|
"LightPink1",
|
|
"LightPink2",
|
|
"LightPink3",
|
|
"LightPink4",
|
|
"LightSalmon",
|
|
"LightSalmon1",
|
|
"LightSalmon2",
|
|
"LightSalmon3",
|
|
"LightSalmon4",
|
|
"LightSeaGreen",
|
|
"LightSkyBlue",
|
|
"LightSkyBlue1",
|
|
"LightSkyBlue2",
|
|
"LightSkyBlue3",
|
|
"LightSkyBlue4",
|
|
"LightSlateBlue",
|
|
"LightSlateGray",
|
|
"LightSlateGrey",
|
|
"LightSteelBlue",
|
|
"LightSteelBlue1",
|
|
"LightSteelBlue2",
|
|
"LightSteelBlue3",
|
|
"LightSteelBlue4",
|
|
"LightYellow",
|
|
"LightYellow1",
|
|
"LightYellow2",
|
|
"LightYellow3",
|
|
"LightYellow4",
|
|
"lime",
|
|
"LimeGreen",
|
|
"linen",
|
|
"magenta",
|
|
"magenta1",
|
|
"magenta2",
|
|
"magenta3",
|
|
"magenta4",
|
|
"maroon",
|
|
"maroon1",
|
|
"maroon2",
|
|
"maroon3",
|
|
"maroon4",
|
|
"MediumAquamarine",
|
|
"MediumBlue",
|
|
"MediumOrchid",
|
|
"MediumOrchid1",
|
|
"MediumOrchid2",
|
|
"MediumOrchid3",
|
|
"MediumOrchid4",
|
|
"MediumPurple",
|
|
"MediumPurple1",
|
|
"MediumPurple2",
|
|
"MediumPurple3",
|
|
"MediumPurple4",
|
|
"MediumSeaGreen",
|
|
"MediumSlateBlue",
|
|
"MediumSpringGreen",
|
|
"MediumTurquoise",
|
|
"MediumVioletRed",
|
|
"MidnightBlue",
|
|
"MintCream",
|
|
"MistyRose",
|
|
"MistyRose1",
|
|
"MistyRose2",
|
|
"MistyRose3",
|
|
"MistyRose4",
|
|
"moccasin",
|
|
"NavajoWhite",
|
|
"NavajoWhite1",
|
|
"NavajoWhite2",
|
|
"NavajoWhite3",
|
|
"NavajoWhite4",
|
|
"navy",
|
|
"NavyBlue",
|
|
"OldLace",
|
|
"olive",
|
|
"OliveDrab",
|
|
"OliveDrab1",
|
|
"OliveDrab2",
|
|
"OliveDrab3",
|
|
"OliveDrab4",
|
|
"orange",
|
|
"orange1",
|
|
"orange2",
|
|
"orange3",
|
|
"orange4",
|
|
"OrangeRed",
|
|
"OrangeRed1",
|
|
"OrangeRed2",
|
|
"OrangeRed3",
|
|
"OrangeRed4",
|
|
"orchid",
|
|
"orchid1",
|
|
"orchid2",
|
|
"orchid3",
|
|
"orchid4",
|
|
"PaleGoldenrod",
|
|
"PaleGreen",
|
|
"PaleGreen1",
|
|
"PaleGreen2",
|
|
"PaleGreen3",
|
|
"PaleGreen4",
|
|
"PaleTurquoise",
|
|
"PaleTurquoise1",
|
|
"PaleTurquoise2",
|
|
"PaleTurquoise3",
|
|
"PaleTurquoise4",
|
|
"PaleVioletRed",
|
|
"PaleVioletRed1",
|
|
"PaleVioletRed2",
|
|
"PaleVioletRed3",
|
|
"PaleVioletRed4",
|
|
"PapayaWhip",
|
|
"PeachPuff",
|
|
"PeachPuff1",
|
|
"PeachPuff2",
|
|
"PeachPuff3",
|
|
"PeachPuff4",
|
|
"peru",
|
|
"pink",
|
|
"pink1",
|
|
"pink2",
|
|
"pink3",
|
|
"pink4",
|
|
"plum",
|
|
"plum1",
|
|
"plum2",
|
|
"plum3",
|
|
"plum4",
|
|
"PowderBlue",
|
|
"purple",
|
|
"purple1",
|
|
"purple2",
|
|
"purple3",
|
|
"purple4",
|
|
"red",
|
|
"red1",
|
|
"red2",
|
|
"red3",
|
|
"red4",
|
|
"RosyBrown",
|
|
"RosyBrown1",
|
|
"RosyBrown2",
|
|
"RosyBrown3",
|
|
"RosyBrown4",
|
|
"RoyalBlue",
|
|
"RoyalBlue1",
|
|
"RoyalBlue2",
|
|
"RoyalBlue3",
|
|
"RoyalBlue4",
|
|
"SaddleBrown",
|
|
"salmon",
|
|
"salmon1",
|
|
"salmon2",
|
|
"salmon3",
|
|
"salmon4",
|
|
"SandyBrown",
|
|
"SeaGreen",
|
|
"SeaGreen1",
|
|
"SeaGreen2",
|
|
"SeaGreen3",
|
|
"SeaGreen4",
|
|
"seashell",
|
|
"seashell1",
|
|
"seashell2",
|
|
"seashell3",
|
|
"seashell4",
|
|
"sienna",
|
|
"sienna1",
|
|
"sienna2",
|
|
"sienna3",
|
|
"sienna4",
|
|
"silver",
|
|
"SkyBlue",
|
|
"SkyBlue1",
|
|
"SkyBlue2",
|
|
"SkyBlue3",
|
|
"SkyBlue4",
|
|
"SlateBlue",
|
|
"SlateBlue1",
|
|
"SlateBlue2",
|
|
"SlateBlue3",
|
|
"SlateBlue4",
|
|
"SlateGray",
|
|
"SlateGray1",
|
|
"SlateGray2",
|
|
"SlateGray3",
|
|
"SlateGray4",
|
|
"SlateGrey",
|
|
"snow",
|
|
"snow1",
|
|
"snow2",
|
|
"snow3",
|
|
"snow4",
|
|
"SpringGreen",
|
|
"SpringGreen1",
|
|
"SpringGreen2",
|
|
"SpringGreen3",
|
|
"SpringGreen4",
|
|
"SteelBlue",
|
|
"SteelBlue1",
|
|
"SteelBlue2",
|
|
"SteelBlue3",
|
|
"SteelBlue4",
|
|
"tan",
|
|
"tan1",
|
|
"tan2",
|
|
"tan3",
|
|
"tan4",
|
|
"teal",
|
|
"thistle",
|
|
"thistle1",
|
|
"thistle2",
|
|
"thistle3",
|
|
"thistle4",
|
|
"tomato",
|
|
"tomato1",
|
|
"tomato2",
|
|
"tomato3",
|
|
"tomato4",
|
|
"turquoise",
|
|
"turquoise1",
|
|
"turquoise2",
|
|
"turquoise3",
|
|
"turquoise4",
|
|
"violet",
|
|
"VioletRed",
|
|
"VioletRed1",
|
|
"VioletRed2",
|
|
"VioletRed3",
|
|
"VioletRed4",
|
|
"wheat",
|
|
"wheat1",
|
|
"wheat2",
|
|
"wheat3",
|
|
"wheat4",
|
|
"white",
|
|
"WhiteSmoke",
|
|
"yellow",
|
|
"yellow1",
|
|
"yellow2",
|
|
"yellow3",
|
|
"yellow4",
|
|
"YellowGreen",
|
|
NULL
|
|
};
|
|
gint i;
|
|
|
|
if (!window)
|
|
{
|
|
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
gtk_window_set_screen (GTK_WINDOW (window),
|
|
gtk_widget_get_screen (do_widget));
|
|
gtk_window_set_title (GTK_WINDOW (window), "Flow Box");
|
|
gtk_window_set_default_size (GTK_WINDOW (window), 400, 600);
|
|
|
|
g_signal_connect (window, "destroy",
|
|
G_CALLBACK (gtk_widget_destroyed), &window);
|
|
|
|
scrolled = gtk_scrolled_window_new (NULL, NULL);
|
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
|
|
flowbox = gtk_flow_box_new ();
|
|
gtk_widget_set_valign (flowbox, GTK_ALIGN_START);
|
|
gtk_flow_box_set_max_children_per_line (GTK_FLOW_BOX (flowbox), 30);
|
|
gtk_flow_box_set_selection_mode (GTK_FLOW_BOX (flowbox), GTK_SELECTION_NONE);
|
|
|
|
gtk_container_add (GTK_CONTAINER (scrolled), flowbox);
|
|
gtk_container_add (GTK_CONTAINER (window), scrolled);
|
|
|
|
for (i = 0; colors[i]; i++)
|
|
gtk_container_add (GTK_CONTAINER (flowbox), color_swatch_new (colors[i]));
|
|
}
|
|
|
|
if (!gtk_widget_get_visible (window))
|
|
gtk_widget_show (window);
|
|
else
|
|
gtk_widget_destroy (window);
|
|
|
|
return window;
|
|
}
|