Ejemplo n.º 1
0
	def __init__(self, plugin):
		Dialog.__init__(self, plugin.ui, _('Calendar'), buttons=None) # T: dialog title
		self.set_resizable(False)
		self.plugin = plugin

		self.calendar_widget = CalendarPluginWidget(plugin)
		self.vbox.add(self.calendar_widget)

		hbox = gtk.HBox()
		self.vbox.add(hbox)
		button = Button(_('_Today'), gtk.STOCK_JUMP_TO) # T: button label
		button.connect('clicked',
			lambda o: self.calendar_widget.select_date(dateclass.today()))
		hbox.pack_end(button, False)
    def __init__(self, ui):
        Dialog.__init__(self,
                        ui,
                        _('Templates'),
                        help='Help:Templates',
                        buttons=gtk.BUTTONS_CLOSE,
                        defaultwindowsize=(400, 450))
        # T: Dialog title

        label = gtk.Label()
        label.set_markup('<b>' + _('Templates') + '</b>')
        # T: Section in dialog
        label.set_alignment(0.0, 0.5)
        self.vbox.pack_start(label, False)

        hbox = gtk.HBox()
        self.vbox.add(hbox)

        self.view = TemplateListView()
        self.view.connect('row-activated', self.on_selection_changed)
        hbox.add(ScrolledWindow(self.view))

        vbbox = gtk.VButtonBox()
        vbbox.set_layout(gtk.BUTTONBOX_START)
        hbox.pack_start(vbbox, False)

        view_button = Button(stock='gtk-file',
                             label=_('_View'))  # T: button label
        view_button.connect('clicked', self.on_view)

        copy_button = Button(stock='gtk-copy')
        copy_button.connect('clicked', self.on_copy)

        edit_button = Button(stock='gtk-edit')
        edit_button.connect('clicked', self.on_edit)

        delete_button = gtk.Button(stock='gtk-remove')
        delete_button.connect('clicked', self.on_delete)

        for b in (view_button, copy_button, edit_button, delete_button):
            b.set_alignment(0.0, 0.5)
            vbbox.add(b)

        browse_button = Button(_('Browse'))  # T: button label
        browse_button.connect('clicked', self.on_browse)
        self.add_extra_button(browse_button)

        self._buttonbox = vbbox
        self._delete_button = delete_button
        self.on_selection_changed()

        ## Same button appears in export dialog
        if gtk.gtk_version >= (2, 10) \
        and gtk.pygtk_version >= (2, 10):
            url_button = gtk.LinkButton(
                'http://zim-wiki.org/more_templates.html',
                _('Get more templates online')  # T: label for button with URL
            )
            self.vbox.pack_start(url_button, False)
Ejemplo n.º 3
0
	def __init__(self, plugin):
		Dialog.__init__(self, plugin.ui, _('Calendar'), buttons=gtk.BUTTONS_CLOSE) # T: dialog title
		self.set_resizable(False)
		self.plugin = plugin

		self.calendar_widget = CalendarPluginWidget(plugin)
		self.calendar_widget.set_select_date_callback(self.on_select_date)
		self.vbox.add(self.calendar_widget)

		button = Button(_('_Today'), gtk.STOCK_JUMP_TO) # T: button label
		button.connect('clicked', self.do_today )
		self.action_area.add(button)
		self.action_area.reorder_child(button, 0)
		self.dateshown = datetime.date.today()

		self.connectto(self.plugin.ui, 'open-page')
	def __init__(self, ui):
		Dialog.__init__(self, ui,
			_('Templates'), help='Help:Templates', buttons=gtk.BUTTONS_CLOSE,
			defaultwindowsize=(400, 450))
			# T: Dialog title

		label = gtk.Label()
		label.set_markup('<b>'+_('Templates')+'</b>')
			# T: Section in dialog
		label.set_alignment(0.0, 0.5)
		self.vbox.pack_start(label, False)

		hbox = gtk.HBox()
		self.vbox.add(hbox)

		self.view = TemplateListView()
		self.view.connect('row-activated', self.on_selection_changed)
		hbox.add(ScrolledWindow(self.view))

		vbbox = gtk.VButtonBox()
		vbbox.set_layout(gtk.BUTTONBOX_START)
		hbox.pack_start(vbbox, False)

		view_button = Button(stock='gtk-file', label=_('_View')) # T: button label
		view_button.connect('clicked', self.on_view)

		copy_button = Button(stock='gtk-copy')
		copy_button.connect('clicked', self.on_copy)

		edit_button = Button(stock='gtk-edit')
		edit_button.connect('clicked', self.on_edit)

		delete_button = gtk.Button(stock='gtk-remove')
		delete_button.connect('clicked', self.on_delete)

		for b in (view_button, copy_button, edit_button, delete_button):
			b.set_alignment(0.0, 0.5)
			vbbox.add(b)

		browse_button = Button(_('Browse')) # T: button label
		browse_button.connect('clicked', self.on_browse)
		self.add_extra_button(browse_button)

		self._buttonbox = vbbox
		self._delete_button = delete_button
		self.on_selection_changed()

		## Same button appears in export dialog
		if gtk.gtk_version >= (2, 10) \
		and gtk.pygtk_version >= (2, 10):
			url_button = gtk.LinkButton(
				'https://github.com/jaap-karssenberg/zim-wiki/wiki/Templates',
				_('Get more templates online') # T: label for button with URL
			)
			self.vbox.pack_start(url_button, False)
