[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

dialog that pops up when window busy

Joe Van Dyk

1/11/2006 1:54:00 AM

Hi,

In my window, I sometimes want to prevent the user from doing anything
while an action is occuring. So I want to disable the window (using
Gtk::Widget#sensitive).

But I also want to popup a little dialog saying why the window is
being disabled (and perhaps have a little progress indicator on it).

Are there any Gtk widgets that could help me, or do I need to make a
custom dialog box for this?


2 Answers

David Vallner

1/11/2006 5:08:00 AM

0

Joe Van Dyk wrote:

>Hi,
>
>In my window, I sometimes want to prevent the user from doing anything
>while an action is occuring. So I want to disable the window (using
>Gtk::Widget#sensitive).
>
>But I also want to popup a little dialog saying why the window is
>being disabled (and perhaps have a little progress indicator on it).
>
>Are there any Gtk widgets that could help me, or do I need to make a
>custom dialog box for this?
>
>
>
A custom progress dialog should not be hard to implement. If you pop it
up as a modal dialog, you'll also avoid having to desentivize the window
by hand. You'll definitely need a separate thread for a progress dialog,
and possibly wrap whatever you're doing that requires waiting in some
sort of ProgressingTask object to get things completely done.

That said, I do have a weird hunch I saw some existing implementations
of the problem around, but can't for the heck of it figure out in what
context. Brief googling would indicate that indeed Gtk has a "progress
bar" widget, the documentation to that might provide some insights as to
what you're looking at. And embedding one in a pop-up modal progress
dialog should then be trivial.

David Vallner


Joe Van Dyk

1/11/2006 1:16:00 PM

0

On 1/10/06, David Vallner <david@vallner.net> wrote:
> Joe Van Dyk wrote:
>
> >Hi,
> >
> >In my window, I sometimes want to prevent the user from doing anything
> >while an action is occuring. So I want to disable the window (using
> >Gtk::Widget#sensitive).
> >
> >But I also want to popup a little dialog saying why the window is
> >being disabled (and perhaps have a little progress indicator on it).
> >
> >Are there any Gtk widgets that could help me, or do I need to make a
> >custom dialog box for this?
> >
> >
> >
> A custom progress dialog should not be hard to implement. If you pop it
> up as a modal dialog, you'll also avoid having to desentivize the window
> by hand. You'll definitely need a separate thread for a progress dialog,
> and possibly wrap whatever you're doing that requires waiting in some
> sort of ProgressingTask object to get things completely done.
>
> That said, I do have a weird hunch I saw some existing implementations
> of the problem around, but can't for the heck of it figure out in what
> context. Brief googling would indicate that indeed Gtk has a "progress
> bar" widget, the documentation to that might provide some insights as to
> what you're looking at. And embedding one in a pop-up modal progress
> dialog should then be trivial.

Bleh, meant to send this to ruby-gnome2, not ruby-talk. :-(

Anyway, here's how I solved it. If there's a cleaner way to do it,
I'd love to hear about it.

class App
def initialize
Gtk::init
@window = Gtk::Window.new "Joe's Crazy Application"
@window.set_default_size 300, 300

vbox = Gtk::VBox.new
@window << vbox

vbox << Gtk::Label.new("Stuff")
vbox << Gtk::Label.new("More Stuff")
vbox << Gtk::Button.new("Useless button")
vbox << Gtk::Button.new("Another Useless button")

lock_button = Gtk::Button.new "Lock window for three seconds"
vbox << lock_button

lock_button.signal_connect("clicked") do
# Window gets locked while doing stuff
@window.lock do
start_time = Time.now
# computationally heavy thing there
loop do
Gtk::process_gui_events # Any way I can get rid of this?
rand 100000000
break if Time.now - start_time >= 3
end
end
end

@window.signal_connect("delete-event") { Gtk::main_quit }
@window.show_all
Gtk::main
end
end

module Gtk
# Makes sure that Gtk has a change to draw stuff
def self.process_gui_events
while Gtk::events_pending?
Gtk::main_iteration
end
end
end

class Gtk::Window
# Locks the window
def lock reason = "hold on there buddy", &block
self.sensitive = false
display_locking_dialog(reason) do
block.call
end
self.sensitive = true
end

# Displays a locking dialog box with a
# pulsing progress bar over the window
def display_locking_dialog reason, &block
dialog = Gtk::Dialog.new "", self, Gtk::Dialog::MODAL
dialog.decorated = false
vbox = Gtk::VBox.new
reason_label = Gtk::Label.new reason
progress_bar = Gtk::ProgressBar.new
thread_id = Gtk::timeout_add(100) { progress_bar.pulse }
vbox << reason_label << progress_bar
dialog.action_area << vbox
dialog.show_all
block.call
Gtk::timeout_remove(thread_id)
dialog.destroy
end

end

App.new if __FILE__ == $0