# Copyright (C) 2009, Tutorius.org
#
# This program 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 2 of the License, or
# (at your option) any later version.
#
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
import gtk
import logging
import threading
class ErrorDialog(gtk.Dialog):
def __init__(self,text):
gtk.Dialog.__init__(self,"Error",None,gtk.DIALOG_MODAL,(gtk.STOCK_OK,gtk.RESPONSE_ACCEPT))
self.label = gtk.Label(text)
self.vbox.pack_start(self.label,padding = 10)
self.vbox.show_all()
class WaitingDialog(gtk.Dialog):
def __init__(self,callback,kwargs):
self.callback = callback
self.kwargs = kwargs
gtk.Dialog.__init__(self,"Please wait...",None,gtk.DIALOG_MODAL)
self.label = gtk.Label("Please wait while getting information from the store")
self.vbox.pack_start(self.label, padding = 10)
self.vbox.show_all()
def operation_complete(self):
self.label.set_text("Operation complete")
self.ok_button = gtk.Button("Ok")
self.add_button(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)
class LoginDialog(gtk.Dialog):
def __init__(self):
gtk.Dialog.__init__(self,"Login",None,gtk.DIALOG_MODAL)
ok_button = gtk.Button("Login")
ok_button.connect("clicked",self.ok_clicked,None)
ok_button.show()
self.action_area.pack_start(ok_button)
self.add_button("Cancel",gtk.RESPONSE_REJECT)
self.set_resizable(False)
self.prepare_dialog()
def set_model(self,model):
self.model = model
def get_model(self):
return self.model
def prepare_dialog(self):
self.user_line = gtk.HBox(False,10)
self.pass_line = gtk.HBox(False,10)
self.register_line = gtk.HBox(False)
self.remember_line = gtk.HBox(False)
self.username_lbl = gtk.Label("Email:")
self.username_entry = gtk.Entry()
self.username_entry.set_width_chars(40)
self.password_lbl = gtk.Label("Password:")
self.password_entry = gtk.Entry()
self.password_entry.set_visibility(False)
self.password_entry.set_width_chars(40)
self.register_me = gtk.LinkButton("","Register Now!")
self.not_registered = gtk.Label("Not Registered? ")
self.remember_user = gtk.CheckButton("Remember my username",False)
self.register_me.connect("clicked",self.click_link,None)
self.user_line.pack_start(self.username_lbl,False)
self.user_line.pack_end(self.username_entry,False)
self.pass_line.pack_start(self.password_lbl,False)
self.pass_line.pack_end(self.password_entry,False)
self.register_line.pack_end(self.register_me,False)
self.register_line.pack_end(self.not_registered,False)
self.remember_line.pack_start(self.remember_user,False,padding=80)
self.vbox.pack_start(self.register_line,False)
self.vbox.pack_start(self.user_line,False,padding=10)
self.vbox.pack_start(self.pass_line,False,padding=10)
self.vbox.pack_start(self.remember_line,False)
self.vbox.show()
self.user_line.show()
self.pass_line.show()
self.register_line.show()
self.remember_line.show()
self.username_lbl.show()
self.username_entry.show()
self.password_lbl.show()
self.password_entry.show()
self.register_me.show()
self.not_registered.show()
self.remember_user.show()
def ok_clicked(self,widget,data=None):
success = self.model.login(self.username_entry.get_text(), self.password_entry.get_text())
if success:
self.response(gtk.RESPONSE_ACCEPT)
else:
errorDialog = ErrorDialog("The password or the email address is wrong")
errorDialog.run()
errorDialog.destroy()
def click_link(self,widget,data=None):
self.register_dialog = RegisterDialog(self.model)
self.register_dialog.run()
self.register_dialog.destroy()
class RegisterDialog(gtk.Dialog):
def __init__(self,model):
gtk.Dialog.__init__(self,"Register",None,gtk.DIALOG_MODAL)
self.model = model
ok_button = gtk.Button("Register")
ok_button.connect("clicked",self.ok_clicked,None)
ok_button.show()
self.action_area.pack_start(ok_button)
self.add_button("Cancel",gtk.RESPONSE_REJECT)
self.set_resizable(False)
self.create_content()
def ok_clicked(self,widget,data=None):
if not self.data_validation():
return
success = self.model.register(self.entries[2].get_text(),self.entries[3].get_text(),self.entries[0].get_text())
if success :
self.response(gtk.RESPONSE_ACCEPT)
else:
self.show_error_dialog("An error occured while registering the user")
def data_validation(self):
username = self.entries[2].get_text()
password = self.entries[3].get_text()
confirmation = self.entries[4].get_text()
email = self.entries[0].get_text()
if username.trim() == "":
self.show_error_dialog('You must choose a username')
return False
if password.trim() == '':
self.show_error_dialog('You must provide a password')
return False
if email.trim() == '':
self.show_error_dialog('You must provide a valid email address')
return False
if password != confirmation:
self.show_error_dialog('The password and confirmation must be the same')
return False
return True
def show_error_dialog(self,error_message):
errorDialog = ErrorDialog("An error occured while registering a user")
errorDialog.run()
errorDialog.destroy()
def create_content(self):
entry_length = 40
table = gtk.Table(10,4,False)
self.entries = []
labels = ["Email address","Name","Username","Password","Confirmation","Location","Web Site"]
required=[True,True,True,True,True,False,False]
hidden=[False,False,False,True,True,False,False]
for x in range(6):
lbl = gtk.Label(labels[x]+":")
entry = gtk.Entry()
self.entries.append(entry)
entry.set_width_chars(entry_length)
table.attach(lbl,0,1,x,x+1,xpadding=10)
table.attach(entry,1,2,x,x+1,ypadding=10)
if hidden[x]:
entry.set_visibility(False)
if required[x]:
required_lbl = gtk.Label("*")
table.attach(required_lbl,2,3,x,x+1)
required_lbl.show()
lbl.set_alignment(0.0,0.5)
lbl.show()
entry.show()
if_required = gtk.Label(" * Required Field")
table.attach(if_required,3,4,0,1)
under_13 = gtk.CheckButton("I am 13 years old or younger",False)
legal = gtk.CheckButton("I have read the",False)
legal_notices=gtk.LinkButton('',"legal notices")
and_lbl = gtk.Label("and")
privacy = gtk.LinkButton('',"privacy statement")
hbox = gtk.HBox(False,0)
hbox.pack_start(legal)
hbox.pack_start(legal_notices)
hbox.pack_start(and_lbl)
hbox.pack_start(privacy)
table.attach(under_13,1,2,7,8)
table.attach(hbox,1,2,8,9)
under_13.show()
legal.show()
legal_notices.show()
and_lbl.show()
privacy.show()
hbox.show()
if_required.show()
table.show()
self.vbox.pack_start(table)
class InfoDialog(gtk.Dialog):
def __init__(self,tutorial,controller,categories):
gtk.Dialog.__init__(self,"Tutorial Info",None,gtk.DIALOG_MODAL)
self.tutorial = tutorial
self.controller = controller
self.categories = categories
ok_button = gtk.Button("Save")
ok_button.connect("clicked",self.ok_clicked,None)
ok_button.show()
self.action_area.pack_start(ok_button)
self.add_button("Cancel",gtk.RESPONSE_REJECT)
self.set_resizable(False)
self.prepare_content()
def prepare_content(self):
table = gtk.Table(4,2,False)
labels = ["Tutorial Name","Version","Description","Category"]
entry_length = [40,40,40]
self.entries = []
self.name_entry = gtk.Entry()
self.name_entry.set_width_chars(40)
self.name_entry.set_text(self.tutorial.name)
table.attach(self.name_entry,1,2,0,1,ypadding=10)
self.version_entry = gtk.Entry()
self.version_entry.set_width_chars(40)
self.version_entry.set_text(str(self.tutorial.version))
table.attach(self.version_entry,1,2,1,2,ypadding=10)
self.desc_entry = gtk.Entry()
self.desc_entry.set_width_chars(40)
self.desc_entry.set_text(self.tutorial.description)
table.attach(self.desc_entry,1,2,2,3,ypadding=10)
self.category_entry = gtk.combo_box_new_text()
logging.info(len(self.categories))
logging.info(self.categories)
for cat in range(0,len(self.categories)):
self.category_entry.append_text(self.categories[cat])
logging.info(self.tutorial.category)
logging.info(self.categories[cat])
if self.tutorial.category != '' and self.tutorial.category == str(self.categories[cat]):
self.category_entry.set_active(cat)
table.attach(self.category_entry,1,2,3,4,ypadding=10)
for x in range(0,4):
label = gtk.Label(labels[x])
table.attach(label,0,1,x,x+1,xpadding=10)
label.set_alignment(0.0,0.5)
table.show_all()
self.vbox.pack_start(table)
def ok_clicked(self,widget,data):
self.tutorial.version = int(self.version_entry.get_text())
self.tutorial.name = self.name_entry.get_text()
self.tutorial.description = self.desc_entry.get_text()
self.tutorial.category = self.category_entry.get_active_text()
self.controller.save_tutorial_info(self.tutorial)
self.response(gtk.RESPONSE_ACCEPT)
class StoreInformationDialog(gtk.Dialog):
def __init__(self,tutorial):
self.text = ' %(text)s: '
self.value = ' %(text)s '
gtk.Dialog.__init__(self,"Tutorial Information",None,gtk.DIALOG_MODAL,(gtk.STOCK_OK,gtk.RESPONSE_ACCEPT))
self.table = gtk.Table(6,2,False)
self.tut_name = gtk.Label("")
self.tut_name.set_markup(self.text % {"text":"Name"})
self.tut_name_value = gtk.Label()
self.tut_name_value.set_markup(self.value % {"text":tutorial.name})
self.author = gtk.Label()
self.author.set_markup(self.text % {"text":"Author"})
self.author_value = gtk.Label()
self.author_value.set_markup(self.value % {"text":tutorial.author})
self.desc = gtk.Label()
self.desc.set_markup(self.text % {"text":"Description"})
self.desc_value = gtk.Label()
self.desc_value.set_markup(self.value % {"text":tutorial.description})
self.version = gtk.Label()
self.version_value = gtk.Label()
self.version.set_markup(self.text % {"text":"Version"})
self.version_value.set_markup(self.value % {"text":str(tutorial.version)})
self.rating = gtk.Label()
self.rating_value = gtk.Label()
self.rating.set_markup(self.text % {"text":"Rating"})
self.rating_value.set_markup(self.value % {"text":str(tutorial.rating)})
self.category = gtk.Label()
self.category_value = gtk.Label()
self.category.set_markup(self.text % {"text":"Category"})
self.category_value.set_markup(self.value % {"text":tutorial.category})
self.table.attach(self.tut_name,0,1,0,1,ypadding=5)
self.table.attach(self.tut_name_value,1,2,0,1,ypadding=5)
self.table.attach(self.author,0,1,1,2,ypadding=5)
self.table.attach(self.author_value,1,2,1,2,ypadding=5)
self.table.attach(self.desc,0,1,2,3,ypadding=5)
self.table.attach(self.desc_value,1,2,2,3,ypadding=5)
self.table.attach(self.version,0,1,3,4,ypadding=5)
self.table.attach(self.version_value,1,2,3,4,ypadding=5)
self.table.attach(self.rating,0,1,4,5,ypadding=5)
self.table.attach(self.rating_value,1,2,4,5,ypadding=5)
self.table.attach(self.category,0,1,5,6,ypadding=5)
self.table.attach(self.category_value,1,2,5,6,ypadding=5)
self.vbox.pack_start(self.table)
self.table.show_all()