diff options
Diffstat (limited to 'pages/edit.py')
-rw-r--r-- | pages/edit.py | 303 |
1 files changed, 303 insertions, 0 deletions
diff --git a/pages/edit.py b/pages/edit.py new file mode 100644 index 0000000..b213655 --- /dev/null +++ b/pages/edit.py @@ -0,0 +1,303 @@ +# 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 os +import gtk +import hippo +import pango +import logging +from gettext import gettext as _ + +from globals import Globals +from gui.page import Page +from gui import theme + +from gui.canvaslistbox import CanvasListBox + +from util.decorators import Property + +from pages.submit import JokeEditor +from pages.joke import JokeViewer + +import pages.preview +import persistence.joke + + + +class PageSelector(hippo.CanvasBox): + + def __init__(self, parent, **kwargs): + hippo.CanvasBox.__init__(self, **kwargs) + self.__parent = parent + + control_width = 1024 # TODO -> Figure this out from parent size + self.props.border = 1 + self.props.border_color=theme.COLOR_TAB_ACTIVE.get_int() + self.props.background_color=theme.COLOR_PAGE.get_int() + self.props.orientation=hippo.ORIENTATION_VERTICAL + + # button box -> # TODO -> Make into generic control + tab_width = control_width / 3.0 + tab_box = hippo.CanvasBox(background_color=theme.COLOR_TAB_SEPERATOR.get_int(), + spacing=2, + orientation=hippo.ORIENTATION_HORIZONTAL) + self.__tab_1 = hippo.CanvasText(text=_('Edit Jokebook Cover'), + box_width=tab_width, + padding=theme.PADDING_TAB, + xalign=hippo.ALIGNMENT_START, + background_color=theme.COLOR_TAB_ACTIVE.get_int(), + color=theme.COLOR_TAB_TEXT.get_int(), + font_desc=theme.FONT_TABS.get_pango_desc()) + self.__tab_1.page = EditInfo + self.__tab_1.connect('button-press-event', self.__do_clicked_tab) + tab_box.append(self.__tab_1) + self.__tab_2 = hippo.CanvasText(text=_('Edit My Jokes'), + box_width=tab_width, + padding=theme.PADDING_TAB, + xalign=hippo.ALIGNMENT_START, + background_color=theme.COLOR_TAB_INACTIVE.get_int(), + color=theme.COLOR_TAB_TEXT.get_int(), + font_desc=theme.FONT_TABS.get_pango_desc()) + self.__tab_2.page = EditJokes + self.__tab_2.connect('button-press-event', self.__do_clicked_tab) + tab_box.append(self.__tab_2) + self.__tab_3 = hippo.CanvasText(text=_('Review Submitted Jokes'), + box_width=tab_width, + padding=theme.PADDING_TAB, + xalign=hippo.ALIGNMENT_START, + background_color=theme.COLOR_TAB_INACTIVE.get_int(), + color=theme.COLOR_TAB_TEXT.get_int(), + font_desc=theme.FONT_TABS.get_pango_desc()) + self.__tab_3.page = EditReview + self.__tab_3.connect('button-press-event', self.__do_clicked_tab) + tab_box.append(self.__tab_3) + self.append(tab_box) + + self.__page = hippo.CanvasBox(background_color=theme.COLOR_PAGE.get_int(), + orientation=hippo.ORIENTATION_VERTICAL) + self.append(self.__page) + + + @Property + def page(): + def get(self): return self.__page.the_page + def set(self, value): + self.__page.clear() + self.__page.append(value) + self.__page.the_page = value + + + def __do_clicked_tab(self, control, event): + self.__tab_1.props.background_color=theme.COLOR_TAB_INACTIVE.get_int() + self.__tab_2.props.background_color=theme.COLOR_TAB_INACTIVE.get_int() + self.__tab_3.props.background_color=theme.COLOR_TAB_INACTIVE.get_int() + control.props.background_color=theme.COLOR_TAB_ACTIVE.get_int() + self.__parent.do_tab_clicked(control.page) + + + +class Edit(Page): + + def __init__(self, jokebook): + Page.__init__(self, xalign=hippo.ALIGNMENT_CENTER) + + self.__jokebook = jokebook + + self.__page_selector = PageSelector(self) + self.append(self.__page_selector) + self.__page_selector.page = EditInfo(jokebook, self) + + button = gtk.Button(_('Preview')) + button.connect('clicked', self.__do_clicked_preview, jokebook) + self.append(hippo.CanvasWidget(widget=theme.theme_widget(button), padding_top=theme.SPACER_VERTICAL)) + + + def __do_clicked_preview(self, button, jokebook): + Globals.JokeMachineActivity.set_page(pages.preview.Preview, jokebook) + + + def do_tab_clicked(self, page_class): + print page_class + self.__page_selector.page = page_class(self.__jokebook, self) + + + +class EditInfo(Page): # TODO -> gui.Page should follow this pattern rather + def __init__(self, jokebook, parent): + Page.__init__(self, xalign=hippo.ALIGNMENT_CENTER, + orientation=hippo.ORIENTATION_VERTICAL, + padding=20, + spacing=20, + box_height=theme.TABS_HEIGHT) + + # page title + self.append(self.make_field(_('Title of Jokebook:'), 250, jokebook, 'title', 300, True)) + #field = self.make_field(_('Sound Effect:'), 250, None, '', 300, False) + + sound_effect = hippo.CanvasBox(orientation=hippo.ORIENTATION_HORIZONTAL, spacing=10) + sound_effect.append(self.make_bodytext(_('Sound Effect:'), 250, hippo.ALIGNMENT_START, theme.COLOR_DARK_GREEN)) + sound_effect.append(self.make_audiobox(jokebook, 'sound', 316)) + self.append(sound_effect) + + + # cover picture + cover_image = self.make_imagebox(jokebook, 'image', 320, 240, True) + self.append(cover_image) + + # punchline sound + #self.append(self.make_audiobox(jokebook, 'sound')) + + + +class EditJokes(Page): + + def __init__(self, jokebook, parent): + Page.__init__(self) + + # list of jokes + jokes_div = CanvasListBox(800, theme.TABS_HEIGHT) + jokes_div.props.border=0 + for joke in jokebook.jokes: + list_row = self.make_listrow(JokeEditor(joke)) + button = gtk.Button(' ' + _('Delete') + ' ') + button.connect('clicked', self.__do_clicked_delete, jokebook, joke, parent) + list_row.append(hippo.CanvasWidget(widget=theme.theme_widget(button), + border_color=theme.COLOR_RED.get_int(), + border=0, + padding_top=10, + padding_bottom=10, + padding_left=85)) + #xalign=hippo.ALIGNMENT_END)) + jokes_div.append(list_row) + self.append(jokes_div) + + # new joke button + buttons = hippo.CanvasBox(orientation=hippo.ORIENTATION_HORIZONTAL, + xalign=hippo.ALIGNMENT_START) + + button = gtk.Button(_('Add New Joke')) + button.connect('clicked', self.__do_clicked_add_joke, jokebook, parent) + buttons.append(hippo.CanvasWidget(widget=theme.theme_widget(button))) + jokes_div.append(buttons) + + + def __do_clicked_delete(self, button, jokebook, joke, parent): + confirm = gtk.MessageDialog(Globals.JokeMachineActivity, + gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, + gtk.MESSAGE_QUESTION, + gtk.BUTTONS_YES_NO, + _('Are you sure you want to delete this joke ?')) + response = confirm.run() + confirm.hide() + confirm.destroy() + del confirm + if response == gtk.RESPONSE_YES: + logging.debug('Deleting joke: %s' % joke.id) + jokebook.jokes.remove(joke) + parent.do_tab_clicked(EditJokes) + + + def __do_clicked_add_joke(self, button, jokebook, parent): + # create a new joke + joke = persistence.joke.Joke() + joke.id = jokebook.next_joke_id + logging.info('Created new joke with id: %d' % joke.id) + joke.joker = Globals.nickname + jokebook.jokes.append(joke) + + # reload tab + parent.do_tab_clicked(EditJokes) + + + +class EditReview(Page): + def __init__(self, jokebook, parent): + Page.__init__(self) + + jokes_div = CanvasListBox(800, theme.TABS_HEIGHT) + jokes_div.props.border=0 + for joke in jokebook.submissions: + list_row = self.make_listrow(JokeViewer(joke, jokebook.title)) + list_row.props.orientation=hippo.ORIENTATION_VERTICAL + + buttons = hippo.CanvasBox(orientation=hippo.ORIENTATION_HORIZONTAL, + xalign=hippo.ALIGNMENT_END, + spacing=10, + padding=10) + + button = gtk.Button(' ' + _('Reject') + ' ') + button.connect('clicked', self.__do_clicked_reject, jokebook, joke, parent) + buttons.append(hippo.CanvasWidget(widget=theme.theme_widget(button), + border_color=theme.COLOR_RED.get_int(), + border=0, + xalign=hippo.ALIGNMENT_CENTER)) + + button = gtk.Button(' ' + _('Accept') + ' ') + button.connect('clicked', self.__do_clicked_accept, jokebook, joke, parent) + buttons.append(hippo.CanvasWidget(widget=theme.theme_widget(button), + border_color=theme.COLOR_RED.get_int(), + border=0, + xalign=hippo.ALIGNMENT_CENTER)) + + list_row.append(buttons) + + #list_row.props.orientation=hippo.ORIENTATION_VERTICAL + #status_box = hippo.CanvasBox(orientation=hippo.ORIENTATION_HORIZONTAL, + #padding_top=4, + #padding_left=4) + #status_box.append(hippo.CanvasText(text=_('Status:'), + #color=theme.COLOR_DARK_GREEN.get_int(), + #box_width=100, + #xalign=hippo.ALIGNMENT_START, + #font_desc=theme.FONT_BODY.get_pango_desc())) + ##button = None + #button = gtk.RadioButton() + #button = gtk.RadioButton(button, _('Approved')) + #button.set_size_request(200, -1) + #status_box.append(hippo.CanvasWidget(widget = button)) + #button = gtk.RadioButton(button, _('Rejected')) + #button.set_size_request(200, -1) + #status_box.append(hippo.CanvasWidget(widget = button)) + #button = gtk.RadioButton(button, _('Not Reviewed')) + #button.set_size_request(200, -1) + #button.set_active(True) + #status_box.append(hippo.CanvasWidget(widget = button)) + #list_row.append(status_box) + + jokes_div.append(list_row) + + self.append(jokes_div) + + + def __do_clicked_accept(self, button, jokebook, joke, parent): + jokebook.jokes.append(joke) + jokebook.submissions.remove(joke) + parent.do_tab_clicked(EditReview) + + if not Globals.JokeMachineActivity.is_shared: + return + + # broadcast submission onto the mesh + logging.debug('Broadcasting joke to mesh') + pickle = joke.dumps() + Globals.JokeMachineActivity.tube.BroadcastJoke(jokebook.id, pickle) + logging.debug('Broadcasted joke to mesh') + + + + def __do_clicked_reject(self, button, jokebook, joke, parent): + jokebook.submissions.remove(joke) + parent.do_tab_clicked(EditReview) |