Source code for wbia.guitool.api_table_view
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function
from wbia.guitool.__PYQT__ import QtCore, QtGui
from wbia.guitool.__PYQT__ import QtWidgets
from wbia.guitool import api_item_view
from wbia.guitool.guitool_decorators import signal_, slot_
import utool
(print, rrr, profile) = utool.inject2(__name__, '[APITableView]', DEBUG=False)
# If you need to set the selected index try:
# AbstractItemView::setCurrentIndex
# AbstractItemView::scrollTo
# AbstractItemView::keyboardSearch
API_VIEW_BASE = QtWidgets.QTableView
# API_VIEW_BASE = QtWidgets.QAbstractItemView
[docs]class APITableView(API_VIEW_BASE):
"""
Table view of API data.
Implicitly inherits from APIItemView
"""
rows_updated = signal_(str, int)
contextMenuClicked = signal_(QtCore.QModelIndex, QtCore.QPoint)
API_VIEW_BASE = API_VIEW_BASE
def __init__(view, parent=None):
# Qt Inheritance
API_VIEW_BASE.__init__(view, parent)
# Implicitly inject common APIItemView functions
api_item_view.injectviewinstance(view)
view._init_itemview_behavior()
view._init_table_behavior()
view._init_header_behavior()
view.col_hidden_list = []
# Context menu
view.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
view.customContextMenuRequested.connect(view.on_customMenuRequested)
view._init_api_item_view()
# ---------------
# Initialization
# ---------------
def _init_table_behavior(view):
""" Table behavior
SeeAlso:
api_item_view._init_itemview_behavior
"""
# Allow sorting by column
view.setCornerButtonEnabled(False)
view.setShowGrid(True)
view.setIconSize(QtCore.QSize(64, 64))
def _init_header_behavior(view):
""" Header behavior
CommandLine:
python -m wbia.guitool.api_item_widget --test-simple_api_item_widget --show
python -m wbia.guitool.api_table_view --test-_init_header_behavior --show
Example:
>>> # ENABLE_DOCTEST
>>> from wbia.guitool.api_table_view import * # NOQA
>>> import wbia.guitool
>>> guitool.ensure_qapp()
>>> view = APITableView()
>>> view._init_header_behavior()
"""
# Row Headers
verticalHeader = view.verticalHeader()
verticalHeader.setVisible(False)
# verticalHeader.setSortIndicatorShown(True)
verticalHeader.setHighlightSections(True)
try:
verticalHeader.setResizeMode(QtWidgets.QHeaderView.Interactive)
verticalHeader.setMovable(False)
except AttributeError:
verticalHeader.setSectionResizeMode(QtWidgets.QHeaderView.Interactive)
verticalHeader.setSectionsMovable(False)
# TODO: get good estimate if there are thumbnails
# verticalHeader.setDefaultSectionSize(256)
# Column headers
horizontalHeader = view.horizontalHeader()
horizontalHeader.setVisible(True)
horizontalHeader.setStretchLastSection(True)
horizontalHeader.setSortIndicatorShown(True)
horizontalHeader.setHighlightSections(True)
# Column Sizes
# DO NOT USE ResizeToContents. IT MAKES THINGS VERY SLOW
# horizontalHeader.setResizeMode(QtWidgets.QHeaderView.ResizeToContents)
# horizontalHeader.setResizeMode(QtWidgets.QHeaderView.Stretch)
try:
horizontalHeader.setResizeMode(QtWidgets.QHeaderView.Interactive)
horizontalHeader.setMovable(True)
except AttributeError:
horizontalHeader.setSectionResizeMode(QtWidgets.QHeaderView.Interactive)
horizontalHeader.setSectionsMovable(True)
# horizontalHeader.setCascadingSectionResizes(True)
# Columns moveable
# ---------------
# Qt Overrides
# ---------------
[docs] def setModel(view, model):
""" QtOverride: Returns item delegate for this index """
api_item_view.setModel(view, model)
[docs] def keyPressEvent(view, event):
"""
CommandLine:
python -m wbia.guitool.api_item_widget --test-simple_api_item_widget --show
python -m wbia.guitool.api_table_view --test-keyPressEvent --show
Example:
>>> # ENABLE_DOCTEST
>>> from wbia.guitool.api_table_view import * # NOQA
>>> import wbia.guitool
>>> guitool.ensure_qapp()
>>> view = APITableView()
>>> view._init_header_behavior()
"""
return api_item_view.keyPressEvent(view, event)
# # TODO: can this be in api_item_view?
# assert isinstance(event, QtGui.QKeyEvent)
# view.API_VIEW_BASE.keyPressEvent(view, event)
# if event.matches(QtGui.QKeySequence.Copy):
# #print('Received Ctrl+C in View')
# view.copy_selection_to_clipboard()
# #print ('[view] keyPressEvent: %s' % event.key())
# for func in view.registered_keypress_funcs:
# func(view, event)
# for key, func in view.registered_single_keys:
# #print(key)
# if event.key() == key:
# func(view, event)
[docs] def mouseMoveEvent(view, event):
assert isinstance(event, QtGui.QMouseEvent)
API_VIEW_BASE.mouseMoveEvent(view, event)
[docs] def mousePressEvent(view, event):
assert isinstance(event, QtGui.QMouseEvent)
API_VIEW_BASE.mousePressEvent(view, event)
# print('no editing')
view.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
[docs] def mouseReleaseEvent(view, event):
assert isinstance(event, QtGui.QMouseEvent)
# print('editing ok')
view.setEditTriggers(view._defaultEditTriggers)
API_VIEW_BASE.mouseReleaseEvent(view, event)
# ---------------
# Slots
# ---------------
[docs] @slot_(str, int)
def on_rows_updated(view, tblname, num):
# re-emit the model signal
view.rows_updated.emit(tblname, num)