added count_button example
This commit is contained in:
parent
b6c508015f
commit
6b38859eab
2 changed files with 84 additions and 3 deletions
57
README.adoc
57
README.adoc
|
|
@ -32,7 +32,7 @@ looks much worse in other environments and offers by far not all that what is ne
|
||||||
|
|
||||||
While GTK was initially designed and advertised as cross platform GUI toolkit, it is currently mostly used on _Linux_ and other _Unix_ like operation systems.
|
While GTK was initially designed and advertised as cross platform GUI toolkit, it is currently mostly used on _Linux_ and other _Unix_ like operation systems.
|
||||||
Most Linux distributions include it, and some use it for their default desktop environment, often with the Gnome environment or other window managers.
|
Most Linux distributions include it, and some use it for their default desktop environment, often with the Gnome environment or other window managers.
|
||||||
While GTK2 applications like _GIMP_ are still used on _Windows_, there seems to exist currently only very few GTK3 applications for Windows or {MAC}.
|
While GTK2 applications like _GIMP_ are still used on _Windows_, there seems to exist currently only very few GTK3 applications for Windows or _{MAC}_.
|
||||||
When you develop primary _free open source software_ (_FOSS_) for Linux or other Unix like operating systems, then GTK3 is a good choice for you. With some
|
When you develop primary _free open source software_ (_FOSS_) for Linux or other Unix like operating systems, then GTK3 is a good choice for you. With some
|
||||||
effort you should be even able to port your application to the proprietary Windows or {MAC} operating systems. But when your primary target platforms
|
effort you should be even able to port your application to the proprietary Windows or {MAC} operating systems. But when your primary target platforms
|
||||||
are Windows and {MAC} and you desire a real native look and feel there, then you may find better suited ones in the Nim software repository.
|
are Windows and {MAC} and you desire a real native look and feel there, then you may find better suited ones in the Nim software repository.
|
||||||
|
|
@ -87,7 +87,7 @@ exists a few more complicated cases, for example functions may return whole arra
|
||||||
or function arguments or results may be so called _glists_,
|
or function arguments or results may be so called _glists_,
|
||||||
list structures of `glib` library. These cases can not be processed automatically but needs carefully manual investigations. And there may be still functions and data
|
list structures of `glib` library. These cases can not be processed automatically but needs carefully manual investigations. And there may be still functions and data
|
||||||
types missing: {GIR} query gives us many thousand lines of Nim interface code, and it is not really obvious if and what is missing.
|
types missing: {GIR} query gives us many thousand lines of Nim interface code, and it is not really obvious if and what is missing.
|
||||||
Some functions and data types are missing for sure -- at least some low level ones, which are considered unneeded for high level bindings by _{GIR}_.
|
Some functions and data types are missing for sure -- at least some low level ones, which are considered unneeded for high level bindings by {GIR}.
|
||||||
But maybe more is missing, we have to investigate that. Until now these bindings have been tested only for 64 bit Linux systems with GTK 3.22.
|
But maybe more is missing, we have to investigate that. Until now these bindings have been tested only for 64 bit Linux systems with GTK 3.22.
|
||||||
|
|
||||||
These basic libraries are already partly tested:
|
These basic libraries are already partly tested:
|
||||||
|
|
@ -147,7 +147,7 @@ nim c app0.nim
|
||||||
|
|
||||||
== A few basic examples
|
== A few basic examples
|
||||||
|
|
||||||
GTK3 programs can use still the old GTK2 design, where you first initialize the GTK library, create your widgets and finally enter the GTK main loop.
|
GTK3 programs can use still the old _GTK2_ design, where you first initialize the GTK library, create your widgets and finally enter the GTK main loop.
|
||||||
This style is still used in many tutorials as in http://zetcode.com/gui/gtk2/[Zetcode tutorial] or in the GTK book of A. Krause.
|
This style is still used in many tutorials as in http://zetcode.com/gui/gtk2/[Zetcode tutorial] or in the GTK book of A. Krause.
|
||||||
Or you can use the new _GTK3 App style_, this is generally recommended by newer original GTK documentation.
|
Or you can use the new _GTK3 App style_, this is generally recommended by newer original GTK documentation.
|
||||||
Unfortunately the GTK3 original documentation is mostly restricted to the GTK3 API documentation, which is generally very good, but makes
|
Unfortunately the GTK3 original documentation is mostly restricted to the GTK3 API documentation, which is generally very good, but makes
|
||||||
|
|
@ -514,5 +514,56 @@ that term. So it is really easy to find first starting points for related procs
|
||||||
are located near by their related functions, so you should be able to find all relevant information fast.
|
are located near by their related functions, so you should be able to find all relevant information fast.
|
||||||
Remember the GTK `devhelp` tool, and use also `grep` or the `nimgrep` variant.
|
Remember the GTK `devhelp` tool, and use also `grep` or the `nimgrep` variant.
|
||||||
|
|
||||||
|
== Extending or sub-classing Widgets
|
||||||
|
|
||||||
|
I may occur that we want to attach additional information to GTK widgets
|
||||||
|
by extending or subclassing them. Doing this is supported
|
||||||
|
by providing for each widget class not only a corresponding new() proc which returns
|
||||||
|
the newly created widget, but also
|
||||||
|
a init() proc, which gets an uninitialized variable of the (extended) widget type as argument and
|
||||||
|
initializes that variable with a newly created
|
||||||
|
GTK widget . Initializing the added fields is
|
||||||
|
done separately by the user. The following code shows a GTK button, which is
|
||||||
|
extended with a counter member field. That counter is decreased for
|
||||||
|
each button click. The amount of decrease (5) is passed to the callback as a int parameter.
|
||||||
|
|
||||||
|
[[count_button.nim]]
|
||||||
|
[source,nim]
|
||||||
|
.count_button.nim
|
||||||
|
----
|
||||||
|
# nim c count_button.nim
|
||||||
|
import gintro/[gtk, glib]
|
||||||
|
import gintro/gio except Application, newApplication
|
||||||
|
|
||||||
|
type
|
||||||
|
CountButton = ref object of Button
|
||||||
|
counter: int
|
||||||
|
|
||||||
|
proc buttonClicked (button: CountButton; decrement: int) =
|
||||||
|
dec(button.counter, decrement)
|
||||||
|
button.label = "Counter: " & $button.counter
|
||||||
|
echo "Counter is now: ", button.counter
|
||||||
|
|
||||||
|
proc activate (app: Application) =
|
||||||
|
var button: CountButton
|
||||||
|
let window = newApplicationWindow(app)
|
||||||
|
window.title = "Count Button"
|
||||||
|
initButton(button, "Counting down from 100 by 5")
|
||||||
|
button.counter = 100
|
||||||
|
window.add(button)
|
||||||
|
button.connect("clicked", buttonClicked, 5)
|
||||||
|
window.showAll
|
||||||
|
|
||||||
|
proc main =
|
||||||
|
let app = newApplication("org.gtk.example")
|
||||||
|
connect(app, "activate", activate)
|
||||||
|
discard app.run
|
||||||
|
|
||||||
|
main()
|
||||||
|
----
|
||||||
|
|
||||||
|
In this example we have to define our new widget type first, then we have to
|
||||||
|
declare a variable of that type and pass that variable to the init() proc.
|
||||||
|
|
||||||
NOTE: Related work: https://github.com/jdmansour/nim-smartgi
|
NOTE: Related work: https://github.com/jdmansour/nim-smartgi
|
||||||
|
|
||||||
|
|
|
||||||
30
examples/count_button.nim
Normal file
30
examples/count_button.nim
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
# nim c count_button.nim
|
||||||
|
import gintro/[gtk, glib]
|
||||||
|
import gintro/gio except Application, newApplication
|
||||||
|
|
||||||
|
type
|
||||||
|
CountButton = ref object of Button
|
||||||
|
counter: int
|
||||||
|
|
||||||
|
proc buttonClicked (button: CountButton; decrement: int) =
|
||||||
|
dec(button.counter, decrement)
|
||||||
|
button.label = "Counter: " & $button.counter
|
||||||
|
echo "Counter is now: ", button.counter
|
||||||
|
|
||||||
|
proc activate (app: Application) =
|
||||||
|
var button: CountButton
|
||||||
|
let window = newApplicationWindow(app)
|
||||||
|
window.title = "Count Button"
|
||||||
|
initButton(button, "Counting down from 100 by 5")
|
||||||
|
button.counter = 100
|
||||||
|
window.add(button)
|
||||||
|
button.connect("clicked", buttonClicked, 5)
|
||||||
|
window.showAll
|
||||||
|
|
||||||
|
proc main =
|
||||||
|
let app = newApplication("org.gtk.example")
|
||||||
|
connect(app, "activate", activate)
|
||||||
|
discard app.run
|
||||||
|
|
||||||
|
main()
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue