예제 #1
0
 def read_toggled_cb(self, toggle):
     if toggle.props.active:
         get_reddit_api().read_message(self.data['name'])
         self._read.get_style_context().remove_class('unread')
         self._read.props.active = True
         self._read.props.sensitive = False
         self._read.props.label = 'Read'
예제 #2
0
    def __init__(self, start_sub='/r/all'):
        Gtk.Window.__init__(self, title='Reddit is Gtk+',
                            icon_name='reddit-is-a-dead-bird')
        self.add_events(Gdk.EventMask.KEY_PRESS_MASK)

        self.set_default_size(600, 600)
        screen = Gdk.Screen.get_default()
        css_provider = Gtk.CssProvider.get_default()
        css_provider.load_from_resource('/today/sam/reddit-is-gtk/style.css')
        context = Gtk.StyleContext()
        context.add_provider_for_screen(screen, css_provider,
                                        Gtk.STYLE_PROVIDER_PRIORITY_USER)


        self._paned = Gtk.Paned.new(Gtk.Orientation.HORIZONTAL)
        self.add(self._paned)
        self._paned.show()

        self._webview = FullscreenableWebview()
        self._webview_bin = ProgressContainer(self._webview)
        self._comments = None
        self._stack = Gtk.Stack()
        self._stack.connect('notify::visible-child', self.__stack_child_cb)
        self._paned.add2(self._stack)
        self._stack.show()

        self._make_header()

        self._sublist = SubList()
        self._sublist.new_other_pane.connect(self.__new_other_pane_cb)
        self._paned.add1(self._sublist)
        self._sublist.show()
        self._sublist.goto(start_sub)

        get_reddit_api().request_failed.connect(self.__request_failed_cb)
예제 #3
0
    def __toggled_cb(self, toggle):
        self._set_label()
        self._button.props.sensitive = False

        get_reddit_api().set_subscribed(self._subreddit_name,
                                        self._button.props.active,
                                        self.__subscribe_cb)
예제 #4
0
 def read_toggled_cb(self, toggle):
     if toggle.props.active:
         get_reddit_api().read_message(self.data['name'])
         self._read.get_style_context().remove_class('unread')
         self._read.props.active = True
         self._read.props.sensitive = False
         self._read.props.label = 'Read'
예제 #5
0
    def __message_done_cb(self, session, msg, user_data):
        id, callback = user_data

        data = msg.props.response_body.data
        if id not in self._tokens:
            self._tokens[id] = {}
        if data is None:
            # TODO:  Show this error to the user
            print('Token refresh failed')
            from redditisgtk.api import describe_soup_transport_error
            print(data, msg.props.status_code,
                  describe_soup_transport_error(msg.props.status_code, msg))
            return

        # We must keep some things we only get the 1st time, eg.
        # the refresh token
        self._tokens[id].update(json.loads(data))
        self._tokens[id]['time'] = time.time()

        self.save()
        self.token_changed.emit(self._tokens[id])
        self.sign_in_status.emit('', True)

        if callback is not None:
            callback()

        if 'username' not in self._tokens[id]:
            # api imports us, so we must wait to import them
            from redditisgtk.api import get_reddit_api
            get_reddit_api().send_request('GET',
                                          '/api/v1/me',
                                          self.__whoami_cb,
                                          user_data=id)
예제 #6
0
    def __message_done_cb(self, session, msg, user_data):
        id, callback = user_data

        data = msg.props.response_body.data
        if id not in self._tokens:
            self._tokens[id] = {}
        if data is None:
            # TODO:  Show this error to the user
            print('Token refresh failed')
            from redditisgtk.api import describe_soup_transport_error
            print(data,
                  msg.props.status_code,
                  describe_soup_transport_error(msg.props.status_code, msg))
            return

        # We must keep some things we only get the 1st time, eg.
        # the refresh token
        self._tokens[id].update(json.loads(data))
        self._tokens[id]['time'] = time.time()

        self.save()
        self.token_changed.emit(self._tokens[id])
        self.sign_in_status.emit('', True)

        if callback is not None:
            callback()

        if 'username' not in self._tokens[id]:
            # api imports us, so we must wait to import them
            from redditisgtk.api import get_reddit_api
            get_reddit_api().send_request(
                'GET', '/api/v1/me', self.__whoami_cb, user_data=id)
