2022-10-02 23:06:56 +02:00
|
|
|
#include <gtk/gtk.h>
|
|
|
|
|
|
|
|
|
|
#include "../defines.h"
|
|
|
|
|
#include "../util.h"
|
|
|
|
|
|
|
|
|
|
#include "WrapperWidget.h"
|
|
|
|
|
|
|
|
|
|
#include "../generated_headers/android_widget_TextView.h"
|
|
|
|
|
|
2024-03-30 11:04:21 +01:00
|
|
|
static GtkLabel *box_get_label(JNIEnv *env, GtkWidget *box)
|
|
|
|
|
{
|
|
|
|
|
GtkWidget *label = gtk_widget_get_last_child(GTK_WIDGET(box));
|
|
|
|
|
if (!GTK_IS_LABEL(label))
|
|
|
|
|
label = gtk_widget_get_prev_sibling(label);
|
|
|
|
|
return GTK_LABEL(label);
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-17 12:59:37 +02:00
|
|
|
JNIEXPORT jlong JNICALL Java_android_widget_TextView_native_1constructor(JNIEnv *env, jobject this, jobject context, jobject attrs)
|
2022-10-02 23:06:56 +02:00
|
|
|
{
|
2024-03-30 11:04:21 +01:00
|
|
|
const char *text = attribute_set_get_string(env, attrs, "text", NULL);
|
2022-10-02 23:06:56 +02:00
|
|
|
|
|
|
|
|
// _SET_OBJ_FIELD(this, "text", "Ljava/lang/String;", _JSTRING(text)); //TODO: sadly this might be needed, but it's not atm
|
|
|
|
|
|
2023-08-22 13:49:09 +02:00
|
|
|
GtkWidget *wrapper = g_object_ref(wrapper_widget_new());
|
2024-03-30 11:04:21 +01:00
|
|
|
GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
|
2022-10-02 23:06:56 +02:00
|
|
|
GtkWidget *label = gtk_label_new(text);
|
2023-08-22 14:41:01 +02:00
|
|
|
gtk_label_set_wrap(GTK_LABEL(label), TRUE);
|
2023-09-08 18:32:34 +02:00
|
|
|
gtk_label_set_xalign(GTK_LABEL(label), 0.f);
|
|
|
|
|
gtk_label_set_yalign(GTK_LABEL(label), 0.f);
|
2024-03-30 11:04:21 +01:00
|
|
|
gtk_widget_set_hexpand(label, TRUE);
|
|
|
|
|
gtk_box_append(GTK_BOX(box), label);
|
|
|
|
|
wrapper_widget_set_child(WRAPPER_WIDGET(wrapper), box);
|
2024-07-26 21:47:08 +02:00
|
|
|
wrapper_widget_set_jobject(WRAPPER_WIDGET(wrapper), env, this);
|
2024-02-07 18:03:23 +01:00
|
|
|
|
|
|
|
|
PangoAttrList* pango_attrs = pango_attr_list_new();
|
|
|
|
|
pango_attr_list_insert(pango_attrs, pango_attr_font_features_new("tnum"));
|
|
|
|
|
gtk_label_set_attributes(GTK_LABEL(label), pango_attrs);
|
|
|
|
|
pango_attr_list_unref(pango_attrs);
|
|
|
|
|
|
2024-03-30 11:04:21 +01:00
|
|
|
return _INTPTR(box);
|
2022-10-02 23:06:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_android_widget_TextView_native_1setText(JNIEnv *env, jobject this, jobject charseq)
|
|
|
|
|
{
|
2024-03-30 11:04:21 +01:00
|
|
|
const char *text = charseq ? (*env)->GetStringUTFChars(env, charseq, NULL) : NULL;
|
|
|
|
|
gtk_label_set_text(box_get_label(env, _PTR(_GET_LONG_FIELD(this, "widget"))), text ?: "");
|
|
|
|
|
if(text)
|
|
|
|
|
(*env)->ReleaseStringUTFChars(env, charseq, text);
|
2022-10-02 23:06:56 +02:00
|
|
|
}
|
|
|
|
|
|
2024-04-20 16:34:01 +02:00
|
|
|
/* we kinda need per-widget css */
|
|
|
|
|
#pragma GCC diagnostic push
|
|
|
|
|
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
2023-09-03 12:57:13 +02:00
|
|
|
JNIEXPORT void JNICALL Java_android_widget_TextView_native_1setTextColor(JNIEnv *env, jobject this, jint color)
|
|
|
|
|
{
|
2024-03-30 11:04:21 +01:00
|
|
|
GtkWidget *widget = GTK_WIDGET(box_get_label(env, _PTR(_GET_LONG_FIELD(this, "widget"))));
|
2023-09-03 12:57:13 +02:00
|
|
|
|
2024-02-28 01:25:14 +01:00
|
|
|
GtkStyleContext *style_context = gtk_widget_get_style_context(widget);
|
|
|
|
|
|
|
|
|
|
GtkCssProvider *old_provider = g_object_get_data(G_OBJECT(widget), "color_style_provider");
|
|
|
|
|
if(old_provider)
|
2024-03-30 11:04:21 +01:00
|
|
|
gtk_style_context_remove_provider(style_context, GTK_STYLE_PROVIDER(old_provider));
|
2024-02-28 01:25:14 +01:00
|
|
|
|
2023-09-03 12:57:13 +02:00
|
|
|
GtkCssProvider *css_provider = gtk_css_provider_new();
|
|
|
|
|
|
2024-02-28 01:25:14 +01:00
|
|
|
char *css_string = g_markup_printf_escaped("* { color: #%06x%02x; }", color & 0xFFFFFF, (color >> 24) & 0xFF);
|
2023-09-03 12:57:13 +02:00
|
|
|
gtk_css_provider_load_from_string(css_provider, css_string);
|
|
|
|
|
g_free(css_string);
|
|
|
|
|
|
2024-02-28 01:25:14 +01:00
|
|
|
gtk_style_context_add_provider(style_context, GTK_STYLE_PROVIDER(css_provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
|
|
|
|
|
g_object_set_data(G_OBJECT(widget), "color_style_provider", css_provider);
|
2023-09-03 12:57:13 +02:00
|
|
|
}
|
2024-04-20 16:34:01 +02:00
|
|
|
#pragma GCC diagnostic pop
|
2023-09-03 12:57:13 +02:00
|
|
|
|
2022-10-02 23:06:56 +02:00
|
|
|
JNIEXPORT void JNICALL Java_android_widget_TextView_setTextSize(JNIEnv *env, jobject this, jfloat size)
|
|
|
|
|
{
|
2024-03-30 11:04:21 +01:00
|
|
|
GtkLabel *label = box_get_label(env, _PTR(_GET_LONG_FIELD(this, "widget")));
|
2022-10-02 23:06:56 +02:00
|
|
|
PangoAttrList *attrs;
|
|
|
|
|
|
|
|
|
|
PangoAttrList *old_attrs = gtk_label_get_attributes(label);
|
|
|
|
|
if(old_attrs)
|
|
|
|
|
attrs = pango_attr_list_copy(old_attrs);
|
|
|
|
|
else
|
|
|
|
|
attrs = pango_attr_list_new();
|
|
|
|
|
|
|
|
|
|
PangoAttribute *size_attr = pango_attr_size_new(size * PANGO_SCALE);
|
|
|
|
|
pango_attr_list_change(attrs, size_attr);
|
|
|
|
|
gtk_label_set_attributes(label, attrs);
|
|
|
|
|
|
|
|
|
|
pango_attr_list_unref(attrs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_android_widget_TextView_native_1set_1markup(JNIEnv *env, jobject this, jint value)
|
|
|
|
|
{
|
2024-03-30 11:04:21 +01:00
|
|
|
GtkLabel *label = box_get_label(env, _PTR(_GET_LONG_FIELD(this, "widget")));
|
2022-10-02 23:06:56 +02:00
|
|
|
|
|
|
|
|
gtk_label_set_use_markup(label, value);
|
|
|
|
|
}
|
2024-03-16 12:49:28 +01:00
|
|
|
|
2024-03-30 11:04:21 +01:00
|
|
|
JNIEXPORT void JNICALL Java_android_widget_TextView_native_1setCompoundDrawables(JNIEnv *env, jobject this, jlong widget_ptr, jlong left, jlong top, jlong right, jlong bottom)
|
|
|
|
|
{
|
|
|
|
|
GtkWidget *box = GTK_WIDGET(_PTR(widget_ptr));
|
|
|
|
|
gtk_orientable_set_orientation(GTK_ORIENTABLE(box), (left || right) ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL);
|
|
|
|
|
|
|
|
|
|
GdkPaintable *paintable = _PTR(left ?: top); // paintable before text
|
|
|
|
|
GtkWidget *picture = gtk_widget_get_first_child(box);
|
|
|
|
|
if (GTK_IS_PICTURE(picture)) {
|
|
|
|
|
gtk_picture_set_paintable(GTK_PICTURE(picture), paintable);
|
|
|
|
|
} else if (paintable) {
|
|
|
|
|
picture = gtk_picture_new_for_paintable(paintable);
|
|
|
|
|
gtk_widget_insert_after(picture, box, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
paintable = _PTR(right ?: bottom); // paintable after text
|
|
|
|
|
picture = gtk_widget_get_last_child(box);
|
|
|
|
|
if (GTK_IS_PICTURE(picture)) {
|
|
|
|
|
gtk_picture_set_paintable(GTK_PICTURE(picture), paintable);
|
|
|
|
|
} else if (paintable) {
|
|
|
|
|
picture = gtk_picture_new_for_paintable(paintable);
|
|
|
|
|
gtk_widget_insert_before(picture, box, NULL);
|
|
|
|
|
}
|
2024-03-16 12:49:28 +01:00
|
|
|
}
|