LevelBarとSeparator


メーター表示がしたくなったので、LevelBarのサンプルを書いてみた。

#include <gtk/gtk.h>

GtkWidget *levelbar;
//タイムカウントのON/OFFに使う
static guint timer_id;
//各buttonのEnableとDisableを制御する値
gint lbstate;
//LevelBarが持つ値
gdouble lbvalue;

//LevelBarの値を増やして表示
static gboolean ivent_loop(gpointer user_data)
{
  lbvalue += 1.0;
  gtk_level_bar_set_value(GTK_LEVEL_BAR(levelbar), lbvalue);
  if( lbvalue >= 20.0 ){
    lbstate = 2;
    g_source_remove(timer_id);
  }
}

//button1がEnable(lbstate = 0)であれば、0.5秒ごとにLevelBarを伸ばす
static void cb_button1_clicked(GtkWidget *widget, gpointer data)
{
  if( lbstate == 0 ){
    lbstate = 1;
    timer_id = g_timeout_add(500, (GSourceFunc)ivent_loop, NULL);
  }
}

//button2がEnable(lbstate = 2)であれば、LebelBarをリセットする
static void cb_button2_clicked(GtkWidget *widget, gpointer data)
{
  if( lbstate == 2 ){
    lbstate = 0;
    lbvalue = 0.0;
    gtk_level_bar_set_value(GTK_LEVEL_BAR(levelbar), lbvalue);
  }
}

static void cb_button3_clicked(GtkWidget *button2, gpointer user_data)
{
  gtk_main_quit();
}

int main(int argc, char** argv)
{
  lbvalue = 0.0;
  lbstate = 0;
  GtkWidget *window;
  GtkWidget *vbox;
  GtkWidget *hbox;
  GtkWidget *button1;
  GtkWidget *button2;
  GtkWidget *button3;
  GtkWidget *vseparator;
  GtkWidget *hseparator;

  gtk_init(&argc,&argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_widget_set_size_request(window, 300, 200);
  gtk_window_set_title(GTK_WINDOW(window), "LevelBar");
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_container_set_border_width(GTK_CONTAINER(window), 10);
  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

  vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
  gtk_container_add(GTK_CONTAINER(window), vbox);

  levelbar = gtk_level_bar_new();
  //LebelBarの最小値を0に設定
  gtk_level_bar_set_min_value(GTK_LEVEL_BAR(levelbar), 0.0);
  //LebelBarの最大値を20に設定
  gtk_level_bar_set_max_value(GTK_LEVEL_BAR(levelbar), 20.0);
  //LebelBarに初期値(0)を設定
  gtk_level_bar_set_value(GTK_LEVEL_BAR(levelbar), lbvalue);
  gtk_box_pack_start(GTK_BOX(vbox), levelbar, TRUE, TRUE, 0);

  //HorizontalSeparatorを配置
  hseparator = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
  gtk_box_pack_start(GTK_BOX(vbox), hseparator, TRUE, TRUE, 0);

  hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
  gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
  button1 = gtk_button_new_with_label("Start");
  g_signal_connect(G_OBJECT(button1), "clicked", G_CALLBACK(cb_button1_clicked), NULL);
  gtk_box_pack_start(GTK_BOX(hbox), button1, TRUE, TRUE, 0);
  //VerticalSeparatorを配置
  vseparator = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
  gtk_box_pack_start(GTK_BOX(hbox), vseparator, TRUE, TRUE, 0);
  button2 = gtk_button_new_with_label("Reset");
  g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(cb_button2_clicked), NULL);
  gtk_box_pack_start(GTK_BOX(hbox), button2, TRUE, TRUE, 0);

  hseparator = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
  gtk_box_pack_start(GTK_BOX(vbox), hseparator, TRUE, TRUE, 0);

  button3 = gtk_button_new_with_label("Quit");
  gtk_box_pack_start(GTK_BOX(vbox), button3, TRUE, TRUE, 0);
  g_signal_connect(G_OBJECT(button3), "clicked", G_CALLBACK(cb_button3_clicked), NULL);

  gtk_widget_show_all(window);
  gtk_main();

  return 0;
}

「Start」ボタンでタイムカウントを始め、LevelBarを伸ばして行く。

LevelBarの値がMaxになると「Reset」ボタンが使えるようになる。

「Reset」ボタンをクリックすると、LevelBarがリセットされ、再び「Start」ボタンが使えるようになる。

今回はLevelBarの他に、Separatorとタイムカウントの終了を使ってみた。 気まぐれで作成できそうなウィジェットは、これで紹介し尽したので、 次回はGTK+の可能性を広げるべく、再び信号を学び直そうと思う。


前章  | 目次 |  次章



トップ



/