Re: [Vala] Gtk.ProgressBar

2017-03-13 Thread webie...@gmail.com
Well, I have been testing with Gtk.ProgressBar, with the set_fraction ()
method (in progress mode because I can know the amount of work
remaining). But I did not get it to work properly.

But I have many things to improve on my application and now I do not
want to block me any longer in that.

That is why I have replaced it with GLib.Notification, which offers the
same result for the user with just a few lines of code:

When the parser begins:

var notification = new GLib.Notification ("Importando contactos")   
   
notification.set_body ("Espera, por favor...")
var app = GLib.Application.get_default ()
app.send_notification ("msg-imp", notification)

And when it ends:

msg_imp: string = "Se han importado " + num_lin.to_string() + "
contactos"
notification.set_title ("Importación completada")
notification.set_body (msg_imp)
app.send_notification ("msg-imp", notification)

That works well and is simple.

As I am developing this application to learn Genie, when the project is
more stable, I will return to work with Gtk.ProgressBar.

Thank you all!

El 13/03/17 a las 12:15, webie...@gmail.com escribió:
> Thank you all, and also private messages.
>
> I'm working in it. When I get some result I will comment.
>
>
> El 12/03/17 a las 21:34, Chris Daley escribió:
>> Hi,
>>
>> This is a quick example I whipped up which works somewhat along the
>> lines as Al suggests. This is one of the times where Vala is more
>> expressive than Genie with Closures.
>>
>> uses Gtk
>>
>> init
>> Gtk.init (ref args)
>> var TestGtk = new Ventana()
>> TestGtk.show_all()
>> Gtk.main()
>>
>> class Ventana : Window
>>
>> dialogo : Dialogo
>> cb : SourceFunc
>> boton: Button
>> output : string
>>
>> init
>> // set up the main window
>> title = "Genie Async"
>> set_default_size (250, 100)
>> set_border_width(8)
>> window_position = WindowPosition.CENTER
>> destroy.connect(Gtk.main_quit)
>> // set up the button and connect the callback
>> boton = new Button.with_label("Load VCard")
>> boton.clicked.connect(open_vcard)
>> add(boton)
>>
>> def open_vcard()
>> // show the dialog with the progress bar
>> dialogo = new Dialogo(this)
>> dialogo.show_all()
>> // call the async method with callback 
>> load_vcard.begin ("filename", end)
>>
>> // this is the callback from the load_card method
>> def end (o : Object?, r : AsyncResult)
>> // to get the result of the async method, we call its
>> // end method with the AsyncResult parameter
>> try
>> boton.label = load_vcard.end(r)
>> except ex : ThreadError
>> boton.label = ex.message
>> // close the dialog
>> dialogo.destroy()
>>
>> def async load_vcard(fname : string) : string raises ThreadError
>> // we save the callback here because Genie has limited support
>> // for closures
>> cb = load_vcard.callback
>>
>> // we create a separate thread for our long running process
>> run : ThreadFunc of void*
>> run = do_load_vcard
>> Thread.create(run, false)
>> // we return control to the calling method (open_vcard)
>> yield
>> // we now return a result from our lengthy process
>> // for your application this could be an instance of your
>> // vard object created above
>> return output
>>
>> // this is to simulate a lengthy process that we run in a separate thread
>> def do_load_vcard () : void*
>> var result = 0
>> for var i = 0 to 10
>> result = i
>> // we save the result of our lengthy process to the output var
>> output = "ran %d times".printf(result)
>> // then we add the callback (end) to the MainLoop Idle
>> Idle.add((owned)cb)
>> return null
>>
>>
>>
>> class Dialogo : Dialog
>>
>> progress_bar: ProgressBar
>>
>> construct( padre: Window )
>> set_transient_for(padre)
>> title = "Espera por favor"
>> progress_bar = new ProgressBar()
>> get_content_area().add(progress_bar)
>> set_modal(true)
>> // This causes the ProgressBar to pulse every 60 miliseconds
>> Timeout.add(60, pulse)
>>
>> def pulse () : bool
>> progress_bar.pulse()
>> return true
>> Please let me know if this is clear enough (and any suggestions!)
>> Cheers
>> Chris D
>>
>> 2017-03-12 13:22 GMT-07:00 Al Thomas via vala-list
>> mailto:vala-list@gnome.org>>:
>>
>> > - Original Message -
>>
>> > From: "webie...@gmail.com "
>> mailto:webie...@gmail.com>>
>> > Sent: Saturday, 11 March 2017, 18:55
>> > Subject: [Vala] Gtk.ProgressBar
>>
>> > I explain: From a FileChooserDialog is selected and opens the vCard
>> > file, and if it is too large it takes a while to analyze and
>> import the
>> > contacts. At that time I want to open a window or dialog (without
>> > buttons) with a Gtk.ProgressBar that shows the progress of the
>> > operation. And when the operation is finished, the window /
>> dialog is
>> > automatically closed.
>>
>>
>> Ideally you would use asynchronous, event based programming in
>> Vala/Genie.
>> So something like:
>> 1. Write an asynchronous process vCard function that runs in 

