BREW RSS Reader - 6 / 9 -
Draw Screen
This is the main screen for displaying the title and description of RSS items. |
Define MainWindow
SFMTYPEDEFCLASS(MainWindow) class MainWindow : public SFRTitleWindow { SFMSEALCOPY(MainWindow) private: SInt16 _displine; // Head of lines to display SInt16 _cursor; // Cursor position SInt16 _maxline; // Number of lines to display public: MainWindow(SInt16 softkeyHeight); static Void SetSoftkey(Void); private: HANDLER_DECLARE_VOIDRENDER(OnRenderContent) // Draw Handler HANDLER_DECLARE_BOOLEVENT(OnKey) // Key Handler };
Draw Handler for MainWindow
HANDLER_IMPLEMENT_VOIDRENDER(MainWindow, OnRenderContent, graphics) { // Get size of screen SFXRectangle rectangle(GetContentWorld()); SFXRGBColor forecolor; SFXRGBColor backcolor; SIntN i; RSSFeedPtr current; // Get font height SInt16 height = graphics->GetFontHeight(); // Get the bottom line of current rectangle SInt16 bottom = rectangle.GetBottom(); // Set rectangle height to that of font rectangle.SetHeight(height); // Call parent handler ( clear screen ) SFRTitleWindow::ContentHandler(graphics); // Get current feed from application class current = RssReader::GetCurrentFeed(); rectangle.AddY((6 * height + 15)); // Set the height of rectangle as a function of font height rectangle.SetHeight(((bottom -rectangle.GetTop())/height)* height); graphics->FillRectangle(rectangle, SFXRGBColor(255, 255, 255, 0)); // Set the character color graphics->SetForeColor(SFXRGBColor(0, 0, 0, 0)); if (current != null && current->GetSize() > _displine + _cursor) { _currentRect = rectangle; if(_currentRect.GetY() >= rectangle.GetY()) { _currentRect.SubY(_moveY); } _currentRect.AddHeight(500); // Draw the description of item that _cursor points to graphics->DrawString( current->GetItem(_displine + _cursor)->description, _currentRect, IDF_ALIGN_LEFT | IDF_ALIGN_MIDDLE); } rectangle.SubY((6 * height + 15)); // Set rectangle height to that of font rectangle.SetHeight(height); // Draw each line for (i = _displine; i < _displine + _maxline ; ++i) { // If it forms a line with the cursor if (i - _displine == _cursor) { // Change color forecolor.Set(0xff, 0xff, 0xff, 0x00); backcolor.Set(0x66, 0x66, 0xff, 0x00); } else { forecolor.Set(0x00, 0x00, 0x00, 0x00); // The color is changed at odd or even lines if (i % 2 == 0) { // change color every other line backcolor.Set(0xdd, 0xdd, 0xff, 0); } else { backcolor.Set(0xee, 0xee, 0xff, 0); } } // Draw background rectangle of item title graphics->FillRectangle(rectangle, backcolor); graphics->SetForeColor(forecolor); if (current != null && i < current->GetSize()) { if (current->GetItem(i)->title.IsEmpty()) { // draw title string of i th item graphics->DrawText("[No Subject]", rectangle, IDF_ALIGN_LEFT | IDF_ALIGN_MIDDLE); } else { // If it forms a line with the cursor if (i - _displine == _cursor) { _currentRect = rectangle; _currentRect.SubX(_moveX); _currentRect.AddWidth(150); if (current->GetItem(i)->alreadyRead) { // Draw title string of i th item graphics->DrawText( current->GetItem(i)->title, _currentRect, IDF_ALIGN_LEFT | IDF_ALIGN_MIDDLE); } else { // Set the font to bold-faced SFXRGBColor fontColor(0x99, 0x00, 0x00, 0x00); graphics->SetFont(AEE_FONT_BOLD); // Draw title string of i th item graphics->DrawText( current->GetItem(i)->title, _currentRect, fontColor, IDF_ALIGN_LEFT | IDF_ALIGN_MIDDLE); graphics->SetFont(AEE_FONT_NORMAL); } } } } rectangle.AddY(height); // move down rectangle by its height } rectangle.AddY(15); rectangle.SubY(3); rectangle.Deflate(0,3); graphics->FillRectangle(rectangle, SFXRGBColor(128, 128, 128, 255)); }
Key Handler
HANDLER_IMPLEMENT_BOOLEVENT(MainWindow, OnKey, event) { SFXRectangle rectangle; RSSFeedPtr current; switch (event.GetP16()) { case AVK_DOWN: // If down key pressed if (_cursor == _maxline - 1) { // if cursor is at the bottom ++_displine; // Move display line down } else { ++_cursor; // Move cursor down } InvalidateContent(); // Redraw window _moveY = 0; // Reset description return true; case AVK_UP: // If up key pressed // If cursor is at the top if (_cursor == 0) { // If display line can be moved up if (_displine > 0) { --_displine; // Move display line up InvalidateContent(); // Redraw window } } else { --_cursor; // Move cursor up InvalidateContent(); // Redraw window } return true; // If SOFT2 or 9 key pressed _moveY = 0; // Reset description case AVK_RIGHT: // Scroll Horizontally right _moveX = _moveX + 5; InvalidateContent(); return true; case AVK_LEFT: // Scroll Horizontally left if(_moveX > 0) { _moveX = _moveX - 5; InvalidateContent(); } return true; case AVK_8: // Scroll Vertically down _moveY = _moveY + 5; InvalidateContent(); return true; case AVK_2: // Scroll Vertically up if(_moveY > 0) { _moveY = _moveY - 5; InvalidateContent(); } return true; case AVK_SOFT2: case AVK_9: // Create window for managing feeds rectangle.Set(GetBaseBound()); rectangle.AddLeftTop(SUBSURIPTION_MARGIN, SUBSURIPTION_MARGIN); ::new SubscriptionWindow(rectangle); return true; case AVK_SELECT: // If SELECT key pressed current = RssReader::GetCurrentFeed(); // Change staus of items from unread to already read if (current != null && current->GetSize() > _displine + _cursor) { current->GetItem(_displine + _cursor) -> alreadyRead = true; InvalidateContent(); } return true; } return false; }