void textbox::append_text(const std::string& text, bool auto_scroll, const SDL_Color& color) { if(text_image_.get() == NULL) { set_text(text, color); return; } //disallow adding multi-line text to a single-line text box if(wrap_ == false && std::find_if(text.begin(),text.end(),utils::isnewline) != text.end()) { return; } const bool is_at_bottom = get_position() == get_max_position(); const wide_string& wtext = utils::string_to_wstring(text); const surface new_text = add_text_line(wtext, color); const surface new_surface = create_compatible_surface(text_image_,std::max<size_t>(text_image_->w,new_text->w),text_image_->h+new_text->h); SDL_SetAlpha(new_text.get(),0,0); SDL_SetAlpha(text_image_.get(),0,0); SDL_BlitSurface(text_image_,NULL,new_surface,NULL); SDL_Rect target = {0,text_image_->h,new_text->w,new_text->h}; SDL_BlitSurface(new_text,NULL,new_surface,&target); text_image_.assign(new_surface); text_.resize(text_.size() + wtext.size()); std::copy(wtext.begin(),wtext.end(),text_.end()-wtext.size()); set_dirty(true); update_text_cache(false); if(auto_scroll && is_at_bottom) scroll_to_bottom(); handle_text_changed(text_); }
int view_text(const char *title, const char *text) { struct view_info info; const struct button_mapping *view_contexts[] = { pla_main_ctx, }; int button; init_view(&info, title, text); draw_text(&info); /* wait for keypress */ while(1) { button = pluginlib_getaction(TIMEOUT_BLOCK, view_contexts, ARRAYLEN(view_contexts)); switch (button) { case PLA_UP: case PLA_UP_REPEAT: #ifdef HAVE_SCROLLWHEEL case PLA_SCROLL_BACK: case PLA_SCROLL_BACK_REPEAT: #endif scroll_up(&info, 1); break; case PLA_DOWN: case PLA_DOWN_REPEAT: #ifdef HAVE_SCROLLWHEEL case PLA_SCROLL_FWD: case PLA_SCROLL_FWD_REPEAT: #endif scroll_down(&info, 1); break; case PLA_LEFT: scroll_up(&info, info.display_lines); break; case PLA_RIGHT: scroll_down(&info, info.display_lines); break; case PLA_LEFT_REPEAT: scroll_to_top(&info); break; case PLA_RIGHT_REPEAT: scroll_to_bottom(&info); break; case PLA_EXIT: case PLA_CANCEL: return PLUGIN_OK; default: if (rb->default_event_handler(button) == SYS_USB_CONNECTED) return PLUGIN_USB_CONNECTED; break; } } return PLUGIN_OK; }
/* Toggles automatic forwarding of file. */ static void cmd_F(key_info_t key_info, keys_info_t *keys_info) { vi->auto_forward = !vi->auto_forward; if(vi->auto_forward) { if(forward_if_changed(vi) || scroll_to_bottom(vi)) { draw(); } } }
/* Either scrolls to specific line number (when specified) or to the bottom of * the view. */ static void cmd_G(key_info_t key_info, keys_info_t *keys_info) { if(key_info.count != NO_COUNT_GIVEN) { cmd_g(key_info, keys_info); return; } if(scroll_to_bottom(vi)) { draw(); } }
static void level_combo_changed_cb (GtkComboBox * combo_box, gpointer gdata) { struct MsgData * data = gdata; const int level = gtr_combo_box_get_active_enum (combo_box); const gboolean pinned_to_new = is_pinned_to_new (data); tr_logSetLevel (level); gtr_core_set_pref_int (data->core, TR_KEY_message_level, level); data->maxLevel = level; gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (data->filter)); if (pinned_to_new) scroll_to_bottom (data); }