# -*- coding: utf-8 -*-
"""
This provides concrete classes which inherit from abstract
api_item_models/api_table_models/api_tree_models in guitool.
"""
from __future__ import absolute_import, division, print_function
import utool as ut
from wbia.guitool import (
APIItemModel,
APITableView,
APITreeView,
APIItemWidget,
StripeProxyModel,
ChangeLayoutContext,
)
print, rrr, profile = ut.inject2(__name__)
# ---------------------
# --- IBEIS Tables ---
# ---------------------
VERBOSE_GUI = ut.VERBOSE or ut.get_argflag(('--verbose-gui', '--verbgui'))
IBEISSTRIPEMODEL_BASE = StripeProxyModel
# IBEISSTRIPEMODEL_BASE = APIItemModel
IBEISITEMMODEL_BASE = APIItemModel
[docs]class IBEISStripeModel(IBEISSTRIPEMODEL_BASE):
""" Used for the image grid """
def __init__(model, headers=None, parent=None, *args):
# IBEISSTRIPEMODEL_BASE.__init__(model, parent=parent, numduplicates=1, *args)
super(IBEISStripeModel, model).__init__(parent=parent, numduplicates=1, *args)
model.ibswin = parent
model.imgsetid = -1 # negative one is an invalid imgsetid
model.original_ider = None
if IBEISSTRIPEMODEL_BASE == StripeProxyModel:
model.sourcemodel = APIItemModel(parent=parent)
model.setSourceModel(model.sourcemodel)
if ut.VERBOSE:
print('[ibs_model] just set the sourcemodel')
def _update_headers(model, **headers):
def _null_ider(**kwargs):
return []
model.original_iders = headers.get('iders', [_null_ider])
if len(model.original_iders) > 0:
model.new_iders = model.original_iders[:]
model.new_iders[0] = model._ider
headers['iders'] = model.new_iders
model._nd = headers.get('num_duplicates', 1)
model.sourcemodel._update_headers(**headers)
# return IBEISSTRIPEMODEL_BASE._update_headers(model, **headers)
def _ider(model):
""" Overrides the API model ider to give only selected imageset ids """
return model.original_iders[0](imgsetid=model.imgsetid)
def _change_imageset(model, imgsetid):
model.imgsetid = imgsetid
with ChangeLayoutContext([model]):
# IBEISSTRIPEMODEL_BASE._update_rows(model)
super(IBEISStripeModel, model)._update_rows()
[docs]class IBEISTableView(APITableView):
"""
View for ANNOTATION / NAME / IMAGE Tables
"""
def __init__(tblview, parent=None):
super(IBEISTableView, tblview).__init__(parent=parent)
# APITableView.__init__(tblview, parent)
tblview.ibswin = parent
def _change_imageset(tblview, imgsetid):
if VERBOSE_GUI:
print('[gui.IBEISTableView] _change_imageset(%r)' % (imgsetid))
tblview.verticalScrollBar().setSliderPosition(0)
model = tblview.model()
if model is not None:
model._change_imageset(imgsetid)
[docs]class IBEISItemModel(IBEISITEMMODEL_BASE):
def __init__(model, headers=None, parent=None, *args):
# IBEISITEMMODEL_BASE.__init__(model, parent=parent, *args)
super(IBEISItemModel, model).__init__(parent=parent, *args)
model.ibswin = parent
model.imgsetid = -1
model.original_ider = None
def _update_headers(model, **headers):
"""
filter the iders
"""
def _null_ider(**kwargs):
return []
model.original_iders = headers.get('iders', [_null_ider])
if len(model.original_iders) > 0:
model.new_iders = model.original_iders[:]
model.new_iders[0] = model._ider
headers['iders'] = model.new_iders
super(IBEISItemModel, model)._update_headers(**headers)
# return IBEISITEMMODEL_BASE._update_headers(model, **headers)
def _ider(model):
"""
Overrides the API model ider to give filtered output,
ie: only selected imageset ids
"""
return model.original_iders[0](imgsetid=model.imgsetid)
def _change_imageset(model, imgsetid):
if VERBOSE_GUI:
print('[gui.IBEISItemModel] _change_imageset(%r)' % (imgsetid))
model.imgsetid = imgsetid
with ChangeLayoutContext([model]):
super(IBEISItemModel, model)._update_rows()
# IBEISITEMMODEL_BASE._update_rows(model)
[docs]class IBEISTreeView(APITreeView):
"""
View for NAME / ANNOTATION Tree
"""
def __init__(treeview, parent=None):
# SUPER WEIRD, super doesn't work here
APITreeView.__init__(treeview, parent)
# super(APITreeView, treeview).__init__(parent)
treeview.ibswin = parent
def _change_imageset(treeview, imgsetid):
if VERBOSE_GUI:
print('[gui.IBEISTreeView] _change_imageset(%r)' % (imgsetid))
treeview.verticalScrollBar().setSliderPosition(0)
model = treeview.model()
if model is not None:
# FIXME: should defer the change of imageset until
# the view becomes visible
model._change_imageset(imgsetid)
# -------------------------
# --- IMAGESET TABLES ---
# -------------------------
# APIItemWidget.__init__(widget, headers=headers, parent=parent,
# model_class=ImagesetTableModel,
# view_class=ImagesetTableView)
[docs]class ImagesetTableModel(APIItemModel):
def __init__(model, headers=None, parent=None):
model.ibswin = parent
model.headers = headers
# APIItemModel.__init__(model, headers=headers, parent=parent)
super(ImagesetTableModel, model).__init__(headers=headers, parent=parent)
[docs]class ImagesetTableView(APITableView):
"""
View for ImageSet Table
"""
def __init__(tblview, parent=None):
APITableView.__init__(tblview, parent)
# super(ImagesetTableView, tblview).__init__(parent)
tblview.ibswin = parent
# tblview.setMaximumSize(500, 9999)