diff options
| -rwxr-xr-x | src/nigui.nim | 16 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/gtk3.nim | 2 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/platform_impl.nim | 8 | ||||
| -rwxr-xr-x | src/nigui/private/windows/platform_impl.nim | 42 |
4 files changed, 44 insertions, 24 deletions
diff --git a/src/nigui.nim b/src/nigui.nim index 3810446..0ddc2a8 100755 --- a/src/nigui.nim +++ b/src/nigui.nim @@ -894,7 +894,7 @@ method `wrap=`*(textArea: TextArea, wrap: bool) # Private Procedures Predeclaration # ---------------------------------------------------------------------------------------- -proc raiseError(msg: string, showAlert = true, title = "NiGui Error") +proc raiseError(msg: string) proc handleException() @@ -958,14 +958,20 @@ var # Global/App Procedures # ---------------------------------------------------------------------------------------- -proc raiseError(msg: string, showAlert = true, title = "NiGui Error") = - if showAlert: - alert(nil, msg & "\p\p" & getStackTrace(), title) +proc raiseError(msg: string) = raise newException(Exception, msg) +proc defaultExceptionHandler() = + let msg = getCurrentExceptionMsg() & "\p\p" & getStackTrace() + alert(nil, msg, "Error") + echo "Error: unhandled exception: ", msg + quit() + proc handleException() = + ## Handle an exception raised in runMainLoop(). + ## This is called directly from the Gtk part. if fErrorHandler == nil: - raiseError(getCurrentExceptionMsg(), true, "Unhandled Exception") + defaultExceptionHandler() else: fErrorHandler() diff --git a/src/nigui/private/gtk3/gtk3.nim b/src/nigui/private/gtk3/gtk3.nim index e23c941..d7d9a1c 100755 --- a/src/nigui/private/gtk3/gtk3.nim +++ b/src/nigui/private/gtk3/gtk3.nim @@ -240,7 +240,7 @@ proc gtk_window_resize_to_geometry*(window: pointer, width, height: cint) {.impo proc gtk_window_get_size*(window: pointer, width, height: var cint) {.importc: "gtk_window_get_size", libgtk3.} proc gtk_window_get_position*(window: pointer, x, y: var cint) {.importc: "gtk_window_get_position", libgtk3.} proc gtk_window_move*(window: pointer, x, y: cint) {.importc: "gtk_window_move", libgtk3.} -proc gtk_window_set_icon_from_file*(window: pointer, filename: cstring, err: pointer) {.importc: "gtk_window_set_icon_from_file", libgtk3.} +proc gtk_window_set_icon_from_file*(window: pointer, filename: cstring, err: pointer): bool {.importc: "gtk_window_set_icon_from_file", libgtk3.} proc gtk_window_iconify*(window: pointer) {.importc: "gtk_window_iconify", libgtk3.} proc gtk_window_deiconify*(window: pointer) {.importc: "gtk_window_deiconify", libgtk3.} proc gtk_window_present*(window: pointer) {.importc: "gtk_window_present", libgtk3.} diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim index e8a2649..4014047 100755 --- a/src/nigui/private/gtk3/platform_impl.nim +++ b/src/nigui/private/gtk3/platform_impl.nim @@ -27,7 +27,7 @@ var pClipboardTextIsSet: bool proc pRaiseGError(error: ptr GError) = if error == nil: raiseError("Unkown error") - raiseError($error.message, false) + raiseError($error.message) proc pColorToGdkRGBA(color: Color, rgba: var GdkRGBA) = rgba.red = color.red.float / 255 @@ -811,7 +811,11 @@ method `control=`(window: WindowImpl, control: Control) = method `iconPath=`(window: WindowImpl, iconPath: string) = procCall window.Window.`iconPath=`(iconPath) - gtk_window_set_icon_from_file(window.fHandle, iconPath, nil) + if not gtk_window_set_icon_from_file(window.fHandle, iconPath, nil): + if not fileExists(iconPath): + raiseError("Faild to load image from file '" & iconPath & "': File does not exist") + else: + raiseError("Faild to load image from file '" & iconPath & "'") # ---------------------------------------------------------------------------------------- diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim index e9b8e22..dce331c 100755 --- a/src/nigui/private/windows/platform_impl.nim +++ b/src/nigui/private/windows/platform_impl.nim @@ -27,16 +27,9 @@ var pLastMouseButtonDownControl: Control var pLastMouseButtonDownControlX: int var pLastMouseButtonDownControlY: int -proc pRaiseLastOSError(showAlert = true) = +proc pRaiseLastOSError() = let e = osLastError() - raiseError(strutils.strip(osErrorMsg(e)) & " (OS Error Code: " & $e & ")", showAlert) - -proc pCheckGdiplusStatus(status: int32, showAlert = true) = - if status != 0: - if status == 7: - pRaiseLastOSError(showAlert) - else: - raiseError("A GDI+ error occured. (Status: " & $status & ")", showAlert) + raiseError(strutils.strip(osErrorMsg(e)) & " (OS Error Code: " & $e & ")") proc pColorToRGB32(color: Color): RGB32 = result.red = color.red @@ -352,12 +345,29 @@ proc pContainerWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): poi proc pCustomControlWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): pointer {.cdecl.} +proc pCheckGdiplusStatus(status: int32, msg = "") = + if status != 0: + if status == 7: + pRaiseLastOSError() + elif msg != "": + raiseError(msg & " (GDI+ Status: " & $status & ")") + else: + raiseError("A GDI+ error occured. (GDI+ Status: " & $status & ")") + proc pInitGdiplus() = var input: GdiplusStartupInput input.GdiplusVersion = 1 var gidplus: pointer = nil pCheckGdiplusStatus(GdiplusStartup(gidplus, input, nil)) +proc pGdipCreateBitmapFromFileWrapped(filename: string, bitmap: var pointer) = + let status = GdipCreateBitmapFromFile(filename.pUtf8ToUtf16(), bitmap) + if status != 0: + if not fileExists(filename): + raiseError("Faild to load image from file '" & filename & "': File does not exist") + else: + pCheckGdiplusStatus(status, "Faild to load image from file '" & filename & "'") + proc pGetTextSize(hDC, font: pointer, text: string): Size = let wideText = text.pUtf8ToUtf16 discard SelectObject(hdc, font) @@ -736,7 +746,7 @@ method getTextLineHeight(canvas: CanvasImpl): int = canvas.pGetTextSize("a").cy method resize(image: Image, width, height: int) = let canvas = cast[CanvasImpl](image.canvas) if canvas.fBitmap != nil: - pCheckGdiplusStatus(GdipDisposeImage(canvas.fBitmap), false) + pCheckGdiplusStatus(GdipDisposeImage(canvas.fBitmap)) pCheckGdiplusStatus(GdipDeleteGraphics(canvas.fGraphics)) canvas.fBitmap = nil canvas.fGraphics = nil @@ -750,13 +760,13 @@ method resize(image: Image, width, height: int) = method loadFromFile(image: Image, filePath: string) = let canvas = cast[CanvasImpl](image.canvas) if canvas.fBitmap != nil: - pCheckGdiplusStatus(GdipDisposeImage(canvas.fBitmap), false) + pCheckGdiplusStatus(GdipDisposeImage(canvas.fBitmap)) pCheckGdiplusStatus(GdipDeleteGraphics(canvas.fGraphics)) canvas.fBitmap = nil canvas.fGraphics = nil image.canvas.fWidth = 0 image.canvas.fHeight = 0 - pCheckGdiplusStatus(GdipCreateBitmapFromFile(filePath.pUtf8ToUtf16(), canvas.fBitmap), false) + pGdipCreateBitmapFromFileWrapped(filePath, canvas.fBitmap) pCheckGdiplusStatus(GdipGetImageGraphicsContext(canvas.fBitmap, canvas.fGraphics)) var width, height: int32 pCheckGdiplusStatus(GdipGetImageWidth(canvas.fBitmap, width)) @@ -771,7 +781,7 @@ method saveToBitmapFile(image: Image, filePath: string) = clsidEncoder.Data2 = 0x11d31a04 clsidEncoder.Data3 = 0x0000739a clsidEncoder.Data4 = 0x2ef31ef8 - pCheckGdiplusStatus(GdipSaveImageToFile(canvas.fBitmap, filePath.pUtf8ToUtf16(), clsidEncoder.addr, nil), false) + pCheckGdiplusStatus(GdipSaveImageToFile(canvas.fBitmap, filePath.pUtf8ToUtf16(), clsidEncoder.addr, nil)) method saveToPngFile(image: Image, filePath: string) = let canvas = cast[CanvasImpl](image.canvas) @@ -780,7 +790,7 @@ method saveToPngFile(image: Image, filePath: string) = clsidEncoder.Data2 = 0x11d31a04 clsidEncoder.Data3 = 0x0000739a clsidEncoder.Data4 = 0x2ef31ef8 - pCheckGdiplusStatus(GdipSaveImageToFile(canvas.fBitmap, filePath.pUtf8ToUtf16(), clsidEncoder.addr, nil), false) + pCheckGdiplusStatus(GdipSaveImageToFile(canvas.fBitmap, filePath.pUtf8ToUtf16(), clsidEncoder.addr, nil)) method saveToJpegFile(image: Image, filePath: string, quality = 80) = let canvas = cast[CanvasImpl](image.canvas) @@ -790,7 +800,7 @@ method saveToJpegFile(image: Image, filePath: string, quality = 80) = clsidEncoder.Data3 = 0x0000739a clsidEncoder.Data4 = 0x2ef31ef8 # TODO: pass quality - pCheckGdiplusStatus(GdipSaveImageToFile(canvas.fBitmap, filePath.pUtf8ToUtf16(), clsidEncoder.addr, nil), false) + pCheckGdiplusStatus(GdipSaveImageToFile(canvas.fBitmap, filePath.pUtf8ToUtf16(), clsidEncoder.addr, nil)) method beginPixelDataAccess(image: Image): ptr UncheckedArray[byte] = let imageImpl = cast[ImageImpl](image) @@ -909,7 +919,7 @@ method `control=`(window: WindowImpl, control: Control) = method `iconPath=`(window: WindowImpl, iconPath: string) = procCall window.Window.`iconPath=`(iconPath) var bitmap: pointer - pCheckGdiplusStatus(GdipCreateBitmapFromFile(iconPath.pUtf8ToUtf16(), bitmap)) + pGdipCreateBitmapFromFileWrapped(iconPath, bitmap) var icon: pointer pCheckGdiplusStatus(GdipGetHicon(bitmap, icon)) discard SendMessageA(window.fHandle, WM_SETICON, cast[pointer](ICON_BIG), icon) |