Re: [Vala] Gtk.ProgressBar

2017-03-13 Thread webie...@gmail.com
Thank you all, and also private messages.

I'm working in it. When I get some result I will comment.


El 12/03/17 a las 21:34, Chris Daley escribió:
> Hi,
>
> This is a quick example I whipped up which works somewhat along the
> lines as Al suggests. This is one of the times where Vala is more
> expressive than Genie with Closures.
>
> uses Gtk
>
> init
> Gtk.init (ref args)
> var TestGtk = new Ventana()
> TestGtk.show_all()
> Gtk.main()
>
> class Ventana : Window
>
> dialogo : Dialogo
> cb : SourceFunc
> boton: Button
> output : string
>
> init
> // set up the main window
> title = "Genie Async"
> set_default_size (250, 100)
> set_border_width(8)
> window_position = WindowPosition.CENTER
> destroy.connect(Gtk.main_quit)
> // set up the button and connect the callback
> boton = new Button.with_label("Load VCard")
> boton.clicked.connect(open_vcard)
> add(boton)
>
> def open_vcard()
> // show the dialog with the progress bar
> dialogo = new Dialogo(this)
> dialogo.show_all()
> // call the async method with callback 
> load_vcard.begin ("filename", end)
>
> // this is the callback from the load_card method
> def end (o : Object?, r : AsyncResult)
> // to get the result of the async method, we call its
> // end method with the AsyncResult parameter
> try
> boton.label = load_vcard.end(r)
> except ex : ThreadError
> boton.label = ex.message
> // close the dialog
> dialogo.destroy()
>
> def async load_vcard(fname : string) : string raises ThreadError
> // we save the callback here because Genie has limited support
> // for closures
> cb = load_vcard.callback
>
> // we create a separate thread for our long running process
> run : ThreadFunc of void*
> run = do_load_vcard
> Thread.create(run, false)
> // we return control to the calling method (open_vcard)
> yield
> // we now return a result from our lengthy process
> // for your application this could be an instance of your
> // vard object created above
> return output
>
> // this is to simulate a lengthy process that we run in a separate thread
> def do_load_vcard () : void*
> var result = 0
> for var i = 0 to 10
> result = i
> // we save the result of our lengthy process to the output var
> output = "ran %d times".printf(result)
> // then we add the callback (end) to the MainLoop Idle
> Idle.add((owned)cb)
> return null
>
>
>
> class Dialogo : Dialog
>
> progress_bar: ProgressBar
>
> construct( padre: Window )
> set_transient_for(padre)
> title = "Espera por favor"
> progress_bar = new ProgressBar()
> get_content_area().add(progress_bar)
> set_modal(true)
> // This causes the ProgressBar to pulse every 60 miliseconds
> Timeout.add(60, pulse)
>
> def pulse () : bool
> progress_bar.pulse()
> return true
> Please let me know if this is clear enough (and any suggestions!)
> Cheers
> Chris D
>
> 2017-03-12 13:22 GMT-07:00 Al Thomas via vala-list
> mailto:vala-list@gnome.org>>:
>
> > - Original Message -
>
> > From: "webie...@gmail.com "
> mailto:webie...@gmail.com>>
> > Sent: Saturday, 11 March 2017, 18:55
> > Subject: [Vala] Gtk.ProgressBar
>
> > I explain: From a FileChooserDialog is selected and opens the vCard
> > file, and if it is too large it takes a while to analyze and
> import the
> > contacts. At that time I want to open a window or dialog (without
> > buttons) with a Gtk.ProgressBar that shows the progress of the
> > operation. And when the operation is finished, the window /
> dialog is
> > automatically closed.
>
>
> Ideally you would use asynchronous, event based programming in
> Vala/Genie.
> So something like:
> 1. Write an asynchronous process vCard function that runs in a
> background
>thread. I've not figured out the best way of doing this, but
> look at the
>async keyword in Vala and
> https://developer.gnome.org/gio/stable/ch02.html
> 
> 2. Write an "app_paused" object that stores two states. The first
> state is
>for a Timeout source
> (https://valadoc.org/glib-2.0/GLib.Timeout.html
> ) that
>will then complete and then the second state is showing a
> spinner dialog.
>This needs a cancel method to cancel the timer or close the dialog.
>For a progress bar you would need some kind of signalling, so
> more complex.
> 3. You combine these two by starting the "app_paused" object then call
>yield process_vCard(). When the processing is finished the code
> after the
>yield should call the app_paused cancel method.
> It would be nice to find some good examples of this.
>
> > At the moment I have not known how to solve it, and I am using
> > Notify.Notification to report the process, but this requires a new
> > dependency (libnotify) and I prefer to use few dependencies.
>
>
> From https://wiki.gnome.org/HowDoI/GNo