Ejemplo n.º 5
0
	def __init__(self, plugin, window):
		Dialog.__init__(self, window, _('Calendar'), buttons=gtk.BUTTONS_CLOSE) # T: dialog title
		self.set_resizable(False)
		self.plugin = plugin
		self.opener = window.get_resource_opener()

		notebook = window.ui.notebook # XXX
		model = CalendarWidgetModel(self.plugin, notebook)
		self.calendar_widget = CalendarWidget(model)
		self.vbox.add(self.calendar_widget)

		button = Button(_('_Today'), gtk.STOCK_JUMP_TO) # T: button label
		button.connect('clicked', self.do_today )
		self.action_area.add(button)
		self.action_area.reorder_child(button, 0)
		self.dateshown = datetime.date.today()

		self.connectto(self.calendar_widget, 'date-activated')
		self.connectto(window.ui, 'open-page') # XXX
Ejemplo n.º 6
0
    def __init__(self, ui):
        Dialog.__init__(self,
                        ui,
                        _('Templates'),
                        help='Help:Templates',
                        buttons=gtk.BUTTONS_CLOSE,
                        defaultwindowsize=(400, 450))
        # T: Dialog title

        label = gtk.Label()
        label.set_markup('<b>' + _('Templates') + '</b>')
        # T: Section in dialog
        label.set_alignment(0.0, 0.5)
        self.vbox.pack_start(label, False)

        hbox = gtk.HBox()
        self.vbox.add(hbox)

        self.view = TemplateListView()
        self.view.connect('row-activated', self.on_selection_changed)
        hbox.add(ScrolledWindow(self.view))

        vbbox = gtk.VButtonBox()
        vbbox.set_layout(gtk.BUTTONBOX_START)
        hbox.pack_start(vbbox, False)

        view_button = Button(stock='gtk-file',
                             label=_('_View'))  # T: button label
        view_button.connect('clicked', self.on_view)

        copy_button = Button(stock='gtk-copy')
        copy_button.connect('clicked', self.on_copy)

        edit_button = Button(stock='gtk-edit')
        edit_button.connect('clicked', self.on_edit)

        delete_button = gtk.Button(stock='gtk-remove')
        delete_button.connect('clicked', self.on_delete)

        for b in (view_button, copy_button, edit_button, delete_button):
            b.set_alignment(0.0, 0.5)
            vbbox.add(b)

        browse_button = Button(_('Browse'))  # T: button label
        browse_button.connect('clicked', self.on_browse)
        self.add_extra_button(browse_button)

        self._buttonbox = vbbox
        self._delete_button = delete_button
        self.on_selection_changed()
