Source code for ibeis.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 ibeis import constants as const
import guitool
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 ibeis.gui.guimenus --test-setup_dummy_menus
Example:
>>> # DISABLE_DOCTEST
>>> from ibeis.gui.guimenus import * # NOQA
>>> result = setup_dummy_menus()
>>> print(result)
"""
#import unittest
import guitool
guitool.ensure_qapp() # must be ensured before any embeding
mainwin = guitool.QtGui.QMainWindow()
back = DummyBack()
import mock
mainwin.expand_names_tree = mock.Mock
setup_menus(mainwin, back)
mainwin.show()
mainwin.resize(600, 100)
#ut.embed()
guitool.qtapp_loop(mainwin, frequency=100)
#guitool.qtapp_loop(mainwin, frequency=100, ipy=ut.inIPython())
[docs]def setup_menus(mainwin, back=None):
print('[guimenus] creating menus')
mainwin.menubar = guitool.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)
[docs]def setup_file_menu(mainwin, back):
""" FILE MENU """
mainwin.menuFile = guitool.newMenu(mainwin, mainwin.menubar, 'menuFile', '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',
slot_fn=back.new_database)
menu.newAction(
name='actionOpen_Database',
text='Open Database',
tooltip='Opens a different database directory.',
shortcut='Ctrl+O',
slot_fn=back.open_database)
menu.addSeparator()
menu.newAction(
name='actionBackup_Database',
tooltip='Backup the current main database.',
text='Backup Database',
shortcut='Ctrl+B',
slot_fn=back.backup_database)
menu.newAction(
name='actionExport_Database',
tooltip='Dumps and exports database as csv tables.',
text='Export Database',
shortcut='Ctrl+S',
slot_fn=back.export_database)
menu.addSeparator()
menu.newAction(
name='actionImport_Img_file',
text='Import Images (select file(s))',
slot_fn=back.import_images_from_file)
menu.newAction(
name='actionImport_Img_dir',
text='Import Images (select directory)',
shortcut='Ctrl+I',
slot_fn=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',
# slot_fn=back.import_images_from_file_with_smart)
menu.newAction(
name='actionImport_Img_dir_with_smart',
text='Import Images (select directory) with smart Patrol XML',
slot_fn=back.import_images_from_dir_with_smart)
menu.addSeparator()
menu.newAction(
name='actionQuit',
text='Quit',
slot_fn=back.quit)
[docs]def setup_view_menu(mainwin, back):
mainwin.menuView = guitool.newMenu(mainwin, mainwin.menubar, 'menuView', 'View')
menu = mainwin.menuView
menu.addSeparator()
menu.newAction(
name='actionExpandNamesTree',
text='Expand Names Tree',
slot_fn=mainwin.expand_names_tree)
menu.addSeparator()
menu.newAction(
name='toggleThumbnails',
text='Toggle Thumbnails',
slot_fn=back.toggle_thumbnails)
menu.newAction(
name='actionLayout_Figures',
text='Layout Figures',
tooltip='Organizes windows in a grid',
shortcut='Ctrl+L',
slot_fn=back.layout_figures)
pass
[docs]def setup_actions_menu(mainwin, back):
""" ACTIONS MENU """
mainwin.menuActions = guitool.newMenu(mainwin, mainwin.menubar, 'menuActions', 'Actions')
menu = mainwin.menuActions
menu.newAction(
name='actionCompute_Occurrences',
text='Group Occurrences',
#shortcut='Ctrl+2',
slot_fn=back.compute_occurrences)
menu.addSeparator() # ---------
menu.newAction(
name='actionDetect',
text='Run Detection',
#shortcut='Ctrl+3',
slot_fn=back.run_detection)
menu.addSeparator() # ---------
menu.newAction(
name='actionQuery',
text='Query Single Annotation',
shortcut='Q',
slot_fn=functools.partial(back.compute_queries, use_visual_selection=True))
menu.newAction(
name='actionBatchIntraOccurrenceQueries',
text='Query: Intra Occurrence',
slot_fn=functools.partial(back.compute_queries, daids_mode=const.INTRA_OCCUR_KEY),
)
menu.newAction(
name='actionBatchVsExemplarQueries',
text='Query: vs Exemplars',
slot_fn=functools.partial(back.compute_queries, daids_mode=const.VS_EXEMPLARS_KEY),
)
menu.addSeparator() # ---------
menu.newAction(
name='actionSetExemplarsFromQualityAndViewpoint',
text='Set Exemplars from Quality and Viewpoint',
slot_fn=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='actionRunMergeChecks',
text='Run Merge Checks (Exemplars vs Exemplars)',
slot_fn=back.run_merge_checks)
mainwin.mergeMenu = guitool.newMenu(mainwin, menu, 'mergeMenu', 'Other Merge Checks')
mainwin.mergeMenu.newAction(
name='actionRunMergeChecks2',
text='Run Merge Checks (multitons)',
slot_fn=back.run_merge_checks_multitons
)
menu.addSeparator() # ---------
if not const.SIMPLIFY_INTERFACE:
menu.newAction(
name='actionBatchConsecutiveLocationSpeciesRename',
text='Consecutive Location+Species Rename',
slot_fn=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',
slot_fn=back.send_unshipped_processed_imagesets)
menu.addSeparator() # ---------
menu.newAction(
text='Override All Annotation Species',
slot_fn=back.override_all_annotation_species)
menu.newAction(
text='Rename Species',
slot_fn=back.update_species_nice_name)
menu.newAction(
text='Delete Species',
slot_fn=back.delete_selected_species)
menu.addSeparator() # ---------
menu.newAction(
name='actionDeleteAllImageSets',
text='Delete All ImageSets',
slot_fn=back.delete_all_imagesets)
menu.newAction(
name='actionDelete_Image',
text='Delete Image',
slot_fn=back.delete_image)
menu.newAction(
name='actionDelete_ANNOTATION',
text='Delete Annotation',
shortcut='Ctrl+Del',
slot_fn=back.delete_annot)
menu.addSeparator()
[docs]def setup_batch_menu(mainwin, back):
""" BATCH MENU """
mainwin.menuBatch = guitool.newMenu(mainwin, mainwin.menubar, 'menuBatch', 'Batch')
menu = mainwin.menuBatch
menu
[docs]def setup_option_menu(mainwin, back):
""" OPTIONS MENU """
mainwin.menuOptions = guitool.newMenu(mainwin, mainwin.menubar, 'menuOptions', 'Options')
menu = mainwin.menuOptions
menu.newAction(
name='actionToggleQueryMode',
text='Toggle Query Mode: ----',
tooltip='Changes behavior of Actions->Query',
slot_fn=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',
slot_fn=back.edit_preferences)
[docs]def setup_checks_menu(mainwin, back):
mainwin.menuChecks = guitool.newMenu(mainwin, mainwin.menubar, 'menuChecks', 'Checks')
pass
[docs]def setup_help_menu(mainwin, back):
""" HELP MENU """
mainwin.menuHelp = guitool.newMenu(mainwin, mainwin.menubar, 'menuHelp', 'Help')
menu = mainwin.menuHelp
#from ibeis.control import DB_SCHEMA_CURRENT
#version = DB_SCHEMA_CURRENT.VERSION_CURRENT
menu.newAction(
name='actionAbout',
text='About',
slot_fn=back.show_about_message)
menu.newAction(
name='actionDBInfo',
text='Database Info',
slot_fn=back.display_dbinfo),
#menu.newAction(
# name='actionView_Docs',
# text='View Documentation',
# slot_fn=back.view_docs)
# ---
menu.addSeparator()
# ---
menu.newAction(
text='View Logs',
slot_fn=back.view_logs)
mainwin.viewDirectoryMenu = guitool.newMenu(mainwin, menu, 'viewDirectoryMenu', 'View Directories')
mainwin.viewDirectoryMenu.newAction(
text='View Log Directory',
slot_fn=back.view_log_dir)
mainwin.viewDirectoryMenu.newAction(
text='View Database Directory',
slot_fn=back.view_database_dir)
mainwin.viewDirectoryMenu.newAction(
text='View Application Files Directory',
slot_fn=back.view_app_files_dir)
# ---
menu.addSeparator()
# ---
menu.newAction(
text='Run Integrity Checks',
slot_fn=back.run_integrity_checks)
menu.newAction(
text='Fix/Clean Database Integrity',
slot_fn=back.fix_and_clean_database)
[docs]def setup_web_menu(mainwin, back):
mainwin.menuWeb = guitool.newMenu(mainwin, mainwin.menubar, 'menuWeb', 'Web')
menu = mainwin.menuWeb
menu.newAction(
text='Startup Web Interface',
slot_fn=back.start_web_server_parallel)
menu.newAction(
text='Shutdown Web Interface',
slot_fn=back.kill_web_server_parallel)
menu.addSeparator()
menu.newAction(
text='Startup Wildbook',
slot_fn=back.startup_wildbook)
menu.newAction(
text='Shutdown Wildbook',
slot_fn=back.shutdown_wildbook)
menu.addSeparator()
menu.newAction(
text='Browse Wildbook',
slot_fn=back.browse_wildbook)
menu.newAction(
text='Force Wildbook Name Change',
slot_fn=back.force_wildbook_namechange)
menu.addSeparator()
menu.newAction(
text='Install Wildbook',
slot_fn=back.install_wildbook)
#def setup_wildbook_menu(mainwin, back):
# mainwin.menuWildbook = guitool.newMenu(mainwin, mainwin.menubar, 'menuWildbook', 'Wildbook')
# menu = mainwin.menuWildbook
[docs]def setup_developer_menu(mainwin, back):
""" DEV MENU """
mainwin.menuDev = guitool.newMenu(mainwin, mainwin.menubar, 'menuDev', 'Dev')
menu = mainwin.menuDev
menu.newAction(
name='actionMakeIPythonNotebook',
text='Launch IPython Notebook',
slot_fn=back.launch_ipy_notebook)
menu.newAction(
name='actionDeveloper_mode',
text='Developer IPython',
shortcut='Ctrl+Shift+I',
slot_fn=back.dev_mode)
menu.newAction(
text='Set Work Directory',
slot_fn=back.set_workdir)
menu.newAction(
text='Update Source Install',
slot_fn=back.update_source_install)
# TESTS
mainwin.menuTests = guitool.newMenu(mainwin, menu, 'menuTests', 'Tests')
mainwin.menuTests.newAction(
text='Run IBEIS Tests',
slot_fn=back.run_tests)
mainwin.menuTests.newAction(
text='Run Utool Tests',
slot_fn=back.run_utool_tests)
mainwin.menuTests.newAction(
text='Run Vtool Tests',
slot_fn=back.run_vtool_tests)
mainwin.menuTests.newAction(
text='Assert Modules',
slot_fn=back.assert_modules)
# --- TESTS --
menu.addSeparator()
menu.newAction(
name='actionDeveloper_DumpDB',
text='Dump SQL Database',
slot_fn=back.dev_dumpdb)
menu.addSeparator()
menu.newAction(
name='actionLocalizeImages',
text='Localize Images',
slot_fn=back.localize_images)
menu.addSeparator()
menu.newAction(
name='export_learning_data',
text='Export learning data',
slot_fn=back.dev_export_annotations)
menu.newAction(
name='actionTrainWithImageSets',
text='Train RF with Open ImageSet',
slot_fn=back.train_rf_with_imageset)
menu.addSeparator() # ---------
adv_ieq_menu = mainwin.menuAdvancedIEQuery = guitool.newMenu(mainwin, menu, 'menuAdvancedIEQuery', 'Advanced Intra Occurrence Queries')
adv_exq_menu = mainwin.menuAdvancedEXQuery = guitool.newMenu(mainwin, menu, 'menuAdvancedEXQuery', 'Advanced Vs Exemplar Queries')
menu.addSeparator() # ---------
adv_ieq_menu.newAction(
name='actionBatchUnknownIntraImageSetQueries',
text='Query: Unknown Intra Occurrence',
slot_fn=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',
slot_fn=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',
slot_fn=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',
slot_fn=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, augment_queryside_hack=True)),
)
adv_ieq_menu.newAction(
name='actionQueryInEncMode1',
text='Query: Names Intra Occurrence With OriAugment',
slot_fn=functools.partial(back.compute_queries, daids_mode=const.INTRA_OCCUR_KEY,
use_prioritized_name_subset=True,
cfgdict=dict(augment_queryside_hack=True, can_match_samename=False, use_k_padding=False)),
)
adv_exq_menu.newAction(
name='actionQueryVsExempMode2',
text='Query: Names VsExamplar With OriAugment',
slot_fn=functools.partial(back.compute_queries, daids_mode=const.VS_EXEMPLARS_KEY,
use_prioritized_name_subset=True,
cfgdict=dict(augment_queryside_hack=True, can_match_samename=False, use_k_padding=False)),
)
menu.addSeparator() # ---------
menu.newAction(
name='takeScreenshot',
text='Take Screenshot',
#shortcut='Ctrl+]',
shortcut='Ctrl+K',
slot_fn=back.take_screenshot)
setup_depricated_menu(mainwin, back)
[docs]def setup_refresh_menu(mainwin, back):
mainwin.menuRefresh = guitool.newMenu(mainwin, mainwin.menubar, 'menuRefresh', 'Refresh')
menu = mainwin.menuRefresh
# ---------
menu.newAction(
name='actionDeveloper_CLS',
text='Refresh Tables',
shortcut='Ctrl+Shift+C',
slot_fn=back.dev_cls)
# ---------
menu.newAction(
name='actionUpdateSpecialImageSets',
text='Refresh Special ImageSets',
slot_fn=back.update_special_imagesets)
# ---------
menu.newAction(
name='actionReconnectController',
text='Reconnect Controller',
slot_fn=back.reconnect_controller)
menu.addSeparator() # ---------
# ---------
menu.newAction(
name='actionRedownload_Detection_Models',
text='Redownload Detection Models',
slot_fn=back.redownload_detection_models)
# ---------
menu.addSeparator()
# ---------
menu.newAction(
name='actionDelete_Precomputed_Results',
text='Delete Cached Query Results',
slot_fn=back.delete_queryresults_dir)
menu.newAction(
name='actionDelete_Cache_Directory',
text='Delete Database Cache',
slot_fn=back.delete_cache)
menu.newAction(
name='actionDelete_global_preferences',
text='Delete Global Preferences',
slot_fn=back.delete_global_prefs)
menu.newAction(
name='actionDeleteThumbnails',
text='Delete Thumbnails',
slot_fn=back.delete_thumbnails)
[docs]def setup_depricated_menu(mainwin, back):
#mainwin.menuDepr = guitool.newMenu(mainwin, mainwin.menubar, 'menuDepr', 'Depricated')
mainwin.menuDepr = guitool.newMenu(mainwin, mainwin.menuDev, 'menuDepr', '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',
# slot_fn=back.compute_queries)
menu.addSeparator() # ---------
# menu.newAction(
# text='Query: Incremental',
# slot_fn=back.incremental_query
# )
menu.newAction(
text='Import Cropped Images As Annotations (select file(s))',
slot_fn=back.import_images_as_annots_from_file)
menu.addSeparator()
menu.newAction(
text='Developer Reload',
shortcut='Ctrl+Shift+R',
slot_fn=back.dev_reload)
menu.newAction(
text='Reviewed All Occurrence Images',
slot_fn=back.imageset_reviewed_all_images)
if __name__ == '__main__':
"""
CommandLine:
python -m ibeis.gui.guimenus --test-setup_dummy_menus
python -m ibeis.gui.guimenus
python -m ibeis.gui.guimenus --allexamples
python -m ibeis.gui.guimenus --allexamples --noface --nosrc
"""
import multiprocessing
multiprocessing.freeze_support() # for win32
import utool as ut # NOQA
ut.doctest_funcs()