Beispiel #1
0
	def __init__(self, parent, dlg_name):
		self._displayed_item = None  # aktualnie wuświetlany obiekt

		class _Proxy(object):
			""" Proxy class that allow use validators on dynamically changed
			objects. """
			# pylint: disable=W0212, E0213, R0903
			def __getattr__(selfi, key):
				if not self._displayed_item:
					return ""
				return getattr(self._displayed_item, key)

			def __setattr__(selfi, key, val):
				setattr(self._displayed_item, key, val)

		self._proxy = _Proxy()
		self._current_selected_uuid = None
		self._session = Session()
		self._items_lctrl = None
		BaseDialog.__init__(self, parent, dlg_name, save_pos=False)
		wx.CallAfter(self._refresh_list)
Beispiel #2
0
class DictBaseDlg(BaseDialog):
	""" Base class for dialogs that manage application dictionaries stored
	in class managed by SqlAlchemy.

	Args:
		parent: parent window
		dlg_name: name of dialog in resource file
	"""

	_items_list_control = "lb_items"  # nazwa widgeta zawierającego listę
			# elementów
	_item_name = ""  # nazwa elementu
	_item_class = None  # klasa obiektów

	def __init__(self, parent, dlg_name):
		self._displayed_item = None  # aktualnie wuświetlany obiekt

		class _Proxy(object):
			""" Proxy class that allow use validators on dynamically changed
			objects. """
			# pylint: disable=W0212, E0213, R0903
			def __getattr__(selfi, key):
				if not self._displayed_item:
					return ""
				return getattr(self._displayed_item, key)

			def __setattr__(selfi, key, val):
				setattr(self._displayed_item, key, val)

		self._proxy = _Proxy()
		self._current_selected_uuid = None
		self._session = Session()
		self._items_lctrl = None
		BaseDialog.__init__(self, parent, dlg_name, save_pos=False)
		wx.CallAfter(self._refresh_list)

	def _load_controls(self, wnd):
		BaseDialog._load_controls(self, wnd)
		self._items_lctrl = self[self._items_list_control]
		self['tc_title'].SetValidator(Validator(self._proxy, 'title'))
		self['tc_note'].SetValidator(Validator(self._proxy, 'note'))
		self['colorselect'].SetValidator(ValidatorColorStr(self._proxy,
				'bg_color', with_alpha=True))

	def _create_bindings(self, wnd):
		BaseDialog._create_bindings(self, wnd)
		wnd.Bind(wx.EVT_BUTTON, self._on_add_item, id=wx.ID_ADD)
		wnd.Bind(wx.EVT_BUTTON, self._on_del_item, id=wx.ID_DELETE)
		self._items_lctrl.Bind(wx.EVT_LISTBOX, self._on_list_item_activate)
		wnd.Bind(wx.EVT_BUTTON, self._on_btn_delete, self['btn_deleted'])

	def _on_ok(self, evt):
		BaseDialog._on_ok(self, evt)

	def _on_add_item(self, _evt):
		""" Action for add item button. """
		self._on_save(None)  # wymuszone zapisanie zmian
		self._display_item(self._item_class())  # tworzenie ob; pylint: disable=E1102

	def _on_save(self, _evt):
		""" Save selected & edited item. """
		if not self._displayed_item:
			return
		if not self._wnd.Validate():
			return
		if not self._wnd.TransferDataFromWindow():
			return
		self._displayed_item.update_modify_time()
		self._session.add(self._displayed_item)  # pylint: disable=E1101
		self._session.commit()  # pylint: disable=E1101
		self._refresh_list()
		publisher.sendMessage('dict.update')

	def _on_del_item(self, _evt):
		""" Acton for delete item button. """
		sel = self._selected_item_uuid
		if sel is None:
			return
		item = self._get_item(sel)
		if not item:
			return
		additional_info = None
		if self._check_children_before_delete(item):
			additional_info = (_('After removal, it cannot be recovered.')
					+ "\n\n"
					+ _("Warning: this affect another items!"))
		if mbox.message_box_delete_confirm(self._wnd, self._item_name + ' "' +
				item.title + '"', additional_info):
			if hasattr(item, 'deleted'):
				item.deleted = datetime.datetime.now()
			else:
				self._session.delete(item)  # pylint: disable=E1101
			self._session.commit()  # pylint: disable=E1101
			self._refresh_list()
			publisher.sendMessage('dict.delete')
			return True

	def _on_list_item_activate(self, _evt):
		""" Items on list is activated. """
		uuid = self._selected_item_uuid
		item = self._get_item(uuid)
		self._display_item(item)

	def _on_btn_delete(self, _evt):
		items = self._item_class.get_deleted(session=self._session,
				order_by='title')
		if DlgTrash(self._wnd, items, self._session).run(modal=True):
			self._refresh_list()

	def _refresh_list(self,):
		""" Refresh list of all elements. """
		self._displayed_item = None
		self._items_lctrl.Clear()
		for title, uuid in self._get_items():
			self._items_lctrl.Append(title, uuid)
		self._set_buttons_state()

	@property
	def _selected_item_uuid(self):
		""" Get UUID currently selected element on list. """
		sel = self._items_lctrl.GetSelection()
		if sel == wx.NOT_FOUND:
			return None
		return self._items_lctrl.GetClientData(sel)

	def _get_item(self, uuid):
		""" Get item from database on the basis of uuid. """
		return self._item_class.get(self._session, uuid=uuid)

	def _get_items(self):
		""" Get all items given class from database. """
		items = self._item_class.all(session=self._session, order_by='title')
		for obj in items:
			yield obj.title, obj.uuid

	def _display_item(self, item):
		""" Display item in window. """
		self._displayed_item = item
		self._set_buttons_state()
		self._wnd.TransferDataToWindow()

	def _set_buttons_state(self):
		""" Set state of buttons in window. """
		item_in_edit = self._displayed_item is not None
		self[wx.ID_SAVE].Enable(item_in_edit)
		self[wx.ID_DELETE].Enable(item_in_edit)
		self['tc_title'].Enable(item_in_edit)
		self['tc_note'].Enable(item_in_edit)
		self['colorselect'].Enable(item_in_edit)

	def _check_children_before_delete(self, item):  # pylint: disable=R0201
		if hasattr(item, 'children') and bool(item.children):
			return True
		if hasattr(item, 'tasks') and bool(item.tasks):
			return True
		return False