2007/1/27

GtkTreeView でツリー構造のリストを作ろう  GTK

ここでは GtkTreeView を使って簡単なツリー上のリストを作るプログラムを紹介します。

できあがりはこんな感じ↓。

クリックすると元のサイズで表示します


#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>

/* Column definition -- # of columns used here is 1 (= COL_NUM) */
enum { COL_NAME, COL_NUM };

/* Callback on "destroy" */
static void
DestroyCB(GtkWidget *widget, gpointer data)
{
gtk_main_quit();
}

/* main */
int
main(int argc, char **argv)
{
GtkWidget *window;
GtkTreeView *tree_view;
GtkTreeStore *store;
GtkCellRenderer *rend;
GtkTreeViewColumn *column;
GtkTreeIter root_iter, child_iter;
GtkTreePath *path;

gtk_init(&argc, &argv);

/* Create the main, top level, window */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

/* Give it the title */
gtk_window_set_title(GTK_WINDOW(window), "GtkTreeView Test");

/* Open it a bit wider so that both the label and title show up */
//gtk_window_set_default_size(GTK_WINDOW(window), 200, 50);

/* Connect the destroy event of the window with our "quit on destroy"
function */
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(DestroyCB), NULL);

/* Create a tree store for tree_view */
store = gtk_tree_store_new(COL_NUM, G_TYPE_STRING);

/* Create a tree view */
tree_view =
GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)));
g_object_unref(store);
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(tree_view));

/* Don't show the headers this time */
gtk_tree_view_set_headers_visible(tree_view, FALSE);

/* Get a tree store registered in tree_view */
store = GTK_TREE_STORE(gtk_tree_view_get_model(tree_view));

/* Column - name */
column = gtk_tree_view_column_new();
rend = gtk_cell_renderer_text_new();
g_object_set(rend, "ypad", 0, NULL);
//gtk_tree_view_column_set_title(column, "Tree");
gtk_tree_view_column_pack_start(column, rend, FALSE);
gtk_tree_view_column_set_attributes(column, rend, "text", COL_NAME,
NULL);
gtk_tree_view_append_column(tree_view, column);

/* Add root date to tree_view */
gtk_tree_store_append(store, &root_iter, NULL);
gtk_tree_store_set(store, &root_iter, COL_NAME, "Root1", -1);

gtk_tree_store_append(store, &root_iter, NULL);
gtk_tree_store_set(store, &root_iter, COL_NAME, "Root2", -1);

gtk_tree_store_append(store, &root_iter, NULL);
gtk_tree_store_set(store, &root_iter, COL_NAME, "Root3", -1);

/* Add child date to tree_view */
gtk_tree_store_append(store, &child_iter, &root_iter);
gtk_tree_store_set(store, &child_iter, COL_NAME, "Child1", -1);

/* Expand the Root3 row to show the Child1 row */
path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &root_iter);
gtk_tree_view_expand_row(tree_view, path, FALSE);
gtk_tree_path_free(path);

/* Show all widgets */
gtk_widget_show_all(window);

/* Start the main loop */
gtk_main();

return 0;
}
0

2006/12/19

GtkTreeView で簡単に並び替えができるリストを作ろう  GTK

あまりにも情報量が少ない GtkTreeView。ここでは並び替えができる GtkTreeView のサンプルを書いておきます。

GtkTreeView をいじる人なら一度は見てると思う GTK+ 2.0 Tree View Tutorial ですが、どうも少々情報が古いようで、これよりも簡単にできるようです。

なんか AOL のブログって tab (indent) がうまく表示できないようなので、見づらいとは思いますが、UNIX の場合は indent コマンド等で整形して下さい。すいません。

でき上がりはこんな感じ↓

クリックすると元のサイズで表示します

ファイル名を tree_view.c とした場合のコンパイル方:
gcc -o tree_view tree_view.c -O -Wall `pkg-config --libs gtk+-2.0` `pkg-config --cflags gtk+-2.0`


#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>

/* Column definition -- # of columns used here is 2 (= COL_NUM) */
enum { COL_DATE, COL_NAME, COL_NUM };

/* Callback on "destroy" */
static void
DestroyCB (GtkWidget *widget, gpointer data)
{
gtk_main_quit();
}

/* main */
int
main(int argc, char **argv)
{
GtkWidget *window;
GtkTreeView *tree_view;
GtkListStore *store;
GtkTreeSortable *sortable;
GtkCellRenderer *rend;
GtkTreeViewColumn *column;
GtkTreeIter iter;

gtk_init(&argc, &argv);

/* Create the main, top level, window */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

/* Give it the title */
gtk_window_set_title(GTK_WINDOW(window), "GtkTreeView Test");

/* Open it a bit wider so that both the label and title show up */
//gtk_window_set_default_size(GTK_WINDOW(window), 200, 50);

/*
* Connect the destroy event of the window with our on_destroy
* function When the window is about to be destroyed we get a
* notificaiton and stop the main GTK loop
*/
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(DestroyCB), NULL);

/* Create a tree view */
tree_view = GTK_TREE_VIEW(gtk_tree_view_new());
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(tree_view));

/* Create a list store for tree_view */
store = gtk_list_store_new(COL_NUM, G_TYPE_STRING, G_TYPE_STRING);
gtk_tree_view_set_model(tree_view, GTK_TREE_MODEL(store));
g_object_unref(store);
store = GTK_LIST_STORE(gtk_tree_view_get_model(tree_view));

/* Column - date */
column = gtk_tree_view_column_new();
rend = gtk_cell_renderer_text_new();
g_object_set(rend, "ypad", 0, NULL);
gtk_tree_view_column_set_title(column, "Date");
gtk_tree_view_column_pack_start(column, rend, FALSE);
gtk_tree_view_column_set_sort_column_id(column, COL_DATE);
gtk_tree_view_column_set_resizable(column, TRUE);
gtk_tree_view_column_set_attributes(column, rend, "text", COL_DATE,
NULL);
gtk_tree_view_append_column(tree_view, column);

/* Column - name */
column = gtk_tree_view_column_new();
rend = gtk_cell_renderer_text_new();
g_object_set(rend, "ypad", 0, NULL);
gtk_tree_view_column_set_title(column, "Name");
gtk_tree_view_column_pack_start(column, rend, FALSE);
gtk_tree_view_column_set_sort_column_id(column, COL_NAME);
gtk_tree_view_column_set_resizable(column, TRUE);
gtk_tree_view_column_set_attributes(column, rend, "text", COL_NAME,
NULL);
gtk_tree_view_append_column(tree_view, column);

/* Get sortable */
sortable = GTK_TREE_SORTABLE(store);

/* First, sort by date */
gtk_tree_sortable_set_sort_column_id(sortable, COL_DATE,
GTK_SORT_ASCENDING);

/* Add some data to tree_view */
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
COL_DATE, "1980/10/20",
COL_NAME, "Taro",
-1);

gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
COL_DATE, "1982/01/15",
COL_NAME, "Hanako",
-1);

gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
COL_DATE, "1984/04/29",
COL_NAME, "Jiro",
-1);

/* Make sure that everything, window and label, are visible */
gtk_widget_show_all(window);

/* Start the main loop */
gtk_main();

return 0;
}
0

2006/9/27

Windows GTK でフォントを変えたい - 解決  GTK

やっと解決した。実は
font_name="Arial, MS PGothic 9"
で、,(コンマ)の後にスペースがあると Windows ではダメなようだ。なので
font_name="Arial,MS PGothic 9"
が正解。あー、時間かかった。しかしなぜか MS PGothic は 8 と 9 でサイズが全然違うんだよなあ。もう訳わからん。FreeBSD ではコンマの後にスペースがあろうと OK だし、MS PGothic もちゃんとサイズが変わるし…。
まあしゃあない。

<昨日の FreeBSD>
PCI サウンドカードをマシンにさした。ESS1969 とか言うやつで、snd_solo で行けそうだった。カーネルを再コンパイルして起動。pcm0 もあるし、cat /dev/sndstat も
FreeBSD Audio Driver (newpcm)
Installed devices:
pcm0: <ESS Solo-1E> at io 0x1040,0x1090,0x1080 irq 11 (1p/1r/0v channels duplex default)
で OK そう。しかーし、音を鳴らそうとすると FreeBSD が固まる…。なんでやねん。
もともとこのマシンには ICH7 なオンボードサウンドチップが載ってるんやけど、FreeBSD ではまだ対応していなかったので、別のやつを試してみたんやけど…。敢えなく撃沈。さてどうするか…。
0