Ejemplo n.º 7
0
	def __init__(self, ui):
		Dialog.__init__(self, ui,
			_('Templates'), help='Help:Templates', buttons=gtk.BUTTONS_CLOSE,
			defaultwindowsize=(400, 450))
			# T: Dialog title

		label = gtk.Label()
		label.set_markup('<b>'+_('Templates')+'</b>')
			# T: Section in dialog
		label.set_alignment(0.0, 0.5)
		self.vbox.pack_start(label, False)

		hbox = gtk.HBox()
		self.vbox.add(hbox)

		self.view = TemplateListView()
		self.view.connect('row-activated', self.on_selection_changed)
		hbox.add(ScrolledWindow(self.view))

		vbbox = gtk.VButtonBox()
		vbbox.set_layout(gtk.BUTTONBOX_START)
		hbox.pack_start(vbbox, False)

		view_button = Button(stock='gtk-file', label=_('_View')) # T: button label
		view_button.connect('clicked', self.on_view)

		copy_button = Button(stock='gtk-copy')
		copy_button.connect('clicked', self.on_copy)

		edit_button = Button(stock='gtk-edit')
		edit_button.connect('clicked', self.on_edit)

		delete_button = gtk.Button(stock='gtk-remove')
		delete_button.connect('clicked', self.on_delete)

		for b in (view_button, copy_button, edit_button, delete_button):
			b.set_alignment(0.0, 0.5)
			vbbox.add(b)

		browse_button = Button(_('Browse')) # T: button label
		browse_button.connect('clicked', self.on_browse)
		self.add_extra_button(browse_button)

		self._buttonbox = vbbox
		self._delete_button = delete_button
		self.on_selection_changed()