Re: [Vala] Gtk.ProgressBar

2017-03-12 Thread Chris Daley
Hi,

This is a quick example I whipped up which works somewhat along the lines
as Al suggests. This is one of the times where Vala is more expressive than
Genie with Closures.

uses Gtk

init
Gtk.init (ref args)
var TestGtk = new Ventana()
TestGtk.show_all()
Gtk.main()

class Ventana : Window

dialogo : Dialogo
cb : SourceFunc
boton: Button
output : string

init
// set up the main window
title = "Genie Async"
set_default_size (250, 100)
set_border_width(8)
window_position = WindowPosition.CENTER
destroy.connect(Gtk.main_quit)
// set up the button and connect the callback
boton = new Button.with_label("Load VCard")
boton.clicked.connect(open_vcard)
add(boton)

def open_vcard()
// show the dialog with the progress bar
dialogo = new Dialogo(this)
dialogo.show_all()
// call the async method with callback
load_vcard.begin ("filename", end)

// this is the callback from the load_card method
def end (o : Object?, r : AsyncResult)
// to get the result of the async method, we call its
// end method with the AsyncResult parameter
try
boton.label = load_vcard.end(r)
except ex : ThreadError
boton.label = ex.message
// close the dialog
dialogo.destroy()

def async load_vcard(fname : string) : string raises ThreadError
// we save the callback here because Genie has limited support
// for closures
cb = load_vcard.callback

// we create a separate thread for our long running process
run : ThreadFunc of void*
run = do_load_vcard
Thread.create(run, false)
// we return control to the calling method (open_vcard)
yield
// we now return a result from our lengthy process
// for your application this could be an instance of your
// vard object created above
return output

// this is to simulate a lengthy process that we run in a separate thread
def do_load_vcard () : void*
var result = 0
for var i = 0 to 10
result = i
// we save the result of our lengthy process to the output var
output = "ran %d times".printf(result)
// then we add the callback (end) to the MainLoop Idle
Idle.add((owned)cb)
return null



class Dialogo : Dialog

progress_bar: ProgressBar

construct( padre: Window )
set_transient_for(padre)
title = "Espera por favor"
progress_bar = new ProgressBar()
get_content_area().add(progress_bar)
set_modal(true)
// This causes the ProgressBar to pulse every 60 miliseconds
Timeout.add(60, pulse)

def pulse () : bool
progress_bar.pulse()
return true

Please let me know if this is clear enough (and any suggestions!)

Cheers
Chris D


2017-03-12 13:22 GMT-07:00 Al Thomas via vala-list :

