gtk 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/Gemfile +12 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +19 -0
- data/Rakefile +51 -0
- data/VERSION +1 -0
- data/examples/custom_cell_renderer.rb +141 -0
- data/gtk.gemspec +97 -0
- data/lib/gtk.rb +203 -0
- data/lib/gtk/bin.rb +5 -0
- data/lib/gtk/buttons_type.rb +14 -0
- data/lib/gtk/cell_renderer.rb +164 -0
- data/lib/gtk/cell_renderer_text.rb +12 -0
- data/lib/gtk/container.rb +9 -0
- data/lib/gtk/dialog_flags.rb +11 -0
- data/lib/gtk/g_type.rb +6 -0
- data/lib/gtk/list_store.rb +26 -0
- data/lib/gtk/message_dialog.rb +25 -0
- data/lib/gtk/message_type.rb +13 -0
- data/lib/gtk/selection_mode.rb +8 -0
- data/lib/gtk/style_context.rb +16 -0
- data/lib/gtk/tree_iter.rb +32 -0
- data/lib/gtk/tree_model.rb +20 -0
- data/lib/gtk/tree_path.rb +17 -0
- data/lib/gtk/tree_selection.rb +12 -0
- data/lib/gtk/tree_store.rb +45 -0
- data/lib/gtk/tree_view.rb +34 -0
- data/lib/gtk/tree_view_column.rb +36 -0
- data/lib/gtk/window.rb +17 -0
- data/lib/gtk/window_position.rb +9 -0
- data/lib/gtk/window_type.rb +6 -0
- data/spec/gtk_spec.rb +7 -0
- data/spec/spec_helper.rb +32 -0
- metadata +204 -0
data/lib/gtk/bin.rb
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
module Gtk
|
2
|
+
module Lib
|
3
|
+
# attach_function :gtk_cell_renderer_new, [], :pointer
|
4
|
+
attach_method :gtk_cell_renderer_get_state, [:pointer, :pointer, :int], :int
|
5
|
+
attach_method :gtk_cell_renderer_get_padding, [:pointer, :pointer, :pointer], :void
|
6
|
+
attach_method :gtk_cell_renderer_set_padding, [:pointer, :int, :int], :void
|
7
|
+
attach_method :gtk_cell_renderer_get_alignment, [:pointer, :pointer, :pointer], :void
|
8
|
+
attach_function :gtk_cell_renderer_get_type, [], :ulong
|
9
|
+
end
|
10
|
+
|
11
|
+
class CellRenderer < Widget
|
12
|
+
class GObjectClass < FFI::Struct
|
13
|
+
layout :g_type_class, :long,
|
14
|
+
:construct_properties, :pointer,
|
15
|
+
:constructor, :pointer,
|
16
|
+
:set_property, :pointer,
|
17
|
+
:get_property, :pointer
|
18
|
+
end
|
19
|
+
|
20
|
+
class GtkCellRendererClass < FFI::Struct
|
21
|
+
|
22
|
+
# layout :get_request_mode, :get_request_mode_function,
|
23
|
+
# :get_preferred_width, :get_preferred_width_function,
|
24
|
+
# :get_preferred_height_for_width, :get_preferred_height_for_width_function,
|
25
|
+
# :get_preferred_height, :get_preferred_height_function,
|
26
|
+
# :get_preferred_width_for_height, :get_preferred_width_for_height_function,
|
27
|
+
# :get_aligned_area, :get_aligned_area_function,
|
28
|
+
# :get_size, :get_size_function,
|
29
|
+
# :render, :render_function
|
30
|
+
|
31
|
+
SIZE_OF_GInitiallyUnownedClass = 136
|
32
|
+
|
33
|
+
layout :parent_class, [:uint8, SIZE_OF_GInitiallyUnownedClass],
|
34
|
+
:get_request_mode, :pointer,
|
35
|
+
:get_preferred_width, :pointer,
|
36
|
+
:get_preferred_height_for_width, :pointer,
|
37
|
+
:get_preferred_height, :pointer,
|
38
|
+
:get_preferred_width_for_height, :pointer,
|
39
|
+
:get_aligned_area, :pointer,
|
40
|
+
:get_size, :pointer,
|
41
|
+
:render, :pointer
|
42
|
+
|
43
|
+
# gboolean (* activate) (GtkCellRenderer *cell,
|
44
|
+
# GdkEvent *event,
|
45
|
+
# GtkWidget *widget,
|
46
|
+
# const gchar *path,
|
47
|
+
# const GdkRectangle *background_area,
|
48
|
+
# const GdkRectangle *cell_area,
|
49
|
+
# GtkCellRendererState flags);
|
50
|
+
# GtkCellEditable * (* start_editing) (GtkCellRenderer *cell,
|
51
|
+
# GdkEvent *event,
|
52
|
+
# GtkWidget *widget,
|
53
|
+
# const gchar *path,
|
54
|
+
# const GdkRectangle *background_area,
|
55
|
+
# const GdkRectangle *cell_area,
|
56
|
+
# GtkCellRendererState flags);
|
57
|
+
|
58
|
+
# /* Signals */
|
59
|
+
# void (* editing_canceled) (GtkCellRenderer *cell);
|
60
|
+
# void (* editing_started) (GtkCellRenderer *cell,
|
61
|
+
# GtkCellEditable *editable,
|
62
|
+
# const gchar *path);
|
63
|
+
end
|
64
|
+
|
65
|
+
GetProperty = FFI::Function.new(:void,[:pointer, :uint, :pointer, :pointer]) do |_object,property_id,_value,_pspec|
|
66
|
+
raise "get_property"
|
67
|
+
end
|
68
|
+
SetProperty = FFI::Function.new(:void,[:pointer, :uint, :pointer, :pointer]) do |_object,property_id,_value,_pspec|
|
69
|
+
raise "set_property"
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.inherited sub
|
73
|
+
sub.const_set(:ClassInit,FFI::Function.new(:void,[:pointer]) do |_klass|
|
74
|
+
cell_class = GtkCellRendererClass.new(_klass)
|
75
|
+
object_class = GObjectClass.new(_klass)
|
76
|
+
cell_class[:render] = Render
|
77
|
+
cell_class[:get_size] = GetSize
|
78
|
+
object_class[:set_property] = SetProperty
|
79
|
+
object_class[:get_property] = GetProperty
|
80
|
+
sub.init(cell_class,object_class)
|
81
|
+
end)
|
82
|
+
end
|
83
|
+
|
84
|
+
InstanceInit = FFI::Function.new(:void,[:pointer]) do |_klass|
|
85
|
+
Gtk::CellRenderer.new(FFI::Pointer.new(_klass)).set_padding 2,2
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.type_info
|
89
|
+
@type_info ||= begin
|
90
|
+
type_info = Gtk::Lib::GTypeInfo.new
|
91
|
+
type_info[:class_size] = 264
|
92
|
+
type_info[:class_init] = self.const_get(:ClassInit)
|
93
|
+
type_info[:instance_init] = InstanceInit
|
94
|
+
type_info[:instance_size] = 40
|
95
|
+
type_info
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
class CairoRectangleInt < FFI::Struct
|
100
|
+
layout :x, :int, :y, :int, :width, :int, :height, :int;
|
101
|
+
end
|
102
|
+
|
103
|
+
Render = FFI::Function.new(:void,[:pointer, :pointer, :pointer, :pointer, :pointer, :int]) do |_cell,_cr,_widget,_background_area,_cell_area,flags|
|
104
|
+
Cairo::Context.new(FFI::Pointer.new(_cr)) do |cr|
|
105
|
+
instances[_cell.address].render(
|
106
|
+
cr,
|
107
|
+
Gtk::Widget.new(FFI::Pointer.new(_widget)),
|
108
|
+
CairoRectangleInt.new(FFI::Pointer.new(_background_area)),
|
109
|
+
CairoRectangleInt.new(FFI::Pointer.new(_cell_area)),
|
110
|
+
flags
|
111
|
+
)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
GetSize = FFI::Function.new(:void,[:pointer, :pointer, :pointer, :pointer, :pointer, :pointer, :pointer]) do |_cell,_widget,_cell_area,_x_offset,_y_offset,_width,_height|
|
116
|
+
x_offset,y_offset,width,height = instances[_cell.address].get_size(
|
117
|
+
Gtk::Widget.new(FFI::Pointer.new(_widget)),
|
118
|
+
_cell_area.null? ? nil : CairoRectangleInt.new(FFI::Pointer.new(_cell_area))
|
119
|
+
)
|
120
|
+
_x_offset.write_int(x_offset) if x_offset
|
121
|
+
_y_offset.write_int(x_offset) if y_offset
|
122
|
+
_width.write_int(width) unless _width.null?
|
123
|
+
_height.write_int(height) unless _height.null?
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.instances
|
127
|
+
@@instances ||= {}
|
128
|
+
end
|
129
|
+
def instances
|
130
|
+
self.class.instances
|
131
|
+
end
|
132
|
+
|
133
|
+
def initialize pointer
|
134
|
+
raise "hell" unless pointer.is_a?(FFI::Pointer)
|
135
|
+
@native = pointer
|
136
|
+
instances[native.address] = self
|
137
|
+
end
|
138
|
+
def self.type
|
139
|
+
@type ||= Lib.gtk_cell_renderer_text_get_type()
|
140
|
+
end
|
141
|
+
def get_padding
|
142
|
+
xpad = FFI::MemoryPointer.new(:int,1)
|
143
|
+
ypad = FFI::MemoryPointer.new(:int,1)
|
144
|
+
Lib.gtk_cell_renderer_get_padding(native,xpad,ypad)
|
145
|
+
[xpad.read_int,ypad.read_int]
|
146
|
+
end
|
147
|
+
def set_padding xpad,ypad
|
148
|
+
Lib.gtk_cell_renderer_set_padding(native,xpad,ypad)
|
149
|
+
end
|
150
|
+
def get_alignment
|
151
|
+
xpad = FFI::MemoryPointer.new(:int,1)
|
152
|
+
ypad = FFI::MemoryPointer.new(:int,1)
|
153
|
+
Lib.gtk_cell_renderer_get_alignment(native,xpad,ypad)
|
154
|
+
[xpad.read_int,ypad.read_int]
|
155
|
+
end
|
156
|
+
# def initialize
|
157
|
+
# @native = Lib.gtk_cell_renderer_new()
|
158
|
+
# end
|
159
|
+
def self.type
|
160
|
+
Lib.gtk_cell_renderer_get_type()
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
data/lib/gtk/g_type.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
module Gtk
|
2
|
+
module Lib
|
3
|
+
attach_function :gtk_list_store_new, [:int, :varargs], :pointer
|
4
|
+
attach_method :gtk_list_store_append, [:pointer, :pointer], :void
|
5
|
+
attach_method :gtk_list_store_set, [:pointer, :pointer, :varargs], :void
|
6
|
+
end
|
7
|
+
|
8
|
+
class ListStore < GObject
|
9
|
+
def initialize(n_columns, *types)
|
10
|
+
@native = Lib.gtk_list_store_new(n_columns,
|
11
|
+
*(types.map{ |type| [:int,GType[type]] }.flatten)
|
12
|
+
)
|
13
|
+
end
|
14
|
+
def append iter
|
15
|
+
iter.owner = self
|
16
|
+
Lib.gtk_list_store_append(native,iter.to_ptr)
|
17
|
+
end
|
18
|
+
# def set *args
|
19
|
+
# puts "SET #{args.inspect}"
|
20
|
+
# end
|
21
|
+
def to_tree_model
|
22
|
+
Gtk::TreeModel.new(native)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Gtk
|
2
|
+
module Lib
|
3
|
+
attach_function :gtk_message_dialog_new, [:pointer, :long, :long, :long, :string, :varargs], :pointer
|
4
|
+
attach_method :gtk_dialog_run, [:pointer], :long
|
5
|
+
end
|
6
|
+
|
7
|
+
class MessageDialog < Widget
|
8
|
+
def initialize(options)
|
9
|
+
@native = Lib.gtk_message_dialog_new(
|
10
|
+
options[:parent],
|
11
|
+
DialogFlags[options[:flags]],
|
12
|
+
MessageType[options[:type]],
|
13
|
+
ButtonsType[options[:buttons_type]],
|
14
|
+
"%s",
|
15
|
+
:string,
|
16
|
+
options[:message]
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
Lib.gtk_dialog_run(native)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Gtk
|
2
|
+
module Lib
|
3
|
+
attach_method :gtk_style_context_restore, [:pointer], :void
|
4
|
+
attach_method :gtk_style_context_set_state, [:pointer, :int], :void
|
5
|
+
attach_method :gtk_style_context_add_class, [:pointer, :string], :void
|
6
|
+
attach_method :gtk_style_context_save, [:pointer], :void
|
7
|
+
end
|
8
|
+
|
9
|
+
class StyleContext < GObject
|
10
|
+
def initialize(pointer)
|
11
|
+
raise "hell" unless pointer.is_a?(FFI::Pointer)
|
12
|
+
@native = pointer
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Gtk
|
2
|
+
class TreeIter < FFI::Struct
|
3
|
+
attr_accessor :owner
|
4
|
+
|
5
|
+
layout :stamp, :long,
|
6
|
+
:user_data, :pointer,
|
7
|
+
:user_data2, :pointer,
|
8
|
+
:user_data3, :pointer
|
9
|
+
|
10
|
+
def [] i
|
11
|
+
val = FFI::MemoryPointer.new(:float,1) # TODO: lookup column type
|
12
|
+
owner.get(self,:int,i,:pointer,val,:int,-1)
|
13
|
+
val.read_float
|
14
|
+
end
|
15
|
+
|
16
|
+
def []= i,value
|
17
|
+
owner.set(self,:int,i,
|
18
|
+
case value
|
19
|
+
when String
|
20
|
+
:string
|
21
|
+
when Fixnum
|
22
|
+
:int
|
23
|
+
when Float
|
24
|
+
:float
|
25
|
+
else
|
26
|
+
raise value.class.name
|
27
|
+
end,
|
28
|
+
value,:int,-1)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Gtk
|
2
|
+
module Lib
|
3
|
+
attach_method :gtk_tree_model_get_iter_first, [:pointer, :pointer], :bool
|
4
|
+
attach_method :gtk_tree_model_get, [:pointer, :pointer, :varargs], :void
|
5
|
+
end
|
6
|
+
|
7
|
+
class TreeModel < GObject # GInterface really
|
8
|
+
def initialize(pointer)
|
9
|
+
raise "hell" unless pointer.is_a?(FFI::Pointer)
|
10
|
+
@native = pointer
|
11
|
+
end
|
12
|
+
def iter_first
|
13
|
+
iter = TreeIter.new
|
14
|
+
iter.owner = self
|
15
|
+
Lib.gtk_tree_model_get_iter_first(native,iter.to_ptr)
|
16
|
+
iter
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Gtk
|
2
|
+
module Lib
|
3
|
+
attach_method :gtk_tree_path_get_indices, [:pointer], :pointer
|
4
|
+
attach_method :gtk_tree_path_get_depth, [:pointer], :long
|
5
|
+
end
|
6
|
+
|
7
|
+
class TreePath < GObject
|
8
|
+
def initialize(pointer)
|
9
|
+
@native = pointer
|
10
|
+
end
|
11
|
+
def get_indices
|
12
|
+
ret = Lib.gtk_tree_path_get_indices(native)
|
13
|
+
ret.get_array_of_int(0,depth)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Gtk
|
2
|
+
module Lib
|
3
|
+
attach_function :gtk_tree_store_new, [:long, :varargs], :pointer
|
4
|
+
attach_method :gtk_tree_store_append, [:pointer, Gtk::TreeIter.by_ref, Gtk::TreeIter.by_ref], :void
|
5
|
+
attach_method :gtk_tree_store_set_column_types, [:pointer, :long, :pointer], :void
|
6
|
+
attach_method :gtk_tree_store_set, [:pointer, Gtk::TreeIter.by_ref, :varargs], :void
|
7
|
+
end
|
8
|
+
|
9
|
+
class TreeStore < GObject
|
10
|
+
|
11
|
+
TYPE_MAP = {
|
12
|
+
Integer => 24, # GObject::TYPE_INT,
|
13
|
+
String => 64 # GObject::TYPE_STRING
|
14
|
+
}
|
15
|
+
|
16
|
+
def self.type_mapped_types(*types)
|
17
|
+
types = types.first if types.size == 1 && types.first.is_a?(Array)
|
18
|
+
types.map{ |type| TYPE_MAP[type] }
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(*types)
|
22
|
+
@native = Gtk::Lib.gtk_tree_store_new(
|
23
|
+
types.size,
|
24
|
+
*self.class.type_mapped_types(*types).map{ |type|
|
25
|
+
[:int,type]
|
26
|
+
}.flatten
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
def set_column_types *types
|
31
|
+
types = self.class.type_mapped_types(*types)
|
32
|
+
array = FFI::MemoryPointer.new(:long,types.size)
|
33
|
+
array.write_array_of_long(types)
|
34
|
+
Lib.gtk_tree_store_set_column_types(@native,types.size,array)
|
35
|
+
end
|
36
|
+
|
37
|
+
def append parent=nil
|
38
|
+
iter = Gtk::TreeIter.new
|
39
|
+
Gtk::Lib.gtk_tree_store_append(native,iter,parent)
|
40
|
+
iter.owner = self
|
41
|
+
iter
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|