def test_selection_mode(self): treeview = Gtk.TreeView() _ = managers.TreeViewManager(treeview) self.assertEqual(treeview.get_selection().get_mode(), Gtk.SelectionMode.SINGLE) treeview.destroy() treeview = Gtk.TreeView() _ = managers.TreeViewManager(treeview, selection_mode=Gtk.SelectionMode.NONE) self.assertEqual(treeview.get_selection().get_mode(), Gtk.SelectionMode.NONE) treeview.destroy()
def __init__(self, *args, **kwargs): super(CampaignSelectionDialog, self).__init__(*args, **kwargs) treeview = self.gobjects['treeview_campaigns'] self.treeview_manager = managers.TreeViewManager( treeview, cb_delete=self._prompt_to_delete_row, cb_refresh=self.load_campaigns) self.treeview_manager.set_column_titles( ('Campaign Name', 'Company', 'Type', 'Messages', 'Created By', 'Creation Date', 'Expiration'), column_offset=1) self.treeview_manager.set_column_color(background=8, foreground=9) treeview.set_tooltip_column(10) self.popup_menu = self.treeview_manager.get_popup_menu() self._creation_assistant = None self._tv_model = Gtk.ListStore(str, str, str, str, str, str, str, str, Gdk.RGBA, Gdk.RGBA, str) # default sort is descending by campaign creation date self._tv_model.set_sort_column_id(6, Gtk.SortType.DESCENDING) # create and set the filter for expired campaigns self._tv_model_filter = self._tv_model.filter_new() self._tv_model_filter.set_visible_func(self._filter_campaigns) tv_model = Gtk.TreeModelSort(model=self._tv_model_filter) tv_model.set_sort_func( 4, gui_utilities.gtk_treesortable_sort_func_numeric, 4) treeview.set_model(tv_model) # setup menus for filtering campaigns and load campaigns self.get_popup_filter_menu() self.load_campaigns()
def __init__(self, *args, **kwargs): super(CampaignCompWindow, self).__init__(*args, **kwargs) self.comp_graph = CampaignCompGraph( self.application, style_context=self.application.style_context) self.gobjects['scrolledwindow_compare'].add(self.comp_graph.canvas) self.gobjects['box_compare'].pack_end( self.comp_graph.navigation_toolbar, False, False, 0) self.comp_graph.navigation_toolbar.hide() treeview = self.gobjects['treeview_campaigns'] tvm = managers.TreeViewManager(treeview, cb_refresh=self.load_campaigns) toggle_renderer = Gtk.CellRendererToggle() toggle_renderer.connect('toggled', self.signal_renderer_toggled) self.stack = self.gobjects['stack_main'] self.prev_child = self.stack.get_visible_child() b = Gtk.CellRendererText() tvm.set_column_titles(('Compare', 'Name', 'Company', 'Type', 'Created By', 'Creation Date', 'Expiration'), column_offset=1, renderers=(toggle_renderer, b, b, b, b, b, b)) self._model = Gtk.ListStore(str, bool, str, str, str, str, str, str) self._model.set_sort_column_id(2, Gtk.SortType.ASCENDING) treeview.set_model(self._model) self.load_campaigns() self.window.show()
def __init__(self, *args, **kwargs): super(CampaignSelectionDialog, self).__init__(*args, **kwargs) treeview = self.gobjects['treeview_campaigns'] self.treeview_manager = managers.TreeViewManager(treeview, cb_delete=self._prompt_to_delete_row, cb_refresh=self.load_campaigns) self.treeview_manager.set_column_titles( tuple(column.title for column in self.view_columns), column_offset=4, renderers=tuple(column.cell_renderer() for column in self.view_columns) ) treeview.set_tooltip_column(1) self.treeview_manager.set_column_color(background=2, foreground=3) self.popup_menu = self.treeview_manager.get_popup_menu() self._creation_assistant = None view_column_types = tuple(column.g_type for column in self.view_columns) self._tv_model = Gtk.ListStore(str, str, Gdk.RGBA, Gdk.RGBA, *view_column_types) # create and set the filter for expired campaigns self._tv_model_filter = self._tv_model.filter_new() self._tv_model_filter.set_visible_func(self._filter_campaigns) tree_model_sort = Gtk.TreeModelSort(model=self._tv_model_filter) for idx, column in enumerate(self.view_columns, 4): if column.sort_function is not None: tree_model_sort.set_sort_func(idx, column.sort_function, idx) # default sort is descending by campaign creation date tree_model_sort.set_sort_column_id(9, Gtk.SortType.DESCENDING) treeview.set_model(tree_model_sort) # setup menus for filtering campaigns and load campaigns self.get_popup_filter_menu() self.load_campaigns()
def __init__(self, *args, **kwargs): super(PluginManagerWindow, self).__init__(*args, **kwargs) treeview = self.gobjects['treeview_plugins'] self._last_plugin_selected = None self._module_errors = {} tvm = managers.TreeViewManager(treeview, cb_refresh=self.load_plugins) toggle_renderer = Gtk.CellRendererToggle() toggle_renderer.connect('toggled', self.signal_renderer_toggled) tvm.set_column_titles( ('Enabled', 'Plugin'), column_offset=1, renderers=(toggle_renderer, Gtk.CellRendererText())) tvm.column_views['Enabled'].set_cell_data_func( toggle_renderer, self._toggle_cell_data_func) self._model = Gtk.ListStore(str, bool, str) self._model.set_sort_column_id(2, Gtk.SortType.ASCENDING) treeview.set_model(self._model) self.load_plugins() self.popup_menu = tvm.get_popup_menu() self.popup_menu.append(Gtk.SeparatorMenuItem()) menu_item = Gtk.MenuItem.new_with_label('Reload') menu_item.connect('activate', self.signal_popup_menu_activate_reload) self.popup_menu.append(menu_item) self.popup_menu.show_all() self.window.show() selection = treeview.get_selection() selection.unselect_all() paned = self.gobjects['paned_plugins'] self._paned_offset = paned.get_allocation( ).height - paned.get_position()
def __init__(self, *args, **kwargs): super(TagEditorDialog, self).__init__(*args, **kwargs) self.popup_menus = {} self.treeview_managers = {} for tag_table in self.tag_tables: treeview = self.gobjects['treeview_' + tag_table] model = Gtk.ListStore(int, str, str) treeview.set_model(model) tvm = managers.TreeViewManager( treeview, cb_delete=functools.partial(self.delete_tag, tag_table), cb_refresh=functools.partial(self.load_tags, tag_table)) name_renderer = Gtk.CellRendererText() name_renderer.connect('edited', self.signal_renderer_edited, (tag_table, 1, 'name')) name_renderer.set_property('editable', True) description_renderer = Gtk.CellRendererText() description_renderer.connect('edited', self.signal_renderer_edited, (tag_table, 2, 'description')) description_renderer.set_property('editable', True) description_renderer.set_property('ellipsize', Pango.EllipsizeMode.END) tvm.set_column_titles( ('Name', 'Description'), column_offset=1, renderers=(name_renderer, description_renderer)) self.treeview_managers[tag_table] = tvm self.popup_menus[tag_table] = tvm.get_popup_menu() self.load_tags()
def test_column_titles(self): treeview = Gtk.TreeView() treeview_manager = managers.TreeViewManager(treeview) self.assertEqual(len(treeview_manager.column_titles), 0) treeview_manager.set_column_titles(('col0', 'col1')) self.assertEqual(len(treeview_manager.column_titles), 2) self.assertEqual(treeview_manager.column_titles.get('col0'), 0) self.assertEqual(treeview_manager.column_titles.get('col1'), 1)
def __init__(self, *args, **kwargs): super(PluginManagerWindow, self).__init__(*args, **kwargs) treeview = self.gobjects['treeview_plugins'] self.status_bar = self.gobjects['statusbar'] self._module_errors = {} tvm = managers.TreeViewManager(treeview, cb_refresh=self._load_plugins) toggle_renderer_enable = Gtk.CellRendererToggle() toggle_renderer_enable.connect('toggled', self.signal_renderer_toggled_enable) toggle_renderer_install = Gtk.CellRendererToggle() toggle_renderer_install.connect('toggled', self.signal_renderer_toggled_install) tvm.set_column_titles( ['Installed', 'Enabled', 'Title', 'Compatible', 'Version'], column_offset=1, renderers=[ toggle_renderer_install, toggle_renderer_enable, Gtk.CellRendererText(), Gtk.CellRendererText(), Gtk.CellRendererText() ]) tvm.column_views['Enabled'].set_cell_data_func( toggle_renderer_enable, self._toggle_cell_data_func) tvm.column_views['Enabled'].add_attribute(toggle_renderer_enable, 'visible', 6) tvm.column_views['Enabled'].add_attribute(toggle_renderer_enable, 'sensitive', 1) tvm.column_views['Installed'].add_attribute(toggle_renderer_install, 'visible', 7) tvm.column_views['Installed'].add_attribute(toggle_renderer_install, 'sensitive', 8) self._model = Gtk.TreeStore(str, bool, bool, str, str, str, bool, bool, bool, str) self._model.set_sort_column_id(3, Gtk.SortType.ASCENDING) treeview.set_model(self._model) self.plugin_path = os.path.join(self.application.user_data_path, 'plugins') self.load_thread = utilities.Thread(target=self._load_catalogs) self.load_thread.start() self.popup_menu = tvm.get_popup_menu() self.popup_menu.append(Gtk.SeparatorMenuItem()) menu_item = Gtk.MenuItem.new_with_label('Reload') menu_item.connect('activate', self.signal_popup_menu_activate_reload) self.popup_menu.append(menu_item) menu_item_reload_all = Gtk.MenuItem.new_with_label('Reload All') menu_item_reload_all.connect( 'activate', self.signal_popup_menu_activate_reload_all) self.popup_menu.append(menu_item_reload_all) self.popup_menu.show_all() self._update_status_bar('Loading...') self.window.show() selection = treeview.get_selection() selection.unselect_all() paned = self.gobjects['paned_plugins'] self._paned_offset = paned.get_allocation( ).height - paned.get_position()
def __init__(self, *args, **kwargs): super(CampaignViewGenericTableTab, self).__init__(*args, **kwargs) treeview = self.gobjects['treeview_campaign'] self.treeview_manager = managers.TreeViewManager( treeview, selection_mode=Gtk.SelectionMode.MULTIPLE, cb_delete=self._prompt_to_delete_row, cb_refresh=self.load_campaign_information ) self.treeview_manager.set_column_titles(self.view_columns, column_offset=1) self.popup_menu = self.treeview_manager.get_popup_menu() """The :py:class:`Gtk.Menu` object which is displayed when right-clicking in the view area."""
def test_popup_menu(self): treeview = Gtk.TreeView() treeview_manager = managers.TreeViewManager(treeview) treeview_manager.set_column_titles(('col0', 'col1')) menu = treeview_manager.get_popup_menu() self.assertEqual(len(menu.get_children()), 1, msg='the popup menu contains more than one entry') copy_submenuitem = menu.get_children()[0] self.assertEqual(copy_submenuitem.get_label(), 'Copy') copy_submenu = copy_submenuitem.get_submenu() self.assertEqual( len(copy_submenu.get_children()), 4, msg='the copy submenu contains an invalid number or entries') treeview.destroy()
def __init__(self, *args, **kwargs): super(CampaignViewGenericTableTab, self).__init__(*args, **kwargs) treeview = self.gobjects['treeview_campaign'] self.treeview_manager = managers.TreeViewManager( treeview, selection_mode=Gtk.SelectionMode.MULTIPLE, cb_delete=self._prompt_to_delete_row, cb_refresh=self.load_campaign_information ) self.treeview_manager.set_column_titles(self.view_columns, column_offset=1) self.popup_menu = self.treeview_manager.get_popup_menu() """The :py:class:`Gtk.Menu` object which is displayed when right-clicking in the view area.""" treeview = self.gobjects['treeview_campaign'] store_columns = [str] * (len(self.view_columns) + 1) store = Gtk.ListStore(*store_columns) treeview.set_model(store) self.application.connect('server-connected', self.signal_kp_server_connected)
def test_popup_copy_submenu(self): treeview = Gtk.TreeView() treeview_manager = managers.TreeViewManager(treeview) treeview_manager.set_column_titles(('col0', )) menu = treeview_manager.get_popup_copy_submenu() self.assertEqual( len(menu.get_children()), 1, msg='the copy submenu contains an invalid number or entries') treeview_manager.set_column_titles(('col0', 'col1')) menu = treeview_manager.get_popup_copy_submenu() self.assertEqual( len(menu.get_children()), 4, msg='the copy submenu contains an invalid number or entries') treeview.destroy()
def __init__(self, *args, **kwargs): super(ClonePageDialog, self).__init__(*args, **kwargs) self.resources = Gtk.ListStore(str, str, int) treeview = self.gobjects['treeview_resources'] treeview.set_model(self.resources) self.treeview_manager = managers.TreeViewManager(treeview) self.treeview_manager.set_column_titles( ('Resource Path', 'MIME Type', 'Size'), renderers=(Gtk.CellRendererText(), Gtk.CellRendererText(), extras.CellRendererBytes())) self.popup_menu = self.treeview_manager.get_popup_menu() self.button_cancel = self.gobjects['button_cancel'] self.entry_directory = self.gobjects['entry_clone_directory'] # managed separately to be kept out of the config self.entry_target = self.gtk_builder_get('entry_target') self.label_status = self.gobjects['label_status'] self.spinner_status = self.gobjects['spinner_status']
def __init__(self, *args, **kwargs): super(ClonePageDialog, self).__init__(*args, **kwargs) self.resources = Gtk.ListStore(*tuple(column.g_type for column in self.view_columns)) treeview = self.gobjects['treeview_resources'] treeview.set_model(self.resources) self.treeview_manager = managers.TreeViewManager(treeview) self.treeview_manager.set_column_titles( tuple(column.title for column in self.view_columns), renderers=tuple(column.cell_renderer() for column in self.view_columns)) self.popup_menu = self.treeview_manager.get_popup_menu() self.button_cancel = self.gobjects['button_cancel'] self.entry_directory = self.gobjects['entry_clone_directory'] # managed separately to be kept out of the config self.entry_target = self.gtk_builder_get('entry_target') self.label_status = self.gobjects['label_status'] self.spinner_status = self.gobjects['spinner_status']
def __init__(self, *args, **kwargs): super(CampaignViewGenericTableTab, self).__init__(*args, **kwargs) treeview = self.gobjects['treeview_campaign'] self.treeview_manager = managers.TreeViewManager( treeview, selection_mode=Gtk.SelectionMode.MULTIPLE, cb_delete=self._prompt_to_delete_row, cb_refresh=self.load_campaign_information ) self.treeview_manager.set_column_titles( self.view_column_titles, column_offset=1, renderers=tuple(column.cell_renderer() for column in self.view_columns) ) for column in self.view_columns: if isinstance(column, extras.ColumnDefinitionDatetime): self.treeview_manager.column_views[column.title].set_fixed_width(150) self.popup_menu = self.treeview_manager.get_popup_menu() """The :py:class:`Gtk.Menu` object which is displayed when right-clicking in the view area.""" treeview = self.gobjects['treeview_campaign'] self._rule = None self._rule_context = rule_engine.Context(type_resolver=rule_engine.type_resolver_from_dict( dict((column.name, rule_engine.DataType.from_type(column.python_type)) for column in self.view_columns) )) view_column_types = tuple(column.g_type for column in self.view_columns) self._tv_model = Gtk.ListStore(str, *view_column_types) self._tv_model_filter = self._tv_model.filter_new() self._tv_model_filter.set_visible_func(self._tv_filter) tree_model_sort = Gtk.TreeModelSort(model=self._tv_model_filter) for idx, column in enumerate(self.view_columns, 1): if column.sort_function is not None: tree_model_sort.set_sort_func(idx, column.sort_function, idx) treeview.set_model(tree_model_sort) self.application.connect('server-connected', self.signal_kp_server_connected) filter_revealer = self.gobjects['revealer_filter'] menu_item = Gtk.CheckMenuItem.new_with_label('Show Filter') menu_item.set_active(filter_revealer.get_reveal_child()) menu_item.connect('toggled', self.signal_toggled_show_filter) menu_item.show() self.popup_menu.append(menu_item)
def __init__(self, application, campaign_id=None): """ :param application: The application instance which this object belongs to. :type application: :py:class:`~king_phisher.client.application.KingPhisherClientApplication` :param campaign_id: The ID of the campaign to edit. """ super(CampaignAssistant, self).__init__(application) self.campaign_id = campaign_id self._close_ready = True self._page_titles = {} for page_n in range(self.assistant.get_n_pages()): page = self.assistant.get_nth_page(page_n) page_title = self.assistant.get_page_title(page) if page_title: self._page_titles[page_title] = page_n self._expiration_time = managers.TimeSelectorButtonManager(self.application, self.gobjects['togglebutton_expiration_time']) self._set_comboboxes() self._set_defaults() if not self.config['server_config']['server.require_id']: self.gobjects['checkbutton_reject_after_credentials'].set_sensitive(False) self.gobjects['checkbutton_reject_after_credentials'].set_property('active', False) confirm_preamble = 'Verify all settings are correct in the previous sections' if campaign_id: # re-configuring an existing campaign self.gobjects['label_confirm_body'].set_text(confirm_preamble + ', then hit "Apply" to update the King Phisher campaign with the new settings.') self.gobjects['label_intro_body'].set_text('This assistant will walk you through reconfiguring the selected King Phisher campaign.') self.gobjects['label_intro_title'].set_text('Configure Campaign') else: # creating a new campaign self.gobjects['label_confirm_body'].set_text(confirm_preamble + ', then hit "Apply" to create the new King Phisher campaign.') self.gobjects['label_intro_body'].set_text('This assistant will walk you through creating and configuring a new King Phisher campaign.') self.gobjects['label_intro_title'].set_text('New Campaign') self._url_thread = None domain_completion = Gtk.EntryCompletion() self._hostname_list_store = Gtk.ListStore(str) domain_completion.set_model(self._hostname_list_store) domain_completion.set_text_column(0) self.gobjects['entry_hostname_filter'].set_completion(domain_completion) tvm = managers.TreeViewManager(self.gobjects['treeview_url_selector']) tvm.set_column_titles( ['Hostname', 'Landing Page', 'URL'], renderers=[ Gtk.CellRendererText(), Gtk.CellRendererText(), Gtk.CellRendererText() ] ) self._url_model = Gtk.ListStore(str, str, str, object, object, str, str) self._url_model.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.gobjects['treeview_url_selector'].set_model(self._url_model) self._url_information = { 'created': None, 'data': None } self._load_url_treeview_tsafe(refresh=True) paned = self.gobjects['paned_url_info'] self._paned_offset = paned.get_allocation().height - paned.get_position()
def __init__(self, *args, **kwargs): super(PluginManagerWindow, self).__init__(*args, **kwargs) self.catalog_plugins = plugins.ClientCatalogManager( self.application.user_data_path) self.plugin_path = os.path.join(self.application.user_data_path, 'plugins') self.status_bar = self.gobjects['statusbar'] self._installed_plugins_treeview_tracker = None """ This is used to track and make sure all plugins make it into the treeview. It is set each time catalogs are loaded or refreshed. Once the loading operation is complete, plugins that remain were not loaded due their data (repo or id) missing from the catalog, likely due to it having been removed. """ self._worker_thread = None self._worker_thread_start(self._load_catalogs_tsafe) self.__load_errors = {} self.__installing_plugin = None tvm = managers.TreeViewManager(self.gobjects['treeview_plugins']) toggle_renderer_enable = Gtk.CellRendererToggle() toggle_renderer_enable.connect('toggled', self.signal_renderer_toggled_enable) toggle_renderer_install = Gtk.CellRendererToggle() toggle_renderer_install.connect('toggled', self.signal_renderer_toggled_install) tvm.set_column_titles( ('Installed', 'Enabled', 'Title', 'Compatible', 'Version'), column_offset=1, renderers=(toggle_renderer_install, toggle_renderer_enable, Gtk.CellRendererText(), Gtk.CellRendererText(), Gtk.CellRendererText())) tvm.column_views['Enabled'].set_cell_data_func( toggle_renderer_enable, self._toggle_enabled_cell_data_func) tvm.column_views['Enabled'].add_attribute(toggle_renderer_enable, 'visible', 6) tvm.column_views['Enabled'].add_attribute(toggle_renderer_enable, 'sensitive', 1) tvm.column_views['Installed'].set_cell_data_func( toggle_renderer_install, self._toggle_install_cell_data_func) tvm.column_views['Installed'].add_attribute(toggle_renderer_install, 'visible', 7) tvm.column_views['Installed'].add_attribute(toggle_renderer_install, 'sensitive', 8) self._model = Gtk.TreeStore(str, bool, bool, str, str, str, bool, bool, bool, str) self._model.set_sort_column_id(3, Gtk.SortType.ASCENDING) self.gobjects['treeview_plugins'].set_model(self._model) self._tv_popup_menu = managers.MenuManager(tvm.get_popup_menu()) self._tv_popup_menu.append_item(Gtk.SeparatorMenuItem()) self._tv_popup_menu.append('Reload', self.signal_popup_menu_activate_reload) self._tv_popup_menu.append('Reload All', self.signal_popup_menu_activate_reload_all) self._tv_popup_menu.append_item(Gtk.SeparatorMenuItem()) self._tv_popup_menu.append( 'Show Documentation', self.signal_popup_menu_activate_show_documentation) self._tv_popup_menu.append('Update', self.signal_popup_menu_activate_update) self._info_popup_menu = managers.MenuManager() self._info_popup_menu.append('Reload', self.signal_popup_menu_activate_reload) self._info_popup_menu.append_item(Gtk.SeparatorMenuItem()) self._info_popup_menu.append( 'Show Documentation', self.signal_popup_menu_activate_show_documentation) self._info_popup_menu.append('Update', self.signal_popup_menu_activate_update) self.gobjects['menubutton_plugin_info'].set_popup( self._info_popup_menu.menu) self._update_status_bar('Loading...') self.window.show() paned = self.gobjects['paned_plugins'] self._paned_offset = paned.get_allocation( ).height - paned.get_position()