use MO::Submit;
use Sherlock::Object;
+use POSIX;
use Gtk2 -init;
my $conn = new MO::Submit;
sub init_refresh();
sub timed_refresh();
sub refresh($);
+sub submit();
my $busy_cursor = Gtk2::Gdk::Cursor->new('watch');
$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;
# 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');
$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;
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 {
$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;
}
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($)
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;