2006/9/26

rc ファイルで GtkTooptips の設定を変える  GTK

メモ:
rc ファイルで GtkTooltips の背景を変えるには、
style "tooltips"
{
bg[NORMAL] = "#EEEEAA"
}
widget "gtk-tooltips" style "tooltips"

これは GtkTooltips が GtkWidget ではなく、更に gtktooltips.c の中で
gtk_widget_set_name (tooltips->tip_window, "gtk-tooltips");
が呼ばれているためのようである。
0

2006/9/26

Windows GTK でフォントを変えたい - 続き  GTK

GtkSettings を使ってみた。結局これでもだめだった。
実は Windows で
font_name="Arial, MS PGothic 9"
を試してみたのだけど、日本語は文字化けする。 FreeBSD では似たような設定で OK なのに。GTK デフォルトフォントと思っていたのは、 Tahoma の日本語フォントだった。Tahoma って、日本語も使えたんやね。って、自分の使ってるのが英語の(アメリカの)Windows だからか?
日本語関係は一度ちゃんとした日本版の Windows で使ってみたい。
なんか FreeBSD 版の方が見た目良くなってきてる。

<今日の FreeBSD>
今後の 6.2 リリース予定:
BETA1: Sep. 17
BETA2: Oct. 1
RC1: Oct. 15
RC2: Oct. 29
RELEASE: Nov. 13

本リリースが11月13日になってる。6 系列は安定してる(少なくとも自分が使ってきて何の問題もなかった)ので、待ち遠しい。ただ ICH7 なサウンドドライバーがまだなので、それさえ実装してくれれば何の問題もないなあ。6.2 では実装されるのかな?
時間があったら BETA1 にしてみようかな?(って、やっぱ不安定になったらまずいなあ…)
0

2006/9/23

Windows GTK でフォントを変えたい  GTK

仕事の方はほぼある程度のことは実装完了(?)。
で、もう少し見栄えを良くするために GTK のフォント周りをいじっていたのだけれど…。

半角英語フォントは Tahoma に、日本語フォントは MS P ゴシックにというように分けてフォントを指定したかったので、rc ファイルに以下のように記入。

style "user-font"
{
font_name="Tahoma, MS PGothic 9"
}


(注:↑なぜか "font_name" の前のスペース(インデント)が表示されない。とほほ。<pre> タグも使えんのね…)

実はこれ、FreeBSD では OK(実際はちょっとフォントを変えてあるけど)で、Windows ではあかんことが分かった。なんでやろ?
Windows では日本語フォントが GTK のデフォルト(Firefox とか Thunderbird と同じ)になる。あーよく分からん。

ここで GtkSettings を使ってみろとのご指摘が…。今度やってみよう。
(結構時間かかったりするんだよなあ、こういうことで)
0

2006/9/19

GtkTreeView の row のサイズ  GTK

GtkTreeView の一つ一つの row の高さが高すぎていたので、色々いじってみた。
結果、
renderer = gtk_cell_renderer_pixbuf_new();
の後、
g_object_set(renderer, "ypad", 1, NULL);
で ypad の値を変えてやればよかっただけだった。xpad はいじったことあるのに…。
それに加えて、spacing みたいなのがあるのだろうか?
0

2006/9/14

GTK  GTK

まあ文句を言っても仕方ないので、mu-conference 関係は取り敢えず GUI から始める。
GTK を使うのはいいけど、GTK は微妙な widget の配置がやりにくい。ぱっと widget を並べるだけならいいが、ちょっとここはずらしたいとかいうと、ややこしい。
まあこんな事をしているから時間がかかるのかな?
時間かけて配置を思うようにしても、テーマの適用で全然違うことになったり、 FreeBSD → Windows の段階で全然違ったり…_| ̄|◯
思うようにはいかんわなあ。

取り敢えず今日は GUI。かっこいい画面にするぞー、って wxWidgets を使えばよかったかなあ…。

<今日の FreeBSD >
って、gimp なんですが、一度作った画像の色をちょっと変えたい場合は

右クリック→「道具」→「色ツール」→「色相・彩度」

他にも色々ツールがあるみたいだけど、取り敢えずこれを使ってます。同じ形の物で色違いなのが結構あるので…。
0



teacup.ブログ “AutoPage”
AutoPage最新お知らせ