117 return widget; |
117 return widget; |
118 } |
118 } |
119 |
119 |
120 /* ------------------------- progress bar ------------------------- */ |
120 /* ------------------------- progress bar ------------------------- */ |
121 |
121 |
|
122 typedef struct UiProgressBarRange { |
|
123 double min; |
|
124 double max; |
|
125 } UiProgressBarRange; |
|
126 |
122 UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs args) { |
127 UIWIDGET ui_progressbar_create(UiObject *obj, UiProgressbarArgs args) { |
123 UiObject* current = uic_current_obj(obj); |
128 UiObject* current = uic_current_obj(obj); |
124 |
129 |
125 GtkWidget *progressbar = gtk_progress_bar_new(); |
130 GtkWidget *progressbar = gtk_progress_bar_new(); |
|
131 if(args.max > args.min) { |
|
132 UiProgressBarRange *range = malloc(sizeof(UiProgressBarRange)); |
|
133 range->min = args.min; |
|
134 range->max = args.max; |
|
135 g_signal_connect( |
|
136 progressbar, |
|
137 "destroy", |
|
138 G_CALLBACK(ui_destroy_userdata), |
|
139 range); |
|
140 g_object_set_data(G_OBJECT(progressbar), "ui_range", range); |
|
141 } |
|
142 |
126 |
143 |
127 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_DOUBLE); |
144 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_DOUBLE); |
128 if(var && var->value) { |
145 if(var && var->value) { |
129 UiDouble *value = var->value; |
146 UiDouble *value = var->value; |
130 value->get = ui_progressbar_get; |
147 value->get = ui_progressbar_get; |
131 value->set = ui_progressbar_set; |
148 value->set = ui_progressbar_set; |
132 value->obj = progressbar; |
149 value->obj = progressbar; |
133 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progressbar), 0.5); |
150 ui_progressbar_set(value, value->value); |
134 } |
151 } |
135 |
152 |
136 UI_APPLY_LAYOUT1(current, args); |
153 UI_APPLY_LAYOUT1(current, args); |
137 current->container->add(current->container, progressbar, FALSE); |
154 current->container->add(current->container, progressbar, FALSE); |
138 |
155 |
139 return progressbar; |
156 return progressbar; |
140 } |
157 } |
141 |
158 |
142 double ui_progressbar_get(UiDouble *d) { |
159 double ui_progressbar_get(UiDouble *d) { |
143 d->value = gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(d->obj)); |
160 UiProgressBarRange *range = g_object_get_data(d->obj, "ui_range"); |
|
161 double fraction = gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(d->obj)); |
|
162 if(range) { |
|
163 fraction = range->min + (range->max - range->min) * fraction; |
|
164 } |
|
165 d->value = fraction; |
144 return d->value; |
166 return d->value; |
145 } |
167 } |
146 |
168 |
147 void ui_progressbar_set(UiDouble *d, double value) { |
169 void ui_progressbar_set(UiDouble *d, double value) { |
|
170 d->value = value; |
|
171 UiProgressBarRange *range = g_object_get_data(d->obj, "ui_range"); |
|
172 if(range) { |
|
173 value = (value - range->min) / (range->max - range->min); |
|
174 } |
148 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(d->obj), value); |
175 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(d->obj), value); |
149 d->value = value; |
|
150 } |
176 } |
151 |
177 |
152 |
178 |
153 /* ------------------------- progress spinner ------------------------- */ |
179 /* ------------------------- progress spinner ------------------------- */ |
154 |
180 |