diff options
| author | trustable-code <krauter.simon@arcor.de> | 2017-09-20 20:35:42 +0200 |
|---|---|---|
| committer | trustable-code <krauter.simon@arcor.de> | 2017-09-20 20:35:42 +0200 |
| commit | 17c5e0b4024c5741d22257e706f2af2efb7595ad (patch) | |
| tree | b400d9b4c33accc5dc7d6fd3c061f63f13b3147c /src | |
| parent | dc62b597a99b8bc1866400366a340347b8fc12b9 (diff) | |
| download | NiGui-17c5e0b4024c5741d22257e706f2af2efb7595ad.tar.gz NiGui-17c5e0b4024c5741d22257e706f2af2efb7595ad.zip | |
Dispose, CloseClick, Minimize
* Changed "Dispose" events
* Added "CloseClick" event
* Added "Window.minimize()" and "Window.minimized"
Use "Window.show()" to unminimize the window.
Diffstat (limited to 'src')
| -rwxr-xr-x | src/nigui.nim | 93 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/gtk3.nim | 21 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/platform_impl.nim | 15 | ||||
| -rwxr-xr-x | src/nigui/private/windows/platform_impl.nim | 18 | ||||
| -rwxr-xr-x | src/nigui/private/windows/windows.nim | 5 |
5 files changed, 116 insertions, 36 deletions
diff --git a/src/nigui.nim b/src/nigui.nim index 087c139..163a1d2 100755 --- a/src/nigui.nim +++ b/src/nigui.nim @@ -146,12 +146,14 @@ type fDisposed: bool fTitle: string fVisible: bool + fMinimized: bool fWidth, fHeight: int fClientWidth, fClientHeight: int fX, fY: int fControl: Control fIconPath: string fOnDispose: WindowDisposeProc + fOnCloseClick: CloseClickProc fOnResize: ResizeProc fOnDropFiles: DropFilesProc fOnKeyDown: WindowKeyProc @@ -210,9 +212,12 @@ type WindowDisposeEvent* = ref object window*: Window - cancel*: bool WindowDisposeProc* = proc(event: WindowDisposeEvent) + CloseClickEvent* = ref object + window*: Window + CloseClickProc* = proc(event: CloseClickEvent) + ResizeEvent* = ref object window*: Window ResizeProc* = proc(event: ResizeEvent) @@ -496,7 +501,7 @@ proc init*(window: WindowImpl) ## Only needed for own constructors. proc dispose*(window: var Window) -proc dispose*(window: Window) +method dispose*(window: Window) proc disposed*(window: Window): bool @@ -509,6 +514,11 @@ method showModal*(window: Window, parent: Window) method hide*(window: Window) +method minimized*(window: Window): bool +method `minimized=`*(window: Window, minimized: bool) + +method minimize*(window: Window) + method control*(window: Window): Control method `control=`*(window: Window, control: Control) @@ -538,7 +548,7 @@ method clientHeight*(window: Window): int method iconPath*(window: Window): string method `iconPath=`*(window: Window, iconPath: string) -method handleDisposeEvent*(window: Window, event: WindowDisposeEvent) +method closeClick*(window: Window) method handleResizeEvent*(window: Window, event: ResizeEvent) @@ -549,6 +559,9 @@ method handleDropFilesEvent*(window: Window, event: DropFilesEvent) method onDispose*(window: Window): WindowDisposeProc method `onDispose=`*(window: Window, callback: WindowDisposeProc) +method onCloseClick*(window: Window): CloseClickProc +method `onCloseClick=`*(window: Window, callback: CloseClickProc) + method onResize*(window: Window): ResizeProc method `onResize=`*(window: Window, callback: ResizeProc) @@ -569,7 +582,7 @@ proc init*(control: Control) proc init*(control: ControlImpl) proc dispose*(control: var Control) -proc dispose*(control: Control) +method dispose*(control: Control) proc disposed*(control: Control): bool @@ -678,8 +691,6 @@ method forceRedraw*(control: Control) method canvas*(control: Control): Canvas -method handleDisposeEvent*(control: Control, event: ControlDisposeEvent) - method handleDrawEvent*(control: Control, event: DrawEvent) method handleMouseButtonDownEvent*(control: Control, event: MouseButtonEvent) @@ -1155,32 +1166,28 @@ proc init(window: Window) = windowList.add(window) window.triggerRelayout() - method destroy(window: Window) = if window.fControl != nil: - window.fControl.destroy() + window.fControl.dispose() # should be extended by WindowImpl -proc disposeInner(window: Window): bool = - var event = new WindowDisposeEvent - event.window = window - window.handleDisposeEvent(event) - if event.cancel: - return false +proc dispose(window: var Window) = + let w = window + w.dispose() # force calling "dispose(window: Window)" instead of itself + window = nil + +method dispose(window: Window) = + let callback = window.onDispose + if callback != nil: + var event = new WindowDisposeEvent + event.window = window + callback(event) window.destroy() let i = windowList.find(window) windowList.delete(i) if quitOnLastWindowClose and windowList.len == 0: quit() window.fDisposed = true - return true - -proc dispose(window: var Window) = - if window.disposeInner(): - window = nil - -proc dispose(window: Window) = - discard window.disposeInner() proc disposed(window: Window): bool = window == nil or window.fDisposed @@ -1204,8 +1211,11 @@ method visible(window: Window): bool = window.fVisible method `visible=`(window: Window, visible: bool) = window.fVisible = visible + if visible: + window.fMinimized = false if window.x == -1 or window.y == -1: window.centerOnScreen() + # should be extended by WindowImpl method show(window: Window) = window.visible = true @@ -1215,6 +1225,18 @@ method showModal(window: Window, parent: Window) = method hide(window: Window) = window.visible = false +method minimized(window: Window): bool = window.fMinimized + +method `minimized=`(window: Window, minimized: bool) = + if minimized: + window.minimize() + else: + window.show() + +method minimize(window: Window) = + window.fMinimized = true + # should be extended by WindowImpl + method x(window: Window): int = window.fX method `x=`(window: Window, x: int) = @@ -1266,11 +1288,15 @@ method `iconPath=`(window: Window, iconPath: string) = window.fIconPath = iconPath # should be extended by WindowImpl -method handleDisposeEvent(window: Window, event: WindowDisposeEvent) = +method closeClick(window: Window) = # can be overriden by custom window - let callback = window.onDispose + let callback = window.onCloseClick if callback != nil: + var event = new CloseClickEvent + event.window = window callback(event) + else: + window.dispose() # default action method handleResizeEvent(window: Window, event: ResizeEvent) = # can be overriden by custom window @@ -1293,6 +1319,9 @@ method handleKeyDownEvent(window: Window, event: WindowKeyEvent) = method onDispose(window: Window): WindowDisposeProc = window.fOnDispose method `onDispose=`(window: Window, callback: WindowDisposeProc) = window.fOnDispose = callback +method onCloseClick(window: Window): CloseClickProc = window.fOnCloseClick +method `onCloseClick=`(window: Window, callback: CloseClickProc) = window.fOnCloseClick = callback + method onResize(window: Window): ResizeProc = window.fOnResize method `onResize=`(window: Window, callback: ResizeProc) = window.fOnResize = callback @@ -1332,10 +1361,16 @@ method destroy(control: Control) = # should be extended by WindowImpl proc dispose(control: var Control) = - control.destroy() + let c = control + c.dispose() # force calling "dispose(control: Control)" instead of itself control = nil -proc dispose(control: Control) = +method dispose(control: Control) = + let callback = control.onDispose + if callback != nil: + var event = new ControlDisposeEvent + event.control = control + callback(event) control.destroy() control.fDisposed = true @@ -1626,12 +1661,6 @@ method forceRedraw(control: Control) = method canvas(control: Control): Canvas = control.fCanvas -method handleDisposeEvent(control: Control, event: ControlDisposeEvent) = - # can be overriden by custom window - let callback = control.onDispose - if callback != nil: - callback(event) - method handleDrawEvent(control: Control, event: DrawEvent) = # can be implemented by custom control let callback = control.onDraw diff --git a/src/nigui/private/gtk3/gtk3.nim b/src/nigui/private/gtk3/gtk3.nim index 3e83f62..f9c666f 100755 --- a/src/nigui/private/gtk3/gtk3.nim +++ b/src/nigui/private/gtk3/gtk3.nim @@ -74,6 +74,13 @@ type group*: int8 is_modifier*: int8 + GdkEventWindowState* {.byCopy.} = object + event_type*: cint + window*: pointer + send_event*: int8 + changed_mask*: cint + new_window_state*: cint + GtkTextIter* {.byCopy.} = object dummy1: pointer dummy2: pointer @@ -186,6 +193,17 @@ const # Key modifier masks: GDK_CONTROL_MASK* = 1 shl 2 + # GdkWindowState: + GDK_WINDOW_STATE_WITHDRAWN* = 1 + GDK_WINDOW_STATE_ICONIFIED* = 2 + GDK_WINDOW_STATE_MAXIMIZED* = 4 + GDK_WINDOW_STATE_STICKY* = 8 + GDK_WINDOW_STATE_FULLSCREEN* = 16 + GDK_WINDOW_STATE_ABOVE* = 32 + GDK_WINDOW_STATE_BELOW* = 64 + GDK_WINDOW_STATE_FOCUSED* = 128 + GDK_WINDOW_STATE_TILED* = 256 + # ---------------------------------------------------------------------------------------- # General Gtk Procs @@ -216,6 +234,9 @@ proc gtk_window_get_size*(window: pointer, width, height: var cint) {.importc: " 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_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.} proc gdk_window_begin_paint_rect*(window: pointer, rectangle: var GdkRectangle) {.importc: "gdk_window_begin_paint_rect", libgtk3.} proc gdk_window_begin_paint_region*(window: pointer, region: pointer) {.importc: "gdk_window_begin_paint_region", libgtk3.} diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim index ec8a2da..ac4bf2d 100755 --- a/src/nigui/private/gtk3/platform_impl.nim +++ b/src/nigui/private/gtk3/platform_impl.nim @@ -42,7 +42,7 @@ proc pGdkRGBAToColor(rgba: var GdkRGBA): Color = proc pWindowDeleteSignal(widgetHandle, event, data: pointer): bool {.cdecl.} = let window = cast[WindowImpl](data) - window.dispose() + window.closeClick() return true proc pWindowConfigureSignal(windowHandle, event, data: pointer): bool {.cdecl.} = @@ -580,6 +580,10 @@ proc pMainScrollbarDraw(widget: pointer, cr: pointer, data: pointer): bool {.cde gtk_scrolled_window_set_policy(widget, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC) fScrollbarSize = allocation.height +proc pWindowStateEventSignal(widget: pointer, event: var GdkEventWindowState, user_data: pointer): bool {.cdecl.} = + let window = cast[WindowImpl](user_data) + window.fMinimized = (event.new_window_state and GDK_WINDOW_STATE_ICONIFIED) == GDK_WINDOW_STATE_ICONIFIED + proc init(window: WindowImpl) = if pClipboardPtr == nil: gtk_init(nil, nil) @@ -592,6 +596,7 @@ proc init(window: WindowImpl) = discard g_signal_connect_data(window.fHandle, "delete-event", pWindowDeleteSignal, cast[pointer](window)) discard g_signal_connect_data(window.fHandle, "configure-event", pWindowConfigureSignal, cast[pointer](window)) discard g_signal_connect_data(window.fHandle, "key-press-event", pWindowKeyPressSignal, cast[pointer](window)) + discard g_signal_connect_data(window.fHandle, "window-state-event", pWindowStateEventSignal, cast[pointer](window)) # Enable drag and drop of files: pSetDragDest(window.fHandle) @@ -610,7 +615,9 @@ method destroy(window: WindowImpl) = method `visible=`(window: WindowImpl, visible: bool) = procCall window.Window.`visible=`(visible) if visible: - gtk_widget_show(window.fHandle) + # gtk_window_deiconify(window.fHandle) + # gtk_widget_show(window.fHandle) + gtk_window_present(window.fHandle) while fScrollbarSize == -1: discard gtk_main_iteration() else: @@ -622,6 +629,10 @@ method showModal(window, parent: WindowImpl) = gtk_window_set_transient_for(window.fHandle, parent.fHandle) window.visible = true +method minimize(window: WindowImpl) = + procCall window.Window.minimize() + gtk_window_iconify(window.fHandle) + method `width=`*(window: WindowImpl, width: int) = procCall window.Window.`width=`(width) gtk_window_resize(window.fHandle, window.width.cint, window.height.cint) diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim index a07af81..e59f120 100755 --- a/src/nigui/private/windows/platform_impl.nim +++ b/src/nigui/private/windows/platform_impl.nim @@ -258,7 +258,7 @@ proc pWindowWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): pointe case uMsg of WM_CLOSE: let window = cast[WindowImpl](pGetWindowLongPtr(hWnd, GWLP_USERDATA)) - window.dispose() + window.closeClick() return cast[pointer](true) # keeps the window open, else the window will be destroyed of WM_SIZE: let window = cast[WindowImpl](pGetWindowLongPtr(hWnd, GWLP_USERDATA)) @@ -303,6 +303,15 @@ proc pWindowWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): pointe let window = cast[Window](pGetWindowLongPtr(hWnd, GWLP_USERDATA)) if window != nil and pHandleWMCHAR(window, nil, wParam, lParam): return + of WM_SYSCOMMAND: + let window = cast[Window](pGetWindowLongPtr(hWnd, GWLP_USERDATA)) + if window != nil: + if cast[int](wParam) == SC_MINIMIZE: + window.fMinimized = true + echo "a" + elif cast[int](wParam) == SC_RESTORE: + window.fMinimized = false + echo "b" else: discard result = pCommonWndProc(hWnd, uMsg, wParam, lParam) @@ -715,7 +724,8 @@ method destroy(window: WindowImpl) = method `visible=`(window: WindowImpl, visible: bool) = procCall window.Window.`visible=`(visible) if visible: - pShowWindow(window.fHandle, SW_SHOW) + # pShowWindow(window.fHandle, SW_SHOW) + pShowWindow(window.fHandle, SW_RESTORE) else: pShowWindow(window.fHandle, SW_HIDE) @@ -731,6 +741,10 @@ method showModal(window, parent: WindowImpl) = window.visible = true discard EnableWindow(parent.fHandle, false) +method minimize(window: WindowImpl) = + procCall window.Window.minimize() + pShowWindow(window.fHandle, SW_MINIMIZE) + proc pUpdatePosition(window: WindowImpl) = pSetWindowPos(window.fHandle, window.x, window.y, -1, -1, SWP_NOSIZE) # discard MoveWindow(window.fHandle, window.x.int32, window.y.int32, window.width.int32, window.height.int32, false) diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim index 536d345..cc70dc1 100755 --- a/src/nigui/private/windows/windows.nim +++ b/src/nigui/private/windows/windows.nim @@ -75,13 +75,18 @@ const SB_LINERIGHT* = 1 SB_PAGELEFT* = 2 SB_PAGERIGHT* = 3 + SC_MINIMIZE* = 0xF020 + SC_RESTORE* = 0xF120 SIF_ALL* = 23 SM_CXVSCROLL* = 2 SPI_GETWORKAREA* = 0x0030 SPI_SETKEYBOARDCUES* = 0x100B SS_CENTERIMAGE* = 0x00000200 SW_HIDE* = 0 + SW_MAXIMIZE = 3 SW_SHOW* = 5 + SW_MINIMIZE* = 6 + SW_RESTORE* = 9 SWP_NOMOVE* = 2 SWP_NOSIZE* = 1 VK_CONTROL* = 17 |
