def __init__(self, content_type, specific_file=False): Gtk.Dialog.__init__(self) self.set_title(_(u"Open With…")) self.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) self.add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK) self.set_default_response(Gtk.ResponseType.CANCEL) self.set_response_sensitive(Gtk.ResponseType.OK, False) self.connect("show", self._show_cb) content_box = self.get_content_area() content_box.set_border_width(12) content_box.set_spacing(12) msg_template = self.GENERIC_MSG if specific_file: msg_template = self.SPECIFIC_FILE_MSG msg_text = msg_template.format( content_type=content_type, type_name=Gio.content_type_get_description(content_type), ) msg_label = Gtk.Label(label=msg_text) msg_label.set_single_line_mode(False) msg_label.set_line_wrap(True) msg_label.set_alignment(0.0, 0.5) content_box.pack_start(msg_label, False, False, 0) default_app = Gio.AppInfo.get_default_for_type(content_type, False) default_iter = None app_list_store = Gtk.ListStore(object) apps = Gio.AppInfo.get_all_for_type(content_type) for app in apps: if not app.should_show(): continue row_iter = app_list_store.append([app]) if default_iter is not None: continue if default_app and Gio.AppInfo.equal(app, default_app): default_iter = row_iter # TreeView to show available apps for this content type view = Gtk.TreeView() view.set_model(app_list_store) view.set_headers_clickable(False) view.set_headers_visible(False) view.connect("row-activated", self._row_activated_cb) view_scrolls = Gtk.ScrolledWindow() view_scrolls.set_shadow_type(Gtk.ShadowType.IN) view_scrolls.add(view) view_scrolls.set_size_request(375, 225) content_box.pack_start(view_scrolls, True, True, 0) # Column 0: application icon cell = Gtk.CellRendererPixbuf() col = Gtk.TreeViewColumn(_("Icon"), cell) col.set_cell_data_func(cell, self._app_icon_datafunc) icon_size_ok, icon_w, icon_h = Gtk.icon_size_lookup(self.ICON_SIZE) if icon_size_ok: col.set_min_width(icon_w) col.set_expand(False) col.set_resizable(False) view.append_column(col) # Column 1: application name cell = Gtk.CellRendererText() cell.set_property("ellipsize", Pango.EllipsizeMode.END) cell.set_property("editable", False) col = Gtk.TreeViewColumn(_("Name"), cell) col.set_cell_data_func(cell, self._app_name_datafunc) col.set_expand(True) col.set_min_width(150) view.append_column(col) # Selection: mode and initial value selection = view.get_selection() selection.set_mode(Gtk.SelectionMode.SINGLE) if default_iter: selection.select_iter(default_iter) self.set_default_response(Gtk.ResponseType.OK) self.set_response_sensitive(Gtk.ResponseType.OK, True) selection.connect("changed", self._selection_changed_cb) # Results go here self.selected_appinfo = default_app #: The app the user chose
def __init__(self, docmodel): super(RootStackTreeView, self).__init__() self._docmodel = docmodel treemodel = RootStackTreeModelWrapper(docmodel) self.set_model(treemodel) target1 = Gtk.TargetEntry.new( target="GTK_TREE_MODEL_ROW", flags=Gtk.TargetFlags.SAME_WIDGET, info=1, ) self.drag_source_set( start_button_mask=Gdk.ModifierType.BUTTON1_MASK, targets=[target1], actions=Gdk.DragAction.MOVE, ) self.drag_dest_set( flags=Gtk.DestDefaults.MOTION | Gtk.DestDefaults.DROP, targets=[target1], actions=Gdk.DragAction.MOVE, ) self.connect("button-press-event", self._button_press_cb) # Override the default key event handlers. Unless proper handling of # these events (e.g. navigating the layers list w. the arrow keys) is # implemented, the events should neither be acted upon, nor consumed. GObject.signal_override_class_closure( GObject.signal_lookup("key-press-event", Gtk.Widget), RootStackTreeView, self._key_event_cb) GObject.signal_override_class_closure( GObject.signal_lookup("key-release-event", Gtk.Widget), RootStackTreeView, self._key_event_cb) # Motion and modifier keys during drag self.connect("drag-begin", self._drag_begin_cb) self.connect("drag-motion", self._drag_motion_cb) self.connect("drag-leave", self._drag_leave_cb) self.connect("drag-drop", self._drag_drop_cb) self.connect("drag-end", self._drag_end_cb) # Track updates from the model self._processing_model_updates = False root = docmodel.layer_stack root.current_path_updated += self._current_path_updated_cb root.expand_layer += self._expand_layer_cb root.collapse_layer += self._collapse_layer_cb root.layer_content_changed += self._layer_content_changed_cb root.current_layer_solo_changed += lambda *a: self.queue_draw() # View behaviour and appearance self.set_headers_visible(False) selection = self.get_selection() selection.set_mode(Gtk.SelectionMode.BROWSE) self.set_size_request(150, 200) # Visibility flag column col = Gtk.TreeViewColumn(_("Visible")) col.set_sizing(Gtk.TreeViewColumnSizing.FIXED) self._flags1_col = col # Visibility cell cell = Gtk.CellRendererPixbuf() col.pack_start(cell, False) datafunc = self._layer_visible_pixbuf_datafunc col.set_cell_data_func(cell, datafunc) # Name and preview column: will be indented col = Gtk.TreeViewColumn(_("Name")) col.set_sizing(Gtk.TreeViewColumnSizing.GROW_ONLY) self._name_col = col # Preview cell cell = Gtk.CellRendererPixbuf() col.pack_start(cell, False) datafunc = self._layer_preview_pixbuf_datafunc col.set_cell_data_func(cell, datafunc) self._preview_cell = cell # Name cell cell = Gtk.CellRendererText() cell.set_property("ellipsize", Pango.EllipsizeMode.END) col.pack_start(cell, True) datafunc = self._layer_name_text_datafunc col.set_cell_data_func(cell, datafunc) col.set_expand(True) col.set_min_width(48) # Other flags column col = Gtk.TreeViewColumn(_("Flags")) col.set_sizing(Gtk.TreeViewColumnSizing.GROW_ONLY) area = col.get_property("cell-area") area.set_orientation(Gtk.Orientation.VERTICAL) self._flags2_col = col # Locked cell cell = Gtk.CellRendererPixbuf() col.pack_end(cell, False) datafunc = self._layer_locked_pixbuf_datafunc col.set_cell_data_func(cell, datafunc) # Column order on screen self._columns = [ self._flags1_col, self._name_col, self._flags2_col, ] for col in self._columns: self.append_column(col) # View appearance self.set_show_expanders(True) self.set_enable_tree_lines(True) self.set_expander_column(self._name_col) self.connect_after("show", self._post_show_cb)