X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetSpace.cpp;h=c9156d4e51136255c9ceabaac876277baf66806f;hb=4a1be58591ea5a7431d9426abb27d8b946c634cb;hp=f71c0cc10e3d8d34e72822d3aa6cbc0a606baba7;hpb=2012beb58e62d04b9c2fc2bc0bc3d60fa095e03e;p=lyx.git diff --git a/src/insets/InsetSpace.cpp b/src/insets/InsetSpace.cpp index f71c0cc10e..c9156d4e51 100644 --- a/src/insets/InsetSpace.cpp +++ b/src/insets/InsetSpace.cpp @@ -102,6 +102,18 @@ docstring InsetSpace::toolTip(BufferView const &, int, int) const case InsetSpaceParams::HRULEFILL: message = _("Horizontal Fill (Rule)"); break; + case InsetSpaceParams::LEFTARROWFILL: + message = _("Horizontal Fill (Left Arrow)"); + break; + case InsetSpaceParams::RIGHTARROWFILL: + message = _("Horizontal Fill (Right Arrow)"); + break; + case InsetSpaceParams::UPBRACEFILL: + message = _("Horizontal Fill (Up Brace)"); + break; + case InsetSpaceParams::DOWNBRACEFILL: + message = _("Horizontal Fill (Down Brace)"); + break; case InsetSpaceParams::CUSTOM: message = support::bformat(_("Horizontal Space (%1$s)"), params_.length.asDocstring()); @@ -146,9 +158,8 @@ bool InsetSpace::getStatus(Cursor & cur, FuncRequest const & cmd, InsetSpaceParams params; string2params(to_utf8(cmd.argument()), params); status.setOnOff(params_.kind == params.kind); - } else { - status.enabled(true); } + status.setEnabled(true); return true; default: return Inset::getStatus(cur, cmd, status); @@ -202,6 +213,10 @@ void InsetSpace::metrics(MetricsInfo & mi, Dimension & dim) const case InsetSpaceParams::HFILL_PROTECTED: case InsetSpaceParams::DOTFILL: case InsetSpaceParams::HRULEFILL: + case InsetSpaceParams::LEFTARROWFILL: + case InsetSpaceParams::RIGHTARROWFILL: + case InsetSpaceParams::UPBRACEFILL: + case InsetSpaceParams::DOWNBRACEFILL: // shut up compiler break; } @@ -217,11 +232,30 @@ void InsetSpace::draw(PainterInfo & pi, int x, int y) const if (isStretchableSpace()) { int const asc = theFontMetrics(pi.base.font).ascent('M'); int const desc = theFontMetrics(pi.base.font).descent('M'); + //Pixel height divisible by 2 for prettier fill graphics: + int const oddheight = (asc ^ desc) & 1; int const x0 = x + 1; int const x1 = x + dim.wid - 2; - int const y0 = y + desc; - int const y1 = y - asc; - int const y2 = y - asc / 2; + int const y0 = y + desc - 1; + int const y1 = y - asc + oddheight - 1; + int const y2 = (y0 + y1) / 2; + int xoffset = (y0 - y1) / 2; + + //Two tests for very narrow insets + if (xoffset > x1 - x0 + && (params_.kind == InsetSpaceParams::LEFTARROWFILL + || params_.kind == InsetSpaceParams::RIGHTARROWFILL)) + xoffset = x1 - x0; + if (xoffset * 6 > (x1 - x0) + && (params_.kind == InsetSpaceParams::UPBRACEFILL + || params_.kind == InsetSpaceParams::DOWNBRACEFILL)) + xoffset = (x1 - x0) / 6; + + int const x2 = x0 + xoffset; + int const x3 = x1 - xoffset; + int const xm = (x0 + x1) / 2; + int const xml = xm - xoffset; + int const xmr = xm + xoffset; if (params_.kind == InsetSpaceParams::HFILL) { pi.pain.line(x0, y1, x0, y0, Color_added_space); @@ -235,13 +269,35 @@ void InsetSpace::draw(PainterInfo & pi, int x, int y) const pi.pain.line(x1, y1, x1, y0, Color_latex); } else if (params_.kind == InsetSpaceParams::DOTFILL) { pi.pain.line(x0, y1, x0, y0, Color_special); - pi.pain.line(x0, y, x1, y, Color_special, + pi.pain.line(x0, y0, x1, y0, Color_special, frontend::Painter::line_onoffdash); pi.pain.line(x1, y1, x1, y0, Color_special); - } if (params_.kind == InsetSpaceParams::HRULEFILL) { + } else if (params_.kind == InsetSpaceParams::HRULEFILL) { pi.pain.line(x0, y1, x0, y0, Color_special); - pi.pain.line(x0, y, x1, y, Color_special); + pi.pain.line(x0, y0, x1, y0, Color_special); pi.pain.line(x1, y1, x1, y0, Color_special); + } else if (params_.kind == InsetSpaceParams::LEFTARROWFILL) { + pi.pain.line(x2, y1 + 1 , x0 + 1, y2, Color_special); + pi.pain.line(x0 + 1, y2 + 1 , x2, y0, Color_special); + pi.pain.line(x0, y2 , x1, y2, Color_special); + } else if (params_.kind == InsetSpaceParams::RIGHTARROWFILL) { + pi.pain.line(x3 + 1, y1 + 1 , x1, y2, Color_special); + pi.pain.line(x1, y2 + 1 , x3 + 1, y0, Color_special); + pi.pain.line(x0, y2 , x1, y2, Color_special); + } else if (params_.kind == InsetSpaceParams::UPBRACEFILL) { + pi.pain.line(x0 + 1, y1 + 1 , x2, y2, Color_special); + pi.pain.line(x2, y2 , xml, y2, Color_special); + pi.pain.line(xml + 1, y2 + 1 , xm, y0, Color_special); + pi.pain.line(xm + 1, y0 , xmr, y2 + 1, Color_special); + pi.pain.line(xmr, y2 , x3, y2, Color_special); + pi.pain.line(x3 + 1, y2 , x1, y1 + 1, Color_special); + } else if (params_.kind == InsetSpaceParams::DOWNBRACEFILL) { + pi.pain.line(x0 + 1, y0 , x2, y2 + 1, Color_special); + pi.pain.line(x2, y2 , xml, y2, Color_special); + pi.pain.line(xml + 1, y2 , xm, y1 + 1, Color_special); + pi.pain.line(xm + 1, y1 + 1 , xmr, y2, Color_special); + pi.pain.line(xmr, y2 , x3, y2, Color_special); + pi.pain.line(x3 + 1, y2 + 1 , x1, y0, Color_special); } return; } @@ -313,6 +369,18 @@ void InsetSpaceParams::write(ostream & os) const case InsetSpaceParams::HRULEFILL: os << "\\hrulefill{}"; break; + case InsetSpaceParams::LEFTARROWFILL: + os << "\\leftarrowfill{}"; + break; + case InsetSpaceParams::RIGHTARROWFILL: + os << "\\rightarrowfill{}"; + break; + case InsetSpaceParams::UPBRACEFILL: + os << "\\upbracefill{}"; + break; + case InsetSpaceParams::DOWNBRACEFILL: + os << "\\downbracefill{}"; + break; case InsetSpaceParams::CUSTOM: os << "\\hspace{}"; break; @@ -328,8 +396,9 @@ void InsetSpaceParams::write(ostream & os) const void InsetSpaceParams::read(Lexer & lex) { - lex.next(); - string const command = lex.getString(); + lex.setContext("InsetSpaceParams::read"); + string command; + lex >> command; if (command == "\\space{}") kind = InsetSpaceParams::NORMAL; @@ -357,32 +426,27 @@ void InsetSpaceParams::read(Lexer & lex) kind = InsetSpaceParams::HRULEFILL; else if (command == "\\hspace{}") kind = InsetSpaceParams::CUSTOM; + else if (command == "\\leftarrowfill{}") + kind = InsetSpaceParams::LEFTARROWFILL; + else if (command == "\\rightarrowfill{}") + kind = InsetSpaceParams::RIGHTARROWFILL; + else if (command == "\\upbracefill{}") + kind = InsetSpaceParams::UPBRACEFILL; + else if (command == "\\downbracefill{}") + kind = InsetSpaceParams::DOWNBRACEFILL; else if (command == "\\hspace*{}") kind = InsetSpaceParams::CUSTOM_PROTECTED; else lex.printError("InsetSpace: Unknown kind: `$$Token'"); - - string token; - lex >> token; - if (token == "\\length") { - lex.next(); - string const len = lex.getString(); - length = Length(len); - lex.next(); - token = lex.getString(); - } - if (!lex) - return; - if (token != "\\end_inset") - lex.printError("Missing \\end_inset at this point. " - "Read: `$$Token'"); + if (lex.checkFor("\\length")) + lex >> length; } void InsetSpace::write(ostream & os) const { - os << "Space "; + os << "space "; params_.write(os); } @@ -390,6 +454,7 @@ void InsetSpace::write(ostream & os) const void InsetSpace::read(Lexer & lex) { params_.read(lex); + lex >> "\\end_inset"; } @@ -432,6 +497,18 @@ int InsetSpace::latex(odocstream & os, OutputParams const & runparams) const case InsetSpaceParams::HRULEFILL: os << (runparams.free_spacing ? " " : "\\hrulefill{}"); break; + case InsetSpaceParams::LEFTARROWFILL: + os << (runparams.free_spacing ? " " : "\\leftarrowfill{}"); + break; + case InsetSpaceParams::RIGHTARROWFILL: + os << (runparams.free_spacing ? " " : "\\rightarrowfill{}"); + break; + case InsetSpaceParams::UPBRACEFILL: + os << (runparams.free_spacing ? " " : "\\upbracefill{}"); + break; + case InsetSpaceParams::DOWNBRACEFILL: + os << (runparams.free_spacing ? " " : "\\downbracefill{}"); + break; case InsetSpaceParams::CUSTOM: if (runparams.free_spacing) os << " "; @@ -462,6 +539,18 @@ int InsetSpace::plaintext(odocstream & os, OutputParams const &) const case InsetSpaceParams::HRULEFILL: os << "_____"; return 5; + case InsetSpaceParams::LEFTARROWFILL: + os << "<----"; + return 5; + case InsetSpaceParams::RIGHTARROWFILL: + os << "---->"; + return 5; + case InsetSpaceParams::UPBRACEFILL: + os << "\\-v-/"; + return 5; + case InsetSpaceParams::DOWNBRACEFILL: + os << "/-^-\\"; + return 5; default: os << ' '; return 1; @@ -493,6 +582,10 @@ int InsetSpace::docbook(odocstream & os, OutputParams const &) const case InsetSpaceParams::HRULEFILL: // FIXME os << '\n'; + case InsetSpaceParams::LEFTARROWFILL: + case InsetSpaceParams::RIGHTARROWFILL: + case InsetSpaceParams::UPBRACEFILL: + case InsetSpaceParams::DOWNBRACEFILL: case InsetSpaceParams::CUSTOM: case InsetSpaceParams::CUSTOM_PROTECTED: // FIXME @@ -510,10 +603,14 @@ void InsetSpace::textString(odocstream & os) const bool InsetSpace::isStretchableSpace() const { - return (params_.kind == InsetSpaceParams::HFILL || - params_.kind == InsetSpaceParams::HFILL_PROTECTED || - params_.kind == InsetSpaceParams::DOTFILL || - params_.kind == InsetSpaceParams::HRULEFILL); + return params_.kind == InsetSpaceParams::HFILL + || params_.kind == InsetSpaceParams::HFILL_PROTECTED + || params_.kind == InsetSpaceParams::DOTFILL + || params_.kind == InsetSpaceParams::HRULEFILL + || params_.kind == InsetSpaceParams::LEFTARROWFILL + || params_.kind == InsetSpaceParams::RIGHTARROWFILL + || params_.kind == InsetSpaceParams::UPBRACEFILL + || params_.kind == InsetSpaceParams::DOWNBRACEFILL; } @@ -530,17 +627,16 @@ void InsetSpace::string2params(string const & in, InsetSpaceParams & params) return; istringstream data(in); - Lexer lex(0,0); + Lexer lex; lex.setStream(data); - - string name; - lex >> name; - if (!lex || name != "space") { - LYXERR0("Expected arg 1 to be \"space\" in " << in); - return; - } - - params.read(lex); + lex.setContext("InsetSpace::string2params"); + lex >> "space"; + + // There are cases, such as when we are called via getStatus() from + // Dialog::canApply(), where we are just called with "space" rather + // than a full "space \type{}\n\\end_inset". + if (lex.isOK()) + params.read(lex); }