Initial import.
This commit is contained in:
commit
b5f40d159e
16 changed files with 489 additions and 0 deletions
21
Makefile
Normal file
21
Makefile
Normal file
|
@ -0,0 +1,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 *~
|
23
OGApplication.h
Normal file
23
OGApplication.h
Normal file
|
@ -0,0 +1,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]; \
|
||||||
|
}
|
36
OGApplication.m
Normal file
36
OGApplication.m
Normal file
|
@ -0,0 +1,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
|
14
OGBox.h
Normal file
14
OGBox.h
Normal file
|
@ -0,0 +1,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
|
42
OGBox.m
Normal file
42
OGBox.m
Normal file
|
@ -0,0 +1,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
|
19
OGButton.h
Normal file
19
OGButton.h
Normal file
|
@ -0,0 +1,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
|
56
OGButton.m
Normal file
56
OGButton.m
Normal file
|
@ -0,0 +1,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
|
4
OGHBox.h
Normal file
4
OGHBox.h
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#import "OGBox.h"
|
||||||
|
|
||||||
|
@interface OGHBox: OGBox
|
||||||
|
@end
|
16
OGHBox.m
Normal file
16
OGHBox.m
Normal file
|
@ -0,0 +1,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
|
4
OGVBox.h
Normal file
4
OGVBox.h
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#import "OGBox.h"
|
||||||
|
|
||||||
|
@interface OGVBox: OGBox
|
||||||
|
@end
|
16
OGVBox.m
Normal file
16
OGVBox.m
Normal file
|
@ -0,0 +1,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
|
15
OGWidget.h
Normal file
15
OGWidget.h
Normal file
|
@ -0,0 +1,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*);
|
35
OGWidget.m
Normal file
35
OGWidget.m
Normal file
|
@ -0,0 +1,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
|
22
OGWindow.h
Normal file
22
OGWindow.h
Normal file
|
@ -0,0 +1,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
|
92
OGWindow.m
Normal file
92
OGWindow.m
Normal file
|
@ -0,0 +1,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
|
74
test.m
Normal file
74
test.m
Normal file
|
@ -0,0 +1,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
|
Reference in a new issue