Sun, 19 Oct 2025 21:20:08 +0200
update toolkit
/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2024 Olaf Wintermann. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #import "TabView.h" #import "BoxContainer.h" #import "GridLayout.h" @implementation UiTopTabView @synthesize container = _container; - (id)init:(UiObject*)obj args:(UiTabViewArgs*)args { self = [super init]; _obj = obj; _subcontainer = args->subcontainer; _padding = args->padding; _spacing = args->spacing; _columnspacing = args->columnspacing; _rowspacing = args->rowspacing; _onchange = args->onchange; _onchangedata = args->onchangedata; _var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); if(args->tabview == UI_TABVIEW_INVISIBLE || args->tabview == UI_TABVIEW_NAVIGATION_SIDE) { self.tabViewType = NSNoTabsNoBorder; } if(_var) { UiInteger *i = _var->value; i->obj = (__bridge void*)self; i->get = ui_nstabview_get; i->set = ui_nstabview_set; } return self; } - (void) addView:(NSView*)view layout:(UiLayout*)layout { // noop } - (NSView<Container>*) createTab:(int)index title:(NSString*)title { NSTabViewItem *item = [[NSTabViewItem alloc]initWithIdentifier:nil]; [item setLabel:title]; if(index < 0) { [self addTabViewItem:item]; } else { [self insertTabViewItem:item atIndex:index]; } BoxContainer *content = [[BoxContainer alloc]init]; item.view = content; GridLayout *sub; switch(_subcontainer) { default: sub = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationVertical spacing:_spacing]; break; case UI_CONTAINER_HBOX: sub = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationHorizontal spacing:_spacing]; break; case UI_CONTAINER_GRID: { sub = [[GridLayout alloc] init]; sub.columnspacing = _columnspacing; sub.rowspacing = _rowspacing; break; } } UiLayout layout = { .margin = _padding, .margin_left = _padding, .margin_right = _padding, .margin_top = _padding, .margin_bottom = _padding, .fill = TRUE }; [content addView:sub layout:&layout]; return sub; } - (void) selectTab:(int)index { [self selectTabViewItemAtIndex:index]; } - (void) removeTab:(int)index { NSTabViewItem *item = [self tabViewItemAtIndex:index]; if(item != nil) { [self removeTabViewItem:item]; } } - (UiObject*) addTab:(int)index title:(NSString*)title { NSView<Container> *sub = [self createTab:index title:title]; UiObject *newobj = uic_object_new_toplevel(); newobj->widget = (__bridge void*)sub; UiContainerX *container = ui_create_container(newobj, sub); uic_object_push_container(newobj, container); return newobj; } @end int64_t ui_nstabview_get(UiInteger *i) { UiTopTabView *tabview = (__bridge UiTopTabView*)i->obj; i->value = [tabview indexOfTabViewItem:tabview.selectedTabViewItem]; return i->value; } void ui_nstabview_set(UiInteger *i, int64_t value) { UiTopTabView *tabview = (__bridge UiTopTabView*)i->obj; [tabview selectTab:(int)value]; i->value = [tabview indexOfTabViewItem:tabview.selectedTabViewItem]; }