Posts about urssus (old posts, page 3)

2008-08-12 21:46

urssus at 27 days old

After 27 days of development, uRSSus is finally a really usable app. I miss nothing from Akregator, although there are a few unimplemented things. It was broken the alst couple of days, because I was rewriting large chunks of its guts, but the new guts work much better ;-)

The missing pieces (I know about):

  • Favicons
  • Save column width in post list
  • Show total posts in feed list
  • Drag&Drop is not reliable (weird things happen every few tries)
  • Metafeeds (ex. your unread posts/ your starred posts) are not updated automatically
  • Del.icio.us sync is not working at all
  • No help
  • No decent config dialog (but a functional replacement!)
  • Very occasional DB locking.
  • Logging is broken
  • Need to implement backup of the DB

That's not really more than a day or two of work.

Right now (revision 570) it's working pretty good, so it's a good revision to try, if you feel up to it.

2008-08-11 11:06

Urssus goes meta!

I have been delaying this functionality because I expected it to be hard to do, then... it was very easy! Now you can create "metafeeds" based on queries. Here's the first example: "Post.important==True".

urssus20

Of course, beyond a set of standard metafeeds, a UI to allow the user to create them will be hard but at least the basic functionality is there (BTW, it's 15 (fifteen!) lines of code)

2008-08-08 22:55

uRSSus: first post 0.2.10 features (has screenie)

It's running prety stable (at least for me) so I decided to fix some issues and add some features. First a screenshot:

urssus19

And now text:

  • A new feature that also fixes an issue:

    vgarvardt asked about sorting by feed,for example when reading a folder. Implemented it using a "feed" column that you can enable/disable. Since your choice is persistent, there's no need to add a configuration option to the dialog.

  • Important is now Starred. I relly like google's idea of using stars at hand to mark things important. So, there they are. The star icon I did myself, in Inkscape, trying to respect the Reinhardt style. I think it looks nice.

  • Google News feeds! Yes, I know I could just go to http://news.google.com, make a search and subscribe to the results page. Can my mom? Nope. So, when adding new feed, just choose "Create google news feed" enter some keywords, and it's ready.

    I need to add "custom fields" to the feed config dialog, though, since once it's creted it's just a regular feed with a long URL.

  • Also did some performance and reliability work, and current SVN (r476) is actually quite a bit nicer than 0.2.10 already. So there may be another release soonish.

2008-08-08 14:41

uRSSus 0.2.10 is out!

Yes friends, my desktop feed agregator uRSSus has a brand new release.

You can get it at http://urssus.googlecode.com or http://pypi.python.org or via easy_install.

There is a rather large bug in that the configuration dialog may or may not work for you. Don't worry, there is no life-or-death option there, just ignore it.

As always, I am looking for a hand making it work well on Windows and Mac.

Let me know if you like it (or if you don't).

2008-08-06 17:12

uRSSus: now with configuration dialog goodness!

I felt that a "user-friendly" configuration dialog for uRSSus was not a good way to spend effort, because I expect options to change often for a while, and I didn't want an outdated dialog, either. The solution? Autogenerate a mediocre configuration dialog!

First, define what options uRSSus supports (Update: suggestion by Alejandro Cura, using tuples works much better!):

options = (
  ('ui',
    (
      ('alwaysShowFeed',  ('bool', False, "Always show a link to the post's feed when diplaying a post")),
      ('hideOnTrayClick', ('bool', True, "Hide the main window when clicking on the tray icon")),
    )
  ),
  ('options',
    (
      ('defaultRefresh'      ,  ('int', 1800, "How often feeds should be refreshed by default (in seconds).", 300, None )),
      ('maxPostsDisplayed'   ,  ('int', 1000, "Limit the display to this many posts. If set too high, opening 'All Feeds' may take forever", 0, None)),
      ('defaultExpiration'   ,  ('int',    7, "How long should articles be kept by default. (In days)", 0, 9999)),
    )
  ),
  ('twitter',
    (
      ('username',  ('string', None, 'Your Twitter user name.' )),
      ('password',  ('password', None, 'Your Twitter password.' )),
    )
  )
)

Then a little magic, and this comes out:

urssus13

How magic? This magic:

class ConfigDialog(QtGui.QDialog):
  def __init__(self, parent):
    QtGui.QDialog.__init__(self, parent)
    # Set up the UI from designer
    self.ui=UI_ConfigDialog()
    self.ui.setupUi(self)
    pages=[]
    sections=[]
    self.values={}

    for sectionName, options in config.options:
      # Create a page widget/layout for this section:
      page=QtGui.QScrollArea()
      layout=QtGui.QGridLayout()
      row=-2
      for optionName, definition in options:
        row+=2
        if definition[0]=='bool':
          cb=QtGui.QCheckBox(optionName)
          cb.setChecked(config.getValue(sectionName, optionName, definition[1]))
          layout.addWidget(cb, row, 0, 1, 2)
          self.values[sectionName+'/'+optionName]=[cb, lambda(cb): cb.isChecked()]


        elif definition[0]=='int':
          label=QtGui.QLabel(optionName+":")
          label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter)
          spin=QtGui.QSpinBox()
          if definition[3] is not None:
            spin.setMinimum(definition[3])
          else:
            spin.setMinimum(-99999)
          if definition[4] is not None:
            spin.setMaximum(definition[4])
          else:
            spin.setMaximum(99999)
          spin.setValue(config.getValue(sectionName, optionName, definition[1]))
          layout.addWidget(label, row, 0, 1, 1)
          layout.addWidget(spin, row, 1, 1, 1)
          self.values[sectionName+'/'+optionName]=[spin, lambda(spin): spin.value()]

        elif definition[0]=='string':
          label=QtGui.QLabel(optionName+":")
          label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter)
          text=QtGui.QLineEdit()
          text.setText(config.getValue(sectionName, optionName, definition[1]))
          layout.addWidget(label, row, 0, 1, 1)
          layout.addWidget(text, row, 1, 1, 1)
          self.values[sectionName+'/'+optionName]=[text, lambda(text): unicode(text.text())]

        elif definition[0]=='password':
          label=QtGui.QLabel(optionName+":")
          label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter)
          text=QtGui.QLineEdit()
          text.setEchoMode(QtGui.QLineEdit.Password)
          text.setText(config.getValue(sectionName, optionName, definition[1]))
          layout.addWidget(label, row, 0, 1, 1)
          layout.addWidget(text, row, 1, 1, 1)
          self.values[sectionName+'/'+optionName]=[text, lambda(text): unicode(text.text())]

        help=QtGui.QLabel(definition[2])
        help.setWordWrap(True)
        layout.addWidget(help, row, 2, 1, 1)
        separator=QtGui.QFrame()
        separator.setFrameStyle(QtGui.QFrame.HLine|QtGui.QFrame.Plain)
        layout.addWidget(separator, row+1, 0, 1, 3)
      page.setLayout(layout)
      pages.append(page)
      sections.append(sectionName)

    for page, name in zip(pages,sections) :
      # Make a tab out of it
      self.ui.tabs.addTab(page, name)
    self.ui.tabs.setCurrentIndex(1)
    self.ui.tabs.removeTab(0)

