gtk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
|