Tuesday, May 20, 2014

valkyrie

Original post:
New BOINC Manager Design

Project:
BOINC Sentinels

Some time back, I started BOINC Sentinels as a platform to experiment with some ideas I had for new user interfaces and improvements to underlying technology for user interfaces.

I made a working prototype of the idea I posted in the original “New BOINC Manager Design” blog post.

It does not have all the functionality of BOINC Manager.  I am using Valkyrie and Hunter (BOINC Manager clone) to test out the underlying framework.

In all the cases I know about the new framework is faster and more efficient than the framework we are currently using.

Precompiled versions of the apps:
Valkyrie.zip
Hunter.zip

Just a waning, all of this is incomplete software.  I am mostly playing around with ideas and running performance tests.

----- Rom

Monday, February 23, 2009

Well I believe I have found and fixed the screen saver issue that has been plaguing the BOINC community since shortly after the 6.2 launch.

This bug wasn't easy to track down, and was something of a perfect storm as far as the code was concerned.

The prerequisites for this bug were:

  1. Single monitor
  2. Graphics application window gets created behind the screen saver curtain window
  3. Graphics application gets stuck in an infinite loop or deadlocks on startup

 

We had some backup code in the screen saver to check for keyboard and mouse activity separately from the project application but after the graphics application deadlocks that code was no longer being executed.

The reason that code was no longer being executed stems from the fact that the BroadcastSystemMessage() Windows API waits for a success/failure return value from the application to which it was sending, since the graphics application itself was deadlocked it caused the screen saver to lock up.

I didn't realize that the BroadcastSystemMessage() API would not timeout on a hung application. So I learned something new this weekend.

 

If all goes according to plan I'll be releasing a new 6.4 client as well as a 6.6 client with the screen saver fixes today.

 

----- Rom

Wednesday, August 27, 2008
BOINC Manager

 

I've been giving some thought recently to overhauling the BOINC Manager user interface.

The original GUI was a carry over from an MFC based version of BOINC Manager that was created even before I was hired on as an employee.  The original didn't even have the buttons off on the left hand side, the user would have to have guessed that they could right-click on something to bring up a context menu.

So, here we are four years latter and we are talking about adding more tabs to an interface that is already overly complicated.

