ProgressBar: use GtkSpinner for indeterminate mode

This commit is contained in:
Julian Winkler
2024-02-18 08:30:32 +01:00
parent 3486d59e81
commit 5f3f8a5e6c
3 changed files with 34 additions and 5 deletions

View File

@@ -215,6 +215,14 @@ JNIEXPORT jlong JNICALL Java_android_widget_ProgressBar_native_1constructor
JNIEXPORT void JNICALL Java_android_widget_ProgressBar_native_1setProgress JNIEXPORT void JNICALL Java_android_widget_ProgressBar_native_1setProgress
(JNIEnv *, jobject, jlong, jfloat); (JNIEnv *, jobject, jlong, jfloat);
/*
* Class: android_widget_ProgressBar
* Method: setIndeterminate
* Signature: (Z)V
*/
JNIEXPORT void JNICALL Java_android_widget_ProgressBar_setIndeterminate
(JNIEnv *, jobject, jboolean);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@@ -11,14 +11,31 @@
JNIEXPORT jlong JNICALL Java_android_widget_ProgressBar_native_1constructor(JNIEnv *env, jobject this, jobject context, jobject attrs) JNIEXPORT jlong JNICALL Java_android_widget_ProgressBar_native_1constructor(JNIEnv *env, jobject this, jobject context, jobject attrs)
{ {
GtkWidget *wrapper = g_object_ref(wrapper_widget_new()); GtkWidget *wrapper = g_object_ref(wrapper_widget_new());
GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
GtkWidget *progress_bar = gtk_progress_bar_new(); GtkWidget *progress_bar = gtk_progress_bar_new();
wrapper_widget_set_child(WRAPPER_WIDGET(wrapper), progress_bar); GtkWidget *spinner = gtk_spinner_new();
gtk_widget_set_name(progress_bar, "ProgressBar"); wrapper_widget_set_child(WRAPPER_WIDGET(wrapper), box);
return _INTPTR(progress_bar); gtk_box_append(GTK_BOX(box), progress_bar);
gtk_box_append(GTK_BOX(box), spinner);
gtk_widget_set_name(box, "ProgressBar");
gtk_widget_set_visible(spinner, FALSE);
return _INTPTR(box);
} }
JNIEXPORT void JNICALL Java_android_widget_ProgressBar_native_1setProgress(JNIEnv *env, jobject this, jlong widget_ptr, jfloat progress) JNIEXPORT void JNICALL Java_android_widget_ProgressBar_native_1setProgress(JNIEnv *env, jobject this, jlong widget_ptr, jfloat progress)
{ {
GtkProgressBar *progress_bar = GTK_PROGRESS_BAR(_PTR(widget_ptr)); GtkWidget *box = GTK_WIDGET(_PTR(widget_ptr));
GtkProgressBar *progress_bar = GTK_PROGRESS_BAR(gtk_widget_get_first_child(box));
gtk_progress_bar_set_fraction(progress_bar, progress); gtk_progress_bar_set_fraction(progress_bar, progress);
} }
JNIEXPORT void JNICALL Java_android_widget_ProgressBar_setIndeterminate(JNIEnv *env, jobject this, jboolean indeterminate)
{
GtkWidget *box = GTK_WIDGET(_PTR(_GET_LONG_FIELD(this, "widget")));
GtkProgressBar *progress_bar = GTK_PROGRESS_BAR(gtk_widget_get_first_child(box));
GtkSpinner *spinner = GTK_SPINNER(gtk_widget_get_last_child(box));
gtk_spinner_set_spinning(spinner, indeterminate);
gtk_widget_set_visible(GTK_WIDGET(progress_bar), !indeterminate);
gtk_widget_set_visible(GTK_WIDGET(spinner), indeterminate);
}

View File

@@ -1,6 +1,7 @@
package android.widget; package android.widget;
import android.content.Context; import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.util.AttributeSet; import android.util.AttributeSet;
@@ -14,6 +15,9 @@ public class ProgressBar extends View {
public ProgressBar(Context context, AttributeSet attrs, int defStyle) { public ProgressBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle); super(context, attrs, defStyle);
haveComplexMeasure = true; haveComplexMeasure = true;
TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.ProgressBar, defStyle, 0);
setIndeterminate(a.getBoolean(com.android.internal.R.styleable.ProgressBar_indeterminate, false));
a.recycle();
} }
public ProgressBar(Context context, AttributeSet attrs) { public ProgressBar(Context context, AttributeSet attrs) {
@@ -28,7 +32,7 @@ public class ProgressBar extends View {
protected native long native_constructor(Context context, AttributeSet attrs); protected native long native_constructor(Context context, AttributeSet attrs);
private native void native_setProgress(long widget, float fraction); private native void native_setProgress(long widget, float fraction);
public synchronized void setIndeterminate(boolean indeterminate) {} public native void setIndeterminate(boolean indeterminate);
public Drawable getProgressDrawable() { public Drawable getProgressDrawable() {
return new Drawable() { return new Drawable() {