예제 #7
0
    def __subscribe_toggled_cb(self, toggle):
        self._subscribe.props.label = 'Subscribing...'  \
            if self._subscribe.props.active else 'Unsubscribing...'
        self._subscribe.props.sensitive = False

        get_reddit_api().set_subscribed(self._subreddit_name,
                                        self._subscribe.props.active,
                                        self.__subscribe_cb)
예제 #8
0
    def __init__(self, parent, **kwargs):
        VScrollingPopover.__init__(self, **kwargs)
        self._parent = parent

        get_reddit_api().subs_changed.connect(self.__changed_cb)
        get_reddit_api().user_changed.connect(self.__changed_cb)
        self._parent.connect('activate', self.__changed_cb)
        self._rebuild()
예제 #9
0
    def __init__(self, parent, **kwargs):
        VScrollingPopover.__init__(self, **kwargs)
        self.get_style_context().add_class('subentry-palette')
        self._parent = parent
        self._filter = None

        get_reddit_api().subs_changed.connect(self.__changed_cb)
        get_reddit_api().user_changed.connect(self.__changed_cb)
        self._rebuild()
예제 #10
0
    def __init__(self, parent, **kwargs):
        VScrollingPopover.__init__(self, **kwargs)
        self.get_style_context().add_class('subentry-palette')
        self._parent = parent
        self._filter = None

        get_reddit_api().subs_changed.connect(self.__changed_cb)
        get_reddit_api().user_changed.connect(self.__changed_cb)
        self._rebuild()
예제 #11
0
    def __init__(self, uri):
        Gtk.Bin.__init__(self)

        self._spinner = Gtk.Spinner()
        self.add(self._spinner)
        self._spinner.show()

        self._image = Gtk.Image()
        self.add(self._image)
        get_reddit_api().download_thumb(uri, self.__message_done_cb)
    def __init__(self, uri):
        Gtk.Bin.__init__(self)

        self._spinner = Gtk.Spinner()
        self.add(self._spinner)
        self._spinner.show()

        self._image = Gtk.Image()
        self.add(self._image)
        get_reddit_api().download_thumb(uri, self.__message_done_cb)
예제 #13
0
    def __init__(self, start_sub=None):
        Gtk.Window.__init__(self, title='Something For Reddit',
                            icon_name='reddit-is-a-dead-bird')
        self.add_events(Gdk.EventMask.KEY_PRESS_MASK)
        self.set_default_size(600, 600)
        self.set_wmclass("reddit-is-gtk", "Something For Reddit")

        settings = Gtk.Settings.get_default()
        screen = Gdk.Screen.get_default()
        css_provider = Gtk.CssProvider.get_default()
        if settings.props.gtk_application_prefer_dark_theme:
            css_provider.load_from_resource(
                '/today/sam/reddit-is-gtk/style.dark.css')
        else:
            css_provider.load_from_resource(
                '/today/sam/reddit-is-gtk/style.css')
        context = Gtk.StyleContext()
        context.add_provider_for_screen(screen, css_provider,
                                        Gtk.STYLE_PROVIDER_PRIORITY_USER)

        self._paned = Gtk.Paned.new(Gtk.Orientation.HORIZONTAL)
        self.add(self._paned)
        self._paned.show()

        self._webview = FullscreenableWebview()
        self._webview_bin = ProgressContainer(self._webview)
        self._comments = None
        self._stack = Gtk.Stack()
        self._stack.connect('notify::visible-child', self.__stack_child_cb)
        self._paned.add2(self._stack)
        #self._paned.child_set_property(self._stack, 'shrink', True)
        self._stack.show()

        if start_sub is None:
            start_sub = get_settings()['default-sub']
        self._sublist = SubList()
        self._sublist.new_other_pane.connect(self.__new_other_pane_cb)
        self._paned.add1(self._sublist)
        #self._paned.child_set_property(self._sublist, 'shrink', True)
        self._sublist.show()
        self._sublist.goto(start_sub)

        self._make_header(start_sub)
        left = Gtk.SizeGroup(mode=Gtk.SizeGroupMode.HORIZONTAL)
        left.add_widget(self._left_header)
        left.add_widget(self._sublist)
        self._paned.connect('notify::position',
                            self.__notify_position_cb,
                            self._header_paned)
        self._header_paned.connect('notify::position',
                                   self.__notify_position_cb,
                                   self._paned)

        get_reddit_api().request_failed.connect(self.__request_failed_cb)
