448
// utility ------------------
451
private Gtk.Notebook add_notebook(
452
Gtk.Box box, bool show_tabs = true, bool show_border = true){
455
var book = new Gtk.Notebook();
457
book.show_tabs = show_tabs;
458
book.show_border = show_border;
460
box.pack_start(book, true, true, 0);
466
private Gtk.Box add_tab(
467
Gtk.Notebook book, string title, int margin = 6, int spacing = 6){
470
var label = new Gtk.Label(title);
473
var vbox = new Box (Gtk.Orientation.VERTICAL, spacing);
474
vbox.margin = margin;
475
book.append_page (vbox, label);
481
private Gtk.TreeView add_treeview(Gtk.Box box,
482
Gtk.SelectionMode selection_mode = Gtk.SelectionMode.SINGLE){
485
var treeview = new TreeView();
486
treeview.get_selection().mode = selection_mode;
487
treeview.set_rules_hint (true);
488
treeview.show_expanders = true;
489
treeview.enable_tree_lines = true;
492
var scrollwin = new ScrolledWindow(null, null);
493
scrollwin.set_shadow_type (ShadowType.ETCHED_IN);
494
scrollwin.add (treeview);
495
scrollwin.expand = true;
502
private Gtk.TreeViewColumn add_column_text(
503
Gtk.TreeView treeview, string title, out Gtk.CellRendererText cell){
506
var col = new Gtk.TreeViewColumn();
509
cell = new Gtk.CellRendererText();
510
cell.xalign = (float) 0.0;
511
col.pack_start (cell, false);
512
treeview.append_column(col);
518
private Gtk.TreeViewColumn add_column_icon(
519
Gtk.TreeView treeview, string title, out Gtk.CellRendererPixbuf cell){
522
var col = new Gtk.TreeViewColumn();
525
cell = new Gtk.CellRendererPixbuf();
527
col.pack_start (cell, false);
528
treeview.append_column(col);
533
// add_column_icon_and_text
534
private Gtk.TreeViewColumn add_column_icon_and_text(
535
Gtk.TreeView treeview, string title,
536
out Gtk.CellRendererPixbuf cell_pix, out Gtk.CellRendererText cell_text){
539
var col = new Gtk.TreeViewColumn();
542
cell_pix = new Gtk.CellRendererPixbuf();
544
col.pack_start (cell_pix, false);
546
cell_text = new Gtk.CellRendererText();
547
cell_text.xalign = (float) 0.0;
548
col.pack_start (cell_text, false);
549
treeview.append_column(col);
554
// add_column_radio_and_text
555
private Gtk.TreeViewColumn add_column_radio_and_text(
556
Gtk.TreeView treeview, string title,
557
out Gtk.CellRendererToggle cell_radio, out Gtk.CellRendererText cell_text){
560
var col = new Gtk.TreeViewColumn();
563
cell_radio = new Gtk.CellRendererToggle();
565
cell_radio.radio = true;
566
cell_radio.activatable = true;
567
col.pack_start (cell_radio, false);
569
cell_text = new Gtk.CellRendererText();
570
cell_text.xalign = (float) 0.0;
571
col.pack_start (cell_text, false);
572
treeview.append_column(col);
577
// add_column_icon_radio_text
578
private Gtk.TreeViewColumn add_column_icon_radio_text(
579
Gtk.TreeView treeview, string title,
580
out Gtk.CellRendererPixbuf cell_pix,
581
out Gtk.CellRendererToggle cell_radio,
582
out Gtk.CellRendererText cell_text){
585
var col = new Gtk.TreeViewColumn();
588
cell_pix = new Gtk.CellRendererPixbuf();
590
col.pack_start (cell_pix, false);
592
cell_radio = new Gtk.CellRendererToggle();
594
cell_radio.radio = true;
595
cell_radio.activatable = true;
596
col.pack_start (cell_radio, false);
598
cell_text = new Gtk.CellRendererText();
599
cell_text.xalign = (float) 0.0;
600
col.pack_start (cell_text, false);
601
treeview.append_column(col);
606
// add_label_scrolled
607
private Gtk.Label add_label_scrolled(
608
Gtk.Box box, string text,
609
bool show_border = false, bool wrap = false, int ellipsize_chars = 40){
612
var scroll = new Gtk.ScrolledWindow(null, null);
613
scroll.hscrollbar_policy = PolicyType.NEVER;
614
scroll.vscrollbar_policy = PolicyType.ALWAYS;
615
scroll.expand = true;
618
var label = new Gtk.Label(text);
619
label.xalign = (float) 0.0;
620
label.yalign = (float) 0.0;
626
label.wrap_mode = Pango.WrapMode.WORD;
629
if (ellipsize_chars > 0){
631
label.ellipsize = Pango.EllipsizeMode.MIDDLE;
632
label.max_width_chars = ellipsize_chars;
636
scroll.set_shadow_type (ShadowType.ETCHED_IN);
639
label.margin_left = 0;
646
private Gtk.TextView add_text_view(
647
Gtk.Box box, string text){
650
var scrolled = new Gtk.ScrolledWindow(null, null);
651
scrolled.hscrollbar_policy = PolicyType.NEVER;
652
scrolled.vscrollbar_policy = PolicyType.ALWAYS;
653
scrolled.expand = true;
656
var view = new Gtk.TextView();
657
view.wrap_mode = Gtk.WrapMode.WORD_CHAR;
658
view.accepts_tab = false;
659
view.editable = false;
660
view.cursor_visible = false;
661
view.buffer.text = text;
662
view.sensitive = false;
669
private Gtk.Label add_label(
670
Gtk.Box box, string text, bool is_bold = false,
671
bool is_italic = false, bool is_large = false){
673
string msg = "<span%s%s%s>%s</span>".printf(
674
(is_bold ? " weight=\"bold\"" : ""),
675
(is_italic ? " style=\"italic\"" : ""),
676
(is_large ? " size=\"x-large\"" : ""),
679
var label = new Gtk.Label(msg);
680
label.set_use_markup(true);
681
label.xalign = (float) 0.0;
687
private Gtk.Label add_label_header(
688
Gtk.Box box, string text, bool large_heading = false){
690
var label = add_label(box, escape_html(text), true, false, large_heading);
691
label.margin_bottom = 12;
696
private Gtk.Label add_label_subnote(
697
Gtk.Box box, string text){
699
var label = add_label(box, text, false, true);
700
label.margin_left = 6;
705
private Gtk.RadioButton add_radio(
706
Gtk.Box box, string text, Gtk.RadioButton? another_radio_in_group){
708
Gtk.RadioButton radio = null;
710
if (another_radio_in_group == null){
711
radio = new Gtk.RadioButton(null);
714
radio = new Gtk.RadioButton.from_widget(another_radio_in_group);
721
foreach(var child in radio.get_children()){
722
if (child is Gtk.Label){
723
var label = (Gtk.Label) child;
724
label.use_markup = true;
733
private Gtk.CheckButton add_checkbox(
734
Gtk.Box box, string text){
736
var chk = new Gtk.CheckButton.with_label(text);
740
foreach(var child in chk.get_children()){
741
if (child is Gtk.Label){
742
var label = (Gtk.Label) child;
743
label.use_markup = true;
749
chk.toggled.connect(()=>{
758
private Gtk.SpinButton add_spin(
759
Gtk.Box box, double min, double max, double val,
760
int digits = 0, double step = 1, double step_page = 1){
762
var adj = new Gtk.Adjustment(val, min, max, step, step_page, 0);
763
var spin = new Gtk.SpinButton(adj, step, digits);
764
spin.xalign = (float) 0.5;
768
spin.value_changed.connect(()=>{
769
label.sensitive = spin.sensitive;
777
private Gtk.Button add_button(
778
Gtk.Box box, string text, string tooltip,
779
ref Gtk.SizeGroup? size_group,
780
Gtk.Image? icon = null){
782
var button = new Gtk.Button();
785
button.set_label(text);
786
button.set_tooltip_text(tooltip);
789
button.set_image(icon);
790
button.set_always_show_image(true);
793
if (size_group == null){
794
size_group = new Gtk.SizeGroup(SizeGroupMode.HORIZONTAL);
797
size_group.add_widget(button);
803
private Gtk.ToggleButton add_toggle_button(
804
Gtk.Box box, string text, string tooltip,
805
ref Gtk.SizeGroup? size_group,
806
Gtk.Image? icon = null){
808
var button = new Gtk.ToggleButton();
811
button.set_label(text);
812
button.set_tooltip_text(tooltip);
815
button.set_image(icon);
816
button.set_always_show_image(true);
819
if (size_group == null){
820
size_group = new Gtk.SizeGroup(SizeGroupMode.HORIZONTAL);
823
size_group.add_widget(button);
828
// add_directory_chooser
829
private Gtk.Entry add_directory_chooser(
830
Gtk.Box box, string selected_directory, Gtk.Window parent_window){
833
var entry = new Gtk.Entry();
834
entry.hexpand = true;
835
//entry.margin_left = 6;
836
entry.secondary_icon_stock = "gtk-open";
837
entry.placeholder_text = _("Enter path or browse for directory");
840
if ((selected_directory != null) && dir_exists(selected_directory)){
841
entry.text = selected_directory;
844
entry.icon_release.connect((p0, p1) => {
846
var chooser = new Gtk.FileChooserDialog(
849
FileChooserAction.SELECT_FOLDER,
851
Gtk.ResponseType.CANCEL,
853
Gtk.ResponseType.ACCEPT
856
chooser.select_multiple = false;
857
chooser.set_filename(selected_directory);
859
if (chooser.run() == Gtk.ResponseType.ACCEPT) {
860
entry.text = chooser.get_filename();
862
//App.repo = new SnapshotRepo.from_path(entry.text, this);
863
//check_backup_location();