My first ever thing that I just don't see how it would work without a lambda ;-)

2008-08-04 15:43

Urssus: Sorry about 0.2.9

Truly a paperbag release. But there's still hope!

While 0.2.9 had a number of bugs and awful performance, I have to say that the current svn revisions are much, much, better.

  • Snappy performance (ok, not quite snappy, but snappier than 0.2.0)
  • Finally a coherent nex/previous/whatever mechanism. The only broken piece is that posts may vanish from view when the feed is updated (and I can fix that, too).
  • Fixed issues 16,14 and 22

So, 0.2.10, coming tonight, should be a pretty good one.

2008-08-03 19:35

Urssus: 0.2.9 is out

Version 0.2.9 of uRSSus, my news agregator is out. Many new features including:

  • Different layouts (regular/widescreen/combined, aka river-of-news)
  • Twitter about things you see on uRSSus with a single click
  • Many many bugfixes
  • Lots of UI improvements

And so on.

2008-08-03 01:39

Urssus: import from google reader

It was rather easy because I didn't do the hard part (thanks authors of pyrfeed!)and now uRSSus has a simple "import my subscriptions from Google Reader" action.

All I can say is "it works for me" and "Google sure strips data from the feeds!".

It will import your tags as top-level folders (merged with whatever you already had).

Should be smart enough not to duplicate feeds or folders.

If a feed is in more than one folder, it will show in the first listed by google (no idea what the order is).

2008-08-02 23:02

Urssus: August 2nd - going small

Mostly, I spent my two hours today refactoring. But also, testing how uRSSus looks on a small screen. Take a look:

urssus16

This is urssus in the configuration I liked best on my 7", 800x480 eeePC's screen.

As you can see, a more compact template for the combined view is a must, and I will implement a compact template. Or maybe just make a configuration option where you choose what template the combined view uses, to avoid the multiplication of "modes" that are the exact same thing under the hood.

Using combined view with all bars hidden and fullscreen makes for a rather large reading area, which is nice.

The performance in that limited computer was good... until the memory usage balloons. While uRSSus is not too CPU hungry, it's pretty memory intensive. There are obvious ways to improve that, of course, and I am exploring them.

BTW, I have not measured this in a while: 1957 lines of code. And still quite fun!

2008-08-01 18:29

Urssus: no release today

I had planned to release a new version today, but there are too many untested features. A list:

  • Feed reordering via drag and drop
  • Unique app. The second uRSSus just makesthe first one operate.
  • Lots of refactoring to cleanup View/Model related things.

Since it's a lot of code, it will need a day or two of testing. Or a week.

Contents © 2000-2019 Roberto Alsina