#include #include #include #include #include #include #include #include #include namespace newsbeuter { help_formaction::help_formaction(view * vv, std::string formstr) : formaction(vv, formstr), quit(false), apply_search(false) { } help_formaction::~help_formaction() { } void help_formaction::process_operation(operation op, bool /* automatic */, std::vector * /* args */) { switch (op) { case OP_QUIT: quit = true; break; case OP_SEARCH: { std::vector qna; qna.push_back(qna_pair(_("Search for: "), "")); this->start_qna(qna, OP_INT_START_SEARCH, &searchhistory); } break; case OP_CLEARFILTER: apply_search = false; do_redraw = true; break; default: break; } if (quit) { v->pop_current_formaction(); } } void help_formaction::prepare() { if (do_redraw) { std::string listwidth = f->get("helptext:w"); std::istringstream is(listwidth); unsigned int width; is >> width; fmtstr_formatter fmt; fmt.register_fmt('N', PROGRAM_NAME); fmt.register_fmt('V', PROGRAM_VERSION); f->set("head",fmt.do_format(v->get_cfg()->get_configvalue("help-title-format"), width)); std::vector descs; v->get_keys()->get_keymap_descriptions(descs, v->get_keys()->get_flag_from_context(context)); std::string highlighted_searchphrase = utils::strprintf("%s", searchphrase.c_str()); std::vector colors = utils::tokenize(v->get_cfg()->get_configvalue("search-highlight-colors"), " "); f->set("highlight", make_colorstring(colors)); listformatter listfmt; unsigned int unbound_count = 0; unsigned int syskey_count = 0; for (unsigned int i=0;i<3;i++) { for (std::vector::iterator it=descs.begin();it!=descs.end();++it) { bool condition; switch (i) { case 0: condition = (it->key.length() == 0 || it->flags & KM_SYSKEYS); if (it->key.length() == 0) unbound_count++; if (it->flags & KM_SYSKEYS) syskey_count++; break; case 1: condition = !(it->flags & KM_SYSKEYS); break; case 2: condition = (it->key.length() > 0 || it->flags & KM_SYSKEYS); break; default: condition = true; break; } if (context.length() > 0 && (it->ctx != context || condition)) continue; if (!apply_search || strcasestr(it->key.c_str(), searchphrase.c_str())!=NULL || strcasestr(it->cmd.c_str(), searchphrase.c_str())!=NULL || strcasestr(it->desc.c_str(), searchphrase.c_str())!=NULL) { char tabs_1[] = " "; char tabs_2[] = " "; unsigned int how_often_1 = strlen(tabs_1) - it->key.length(); unsigned int how_often_2 = strlen(tabs_2) - it->cmd.length(); tabs_1[how_often_1] = '\0'; tabs_2[how_often_2] = '\0'; std::string line; switch (i) { case 0: case 1: line = utils::strprintf("%s%s%s%s%s", it->key.c_str(), tabs_1, it->cmd.c_str(), tabs_2, it->desc.c_str()); break; case 2: line = utils::strprintf("%s%s%s%s", it->cmd.c_str(), tabs_1, tabs_2, it->desc.c_str()); break; } LOG(LOG_DEBUG, "help_formaction::prepare: step 1 - line = %s", line.c_str()); line = utils::quote_for_stfl(line); LOG(LOG_DEBUG, "help_formaction::prepare: step 2 - line = %s", line.c_str()); if (apply_search && searchphrase.length() > 0) { line = utils::replace_all(line, searchphrase, highlighted_searchphrase); LOG(LOG_DEBUG, "help_formaction::prepare: step 3 - line = %s", line.c_str()); } listfmt.add_line(line); } } switch (i) { case 0: if (syskey_count > 0) { listfmt.add_line(""); listfmt.add_line(_("Generic bindings:")); listfmt.add_line(""); } break; case 1: if (unbound_count > 0) { listfmt.add_line(""); listfmt.add_line(_("Unbound functions:")); listfmt.add_line(""); } break; } } f->modify("helptext","replace_inner", listfmt.format_list()); do_redraw = false; } quit = false; } void help_formaction::init() { set_keymap_hints(); } keymap_hint_entry * help_formaction::get_keymap_hint() { static keymap_hint_entry hints[] = { { OP_QUIT, _("Quit") }, { OP_SEARCH, _("Search") }, { OP_CLEARFILTER, _("Clear") }, { OP_NIL, NULL } }; return hints; } void help_formaction::finished_qna(operation op) { switch (op) { case OP_INT_START_SEARCH: searchphrase = qna_responses[0]; apply_search = true; do_redraw = true; break; default: break; } } void help_formaction::set_context(const std::string& ctx) { if (context != ctx) { do_redraw = true; context = ctx; } } std::string help_formaction::title() { return _("Help"); } std::string help_formaction::make_colorstring(const std::vector& colors) { std::string result; if (colors.size() > 0) { if (colors[0] != "default") { result.append("fg="); result.append(colors[0]); } if (colors.size() > 1) { if (colors[1] != "default") { if (result.length() > 0) result.append(","); result.append("bg="); result.append(colors[1]); } } for (unsigned int i=2;i 0) result.append(","); result.append("attr="); result.append(colors[i]); } } return result; } } .rs?h=release/v0.1'>release/v0.1Gravatar Jorge Aparicio 18-87/+206 2017-07-27update examplesGravatar Jorge Aparicio 15-294/+198 2017-07-27`Send`-ness check is now in rtfm-coreGravatar Jorge Aparicio 3-23/+10 2017-07-27make task.$T.path mandatoryGravatar Jorge Aparicio 2-56/+30 2017-07-27make task.$T.enabled optionalGravatar Jorge Aparicio 17-91/+111 2017-07-27fix yet another warning on ARMv6-MGravatar Jorge Aparicio 1-3/+3 2017-07-27travis: install linkerGravatar Jorge Aparicio 3-3/+31 2017-07-27fix warning on ARMv6-MGravatar Jorge Aparicio 1-1/+2 2017-07-27don't generate empty modulesGravatar Jorge Aparicio 1-11/+16 2017-07-27make task.$T.priority optionalGravatar Jorge Aparicio 1-20/+8 2017-07-27update tests and examplesGravatar Jorge Aparicio 17-230/+68 2017-07-27refactor Resource / Threshold into its own crate, drop task!, tweak rtfm::atomicGravatar Jorge Aparicio 3-154/+47 2017-07-26provide a Threshold token even when all resources are locklessGravatar Jorge Aparicio 1-7/+5 2017-07-26fix around owned idle resourceGravatar Jorge Aparicio 1-1/+5 2017-07-25inline claimGravatar Jorge Aparicio 1-0/+1 2017-07-25fix errors around the use of `super` in relative pathsGravatar Jorge Aparicio 1-4/+4 2017-07-24more "hygiene"Gravatar Jorge Aparicio 1-8/+12