예제 #14
0
    def __row_selected_cb(self, listbox, row):
        if row is None:
            return

        row.get_style_context().add_class('read')
        if 'context' in row.data:
            # We need to download first
            # TODO: Progress indicator for user
            get_reddit_api().get_list(row.data['context'],
                                      self.__got_context_list_cb)
        else:
            self._handle_activate(row.data)
예제 #15
0
    def __init__(self, start_sub=None):
        Gtk.Window.__init__(self,
                            title='Something For Reddit',
                            icon_name='reddit-is-a-dead-bird')
        self.add_events(Gdk.EventMask.KEY_PRESS_MASK)
        self.set_default_size(600, 600)
        self.set_wmclass("reddit-is-gtk", "Something For Reddit")

        settings = Gtk.Settings.get_default()
        screen = Gdk.Screen.get_default()
        css_provider = Gtk.CssProvider.get_default()
        if settings.props.gtk_application_prefer_dark_theme:
            css_provider.load_from_resource(
                '/today/sam/reddit-is-gtk/style.dark.css')
        else:
            css_provider.load_from_resource(
                '/today/sam/reddit-is-gtk/style.css')
        context = Gtk.StyleContext()
        context.add_provider_for_screen(screen, css_provider,
                                        Gtk.STYLE_PROVIDER_PRIORITY_USER)

        self._paned = Gtk.Paned.new(Gtk.Orientation.HORIZONTAL)
        self.add(self._paned)
        self._paned.show()

        self._webview = FullscreenableWebview()
        self._webview_bin = ProgressContainer(self._webview)
        self._comments = None
        self._stack = Gtk.Stack()
        self._stack.connect('notify::visible-child', self.__stack_child_cb)
        self._paned.add2(self._stack)
        #self._paned.child_set_property(self._stack, 'shrink', True)
        self._stack.show()

        if start_sub is None:
            start_sub = get_settings()['default-sub']
        self._sublist = SubList()
        self._sublist.new_other_pane.connect(self.__new_other_pane_cb)
        self._paned.add1(self._sublist)
        #self._paned.child_set_property(self._sublist, 'shrink', True)
        self._sublist.show()
        self._sublist.goto(start_sub)

        self._make_header(start_sub)
        left = Gtk.SizeGroup(mode=Gtk.SizeGroupMode.HORIZONTAL)
        left.add_widget(self._left_header)
        left.add_widget(self._sublist)
        self._paned.connect('notify::position', self.__notify_position_cb,
                            self._header_paned)
        self._header_paned.connect('notify::position',
                                   self.__notify_position_cb, self._paned)

        get_reddit_api().request_failed.connect(self.__request_failed_cb)
    def __init__(self, name):
        Gtk.ListBoxRow.__init__(self, selectable=False)

        self._name = name

        self._builder = Gtk.Builder.new_from_resource(
            '/today/sam/reddit-is-gtk/user-about.ui')
        self._g = self._builder.get_object

        self.add(self._g('box'))
        self._g('name').props.label = self._name

        get_reddit_api().get_user_info(self._name, self.__got_info_cb)
예제 #17
0
    def __init__(self, subreddit_name, **kwargs):
        '''
        Args:
            subreddit_name (str):  name like 'linux' or 'gnu',
                NOT with the /r/
        '''
        VScrollingPopover.__init__(self, **kwargs)
        spinner = Gtk.Spinner()
        self.set_scrolled_child(spinner)
        spinner.show()

        self._subreddit_name = subreddit_name
        get_reddit_api().get_subreddit_info(subreddit_name, self.__got_info_cb)
예제 #18
0
 def goto(self, sub):
     '''
     Sub could be '/r/gnu+linux' or '/r/rct/hot?t=month
     or even '/message/inbox'
     '''
     if self._msg is not None:
         get_reddit_api().cancel(self._msg)
     self._sub = sub
     self.remove(self.get_child())
     self.add(self._spinner)
     self._spinner.show()
     self._spinner.start()
     self._msg = get_reddit_api().get_list(sub, self.__got_list_cb)
예제 #19
0
    def __init__(self, name):
        Gtk.ListBoxRow.__init__(self, selectable=False)

        self._name = name

        self._builder = Gtk.Builder.new_from_resource(
            '/today/sam/reddit-is-gtk/user-about.ui')
        self._g = self._builder.get_object

        self.add(self._g('box'))
        self._g('name').props.label = self._name

        get_reddit_api().get_user_info(
            self._name, self.__got_info_cb)
