def simple_thumbnail_widget(): r""" Very simple example to test thumbnails CommandLine: python -m guitool.api_item_model --test-simple_thumbnail_widget --show Example: >>> # ENABLE_DOCTEST >>> import guitool >>> from guitool.api_item_model import * # NOQA >>> guitool.ensure_qapp() # must be ensured before any embeding >>> wgt = simple_thumbnail_widget() >>> ut.quit_if_noshow() >>> wgt.show() >>> guitool.qtapp_loop(wgt, frequency=100, init_signals=True) """ import guitool guitool.ensure_qapp() col_name_list = ['rowid', 'image_name', 'thumb'] col_types_dict = { 'thumb': 'PIXMAP', } def thumb_getter(id_, thumbsize=128): """ Thumb getters must conform to thumbtup structure """ #print(id_) return ut.grab_test_imgpath(id_) #return None col_getter_dict = { 'rowid': [1, 2, 3], 'image_name': ['lena.png', 'carl.jpg', 'patsy.jpg'], 'thumb': thumb_getter } col_ider_dict = { 'thumb': 'image_name', } col_setter_dict = {} editable_colnames = [] sortby = 'rowid' def get_thumb_size(): return 128 col_width_dict = {} col_bgrole_dict = {} api = guitool.CustomAPI( col_name_list, col_types_dict, col_getter_dict, col_bgrole_dict, col_ider_dict, col_setter_dict, editable_colnames, sortby, get_thumb_size, True, col_width_dict) headers = api.make_headers(tblnice='Simple Example') wgt = guitool.APIItemWidget() wgt.change_headers(headers) #guitool.qtapp_loop(qwin=wgt, ipy=ipy, frequency=loop_freq) return wgt
def make_test_result_custom_api(ibs, testres): import guitool guitool.ensure_qapp() cfgx = 0 cfgres_info = testres.cfgx2_cfgresinfo[cfgx] qaids = testres.qaids gt_aids = cfgres_info['qx2_gt_aid'] gf_aids = cfgres_info['qx2_gf_aid'] qx2_gt_timedelta = ibs.get_annot_pair_timdelta(qaids, gt_aids) qx2_gf_timedelta = ibs.get_annot_pair_timdelta(qaids, gf_aids) col_name_list = [ 'qaids', 'qx2_gt_aid', 'qx2_gf_aid', 'qx2_gt_timedelta', 'qx2_gf_timedelta', ] col_types_dict = {} col_getter_dict = {} col_getter_dict.update(**cfgres_info) col_getter_dict['qaids'] = testres.qaids col_getter_dict['qx2_gt_timedelta'] = qx2_gt_timedelta col_getter_dict['qx2_gf_timedelta'] = qx2_gf_timedelta col_bgrole_dict = {} col_ider_dict = {} col_setter_dict = {} editable_colnames = [] sortby = 'qaids' def get_thumb_size(): return 128 col_width_dict = {} custom_api = guitool.CustomAPI(col_name_list, col_types_dict, col_getter_dict, col_bgrole_dict, col_ider_dict, col_setter_dict, editable_colnames, sortby, get_thumb_size, True, col_width_dict) #headers = custom_api.make_headers(tblnice='results') #print(ut.dict_str(headers)) wgt = guitool.APIItemWidget() wgt.connect_api(custom_api) return wgt
def simple_api_item_widget(): r""" Very simple example of basic APIItemWidget widget with CustomAPI CommandLine: python -m guitool.api_item_widget --test-simple_api_item_widget python -m guitool.api_item_widget --test-simple_api_item_widget --show Example: >>> # ENABLE_DOCTEST >>> from guitool.api_item_widget import * # NOQA >>> import guitool >>> guitool.ensure_qapp() # must be ensured before any embeding >>> wgt = simple_api_item_widget() >>> ut.quit_if_noshow() >>> wgt.show() >>> guitool.qtapp_loop(wgt, frequency=100) """ import guitool guitool.ensure_qapp() col_name_list = ['col1', 'col2'] col_types_dict = {} col_getter_dict = { 'col1': [1, 2, 3], 'col2': ['a', 'b', 'c'], } col_ider_dict = {} col_setter_dict = {} editable_colnames = [] sortby = 'col1' get_thumb_size = lambda: 128 # HACK col_width_dict = {} col_bgrole_dict = {} api = guitool.CustomAPI(col_name_list, col_types_dict, col_getter_dict, col_bgrole_dict, col_ider_dict, col_setter_dict, editable_colnames, sortby, get_thumb_size, True, col_width_dict) headers = api.make_headers(tblnice='Simple Example') wgt = guitool.APIItemWidget() wgt.change_headers(headers) #guitool.qtapp_loop(qwin=wgt, ipy=ipy, frequency=loop_freq) return wgt
def simple_thumbnail_widget(): r""" Very simple example to test thumbnails CommandLine: python -m guitool.api_thumb_delegate --test-simple_thumbnail_widget --show python -m guitool.api_thumb_delegate --test-simple_thumbnail_widget --show --tb Example: >>> # GUI_DOCTEST >>> from guitool.api_thumb_delegate import * # NOQA >>> import guitool >>> guitool.ensure_qapp() # must be ensured before any embeding >>> wgt = simple_thumbnail_widget() >>> ut.quit_if_noshow() >>> wgt.show() >>> guitool.qtapp_loop(wgt, frequency=100) """ import guitool guitool.ensure_qapp() col_name_list = ['rowid', 'image_name', 'thumb'] col_types_dict = { 'thumb': 'PIXMAP', } guitool_test_thumbdir = ut.ensure_app_resource_dir('guitool', 'thumbs') ut.delete(guitool_test_thumbdir) ut.ensuredir(guitool_test_thumbdir) import vtool as vt from os.path import join def thumb_getter(id_, thumbsize=128): """ Thumb getters must conform to thumbtup structure """ #print(id_) if id_ == 'doesnotexist.jpg': return None img_path = None img_size = (100, 100) else: img_path = ut.grab_test_imgpath(id_, verbose=False) img_size = vt.open_image_size(img_path) thumb_path = join(guitool_test_thumbdir, ut.hashstr(str(img_path)) + '.jpg') if id_ == 'carl.jpg': bbox_list = [(10, 10, 200, 200)] theta_list = [0] elif id_ == 'lena.png': #bbox_list = [(10, 10, 200, 200)] bbox_list = [None] theta_list = [None] else: bbox_list = [] theta_list = [] thumbtup = (thumb_path, img_path, img_size, bbox_list, theta_list) #print('thumbtup = %r' % (thumbtup,)) return thumbtup #return None #imgname_list = sorted(ut.TESTIMG_URL_DICT.keys()) imgname_list = ['carl.jpg', 'lena.png', 'patsy.jpg'] imgname_list += ['doesnotexist.jpg'] col_getter_dict = { 'rowid': list(range(len(imgname_list))), 'image_name': imgname_list, 'thumb': thumb_getter } col_ider_dict = { 'thumb': 'image_name', } col_setter_dict = {} editable_colnames = [] sortby = 'rowid' get_thumb_size = lambda: 128 # NOQA col_width_dict = {} col_bgrole_dict = {} api = guitool.CustomAPI( col_name_list, col_types_dict, col_getter_dict, col_bgrole_dict, col_ider_dict, col_setter_dict, editable_colnames, sortby, get_thumb_size, True, col_width_dict) headers = api.make_headers(tblnice='Utool Test Images') wgt = guitool.APIItemWidget() wgt.change_headers(headers) wgt.resize(600, 400) #guitool.qtapp_loop(qwin=wgt, ipy=ipy, frequency=loop_freq) return wgt
def make_metadata_custom_api(metadata): r""" CommandLine: python -m ibeis.expt.experiment_drawing --test-make_metadata_custom_api --show Example: >>> # DISABLE_DOCTEST >>> from ibeis.expt.experiment_drawing import * # NOQA >>> import guitool >>> guitool.ensure_qapp() >>> metadata_fpath = '/media/raid/work/Elephants_drop1_ears/_ibsdb/figures/result_metadata.shelf' >>> metadata = ResultMetadata(metadata_fpath, autoconnect=True) >>> wgt = make_metadata_custom_api(metadata) >>> ut.quit_if_noshow() >>> wgt.show() >>> wgt.raise_() >>> guitool.qtapp_loop(wgt, frequency=100) """ import guitool from guitool.__PYQT__ import QtCore class MetadataViewer(guitool.APIItemWidget): def __init__(wgt, parent=None, tblnice='Result Metadata Viewer', **kwargs): guitool.APIItemWidget.__init__(wgt, parent=parent, tblnice=tblnice, **kwargs) wgt.connect_signals_and_slots() @guitool.slot_(QtCore.QModelIndex) def _on_doubleclick(wgt, qtindex): print('[wgt] _on_doubleclick: ') col = qtindex.column() if wgt.api.col_edit_list[col]: print('do nothing special for editable columns') return model = qtindex.model() colname = model.get_header_name(col) if colname.endswith('fpath'): print('showing fpath') fpath = model.get_header_data(colname, qtindex) ut.startfile(fpath) def connect_signals_and_slots(wgt): #wgt.view.clicked.connect(wgt._on_click) wgt.view.doubleClicked.connect(wgt._on_doubleclick) #wgt.view.pressed.connect(wgt._on_pressed) #wgt.view.activated.connect(wgt._on_activated) guitool.ensure_qapp() #cfgstr_list = metadata col_name_list, column_list = metadata.get_square_data() # Priority of column names colname_priority = [ 'qaids', 'qx2_gt_rank', 'qx2_gt_timedelta', 'qx2_gf_timedelta', 'analysis_fpath', 'qx2_gt_raw_score', 'qx2_gf_raw_score' ] colname_priority += sorted( ut.setdiff_ordered(col_name_list, colname_priority)) sortx = ut.priority_argsort(col_name_list, colname_priority) col_name_list = ut.take(col_name_list, sortx) column_list = ut.take(column_list, sortx) col_lens = list(map(len, column_list)) print('col_name_list = %r' % (col_name_list, )) print('col_lens = %r' % (col_lens, )) assert len(col_lens) > 0, 'no columns' assert col_lens[0] > 0, 'no rows' assert all([len_ == col_lens[0] for len_ in col_lens]), 'inconsistant data' col_types_dict = {} col_getter_dict = dict(zip(col_name_list, column_list)) col_bgrole_dict = {} col_ider_dict = {} col_setter_dict = {} col_nice_dict = {name: name.replace('qx2_', '') for name in col_name_list} col_nice_dict.update({ 'qx2_gt_timedelta': 'GT TimeDelta', 'qx2_gf_timedelta': 'GF TimeDelta', 'qx2_gt_rank': 'GT Rank', }) editable_colnames = [] sortby = 'qaids' def get_thumb_size(): return 128 col_width_dict = {} custom_api = guitool.CustomAPI(col_name_list, col_types_dict, col_getter_dict, col_bgrole_dict, col_ider_dict, col_setter_dict, editable_colnames, sortby, get_thumb_size, sort_reverse=True, col_width_dict=col_width_dict, col_nice_dict=col_nice_dict) #headers = custom_api.make_headers(tblnice='results') #print(ut.dict_str(headers)) wgt = MetadataViewer() wgt.connect_api(custom_api) return wgt
def make_review_api(ibs, cm_list, review_cfg, qreq_=None): """ Builds columns which are displayable in a ColumnListTableWidget CommandLine: python -m ibeis.gui.id_review_api --test-test_review_widget --show python -m ibeis.gui.id_review_api --test-make_review_api Example: >>> # ENABLE_DOCTEST >>> from ibeis.gui.id_review_api import * # NOQA >>> import ibeis >>> import guitool as gt >>> from ibeis.gui import id_review_api >>> cm_list, qreq_ = ibeis.main_helpers.testdata_cmlist() >>> tblname = 'chipmatch' >>> name_scoring = False >>> ranks_top = 5 >>> review_cfg = dict(ranks_top=ranks_top, name_scoring=name_scoring) >>> review_api = make_review_api(qreq_.ibs, cm_list, review_cfg, qreq_=qreq_) >>> print('review_api = %r' % (review_api,)) """ # TODO: Add in timedelta to column info if ut.VERBOSE: print('[inspect] make_review_api') review_edges = get_review_edges(cm_list, ibs=ibs, review_cfg=review_cfg) # Get extra info (qaids, daids, scores, ranks) = review_edges RES_THUMB_TEXT = 'ResThumb' # NOQA QUERY_THUMB_TEXT = 'querythumb' MATCH_THUMB_TEXT = 'MatchThumb' col_name_list = [ 'result_index', 'score', REVIEWED_STATUS_TEXT, ] if review_cfg.get('show_chips', True): col_name_list += [ MATCHED_STATUS_TEXT, QUERY_THUMB_TEXT, ] col_name_list += [ RES_THUMB_TEXT, 'qaid', 'aid', 'rank', 'timedelta', 'dnGt', 'qnGt', 'tags', 'qname', 'name', ] col_types_dict = dict([ ('qaid', int), ('aid', int), ('dnGt', int), ('qnGt', int), ('timedelta', float), #('review', 'BUTTON'), (MATCHED_STATUS_TEXT, str), (REVIEWED_STATUS_TEXT, str), (QUERY_THUMB_TEXT, 'PIXMAP'), (RES_THUMB_TEXT, 'PIXMAP'), ('qname', str), ('name', str), ('score', float), ('rank', int), ('truth', bool), ('opt', int), ('result_index', int), ]) timedelta_list = np.array(ut.take_column(ibs.get_unflat_annots_timedelta_list(list(zip(qaids, daids))), 0)) # TODO: make a display role #timediff_list = [ut.get_posix_timedelta_str(t, year=True, approx=True) for t in (timedelta_list * 60 * 60)] def get_pair_tags(edge): aid1, aid2 = edge assert not ut.isiterable(aid1), 'aid1=%r, aid2=%r' % (aid1, aid2) assert not ut.isiterable(aid2), 'aid1=%r, aid2=%r' % (aid1, aid2) am_rowids = ibs.get_annotmatch_rowid_from_undirected_superkey( [aid1], [aid2]) tag_text = ibs.get_annotmatch_tag_text(am_rowids)[0] if tag_text is None: tag_text = '' return str(tag_text) col_getter_dict = dict([ ('qaid', np.array(qaids)), ('aid', np.array(daids)), ('dnGt', ibs.get_annot_num_groundtruth), ('qnGt', ibs.get_annot_num_groundtruth), ('timedelta', np.array(timedelta_list)), #('review', lambda rowid: get_buttontup), (MATCHED_STATUS_TEXT, partial(get_match_status, ibs)), (REVIEWED_STATUS_TEXT, partial(get_reviewed_status, ibs)), (QUERY_THUMB_TEXT, ibs.get_annot_chip_thumbtup), (RES_THUMB_TEXT, ibs.get_annot_chip_thumbtup), ('qname', ibs.get_annot_names), ('name', ibs.get_annot_names), ('score', np.array(scores)), ('rank', np.array(ranks)), ('result_index', np.arange(len(ranks))), ('tags', get_pair_tags), #lambda aid_pair: ibs.get_annotmatch_tag_text(ibs.get_annotmatch_rowid_from_undirected_superkey(ut.ensure_iterable(aid_pair[0]), ut.ensure_iterable(aid_pair[1])))[0]), #('truth', truths), #('opt', opts), ]) # default is 100 col_width_dict = { 'score': 75, REVIEWED_STATUS_TEXT: 75, MATCHED_STATUS_TEXT: 75, 'rank': 42, 'qaid': 42, 'aid': 42, 'result_index': 42, 'qname': 60, 'name': 60, 'dnGt': 50, 'timedelta': 75, 'tags': 75, 'qnGt': 50, } USE_MATCH_THUMBS = 1 if USE_MATCH_THUMBS: def get_match_thumbtup(ibs, qaid2_cm, qaids, daids, index, qreq_=None, thumbsize=(128, 128), match_thumbtup_cache={}): daid = daids[index] qaid = qaids[index] cm = qaid2_cm[qaid] assert cm.qaid == qaid, 'aids do not aggree' OLD = False if OLD: fpath = ensure_match_img(ibs, cm, daid, qreq_=qreq_, match_thumbtup_cache=match_thumbtup_cache) if isinstance(thumbsize, int): thumbsize = (thumbsize, thumbsize) thumbtup = (ut.augpath(fpath, 'thumb_%d,%d' % thumbsize), fpath, thumbsize, [], []) return thumbtup else: # Hacky new way of drawing fpath, func, func2 = make_ensure_match_img_nosql_func(qreq_, cm, daid) #match_thumbdir = ibs.get_match_thumbdir() #match_thumb_fname = get_match_thumb_fname(cm, daid, qreq_) #fpath = ut.unixjoin(match_thumbdir, match_thumb_fname) thumbdat = { 'fpath': fpath, 'thread_func': func, 'main_func': func2, #'args': (ibs, cm, daid), #'kwargs': dict(qreq_=qreq_, # match_thumbtup_cache=match_thumbtup_cache) } return thumbdat col_name_list.insert(col_name_list.index('qaid'), MATCH_THUMB_TEXT) col_types_dict[MATCH_THUMB_TEXT] = 'PIXMAP' #col_types_dict[MATCH_THUMB_TEXT] = CustomMatchThumbDelegate qaid2_cm = {cm.qaid: cm for cm in cm_list} get_match_thumbtup_ = partial(get_match_thumbtup, ibs, qaid2_cm, qaids, daids, qreq_=qreq_, match_thumbtup_cache={}) col_getter_dict[MATCH_THUMB_TEXT] = get_match_thumbtup_ col_bgrole_dict = { MATCHED_STATUS_TEXT : partial(get_match_status_bgrole, ibs), REVIEWED_STATUS_TEXT: partial(get_reviewed_status_bgrole, ibs), } # TODO: remove ider dict. # it is massively unuseful col_ider_dict = { MATCHED_STATUS_TEXT : ('qaid', 'aid'), REVIEWED_STATUS_TEXT : ('qaid', 'aid'), 'tags' : ('qaid', 'aid'), QUERY_THUMB_TEXT : ('qaid'), RES_THUMB_TEXT : ('aid'), 'dnGt' : ('aid'), 'qnGt' : ('qaid'), 'qname' : ('qaid'), 'name' : ('aid'), } col_setter_dict = { 'qname': ibs.set_annot_names, 'name': ibs.set_annot_names } editable_colnames = ['truth', 'notes', 'qname', 'name', 'opt'] sortby = 'score' def get_thumb_size(): return ibs.cfg.other_cfg.thumb_size col_display_role_func_dict = { 'timedelta': ut.partial(ut.get_posix_timedelta_str, year=True, approx=2), } if not review_cfg.get('show_chips', True): del col_getter_dict[QUERY_THUMB_TEXT] del col_getter_dict[RES_THUMB_TEXT] del col_types_dict[RES_THUMB_TEXT] del col_types_dict[QUERY_THUMB_TEXT] del col_ider_dict[RES_THUMB_TEXT] del col_ider_dict[QUERY_THUMB_TEXT] # del col_bgrole_dict[RES_THUMB_TEXT] # del col_bgrole_dict[QUERY_THUMB_TEXT] # Insert info into dict review_api = gt.CustomAPI( col_name_list=col_name_list, col_types_dict=col_types_dict, col_getter_dict=col_getter_dict, col_bgrole_dict=col_bgrole_dict, col_ider_dict=col_ider_dict, col_setter_dict=col_setter_dict, editable_colnames=editable_colnames, col_display_role_func_dict=col_display_role_func_dict, sortby=sortby, get_thumb_size=get_thumb_size, sort_reverse=True, col_width_dict=col_width_dict) #review_api.review_edges = review_edges return review_api