Ejemplo n.º 8
0
class PluginsTab(gtk.VBox):
    def __init__(self, dialog, plugins):
        gtk.VBox.__init__(self, spacing=5)
        self.dialog = dialog
        self.plugins = plugins

        self.hbox = gtk.HBox(self, spacing=12)
        self.hbox.set_border_width(5)
        self.add(self.hbox)

        #~ logger.debug('Plugins that are loaded: %s' % list(plugins))

        self.treeview = PluginsTreeView(self.plugins)
        self.treeselection = self.treeview.get_selection()
        self.treeselection.connect('changed', self.do_selection_changed)
        swindow = ScrolledWindow(self.treeview, hpolicy=gtk.POLICY_NEVER)
        self.hbox.pack_start(swindow, False)

        vbox = gtk.VBox()
        self.hbox.add(vbox)

        # Textview with scrollbars to show plugins info. Required by small screen devices
        swindow, textview = ScrolledTextView()
        textview.set_cursor_visible(False)
        self.textbuffer = textview.get_buffer()
        self.textbuffer.create_tag('bold', weight=pango.WEIGHT_BOLD)
        self.textbuffer.create_tag('red', foreground='#FF0000')
        vbox.pack_start(swindow, True)

        hbox = gtk.HBox(spacing=5)
        vbox.pack_end(hbox, False)

        self.plugin_help_button = \
         Button(stock=gtk.STOCK_HELP, label=_('_More')) # T: Button in plugin tab
        self.plugin_help_button.connect('clicked', self.on_help_button_clicked)
        hbox.pack_start(self.plugin_help_button, False)

        self.configure_button = \
         Button(stock=gtk.STOCK_PREFERENCES, label=_('C_onfigure')) # T: Button in plugin tab
        self.configure_button.connect('clicked',
                                      self.on_configure_button_clicked)
        hbox.pack_start(self.configure_button, False)

        try:
            self.treeselection.select_path(0)
        except:
            pass  # maybe loading plugins failed

        ## Add buttons to get and install new plugins
        hbox = gtk.HButtonBox()
        hbox.set_border_width(5)
        hbox.set_layout(gtk.BUTTONBOX_START)
        self.pack_start(hbox, False)

        assert hasattr(self.dialog, 'ui')
        open_button = gtk.Button(label=_('Open plugins folder'))
        open_button.connect('clicked',
                            lambda o: self.dialog.ui.open_dir(PLUGIN_FOLDER))
        hbox.pack_start(open_button, False)

        if gtk.gtk_version >= (2, 10) \
        and gtk.pygtk_version >= (2, 10):
            url_button = gtk.LinkButton(
                'http://zim-wiki.org/more_plugins.html',
                _('Get more plugins online')  # T: label for button with URL
            )
            hbox.pack_start(url_button, False)

    def do_selection_changed(self, selection):
        treeview = selection.get_tree_view()
        selected = selection.get_selected()
        path = selected[0].get_path(selected[1])

        key, active, activatable, name, klass = treeview.get_model()[path]

        self._current_plugin = key
        logger.debug('Loading description for plugin: %s', key)

        # Insert plugin info into textview with proper formatting
        # TODO use our own widget with formatted text here...
        buffer = self.textbuffer

        def insert(text, style=None):
            if style:
                buffer.insert_with_tags_by_name(buffer.get_end_iter(), text,
                                                style)
            else:
                buffer.insert_at_cursor(text)

        buffer.delete(*buffer.get_bounds())  # clear
        insert(_('Name') + '\n',
               'bold')  # T: Heading in plugins tab of preferences dialog
        insert(klass.plugin_info['name'].strip() + '\n\n')
        insert(_('Description') + '\n',
               'bold')  # T: Heading in plugins tab of preferences dialog
        insert(klass.plugin_info['description'].strip() + '\n\n')
        insert(_('Dependencies') + '\n',
               'bold')  # T: Heading in plugins tab of preferences dialog

        check, dependencies = klass.check_dependencies()
        if not (dependencies):
            insert(_('No dependencies') +
                   '\n')  # T: label in plugin info in preferences dialog
        else:
            # Construct dependency list, missing dependencies are marked red
            for dependency in dependencies:
                text, ok, required = dependency
                if ok:
                    insert(u'\u2022 %s - %s\n' %
                           (text, _('OK')))  # T: dependency is OK
                elif required:
                    insert(u'\u2022 %s - %s\n' % (text, _('Failed')),
                           'red')  # T: dependency failed
                else:
                    insert(u'\u2022 %s - %s (%s)\n' % (
                        text,
                        _('Failed'),  # T: dependency failed
                        _('Optional')  # T: optional dependency
                    ))
        insert('\n')

        insert(_('Author') + '\n',
               'bold')  # T: Heading in plugins tab of preferences dialog
        insert(klass.plugin_info['author'].strip())

        self.configure_button.set_sensitive(active
                                            and bool(klass.plugin_preferences))
        self.plugin_help_button.set_sensitive('help' in klass.plugin_info)

    def on_help_button_clicked(self, button):
        klass = self.plugins.get_plugin_class(self._current_plugin)
        self.dialog.ui.show_help(klass.plugin_info['help'])  # XXX

    def on_configure_button_clicked(self, button):
        plugin = self.plugins[self._current_plugin]
        PluginConfigureDialog(self.dialog, plugin).run()

    def select_plugin(self, name):
        model = self.treeview.get_model()

        def find(model, path, iter):
            if model[iter][2] == name:
                self.treeview.scroll_to_cell(path)
                self.treeview.set_cursor(path)
                self.do_selection_changed(self.treeselection, 0)
                return True
            return False  # keep the foreach going

        model.foreach(find)
