Initial OGComboBox implementation.
Only support for text so far.
This commit is contained in:
parent
73e7da5fb7
commit
45380da631
5 changed files with 148 additions and 1 deletions
78
gtk/OGComboBox.m
Normal file
78
gtk/OGComboBox.m
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
#import "OGComboBox.h"
|
||||||
|
|
||||||
|
@interface OGComboBox ()
|
||||||
|
- (void)OG_changed;
|
||||||
|
@end
|
||||||
|
|
||||||
|
static void
|
||||||
|
changed(GtkWidget *widget, gpointer data)
|
||||||
|
{
|
||||||
|
[(OGComboBox*)data OG_changed];
|
||||||
|
}
|
||||||
|
|
||||||
|
@implementation OGComboBox
|
||||||
|
@synthesize delegate;
|
||||||
|
|
||||||
|
+ comboBox
|
||||||
|
{
|
||||||
|
return [[[self alloc] init] autorelease];
|
||||||
|
}
|
||||||
|
|
||||||
|
- init
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
|
||||||
|
widget = gtk_combo_box_new();
|
||||||
|
GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
|
||||||
|
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget), renderer, FALSE);
|
||||||
|
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(widget), renderer,
|
||||||
|
"text", 0, NULL);
|
||||||
|
g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK(changed),
|
||||||
|
self);
|
||||||
|
|
||||||
|
g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(og_destroy),
|
||||||
|
self);
|
||||||
|
[self retain];
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id <OGComboBoxDataSource>)dataSource
|
||||||
|
{
|
||||||
|
return dataSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setDataSource: (id <OGComboBoxDataSource>)dataSource_
|
||||||
|
{
|
||||||
|
GtkListStore *listStore = gtk_list_store_new(1, G_TYPE_STRING);
|
||||||
|
GtkTreeIter iter;
|
||||||
|
OGComboBoxItem* (*itemAtIndex)(id, SEL, OGComboBox*, size_t);
|
||||||
|
|
||||||
|
dataSource = dataSource_;
|
||||||
|
itemAtIndex = (OGComboBoxItem*(*)(id, SEL, OGComboBox*, size_t))
|
||||||
|
[dataSource methodForSelector: @selector(comboBox:itemAtIndex:)];
|
||||||
|
|
||||||
|
size_t i, size = [dataSource numberOfItemsInComboBox: self];
|
||||||
|
for (i = 0; i < size; i++) {
|
||||||
|
OGComboBoxItem *item = itemAtIndex(dataSource,
|
||||||
|
@selector(comboBox:itemAtIndex:), self, i);
|
||||||
|
|
||||||
|
gtk_list_store_append(listStore, &iter);
|
||||||
|
gtk_list_store_set(listStore, &iter, 0,
|
||||||
|
[item.label UTF8String], -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_combo_box_set_model(GTK_COMBO_BOX(widget),
|
||||||
|
GTK_TREE_MODEL(listStore));
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)OG_changed
|
||||||
|
{
|
||||||
|
OFAutoreleasePool *pool = [OFAutoreleasePool new];
|
||||||
|
|
||||||
|
if ([delegate respondsToSelector: @selector(comboBoxWasChanged:)])
|
||||||
|
[delegate comboBoxWasChanged: self];
|
||||||
|
|
||||||
|
[pool release];
|
||||||
|
}
|
||||||
|
@end
|
31
gtk/OGComboBoxItem.m
Normal file
31
gtk/OGComboBoxItem.m
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#import "OGComboBoxItem.h"
|
||||||
|
|
||||||
|
@implementation OGComboBoxItem
|
||||||
|
@synthesize label;
|
||||||
|
|
||||||
|
+ comboBoxItemWithLabel: (OFString*)label
|
||||||
|
{
|
||||||
|
return [[[self alloc] initWithLabel: label] autorelease];
|
||||||
|
}
|
||||||
|
|
||||||
|
- initWithLabel: (OFString*)label_
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
|
||||||
|
@try {
|
||||||
|
label = [label_ copy];
|
||||||
|
} @catch (id e) {
|
||||||
|
[self release];
|
||||||
|
@throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)dealloc
|
||||||
|
{
|
||||||
|
[label release];
|
||||||
|
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
@end
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
@interface OGBox: OGWidget
|
@interface OGBox: OGWidget
|
||||||
+ box;
|
+ box;
|
||||||
|
|
||||||
- (void)appendChild: (OGWidget*)child
|
- (void)appendChild: (OGWidget*)child
|
||||||
expand: (BOOL)expand
|
expand: (BOOL)expand
|
||||||
fill: (BOOL)fill
|
fill: (BOOL)fill
|
||||||
|
|
27
headers/OGComboBox.h
Normal file
27
headers/OGComboBox.h
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
#import "OGWidget.h"
|
||||||
|
#import "OGComboBoxItem.h"
|
||||||
|
|
||||||
|
@class OGComboBox;
|
||||||
|
|
||||||
|
@protocol OGComboBoxDelegate <OFObject>
|
||||||
|
@optional
|
||||||
|
- (void)comboBoxWasChanged: (OGComboBox*)comboBox;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@protocol OGComboBoxDataSource <OFObject>
|
||||||
|
- (size_t)numberOfItemsInComboBox: (OGComboBox*)comboBox;
|
||||||
|
- (OGComboBoxItem*)comboBox: (OGComboBox*)comboBox
|
||||||
|
itemAtIndex: (size_t)index;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface OGComboBox: OGWidget
|
||||||
|
{
|
||||||
|
id <OGComboBoxDelegate> delegate;
|
||||||
|
id <OGComboBoxDataSource> dataSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (assign) id <OGComboBoxDelegate> delegate;
|
||||||
|
@property (assign) id <OGComboBoxDataSource> dataSource;
|
||||||
|
|
||||||
|
+ comboBox;
|
||||||
|
@end
|
12
headers/OGComboBoxItem.h
Normal file
12
headers/OGComboBoxItem.h
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#import <ObjFW/OFString.h>
|
||||||
|
|
||||||
|
@interface OGComboBoxItem: OFObject
|
||||||
|
{
|
||||||
|
OFString *label;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (copy) OFString *label;
|
||||||
|
|
||||||
|
+ comboBoxItemWithLabel: (OFString*)label;
|
||||||
|
- initWithLabel: (OFString*)label;
|
||||||
|
@end
|
Reference in a new issue