xmpedit

GTK+ editor for XMP metadata embedded in images
git clone https://code.djc.id.au/git/xmpedit/

src/PropertyDetailView.vala (4901B) - raw

      1 /*
      2  * xmpedit
      3  * Copyright 2010 Dan Callaghan <djc@djc.id.au>
      4  * Released under GPLv2
      5  */
      6 
      7 namespace Xmpedit {
      8 
      9 private class DescriptionView : Gtk.Table {
     10 
     11     public Description description { get; construct; }
     12 
     13     public DescriptionView(Description description) {
     14         Object(description: description);
     15     }
     16 
     17     construct {
     18         n_rows = 2;
     19         n_columns = 2;
     20         homogeneous = false;
     21 
     22         var text_view = new Gtk.TextView();
     23         text_view.wrap_mode = Gtk.WrapMode.WORD;
     24 
     25         var label = new Gtk.Label(description.display_name());
     26         label.xalign = 0;
     27         label.mnemonic_widget = text_view;
     28         attach(label,
     29                 0, 1, 0, 1,
     30                 Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND, 0,
     31                 0, 0);
     32         set_row_spacing(0, 4);
     33 
     34         var lang_hbox = new Gtk.HBox(/* homogeneous */ false, /* spacing */ 4);
     35         var lang_entry = new Gtk.Entry(); // XXX make a combo
     36         lang_entry.width_chars = 8;
     37         var lang_label = new Gtk.Label("Language:");
     38         lang_label.xalign = 1;
     39         lang_label.mnemonic_widget = lang_entry;
     40         lang_hbox.add(lang_label);
     41         lang_hbox.add(lang_entry);
     42         attach(lang_hbox,
     43                 1, 2, 0, 1,
     44                 0, 0,
     45                 0, 0);
     46         set_col_spacing(0, 10);
     47 
     48         var text_scrolled = new Gtk.ScrolledWindow(null, null);
     49         text_scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
     50         text_scrolled.shadow_type = Gtk.ShadowType.ETCHED_IN;
     51         text_scrolled.add(text_view);
     52         attach(text_scrolled,
     53                 0, 2, 1, 2,
     54                 Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND, Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND,
     55                 0, 0);
     56 
     57 
     58         text_view.buffer.text = description.value;
     59         lang_entry.text = description.lang;
     60         text_view.buffer.changed.connect(() => {
     61             description.value = text_view.buffer.text;
     62         });
     63         lang_entry.changed.connect(() => {
     64             description.lang = lang_entry.text;
     65         });
     66     }
     67 
     68 }
     69 
     70 private class CustomMap : OsmGpsMap.Map {
     71 
     72     public CustomMap() {
     73         Object(repo_uri: "http://mt#R.google.com/vt/lyrs=m@138&hl=en&x=#X&s=&y=#Y&z=#Z");
     74     }
     75 
     76     construct {
     77         var osd = new OsmGpsMap.Osd();
     78         osd.show_scale = true;
     79         osd.show_coordinates = false;
     80         layer_add(osd);
     81     }
     82 
     83 }
     84 
     85 private class LocationView : Gtk.Table {
     86 
     87     public Location location { get; construct; }
     88 
     89     public LocationView(Location location) {
     90         Object(location: location);
     91     }
     92 
     93     construct {
     94         n_rows = 2;
     95         n_columns = 1;
     96         homogeneous = false;
     97         set_row_spacing(0, 8);
     98 
     99         var map = new CustomMap();
    100         attach(map,
    101                 0, 1, 0, 1,
    102                 Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND,
    103                 Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND,
    104                 0, 0);
    105 
    106         var location_hbox = new Gtk.HBox(/* homogeneous */ false, /* spacing */ 4);
    107         var location_entry = new Gtk.Entry(); // XXX make a combo
    108         //location_entry.width_chars = 8;
    109         var location_label = new Gtk.Label("Location:");
    110         location_label.xalign = 0;
    111         location_label.mnemonic_widget = location_entry;
    112         location_hbox.pack_start(location_label,
    113                 /* expand */ false, /* fill */ false, /* padding */ 0);
    114         location_hbox.pack_start(location_entry,
    115                 /* expand */ true, /* fill */ true, /* padding */ 0);
    116         attach(location_hbox,
    117                 0, 1, 1, 2,
    118                 Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND, 0,
    119                 0, 0);
    120 
    121         location_entry.text = location.location;
    122         location_entry.changed.connect(() => {
    123             location.location = location_entry.text;
    124         });
    125     }
    126 
    127 }
    128 
    129 public class PropertyDetailView : Gtk.Alignment {
    130 
    131     public MetadataTreeView tree_view { get; construct; }
    132 
    133     public PropertyDetailView.connected_to(ImageMetadata image_metadata, MetadataTreeView tree_view) {
    134         Object(tree_view: tree_view);
    135     }
    136 
    137     construct {
    138         set_padding(0, 10, 10, 10);
    139         tree_view.cursor_changed.connect(() => {
    140             Gtk.TreeIter iter;
    141             tree_view.get_selection().get_selected(null, out iter);
    142             Value value;
    143             tree_view.model.get_value(iter, 0, out value);
    144             var p = (ImageProperty) value.get_object();
    145             if (child != null) {
    146                 remove(child);
    147             }
    148             add(construct_view(p));
    149             child.show_all();
    150         });
    151     }
    152 
    153     private static Gtk.Widget construct_view(ImageProperty p) {
    154         if (p is Description)
    155             return new DescriptionView((Description) p);
    156         if (p is Location)
    157             return new LocationView((Location) p);
    158         return_val_if_reached(null);
    159     }
    160 
    161 }
    162 
    163 }