add existing code (build system, libs, initial mizucp code)
[mizunara.git] / ui / gtk / display.c
1 /*
2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3  *
4  * Copyright 2017 Olaf Wintermann. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  *   1. Redistributions of source code must retain the above copyright
10  *      notice, this list of conditions and the following disclaimer.
11  *
12  *   2. Redistributions in binary form must reproduce the above copyright
13  *      notice, this list of conditions and the following disclaimer in the
14  *      documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include <stdio.h>
30 #include <stdlib.h>
31
32 #include "display.h"
33 #include "container.h"
34 #include <ucx/mempool.h>
35 #include "../common/context.h"
36 #include "../common/object.h"
37
38 static void set_alignment(GtkWidget *widget, float xalign, float yalign) {
39 #if GTK_MAJOR_VERSION >= 3 && GTK_MINOR_VERSION >= 16
40     gtk_label_set_xalign(GTK_LABEL(widget), xalign);
41     gtk_label_set_yalign(GTK_LABEL(widget), yalign);
42 #else
43     gtk_misc_set_alignment(GTK_MISC(widget), xalign, yalign);
44 #endif
45 }
46
47 UIWIDGET ui_label(UiObject *obj, char *label) { 
48     GtkWidget *widget = gtk_label_new(label);
49     
50     UiContainer *ct = uic_get_current_container(obj);
51     ct->add(ct, widget, FALSE);
52     
53     return widget;
54 }
55
56 UIWIDGET ui_llabel(UiObject *obj, char *label) {
57     UIWIDGET widget = ui_label(obj, label);
58     set_alignment(widget, 0, .5);
59     return widget;
60 }
61
62 UIWIDGET ui_rlabel(UiObject *obj, char *label) {
63     UIWIDGET widget = ui_label(obj, label);
64     //gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_RIGHT);
65     
66     set_alignment(widget, 1, .5);
67     return widget;
68 }
69
70 UIWIDGET ui_space(UiObject *obj) {
71     GtkWidget *widget = gtk_label_new("");
72     UiContainer *ct = uic_get_current_container(obj);
73     ct->add(ct, widget, TRUE);
74     
75     return widget;
76 }
77
78 UIWIDGET ui_separator(UiObject *obj) {
79 #if UI_GTK3
80     GtkWidget *widget = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
81 #else
82     GtkWidget *widget = gtk_hseparator_new();
83 #endif
84     UiContainer *ct = uic_get_current_container(obj);
85     ct->add(ct, widget, FALSE);
86     
87     return widget;
88 }
89
90 /* ------------------------- progress bar ------------------------- */
91
92 UIWIDGET ui_progressbar(UiObject *obj, UiDouble *value) {
93     UiVar *var = malloc(sizeof(UiVar));
94     var->value = value;
95     var->type = UI_VAR_SPECIAL;
96     return ui_progressbar_var(obj, var);
97 }
98
99 UIWIDGET ui_progressbar_nv(UiObject *obj, char *varname) {
100     UiVar *var = uic_create_var(obj->ctx, varname, UI_VAR_DOUBLE);
101     return ui_progressbar_var(obj, var);
102 }
103
104 UIWIDGET ui_progressbar_var(UiObject *obj, UiVar *var) {
105     GtkWidget *progressbar = gtk_progress_bar_new();
106     if(var && var->value) {
107         UiDouble *value = var->value;
108         value->get = ui_progressbar_get;
109         value->set = ui_progressbar_set;
110         value->obj = progressbar;
111         gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progressbar), 0.5);
112     }
113     
114     UiContainer *ct = uic_get_current_container(obj);
115     ct->add(ct, progressbar, FALSE);
116     
117     return progressbar;
118 }
119
120 double ui_progressbar_get(UiDouble *d) {
121     d->value = gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(d->obj));
122     return d->value;
123 }
124
125 void ui_progressbar_set(UiDouble *d, double value) {
126     gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(d->obj), value);
127     d->value = value;
128 }