예제 #20
0
    def _call_access_token(self, data, id, callback=None):
        msg = Soup.Message.new('POST',
                               'https://www.reddit.com/api/v1/access_token')
        msg.props.priority = Soup.MessagePriority.VERY_HIGH
        body = urllib.parse.urlencode(data)
        msg.set_request('application/x-www-form-urlencoded',
                        Soup.MemoryUse.COPY, bytes(body, 'utf8'))
        msg.props.request_headers.append('Authorization',
                                         'Basic V0NOM2pxb0oxLTByMFE6Cg==')

        # api imports us, so we must wait to import them
        from redditisgtk.api import get_reddit_api
        get_reddit_api().session.queue_message(msg, self.__message_done_cb,
                                               (id, callback))
예제 #21
0
    def _call_access_token(self, data, id, callback=None):
        msg = Soup.Message.new(
            'POST', 'https://www.reddit.com/api/v1/access_token')
        msg.props.priority = Soup.MessagePriority.VERY_HIGH
        body = urllib.parse.urlencode(data)
        msg.set_request(
            'application/x-www-form-urlencoded',
            Soup.MemoryUse.COPY, bytes(body, 'utf8'))
        msg.props.request_headers.append(
            'Authorization', 'Basic V0NOM2pxb0oxLTByMFE6Cg==')

        # api imports us, so we must wait to import them
        from redditisgtk.api import get_reddit_api
        get_reddit_api().session.queue_message(
            msg, self.__message_done_cb, (id, callback))
예제 #22
0
    def __request_failed_cb(self, api, msg, info):
        dialog = Gtk.Dialog(use_header_bar=True)
        label = Gtk.Label(label=info)
        dialog.get_content_area().add(label)
        label.show()

        dialog.add_button('Retry', Gtk.ResponseType.ACCEPT)
        dialog.add_button(':shrug-shoulders:', Gtk.ResponseType.REJECT)
        dialog.set_default_response(Gtk.ResponseType.ACCEPT)

        dialog.props.transient_for = self
        response = dialog.run()
        if response == Gtk.ResponseType.ACCEPT:
            get_reddit_api().resend_message(msg)
        dialog.destroy()
예제 #23
0
    def __request_failed_cb(self, api, msg, info):
        dialog = Gtk.Dialog(use_header_bar=True)
        label = Gtk.Label(label=info)
        dialog.get_content_area().add(label)
        label.show()

        dialog.add_button('Retry', Gtk.ResponseType.ACCEPT)
        dialog.add_button(':shrug-shoulders:', Gtk.ResponseType.REJECT)
        dialog.set_default_response(Gtk.ResponseType.ACCEPT)

        dialog.props.transient_for = self
        response = dialog.run()
        if response == Gtk.ResponseType.ACCEPT:
            get_reddit_api().resend_message(msg)
        dialog.destroy()
    def goto(self, sub):
        '''
        Sub could be '/r/gnu+linux' or '/r/rct/hot?t=month
        or even '/message/inbox'
        '''
        if self._msg is not None:
            get_reddit_api().cancel(self._msg)
        self._sub = sub
        width = self.get_allocated_width()
        self.remove(self.get_child())

        self.add(self._spinner)
        self._spinner.show()
        self._spinner.start()
        self.set_size_request(width, -1)

        self._msg = get_reddit_api().get_list(sub, self.__got_list_cb)
예제 #25
0
    def __submit_clicked_cb(self, button):
        submit = self._b.get_object('submit-button')
        submit.props.label = 'Submitting...'
        submit.props.sensitive = False

        data = {'title': self._b.get_object('title-entry').props.text,
                'sr': self._b.get_object('sub-entry').props.text}
        stack = self._b.get_object('link-self-stack')
        if stack.props.visible_child_name == 'link':
            data['kind'] = 'link'
            data['url'] = self._b.get_object('link-entry').props.text
        else:
            data['kind'] = 'link'
            buf = self._b.get_object('self-textview').props.buffer
            data['text'] = buf.get_text(buf.get_start_iter(),
                                        buf.get_end_iter(), False)
        get_reddit_api().submit(data, self.__submit_done_cb)
