class MainWindow(ApplicationWindow): def __init__(self, install=None, icon_only=False, tutorial=False): ApplicationWindow.__init__(self, 'Apps', 755, 588) self._install = install self._tutorial = tutorial self._icon_only = icon_only self._last_page = 0 self.connect("show", self._app_loaded) # Destructor self.connect('delete-event', Gtk.main_quit) self.set_icon_from_file("/usr/share/kano-desktop/icons/apps.png") # Styling screen = Gdk.Screen.get_default() specific_css_provider = Gtk.CssProvider() specific_css_provider.load_from_path(Media.media_dir() + 'css/style.css') specific_style_context = Gtk.StyleContext() specific_style_context.add_provider_for_screen( screen, specific_css_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER) style = self.get_style_context() style.add_class('main_window') # Setup widgets self.set_decorated(True) self._top_bar = TopBar(_("Apps"), self._win_width, False) self._top_bar.set_close_callback(Gtk.main_quit) self.set_titlebar(self._top_bar) self._contents = Contents(self) self.set_main_widget(self._contents) self.show_apps_view() def get_main_area(self): return self._contents def get_last_page(self): return self._last_page def set_last_page(self, last_page_num): self._last_page = last_page_num def show_apps_view(self, button=None, event=None): self._top_bar.disable_prev() self._apps = apps = Apps(get_applications(), self) self.get_main_area().set_contents(apps) def refresh(self, category=None): for app in get_applications(): if self._apps.has_app(app): self._apps.update_app(app) else: self._apps.add_app(app) def _app_loaded(self, widget): if self._install is not None: self._install_apps() elif self._tutorial: self._show_icon_tutorial() def _show_icon_tutorial(self): try: from kano_profile.apps import save_app_state_variable, load_app_state_variable if load_app_state_variable('kano-apps', 'icon-tutorial-shown'): return else: save_app_state_variable('kano-apps', 'icon-tutorial-shown', True) except ImportError: # ignore problems importing kano_profile, as we don't want it to # be a dependency pass kdialog = KanoDialog( _("Add more apps to the desktop"), _("Click the '+' button to the right of the app name to " "make it appear on the desktop. You can remove it again " "by clicking on 'x'."), {_("OK, GOT IT"): { "return_value": 0, "color": "green" }}, parent_window=self) kdialog.set_action_background("grey") kdialog.title.description.set_max_width_chars(40) kdialog.run() def _install_apps(self): pw = None for app in self._install: inst = AppInstaller(app, self._apps, pw, self) inst.set_check_if_installed(True) inst.set_icon_only(self._icon_only) inst.install() pw = inst.get_sudo_pw() self.set_last_page(0) refresh_package_list() self.refresh()
class MainWindow(ApplicationWindow): def __init__(self, install=None, icon_only=False, tutorial=False): ApplicationWindow.__init__(self, 'Apps', 755, 588) self._install = install self._tutorial = tutorial self._icon_only = icon_only self._last_page = 0 self.connect("show", self._app_loaded) # Destructor self.connect('delete-event', Gtk.main_quit) self.set_icon_from_file("/usr/share/kano-desktop/icons/apps.png") # Styling screen = Gdk.Screen.get_default() specific_css_provider = Gtk.CssProvider() specific_css_provider.load_from_path(Media.media_dir() + 'css/style.css') specific_style_context = Gtk.StyleContext() specific_style_context.add_provider_for_screen( screen, specific_css_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER ) style = self.get_style_context() style.add_class('main_window') # Setup widgets self.set_decorated(True) self._top_bar = TopBar(_("Apps"), self._win_width, False) self._top_bar.set_close_callback(Gtk.main_quit) self.set_titlebar(self._top_bar) self._contents = Contents(self) self.set_main_widget(self._contents) self.show_apps_view() def get_main_area(self): return self._contents def get_last_page(self): return self._last_page def set_last_page(self, last_page_num): self._last_page = last_page_num def show_apps_view(self, button=None, event=None): self._top_bar.disable_prev() self._apps = apps = Apps(get_applications(), self) self.get_main_area().set_contents(apps) def refresh(self, category=None): for app in get_applications(): if self._apps.has_app(app): self._apps.update_app(app) else: self._apps.add_app(app) def _app_loaded(self, widget): if self._install is not None: self._install_apps() elif self._tutorial: self._show_icon_tutorial() def _show_icon_tutorial(self): if load_app_state_variable('kano-apps', 'icon-tutorial-shown'): return else: save_app_state_variable('kano-apps', 'icon-tutorial-shown', True) kdialog = KanoDialog( _("Add more apps to the desktop"), _( "Click the '+' button to the right of the app name to " "make it appear on the desktop. You can remove it again " "by clicking on 'x'." ), { _("OK, GOT IT"): { "return_value": 0, "color": "green" } }, parent_window=self ) kdialog.set_action_background("grey") kdialog.title.description.set_max_width_chars(40) kdialog.run() def _install_apps(self): pw = None for app in self._install: inst = AppInstaller(app, self._apps, pw, self) inst.set_check_if_installed(True) inst.set_icon_only(self._icon_only) inst.install() pw = inst.get_sudo_pw() self.set_last_page(0) refresh_package_list() self.refresh()
class GreeterWindow(ApplicationWindow): WIDTH = 400 HEIGHT = -1 greeter = LightDM.Greeter def __init__(self): apply_common_to_screen() self.a = self.b = self.c = 0 self.switching = 0 ApplicationWindow.__init__(self, _('Login'), self.WIDTH, self.HEIGHT) self.connect("delete-event", Gtk.main_quit) # Create a new LightDM.Greeter instance which will be used by the 2 views self.greeter = GreeterWindow.greeter.new() # Create the two views: one for normal Login, the other to create a new account self.password_view = PasswordView(None, self.greeter) self.newuser_view = NewUserView(self.greeter) self.login_with_kw_view = LoginWithKanoWorldView(self.greeter) self.grid = Gtk.Grid() self.set_main_widget(self.grid) self.grid.set_column_spacing(30) self.grid.set_row_spacing(30) self.top_bar = TopBar(_('Login')) self._remove_top_bar_buttons() self.top_bar.set_size_request(self.WIDTH, -1) self.grid.attach(self.top_bar, 0, 0, 3, 1) self.grid.attach(Gtk.Label(), 0, 3, 3, 1) self.top_bar.set_prev_callback(self._back_cb) self.user_list = UserListView() self.go_to_users() cursor = Gdk.Cursor.new(Gdk.CursorType.ARROW) self.get_root_window().set_cursor(cursor) def _remove_top_bar_buttons(self): self.top_bar.box.remove(self.top_bar.close_button) self.top_bar.box.remove(self.top_bar.next_button) def set_main(self, wdg): child = self.grid.get_child_at(1, 1) if child: self.grid.remove(child) self.grid.attach(wdg, 1, 1, 1, 1) self.show_all() def go_to_users(self): self.set_main(self.user_list) self.top_bar.disable_prev() def go_to_password(self, user): self.set_main(self.password_view) self.top_bar.enable_prev() if not self.switching == 1: self.greeter.disconnect(self.a) self.greeter.disconnect(self.b) self.greeter.disconnect(self.c) self.greeter = GreeterWindow.greeter.new() self.password_view.greeter = self.greeter (self.a, self.b, self.c) = self.password_view._reset_greeter() self.switching = 1 self.password_view.grab_focus(user) def go_to_newuser(self): self.set_main(self.newuser_view) self.top_bar.enable_prev() if not self.switching == 2: self.greeter.disconnect(self.a) self.greeter.disconnect(self.b) self.greeter.disconnect(self.c) self.greeter = GreeterWindow.greeter.new() self.newuser_view.greeter = self.greeter # FIXME: We do not reset the greeter in the newuser view # It will be done only when the local user account has been forced # so as to avoid LightDM freezes # (self.a, self.b, self.c) = self.newuser_view._reset_greeter() self.switching = 2 def go_to_login_with_kw(self): self.set_main(self.login_with_kw_view) self.top_bar.enable_prev() if not self.switching == 3: self.greeter.disconnect(self.a) self.greeter.disconnect(self.b) self.greeter.disconnect(self.c) self.greeter = GreeterWindow.greeter.new() self.login_with_kw_view.greeter = self.greeter # FIXME: We do not reset the greeter in the newuser view # It will be done only when the local user account has been forced # so as to avoid LightDM freezes # (self.a, self.b, self.c) = self.login_with_kw_view._reset_greeter() self.switching = 3 self.login_with_kw_view.grab_focus() def _back_cb(self, event, button): self.go_to_users()