ObjGUI  Check-in [60818c0951]

Overview
Comment:Initial import.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | descendants | trunk
Files: files | file ages | folders
SHA3-256: 60818c0951d73488d7a6af3ad2ba4b8e7ae8636e312cc6f349100723de53cb86
User & Date: js on 2011-12-27 21:09:33
Other Links: manifest | tags
Context
2011-12-27
22:38
Make it possible to have implementations in different toolkits.
Also, make it possible to share the headers.
check-in: 31af425497 user: js tags: trunk
21:09
Initial import. check-in: 60818c0951 user: js tags: trunk
Changes

Added Makefile version [cbf87b91d8].











































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PREFIX ?= /usr/local

all:
	@objfw-compile -Wall -g --lib 0.0 -o objgui \
		`pkg-config --cflags --libs gtk+-3.0` \
		`ls *.m | fgrep -v test.m`

test:
	@objfw-compile -Wall -g -o test \
		`pkg-config --cflags --libs gtk+-3.0` \
		*.m

install:
	mkdir -p ${PREFIX}/include/ObjGUI
	cp *.h ${PREFIX}/include/ObjGUI/
	cp libobjgui.so ${PREFIX}/lib/libobjgui.so.0.0
	ln -sf libobjgui.so.0.0 ${PREFIX}/lib/libobjgui.so.0
	ln -sf libobjgui.so.0 ${PREFIX}/lib/libobjgui.so

clean:
	rm -f test *.so *.o *~

Added OGApplication.h version [ac83513858].















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <gtk/gtk.h>

#import <ObjFW/ObjFW.h>

@protocol OGApplicationDelegate <OFObject>
- (void)applicationDidFinishLaunching;
@optional
- (void)applicationWillTerminate;
@end

@interface OGApplication: OFObject <OFApplicationDelegate>
{
	id <OFApplicationDelegate> delegate;
}

+ (void)quit;
@end

#define OG_APPLICATION_DELEGATE(cls)	\
	Class				\
	og_application_delegate() {	\
		return [cls class];	\
	}

Added OGApplication.m version [3fc1de7962].









































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#import "OGApplication.h"

OF_APPLICATION_DELEGATE(OGApplication)

extern Class og_application_delegate(void);

@implementation OGApplication
+ (void)quit
{
	gtk_main_quit();
}

- (void)applicationDidFinishLaunching
{
	OFAutoreleasePool *pool;
	int *argc;
	char ***argv;

	delegate = [[og_application_delegate() alloc] init];

	[[OFApplication sharedApplication] getArgumentCount: &argc
					  andArgumentValues: &argv];
	gtk_init(argc, argv);

	pool = [OFAutoreleasePool new];
	[delegate applicationDidFinishLaunching];
	[pool release];

	gtk_main();
}

- (void)applicationWillTerminate
{
	[delegate applicationWillTerminate];
}
@end

Added OGBox.h version [8a7b04865c].





























>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#import "OGWidget.h"

@interface OGBox: OGWidget
+ box;

- (void)appendChild: (OGWidget*)child
	     expand: (BOOL)expand
	       fill: (BOOL)fill
	    padding: (float)padding;
- (void)prependChild: (OGWidget*)child
	      expand: (BOOL)expand
		fill: (BOOL)fill
	     padding: (float)padding;
@end

Added OGBox.m version [1c275431c8].





















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#import "OGBox.h"

@implementation OGBox
+ box
{
	return [[[self alloc] init] autorelease];
}

- init
{
	self = [super init];

	@try {
		if (isa == [OGBox class])
			@throw [OFNotImplementedException
			    exceptionWithClass: isa
				      selector: _cmd];
	} @catch (id e) {
		[self release];
		@throw e;
	}

	return self;
}

- (void)appendChild: (OGWidget*)child
	     expand: (BOOL)expand
	       fill: (BOOL)fill
	    padding: (float)padding
{
	gtk_box_pack_start(GTK_BOX(widget), child->widget, expand, fill,
	    padding);
}