Ejemplo n.º 9
0
class PluginsTab(gtk.HBox):

	# TODO defined checks for plugin dependencies and grey them out here if
	# the check fails - or give an error popup with the result of the check

	def __init__(self, dialog):
		gtk.HBox.__init__(self, spacing=12)
		self.set_border_width(5)
		self.dialog = dialog

		treeview = PluginsTreeView(self.dialog.ui)
		treeview.connect('row-activated', self.do_row_activated)
		swindow = gtk.ScrolledWindow()
		swindow.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
		swindow.set_shadow_type(gtk.SHADOW_IN)
		self.pack_start(swindow, False)
		swindow.add(treeview)

		vbox = gtk.VBox()
		self.add(vbox)

		def heading(text):
			label = gtk.Label()
			label.set_markup('<b>%s</b>' % text)
			label.set_alignment(0.0, 0.5)
			return label

		vbox.pack_start(heading(_('Name')), False)
			# T: Heading in plugins tab of preferences dialog
		self.name_label = gtk.Label()
		self.name_label.set_alignment(0.0, 0.5)
		vbox.pack_start(self.name_label, False)
		vbox.pack_start(heading('\n'+_('Description')), False)
			# T: Heading in plugins tab of preferences dialog
		self.description_label = gtk.Label()
		self.description_label.set_alignment(0.0, 0.5)
		vbox.pack_start(self.description_label, False) # FIXME run through plain format to make links
		vbox.pack_start(heading('\n'+_('Author')), False)
			# T: Heading in plugins tab of preferences dialog
		self.author_label= gtk.Label()
		self.author_label.set_alignment(0.0, 0.5)
		vbox.pack_start(self.author_label, False) # FIXME idem

		hbox = gtk.HBox(spacing=5)
		vbox.pack_end(hbox, False)

		self.plugin_help_button = \
			Button(stock=gtk.STOCK_HELP, label=_('_More')) # T: Button in plugin tab
		self.plugin_help_button.connect('clicked', self.on_help_button_clicked)
		hbox.pack_start(self.plugin_help_button, False)

		self.configure_button = \
			Button(stock=gtk.STOCK_PREFERENCES, label=_('C_onfigure')) # T: Button in plugin tab
		self.configure_button.connect('clicked', self.on_configure_button_clicked)
		hbox.pack_start(self.configure_button, False)

		self.do_row_activated(treeview, (0,), 0)

	def do_row_activated(self, treeview, path, col):
		active = treeview.get_model()[path][0]
		klass = treeview.get_model()[path][2]
		self._klass = klass
		self.name_label.set_text(klass.plugin_info['name'].strip())
		self.description_label.set_text(klass.plugin_info['description'].strip())
		self.author_label.set_text(klass.plugin_info['author'].strip() + '\n')
		self.configure_button.set_sensitive(active and bool(klass.plugin_preferences))
		self.plugin_help_button.set_sensitive('help' in klass.plugin_info)

	def on_help_button_clicked(self, button):
		self.dialog.ui.show_help(self._klass.plugin_info['help'])

	def on_configure_button_clicked(self, button):
		PluginConfigureDialog(self.dialog, self._klass).run()
