|
|
@ -25,148 +25,6 @@ |
|
|
|
using Gtk; |
|
|
|
using Cairo; |
|
|
|
|
|
|
|
class ControlToolbar : Toolbar { |
|
|
|
private ToolButton prev; |
|
|
|
private Entry entry; |
|
|
|
private ToolButton next; |
|
|
|
private ToolButton notes; |
|
|
|
private ToolButton slides; |
|
|
|
private Label curr_time; |
|
|
|
private Label pres_time; |
|
|
|
private ToolButton config; |
|
|
|
|
|
|
|
private int page = 1; |
|
|
|
private int pages = 0; |
|
|
|
|
|
|
|
private int timestamp1 = 0; |
|
|
|
private int timestamp2 = 0; |
|
|
|
|
|
|
|
public signal void clicked(string button); |
|
|
|
public signal void page_changed(int page); |
|
|
|
|
|
|
|
public ControlToolbar(int n_pages) { |
|
|
|
/* Toolbar Configuration */ |
|
|
|
set_show_arrow(false); |
|
|
|
|
|
|
|
pages = n_pages; |
|
|
|
|
|
|
|
/* Init Toolbar Elements */ |
|
|
|
prev = new ToolButton.from_stock(STOCK_GO_BACK); |
|
|
|
entry = new Entry(); |
|
|
|
entry.set_width_chars(3); |
|
|
|
next = new ToolButton.from_stock(STOCK_GO_FORWARD); |
|
|
|
notes = new ToolButton.from_stock(STOCK_FILE); |
|
|
|
notes.set_label("Notes"); |
|
|
|
slides = new ToolButton.from_stock(STOCK_DIALOG_INFO); |
|
|
|
slides.set_label("Slides"); |
|
|
|
config = new ToolButton.from_stock(STOCK_PREFERENCES); |
|
|
|
curr_time = new Label("Time"); |
|
|
|
pres_time = new Label("Duration"); |
|
|
|
pres_time.set_markup("<b>Duration</b>"); |
|
|
|
|
|
|
|
var separator1 = new SeparatorToolItem(); |
|
|
|
var separator2 = new SeparatorToolItem(); |
|
|
|
|
|
|
|
var entry_container = new ToolItem(); |
|
|
|
entry_container.add(entry); |
|
|
|
|
|
|
|
var vbox_container = new ToolItem(); |
|
|
|
var vbox = new VBox(false, 0); |
|
|
|
vbox.add(curr_time); |
|
|
|
vbox.add(pres_time); |
|
|
|
vbox_container.add(vbox); |
|
|
|
|
|
|
|
/* Fill Toolbar */ |
|
|
|
add(prev); |
|
|
|
add(entry_container); |
|
|
|
add(next); |
|
|
|
add(notes); |
|
|
|
add(slides); |
|
|
|
add(separator1); |
|
|
|
add(vbox_container); |
|
|
|
add(separator2); |
|
|
|
add(config); |
|
|
|
|
|
|
|
update_toolbar(); |
|
|
|
|
|
|
|
/* we don't want focus on a button */ |
|
|
|
entry.grab_focus(); |
|
|
|
|
|
|
|
/* update clock */ |
|
|
|
Timeout.add_seconds(1,update_time); |
|
|
|
timestamp2 = (int) time_t(); |
|
|
|
update_time(); |
|
|
|
|
|
|
|
/* bind button signals */ |
|
|
|
next.clicked.connect(() => {clicked("next");}); |
|
|
|
prev.clicked.connect(() => {clicked("previous");}); |
|
|
|
config.clicked.connect(() => {clicked("config");}); |
|
|
|
|
|
|
|
this.clicked.connect(button_handler); |
|
|
|
entry.key_press_event.connect(entry_handler); |
|
|
|
} |
|
|
|
|
|
|
|
bool entry_handler(Gdk.EventKey event) { |
|
|
|
if(event.keyval == Gdk.keyval_from_name("Return")) { |
|
|
|
int new_page = entry.get_text().to_int(); |
|
|
|
if(page < 1) page = 1; |
|
|
|
if(page > pages) page = pages; |
|
|
|
set_page(new_page); |
|
|
|
page_changed(new_page-1); |
|
|
|
return true; |
|
|
|
} |
|
|
|
if(event.keyval < '0' || event.keyval > '9' && event.keyval != Gdk.keyval_from_name("BackSpace")) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
void button_handler(string btn) { |
|
|
|
if(btn == "next") |
|
|
|
set_page(page+1); |
|
|
|
if(btn == "previous") |
|
|
|
set_page(page-1); |
|
|
|
|
|
|
|
page_changed(page-1); |
|
|
|
} |
|
|
|
|
|
|
|
string int2time(int timestamp, bool local=false) { |
|
|
|
Time t; |
|
|
|
|
|
|
|
if(local) |
|
|
|
t = Time.local((time_t) timestamp); |
|
|
|
else |
|
|
|
t = Time.gm((time_t) timestamp); |
|
|
|
|
|
|
|
return "%02d:%02d:%02d".printf(t.hour, t.minute, t.second); |
|
|
|
} |
|
|
|
|
|
|
|
private bool update_time() { |
|
|
|
timestamp1++; |
|
|
|
timestamp2++; |
|
|
|
|
|
|
|
pres_time.set_markup("<b>"+int2time(timestamp1)+"</b>"); |
|
|
|
curr_time.set_text(int2time(timestamp2,true)); |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
private void update_toolbar() { |
|
|
|
if(page <= 1) prev.set_sensitive(false); |
|
|
|
else prev.set_sensitive(true); |
|
|
|
|
|
|
|
if(page >= pages) next.set_sensitive(false); |
|
|
|
else next.set_sensitive(true); |
|
|
|
|
|
|
|
entry.set_text("%d".printf(page)); |
|
|
|
} |
|
|
|
|
|
|
|
public void set_page(int n) { |
|
|
|
page = n; |
|
|
|
update_toolbar(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
class ControlView : DrawingArea { |
|
|
|
Poppler.Document document; |
|
|
|
int page = 0; |
|
|
@ -212,7 +70,10 @@ class ControlView : DrawingArea { |
|
|
|
width = (int) width2; |
|
|
|
height = (int) height2; |
|
|
|
|
|
|
|
get_parent_window().get_size(out window_w, out window_h); |
|
|
|
Gtk.Allocation rect = Gtk.Allocation(); |
|
|
|
get_allocation(rect); |
|
|
|
window_w = rect.width; |
|
|
|
window_h = rect.height; |
|
|
|
|
|
|
|
double wf = (window_w * 11/20) / width2; |
|
|
|
double hf = (window_h * 7/10) / height2; |
|
|
@ -237,7 +98,11 @@ class ControlView : DrawingArea { |
|
|
|
int y = y_diff + 25; // 25px below of the last item |
|
|
|
int w,h; |
|
|
|
|
|
|
|
get_parent_window().get_size(out w, out h); |
|
|
|
Gtk.Allocation rect = Gtk.Allocation(); |
|
|
|
get_allocation(rect); |
|
|
|
w = rect.width; |
|
|
|
h = rect.height; |
|
|
|
|
|
|
|
w -= x + 25; // 25px from the right window border |
|
|
|
|
|
|
|
if((n > page && n < pages) || (n < page && n >= 0)) { |
|
|
@ -305,18 +170,21 @@ class ControlView : DrawingArea { |
|
|
|
|
|
|
|
class ControlWindow : Window { |
|
|
|
public void button_clicked(string btn) { |
|
|
|
if(btn != "next" && btn != "previous") |
|
|
|
if(btn == "config") |
|
|
|
new ConfigWindow(); |
|
|
|
else if(btn != "next" && btn != "previous") |
|
|
|
message("%s clicked!", btn); |
|
|
|
} |
|
|
|
|
|
|
|
public signal void page_changed(int page); |
|
|
|
|
|
|
|
public ControlWindow(Poppler.Document document) { |
|
|
|
this.title = "PDF Presentator (Control)"; |
|
|
|
this.position = WindowPosition.CENTER; |
|
|
|
this.destroy.connect(Gtk.main_quit); |
|
|
|
title = "PDF Presentator (Control)"; |
|
|
|
position = WindowPosition.CENTER; |
|
|
|
destroy.connect(Gtk.main_quit); |
|
|
|
set_default_size(800, 600); |
|
|
|
var vbox = new VBox(false, 0); |
|
|
|
var hpaned = new HPaned(); |
|
|
|
|
|
|
|
var drawingarea = new ControlView(document); |
|
|
|
|
|
|
@ -324,7 +192,10 @@ class ControlWindow : Window { |
|
|
|
var toolbar = new ControlToolbar(document.get_n_pages()); |
|
|
|
aspect.add(toolbar); |
|
|
|
|
|
|
|
vbox.pack_start(drawingarea, true, true, 0); |
|
|
|
hpaned.pack1(drawingarea, true, false); |
|
|
|
hpaned.pack2(new TextView(), false, true); |
|
|
|
|
|
|
|
vbox.pack_start(hpaned, true, true, 0); |
|
|
|
vbox.pack_start(aspect, false, true, 0); |
|
|
|
|
|
|
|
add(vbox); |
|
|
|