-
Notifications
You must be signed in to change notification settings - Fork 0
/
tpe_gui_orders.c
176 lines (133 loc) · 3.95 KB
/
tpe_gui_orders.c
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
#include <assert.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <Ecore_Data.h>
#include <Ecore_Evas.h>
#include <Edje.h>
#include <Evas.h>
#include <Ewl.h>
#include "tpe_obj.h"
#include "tpe_gui.h"
#include "tpe_gui_private.h"
#include "tpe_gui_orders.h"
#include "tpe_orders.h"
#include "gui_window.h"
#include "gui_list.h"
static Evas_Object *gui_orders_add(struct gui *gui);
static int gui_orders_object_set(struct gui *gui, Evas_Object *, struct object *obj);
static void gui_orders_cleanup(void *guiv, Evas *e, Evas_Object *ow, void *);
/*
* Format of order window:
* List of current orders
*
* Currently selected order type [drop down]
* Params for order type
*/
struct orderwindow {
Ewl_Widget *box; /* The box to append stuff to */
Ewl_Widget *list; /* List of selection items */
Ewl_Widget *sel; /* Drop down for current order type */
Ewl_Widget *parambox; /* The box for the current widget */
struct object *obj; /* The object which this is orders for */
};
/* Edit the orders on an object */
int
gui_orders_edit(struct gui *gui, struct object *obj){
struct gui_obj *go;
assert(gui);
assert(obj);
assert(obj->nordertypes >= 0);
if (gui == NULL || obj == NULL) return -1;
if (obj->nordertypes == 0) return -2;
go = gui_object_data_get(gui,obj);
if (go->orders == NULL){
go->orders = gui_orders_add(gui);
if (go->orders == NULL) return -1;
}
gui_orders_object_set(gui, go->orders, obj);
gui_window_focus(gui, go->orders);
return 0;
}
/**
* Adds an order window.
*
* It will be initially unpopulated, use gui_ordres_object_set to populaet it.
* It will be shown.
*
* @param gui Gui data structure
* @return New orders window, or NULL on error
*/
static Evas_Object *
gui_orders_add(struct gui *gui){
Evas_Object *w;
Ewl_Widget *emb;
Evas_Object *eo;
Ewl_Widget *box,*list;
struct orderwindow *info;
assert(gui);
if (gui == NULL) return NULL;
info = calloc(1,sizeof(struct orderwindow));
w = gui_window_add2(gui,"Orders",NULL);
evas_object_event_callback_add(w, EVAS_CALLBACK_FREE,
gui_orders_cleanup, gui);
evas_object_data_set(w,"OrderWindow", info);
/* FIXME: This needs to go somewhere else */
emb = ewl_embed_new();
ewl_object_fill_policy_set(EWL_OBJECT(emb), EWL_FLAG_FILL_ALL);
eo = ewl_embed_canvas_set(EWL_EMBED(emb), gui->e,
(void *) ecore_evas_software_x11_window_get(gui->ee));
ewl_embed_focus_set(EWL_EMBED(emb), TRUE);
ewl_widget_show(emb);
edje_object_part_swallow(w, "swallow", eo);
/* Add vbox for stuff to go into */
box = ewl_hbox_new();
ewl_container_child_append(EWL_CONTAINER(emb), box);
info->box = box;
ewl_widget_show(box);
/* Add list for items */
list = gui_list_orders_add(gui);
ewl_container_child_append(EWL_CONTAINER(box), list);
ewl_object_fill_policy_set(EWL_OBJECT(list), EWL_FLAG_FILL_ALL);
evas_object_data_set(w, "EwlList", list);
ewl_widget_show(list);
return w;
}
/**
* Populate an order window with data.
*/
static int
gui_orders_object_set(struct gui *gui, Evas_Object *ow, struct object *obj){
const char *orderstr;
Ewl_Widget *list;
assert(gui); assert(obj); assert(ow);
edje_object_part_text_set(ow, "Title", obj->name);
orderstr = tpe_orders_str_get(gui->tpe, obj);
edje_object_part_text_set(ow, "Orders", orderstr);
evas_object_data_set(ow, "Object", obj);
list = evas_object_data_get(ow, "EwlList");
assert(list);
gui_list_orders_set(gui, list, obj);
return 0;
}
static void
gui_orders_cleanup(void *guiv, Evas *e, Evas_Object *ow, void *dummy){
struct gui_obj *go;
struct gui *gui = guiv;
struct object *obj;
Evas_Object *swallow;
assert(gui); assert(ow); assert(e);
if (gui == NULL || ow == NULL) return;
obj = evas_object_data_get(ow, "Object");
assert(obj);
if (obj == NULL) return;
go = obj->gui;
assert(go != NULL);
assert(go->orders != NULL);
go->orders = NULL;
swallow = edje_object_part_swallow_get(ow, "swallow");
if (swallow)
evas_object_del(swallow);
/* Nothing else to free now */
return;
}