void onSelect() override { if (m_image) return; ListBox* listbox = static_cast<ListBox*>(getParent()); if (!listbox) return; app::skin::SkinTheme* theme = app::skin::SkinTheme::instance(); gfx::Color color = theme->colors.text(); try { m_image.reset( render_text( m_filename, 16, "ABCDEabcde", // TODO custom text doc::rgba(gfx::getr(color), gfx::getg(color), gfx::getb(color), gfx::geta(color)), true)); // antialias View* view = View::getView(listbox); view->updateView(); listbox->makeChildVisible(this); // Save the thumbnail for future FontPopups g_thumbnails[m_filename] = m_image; } catch (const std::exception&) { // Ignore errors } }
void TextBox::onSetText() { View* view = View::getView(this); if (view) view->updateView(); Widget::onSetText(); }
void PaletteView::setColumns(int columns) { int old_columns = m_columns; ASSERT(columns >= 1 && columns <= Palette::MaxColors); m_columns = columns; if (m_columns != old_columns) { View* view = View::getView(this); if (view) view->updateView(); invalidate(); } }
void NewsListBox::reload() { if (m_loader || m_timer.isRunning()) return; while (lastChild()) removeChild(lastChild()); View* view = View::getView(this); if (view) view->updateView(); m_loader = new HttpLoader(WEBSITE_NEWS_RSS); m_timer.start(); }
bool TextBox::onProcessMessage(Message* msg) { switch (msg->type) { case JM_DRAW: getTheme()->draw_textbox(this, &msg->draw.rect); return true; case JM_SIGNAL: if (msg->signal.num == JI_SIGNAL_SET_TEXT) { View* view = View::getView(this); if (view) view->updateView(); } break; case JM_KEYPRESSED: if (hasFocus()) { View* view = View::getView(this); if (view) { gfx::Rect vp = view->getViewportBounds(); gfx::Point scroll = view->getViewScroll(); int textheight = jwidget_get_text_height(this); switch (msg->key.scancode) { case KEY_LEFT: scroll.x -= vp.w/2; view->setViewScroll(scroll); break; case KEY_RIGHT: scroll.x += vp.w/2; view->setViewScroll(scroll); break; case KEY_UP: scroll.y -= vp.h/2; view->setViewScroll(scroll); break; case KEY_DOWN: scroll.y += vp.h/2; view->setViewScroll(scroll); break; case KEY_PGUP: scroll.y -= (vp.h-textheight); view->setViewScroll(scroll); break; case KEY_PGDN: scroll.y += (vp.h-textheight); view->setViewScroll(scroll); break; case KEY_HOME: scroll.y = 0; view->setViewScroll(scroll); break; case KEY_END: scroll.y = jrect_h(this->rc) - vp.h; view->setViewScroll(scroll); break; default: return false; } } return true; } break; case JM_BUTTONPRESSED: { View* view = View::getView(this); if (view) { captureMouse(); jmouse_set_cursor(JI_CURSOR_SCROLL); return true; } break; } case JM_MOTION: { View* view = View::getView(this); if (view && hasCapture()) { gfx::Rect vp = view->getViewportBounds(); gfx::Point scroll = view->getViewScroll(); scroll.x += jmouse_x(1) - jmouse_x(0); scroll.y += jmouse_y(1) - jmouse_y(0); view->setViewScroll(scroll); jmouse_control_infinite_scroll(vp); } break; } case JM_BUTTONRELEASED: { View* view = View::getView(this); if (view && hasCapture()) { releaseMouse(); jmouse_set_cursor(JI_CURSOR_NORMAL); return true; } break; } case JM_WHEEL: { View* view = View::getView(this); if (view) { gfx::Point scroll = view->getViewScroll(); scroll.y += (jmouse_z(1) - jmouse_z(0)) * jwidget_get_text_height(this)*3; view->setViewScroll(scroll); } break; } } return Widget::onProcessMessage(msg); }
void NewsListBox::parseFile(const std::string& filename) { View* view = View::getView(this); XmlDocumentRef doc; try { doc = open_xml(filename); } catch (...) { addChild(new ProblemsItem()); if (view) view->updateView(); return; } TiXmlHandle handle(doc.get()); TiXmlElement* itemXml = handle .FirstChild("rss") .FirstChild("channel") .FirstChild("item").ToElement(); int count = 0; while (itemXml) { TiXmlElement* titleXml = itemXml->FirstChildElement("title"); TiXmlElement* descXml = itemXml->FirstChildElement("description"); TiXmlElement* linkXml = itemXml->FirstChildElement("link"); std::string link = linkXml->GetText(); std::string title = titleXml->GetText(); std::string desc = parse_html(descXml->GetText()); // Limit the description text to 4 lines std::string::size_type i = 0; int j = 0; while (true) { i = desc.find('\n', i); if (i == std::string::npos) break; i++; j++; if (j == 5) desc = desc.substr(0, i); } addChild(new NewsItem(link, title, desc)); itemXml = itemXml->NextSiblingElement(); if (++count == 4) break; } TiXmlElement* linkXml = handle .FirstChild("rss") .FirstChild("channel") .FirstChild("link").ToElement(); if (linkXml) addChild(new NewsItem(linkXml->GetText(), "More...", "")); if (view) view->updateView(); // Save as cached news Preferences::instance().news.cacheFile(filename); }