예제 #26
0
 def __submit_clicked_cb(self, button):
     submit = self._b.get_object('submit-button')
     submit.props.label = 'Submitting...'
     submit.props.sensitive = False
     
     data = {'title': self._b.get_object('title-entry').props.text,
             'sr': self._b.get_object('sub-entry').props.text}
     stack = self._b.get_object('link-self-stack')
     if stack.props.visible_child_name == 'link':
         data['kind'] = 'link'
         data['url'] = self._b.get_object('link-entry').props.text
     else:
         data['kind'] = 'link'
         buf = self._b.get_object('self-textview').props.buffer
         data['text'] = buf.get_text(buf.get_start_iter(),
                                     buf.get_end_iter(), False)
     get_reddit_api().submit(data, self.__submit_done_cb)
예제 #27
0
    def __init__(self, button: Gtk.Widget, subreddit_name: str):
        self._button = button
        self._subreddit_name = subreddit_name

        self._button.props.active = \
            '/r/{}/'.format(subreddit_name.lower()) \
            in get_reddit_api().lower_user_subs
        self._button.connect('toggled', self.__toggled_cb)
        self._set_label()
예제 #28
0
    def vote(self, direction):
        get_reddit_api().vote(self._data['name'], direction)

        new_score = self._data['score'] + direction
        if self._data['likes'] is True:
            new_score -= 1  # Undo the previous like
        elif self._data['likes'] is False:
            new_score += 1
        if direction == 0:
            likes = None
        elif direction == +1:
            likes = True
        elif direction == -1:
            likes = False

        self._data['likes'] = likes
        self._data['score'] = new_score
        self._update_score_button()
예제 #29
0
    def _rebuild(self):
        self._box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.set_scrolled_child(self._box)
        self._box.show()

        self._add_subs(self._do_filter(PREPEND_SUBS))

        # Only show suggestions if it is /r/aaa, not /r/aaa/sort
        if self._filter and len(self._filter.split('/')) == 3:
            subs = list(self._do_filter(get_reddit_api().user_subs))
            if subs:
                self._add_header('Searching Subscribed')
                self._add_subs(subs)

        sub = self._filter or self._parent.get_real_sub() or ''
        if sub.startswith('/r/'):
            by_slash = sub.split('/')
            name = by_slash[2]  # get the /r/[thing]/whatever part
            if len(by_slash) == 4:  # /r/subreddit/top?=whatever
                sort = by_slash[3]
                if '?' in sort and len(sort.split('?')) == 2:
                    type, time = sort.split('?')
                    self._add_header('Sorting Times')
                    self._add_subs(('/r/{}/{}?t={}'.format(name, type, x)
                                    for x in SORTING_TIMES))

            self._add_header('Sorting')
            self._add_subs(('/r/{}/{}'.format(name, x) for x in SORTINGS))

        if not self._filter:
            self._add_header('Subscribed')
            self._add_subs(get_reddit_api().user_subs)

        user_name = None
        if self._filter is not None:
            if self._filter.startswith('/user'):
                user_name = self._filter.split('/')[2]
        else:
            user_name = get_reddit_api().user_name

        if user_name is not None:
            self._add_header('Profile')
            self._add_subs((x.replace('USER', user_name)
                           for x in SPECIAL_SUBS))
예제 #30
0
    def __vote_toggled_cb(self, toggle, direction):
        if toggle.props.active:
            get_reddit_api().vote(self.data['name'], direction)

            new_score = self.data['score'] + direction
            if self.data['likes'] == True:
                new_score -= 1  # Undo the previous like
            elif self.data['likes'] == False:
                new_score += 1
            if direction == 0:
                likes = None
            elif direction == +1:
                likes = True
            elif direction == -1:
                likes = False

            self.data['likes'] = likes
            self.data['score'] = new_score
            self._update_score_button()
