diff options
author | Usuario estandar de guadalinex <usuario@gaia.cga.andared.cec.junta-andalucia.es> | 2009-09-03 09:34:51 (GMT) |
---|---|---|
committer | Usuario estandar de guadalinex <usuario@gaia.cga.andared.cec.junta-andalucia.es> | 2009-09-03 09:34:51 (GMT) |
commit | fb56aba776f1e843fc242ceaf086e3b2badeab3c (patch) | |
tree | 9439670274b0d7ad06a57f1a28d1ee140e95273f | |
parent | 74ccc4e42d958ae904c35a5e1dba6de50bb52bf7 (diff) |
added pyclic-user.py
-rwxr-xr-x | pyclic-user.py | 677 |
1 files changed, 677 insertions, 0 deletions
diff --git a/pyclic-user.py b/pyclic-user.py new file mode 100755 index 0000000..fa2763d --- /dev/null +++ b/pyclic-user.py @@ -0,0 +1,677 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +# PyClicUser application, Useristration interface + +import pygtk +pygtk.require('2.0') +import gtk +import cairo +import math +from xml.dom import minidom +import os +import sys +from pyclic_common import PyClicCommon + +MAIN_TAG = 0 +QUIZ_TAG = 1 +CATEGORY_TAG = 2 +TITLE_TAG = 3 +COLOR_TAG = 4 +IMAGE_TAG = 5 +AUTHOR_TAG = 6 +QUESTIONS_TAG = 7 +QUESTION_TAG = 8 +COORDINATES_TAG = 9 +ENTRY_TAG = 10 + +FILE_EXT = "pcx" + +class PyClicUser: + + def on_file_open(self, widget): + self.on_file_new(self.window) + xml_file = self.pcc.file_browse(gtk.FILE_CHOOSER_ACTION_OPEN) + + #If we have a xml_file + if (xml_file): + if (self.xml_load_from_file(xml_file)): + """Allright it all worked! save the current file and + set the title.""" + self.xml_file = xml_file + self.pcc.set_window_title_from_file(self.xml_file,self.window) + + + def xml_load_from_file(self, xml_file): + """Load a quiz from an xml file + @param xml_file - string - path to file that + we will load. + @returns boolean - True success. False failure + """ + #Init return value + success = False + + #Load the xml_file to a document + try: + xml_document = minidom.parse(xml_file) + if (xml_document): + success = ((self.xml_load(xml_document))) + except IOError, (errno, strerror): + self.show_error_dlg( + "Error loading quiz file(%s): %s" % (errno, strerror)) + return success + + def xml_load(self, xml_document): + """Load the current quiz from an xml document. + @param xml_document - xml.dom.minidom.Document object - + The xml document that we will load the quiz from. + @returns boolean True - success. False - Failure.""" + + title_loaded = False + category_loaded = False + question_loaded = False + author_loaded = False + image_loaded = False + coordinates_loaded = False + entries_loaded = False + questions_loaded = False + colors_loaded = False + # reset all values before loading document + self.on_file_new(self) + #Loop through all child nodes of the root. + for node in xml_document.documentElement.childNodes: + #We are looking for the quiz Node + if (node.nodeName == PyClicCommon._xml_tags[QUIZ_TAG]): + # Now loop through the quiz nodes children + for item_node in node.childNodes: + if (item_node.nodeName == PyClicCommon._xml_tags[TITLE_TAG]): + """Set the title, the firstChild in this case is + the actual title text that we saved.""" + + #Make sure it's not a blank string + if (item_node.firstChild): + self.title_label.set_text("Title: " + item_node.firstChild.nodeValue) + else: + print "nasti" + title_loaded = True + elif (item_node.nodeName == PyClicCommon._xml_tags[CATEGORY_TAG]): + """Set the category, the firstChild in this case is + the actual category that we saved.""" + #Make sure it's not a blank string + if (item_node.firstChild): + self.title_category.set_text("Subject: " + item_node.firstChild.nodeValue) + else: + print "nasti" + category_loaded = True + elif (item_node.nodeName == PyClicCommon._xml_tags[AUTHOR_TAG]): + """Set the author, the firstChild in this case is + the actual author that we saved.""" + #Make sure it's not a blank string + if (item_node.firstChild): + self.author_label.set_text("Author: " + item_node.firstChild.nodeValue) + else: + print "nasti" + author_loaded = True + #Break out of the topmost for loop + elif (item_node.nodeName == PyClicCommon._xml_tags[IMAGE_TAG]): + """Set the image, the firstChild in this case is + the image that we saved. Then decode from base64""" + #Make sure it's not a blank string + if (item_node.firstChild): + self.image = self.pcc.decode64(item_node.firstChild.nodeValue) + self.window.queue_draw() + else: + print "nasti" + image_loaded = True + #Break out of the topmost for loop + elif (item_node.nodeName == PyClicCommon._xml_tags[COLOR_TAG]): + """Set the image, the firstChild in this case is + the image that we saved. Then decode from base64""" + #Make sure it's not a blank string + if (item_node.firstChild): + self.colourred,self.colourgreen,self.colourblue = item_node.firstChild.nodeValue.split(",") + self.colorred=self.colourred.replace('[', '') + self.colorred=float(self.colorred) + self.colorgreen=float(self.colourgreen) + self.colorblue=self.colourblue.replace(']', '') + self.colorblue=float(self.colorblue) + self.window.queue_draw() + else: + print "nasti" + colors_loaded = True + #Break out of the topmost for loop + #We are looking for the quiz Node + elif (node.nodeName == PyClicCommon._xml_tags[QUESTIONS_TAG]): + # Now loop through the question nodes children + for item_node in node.childNodes: + self.questions_list=[] + if (item_node.nodeName == PyClicCommon._xml_tags[QUESTION_TAG]): + """Grab all the questions.""" + + #Make sure it's not a blank string + if (item_node.firstChild): + self.questions_list.append(item_node.firstChild.nodeValue) + for question in self.questions_list: + self.label=gtk.Label("Question: " + question) + self.label_list.append(self.label) + self.vbox2.pack_start(self.label,False,False,0) + self.label.show() + else: + print "nasti" + question_loaded = True + self.coordinate=[] + if (item_node.nodeName == PyClicCommon._xml_tags[COORDINATES_TAG]): + """Grab all the coordinates.""" + + #Make sure it's not a blank string + if (item_node.firstChild): + self.coordinate.append(item_node.firstChild.nodeValue) + for coordinate in self.coordinate: + x,y = coordinate.split(",") + self.coordinates.append((float(x),float(y))) + self.window.queue_draw() + + + else: + print "nasti" + coordinates_loaded = True + self.entradas=[] + if (item_node.nodeName == PyClicCommon._xml_tags[ENTRY_TAG]): + """Grab all the entries.""" + + #Make sure it's not a blank string + if (item_node.firstChild): + self.entradas.append(item_node.firstChild.nodeValue) + for entry in self.entradas: + # self.entry=gtk.Entry(max=15) + # self.answer=gtk.Label(self.show_answer(item_node.firstChild.nodeValue)) + # self.entry.set_text(self.show_answer(item_node.firstChild.nodeValue)) + # self.entry_list.append(self.answer) + self.word=self.show_answer(item_node.firstChild.nodeValue) + self.entry_list.append(self.word) + self.vbox2.add(self.word) + # self.vbox2.pack_start(self.word,False,False,0) + # self.vbox2.pack_start(self.answer,False,False,0) + self.word.show() + else: + print "nasti" + entries_loaded = True + break + return (title_loaded and category_loaded and author_loaded and image_loaded and entries_loaded and question_loaded and colors_loaded and coordinates_loaded) + + + + def xml_save(self, xml_document): + """Save the current quiz to an xml document. + @param xml_document - xml.dom.minidom.Document object - + The xml document that we will save the post to.""" + + #create <quiz></quiz> + quiz_element = xml_document.createElement(PyClicCommon._xml_tags[QUIZ_TAG]) + #create <category></category> + category_element = xml_document.createElement(PyClicCommon._xml_tags[CATEGORY_TAG]) + #Create <category>category</category> + category_element.appendChild(xml_document.createTextNode(self.Category)) + #Creates <image></image> + image_element = xml_document.createElement(PyClicCommon._xml_tags[IMAGE_TAG]) + #Create <IMAGE>image<IMAGE> + image_element.appendChild(xml_document.createTextNode(self.Image)) + #Creates <title></title> + title_element = xml_document.createElement(PyClicCommon._xml_tags[TITLE_TAG]) + #Creates <title>title</title> + title_element.appendChild(xml_document.createTextNode(self.Title)) + #Creates <author></author> + author_element = xml_document.createElement(PyClicCommon._xml_tags[AUTHOR_TAG]) + #Creates <author>author</author> + author_element.appendChild(xml_document.createTextNode(self.Author)) + #Creates <color></color> + color_element = xml_document.createElement(PyClicCommon._xml_tags[COLOR_TAG]) + #turn color into list + colourvalues = [] + colourvalues.append(self.colorred) + colourvalues.append(self.colorgreen) + colourvalues.append(self.colorblue) + #Creates <color>author</color> + color_element.appendChild(xml_document.createTextNode(str(colourvalues))) + quiz_element.appendChild(category_element) + quiz_element.appendChild(title_element) + quiz_element.appendChild(image_element) + quiz_element.appendChild(author_element) + quiz_element.appendChild(color_element) + #Now add to the xml document + xml_document.documentElement.appendChild(quiz_element) + #create <questions></questions> + questions_element = xml_document.createElement(PyClicCommon._xml_tags[QUESTIONS_TAG]) + Iterate = 0 + question = 1 + while Iterate < len(self.coordinates): + #Create <question></question> + question_element = xml_document.createElement(PyClicCommon._xml_tags[QUESTION_TAG]) + #create <question>question<question> + question_element.appendChild(xml_document.createTextNode(str(question))) + c = self.coordinates[Iterate] + #Create <coordinates></coordinates> + coordinates_element = xml_document.createElement(PyClicCommon._xml_tags[COORDINATES_TAG]) + #create <coordinates>x,y<coordinates> + coordinates_element.appendChild(xml_document.createTextNode("%d,%d" % (c[0],c[1]))) + #Create <entry></entry> + entry_element = xml_document.createElement(PyClicCommon._xml_tags[ENTRY_TAG]) + #create <entry>entry<entry> + entry_element.appendChild(xml_document.createTextNode(self.Entries[Iterate])) + + #Add above to <questions> + questions_element.appendChild(question_element) + questions_element.appendChild(coordinates_element) + questions_element.appendChild(entry_element) + Iterate=Iterate+1 + question=question+1 + #Now add to the xml document + xml_document.documentElement.appendChild(questions_element) + + def xml_save_to_file(self, widget): + """Save the current post to xml_file + @param xml_file - string - path to file that + we will save the xml to. + @returns boolean - True success. False failure + """ + #Init return value + success = False + + #Get the available DOM Implementation + impl = minidom.getDOMImplementation() + #Create the document, with PyClicUser as to base node + xml_document = impl.createDocument(None, PyClicCommon._xml_tags[MAIN_TAG], None) + #Save the questions into the xml + self.xml_save(xml_document) + #Now actually try to save the file + try: + save_file = open(self.xml_file, 'w') + #write the xml document to disc + xml_document.documentElement.writexml(save_file) + save_file.close() + except IOError, (errno, strerror): + self.show_error_dlg( + "Error saving quiz(%s): %s" % (errno, strerror)) + else: + #Allright it all worked! Set the return value + success = True + + return success + + +# # open image file self.chooser with filter for just image types +# def open_image(self,widget): +# self.chooser = gtk.FileChooserDialog(title="Open Image",action=gtk.FILE_CHOOSER_ACTION_OPEN,buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) +# filter = gtk.FileFilter() +# filter.set_name("Images") +# filter.add_mime_type("image/png") +# filter.add_pattern("*.png") +# self.chooser.add_filter(filter) +# +# response = self.chooser.run() +# if response == gtk.RESPONSE_OK: +# self.image=self.image.create_from_png(self.chooser.get_filename()) +# self.image_scale(self.image) +# self.image_filename=self.chooser.get_filename() +# self.image=self.image.create_from_png(self.chooser.get_filename()) +# self.darea.queue_draw() +# elif response == gtk.RESPONSE_CANCEL: +# print 'Closed, no files selected' +# self.chooser.destroy() + + def image_scale(self,image): + self.width=self.image.get_width() + self.height=self.image.get_height() + imgpat = cairo.SurfacePattern(self.image) + + scaler = cairo.Matrix() + #image width/640*100,image height/480 + scaler.scale(self.width/640.0,self.height/480.0) + imgpat.set_matrix(scaler) + + #set resampling filter + imgpat.set_filter(cairo.FILTER_BEST) + canvas = cairo.ImageSurface(cairo.FORMAT_ARGB32,640,480) + ctx = cairo.Context(canvas) + ctx.set_source(imgpat) + ctx.paint() + canvas.write_to_png(self.chooser.get_filename()) + + +# def grab_click(self,widget,event): +# x, y = event.get_coords() +# self.coordinates.append((x,y)) +# gc = widget.window.new_gc() +# widget.queue_draw() +# +# self.label=gtk.Label(self.coordinates.index((x,y))+1) +# self.label_list.append(self.label) +# self.vbox2.pack_start(self.label,False,False,0) +# self.label.show() +# +# self.entry=gtk.Entry(max=30) +# self.entry_list.append(self.entry) +# +# self.vbox2.pack_start(self.entry,False,False,0) +# +# self.entry.show() + + def expose(self, widget, event): + + self.cr = widget.window.cairo_create() + self.cr.set_source_surface(self.image) + self.cr.paint() + self.cr.select_font_face("Arial",cairo.FONT_SLANT_NORMAL,cairo.FONT_WEIGHT_BOLD) + self.cr.set_font_size(16) + + for x,y in self.coordinates: + + + self.cr.set_source_rgb(self.colorred,self.colorgreen,self.colorblue) + self.cr.arc(x,y,14,0,2 * math.pi) + self.cr.stroke + self.cr.fill() + + self.string="%s" %(self.coordinates.index((x,y))+1) + self.cr.move_to(x-4,y+5) + self.cr.set_source_rgb(1, 1, 1) + + self.cr.show_text(self.string) + + + def get_active_text(combobox): + model = combobox.get_model() + active = combobox.get_active() + if active < 0: + return None + return model[active][0] + + def encode64(self,filew): + try: + response = open(filew) + data = response.read() + + except IOError, (errno, strerror): + self.show_error_dlg("Error saving quiz(%s): %s" % (errno, strerror)) + + return data.encode('base64') + + def on_file_save_as(self, widget): + """This function saves the current Quiz as an XML file using sub functions""" + # Let the user browse for the save location and name + if (self.xml_file == None): + self.xml_file = self.pcc.file_browse(gtk.FILE_CHOOSER_ACTION_SAVE) + #If we have a xml_file + if (self.xml_file): + if (self.xml_save_to_file(self.xml_file)): + #Allright it all worked! Set the Title + self.pcc.set_window_title_from_file(self.xml_file,self.window) + + def on_file_save(self, widget): + """Let the user save the current file to a new location.""" + + xml_file = "Untitled" + if (self.xml_file != None): + xml_file = os.path.basename(self.xml_file) + + xml_file = self.pcc.file_browse(gtk.FILE_CHOOSER_ACTION_SAVE, xml_file) + # xml_file=xml_file + "answer.pcx" + print xml_file + #If we have a xml_file +# if (xml_file): +# if (self.xml_save_to_file(xml_file)): +# """Allright it all worked! save the current file and +# set the title.""" +# self.xml_file = xml_file +# # self.pcc.set_window_title_from_file(self.xml_file,self.window) + def show_answer(self,text): + #FUNCION que devuelve las rallitas necesarias para las respuestas# + devolver = gtk.Fixed() + for i in range(len(text)): + self.letra = gtk.Entry(max=1) + self.letra.set_size_request(22,22) + self.letra.set_sensitive(False) + self.letra.show() + devolver.put(self.letra, ( i * 19), 0) + return(devolver) + + def save_details(self,widget): + self.Title = self.title_label.get_text() + self.Author = self.author_label.get_text() + self.Category = self.title_category.get_text() + # save image to base64 + self.Image = self.encode64(self.image_filename) + # function to grab entries from entry list + self.Entries=[] + for entry in self.entry_list: + self.Entries.append(entry.get_text()) + + self.on_file_save(file) + + def on_file_new(self,widget): + for entry in self.entry_list: + self.vbox2.remove(entry) + for label in self.label_list: + self.vbox2.remove(label) + self.entry_list=[] + self.Entries=[] + self.coordinates=[] + self.author_label.set_text("Author") + self.title_label.set_text("Title") + self.question_list=[] + self.xml_file = None + self.entry="" + self.window.queue_draw() + + def on_clicked(self, widget): + cdia = gtk.ColorSelectionDialog("Select color") + response = cdia.run() + + if response == gtk.RESPONSE_OK: + colorsel = cdia.colorsel + self.colour = colorsel.get_current_color() + self.colorred = self.colour.red/65535.0 + self.colorgreen = self.colour.green/65535.0 + self.colorblue = self.colour.blue/65535.0 + + cdia.destroy() + self.window.queue_draw() + + def __init__(self): + # create the main window, and attach delete_event signal to terminating + # the application + self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) + + #set icon for app + try: + self.window.set_icon_from_file("pyclicicon.png") + except Exception, e: + print e.message + sys.exit(1) + + self.pcc=PyClicCommon() + + self.window.connect("delete_event", self.pcc.close_application) + self.window.set_size_request(791,544) + self.window.set_border_width(0) + + self.vbox2 = gtk.VBox(False, 2) + self.vbox2.set_border_width(8) + + self.xml_file=None + + + #Insert menubar containing 2 columns + mb = gtk.MenuBar() + filemenu = gtk.Menu() + + filem = gtk.MenuItem("File") + filem.set_submenu(filemenu) + + newquiz = gtk.MenuItem("New File / Clear") + newquiz.connect("activate",self.on_file_new) + filemenu.append(newquiz) + + + openquiz = gtk.MenuItem("Open Quiz") + openquiz.connect("activate",self.on_file_open,self.xml_file) + filemenu.append(openquiz) + + save = gtk.MenuItem("Save Quiz") + save.connect("activate",self.save_details,self.xml_file) + filemenu.append(save) + + exit = gtk.MenuItem("Exit") + exit.connect("activate",gtk.main_quit) + filemenu.append(exit) + + helpmenu = gtk.Menu() + help = gtk.MenuItem("Help") + help.set_submenu(helpmenu) + + aboutm = gtk.MenuItem("About PyClicUser") + aboutm.connect("activate",self.pcc.about_program) + helpmenu.append(aboutm) + + +# open = gtk.MenuItem("Open Image") +# open.connect("activate",self.open_image) +# viewmenu.append(open) +# +# stat = gtk.MenuItem("Change Color") +# stat.connect("activate", self.on_clicked) +# viewmenu.append(stat) + + mb.append(filem) + mb.append(help) + self.hbox = gtk.HBox(False, 2) + + + #define and start vertical area + vbox = gtk.VBox(False, 2) + vbox.pack_start(mb,False,False,0) + + #Insert Toolbar with open,save and exit + toolbar = gtk.Toolbar() + toolbar.set_style(gtk.TOOLBAR_ICONS) + + newtb = gtk.ToolButton(gtk.STOCK_CLEAR) + opentb = gtk.ToolButton(gtk.STOCK_OPEN) + savetb = gtk.ToolButton(gtk.STOCK_SAVE) + # colortb = gtk.ToolButton(gtk.STOCK_SELECT_COLOR) + # importtb = gtk.ToolButton(gtk.STOCK_ORIENTATION_PORTRAIT) + sep = gtk.SeparatorToolItem() + quittb = gtk.ToolButton(gtk.STOCK_QUIT) + + toolbar.insert(opentb, 0) + toolbar.insert(savetb, 1) + toolbar.insert(newtb, 2) + # toolbar.insert(colortb,3) + # toolbar.insert(importtb,4) + toolbar.insert(sep, 3) + toolbar.insert(quittb, 4) + + quittb.connect("clicked", gtk.main_quit) + newtb.connect("clicked", self.on_file_new) + opentb.connect("clicked", self.on_file_open) + savetb.connect("clicked", self.save_details) + #colortb.connect("clicked", self.on_clicked) + # importtb.connect("clicked",self.open_image) + + vbox.pack_start(toolbar, False, False, 0) + + + # A drawing area inside a fixed() + + fix = gtk.Fixed() + self.darea=gtk.DrawingArea() + self.image = cairo.ImageSurface.create_from_png("pyclic.png") + self.image_filename="pyclic.png" + self.darea.connect("expose_event", self.expose) + # self.darea.set_events(gtk.gdk.BUTTON_PRESS_MASK) + # self.darea.connect("button_press_event",self.grab_click) + + self.darea.set_size_request(606,540) + fix.put(self.darea,0,0) + + #define coordinates list + self.coordinates=[] + + #define text entries list + self.entry_list=[] + + self.label_list=[] + + self.question_list=[] + + #define color values for question circle + self.colorred=0 + self.colorblue=0 + self.colorgreen=0 + + # Layout + self.window.add(vbox) + vbox.add(self.hbox) + self.hbox.add(fix) + + # Title and category entry boxes + self.title_label=gtk.Label("Title") + self.vbox2.pack_start(self.title_label,False,False,0) + + #self.title_entry=gtk.Entry(max=50) + #self.vbox2.pack_start(self.title_entry,False,False,0) + + self.author_label=gtk.Label("Author") + self.vbox2.pack_start(self.author_label,False,False,0) + + #self.author_entry=gtk.Entry(max=50) + #self.vbox2.pack_start(self.author_entry,False,False,0) + + + self.title_category=gtk.Label("Category") + self.vbox2.pack_start(self.title_category,False,False,0) + +# self.cb_category=gtk.combo_box_new_text() +# self.cb_category.connect("changed", self.on_changed) +# self.cb_category.append_text("Geography") +# self.cb_category.append_text("Science") +# self.cb_category.append_text("ICT") +# self.cb_category.append_text("Languages") +# self.cb_category.append_text("Maths") +# self.cb_category.append_text("Music") +# self.cb_category.append_text("History") +# self.cb_category.append_text("Business") +# self.cb_category.append_text("Art") +# self.vbox2.pack_start(self.cb_category,False,False,0) + + + clear_button=gtk.Button("Clear") + self.vbox2.pack_start(clear_button,False,False,0) + clear_button.set_events(gtk.gdk.BUTTON_PRESS_MASK) + clear_button.connect("clicked",self.on_file_new) + clear_button.set_size_request(150, 25) + + #submit button for entries + submit_button=gtk.Button("Submit") + self.vbox2.pack_start(submit_button,False,False,0) + submit_button.set_events(gtk.gdk.BUTTON_PRESS_MASK) + submit_button.connect("clicked",self.save_details) + + + self.scrollw = gtk.ScrolledWindow() + self.scrollw.set_policy(gtk.POLICY_NEVER,gtk.POLICY_AUTOMATIC) + self.hbox.pack_start(self.scrollw) + self.scrollw.add_with_viewport(self.vbox2) + +# self.hbox.add(self.vbox2) + + self.window.show_all() + +def main(): + gtk.main() + return 0 + +if __name__ == "__main__": + PyClicUser() + main() + |