def __init__(self, app): super().__init__() self.app = app self.play_type = PlayType.NONE self.adj_timeout = 0 self.recommend_imgs = None self.curr_song = None self.fullscreen_sid = 0 self.fullscreen_timestamp = 0 self.default_cursor = None self.blank_cursor = Gdk.Cursor.new(Gdk.CursorType.BLANK_CURSOR) # use this to keep Net.AsyncSong object self.async_song = None self.async_next_song = None event_pic = Gtk.EventBox() event_pic.connect('button-press-event', self.on_pic_pressed) self.pack_start(event_pic, False, False, 0) self.artist_pic = Gtk.Image.new_from_pixbuf(Config.ANONYMOUS_PIXBUF) event_pic.add(self.artist_pic) control_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.pack_start(control_box, True, True, 0) toolbar = Gtk.Toolbar() toolbar.set_style(Gtk.ToolbarStyle.ICONS) toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_MENUBAR) toolbar.set_show_arrow(False) toolbar.set_icon_size(ICON_SIZE) control_box.pack_start(toolbar, False, False, 0) prev_button = Gtk.ToolButton() prev_button.set_label(_('Previous')) prev_button.set_icon_name('media-skip-backward-symbolic') prev_button.connect('clicked', self.on_prev_button_clicked) toolbar.insert(prev_button, 0) self.playback_action = Gtk.ToggleAction('playback-action', _('Play'), _('Play'), None) self.playback_action.set_icon_name('media-playback-start-symbolic') self.playback_action.set_label(_('Play')) self.playback_action.set_active(False) self.playback_action.connect('toggled', self.on_playback_action_toggled) play_button = Gtk.ToolButton() play_button.props.related_action = self.playback_action toolbar.insert(play_button, 1) next_button = Gtk.ToolButton() next_button.set_label(_('Next')) next_button.set_icon_name('media-skip-forward-symbolic') next_button.connect('clicked', self.on_next_button_clicked) toolbar.insert(next_button, 2) self.shuffle_btn = Gtk.ToggleToolButton() self.shuffle_btn.set_label(_('Shuffle')) self.shuffle_btn.set_icon_name('media-playlist-shuffle-symbolic') self.shuffle_btn.props.margin_left = 10 toolbar.insert(self.shuffle_btn, 3) self.repeat_type = RepeatType.NONE self.repeat_btn = Gtk.ToggleToolButton() self.repeat_btn.set_label(_('Repeat')) self.repeat_btn.set_icon_name('media-playlist-repeat-symbolic') self.repeat_btn.connect('clicked', self.on_repeat_button_clicked) toolbar.insert(self.repeat_btn, 4) self.use_audio_btn = Gtk.RadioToolButton() self.use_audio_btn.set_label(_('Play audio')) self.use_audio_btn.set_icon_name('audio-x-generic-symbolic') self.use_audio_btn.props.margin_left = 10 self.use_audio_btn.set_active(True) self.use_audio_sid = self.use_audio_btn.connect( 'toggled', self.on_play_type_toggled, PlayType.SONG) toolbar.insert(self.use_audio_btn, 5) self.use_mtv_btn = Gtk.RadioToolButton() self.use_mtv_btn.set_label(_('Play MTV')) self.use_mtv_btn.set_tooltip_text(_('Play MTV')) self.use_mtv_btn.set_icon_name('video-x-generic-symbolic') self.use_mtv_btn.set_sensitive(False) self.use_mtv_btn.props.group = self.use_audio_btn self.use_mtv_sid = self.use_mtv_btn.connect('toggled', self.on_play_type_toggled, PlayType.MV) toolbar.insert(self.use_mtv_btn, 6) self.fullscreen_btn = Gtk.ToggleToolButton() self.fullscreen_btn.set_label(_('Fullscreen')) self.fullscreen_btn.set_icon_name('view-fullscreen-symbolic') self.fullscreen_btn.props.margin_left = 10 self.fullscreen_btn.connect('toggled', self.on_fullscreen_button_toggled) toolbar.insert(self.fullscreen_btn, 7) self.app.window.connect('key-press-event', self.on_window_key_pressed) self.favorite_btn = Gtk.ToolButton() self.favorite_btn.set_label(_('Favorite')) self.favorite_btn.set_icon_name('emblem-favorite-symbolic') self.favorite_btn.set_tooltip_text(_('Add to Favorite playlist')) self.favorite_btn.props.margin_left = 10 self.favorite_btn.connect('clicked', self.on_favorite_btn_clicked) toolbar.insert(self.favorite_btn, 8) osd_lrc_btn = Gtk.ToggleToolButton() osd_lrc_btn.props.related_action = self.app.osdlrc.show_window_action toolbar.insert(osd_lrc_btn, 9) # control menu menu_tool_item = Gtk.ToolItem() toolbar.insert(menu_tool_item, 10) toolbar.child_set_property(menu_tool_item, 'expand', True) main_menu = Gtk.Menu() pref_item = Gtk.MenuItem(label=_('Preferences')) pref_item.connect('activate', self.on_main_menu_pref_activate) main_menu.append(pref_item) sep_item = Gtk.SeparatorMenuItem() main_menu.append(sep_item) show_osd_item = Gtk.MenuItem() show_osd_item.props.related_action = self.app.osdlrc.show_window_action main_menu.append(show_osd_item) lock_osd_item = Gtk.MenuItem() lock_osd_item.props.related_action = self.app.osdlrc.lock_window_action main_menu.append(lock_osd_item) sep_item = Gtk.SeparatorMenuItem() main_menu.append(sep_item) about_item = Gtk.MenuItem(label=_('About')) about_item.connect('activate', self.on_main_menu_about_activate) main_menu.append(about_item) quit_item = Gtk.MenuItem(label=_('Quit')) key, mod = Gtk.accelerator_parse('<Ctrl>Q') quit_item.add_accelerator('activate', app.accel_group, key, mod, Gtk.AccelFlags.VISIBLE) quit_item.connect('activate', self.on_main_menu_quit_activate) main_menu.append(quit_item) main_menu.show_all() menu_image = Gtk.Image() menu_image.set_from_icon_name('view-list-symbolic', ICON_SIZE) if Config.GTK_LE_36: menu_btn = Gtk.Button() menu_btn.connect('clicked', self.on_main_menu_button_clicked, main_menu) else: menu_btn = Gtk.MenuButton() menu_btn.set_popup(main_menu) menu_btn.set_always_show_image(True) menu_btn.props.halign = Gtk.Align.END menu_btn.props.relief = Gtk.ReliefStyle.NONE menu_btn.set_image(menu_image) menu_tool_item.add(menu_btn) self.label = Gtk.Label('<b>{0}</b> <small>{0}</small>'.format( _('Unknown'))) self.label.props.use_markup = True self.label.props.xalign = 0 self.label.props.margin_left = 10 control_box.pack_start(self.label, False, False, 0) scale_box = Gtk.Box(spacing=3) scale_box.props.margin_left = 5 control_box.pack_start(scale_box, True, False, 0) self.scale = Gtk.Scale() self.adjustment = Gtk.Adjustment(0, 0, 100, 1, 10, 0) self.adjustment.connect('changed', self.on_adjustment_changed) self.scale.set_adjustment(self.adjustment) self.scale.set_show_fill_level(False) self.scale.set_restrict_to_fill_level(False) self.scale.props.draw_value = False self.scale.connect('change-value', self.on_scale_change_value) scale_box.pack_start(self.scale, True, True, 0) self.time_label = Gtk.Label('0:00/0:00') scale_box.pack_start(self.time_label, False, False, 0) self.volume = Gtk.VolumeButton() self.volume.props.use_symbolic = True self.volume.set_value(app.conf['volume']**0.33) self.volume_sid = self.volume.connect('value-changed', self.on_volume_value_changed) scale_box.pack_start(self.volume, False, False, 0) # init playbin and dbus self.playbin = PlayerBin() self.playbin.set_volume(self.app.conf['volume']**0.33) self.playbin.connect('eos', self.on_playbin_eos) self.playbin.connect('error', self.on_playbin_error) self.playbin.connect('mute-changed', self.on_playbin_mute_changed) self.playbin.connect('volume-changed', self.on_playbin_volume_changed) self.dbus = PlayerDBus(self) self.notify = PlayerNotify(self)