Files
android_translation_layer/src/api-impl-jni/widgets/android_widget_SeekBar.c
2024-03-10 23:00:42 +01:00

56 lines
2.3 KiB
C

#include <gtk/gtk.h>
#include <stdio.h>
#include "../defines.h"
#include "../util.h"
#include "WrapperWidget.h"
#include "../generated_headers/android_widget_SeekBar.h"
#include "jni.h"
JNIEXPORT jlong JNICALL Java_android_widget_SeekBar_native_1constructor(JNIEnv *env, jobject this, jobject context, jobject attrs)
{
GtkWidget *wrapper = g_object_ref(wrapper_widget_new());
GtkWidget *scale = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, NULL);
gtk_range_set_range(GTK_RANGE(scale), 0, 100);
wrapper_widget_set_child(WRAPPER_WIDGET(wrapper), scale);
wrapper_widget_set_jobject(WRAPPER_WIDGET(wrapper), env, this);
gtk_widget_set_name(scale, "SeekBar");
return _INTPTR(scale);
}
JNIEXPORT void JNICALL Java_android_widget_SeekBar_native_1setMax(JNIEnv *env, jobject this, jlong widget_ptr, jint max)
{
GtkRange *range = GTK_RANGE(_PTR(widget_ptr));
gtk_range_set_range(range, 0, max);
}
JNIEXPORT void JNICALL Java_android_widget_SeekBar_native_1setProgress(JNIEnv *env, jobject this, jlong widget_ptr, jfloat progress)
{
GtkRange *range = GTK_RANGE(_PTR(widget_ptr));
gtk_range_set_value(range, progress);
}
static void on_change_value(GtkRange* self, GtkScrollType* scroll, gdouble value, jobject listener)
{
JNIEnv *env = get_jni_env();
WrapperWidget *wrapper = WRAPPER_WIDGET(gtk_widget_get_parent(GTK_WIDGET(self)));
jclass listener_class = _CLASS(listener);
jmethodID on_progress_changed = _METHOD(listener_class, "onProgressChanged", "(Landroid/widget/SeekBar;IZ)V");
jmethodID on_start_tracking = _METHOD(listener_class, "onStartTrackingTouch", "(Landroid/widget/SeekBar;)V");
jmethodID on_stop_tracking = _METHOD(listener_class, "onStopTrackingTouch", "(Landroid/widget/SeekBar;)V");
(*env)->CallVoidMethod(env, listener, on_start_tracking, wrapper->jobj);
(*env)->CallVoidMethod(env, listener, on_progress_changed, wrapper->jobj, (int)value, TRUE);
(*env)->CallVoidMethod(env, listener, on_stop_tracking, wrapper->jobj);
}
JNIEXPORT void JNICALL Java_android_widget_SeekBar_setOnSeekBarChangeListener(JNIEnv *env, jobject this, jobject listener)
{
GtkRange *range = GTK_RANGE(_PTR(_GET_LONG_FIELD(this, "widget")));
g_signal_handlers_block_matched(range, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, on_change_value, NULL);
if (listener) {
g_signal_connect(range, "change_value", G_CALLBACK(on_change_value), _REF(listener));
}
}