diff --git a/Nasal/canvas/gui/widgets/Button.nas b/Nasal/canvas/gui/widgets/Button.nas index 1d8b5f40e..ce70d27bd 100644 --- a/Nasal/canvas/gui/widgets/Button.nas +++ b/Nasal/canvas/gui/widgets/Button.nas @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: (C) 2016 Thomas Geymayer +# SPDX-FileCopyrightText: (C) 2022 James Turner +# SPDX-License-Identifier: GPL-2.0-or-later + gui.widgets.Button = { new: func(parent, style, cfg) { diff --git a/Nasal/canvas/gui/widgets/Dial.nas b/Nasal/canvas/gui/widgets/Dial.nas new file mode 100644 index 000000000..566277cfc --- /dev/null +++ b/Nasal/canvas/gui/widgets/Dial.nas @@ -0,0 +1,61 @@ +# SPDX-FileCopyrightText: (C) 2022 James Turner +# SPDX-License-Identifier: GPL-2.0-or-later + +gui.widgets.Dial = { + new: func(parent, style, cfg) + { + var cfg = Config.new(cfg); + var m = gui.Widget.new(gui.widgets.Dial); + m._focus_policy = m.StrongFocus; + m._down = 0; + m._minValue = 0; + m._maxValue = cfg.get("max-value", 100); + m._value = 50; + + m._wraps = cfg.get("wrap", 0); + m._pageStep = cfg.get("page-step", 0); + m._numTicks = cfg.get("tick-count", 0); + m._tickStyle = cfg.get("ticks-style", 0); + + # todo : optional value display in the center + + if( style != nil ) { + m._setView( style.createWidget(parent, cfg.get("type", "slider"), cfg) ); + m._view.updateRanges(m._minValue, m._maxValue, m._numTicks); + } + + return m; + }, + + setValue: func(val) + { + if( me._view != nil ) { + me._view.setNormValue(me._normValue()); + } + return me; + }, + + + +# protected: + _setView: func(view) + { + call(gui.Widget._setView, [view], me); + + # var el = view._root; + # el.addEventListener("mousedown", func if( me._enabled ) me.setDown(1)); + # el.addEventListener("mouseup", func if( me._enabled ) me.setDown(0)); + # el.addEventListener("click", func if( me._enabled ) me.toggle()); + + # el.addEventListener("mouseleave",func me.setDown(0)); + # el.addEventListener("drag", func(e) e.stopPropagation()); + }, + + # return value as its normalised equivalent + _normValue: func + { + var range = me._maxValue - me._minValue; + var v = math.clamp(me._value, me._minValue, me._maxValue) - me._minValue; + return v / range; + } +}; diff --git a/Nasal/canvas/gui/widgets/Frame.nas b/Nasal/canvas/gui/widgets/Frame.nas index 2e746acf6..6e3280eaf 100644 --- a/Nasal/canvas/gui/widgets/Frame.nas +++ b/Nasal/canvas/gui/widgets/Frame.nas @@ -2,7 +2,7 @@ # and optional checkbox / label (usuallt at the top / left) # to enable / disable it -# Copyright (C) 2022 James Turner +# SPDX-FileCopyrightText: (C) 2022 James Turner # SPDX-License-Identifier: GPL-2.0-or-later diff --git a/Nasal/canvas/gui/widgets/Label.nas b/Nasal/canvas/gui/widgets/Label.nas index a648e1bec..b203eda65 100644 --- a/Nasal/canvas/gui/widgets/Label.nas +++ b/Nasal/canvas/gui/widgets/Label.nas @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: (C) 2022 James Turner +# SPDX-License-Identifier: GPL-2.0-or-later + gui.widgets.Label = { new: func(parent, style, cfg) { diff --git a/Nasal/canvas/gui/widgets/Menu.nas b/Nasal/canvas/gui/widgets/Menu.nas new file mode 100644 index 000000000..f2bd5a700 --- /dev/null +++ b/Nasal/canvas/gui/widgets/Menu.nas @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: (C) 2022 James Turner +# SPDX-License-Identifier: GPL-2.0-or-later + +gui.widgets.Menu = { + + new: func(parent, style, cfg) + { + var cfg = Config.new(cfg); + var m = gui.Widget.new(gui.widgets.Menu); + m._focus_policy = m.StrongFocus; + + # m._flat = cfg.get("flat", 0); + # m._isDefault = cfg.get("default", 0); + # m._destructive = cfg.get("destructive", 0); + + m._setView( style.createWidget(parent, cfg.get("type", "menu"), cfg) ); + return m; + }, + + + + +# protected: + _setView: func(view) + { + call(gui.Widget._setView, [view], me); + var el = view._root; + } +}; + diff --git a/Nasal/canvas/gui/widgets/PopupMenu.nas b/Nasal/canvas/gui/widgets/PopupMenu.nas new file mode 100644 index 000000000..51163b302 --- /dev/null +++ b/Nasal/canvas/gui/widgets/PopupMenu.nas @@ -0,0 +1,54 @@ +# SPDX-FileCopyrightText: (C) 2022 James Turner +# SPDX-License-Identifier: GPL-2.0-or-later + +gui.widgets.PopupMenu = { + new: func(parent, style, cfg) + { + var cfg = Config.new(cfg); + var m = gui.Widget.new(gui.widgets.Button); + m._focus_policy = m.StrongFocus; + m._flat = cfg.get("flat", 0); + m._menu = nil; + m._setView( style.createWidget(parent, cfg.get("type", "button"), cfg) ); + + return m; + }, + setText: func(text) + { + if( me._view != nil ) + me._view.setText(me, text); + return me; + }, + + show: func() + { + # check if enabled + }, + + menu: func() + { + if (!me._menu) { + # FIXME pass style + me.menu = gui.widgets.Menu.new(cfg); + } + + return me._menu; + }, + +# convenience helper to add simple items + addMenuItem: func(text, value) { + # FIXME pass style + me.menu().append(gui.widgets.MenuItem.new()); + }, + +# protected: + _setView: func(view) + { + call(gui.Widget._setView, [view], me); + + var el = view._root; + el.addEventListener("mousedown", func if( me._enabled ) me.setDown(1)); + el.addEventListener("mouseup", func if( me._enabled ) me.setDown(0)); + el.addEventListener("mouseleave",func me.setDown(0)); + } +}; diff --git a/Nasal/canvas/gui/widgets/RadioButton.nas b/Nasal/canvas/gui/widgets/RadioButton.nas index fec9687fa..18d17840f 100644 --- a/Nasal/canvas/gui/widgets/RadioButton.nas +++ b/Nasal/canvas/gui/widgets/RadioButton.nas @@ -1,6 +1,6 @@ # RadioButton.nas : radio button, and group helper # to manage updating checked state conherently -# Copyright (C) 2022 James Turner +# SPDX-FileCopyrightText: (C) 2022 James Turner # SPDX-License-Identifier: GPL-2.0-or-later gui.widgets.RadioButton = { diff --git a/Nasal/canvas/gui/widgets/Rule.nas b/Nasal/canvas/gui/widgets/Rule.nas index a1dfee393..f09dc11d0 100644 --- a/Nasal/canvas/gui/widgets/Rule.nas +++ b/Nasal/canvas/gui/widgets/Rule.nas @@ -1,6 +1,6 @@ # Rule.nas : horizontal or vertical dividing line, # optionally with a text label, eg to name a section -# Copyright (C) 2022 James Turner +# SPDX-FileCopyrightText: (C) 2022 James Turner # SPDX-License-Identifier: GPL-2.0-or-later diff --git a/Nasal/canvas/gui/widgets/Slider.nas b/Nasal/canvas/gui/widgets/Slider.nas index 050d69aef..fb425c2f4 100644 --- a/Nasal/canvas/gui/widgets/Slider.nas +++ b/Nasal/canvas/gui/widgets/Slider.nas @@ -1,3 +1,8 @@ +# Slider.nas : show a user-draggable slider +# with optional tick marks and value display +# SPDX-FileCopyrightText: (C) 2022 James Turner +# SPDX-License-Identifier: GPL-2.0-or-later + gui.widgets.Slider = { new: func(parent, style, cfg) { @@ -6,11 +11,16 @@ gui.widgets.Slider = { m._focus_policy = m.StrongFocus; m._down = 0; m._minValue = 0; - m._maxValue = 100; + m._maxValue = cfg.get("max-value", 100); m._value = 50; - m._pageStep = 10; - m._numTicks = 10; + m._pageStep = cfg.get("page-step", 0); + m._numTicks = cfg.get("tick-count", 0); + m._tickStyle = cfg.get("ticks-style", 0); + m._valueDisplayStyle = cfg.get("value-style", 0); + + # TODO : select where value is shown + # TODO : select where tick marks are shown if( style != nil ) { m._setView( style.createWidget(parent, cfg.get("type", "slider"), cfg) ); diff --git a/Nasal/gui/MenuBar.nas b/Nasal/gui/MenuBar.nas new file mode 100644 index 000000000..001a30050 --- /dev/null +++ b/Nasal/gui/MenuBar.nas @@ -0,0 +1,60 @@ +# SPDX-FileCopyrightText: (C) 2022 James Turner +# SPDX-License-Identifier: GPL-2.0-or-later + + +var GUIMenuItem = { + + aboutToShow: func() { + + }, + + # return a Canvas object (group) of the contents + show: func(viewParent) { + + } + +}; + +var GUIMenu = { + + aboutToShow: func() { + + }, + + # return a Canvas object (group) of the contents + show: func(viewParent) { + # loop over children + } + +}; + +var GUIMenuBar = { + aboutToShow: func() { + + }, + + # return a Canvas object (group) of the contents + show: func(viewParent) { + + } + +}; + +# this is the callback function invoked by C++ to build Nasal peers +# for the C++ menu objects. +var _createMenuObject = func(type) +{ + if (type == "menubar") { + + } else if (type == "menuitem") { + + } else if (type == "seperator") { + + } else if (type == "menu") { + # do we need to distuinguish submenus here: + } + + return nil; +} + +logprint(LOG_INFO, "Did load GUI menubar"); diff --git a/Nasal/gui/XMLDialog.nas b/Nasal/gui/XMLDialog.nas index cc9aa825d..2179cecda 100644 --- a/Nasal/gui/XMLDialog.nas +++ b/Nasal/gui/XMLDialog.nas @@ -1,5 +1,5 @@ # XML Dialog - XML dialog object without using PUI -# Copyright (C) 2022 James Turner +# SPDX-FileCopyrightText: (C) 2022 James Turner # SPDX-License-Identifier: GPL-2.0-or-later # alias this module to keep things somewhat readable @@ -405,6 +405,30 @@ var XMLSlider = } }; +var XMLDial = +{ + init: func(objectProps) + { + logprint(LOG_INFO, "Init of XMLDial"); + + + }, + + show: func(viewParent) + { + me._view = cwidgets.Dial.new(viewParent, canvas.style, {}); + me._layout = me._view; + me._applyLayoutConfig(); + me.update(); + return me._view; + }, + + update: func() + { + + } +}; + var XMLTextEdit = { init: func(objectProps) @@ -497,6 +521,10 @@ var _createCompatObject = func(type) widget = XMLSlider; } + if (type == "dial") { + widget = XMLDial; + } + if (type == "group") { widget = XMLGroup; }