Пример #1
0
class StepperGUI:
	drawingAreaW = 450
	drawingAreaH = 350
	rulerH = 20

	def logListRepopulate(self):
		self.listStoreLogs.clear()
		self.logs.reload()

		for log in self.logs.logs:
			self.listStoreLogs.append([log[0], log[1]])
			

	def __init__(self):
		# init
		self.logs = Logs(self)
		self.currentLog = None

		# window
		self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
		self.window.set_title("Stepper")
		self.window.set_border_width(10)

		self.window.set_icon(gtk.gdk.pixbuf_new_from_file(os.path.join(config.dataDir, "stepper.jpg")))

		self.window.connect("delete_event", self.delete_event)
		self.window.connect("destroy", self.destroy)

		self.hbox1 = gtk.HBox(False, 5)
		self.window.add(self.hbox1)

		# graph area
		self.vbox2 = gtk.VBox(False, 5)
		self.hbox1.pack_start(self.vbox2, True, True, 0)

		self.drawingArea = gtk.DrawingArea()
		self.drawingArea.set_size_request(self.drawingAreaW, self.drawingAreaH)

		self.vbox2.pack_start(self.drawingArea, True, True, 0)

		self.logInfoGrid = gtk.Table(2, 4, False)
		self.logInfoStepCntLabel = gtk.Label(u'Počet kroků:')
		self.logInfoStepCntLabel.set_alignment(0, 0.5)
		self.logInfoGrid.attach(self.logInfoStepCntLabel, 0, 1, 0, 1)

		self.logInfoStepCnt = gtk.Label(u'-')
		self.logInfoStepCnt.set_alignment(1, 0.5)
		self.logInfoGrid.attach(self.logInfoStepCnt, 1, 2, 0, 1)

		self.logInfoSampleCntLabel = gtk.Label(u'Počet vzorků:')
		self.logInfoSampleCntLabel.set_alignment(0, 0.5)
		self.logInfoGrid.attach(self.logInfoSampleCntLabel, 0, 1, 1, 2)

		self.logInfoSampleCnt = gtk.Label(u'-')
		self.logInfoSampleCnt.set_alignment(1, 0.5)
		self.logInfoGrid.attach(self.logInfoSampleCnt, 1, 2, 1, 2)

		self.logInfoDistLabel = gtk.Label(u'Vzdálenost v km:')
		self.logInfoDistLabel.set_alignment(0, 0.5)
		self.logInfoGrid.attach(self.logInfoDistLabel, 0, 1, 2, 3)

		self.logInfoDist = gtk.Label(u'-')
		self.logInfoDist.set_alignment(1, 0.5)
		self.logInfoGrid.attach(self.logInfoDist, 1, 2, 2, 3)

		self.logInfoKcalLabel = gtk.Label(u'Kalorií:')
		self.logInfoKcalLabel.set_alignment(0, 0.5)
		self.logInfoGrid.attach(self.logInfoKcalLabel, 0, 1, 3, 4)

		self.logInfoKcal = gtk.Label(u'-')
		self.logInfoKcal.set_alignment(1, 0.5)
		self.logInfoGrid.attach(self.logInfoKcal, 1, 2, 3, 4)

		self.vbox2.pack_end(self.logInfoGrid, True, True, 0)

		# log list
		self.listStoreLogs = gtk.ListStore(int, str)
		self.treeViewLogs = gtk.TreeView(self.listStoreLogs)
		self.tvColumnLogsId = gtk.TreeViewColumn(u'ID')
		self.tvColumnLogsDate = gtk.TreeViewColumn(u'Pořízení logu')
		self.treeViewLogs.append_column(self.tvColumnLogsId)
		self.treeViewLogs.append_column(self.tvColumnLogsDate)
		self.cellLogsId = gtk.CellRendererText()
		self.cellLogsDate = gtk.CellRendererText()
		self.tvColumnLogsId.pack_start(self.cellLogsId, True)
		self.tvColumnLogsDate.pack_start(self.cellLogsDate, True)
		self.tvColumnLogsId.add_attribute(self.cellLogsId, 'text', 0)
		self.tvColumnLogsDate.add_attribute(self.cellLogsDate, 'text', 1)

		self.treeViewLogsScrolledWin = gtk.ScrolledWindow()
		self.treeViewLogsScrolledWin.add_with_viewport(self.treeViewLogs)
		self.treeViewLogsScrolledWin.set_size_request(200, 200)
		self.treeViewLogsScrolledWin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)

		self.hbox1.pack_start(self.treeViewLogsScrolledWin, True, True, 0)

		self.treeViewLogs.get_selection().connect('changed', self.logSelected)

		# button vbox
		self.vbox1 = gtk.VBox(False, 5)
		self.hbox1.pack_end(self.vbox1, True, True, 0)

		# download device
		self.buttonDownload = gtk.Button("Download")
		self.buttonDownload.connect("clicked", self.downloadData)
		self.vbox1.pack_start(self.buttonDownload, False, False, 0)

		# about dialog
		self.buttonAbout = gtk.Button("O aplikaci")
		self.buttonAbout.connect("clicked", self.aboutDialog)
		self.vbox1.pack_start(self.buttonAbout, False, False, 0)


		# exit button
		self.buttonExit = gtk.Button("Exit")
		self.buttonExit.connect_object("clicked", gtk.Widget.destroy, self.window)
		self.vbox1.pack_end(self.buttonExit, False, False, 0)

		self.accelGroup = gtk.AccelGroup()
		self.window.add_accel_group(self.accelGroup)
		self.buttonExit.add_accelerator("activate",
			self.accelGroup,
			ord('q'),
			gtk.gdk.CONTROL_MASK,gtk.ACCEL_LOCKED)

		# delete log
		self.buttonDeleteLog = gtk.Button("Delete log")
		self.buttonDeleteLog.connect("clicked", self.deleteSelectedLog)
		self.vbox1.pack_end(self.buttonDeleteLog, False, False, 0)

		# settings
		self.buttonSettings = gtk.Button("Nastavení")
		self.buttonSettings.connect("clicked", self.showSettings)
		self.vbox1.pack_end(self.buttonSettings, False, False, 0)

		self.window.show_all()

	def logSelected(self, data = None):
		selection = self.treeViewLogs.get_selection()
		if (selection.count_selected_rows() == 1):
			model, rows = selection.get_selected()
			log = self.logs.getLog(model[rows][0])

			self.logInfoStepCnt.set_text("%i" % log.steps)
			self.logInfoSampleCnt.set_text("%u" % len(log.samples))
			self.logInfoDist.set_text("%.2f km" % (float(log.steps) * config.stepLenCm / 100 / 1000))
			self.logInfoKcal.set_text("%i kcal" % (round(float(log.steps) * config.stepLenCm * config.kCalKm / 100 / 1000)))
			self.currentLog = log

		else:
			self.logInfoStepCnt.set_text(u"-")
			self.logInfoSampleCnt.set_text(u"-")
			self.logInfoDist.set_text(u"-")
			self.logInfoKcal.set_text(u"-")
			self.currentLog = None
			
		self.redrawDeawingArea()

	def aboutDialog(self, data = None):
		about = gtk.AboutDialog()
		about.set_program_name("Stepper")
		about.set_version("0.2")
		about.set_copyright("(c) Martin -nexus- Filip")
		about.set_comments("Simple tool for downloading logs from Dream Cheeky USB pedometer.\n\nDedicated to <3 Evisek")
		about.set_website("http://www.smoula.net/stepper")
		about.set_logo(gtk.gdk.pixbuf_new_from_file(os.path.join(config.dataDir, "stepper.jpg")))
		about.run()
		about.destroy()

	def deleteSelectedLog(self, data = None):
		selection = self.treeViewLogs.get_selection()
		if (selection.count_selected_rows() == 1):
			dialog = gtk.MessageDialog(
				self.window,
				gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
				gtk.MESSAGE_WARNING,
				gtk.BUTTONS_YES_NO,
				u'Opravdu chcete smazat log?'
			)
			dialog.format_secondary_text(u'Tato akce je nevratná!')
			response = dialog.run()
			dialog.destroy()

			if (response == gtk.RESPONSE_YES):
				model, rows = selection.get_selected()
				self.logs.deleteLog(model[rows][0])

	def downloadData(self, data = None):
		try:
			s = StepperDevice()
			log = self.logs.parseData(s.readDevice())

			if (len(log.samples) == 0):
				dialog = gtk.MessageDialog(
					self.window,
					gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
					gtk.MESSAGE_INFO ,
					gtk.BUTTONS_OK ,
					u'Zařízení neobsahuje žádná data'
				)
				dialog.run()
				dialog.destroy()

			else:
				dialog = gtk.MessageDialog(
					self.window,
					gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
					gtk.MESSAGE_QUESTION,
					gtk.BUTTONS_YES_NO,
					u'Stažení dat ze zařízení'
				)
				dialog.format_secondary_text(u"Zařízení obsahuje %i kroků v %i vzorcích. Opravdu si je přejete stáhnout?" % (log.steps, len(log.samples)))
				response = dialog.run()
				dialog.destroy()

				if (response == gtk.RESPONSE_YES):
					log = self.logs.parseData(s.readDevice())
					log.saveLog()

					s.eraseDevice()
					self.logListRepopulate()

			del s

		except ExceptionStepperNotFound, e:
			dialog = gtk.MessageDialog(
				self.window,
				gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
				gtk.MESSAGE_WARNING ,
				gtk.BUTTONS_OK,
				u'Zařízení nenalezeno'
			)
			dialog.run()
			dialog.destroy()