#! /usr/bin/env python3
# -*- coding: utf-8 -*-

#	Copyright 2011-2013, Marten de Vries
#
#	This file is part of OpenTeacher.
#
#	OpenTeacher is free software: you can redistribute it and/or modify
#	it under the terms of the GNU General Public License as published by
#	the Free Software Foundation, either version 3 of the License, or
#	(at your option) any later version.
#
#	OpenTeacher is distributed in the hope that it will be useful,
#	but WITHOUT ANY WARRANTY; without even the implied warranty of
#	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#	GNU General Public License for more details.
#
#	You should have received a copy of the GNU General Public License
#	along with OpenTeacher.  If not, see <http://www.gnu.org/licenses/>.

def installQtClasses():
	global MultiOptionListModel, SettingsWidget

	class MultiOptionListModel(QtCore.QAbstractListModel):
		def __init__(self, options, active, *args, **kwargs):
			super().__init__(*args, **kwargs)

			self.options = options
			self.active = set()
			for data in active:
				for label, secondData in options:
					if data == secondData:
						self.active.add((label, data))

		def rowCount(self, parent=None):
			return len(self.options)

		def data(self, index, role):
			if not index.isValid():
				return
			if role == QtCore.Qt.DisplayRole:
				return self.options[index.row()][0]
			elif role == QtCore.Qt.UserRole:
				return self.options[index.row()][1]
			elif role == QtCore.Qt.CheckStateRole:
				if self.options[index.row()] in self.active:
					return QtCore.Qt.Checked
				else:
					return QtCore.Qt.Unchecked

		def setData(self, index, value, role):
			if not index.isValid():
				return False
			if role == QtCore.Qt.CheckStateRole:
				option = self.options[index.row()]
				if value == QtCore.Qt.Checked:
					self.active.add(option)
				else:
					self.active.remove(option)
				self.dataChanged.emit(index, index)
				return True
			return False

		def flags(self, index):
			return (
				QtCore.Qt.ItemIsEnabled |
				QtCore.Qt.ItemIsSelectable |
				QtCore.Qt.ItemIsUserCheckable
			)

		@property
		def value(self):
			return [
				option[1]
				for option in self.options
				if option in self.active
			]

	class SettingsWidget(QtWidgets.QListView):
		def __init__(self, setting, *args, **kwargs):
			super().__init__(*args, **kwargs)

			self._setting = setting

			model = MultiOptionListModel(setting["options"], setting["value"])
			model.dataChanged.connect(self._valueChanged)
			self.setModel(model)

		def _valueChanged(self, topLeft, bottomRight):
			self._setting["value"] = self.model().value

class SettingsWidgetModule:
	def __init__(self, moduleManager, *args, **kwargs):
		super().__init__(*args, **kwargs)
		self._mm = moduleManager

		self.type = "settingsWidget"

		self.requires = (
			self._mm.mods(type="ui"),
		)

	def createWidget(self, *args, **kwargs):
		return SettingsWidget(*args, **kwargs)

	def enable(self):
		global QtCore, QtWidgets
		try:
			from PyQt5 import QtCore, QtWidgets
		except ImportError:
			return
		installQtClasses()

		self.widgetType = "multiOption"
		self.active = True

	def disable(self):
		self.active = False

		del self.widgetType

def init(moduleManager):
	return SettingsWidgetModule(moduleManager)

if __name__ == "__main__":
	app = QtWidgets.QApplication([])
	sw = SettingsWidget({"value": [1], "options": [("a", 1), ("b", 2)]})
	sw.show()
	app.exec_()
