//ツイートを読み込んだとき void TweetList::onGetTweet(GetTweetEvent& event){ vector<Tweet*>::iterator begin = tweetList_->begin(); const vector<Tweet*>& loadedTweets = event.getTweetList(); set<long> appearedUserIdSet; long lastTweetId = -1; for(int i= (loadedTweets.size() -1); i >= 0; i--){ Tweet* tweet = loadedTweets.at(i); const User* user = tweet->getUser(); cout << "(" << i << ")[" << *tweet->getText() << "]" << endl; if(appearedUserIdSet.find(user->getId()) == appearedUserIdSet.end()){ appearedUserIdSet.insert(user->getId()); wxString fileName = "images/user_icon/" + StringUtil::toStr(tweet->getUser()->getId()) + ".bmp"; if(!util::FileUtil::exists(fileName)){ //ユーザアイコンが読み込まれていなかったときは、別スレッドで読み込む DownloadUserIconTask* thread = new DownloadUserIconTask(this, user->getId(), user->getProfileImageUrl()); if(thread->Create() != wxTHREAD_NO_ERROR){ wxLogError(wxT("Can't create thread!")); } wxGetApp().add(thread); thread->Run(); } } tweetList_->insert(tweetList_->begin(), tweet); lastTweetId = tweet->getId(); } if(lastTweetId != -1){ setLastReadTweetId(lastTweetId); } SetItemCount(tweetList_->size()); RefreshAll(); }
// Renders the tweet into a gl::Texture, using TextBox for type rendering gl::Texture GoodNightMorningApp::renderTweet( const Tweet &tweet, float width, const Color &textColor, float backgroundAlpha ) { TextBox header = TextBox().font( mHeaderFont ).color( textColor ).text( "@" + tweet.getUser() ); Surface headerSurface = header.render(); TextBox phrase = TextBox().size( Vec2f( width - 48 - 4, TextBox::GROW ) ).font( mFont ).color( textColor ).text( tweet.getPhrase() ); Surface textSurface = phrase.render(); Surface result( textSurface.getWidth() + 56, std::max( headerSurface.getHeight() + textSurface.getHeight() + 10, 56 ), true ); ip::fill( &result, ColorA( 1, 1, 1, backgroundAlpha ) ); if( tweet.getIcon() ) result.copyFrom( tweet.getIcon(), tweet.getIcon().getBounds(), Vec2i( 4, 4 ) ); ip::blend( &result, headerSurface, headerSurface.getBounds(), Vec2i( result.getWidth() - 4 - headerSurface.getWidth(), textSurface.getHeight() + 6 ) ); ip::blend( &result, textSurface, textSurface.getBounds(), Vec2i( 56, 4 ) ); return result; }
//ユーザアイコンが読み込み終わった際に呼ばれる void TweetList::onGetUserIcon(event::GetUserIconEvent& event) { long userId = event.getUserId(); //画面内のリストを走査し、このユーザのアイコンを更新する int firstLine = GetVisibleBegin(); int lastLine = GetVisibleEnd(); for(int i=firstLine;i<=lastLine;i++){ Tweet* tw = tweetList_->at(i); if(tw->getUser()->getId() == userId){ RefreshLine(i); } } }
//-------------------------------------------------------------- void storeApp::update() { double timestamp = ofGetElapsedTimeMillis(); while(receiver.hasWaitingMessages() ) { // get the next message ofxOscMessage m; receiver.getNextMessage( &m ); if ( m.getAddress() == "/test" ) { } else if ( m.getAddress() == "/tweet" ) { if (m.getNumArgs() >= 2) { string user = ""; if (m.getArgType(0) == OFXOSC_TYPE_STRING) { user = m.getArgAsString(0); } string text = ""; if (m.getArgType(1) == OFXOSC_TYPE_STRING) { text = m.getArgAsString(1); } if (user != "" && text!= "") { //ofDrawBitmapString( user + ": " + text, 80, 200 ); //tweet = user + ": " + text; if (tweets->tweets->size() < 100) { tweets->push(new Tweet(user, text)); } } } } } if (ofGetElapsedTimeMillis() - timestamp > 10) cout << "msg parsed in " << ofGetElapsedTimeMillis() - timestamp << endl; if (ofGetElapsedTimeMillis() - lastTweetTime > 200) { if (tweets->tweets->size() > 0) { float margin = 20; Tweet *t = tweets->pop(); string text = t->getUser() + ": " + t->getText(); timestamp = ofGetElapsedTimeMillis(); Tweet *newTweet = new Tweet(t->getUser(), t->getText()); newTweet->textBlock.init(&defaultFont, &doubleSizedFont, &superSizedFont); newTweet->textBlock.setText(text); newTweet->textBlock.wrapTextInWidthHM(ofGetWidth()/6 - margin*2); newTweet->textBlock.setColor(255, 255, 255, 255); newTweet->bound = ofRectangle( activeColumn * ofGetWidth()/6 + margin, margin, ofGetWidth()/6 - margin * 2, ofGetHeight() - margin * 2 ); newTweet->lastShownTime = ofGetElapsedTimeMillis(); newTweet->live = true; tweetsOnShow->push(newTweet); //cout << "tweets on show: " << tweetsOnShow->tweets->size() << endl; tweets->tweets->pop_front(); activeColumn = (activeColumn+1) % 6; if (tweetsOnShow->tweets->size() > 6) { tweetsOnShow->tweets->pop_front(); } lastTweetTime = ofGetElapsedTimeMillis(); cout << "new tweet init'd in " << ofGetElapsedTimeMillis() - timestamp << endl; //cout << tweets->tweets->size(); //cout << " tweet in queue\n"; } } }