Minggu, 15 Maret 2015

GTK Programming : GtkRange dan GtkScale


GtkRange merupakan kelas dasar yang diturunkan pada widget berjenis adjustment atau widget yang dkhususkan untuk peyesuaian level. Widget ini menyimpan beberapa properti untuk mengatur kerja widget. GtkScale adalah salah satu turunan GtkRange. Bentuk GtkScale panjang dengan dilengkapi satu buah kontrol slider untuk mengatur levelnya.

Tulisan ini lebih bermaksud untuk memperkenalkan GtkScale, namun karena widget ini turunan GtkRange, untuk menggunakannya kita harus sekaligus mengenal dan mempelajari GtkRange.

GtkScale dapat dengan mudah dibuat dengan fungsi gtk_scale_new_with_range(). Fungsi ini akan membuat sebuah widget sesuai dengan argumen yang diberikan.


GtkWidget *gtk_scale_new_with_range (GtkOrientation orientation, gdouble min, gdouble max, gdouble step);

Argumen yang digunakan dalam fungsi di atas adalah sebagai berikut:
  • orientation : GTK_ORIENTATION_VERTICAL atau GTK_ORIENTATION_HORIZONTAL
  • min : Nilai terendah yang bisa diatur melalui GtkScale
  • max : Nilai tertinggi
  • step : Perubahan nilai saat GtkScale diatur dengan arrow keyboard. Misalnya nilainya 2, maka saat menekan tombol panah atas, nilai GtkScale akan bergeser ke 2 nilai lebih tinggi.

Contoh Kode
#include<gtk/gtk.h>

int main(int argc, char *argv[])
{
    GtkWidget *window, *box, *scale1, *scale2;
    gtk_init(&argc, &argv);
    //window baru
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"GtkScale");
    gtk_widget_set_size_request(window,250,100);
    //buat box
    box = gtk_box_new(GTK_ORIENTATION_VERTICAL,10);
    //buat GtkAdjustment dan GtkScale
    scale1 = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0,100,1);
    scale2 = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0,100,1);
    gtk_range_set_inverted(GTK_RANGE(scale2),TRUE);
    //pack
    gtk_box_pack_start(GTK_BOX(box),scale1,TRUE,TRUE,10);
    gtk_box_pack_start(GTK_BOX(box),scale2,TRUE,TRUE,10);
    gtk_container_add(GTK_CONTAINER(window), box);
    //tampilkan widget
    gtk_widget_show_all(window);
    gtk_main();
    return 0;
 Pada kode di atas, kita juga mencoba satu metode dasar yang disediakan oleh GtkRange, yaitu gtk_range_set_inverted(). Fungsi ini sangat berguna untuk mengatur arah slider. Misalnya sebelum memanggil ini nilai minimum ada di kiri dan maksimum ada di kanan, maka fungsi ini dapat mengubah letak nilai minimum dan maksimum menjadi kebalikannya. Coba lihat screenshot untuk melihat efeknya. Adapun bentuk fungsi gtk_range_set_inverted adalah sebagai berikut.
void gtk_range_set_inverted (GtkRange *range, gboolean setting);

Fungsi diatas akan memutar arah saat argumen setting adalah TRUE, untuk mengembalikan ke keadaan semula, kita cukup memanggil fungsi ini dengan argumen setting = FALSE.

Beberapa fungsi di bawah ini mungkin juga akan bermanfaat untuk memperluas fungsional program Anda.

Mengubah posisi dan nilai fill level GtkScale :

void gtk_range_set_value (GtkRange *range, gdouble value);
  Menyembunyikan/menampilkan fill level:
void gtk_range_set_show_fill_level (GtkRange *range, gboolean show_fill_level);
  Selain mengenal fungsi dasarnya, mungkin akan lebih baik jika Anda mengenal beberapa jenis callback yang ada pada GtkRange. Semua callback ini bisa dihubungkan dengan fungsi g_signal_connect() seperti pada tulisan-tulisan sebelumnya.

“change-value” : signal ini muncul saat kontrol slider GtkScale digerakkan oleh pengguna.
void user_function (GtkRange *range, gpointer user_data)
{
   //handler
}
 

“format-value” : Signal berasal berasal dari GtkScale. Dapat anda gunakan untuk mengganti angka fill level yang ditampilkan diatas widget. Signal ini juga dipanggil saat slider digerakkan.

gchar *user_function (GtkScale *scale, gdouble value, gpointer user_data)
{
   //handler
}
  Contoh penggunaannya adalah sebagai berikut:
...
#include<malloc.h>
...
gchar *scale_format_value (GtkScale *scale, gdouble value, gpointer user_data)
{
   char *val;
   val = (char*)malloc(50); //Jangan kawatir, GTK akan mengeksekusi free() setelah selesai.
   sprintf(val, "Value = %f", value);
   return val;
}

GtkWidget *scale;
int main(int argc, char *argv[])
{
    ...
    g_signal_connect (scale, "format-value", G_CALLBACK (scale_format_value),NULL);
    ...
     
Hasil



Load disqus comments

0 comments