> > - Original Message -
>
> > From: "webie...@gmail.com" 
> > Sent: Saturday, 11 March 2017, 18:55
> > Subject: [Vala] Gtk.ProgressBar
>
> > I explain: From a FileChooserDialog is selected and opens the vCard
> > file, and if it is too large it takes a while to analyze and import the
> > contacts. At that time I want to open a window or dialog (without
> > buttons) with a Gtk.ProgressBar that shows the progress of the
> > operation. And when the operation is finished, the window / dialog is
> > automatically closed.
>
>
> Ideally you would use asynchronous, event based programming in Vala/Genie.
> So something like:
> 1. Write an asynchronous process vCard function that runs in a background
>thread. I've not figured out the best way of doing this, but look at the
>async keyword in Vala and https://developer.gnome.org/
> gio/stable/ch02.html
> 2. Write an "app_paused" object that stores two states. The first state is
>for a Timeout source (https://valadoc.org/glib-2.0/GLib.Timeout.html)
> that
>will then complete and then the second state is showing a spinner
> dialog.
>This needs a cancel method to cancel the timer or close the dialog.
>For a progress bar you would need some kind of signalling, so more
> complex.
> 3. You combine these two by starting the "app_paused" object then call
>yield process_vCard(). When the processing is finished the code after
> the
>yield should call the app_paused cancel method.
> It would be nice to find some good examples of this.
>
> > At the moment I have not known how to solve it, and I am using
> > Notify.Notification to report the process, but this requires a new
> > dependency (libnotify) and I prefer to use few dependencies.
>
>
> From https://wiki.gnome.org/HowDoI/GNotification:
> "As of GLib 2.39, it is no longer necessary to link against libnotify to
>
> create notifications in your application, GIO now provides an API for it:
>
> GNotification."
>
> So create a Notification (https://valadoc.org/gio-2.0/
> GLib.Notification.html)
> and send it through you GApplication send_notification method (
> https://valadoc.org/gio-2.0/GLib.Application.send_notification.html )
>
> Good luck with it,
>
> Al
> ___
> vala-list mailing list
> vala-list@gnome.org
> https://mail.gnome.org/mailman/listinfo/vala-list
>



-- 
Chris Daley
Pacific Northwest

e: chebiza...@gmail.com
w: http://chrisdaley.biz
m: +1-971-703-9251
s: chebi

Re: [Vala] Gtk.ProgressBar

2017-03-12 Thread Al Thomas via vala-list
> - Original Message -

> From: "webie...@gmail.com" 
> Sent: Saturday, 11 March 2017, 18:55
> Subject: [Vala] Gtk.ProgressBar

> I explain: From a FileChooserDialog is selected and opens the vCard
> file, and if it is too large it takes a while to analyze and import the
> contacts. At that time I want to open a window or dialog (without
> buttons) with a Gtk.ProgressBar that shows the progress of the
> operation. And when the operation is finished, the window / dialog is
> automatically closed.


Ideally you would use asynchronous, event based programming in Vala/Genie.
So something like:
1. Write an asynchronous process vCard function that runs in a background
   thread. I've not figured out the best way of doing this, but look at the
   async keyword in Vala and https://developer.gnome.org/gio/stable/ch02.html
2. Write an "app_paused" object that stores two states. The first state is
   for a Timeout source (https://valadoc.org/glib-2.0/GLib.Timeout.html) that
   will then complete and then the second state is showing a spinner dialog.
   This needs a cancel method to cancel the timer or close the dialog.
   For a progress bar you would need some kind of signalling, so more complex.
3. You combine these two by starting the "app_paused" object then call
   yield process_vCard(). When the processing is finished the code after the
   yield should call the app_paused cancel method.
It would be nice to find some good examples of this.

> At the moment I have not known how to solve it, and I am using
> Notify.Notification to report the process, but this requires a new
> dependency (libnotify) and I prefer to use few dependencies.


>From https://wiki.gnome.org/HowDoI/GNotification:
"As of GLib 2.39, it is no longer necessary to link against libnotify to 

create notifications in your application, GIO now provides an API for it: 

GNotification."

So create a Notification (https://valadoc.org/gio-2.0/GLib.Notification.html)
and send it through you GApplication send_notification method (
https://valadoc.org/gio-2.0/GLib.Application.send_notification.html )

Good luck with it,

Al
___
vala-list mailing list
vala-list@gnome.org
https://mail.gnome.org/mailman/listinfo/vala-list