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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
#if defined(Hiro_TabFrame)
@implementation CocoaTabFrame : NSTabView
-(id) initWith:(hiro::mTabFrame&)tabFrameReference {
if(self = [super initWithFrame:NSMakeRect(0, 0, 0, 0)]) {
tabFrame = &tabFrameReference;
[self setDelegate:self];
}
return self;
}
-(void) tabView:(NSTabView*)tabView didSelectTabViewItem:(NSTabViewItem*)tabViewItem {
tabFrame->self()->_synchronizeSizable();
tabFrame->doChange();
}
@end
@implementation CocoaTabFrameItem : NSTabViewItem
-(id) initWith:(hiro::mTabFrame&)tabFrameReference {
if(self = [super initWithIdentifier:nil]) {
tabFrame = &tabFrameReference;
cocoaTabFrame = tabFrame->self()->cocoaTabFrame;
}
return self;
}
-(NSSize) sizeOfLabel:(BOOL)shouldTruncateLabel {
NSSize sizeOfLabel = [super sizeOfLabel:shouldTruncateLabel];
s32 selection = [cocoaTabFrame indexOfTabViewItem:self];
if(selection >= 0) {
if(auto item = tabFrame->item(selection)) {
if(item->state.icon) {
u32 iconSize = hiro::pFont::size(tabFrame->font(true), " ").height();
sizeOfLabel.width += iconSize + 2;
}
}
}
return sizeOfLabel;
}
-(void) drawLabel:(BOOL)shouldTruncateLabel inRect:(NSRect)tabRect {
s32 selection = [cocoaTabFrame indexOfTabViewItem:self];
if(selection >= 0) {
if(auto item = tabFrame->item(selection)) {
if(item->state.icon) {
u32 iconSize = hiro::pFont::size(tabFrame->font(true), " ").height();
NSImage* image = NSMakeImage(item->state.icon);
[[NSGraphicsContext currentContext] saveGraphicsState];
NSRect targetRect = NSMakeRect(tabRect.origin.x, tabRect.origin.y + 2, iconSize, iconSize);
[image drawInRect:targetRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:YES hints:nil];
[[NSGraphicsContext currentContext] restoreGraphicsState];
tabRect.origin.x += iconSize + 2;
tabRect.size.width -= iconSize + 2;
}
}
}
[super drawLabel:shouldTruncateLabel inRect:tabRect];
}
@end
namespace hiro {
auto pTabFrame::construct() -> void {
cocoaView = cocoaTabFrame = [[CocoaTabFrame alloc] initWith:self()];
pWidget::construct();
setNavigation(state().navigation);
}
auto pTabFrame::destruct() -> void {
[cocoaView removeFromSuperview];
}
auto pTabFrame::append(sTabFrameItem item) -> void {
if(auto p = item->self()) {
p->cocoaTabFrameItem = [[CocoaTabFrameItem alloc] initWith:self()];
[p->cocoaTabFrameItem setLabel:[NSString stringWithUTF8String:item->state.text]];
[(CocoaTabFrame*)cocoaView addTabViewItem:p->cocoaTabFrameItem];
}
}
auto pTabFrame::remove(sTabFrameItem item) -> void {
if(auto p = item->self()) {
[(CocoaTabFrame*)cocoaView removeTabViewItem:p->cocoaTabFrameItem];
}
}
auto pTabFrame::setEnabled(bool enabled) -> void {
pWidget::setEnabled(enabled);
for(auto& item : state().items) {
if(auto& sizable = item->state.sizable) {
if(auto self = sizable->self()) self->setEnabled(sizable->enabled(true));
}
}
}
auto pTabFrame::setFont(const Font& font) -> void {
pWidget::setFont(font);
for(auto& item : state().items) {
if(auto& sizable = item->state.sizable) {
if(auto self = sizable->self()) self->setFont(sizable->font(true));
}
}
}
auto pTabFrame::setGeometry(Geometry geometry) -> void {
pWidget::setGeometry({
geometry.x() - 7, geometry.y() - 5,
geometry.width() + 14, geometry.height() + 6
});
geometry.setGeometry({
geometry.x() + 1, geometry.y() + 22,
geometry.width() - 2, geometry.height() - 32
});
for(auto& item : state().items) {
if(auto& sizable = item->state.sizable) {
sizable->setGeometry(geometry);
}
}
_synchronizeSizable();
}
auto pTabFrame::setNavigation(Navigation navigation) -> void {
}
auto pTabFrame::setVisible(bool visible) -> void {
pWidget::setVisible(visible);
for(auto& item : state().items) {
if(auto& sizable = item->state.sizable) {
if(auto self = sizable->self()) self->setVisible(sizable->visible(true));
}
}
}
auto pTabFrame::_synchronizeSizable() -> void {
NSTabViewItem* tabViewItem = [(CocoaTabFrame*)cocoaView selectedTabViewItem];
s32 selected = tabViewItem ? [(CocoaTabFrame*)cocoaView indexOfTabViewItem:tabViewItem] : -1;
for(auto& item : state().items) {
item->state.selected = item->offset() == selected;
if(auto& sizable = item->state.sizable) sizable->setVisible(item->selected());
}
}
}
#endif
|