- (void)prependChild: (OGWidget*)child
	      expand: (BOOL)expand
		fill: (BOOL)fill
	     padding: (float)padding
{
	gtk_box_pack_end(GTK_BOX(widget), child->widget, expand, fill, padding);
}
@end

Added OGButton.h version [719e887149].







































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#import "OGWidget.h"

@class OGButton;

@protocol OGButtonDelegate <OFObject>
@optional
- (void)buttonWasClicked: (OGButton*)button;
@end

@interface OGButton: OGWidget
{
	id <OGButtonDelegate> delegate;
}

@property (assign) id <OGButtonDelegate> delegate;
@property (copy) OFString *label;

+ button;
@end

Added OGButton.m version [61e8a6d13f].

















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#import "OGButton.h"

@interface OGButton ()
- (void)OG_clicked;
@end

static void
clicked(GtkWidget *widget, gpointer data)
{
	[(OGButton*)data OG_clicked];
}

@implementation OGButton
@synthesize delegate;

+ button
{
	return [[[self alloc] init] autorelease];
}

- init
{
	self = [super init];

	widget = gtk_button_new();
	g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(clicked),
	    self);

	g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(og_destroy),
	    self);
	[self retain];

	return self;
}

- (OFString*)label
{
	return [OFString stringWithUTF8String:
	    gtk_button_get_label(GTK_BUTTON(widget))];
}

- (void)setLabel: (OFString*)label
{
	gtk_button_set_label(GTK_BUTTON(widget), [label UTF8String]);
}

- (void)OG_clicked
{
	OFAutoreleasePool *pool = [OFAutoreleasePool new];

	if ([delegate respondsToSelector: @selector(buttonWasClicked:)])
	      [delegate buttonWasClicked: self];

	[pool release];
}
@end

Added OGHBox.h version [c930914b09].









>
>
>
>
1
2
3
4
#import "OGBox.h"

@interface OGHBox: OGBox
@end

Added OGHBox.m version [f83c2e998a].

































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#import "OGHBox.h"

@implementation OGHBox
- init
{
	self = [super init];

	widget = gtk_hbox_new(FALSE, 0);

	g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(og_destroy),
	    self);
	[self retain];

	return self;
}
@end

Added OGVBox.h version [7d3b22a99a].









>
>
>
>
1
2
3
4
#import "OGBox.h"

@interface OGVBox: OGBox
@end

Added OGVBox.m version [ff76a184fe].

































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#import "OGVBox.h"

@implementation OGVBox
- init
{
	self = [super init];

	widget = gtk_vbox_new(FALSE, 0);

	g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(og_destroy),
	    self);
	[self retain];

	return self;
}
@end

Added OGWidget.h version [fab0087c15].































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <gtk/gtk.h>

#import <ObjFW/ObjFW.h>

@interface OGWidget: OFObject
{
@public
	GtkWidget *widget;
}

- (void)show;
- (void)hide;
@end

extern void og_destroy(GtkWidget*, OGWidget*);

Added OGWidget.m version [33691ef540].







































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "OGWidget.h"

void og_destroy(GtkWidget *widget, OGWidget *object)
{
	[object release];
}

@implementation OGWidget
- init
{
	self = [super init];

	@try {
		if (isa == [OGWidget class])
			@throw [OFNotImplementedException
			    exceptionWithClass: isa
				      selector: @selector(init)];
	} @catch (id e) {
		[self release];
		@throw e;
	}

	return self;
}

- (void)show
{
	gtk_widget_show_all(widget);
}

- (void)hide
{
	gtk_widget_hide(widget);
}
@end

Added OGWindow.h version [df45c3fe07].













































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#import "OGWidget.h"

@class OGWindow;

@protocol OGWindowDelegate <OFObject>
@optional
- (BOOL)windowWillClose: (OGWindow*)window;
@end

@interface OGWindow: OGWidget
{
	id <OGWindowDelegate> delegate;
}

