Source code for wbia.gui.guimenus
# -*- coding: utf-8 -*-
"""
This module defines all of the menu items in the main GUI
as well as their callbacks in guiback
"""
from __future__ import absolute_import, division, print_function
import utool as ut
import functools
from wbia import constants as const
import wbia.guitool as gt
ut.noinject(__name__, '[guimenus]')
[docs]class DummyBack(object):
def __init__(self):
print('using dummy back')
pass
def __getattr__(self, name):
# print(name)
if name.startswith('_'):
return self.__dict__[name]
import mock
mock.Mock()
return mock.Mock()
[docs]def setup_dummy_menus():
r"""
CommandLine:
python -m wbia.gui.guimenus --test-setup_dummy_menus
Example:
>>> # DISABLE_DOCTEST
>>> from wbia.gui.guimenus import * # NOQA
>>> result = setup_dummy_menus()
>>> print(result)
"""
# import unittest
import wbia.guitool as gt
gt.ensure_qapp() # must be ensured before any embeding
mainwin = gt.QtWidgets.QMainWindow()
back = DummyBack()
import mock
mainwin.expand_names_tree = mock.Mock
setup_menus(mainwin, back)
mainwin.show()
mainwin.resize(600, 100)
# ut.embed()
gt.qtapp_loop(mainwin, frequency=100)
# gt.qtapp_loop(mainwin, frequency=100, ipy=ut.inIPython())
[docs]def setup_menus(mainwin, back=None):
if ut.VERBOSE:
print('[guimenus] creating menus')
mainwin.menubar = gt.newMenubar(mainwin)
if back is None:
back = DummyBack()
setup_file_menu(mainwin, back)
setup_view_menu(mainwin, back)
setup_actions_menu(mainwin, back)
# setup_batch_menu(mainwin, back)
# setup_checks_menu(mainwin, back)
setup_option_menu(mainwin, back)
setup_refresh_menu(mainwin, back)
# setup_wildbook_menu(mainwin, back)
setup_web_menu(mainwin, back)
setup_help_menu(mainwin, back)
setup_developer_menu(mainwin, back)
setup_zebra_menu(mainwin, back)
[docs]def setup_file_menu(mainwin, back):
""" FILE MENU """
mainwin.menuFile = mainwin.menubar.newMenu('File')
menu = mainwin.menuFile
menu.newAction(
name='actionNew_Database',
text='New Database',
tooltip='Create a new folder to use as a database.',
shortcut='Ctrl+N',
triggered=back.new_database,
)
menu.newAction(
name='actionOpen_Database',
text='Open Database',
tooltip='Opens a different database folder.',
shortcut='Ctrl+O',
triggered=back.open_database,
)
menu.addSeparator()
menu.newAction(
name='actionBackup_Database',
tooltip='Backup the current main database.',
text='Backup Database',
shortcut='Ctrl+B',
triggered=back.backup_database,
)
menu.newAction(
name='actionExport_Database',
tooltip='Dumps and exports database as csv tables.',
text='Export As CSV',
triggered=back.export_database_as_csv,
)
menu.newAction(
name='actionDuplicate_Database',
tooltip='Creates a duplicate of the database',
text='Duplicate Database',
triggered=back.make_database_duplicate,
)
menu.addSeparator()
menu.newAction(
name='actionImport_Img_file',
text='Import Images (select file(s))',
triggered=back.import_images_from_file,
)
menu.newAction(
name='actionImport_Img_dir',
text='Import Images (select directory)',
shortcut='Ctrl+I',
triggered=back.import_images_from_dir,
)
menu.addSeparator()
# menu.newAction(
# name='actionImport_Img_file_with_smart',
# text='Import Images (select file(s)) with smart Patrol XML',
# triggered=back.import_images_from_file_with_smart)
menu.newAction(
name='actionImport_Img_dir_with_smart',
text='Import Images (select directory) with smart Patrol XML',
triggered=back.import_images_from_dir_with_smart,
)
menu.addSeparator()
menu.newAction(
name='actionImport_Img_dir_from_encouters_1',
text='Import Images (select folder(s)) from Encounters (1 level)',
triggered=back.import_images_from_encounters_1,
)
menu.newAction(
name='actionImport_Img_dir_from_encouters_2',
text='Import Images (select folder(s)) from Encounters (2 levels)',
triggered=back.import_images_from_encounters_2,
)
menu.addSeparator()
menu.newAction(name='actionQuit', text='Quit', triggered=back.quit)
[docs]def setup_view_menu(mainwin, back):
mainwin.menuView = mainwin.menubar.newMenu('View')
menu = mainwin.menuView
menu.addSeparator()
menu.newAction(
name='actionExpandNamesTree',
text='Expand Names Tree',
triggered=mainwin.expand_names_tree,
)
menu.addSeparator()
menu.newAction(
name='toggleThumbnails',
text='Toggle Thumbnails',
triggered=back.toggle_thumbnails,
)
menu.newAction(
name='toggleOutput',
text='Toggle Output Log',
triggered=back.toggle_output_widget,
)
# menu.newAction(
# name='actionLayout_Figures',
# text='Layout Figures',
# tooltip='Organizes windows in a grid',
# shortcut='Ctrl+L',
# triggered=back.layout_figures)
pass
[docs]def setup_actions_menu(mainwin, back):
""" ACTIONS MENU """
mainwin.menuActions = mainwin.menubar.newMenu('Actions')
menu = mainwin.menuActions
menu.newAction(
name='actionCompute_Occurrences',
text='Group Occurrences',
# shortcut='Ctrl+2',
triggered=back.do_group_occurrence_step,
)
menu.addSeparator() # ---------
menu.newAction(
name='actionDetect',
text='Run Detection',
# shortcut='Ctrl+3',
triggered=back.run_detection_step,
)
menu.addSeparator() # ---------
menu.newAction(
name='actionQuery',
text='Query Single Annotation',
shortcut='Q',
triggered=functools.partial(back.compute_queries, use_visual_selection=True),
)
menu.newAction(
name='actionBatchIntraOccurrenceQueries',
text='Query: Intra Occurrence',
triggered=functools.partial(
back.compute_queries, daids_mode=const.INTRA_OCCUR_KEY
),
)
menu.newAction(
name='actionBatchVsExemplarQueries',
text='Query: vs Exemplars',
triggered=functools.partial(
back.compute_queries, daids_mode=const.VS_EXEMPLARS_KEY
),
)
menu.addSeparator() # ---------
menu.newAction(
name='actionSetExemplarsFromQualityAndViewpoint',
text='Set Exemplars from Quality and Viewpoint',
triggered=back.set_exemplars_from_quality_and_viewpoint_,
tooltip=ut.textblock(
"""
Uses the quality and viewpoint column to pick the best N exemplars
per viewpoint, per name.
"""
),
)
menu.addSeparator() # ---------
menu.newAction(
name='actionAdvancedID',
text='Advanced ID Interface',
triggered=back.show_advanced_id_interface,
shortcut='Ctrl+G',
)
menu.newAction(
name='actionRunMergeChecks',
text='Run Merge Checks (Exemplars vs Exemplars)',
triggered=back.run_merge_checks,
)
mainwin.mergeMenu = menu.newMenu('Other Merge Checks')
mainwin.mergeMenu.newAction(
name='actionRunMergeChecks2',
text='Run Merge Checks (multitons)',
triggered=back.run_merge_checks_multitons,
)
menu.addSeparator() # ---------
if not const.SIMPLIFY_INTERFACE:
menu.newAction(
name='actionBatchConsecutiveLocationSpeciesRename',
text='Consecutive Location+Species Rename',
triggered=back.batch_rename_consecutive_via_species_,
tooltip=ut.textblock(
"""
Renames ALL the names in the database to
{other_cfg.location_for_names}_{species_code}_{num}
"""
),
)
menu.addSeparator() # ---------
menu.newAction(
name='actionShipProcessedOccurrences',
text='Ship Processed Occurrences',
tooltip="""This action will ship to WildBook any occurrences that have
been marked as processed. This can also be used to send
processed imagesets that failed to ship correctly.""",
# shortcut='Ctrl+5',
triggered=back.send_unshipped_processed_imagesets,
)
menu.addSeparator() # ---------
menu.newAction(
text='Override All Annotation Species',
triggered=back.override_all_annotation_species,
)
menu.newAction(text='Rename Species', triggered=back.update_species_nice_name)
menu.newAction(text='Delete Species', triggered=back.delete_selected_species)
menu.addSeparator() # ---------
menu.newAction(
name='actionDeleteAllImageSets',
text='Delete All ImageSets',
triggered=back.delete_all_imagesets,
)
menu.newAction(
name='actionDelete_Image', text='Delete Image', triggered=back.delete_image
)
menu.newAction(
name='actionDelete_ANNOTATION',
text='Delete Annotation',
shortcut='Ctrl+Del',
triggered=back.delete_annot,
)
menu.addSeparator()
[docs]def setup_batch_menu(mainwin, back):
""" BATCH MENU """
mainwin.menuBatch = mainwin.menubar.newMenu('Batch')
menu = mainwin.menuBatch
menu
[docs]def setup_option_menu(mainwin, back):
""" OPTIONS MENU """
mainwin.menuOptions = mainwin.menubar.newMenu('Options')
menu = mainwin.menuOptions
mainwin.actionToggleQueryMode = menu.newAction(
name='actionToggleQueryMode',
text='Toggle Query Mode: ----',
tooltip='Changes behavior of Actions->Query',
triggered=functools.partial(back.set_daids_mode, 'toggle'),
)
menu.addSeparator()
menu.newAction(
name='actionPreferences',
text='Edit Preferences',
tooltip='Changes algorithm parameters and program behavior.',
shortcut='Ctrl+P',
triggered=back.edit_preferences,
)
[docs]def setup_checks_menu(mainwin, back):
mainwin.menuChecks = mainwin.menubar.newMenu('Checks')
pass
[docs]def setup_help_menu(mainwin, back):
""" HELP MENU """
mainwin.menuHelp = mainwin.menubar.newMenu('Help')
menu = mainwin.menuHelp
# from wbia.control import DB_SCHEMA_CURRENT
# version = DB_SCHEMA_CURRENT.VERSION_CURRENT
menu.newAction(name='actionAbout', text='About', triggered=back.show_about_message)
menu.newAction(
name='actionDBInfo', text='Database Info', triggered=back.display_dbinfo
),
# menu.newAction(
# name='actionView_Docs',
# text='View Documentation',
# triggered=back.view_docs)
# ---
menu.addSeparator()
# ---
menu.newAction(text='View Global Logs', triggered=back.view_logs_global)
mainwin.viewDirectoryMenu = menu.newMenu('View Directories')
mainwin.viewDirectoryMenu.newAction(
text='View Local Log Directory', triggered=back.view_log_dir_local
)
mainwin.viewDirectoryMenu.newAction(
text='View Global Log Directory', triggered=back.view_log_dir_global
)
mainwin.viewDirectoryMenu.newAction(
text='View Database Directory', triggered=back.view_database_dir
)
mainwin.viewDirectoryMenu.newAction(
text='View Application Files Directory', triggered=back.view_app_files_dir
)
# ---
menu.addSeparator()
# ---
menu.newAction(text='Run Integrity Checks', triggered=back.run_integrity_checks)
menu.newAction(
text='Fix/Clean Database Integrity', triggered=back.fix_and_clean_database
)
[docs]def setup_web_menu(mainwin, back):
mainwin.menuWeb = mainwin.menubar.newMenu('Web')
menu = mainwin.menuWeb
menu.newAction(text='Startup Web Interface', triggered=back.start_web_server_parallel)
menu.newAction(text='Shutdown Web Interface', triggered=back.kill_web_server_parallel)
menu.addSeparator()
menu.newAction(text='Startup Wildbook', triggered=back.startup_wildbook)
menu.newAction(text='Shutdown Wildbook', triggered=back.shutdown_wildbook)
menu.addSeparator()
menu.newAction(text='Browse Wildbook', triggered=back.browse_wildbook)
menu.newAction(
text='Force Wildbook Name Change', triggered=back.force_wildbook_namechange
)
menu.addSeparator()
menu.newAction(text='Install Wildbook', triggered=back.install_wildbook)
# def setup_wildbook_menu(mainwin, back):
# mainwin.menuWildbook = mainwin.menubar.newMenu('Wildbook')
# menu = mainwin.menuWildbook
[docs]def setup_developer_menu(mainwin, back):
""" DEV MENU """
mainwin.menuDev = mainwin.menubar.newMenu('Dev')
menu = mainwin.menuDev
menu.newAction(text='Download Demo Data', triggered=back.ensure_demodata)
menu.newAction(
name='actionMakeIPythonNotebook',
text='Launch IPython Notebook',
triggered=back.launch_ipy_notebook,
)
menu.newAction(
name='actionDeveloper_mode',
text='Developer IPython',
shortcut='Ctrl+Shift+I',
triggered=back.dev_mode,
)
menu.newAction(text='Graph Interface', triggered=back.make_qt_graph_interface)
menu.newAction(text='Set Work Directory', triggered=back.set_workdir)
# --- TESTS --
menu.addSeparator()
menu.newAction(
name='actionLocalizeImages',
text='Localize Images',
triggered=back.localize_images,
)
menu.addSeparator()
menu.newAction(
name='export_learning_data',
text='Export learning data',
triggered=back.dev_export_annotations,
)
menu.newAction(
name='actionTrainWithImageSets',
text='Train RF with Open ImageSet',
triggered=back.train_rf_with_imageset,
)
menu.addSeparator() # ---------
adv_ieq_menu = mainwin.menuAdvancedIEQuery = menu.newMenu(
'Advanced Intra Occurrence Queries'
)
adv_exq_menu = mainwin.menuAdvancedEXQuery = menu.newMenu(
'Advanced Vs Exemplar Queries'
)
menu.addSeparator() # ---------
adv_ieq_menu.newAction(
name='actionBatchUnknownIntraImageSetQueries',
text='Query: Unknown Intra Occurrence',
triggered=functools.partial(
back.compute_queries, query_is_known=False, daids_mode=const.INTRA_OCCUR_KEY
),
)
adv_exq_menu.newAction(
name='actionBatchUnknownVsExemplarQueries',
text='Query: Unknowns vs Exemplars',
triggered=functools.partial(
back.compute_queries, query_is_known=False, daids_mode=const.VS_EXEMPLARS_KEY,
),
)
adv_exq_menu.newAction(
name='actionNameVsExemplarsQuery',
text='Query: Names vs Exemplar',
triggered=functools.partial(
back.compute_queries,
use_prioritized_name_subset=True,
daids_mode=const.VS_EXEMPLARS_KEY,
cfgdict=dict(can_match_samename=False, use_k_padding=False),
),
)
adv_exq_menu.newAction(
name='actionNameVsExemplarsMode3',
text='Query: Names vs Exemplar + Ori Hack + Scale + No Affine',
triggered=functools.partial(
back.compute_queries,
use_prioritized_name_subset=True,
daids_mode=const.VS_EXEMPLARS_KEY,
cfgdict=dict(
can_match_samename=False,
use_k_padding=False,
affine_invariance=False,
scale_max=150,
query_rotation_heuristic=True,
),
),
)
adv_ieq_menu.newAction(
name='actionQueryInEncMode1',
text='Query: Names Intra Occurrence With OriAugment',
triggered=functools.partial(
back.compute_queries,
daids_mode=const.INTRA_OCCUR_KEY,
use_prioritized_name_subset=True,
cfgdict=dict(
query_rotation_heuristic=True,
can_match_samename=False,
use_k_padding=False,
),
),
)
adv_exq_menu.newAction(
name='actionQueryVsExempMode2',
text='Query: Names VsExamplar With OriAugment',
triggered=functools.partial(
back.compute_queries,
daids_mode=const.VS_EXEMPLARS_KEY,
use_prioritized_name_subset=True,
cfgdict=dict(
query_rotation_heuristic=True,
can_match_samename=False,
use_k_padding=False,
),
),
)
menu.addSeparator() # ---------
menu.newAction(
name='takeScreenshot',
text='Take Screenshot',
# shortcut='Ctrl+]',
shortcut='Ctrl+K',
triggered=back.take_screenshot,
)
setup_depricated_menu(mainwin, back)
[docs]def setup_refresh_menu(mainwin, back):
mainwin.menuRefresh = mainwin.menubar.newMenu('Refresh')
menu = mainwin.menuRefresh
# ---------
menu.newAction(
name='actionDeveloper_CLS',
text='Refresh Tables',
shortcut='Ctrl+Shift+C',
triggered=back.dev_cls,
)
# ---------
menu.newAction(
name='actionUpdateSpecialImageSets',
text='Refresh Special ImageSets',
triggered=back.update_special_imagesets_,
)
# ---------
menu.newAction(
name='actionReconnectController',
text='Reconnect Controller',
triggered=back.reconnect_controller,
)
menu.addSeparator() # ---------
# ---------
menu.newAction(
name='actionRedownload_Detection_Models',
text='Redownload Detection Models',
triggered=back.redownload_detection_models,
)
# ---------
menu.addSeparator()
# ---------
menu.newAction(
name='actionDelete_Precomputed_Results',
text='Delete Cached Query Results',
triggered=back.delete_queryresults_dir,
)
menu.newAction(
name='actionDelete_Cache_Directory',
text='Delete Database Cache',
triggered=back.delete_cache,
)
menu.newAction(
name='actionDelete_global_preferences',
text='Delete Global Preferences',
triggered=back.delete_global_prefs,
)
menu.newAction(
name='actionDeleteThumbnails',
text='Delete Thumbnails',
triggered=back.delete_thumbnails,
)
[docs]def setup_depricated_menu(mainwin, back):
# mainwin.menuDepr = mainwin.menubar.newMenu('Depricated')
mainwin.menuDepr = mainwin.menuDev.newMenu('Depricated')
menu = mainwin.menuDepr
menu.addSeparator() # ---------
# menu.newAction(
# name='actionCompute_Queries',
# text='Query: Old Style',
# tooltip='''This might take anywhere from a coffee break to an
# overnight procedure depending on how many ANNOTATIONs you\'ve
# made. It queries each chip and saves the result which
# allows multiple queries to be rapidly inspected later.''',
# #shortcut='Ctrl+4',
# triggered=back.compute_queries)
menu.addSeparator() # ---------
# menu.newAction(
# text='Query: Incremental',
# triggered=back.incremental_query
# )
menu.newAction(
text='Import Cropped Images As Annotations (select file(s))',
triggered=back.import_images_as_annots_from_file,
)
menu.addSeparator()
menu.newAction(
text='Developer Reload', shortcut='Ctrl+Shift+R', triggered=back.dev_reload
)
# TESTS
mainwin.menuTests = menu.newMenu('Tests')
mainwin.menuTests.newAction(text='Run IBEIS Tests', triggered=back.run_tests)
mainwin.menuTests.newAction(text='Run Utool Tests', triggered=back.run_utool_tests)
mainwin.menuTests.newAction(text='Run Vtool Tests', triggered=back.run_vtool_tests)
mainwin.menuTests.newAction(text='Assert Modules', triggered=back.assert_modules)
menu.newAction(text='Update Source Install', triggered=back.update_source_install)
[docs]def setup_zebra_menu(mainwin, back):
mainwin.menuDev = mainwin.menubar.newMenu('Zebra')
menu = mainwin.menuDev
menu.newAction(
name='processImagesetAsCameraTrapImages',
text='Process ImageSet as Camera Trap Images',
triggered=back.filter_imageset_as_camera_trap,
)
if __name__ == '__main__':
"""
CommandLine:
python -m wbia.gui.guimenus --test-setup_dummy_menus
python -m wbia.gui.guimenus
python -m wbia.gui.guimenus --allexamples
python -m wbia.gui.guimenus --allexamples --noface --nosrc
"""
import multiprocessing
multiprocessing.freeze_support() # for win32
import utool as ut # NOQA
ut.doctest_funcs()