예제 #31
0
    def _rebuild(self):
        self._box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.set_scrolled_child(self._box)
        self._box.show()

        self._add_subs(self._do_filter(PREPEND_SUBS))

        # Only show suggestions if it is /r/aaa, not /r/aaa/sort
        if self._filter and len(self._filter.split('/')) == 3:
            subs = list(self._do_filter(get_reddit_api().user_subs))
            if subs:
                self._add_header('Searching Subscribed')
                self._add_subs(subs)

        sub = self._filter or self._parent.get_real_sub() or ''
        if sub.startswith('/r/'):
            by_slash = sub.split('/')
            name = by_slash[2]  # get the /r/[thing]/whatever part

            self._add_header('Sorting')
            for x in ['hot', 'new', 'random']:
                self._add_subs(('/r/{}/{}'.format(name, x), ))
            for x in ['top', 'controversial']:
                self._add_expander_sub('/r/{}/{}'.format(name, x))

        if not self._filter:
            self._add_header('Subscribed')
            self._add_subs(get_reddit_api().user_subs)

        user_name = None
        if self._filter is not None:
            if self._filter.startswith('/user'):
                user_name = self._filter.split('/')[2]
        else:
            user_name = get_reddit_api().user_name

        if user_name is not None:
            self._add_header('Profile')
            self._add_subs(
                (x.replace('USER', user_name) for x in SPECIAL_SUBS))
예제 #32
0
    def _rebuild(self):
        self._box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.set_scrolled_child(self._box)
        self._box.show()

        self._add_subs(self._do_filter(PREPEND_SUBS))

        # Only show suggestions if it is /r/aaa, not /r/aaa/sort
        if self._filter and len(self._filter.split('/')) == 3:
            subs = list(self._do_filter(get_reddit_api().user_subs))
            if subs:
                self._add_header('Searching Subscribed')
                self._add_subs(subs)

        sub = self._filter or self._parent.get_real_sub() or ''
        if sub.startswith('/r/'):
            by_slash = sub.split('/')
            name = by_slash[2]  # get the /r/[thing]/whatever part

            self._add_header('Sorting')
            for x in ['hot', 'new', 'random']:
                self._add_subs(('/r/{}/{}'.format(name, x),))
            for x in ['top', 'controversial']:
                self._add_expander_sub('/r/{}/{}'.format(name, x))

        if not self._filter:
            self._add_header('Subscribed')
            self._add_subs(get_reddit_api().user_subs)

        user_name = None
        if self._filter is not None:
            if self._filter.startswith('/user'):
                user_name = self._filter.split('/')[2]
        else:
            user_name = get_reddit_api().user_name

        if user_name is not None:
            self._add_header('Profile')
            self._add_subs((x.replace('USER', user_name)
                            for x in SPECIAL_SUBS))
예제 #33
0
    def _rebuild(self):
        self._box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.set_scrolled_child(self._box)
        self._box.show()

        self._add_subs(PREPEND_SUBS)

        sub = self._parent.get_real_sub()
        if sub.startswith('/r/'):
            name = sub.split('/')[2]  # get the /r/[thing]/whatever part
            self._add_header('Sorting')
            self._add_subs(('/r/{}/{}'.format(name, x) for x in SORTINGS))

        self._add_header('Subscribed')
        self._add_subs(get_reddit_api().user_subs)

        
        user_name = get_reddit_api().user_name
        if user_name is not None:
            self._add_header('Profile')
            self._add_subs((x.replace('USER', user_name)
                           for x in SPECIAL_SUBS))
예제 #34
0
    def __row_selected_cb(self, listbox, row):
        if row is None:
            return
        row.grab_focus()  # For keyboard shortcuts to work

        if hasattr(row, 'read'):
            row.read()
        if isinstance(row, SingleCommentRow):
            if 'context' not in row.data:
                # Bloody reddit api, /inbox responses include the context
                # link, but for /u/X/overview we need to make a url
                # AND WORST OF ALL, WE CAN'T MAKE THE PROPER URL BECAUSE WE
                # DON'T HAVE THE DATA :(
                row.data['context'] = '/r/{subreddit}/comments/{link}/'.format(
                    subreddit=row.data['subreddit'],
                    link=row.data['link_id'][len('t4_'):])
            # We need to download first
            # TODO: Progress indicator for user
            get_reddit_api().get_list(row.data['context'],
                                      self.__got_context_list_cb)
        else:
            self._handle_activate(row.data)