Ejemplo n.º 10
0
class PluginsTab(gtk.VBox):

	def __init__(self, dialog, plugins):
		gtk.VBox.__init__(self, spacing=5)
		self.dialog = dialog
		self.plugins = plugins

		self.hbox = gtk.HBox(self, spacing=12)
		self.hbox.set_border_width(5)
		self.add(self.hbox)

		#~ logger.debug('Plugins that are loaded: %s' % list(plugins))

		self.treeview = PluginsTreeView(self.plugins)
		self.treeview.connect('row-activated', self.do_row_activated)
		swindow = ScrolledWindow(self.treeview, hpolicy=gtk.POLICY_NEVER)
		self.hbox.pack_start(swindow, False)

		vbox = gtk.VBox()
		self.hbox.add(vbox)

		# Textview with scrollbars to show plugins info. Required by small screen devices
		swindow, textview = ScrolledTextView()
		textview.set_cursor_visible(False)
		self.textbuffer = textview.get_buffer()
		self.textbuffer.create_tag('bold', weight=pango.WEIGHT_BOLD)
		self.textbuffer.create_tag('red', foreground='#FF0000')
		vbox.pack_start(swindow, True)

		hbox = gtk.HBox(spacing=5)
		vbox.pack_end(hbox, False)

		self.plugin_help_button = \
			Button(stock=gtk.STOCK_HELP, label=_('_More')) # T: Button in plugin tab
		self.plugin_help_button.connect('clicked', self.on_help_button_clicked)
		hbox.pack_start(self.plugin_help_button, False)

		self.configure_button = \
			Button(stock=gtk.STOCK_PREFERENCES, label=_('C_onfigure')) # T: Button in plugin tab
		self.configure_button.connect('clicked', self.on_configure_button_clicked)
		hbox.pack_start(self.configure_button, False)

		try:
			self.do_row_activated(self.treeview, (0,), 0)
		except:
			pass # maybe loading plugins failed

		if gtk.gtk_version >= (2, 10) \
		and gtk.pygtk_version >= (2, 10):
			url_button = gtk.LinkButton(
				'https://github.com/jaap-karssenberg/zim-wiki/wiki/Plugins',
				_('Get more plugins online') # T: label for button with URL
			)
			self.pack_start(url_button, False)

	def do_row_activated(self, treeview, path, col):
		key, active, activatable, name, klass = treeview.get_model()[path]

		self._current_plugin = key
		logger.debug('Loading description for plugin: %s', key)

		# Insert plugin info into textview with proper formatting
		# TODO use our own widget with formatted text here...
		buffer = self.textbuffer
		def insert(text, style=None):
			if style:
				buffer.insert_with_tags_by_name(
					buffer.get_end_iter(), text, style)
			else:
				buffer.insert_at_cursor(text)

		buffer.delete(*buffer.get_bounds()) # clear
		insert(_('Name') + '\n', 'bold') # T: Heading in plugins tab of preferences dialog
		insert(klass.plugin_info['name'].strip() + '\n\n')
		insert(_('Description') + '\n', 'bold') # T: Heading in plugins tab of preferences dialog
		insert(klass.plugin_info['description'].strip() + '\n\n')
		insert(_('Dependencies') + '\n', 'bold') # T: Heading in plugins tab of preferences dialog

		check, dependencies = klass.check_dependencies()
		if not(dependencies):
			insert(_('No dependencies') + '\n') # T: label in plugin info in preferences dialog
		else:
			# Construct dependency list, missing dependencies are marked red
			for dependency in dependencies:
				text, ok, required = dependency
				if ok:
					insert(u'\u2022 %s - %s\n' % (text, _('OK'))) # T: dependency is OK
				elif required:
					insert(u'\u2022 %s - %s\n' % (text, _('Failed')), 'red') # T: dependency failed
				else:
					insert(u'\u2022 %s - %s (%s)\n' % (text,
						_('Failed'), # T: dependency failed
						_('Optional') # T: optional dependency
					) )
		insert('\n')

		insert(_('Author') + '\n', 'bold') # T: Heading in plugins tab of preferences dialog
		insert(klass.plugin_info['author'].strip())

		self.configure_button.set_sensitive(active and bool(klass.plugin_preferences))
		self.plugin_help_button.set_sensitive('help' in klass.plugin_info)

	def on_help_button_clicked(self, button):
		klass = self.plugins.get_plugin_class(self._current_plugin)
		self.dialog.ui.show_help(klass.plugin_info['help']) # XXX

	def on_configure_button_clicked(self, button):
		plugin = self.plugins[self._current_plugin]
		PluginConfigureDialog(self.dialog, plugin).run()

	def select_plugin(self, name):
		model = self.treeview.get_model()
		def find(model, path, iter):
			if model[iter][2] == name:
				self.treeview.scroll_to_cell(path)
				self.treeview.set_cursor(path)
				self.do_row_activated(self.treeview, path, 0)
				return True;
			return False # keep the foreach going
		model.foreach(find)
