combo-button.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #if defined(Hiro_ComboButton)
  2. @implementation CocoaComboButton : NSPopUpButton
  3. -(id) initWith:(hiro::mComboButton&)comboButtonReference {
  4. if(self = [super initWithFrame:NSMakeRect(0, 0, 0, 0) pullsDown:NO]) {
  5. comboButton = &comboButtonReference;
  6. [self setTarget:self];
  7. [self setAction:@selector(activate:)];
  8. }
  9. return self;
  10. }
  11. -(IBAction) activate:(id)sender {
  12. if(auto p = comboButton->self()) p->_updateSelected([self indexOfSelectedItem]);
  13. comboButton->doChange();
  14. }
  15. @end
  16. namespace hiro {
  17. auto pComboButton::construct() -> void {
  18. @autoreleasepool {
  19. cocoaView = cocoaComboButton = [[CocoaComboButton alloc] initWith:self()];
  20. pWidget::construct();
  21. }
  22. }
  23. auto pComboButton::destruct() -> void {
  24. @autoreleasepool {
  25. [cocoaView removeFromSuperview];
  26. [cocoaView release];
  27. }
  28. }
  29. auto pComboButton::append(sComboButtonItem item) -> void {
  30. @autoreleasepool {
  31. [cocoaView addItemWithTitle:[NSString stringWithUTF8String:item->text()]];
  32. }
  33. }
  34. auto pComboButton::minimumSize() const -> Size {
  35. auto font = self().font(true);
  36. int maximumWidth = 0;
  37. for(auto& item : state().items) {
  38. maximumWidth = max(maximumWidth, pFont::size(font, item->state.text).width());
  39. }
  40. Size size = pFont::size(font, " ");
  41. return {maximumWidth + 36, size.height() + 6};
  42. }
  43. auto pComboButton::remove(sComboButtonItem item) -> void {
  44. @autoreleasepool {
  45. [cocoaView removeItemAtIndex:item->offset()];
  46. }
  47. }
  48. auto pComboButton::reset() -> void {
  49. @autoreleasepool {
  50. [cocoaView removeAllItems];
  51. }
  52. }
  53. auto pComboButton::setGeometry(Geometry geometry) -> void {
  54. pWidget::setGeometry({
  55. geometry.x() - 2, geometry.y(),
  56. geometry.width() + 4, geometry.height()
  57. });
  58. }
  59. auto pComboButton::_updateSelected(signed selected) -> void {
  60. for(auto& item : state().items) {
  61. item->state.selected = item->offset() == selected;
  62. }
  63. }
  64. }
  65. #endif