예제 #35
0
    def __got_info_cb(self, j):
        if j.get('error') is not None:
            error_text = str(j['error'])
            if j['error'] == 404:
                error_text = 'No information found (404)'

            label = SaneLabel(error_text)
            label.get_style_context().add_class('error-label')
            self.set_scrolled_child(label)
            label.show()
            return

        data = j['data']
        self._data = data

        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.set_scrolled_child(box)
        box.show()

        self._image = Gtk.Image()
        if data.get('header_img') is not None:
            get_reddit_api().download_thumb(data['header_img'],
                                            self.__header_downloaded_cb)
        box.add(self._image)

        self._subscribe = Gtk.ToggleButton(active=data['user_is_subscriber'])
        self._set_subscribe_label(data['subscribers'])
        self._subscribe.connect('toggled', self.__subscribe_toggled_cb)
        box.add(self._subscribe)
        self._subscribe.show()

        body_pango = markdown_to_pango(data['description'])
        label = SaneLabel(body_pango)
        box.add(label)
        label.show()
        # WTF:  Allow hscrolling so that the label actually word wraps
        self.get_child().props.hscrollbar_policy = Gtk.PolicyType.AUTOMATIC
        self.get_child().props.width_request = 400
예제 #36
0
    def __message_done_cb(self, session, msg, user_data):
        id, callback = user_data

        data = msg.props.response_body.data
        if id not in self._tokens:
            self._tokens[id] = {}
        # We must keep some things we only get the 1st time, eg.
        # the refresh token
        self._tokens[id].update(json.loads(data))
        self._tokens[id]['time'] = time.time()

        self.save()
        self.token_changed.emit(self._tokens[id])
        self.sign_in_status.emit('', True)

        if callback is not None:
            callback()

        if 'username' not in self._tokens[id]:
            # api imports us, so we must wait to import them
            from redditisgtk.api import get_reddit_api
            get_reddit_api().send_request(
                'GET', '/api/v1/me', self.__whoami_cb, user_data=id)
예제 #37
0
 def do_unrealize(self):
     if self._msg is not None:
         get_reddit_api().cancel(self._msg)
예제 #38
0
 def __subscribe_cb(self, j):
     if j.get('error') is None:
         self._subscribe.props.sensitive = True
         self._set_subscribe_label(self._data['subscribers'])
         get_reddit_api().update_subscriptions()
예제 #39
0
 def __load_more_cb(self, caller, after):
     self._msg = get_reddit_api().get_list(
         '{}?after={}'.format(self._sub, after),
         self.insert_data
     )
 def _fetch_thumbnail(self, url):
     if not url or url in ['default', 'self', 'nsfw']:
         return
     self._msg = get_reddit_api().download_thumb(url,
                                                 self.__message_done_cb)
 def __load_more_cb(self, caller, after):
     self._msg = get_reddit_api().get_list(
         '{}?after={}'.format(self._sub, after), self.insert_data)
예제 #42
0
 def __load_more_cb(self, button):
     button.props.sensitive = False
     get_reddit_api().load_more(self._toplevel_cv.get_link_name(),
                                self.data, self.__loaded_more_cb)
예제 #43
0
 def refresh(self, caller=None):
     self._spinner.start()
     self._msg = get_reddit_api().send_request('GET', self._permalink,
                                               self.__message_done_cb)
예제 #44
0
 def __done_clicked_cb(self, button):
     self._done.props.label = 'Sending...'
     self._done.props.sensitive = False
     b = self._textview.props.buffer
     text = b.get_text(b.get_start_iter(), b.get_end_iter(), False)
     get_reddit_api().reply(self.data['name'], text, self.__reply_done_cb)
예제 #45
0
 def favorite_toggled_cb(self, button):
     get_reddit_api().set_saved(self.data['name'], button.props.active,
                                None)
예제 #46
0
    def _fetch_thumbnail(self, url):
        if not url or url in ['default', 'self', 'nsfw']:
            return

        self._msg = get_reddit_api().download_thumb(url,
                                                    self.__message_done_cb)
예제 #47
0
 def do_unrealize(self):
     if self._msg is not None:
         get_reddit_api().cancel(self._msg)
 def __notify_expanded_cb(self, expander, pspec):
     if not self._loaded:
         get_reddit_api().get_subreddit_info(self._subreddit_name,
                                             self.__got_info_cb)
         self._loaded = True
 def read(self):
     if 'new' in self.data and self.data['new']:
         get_reddit_api().read_message(self.data['name'])
         self.data['new'] = False
     self.get_style_context().add_class('read')
     self._g('unread').props.visible = False
예제 #50
0
 def __subscribe_cb(self, j):
     self._button.props.sensitive = True
     self._set_label()
     get_reddit_api().update_subscriptions()