Ejemplo n.º 11
0
class PluginsTab(gtk.HBox):

    def __init__(self, dialog):
        gtk.HBox.__init__(self, spacing=12)
        self.set_border_width(5)
        self.dialog = dialog

        treeview = PluginsTreeView(self.dialog.ui)
        treeview.connect('row-activated', self.do_row_activated)
        swindow = ScrolledWindow(treeview, hpolicy=gtk.POLICY_NEVER)
        self.pack_start(swindow, False)

        vbox = gtk.VBox()
        self.add(vbox)

        # Textview with scrollbars to show plugins info. Required by small screen devices
        swindow, textview = ScrolledTextView()
        textview.set_cursor_visible(False)
        self.textbuffer = textview.get_buffer()
        self.textbuffer.create_tag('bold', weight=pango.WEIGHT_BOLD)
        self.textbuffer.create_tag('red', foreground='#FF0000')
        vbox.pack_start(swindow, True)

        hbox = gtk.HBox(spacing=5)
        vbox.pack_end(hbox, False)

        self.plugin_help_button = \
            Button(stock=gtk.STOCK_HELP, label=_('_More')) # T: Button in plugin tab
        self.plugin_help_button.connect('clicked', self.on_help_button_clicked)
        hbox.pack_start(self.plugin_help_button, False)

        self.configure_button = \
            Button(stock=gtk.STOCK_PREFERENCES, label=_('C_onfigure')) # T: Button in plugin tab
        self.configure_button.connect('clicked', self.on_configure_button_clicked)
        hbox.pack_start(self.configure_button, False)

        self.do_row_activated(treeview, (0,), 0)

    def do_row_activated(self, treeview, path, col):
        active = treeview.get_model()[path][0]
        name = treeview.get_model()[path][2]
        klass = treeview.get_model()[path][3]
        self._klass = klass
        logger.debug('Loading description for "%s"', name)

        # Insert plugin info into textview with proper formatting
        self.textbuffer.delete(*self.textbuffer.get_bounds()) # clear
        self.textbuffer.insert_with_tags_by_name(
            self.textbuffer.get_end_iter(),
            _('Name') + '\n', 'bold') # T: Heading in plugins tab of preferences dialog
        self.textbuffer.insert(
            self.textbuffer.get_end_iter(),
            klass.plugin_info['name'].strip() + '\n\n')
        self.textbuffer.insert_with_tags_by_name(
            self.textbuffer.get_end_iter(),
            _('Description') + '\n', 'bold') # T: Heading in plugins tab of preferences dialog
        self.textbuffer.insert(
            self.textbuffer.get_end_iter(),
            klass.plugin_info['description'].strip() + '\n\n')
        self.textbuffer.insert_with_tags_by_name(
            self.textbuffer.get_end_iter(),
            _('Dependencies') + '\n', 'bold') # T: Heading in plugins tab of preferences dialog

        # Construct dependency list, missing dependencies are marked red
        check, dependencies = klass.check_dependencies()
        if not(dependencies):
            self.textbuffer.insert(
                self.textbuffer.get_end_iter(),
                _('No dependencies') + '\n') # T: label in plugin info in preferences dialog
        else:
            for dependency in dependencies:
                text, ok, required = dependency
                if ok:
                    self.textbuffer.insert(
                        self.textbuffer.get_end_iter(),
                        u'\u2022 ' + text + ' - ' + _('OK') + '\n') # T: dependency is OK
                elif required:
                    self.textbuffer.insert_with_tags_by_name(
                        self.textbuffer.get_end_iter(),
                        u'\u2022 ' + text +' - ' + _('Failed') + '\n', 'red') # T: dependency failed
                else:
                    self.textbuffer.insert(
                        self.textbuffer.get_end_iter(),
                        u'\u2022 ' + text +' - ' + _('Failed') # T: dependency failed
                            + ' ' + _('Optional') + '\n') # T: optional dependency

        self.textbuffer.insert_with_tags_by_name(
            self.textbuffer.get_end_iter(),
            '\n' + _('Author') + '\n', 'bold') # T: Heading in plugins tab of preferences dialog
        self.textbuffer.insert(
            self.textbuffer.get_end_iter(),
            klass.plugin_info['author'].strip())

        self.configure_button.set_sensitive(active and bool(klass.plugin_preferences))
        self.plugin_help_button.set_sensitive('help' in klass.plugin_info)

    def on_help_button_clicked(self, button):
        self.dialog.ui.show_help(self._klass.plugin_info['help'])

    def on_configure_button_clicked(self, button):
        PluginConfigureDialog(self.dialog, self._klass).run()