My goals were as follows:

  • Combine the simple and advanced GUIs.
  • Reduce information overload. (The less information somebody sees right off the bat the less they have to parse)
  • Use icon based buttons instead of words to describe actions. (Reduces required screen space and simplifies localization)
  • Use icons people are going to recognize. (VCR/DVD Player/CD Player/iPod)
  • Provide a way to drill down into the complicated information. (My grandmother wouldn't ever need to worry about resetting short term and long term debts for instance)
  • Include context sensitive help in the interface.

Disclaimers:

  • I haven't thought through the multi-host scenarios yet.
  • The graphics were generated in MS Paint, these would not be used in the actual manager should we ever implement this.
  • This might not go anywhere, David wasn't to keen on the idea.  He wants to get a formal usability study of a few prototypes before investing in a new user interface.
  • This by no means should be thought of as a comprehensive specification, I think of this as a scratch pad.

If there is interest in the community to see something more formal I will go ahead and spec it out and submit it for review.

 

Initial Install

After a clean install, the client area should display a quick blurb that BOINC in and of itself is just a task execution engine and needs to be attached to a project/account manager before it can actually process work. 

At the bottom of the blurb should be an attach to project and attach to account manager link.

 

Working User Interface

Clicking on magglass would bring up a dialog specific to each section. 

In the mock-up on the right hand side the 'News' section would disappear unless there are new news items.  The news section is supposed to be a summary roll-up of various RSS feeds for each of the projects.  It would also contain messages generated in the messages area for things like disk space warnings and the like.  Another possible use for it would be the number of new messages for a thread you are watching in a projects forums.

Active Tasks, when expanded, would list the active tasks on the system in the format:

<Project Name>:<Task Name>:<Percent Complete>:Suspend:Resume:Abort

Active Transfers, when expanded, would list the active transfers on the system in the format:

<Project Name>:<Transfer Name>:<Percent Complete>:Suspend:Resume:Abort

Both <Task Name> and <Transfer Name> would be truncated and an ellipse (...) added in the case where the names are to long for the display area.

Projects, when expanded, would list the projects the client is attached too.

Each project, when expanded, would have a section for the following areas:

  • Tasks
  • Transfers
  • Messages
  • Statistics
  • Resource Usage

The main window should have a vertical scroll bar for when everything is expanded, but it should not have a horizontal scroll bar.

 

----- Rom

 

[Update 28/08/2008 9:37am]Apologies to Michael Tughan, while I can't recall seeing his designs for a Mac specific GUI it doesn't mean I didn't. I don't know how much overlap there is, but I thought I had drawn my inspiration from a combination of Outlook 98, MSN Messenger, and Yahoo Messenger.

Monday, October 30, 2006

So all-in-all I'm really impressed with wxWidgets. Most of the time it is pretty straight forward and easy to figure out, but on Wednesday night through Thursday I was frustrated with the framework. The documentation made it sound easy, and in the end it was easy, but getting their wasn't so easy.

I went through about 15 iterations before finding the right solution. My worst solution took 2 minutes to finish a re-paint, but it finally did paint everything the right way. During the 2 minutes though there was enough flicker it might have sent somebody into convulsions. I even attempted to use Google to see what others had done, most of the references were really old and stale, all of them didn't seem to work anymore with 2.6. So I'm posting my solution for others to find and use.

Header File:

   1:  class CTransparentStaticText : public wxStaticText
2: {
3: DECLARE_DYNAMIC_CLASS (CTransparentStaticText)
4:
5: public:
6: CTransparentStaticText();
7: CTransparentStaticText(
8: wxWindow* parent,
9: wxWindowID id,
10: const wxString& label,
11: const wxPoint& pos = wxDefaultPosition,
12: const wxSize& size = wxDefaultSize,
13: long style = 0,
14: const wxString& name= wxStaticTextNameStr
15: );
16:
17: bool Create(
18: wxWindow* parent,
19: wxWindowID id,
20: const wxString& label,
21: const wxPoint& pos = wxDefaultPosition,
22: const wxSize& size = wxDefaultSize,
23: long style = 0,
24: const wxString& name= wxStaticTextNameStr
25: );
26:
27: virtual bool HasTransparentBackground() { return true; };
28:
29: virtual void OnPaint(wxPaintEvent& event);
30:
31: DECLARE_EVENT_TABLE()
32: };
 

Source File:

   1:  IMPLEMENT_DYNAMIC_CLASS (CTransparentStaticText, wxStaticText)
2:
3: BEGIN_EVENT_TABLE(CTransparentStaticText, wxStaticText)
4: EVT_PAINT(CTransparentStaticText::OnPaint)
5: END_EVENT_TABLE()
6:
7:
8: CTransparentStaticText::CTransparentStaticText() {}
9:
10: CTransparentStaticText::CTransparentStaticText(wxWindow* parent, wxWindowID id, const wxString& label,
const wxPoint& pos, const wxSize& size, long style, const wxString& name ) {
11: Create(parent, id, label, pos, size, style, name);
12: }
13:
14:
15: bool CTransparentStaticText::Create(wxWindow* parent, wxWindowID id, const wxString& label,
const wxPoint& pos, const wxSize& size, long style, const wxString& name ) {
16: bool bRetVal = wxStaticText::Create(parent, id, label, pos, size, style|wxTRANSPARENT_WINDOW, name);
17:
18: SetBackgroundColour(parent->GetBackgroundColour());
19: SetBackgroundStyle(wxBG_STYLE_COLOUR);
20: SetForegroundColour(parent->GetForegroundColour());
21:
22: return bRetVal;
23: }
24:
25:
26: void CTransparentStaticText::OnPaint(wxPaintEvent& /*event*/) {
27: wxPaintDC dc(this);
28: dc.SetFont(GetFont());
29: dc.DrawText(GetLabel(), 0, 0);
30: }
 

Thanks it. It took a while to find the fix and simple solution, I'm glad I finally figured it out.

My previous iterations were embarrassing.

----- Rom