class PageControl(Gtk.Alignment): __gsignals__ = { 'back-button-clicked': (GObject.SIGNAL_RUN_FIRST, None, ()), 'next-button-clicked': (GObject.SIGNAL_RUN_FIRST, None, ()) } def __init__(self, num_of_pages=3, selected_page=1, back_text=_("BACK"), next_text=_("NEXT")): Gtk.Alignment.__init__(self, xalign=0.5, xscale=0) self.num_of_pages = num_of_pages self.selected = selected_page self._box = Gtk.Box() self.add(self._box) # The back button has subtly different styling to the next button # When the back button is disabled, it goes invisible, while # the NEXT button goes grey. self._back_button = OrangeButton(back_text) self._back_button.connect('clicked', self.back_button_clicked) attach_cursor_events(self._back_button) self._next_button = OrangeButton(next_text) self._next_button.connect('clicked', self.next_button_clicked) attach_cursor_events(self._next_button) self.dot_box = Gtk.Box() self._create_progress_dots(self.selected) self._box.pack_start(self._back_button, False, False, 40) self._box.pack_start(self.dot_box, False, False, 0) self._box.pack_start(self._next_button, False, False, 40) if self.selected == 1: self._back_button.set_sensitive(False) if self.selected == self.num_of_pages: self._next_button.set_sensitive(False) # self.connect('next-button-clicked', self.select_dot) # self.connect('back-button-clicked', self.select_dot) @property def back_button(self): return self._back_button @property def next_button(self): return self._next_button def disable_buttons(self): self._next_button.set_sensitive(False) self._back_button.set_sensitive(False) def enable_buttons(self): self._next_button.set_sensitive(True) self._back_button.set_sensitive(True) def enable_next(self): self._next_button.set_sensitive(True) def enable_back(self): self._back_button.set_sensitive(True) def disable_next(self): self._next_button.set_sensitive(False) def disable_back(self): self._back_button.set_sensitive(False) def set_back_button_text(self, text): self._back_button.set_label(text) def set_next_button_text(self, text): self._next_button.set_label(text) def get_back_button(self): return self._back_button def get_next_button(self): return self._next_button # TODO: these are expanding to fill the parent container. def _create_progress_dots(self, index): '''Index is a number from1 to 3, and represents which is the selected dot (i.e selected page number) ''' logger.debug("Creating dots") for child in self.dot_box.get_children(): self.dot_box.remove(child) for i in range(self.num_of_pages): if i + 1 == index: dot = self.selected_dot() dot.set_margin_left(3) dot.set_margin_right(3) dot.set_margin_top(9) dot.set_margin_bottom(9) else: dot = self.unselected_dot() dot.set_margin_left(5) dot.set_margin_right(5) dot.set_margin_top(11) dot.set_margin_bottom(11) self.dot_box.pack_start(dot, False, False, 0) self.dot_box.show_all() def unselected_dot(self): '''Produce an unselected grey spot ''' grey_dot = Gtk.EventBox() grey_dot.get_style_context().add_class('grey_dot') grey_dot.set_size_request(6, 6) return grey_dot def selected_dot(self): '''Produce a selected orange dot ''' orange_dot = Gtk.EventBox() orange_dot.get_style_context().add_class('orange_dot') orange_dot.set_size_request(10, 10) return orange_dot # these functions may not be needed def select_dot(self, widget, index): '''index is the integers 1 - 3, to represent the page numbers ''' if index not in range(self.num_of_pages): return self._create_progress_dots(index) if index == 1: self._back_button.set_sensitive(False) self._next_button.set_sensitive(True) elif index == self.num_of_pages: self._next_button.set_sensitive(False) self._back_button.set_sensitive(True) else: self._next_button.set_sensitive(True) self._back_button.set_sensitive(True) self.show_all() # These give external windows a way of knowing when these buttons have been # clicked, without mixing up the classes def back_button_clicked(self, widget): # Are these needed? # self.selected -= 1 self.emit('back-button-clicked') # , self.selected) def next_button_clicked(self, widget): # self.selected += 1 self.emit('next-button-clicked') # , self.selected)
class SetSimpleOverscan(OverscanTemplate): def __init__(self, win, original_overscan=None): OverscanTemplate.__init__( self, win, _("Overscan"), _("This setting lets you adjust your screen's size."), original_overscan ) self.win.change_prev_callback(self.go_to_display) # Listen for key events self.key_press_handler = self.win.connect('key-press-event', self.on_key_press) # slider self.t_value = Gtk.Label() self.t_value.get_style_context().add_class('slider_label') self.t_scale = Gtk.HScale.new_with_range(0, get_overscan_limit(), 1) self.t_scale.set_value(self.overscan_values['top']) self.t_scale.set_size_request(400, 30) self.t_scale.connect('value_changed', self.adjust_all) self.t_scale.connect('value_changed', self.update_all_values) self.t_scale.set_draw_value(False) self.update_all_values(self.t_scale) box = Gtk.Box() box.pack_start(self.t_scale, False, False, 5) box.pack_start(self.t_value, False, False, 5) box.pack_start(self.reset_button, False, False, 25) align = Gtk.Alignment(xalign=0.6, xscale=0, yscale=0, yalign=0.5) align.add(box) # Advance button self.advanced_button = OrangeButton() self.advanced_button.connect('button_press_event', self.go_to_advanced) self.advanced_button.set_label(_("Advanced")) button_box = Gtk.ButtonBox() button_box.set_layout(Gtk.ButtonBoxStyle.SPREAD) button_box.pack_start(self.advanced_button, False, False, 15) button_box.pack_start(self.kano_button.align, False, False, 15) empty_label = Gtk.Label(" ") button_box.pack_start(empty_label, False, False, 0) self.pack_start(align, True, True, 0) self.pack_end(button_box, False, False, 30) self.win.show_all() def reset(self, widget=None, event=None): # Restore overscan if any if self.original_overscan != self.overscan_values: set_overscan_status(self.original_overscan) self.t_scale.set_value(self.original_overscan['top']) def go_to_advanced(self, event=None, arg=None): # Remove key press handler from screen self.win.disconnect(self.key_press_handler) self.win.clear_win() SetAdvancedOverscan(self.win, self.original_overscan) def on_key_press(self, widget, event): # Right arrow (65363) if not hasattr(event, 'keyval') or event.keyval == Gdk.KEY_Right: self.overscan_values['top'] += 1 self.overscan_values['bottom'] += 1 self.overscan_values['left'] += 1 self.overscan_values['right'] += 1 set_overscan_status(self.overscan_values) self.t_scale.set_value(self.overscan_values['top']) return # Left arrow (65361) if not hasattr(event, 'keyval') or event.keyval == Gdk.KEY_Left: self.overscan_values['top'] -= 1 self.overscan_values['bottom'] -= 1 self.overscan_values['left'] -= 1 self.overscan_values['right'] -= 1 set_overscan_status(self.overscan_values) self.t_scale.set_value(self.overscan_values['top']) return def update_all_values(self, widget): new_value = str(int(widget.get_value())) self.t_value.set_text(new_value)
class SetSimpleOverscan(OverscanTemplate): def __init__(self, win, original_overscan=None): OverscanTemplate.__init__( self, win, "Overscan", "This setting lets you adjust your screen's size.", original_overscan ) self.win.change_prev_callback(self.go_to_display) # Listen for key events self.key_press_handler = self.win.connect("key-press-event", self.on_key_press) ## slider self.t_value = Gtk.Label() self.t_value.get_style_context().add_class("slider_label") self.t_scale = Gtk.HScale.new_with_range(0, 100, 1) self.t_scale.set_value(self.overscan_values['top']) self.t_scale.set_size_request(400, 30) self.t_scale.connect('value_changed', self.adjust_all) self.t_scale.connect('value_changed', self.update_all_values) self.t_scale.set_draw_value(False) self.update_all_values(self.t_scale) box = Gtk.Box() box.pack_start(self.t_scale, False, False, 5) box.pack_start(self.t_value, False, False, 5) box.pack_start(self.reset_button, False, False, 25) align = Gtk.Alignment(xalign=0.6, xscale=0, yscale=0, yalign=0.5) align.add(box) # Advance button self.advanced_button = OrangeButton() self.advanced_button.connect("button_press_event", self.go_to_advanced) self.advanced_button.set_label("Advanced") button_box = Gtk.ButtonBox() button_box.set_layout(Gtk.ButtonBoxStyle.SPREAD) button_box.pack_start(self.advanced_button, False, False, 15) button_box.pack_start(self.kano_button.align, False, False, 15) empty_label = Gtk.Label(" ") button_box.pack_start(empty_label, False, False, 0) self.pack_start(align, True, True, 0) self.pack_end(button_box, False, False, 30) self.win.show_all() def reset(self, widget=None, event=None): # Restore overscan if any if self.original_overscan != self.overscan_values: set_overscan_status(self.original_overscan) self.t_scale.set_value(self.original_overscan['top']) def go_to_advanced(self, event=None, arg=None): # Remove key press handler from screen self.win.disconnect(self.key_press_handler) self.win.clear_win() SetAdvancedOverscan(self.win, self.original_overscan) def on_key_press(self, widget, event): # Right arrow (65363) if not hasattr(event, 'keyval') or event.keyval == Gdk.KEY_Right: self.overscan_values['top'] += 1 self.overscan_values['bottom'] += 1 self.overscan_values['left'] += 1 self.overscan_values['right'] += 1 set_overscan_status(self.overscan_values) self.t_scale.set_value(self.overscan_values['top']) return # Left arrow (65361) if not hasattr(event, 'keyval') or event.keyval == Gdk.KEY_Left: self.overscan_values['top'] -= 1 self.overscan_values['bottom'] -= 1 self.overscan_values['left'] -= 1 self.overscan_values['right'] -= 1 set_overscan_status(self.overscan_values) self.t_scale.set_value(self.overscan_values['top']) return def update_all_values(self, widget): new_value = str(int(widget.get_value())) self.t_value.set_text(new_value)