Ejemplo n.º 12
0
class PluginsTab(gtk.HBox):
    def __init__(self, dialog, plugins):
        gtk.HBox.__init__(self, spacing=12)
        self.set_border_width(5)
        self.dialog = dialog
        self.plugins = plugins

        #~ logger.debug('Plugins that are loaded: %s' % list(plugins))

        self.treeview = PluginsTreeView(self.plugins)
        self.treeview.connect('row-activated', self.do_row_activated)
        swindow = ScrolledWindow(self.treeview, hpolicy=gtk.POLICY_NEVER)
        self.pack_start(swindow, False)

        vbox = gtk.VBox()
        self.add(vbox)

        # Textview with scrollbars to show plugins info. Required by small screen devices
        swindow, textview = ScrolledTextView()
        textview.set_cursor_visible(False)
        self.textbuffer = textview.get_buffer()
        self.textbuffer.create_tag('bold', weight=pango.WEIGHT_BOLD)
        self.textbuffer.create_tag('red', foreground='#FF0000')
        vbox.pack_start(swindow, True)

        hbox = gtk.HBox(spacing=5)
        vbox.pack_end(hbox, False)

        self.plugin_help_button = \
         Button(stock=gtk.STOCK_HELP, label=_('_More')) # T: Button in plugin tab
        self.plugin_help_button.connect('clicked', self.on_help_button_clicked)
        hbox.pack_start(self.plugin_help_button, False)

        self.configure_button = \
         Button(stock=gtk.STOCK_PREFERENCES, label=_('C_onfigure')) # T: Button in plugin tab
        self.configure_button.connect('clicked',
                                      self.on_configure_button_clicked)
        hbox.pack_start(self.configure_button, False)

        self.do_row_activated(self.treeview, (0, ), 0)

    def do_row_activated(self, treeview, path, col):
        key, active, activatable, name, klass = treeview.get_model()[path]

        self._current_plugin = key
        logger.debug('Loading description for plugin: %s', key)

        # Insert plugin info into textview with proper formatting
        # TODO use our own widget with formatted text here...
        buffer = self.textbuffer

        def insert(text, style=None):
            if style:
                buffer.insert_with_tags_by_name(buffer.get_end_iter(), text,
                                                style)
            else:
                buffer.insert_at_cursor(text)

        buffer.delete(*buffer.get_bounds())  # clear
        insert(_('Name') + '\n',
               'bold')  # T: Heading in plugins tab of preferences dialog
        insert(klass.plugin_info['name'].strip() + '\n\n')
        insert(_('Description') + '\n',
               'bold')  # T: Heading in plugins tab of preferences dialog
        insert(klass.plugin_info['description'].strip() + '\n\n')
        insert(_('Dependencies') + '\n',
               'bold')  # T: Heading in plugins tab of preferences dialog

        check, dependencies = klass.check_dependencies()
        if not (dependencies):
            insert(_('No dependencies') +
                   '\n')  # T: label in plugin info in preferences dialog
        else:
            # Construct dependency list, missing dependencies are marked red
            for dependency in dependencies:
                text, ok, required = dependency
                if ok:
                    insert(u'\u2022 %s - %s\n' %
                           (text, _('OK')))  # T: dependency is OK
                elif required:
                    insert(u'\u2022 %s - %s\n' % (text, _('Failed')),
                           'red')  # T: dependency failed
                else:
                    insert(u'\u2022 %s - %s (%s)' % (
                        text,
                        _('Failed'),  # T: dependency failed
                        _('Optional')  # T: optional dependency
                    ))
        insert('\n')

        insert(_('Author') + '\n',
               'bold')  # T: Heading in plugins tab of preferences dialog
        insert(klass.plugin_info['author'].strip())

        self.configure_button.set_sensitive(active
                                            and bool(klass.plugin_preferences))
        self.plugin_help_button.set_sensitive('help' in klass.plugin_info)

    def on_help_button_clicked(self, button):
        klass = zim.plugins.get_plugin_class(self._current_plugin)
        self.dialog.ui.show_help(klass.plugin_info['help'])  # XXX

    def on_configure_button_clicked(self, button):
        plugin = self.plugins[self._current_plugin]
        PluginConfigureDialog(self.dialog, plugin).run()

    def select_plugin(self, name):
        model = self.treeview.get_model()

        def find(model, path, iter):
            if model[iter][2] == name:
                self.treeview.scroll_to_cell(path)
                self.treeview.set_cursor(path)
                self.do_row_activated(self.treeview, path, 0)
                return True
            return False  # keep the foreach going

        model.foreach(find)