summaryrefslogtreecommitdiff
path: root/libnautilus/gnome-icon-container-private.h
blob: e681f43c625607aaea02d060cb46e39ce5444c0f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* gnome-icon-container-private.h

   Copyright (C) 1999 Free Software Foundation

   The Gnome Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   The Gnome Library 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
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public
   License along with the Gnome Library; see the file COPYING.LIB.  If not,
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.

   Author: Ettore Perazzoli <ettore@gnu.org>
*/

#ifndef _GNOME_ICON_CONTAINER_PRIVATE_H
#define _GNOME_ICON_CONTAINER_PRIVATE_H

#include "gnome-icon-container.h"
#include "gnome-icon-container-dnd.h"

/* An Icon.  */

struct _GnomeIconContainerIcon {
	/* Group containing the text and the image.  */
	GnomeCanvasGroup *item;	/* FIXME wrong name. */

	/* The image for the icon.  Using a generic item makes it
           possible for us to use any fancy canvas element.  */
	GnomeCanvasItem *image_item;

	/* The text for the icon.  */
	GnomeIconTextItem *text_item;

	/* Text for the icon.  */
	gchar *text;

	/* X/Y coordinates and size.  We could use the GnomeCanvasItem
           functions, but this is a lot faster.  */
	gdouble x, y;
	guint width, height;	/* FIXME we could actually do without this if
                                   we assume the size is always given by
                                   GnomeIconContainer.cell_width*/

	/* Whether this item is selected (i.e. highlighted) for operation.  */
	gboolean is_selected : 1;

	/* Whether this item is selected for keyboard navigation.  */
	gboolean is_current : 1;

	/* Whether this item has been repositioned during layout already.  */
	gboolean layout_done : 1;

	/* Whether this item was selected before rubberbanding.  */
	gboolean was_selected_before_rubberband : 1;

	gpointer data;
};
typedef struct _GnomeIconContainerIcon GnomeIconContainerIcon;


#define INITIAL_GRID_WIDTH 64
#define INITIAL_GRID_HEIGHT 64
struct _GnomeIconContainerIconGrid {
	/* Size of the grid.  */
	guint width, height;

	/* This is the width that we can actually use for finding an empty
           position.  */
	guint visible_width;

	/* Array of grid elements.  */
	GList **elems;

	/* Size of the allocated array.  */
	guint alloc_width, alloc_height;

	/* Position of the first free cell (used to speed up progressive
	   updates).  If negative, there is no free cell.  */
	gint first_free_x, first_free_y;
};
typedef struct _GnomeIconContainerIconGrid GnomeIconContainerIconGrid;


/* Private GnomeIconContainer members.  */

struct _GnomeIconContainerRubberbandInfo {
	gboolean active : 1;

	gdouble start_x, start_y;

	GnomeCanvasItem *selection_rectangle;
	guint timer_tag;

	guint prev_x, prev_y;
	guint prev_x1, prev_y1;
	guint prev_x2, prev_y2;
};
typedef struct _GnomeIconContainerRubberbandInfo GnomeIconContainerRubberbandInfo;

struct _GnomeIconContainerPrivate {
	/* Base URI for Drag & Drop.  */
	gchar *base_uri;

	/* Browser mode setting.  */
	gboolean browser_mode : 1;

	/* Current icon mode (index into `icon_mode_info[]' -- see
           `gnome-icon-container.c').  */
	GnomeIconContainerIconMode icon_mode;

	/* Size of the container.  */
	guint width, height;

	/* List of icons.  */
	GList *icons;

	/* Total number of icons.  */
	guint num_icons;

	/* The grid.  */
	GnomeIconContainerIconGrid *grid;

	/* FIXME: This is *ugly*, but more efficient (both memory- and
           speed-wise) than using gtk_object_{set,get}_data() for all the
           icon items.  */
	GHashTable *canvas_item_to_icon;

	/* Rectangle that shows that a certain icon is selected.  */
	GnomeCanvasItem *kbd_navigation_rectangle;

	/* Current icon for keyboard navigation.  */
	GnomeIconContainerIcon *kbd_current;

	/* Rubberbanding status.  */
	GnomeIconContainerRubberbandInfo rubberband_info;

	/* Timeout used to make a selected icon fully visible after a short
           period of time.  (The timeout is needed to make sure
           double-clicking still works.)  */
	gint kbd_icon_visibility_timer_tag;

	/* Position of the pointer during the last click.  */
	gint drag_x, drag_y;

	/* Button currently pressed, possibly for dragging.  */
	guint drag_button;

	/* Icon on which the click happened.  */
	GnomeIconContainerIcon *drag_icon;

	/* Whether we are actually performing a dragging action.  */
	gboolean doing_drag;

	/* Drag offset.  */
	gint drag_x_offset, drag_y_offset;

	/* Idle ID.  */
	guint idle_id;

	/* Timeout for selection in browser mode.  */
	gint browser_mode_selection_timer_tag;

	/* Icon to be selected at timeout in browser mode.  */
	GnomeIconContainerIcon *browser_mode_selection_icon;

	/* DnD info.  */
	GnomeIconContainerDndInfo *dnd_info;
};


/* Definition of the available icon container modes.  */
struct _GnomeIconContainerIconModeInfo {
	guint icon_width;
	guint icon_height;

	guint cell_width;
	guint cell_height;

	guint cell_spacing;

	guint icon_xoffset;
	guint icon_yoffset;
};
typedef struct _GnomeIconContainerIconModeInfo GnomeIconContainerIconModeInfo;

extern GnomeIconContainerIconModeInfo gnome_icon_container_icon_mode_info[];

#define GNOME_ICON_CONTAINER_ICON_WIDTH(container) \
	gnome_icon_container_icon_mode_info[container->priv->icon_mode].icon_width

#define GNOME_ICON_CONTAINER_ICON_HEIGHT(container) \
	gnome_icon_container_icon_mode_info[container->priv->icon_mode].icon_height

#define GNOME_ICON_CONTAINER_CELL_WIDTH(container) \
	gnome_icon_container_icon_mode_info[container->priv->icon_mode].cell_width

#define GNOME_ICON_CONTAINER_CELL_HEIGHT(container) \
	gnome_icon_container_icon_mode_info[container->priv->icon_mode].cell_height

#define GNOME_ICON_CONTAINER_CELL_SPACING(container) \
	gnome_icon_container_icon_mode_info[container->priv->icon_mode].cell_spacing

#define GNOME_ICON_CONTAINER_ICON_XOFFSET(container) \
	gnome_icon_container_icon_mode_info[container->priv->icon_mode].icon_xoffset

#define GNOME_ICON_CONTAINER_ICON_YOFFSET(container) \
	gnome_icon_container_icon_mode_info[container->priv->icon_mode].icon_yoffset

#endif /*  _GNOME_ICON_CONTAINER_PRIVATE_H */