X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=inline;f=submit%2Fcontest;h=3e53eb97e6c3eebc9f3bcb36c8cec226e8e0baef;hb=7b9b037333c28f69beaa7fd9a7a294ea69a6580c;hp=e9ebd68c69440a449d9f2b1bde6075e97b5b8d74;hpb=65ff89923436ec785ce2b35d26827aa95ce8c3ce;p=eval.git diff --git a/submit/contest b/submit/contest index e9ebd68..3e53eb9 100755 --- a/submit/contest +++ b/submit/contest @@ -13,6 +13,7 @@ use lib $ENV{"MO_ROOT"} . "/submit/lib/perl5"; use MO::Submit; use Sherlock::Object; +use POSIX; use Gtk2 -init; my $conn = new MO::Submit; @@ -22,6 +23,7 @@ my $conn = new MO::Submit; sub init_refresh(); sub timed_refresh(); sub refresh($); +sub submit(); my $busy_cursor = Gtk2::Gdk::Cursor->new('watch'); @@ -30,7 +32,7 @@ my $window = Gtk2::Window->new('toplevel'); $window->signal_connect("delete-event" => sub { Gtk2->main_quit }); $window->set_title($conn->{"Contest"} . " Submitter"); $window->set_wmclass("submitter", "Submitter"); -$window->set_default_size(320, 400); +$window->set_default_size(640, 480); # The title label my $title_lab = Gtk2::Label->new; @@ -38,7 +40,7 @@ $title_lab->set_markup("" . $conn->{"Contest"} . "") # The row of buttons my $b_submit = Gtk2::Button->new('Submit'); -$b_submit->signal_connect(clicked => sub { Gtk2->main_quit }); +$b_submit->signal_connect(clicked => \&submit); $b_submit->set_sensitive(0); my $b_check = Gtk2::Button->new('Check'); @@ -55,16 +57,14 @@ $button_box->pack_start_defaults($b_refresh); $button_box->set_border_width(5); # The list of tasks -my $task_store = Gtk2::ListStore->new('Glib::String', 'Glib::String', 'Glib::String'); +my $task_store = Gtk2::ListStore->new('Glib::String', 'Glib::String'); my $task_view = Gtk2::TreeView->new($task_store); my $task_renderer = Gtk2::CellRendererText->new; my $task_col1 = Gtk2::TreeViewColumn->new_with_attributes("Task", $task_renderer, "text", 0); $task_view->append_column($task_col1); -my $task_col2 = Gtk2::TreeViewColumn->new_with_attributes("Part", $task_renderer, "text", 1); +my $task_col2 = Gtk2::TreeViewColumn->new_with_attributes("Status", $task_renderer, "text", 1); $task_view->append_column($task_col2); -my $task_col3 = Gtk2::TreeViewColumn->new_with_attributes("Status", $task_renderer, "text", 2); -$task_view->append_column($task_col3); $task_view->set_headers_visible(0); my $task_scroll = Gtk2::ScrolledWindow->new; @@ -82,7 +82,6 @@ $task_sel->signal_connect(changed => sub { my $iter = $_[0]->get_selected; if ($iter) { $selected_task = $task_store->get($iter, 0); - print "Selected $selected_task\n"; $b_submit->set_sensitive(1); $b_check->set_sensitive(1); } else { @@ -106,11 +105,7 @@ $window->add($vbox); $window->signal_connect("expose-event" => sub { init_refresh(); return 0; }); $window->show_all; -Glib::Timeout->add(5000, \&timed_refresh); -Gtk2->main; -exit 0; - -### ACTIONS ### +### REFRESHING ### my $last_status_id; @@ -149,24 +144,61 @@ sub timed_refresh() } my $task_status_object; -my $task_parts = {}; +my @task_parts = (); +my @task_stat = (); sub recalc_task_list() { - $task_parts = {}; - $task_store->clear; + my @new_tp = (); + my @new_stat = (); foreach my $t ($task_status_object->getarray("(T")) { my $task = $t->get("T"); foreach my $p ($t->getarray("(P")) { my $part = $p->get("P"); - $task_parts->{$task}->{$part} = $p; + my $taskpart = ($task eq $part) ? $task : "$task/$part"; + push @new_tp, $taskpart; my $status = "---"; + my $current_ver = $p->get("V"); + foreach my $v ($p->getarray("(V")) { + if ($v->get("V") == $current_ver) { + my $time = strftime("%H:%M:%S", localtime $v->get("T")); + $status = "OK (" . + "$part." . $v->get("X") . ", " . + $v->get("L") . " bytes, " . + $v->get("S") . " $time)"; + last; + } + } + push @new_stat, $status; + } + } + + if (join("\n", @new_tp) ne join("\n", @task_parts)) { + # The tasks have changed, repopulate the whole structure + $task_store->clear; + my @s = @new_stat; + foreach my $taskpart (@new_tp) { my $iter = $task_store->append; $task_store->set($iter, - 0, $task, - 1, ($task eq $part ? "" : $part), - 2, $status); + 0, $taskpart, + 1, shift @s); } + } else { + # Update the task status + my @s = @task_stat; + my @ns = @new_stat; + $task_store->foreach(sub { + my ($obj, $path, $iter) = @_; + if ($s[0] ne $ns[0]) { + $task_store->set($iter, 1, $ns[0]); + } + shift @s; + shift @ns; + return 0; + }); } + + @task_parts = @new_tp; + @task_stat = @new_stat; } sub refresh($) @@ -200,3 +232,49 @@ sub refresh($) refresh(1); } } + +### SUBMITTING ### + +my $subwin; + +sub end_submit($) { + my ($close) = @_; + # $subwin->signal_emit("delete-event"); +} + +sub submit() { + ## FIXME: Stop the status timer? + $subwin = Gtk2::Window->new('toplevel'); + $subwin->set_modal(1); + $subwin->set_transient_for($window); + $subwin->set_destroy_with_parent(1); + $subwin->set_title("Submit task $selected_task"); + $subwin->set_wmclass("submitter", "Submitter"); + $subwin->signal_connect("delete-event" => sub { end_submit(0) }); + + my $bb_submit = Gtk2::Button->new('Submit'); + $bb_submit->signal_connect(clicked => sub { end_submit(1) }); + #$bb_submit->set_sensitive(0); + + my $bb_cancel = Gtk2::Button->new('Cancel'); + $bb_cancel->signal_connect(clicked => sub { end_submit(1) }); + + my $bbutton_box = Gtk2::HBox->new; + $bbutton_box->pack_start_defaults($bb_submit); + $bbutton_box->pack_start_defaults($bb_cancel); + $bbutton_box->set_border_width(5); + + $subwin->add($bbutton_box); + $subwin->show_all; + + #my $dialog = Gtk2::MessageDialog->new($window, [qw/modal destroy-with-parent/], 'question', 'ok-cancel', "So what?"); + #$dialog->set_default_response("ok"); + #$dialog->signal_connect (response => sub { $_[0]->destroy }); + #$dialog->show_all; +} + +### MAIN ### + +Glib::Timeout->add(5000, \&timed_refresh); +Gtk2->main; +exit 0;