diff --git a/main.py b/main.py index 7770b8e..4ed2c10 100644 --- a/main.py +++ b/main.py @@ -24,65 +24,74 @@ from Foundation import NSObject, NSTimer, NSDate load_dotenv() +from PyObjCTools import AppHelper + class ItemSenseApp(NSObject): def applicationDidFinishLaunching_(self, notification): - print("Application did finish launching...") - self.window = NSWindow.alloc().initWithContentRect_styleMask_backing_defer_( - NSMakeRect(0, 0, 800, 700), - NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable | NSWindowStyleMaskMiniaturizable, - NSBackingStoreBuffered, - False - ) - self.window.setTitle_("ItemSense") - self.window.center() - - # Main content view (StackView for layout) - self.stack_view = NSStackView.alloc().init() - self.stack_view.setOrientation_(NSUserInterfaceLayoutOrientationVertical) - self.stack_view.setSpacing_(10) - self.stack_view.setEdgeInsets_((10, 10, 10, 10)) - self.window.setContentView_(self.stack_view) + try: + print("Application did finish launching...") + self.window = NSWindow.alloc().initWithContentRect_styleMask_backing_defer_( + NSMakeRect(0, 0, 800, 700), + NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable | NSWindowStyleMaskMiniaturizable, + NSBackingStoreBuffered, + False + ) + self.window.setTitle_("ItemSense") + self.window.center() + + # Main content view (StackView for layout) + self.stack_view = NSStackView.alloc().init() + self.stack_view.setOrientation_(NSUserInterfaceLayoutOrientationVertical) + self.stack_view.setSpacing_(10) + self.stack_view.setEdgeInsets_((10, 10, 10, 10)) + self.window.setContentView_(self.stack_view) - # Image View for Camera Feed - self.image_view = NSImageView.alloc().init() - self.image_view.setImageScaling_(0) # NSImageScaleProportionallyDown - # Add constraint for height logic later if needed, but stackview handles it well enough for basic - self.stack_view.addView_inGravity_(self.image_view, 1) # Top gravity + # Image View for Camera Feed + self.image_view = NSImageView.alloc().init() + self.image_view.setImageScaling_(0) # NSImageScaleProportionallyDown + self.stack_view.addView_inGravity_(self.image_view, 1) # Top gravity - # Result View (Scrollable Text) - self.scroll_view = NSScrollView.alloc().init() - self.scroll_view.setHasVerticalScroller_(True) - self.scroll_view.setBorderType_(2) # NSBezelBorder - self.scroll_view.setHeightAdjustLimit_(1.0) - - # Text View - content_size = self.scroll_view.contentSize() - self.text_view = NSTextView.alloc().initWithFrame_(NSMakeRect(0, 0, content_size.width, content_size.height)) - self.text_view.setMinSize_(NSMakeSize(0.0, content_size.height)) - self.text_view.setMaxSize_(NSMakeSize(float("inf"), float("inf"))) - self.text_view.setVerticallyResizable_(True) - self.text_view.setHorizontallyResizable_(False) - self.text_view.setAutoresizingMask_(18) # NSViewWidthSizable | NSViewHeightSizable - self.text_view.textContainer().setContainerSize_(NSMakeSize(content_size.width, float("inf"))) - self.text_view.textContainer().setWidthTracksTextView_(True) - self.text_view.setEditable_(False) - self.text_view.setRichText_(False) - - self.scroll_view.setDocumentView_(self.text_view) - self.stack_view.addView_inGravity_(self.scroll_view, 2) - - self.text_view.setString_("Initializing camera...") + # Result View (Scrollable Text) + self.scroll_view = NSScrollView.alloc().init() + self.scroll_view.setHasVerticalScroller_(True) + self.scroll_view.setBorderType_(2) # NSBezelBorder + + # Text View + content_size = self.scroll_view.contentSize() + self.text_view = NSTextView.alloc().initWithFrame_(NSMakeRect(0, 0, content_size.width, content_size.height)) + self.text_view.setMinSize_(NSMakeSize(0.0, content_size.height)) + self.text_view.setMaxSize_(NSMakeSize(float("inf"), float("inf"))) + self.text_view.setVerticallyResizable_(True) + self.text_view.setHorizontallyResizable_(False) + self.text_view.setAutoresizingMask_(18) # NSViewWidthSizable | NSViewHeightSizable + self.text_view.textContainer().setContainerSize_(NSMakeSize(content_size.width, float("inf"))) + self.text_view.textContainer().setWidthTracksTextView_(True) + self.text_view.setEditable_(False) + self.text_view.setRichText_(False) + + self.scroll_view.setDocumentView_(self.text_view) + self.stack_view.addView_inGravity_(self.scroll_view, 2) + + self.text_view.setString_("Initializing camera...") - # Capture Button - self.capture_button = NSButton.buttonWithTitle_target_action_("Capture", self, "captureClicked:") - self.stack_view.addView_inGravity_(self.capture_button, 3) # Bottom gravity + # Capture Button + self.capture_button = NSButton.buttonWithTitle_target_action_("Capture", self, "captureClicked:") + self.stack_view.addView_inGravity_(self.capture_button, 3) # Bottom gravity - self.window.makeKeyAndOrderFront_(None) - self.window.orderFrontRegardless() # Force it front - print("Window ordered front.") - - # Initialize Camera with a delay to allow UI to render first - self.performSelector_withObject_afterDelay_("initCamera:", None, 0.5) + self.window.makeKeyAndOrderFront_(None) + self.window.orderFrontRegardless() + print("Window ordered front.") + + # State + self.is_capturing = True + self.current_frame = None + + # Initialize Camera with a delay to allow UI to render first + self.performSelector_withObject_afterDelay_("initCamera:", None, 0.5) + except Exception as e: + import traceback + traceback.print_exc() + print(f"Error in applicationDidFinishLaunching: {e}") def initCamera_(self, sender): print("Initializing camera...") @@ -205,4 +214,4 @@ if __name__ == "__main__": # Allow time for policy to take effect? Usually acceptable immediately. app.activateIgnoringOtherApps_(True) - app.run() + AppHelper.runEventLoop()