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 1000000000
>> 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
>> <vala-list@gnome.org <mailto:vala-list@gnome.org>>:
>>
>>     > ----- Original Message -----
>>
>>     > From: "webie...@gmail.com <mailto:webie...@gmail.com>"
>>     <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
>>     <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
>>     <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
>>     <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
>>     <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
>>     <https://valadoc.org/gio-2.0/GLib.Application.send_notification.html>
>>     )
>>
>>     Good luck with it,
>>
>>     Al
>>     _______________________________________________
>>     vala-list mailing list
>>     vala-list@gnome.org <mailto:vala-list@gnome.org>
>>     https://mail.gnome.org/mailman/listinfo/vala-list
>>     <https://mail.gnome.org/mailman/listinfo/vala-list>
>>
>>
>>
>>
>> -- 
>> Chris Daley
>> Pacific Northwest
>>
>> e: chebiza...@gmail.com <mailto:chebiza...@gmail.com>
>> w: http://chrisdaley.biz
>> m: +1-971-703-9251
>> s: chebizarro
>> tw: chebizarro
>> tz: PDT
>>
>
>

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

Reply via email to