@property (assign) id <OGWindowDelegate> delegate;
@property (copy) OFString *title;
@property (assign) of_point_t position;
@property (assign) of_dimension_t dimension;

+ window;
- (void)addChild: (OGWidget*)widget;
@end

Added OGWindow.m version [787f92d7be].

























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#import "OGWindow.h"

@interface OGWindow ()
- (BOOL)OG_willClose;
@end

static gboolean
willClose(GtkWidget *widget, GdkEvent *event, gpointer data)
{
	return ([(OGWindow*)data OG_willClose] ? FALSE : TRUE);
}

@implementation OGWindow
@synthesize delegate;

+ window
{
	return [[[self alloc] init] autorelease];
}

- init
{
	self = [super init];

	widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	g_signal_connect(G_OBJECT(widget), "delete-event",
	    G_CALLBACK(willClose), self);

	g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(og_destroy),
	    self);
	[self retain];

	return self;
}

- (OFString*)title
{
	return [OFString stringWithUTF8String:
	    gtk_window_get_title(GTK_WINDOW(widget))];
}

- (void)setTitle: (OFString*)title
{
	gtk_window_set_title(GTK_WINDOW(widget), [title UTF8String]);
}

- (of_point_t)position
{
	gint x, y;

	gtk_window_get_position(GTK_WINDOW(widget), &x, &y);

	return of_point(x, y);
}

- (void)setPosition: (of_point_t)position
{
	gtk_window_move(GTK_WINDOW(widget), position.x, position.y);
}

- (of_dimension_t)dimension
{
	gint width, height;

	gtk_window_get_size(GTK_WINDOW(widget), &width, &height);

	return of_dimension(width, height);
}

- (void)setDimension: (of_dimension_t)dimension
{
	gtk_window_resize(GTK_WINDOW(widget),
	    dimension.width, dimension.height);
}

- (void)addChild: (OGWidget*)child
{
	gtk_container_add(GTK_CONTAINER(widget), child->widget);
}

- (BOOL)OG_willClose
{
	OFAutoreleasePool *pool = [OFAutoreleasePool new];

	if ([delegate respondsToSelector: @selector(windowWillClose:)])
		return [delegate windowWillClose: self];

	[pool release];

	return YES;
}
@end

Added test.m version [625fe2ff89].





















































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#import "OGApplication.h"
#import "OGWindow.h"
#import "OGButton.h"
#import "OGHBox.h"
#import "OGVBox.h"

@interface Test: OFObject <OGApplicationDelegate, OGWindowDelegate,
    OGButtonDelegate>
@end

OG_APPLICATION_DELEGATE(Test)

@implementation Test
- (void)applicationDidFinishLaunching
{
	OGWindow *w = [OGWindow window];
	w.title = @"Hallo Welt!";
	w.position = of_point(100, 100);
	w.dimension = of_dimension(600, 400);
	w.delegate = self;

	OGVBox *vbox = [OGVBox box];
	[w addChild: vbox];

	OGButton *b = [OGButton button];
	b.label = @"Klick mich!";
	b.delegate = self;
	[vbox appendChild: b
		   expand: YES
		     fill: YES
		  padding: 0];

	OGHBox *hbox = [OGHBox box];
	[vbox appendChild: hbox
		   expand: NO
		     fill: NO
		  padding: 0];

	OGButton *b1 = [OGButton button];
	b1.label = @"Ich";
	[hbox appendChild: b1
		   expand: YES
		     fill: YES
		  padding: 0];

	OGButton *b2 = [OGButton button];
	b2.label = @"mach";
	[hbox appendChild: b2
		   expand: YES
		     fill: YES
		  padding: 0];

	OGButton *b3 = [OGButton button];
	b3.label = @"nix";
	[hbox appendChild: b3
		   expand: YES
		     fill: YES
		  padding: 0];

	[w show];
}

- (BOOL)windowWillClose: (OGWindow*)window
{
	[OGApplication quit];

	return YES;
}

- (void)buttonWasClicked: (OGButton*)button
{
	of_log(@"Hallo!");
}
@end