Date: | 2010-05-30 22:30:24 (13 years 9 months ago) |
---|---|
Author: | werner |
Commit: | d4c4031b9afeb0a1509767bcbfec8a5248cb9866 |
Message: | Added support for reordering frames in the GUI. - gui_frame.c (build_frame_label): the root frame doesn't participate in any form of dragging, so we don't set up dragging for it at all - gui_frame_drag.c (pick_table_cell, swap_table_cells_by_coord, swap_table_rows): helper functions for swapping rows in a Gtk table - gui_frame_drag.c (swap_frames, drag_frame_motion, setup_frame_drag): added support for reordering of frames by dragging - gui_frame_drag.c (SWAP, swap_vars, swap_values, swap_rows): removed SWAP(). Use swap() from util.h instead. - TODO: removed frame ordering entry git-svn-id: http://svn.openmoko.org/trunk/eda/fped@5970 99fdad57-331a-0410-800a-d7fa5415bdb3 |
Files: |
TODO (1 diff) gui_frame.c (1 diff) gui_frame_drag.c (9 diffs) |
Change Details
TODO | ||
---|---|---|
5 | 5 | each individual frame 10x. |
6 | 6 | |
7 | 7 | Minor missing features: |
8 | - reorder frames (can use text editor) | |
9 | 8 | - reorder variables in a frame (can use text editor) |
10 | 9 | - move items/vectors up and down the hierarchy |
11 | 10 |
gui_frame.c | ||
---|---|---|
1734 | 1734 | "button_release_event", G_CALLBACK(frame_release_event), frame); |
1735 | 1735 | frame->label = label; |
1736 | 1736 | |
1737 | setup_frame_drag(frame); | |
1737 | if (frame != frames) | |
1738 | setup_frame_drag(frame); | |
1738 | 1739 | |
1739 | 1740 | return box_of_label(label); |
1740 | 1741 | } |
gui_frame_drag.c | ||
---|---|---|
11 | 11 | */ |
12 | 12 | |
13 | 13 | |
14 | #include <assert.h> | |
14 | 15 | #include <gtk/gtk.h> |
15 | 16 | |
17 | #include "util.h" | |
16 | 18 | #include "obj.h" |
17 | 19 | #include "gui_util.h" |
18 | 20 | #include "gui.h" |
... | ... | |
73 | 75 | } |
74 | 76 | |
75 | 77 | |
76 | /* ----- helper functions for indexed list and swapping -------------------- */ | |
78 | /* ----- helper functions for indexed list --------------------------------- */ | |
77 | 79 | |
78 | 80 | |
79 | 81 | #define NDX(first, item) \ |
... | ... | |
91 | 93 | NTH_walk = &(*NTH_walk)->next; \ |
92 | 94 | NTH_walk; }) |
93 | 95 | |
94 | #define SWAP(a, b) \ | |
95 | ({ typeof(a) SWAP_tmp; \ | |
96 | SWAP_tmp = a; \ | |
97 | a = b; \ | |
98 | b = SWAP_tmp; }) | |
99 | ||
100 | 96 | |
101 | 97 | /* ----- generic helper functions. maybe move to gui_util later ------------ */ |
102 | 98 | |
... | ... | |
136 | 132 | } |
137 | 133 | |
138 | 134 | |
135 | static GtkWidget *pick_table_cell(GtkWidget *table, int x, int y) | |
136 | { | |
137 | GList *children, *walk; | |
138 | GtkWidget *child; | |
139 | guint pos[4]; | |
140 | ||
141 | children = gtk_container_get_children(GTK_CONTAINER(table)); | |
142 | for (walk = children; walk; walk = g_list_next(walk)) { | |
143 | child = g_list_nth_data(walk, 0); | |
144 | assert(child); | |
145 | get_cell_coords(child, pos); | |
146 | if (pos[0] == x && pos[2] == y) | |
147 | break; | |
148 | } | |
149 | g_list_free(children); | |
150 | return walk ? child : NULL; | |
151 | } | |
152 | ||
153 | ||
154 | static void swap_table_cells_by_coord(GtkWidget *table_a, | |
155 | int a_col, int a_row, GtkWidget *table_b, int b_col, int b_row) | |
156 | { | |
157 | GtkWidget *a, *b; | |
158 | ||
159 | a = pick_table_cell(table_a, a_col, a_row); | |
160 | b = pick_table_cell(table_b, b_col, b_row); | |
161 | if (a) { | |
162 | g_object_ref(a); | |
163 | gtk_container_remove(GTK_CONTAINER(table_a), a); | |
164 | } | |
165 | if (b) { | |
166 | g_object_ref(b); | |
167 | gtk_container_remove(GTK_CONTAINER(table_b), b); | |
168 | } | |
169 | if (a) | |
170 | gtk_table_attach_defaults(GTK_TABLE(table_b), a, | |
171 | b_col, b_col+1, b_row, b_row+1); | |
172 | if (b) | |
173 | gtk_table_attach_defaults(GTK_TABLE(table_a), b, | |
174 | a_col, a_col+1, a_row, a_row+1); | |
175 | if (a) | |
176 | g_object_unref(a); | |
177 | if (b) | |
178 | g_object_unref(b); | |
179 | } | |
180 | ||
181 | ||
182 | static void swap_table_rows(GtkWidget *table, int a, int b) | |
183 | { | |
184 | guint cols; | |
185 | int i; | |
186 | ||
187 | g_object_get(table, "n-columns", &cols, NULL); | |
188 | for (i = 0; i != cols; i++) | |
189 | swap_table_cells_by_coord(table, i, a, table, i, b); | |
190 | } | |
191 | ||
192 | ||
139 | 193 | /* ----- swap table items -------------------------------------------------- */ |
140 | 194 | |
141 | 195 | |
... | ... | |
149 | 203 | swap_table_cells(box_of_label((*var_a)->widget), |
150 | 204 | box_of_label((*var_b)->widget)); |
151 | 205 | |
152 | SWAP(*var_a, *var_b); | |
153 | SWAP((*var_a)->next, (*var_b)->next); | |
206 | swap(*var_a, *var_b); | |
207 | swap((*var_a)->next, (*var_b)->next); | |
154 | 208 | } |
155 | 209 | |
156 | 210 | |
... | ... | |
164 | 218 | swap_table_cells(box_of_label((*value_a)->widget), |
165 | 219 | box_of_label((*value_b)->widget)); |
166 | 220 | |
167 | SWAP(*value_a, *value_b); | |
168 | SWAP((*value_a)->next, (*value_b)->next); | |
221 | swap(*value_a, *value_b); | |
222 | swap((*value_a)->next, (*value_b)->next); | |
169 | 223 | } |
170 | 224 | |
171 | 225 | |
... | ... | |
192 | 246 | value_a = value_a->next; |
193 | 247 | value_b = value_b->next; |
194 | 248 | } |
195 | SWAP(*a, *b); | |
196 | SWAP((*a)->next, (*b)->next); | |
249 | swap(*a, *b); | |
250 | swap((*a)->next, (*b)->next); | |
251 | } | |
252 | ||
253 | ||
254 | /* ----- swap frames ------------------------------------------------------- */ | |
255 | ||
256 | ||
257 | static void swap_frames(GtkWidget *table, int a, int b) | |
258 | { | |
259 | struct frame **frame_a = NTH(frames, a); | |
260 | struct frame **frame_b = NTH(frames, b); | |
261 | ||
262 | swap_table_rows(table, 2*a+1, 2*b+1); | |
263 | swap_table_rows(table, 2*a+2, 2*b+2); | |
264 | ||
265 | swap(*frame_a, *frame_b); | |
266 | swap((*frame_a)->next, (*frame_b)->next); | |
197 | 267 | } |
198 | 268 | |
199 | 269 | |
... | ... | |
410 | 480 | GdkDragContext *drag_context, gint x, gint y, guint time_, |
411 | 481 | gpointer user_data) |
412 | 482 | { |
483 | struct frame *from = dragging; | |
484 | struct frame *to = user_data; | |
485 | int from_n, to_n, i; | |
486 | ||
413 | 487 | if (!has_target(widget, drag_context, "frame")) |
414 | 488 | return FALSE; |
415 | /* nothing else to do yet */ | |
489 | assert(from != frames); | |
490 | assert(to != frames); | |
491 | from_n = NDX(frames, from); | |
492 | to_n = NDX(frames, to); | |
493 | for (i = from_n < to_n ? from_n : to_n; | |
494 | i != (from_n < to_n ? to_n : from_n); i++) | |
495 | swap_frames(gtk_widget_get_ancestor(widget, GTK_TYPE_TABLE), | |
496 | i, i+1); | |
416 | 497 | return FALSE; |
417 | 498 | } |
418 | 499 | |
... | ... | |
431 | 512 | |
432 | 513 | box = box_of_label(frame->label); |
433 | 514 | gtk_drag_source_set(box, GDK_BUTTON1_MASK, |
434 | &target_frame, 1, GDK_ACTION_COPY); | |
515 | &target_frame, 1, GDK_ACTION_COPY | GDK_ACTION_MOVE); | |
516 | gtk_drag_dest_set(box, GTK_DEST_DEFAULT_MOTION, | |
517 | &target_frame, 1, GDK_ACTION_MOVE); | |
435 | 518 | setup_drag_common(box, frame); |
436 | 519 | |
437 | 520 | /* override */ |
Branches:
master