]> git.lyx.org Git - lyx.git/commitdiff
Streamlining CollapseStatus stuff
authorMartin Vermeer <martin.vermeer@hut.fi>
Thu, 16 Aug 2007 16:36:50 +0000 (16:36 +0000)
committerMartin Vermeer <martin.vermeer@hut.fi>
Thu, 16 Aug 2007 16:36:50 +0000 (16:36 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@19610 a592a061-630c-0410-9148-cb99ea01b6c8

src/frontends/qt4/QERT.cpp
src/frontends/qt4/ui/ERTUi.ui
src/insets/Inset.h
src/insets/InsetCharStyle.cpp
src/insets/InsetCharStyle.h
src/insets/InsetCollapsable.cpp
src/insets/InsetCollapsable.h

index d1b0fceba3eed4848d9226df17bf710661d97225..e2160de1a7312a35ca98ef74cc31a5ce3d2cbd1b 100644 (file)
@@ -36,7 +36,6 @@ QERTDialog::QERTDialog(QERT * form)
        setupUi(this);
        connect(okPB, SIGNAL(clicked()), form, SLOT(slotOK()));
        connect(closePB, SIGNAL(clicked()), form, SLOT(slotClose()));
-       connect(inlineRB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
        connect(collapsedRB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
        connect(openRB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
 }
@@ -82,11 +81,9 @@ void QERT::build_dialog()
 void QERT::apply()
 {
        if (dialog_->openRB->isChecked())
-               controller().setStatus(InsetERT::Open);
-       else if (dialog_->inlineRB->isChecked())
-               controller().setStatus(InsetERT::Inlined);
+               controller().setStatus(Inset::Open);
        else
-               controller().setStatus(InsetERT::Collapsed);
+               controller().setStatus(Inset::Collapsed);
 }
 
 
@@ -96,7 +93,6 @@ void QERT::update_contents()
 
        switch (controller().status()) {
                case InsetERT::Open: rb = dialog_->openRB; break;
-               case InsetERT::Inlined: rb = dialog_->inlineRB; break;
                case InsetERT::Collapsed: rb = dialog_->collapsedRB; break;
        }
 
index f149ffac1793694c3834b971c3d324c980911cbf..2cecc018700734b1df145fff8fd722ba5818d95c 100644 (file)
       <property name="spacing" >
        <number>6</number>
       </property>
-      <item>
-       <widget class="QRadioButton" name="inlineRB" >
-        <property name="toolTip" >
-         <string>Show ERT inline</string>
-        </property>
-        <property name="text" >
-         <string>&amp;Inline</string>
-        </property>
-       </widget>
-      </item>
-      <item>
+     <item>
        <widget class="QRadioButton" name="collapsedRB" >
         <property name="toolTip" >
          <string>Show ERT button only</string>
index 438dfb54d61afa9e41b46f34e4887e3bbf2a71e7..75127fea8daf5d2a1544c5ef339057e2db06ed9c 100644 (file)
@@ -486,7 +486,6 @@ public:
        ///
        enum CollapseStatus {
                Collapsed,
-               Inlined,
                Open
        };
        ///
index adbe85f5c323d00e4c78d48803ce5afb09f3bd7c..955d335e34c4dcf3166c04e4e9718a87c9bba04f 100644 (file)
@@ -51,7 +51,6 @@ using std::ostringstream;
 
 void InsetCharStyle::init()
 {
-       setInlined();
        setDrawFrame(false);
 }
 
@@ -134,7 +133,6 @@ void InsetCharStyle::read(Buffer const & buf, Lexer & lex)
 {
        params_.read(lex);
        InsetCollapsable::read(buf, lex);
-       setInlined();
 }
 
 
@@ -236,7 +234,6 @@ void InsetCharStyle::getDrawFont(Font & font) const
 
 void InsetCharStyle::doDispatch(Cursor & cur, FuncRequest & cmd)
 {
-       setInlined();
        switch (cmd.action) {
 
        case LFUN_MOUSE_RELEASE:
index 84e4349a5cf6a2fd2937789bf5815d9fef1241b6..61a2f0c69a14b637fd5957df9346522334b0bcc0 100644 (file)
@@ -77,6 +77,9 @@ public:
        void getDrawFont(Font &) const;
        ///
        bool forceDefaultParagraphs(idx_type) const { return true; }
+       ///
+       virtual Decoration decoration() const { return Conglomerate; }
+
        ///
        int latex(Buffer const &, odocstream &,
                  OutputParams const &) const;
index 615175ea68966dc7609eb4cdc69852e761baee5f..7889d80b66d5af5a5362356d822c4c62d8d5fe6d 100644 (file)
@@ -45,7 +45,29 @@ using std::ostream;
 
 InsetCollapsable::CollapseStatus InsetCollapsable::status() const
 {
-       return (autoOpen_ && status_ != Inlined) ? Open : status_;
+       return autoOpen_ ? Open : status_;
+}
+
+
+InsetCollapsable::Geometry InsetCollapsable::geometry() const
+{
+       switch (decoration()) {
+       case Classic:
+               if (status_ == Open || autoOpen_) {
+                       if (openinlined_)
+                               return LeftButton;
+                       else
+                               return TopButton;
+               } else
+                       return ButtonOnly;
+               break;
+       case Minimalistic:
+               return NoButton;
+               break;
+       case Conglomerate:
+               return ( status_ == Open ? SubLabel : Corners );
+               break;
+       }
 }
 
 
@@ -95,9 +117,6 @@ void InsetCollapsable::write(Buffer const & buf, ostream & os) const
        case Collapsed:
                os << "collapsed";
                break;
-       case Inlined:
-               os << "inlined";
-               break;
        }
        os << "\n";
        text_.write(buf, os);
@@ -114,10 +133,7 @@ void InsetCollapsable::read(Buffer const & buf, Lexer & lex)
                        lex.next();
                        string const tmp_token = lex.getString();
 
-                       if (tmp_token == "inlined") {
-                               status_ = Inlined;
-                               token_found = true;
-                       } else if (tmp_token == "collapsed") {
+                       if (tmp_token == "collapsed") {
                                status_ = Collapsed;
                                token_found = true;
                        } else if (tmp_token == "open") {
@@ -159,11 +175,15 @@ bool InsetCollapsable::metrics(MetricsInfo & mi, Dimension & dim) const
        autoOpen_ = mi.base.bv->cursor().isInside(this);
        mi.base.textwidth -= (int) (1.5 * TEXT_TO_INSET_OFFSET);
 
-       if (status() == Inlined) {
+       switch (decoration()) {
+       case Minimalistic:
+       case Conglomerate:
                InsetText::metrics(mi, dim);
-       } else {
+               break;
+       case Classic:
                dim = dimensionCollapsed();
-               if (status() == Open) {
+               if (geometry() == TopButton
+                || geometry() == LeftButton) {
                        InsetText::metrics(mi, textdim_);
                        // This expression should not contain mi.base.texwidth
                        openinlined_ = !hasFixedWidth()
@@ -182,6 +202,7 @@ bool InsetCollapsable::metrics(MetricsInfo & mi, Dimension & dim) const
                                        dim.wid = max(dim.wid, mi.base.textwidth);
                        }
                }
+               break;
        }
        dim.asc += TEXT_TO_INSET_OFFSET;
        dim.des += TEXT_TO_INSET_OFFSET;
@@ -203,7 +224,8 @@ bool InsetCollapsable::setMouseHover(bool mouse_hover)
 void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
 {
        const int xx = x + TEXT_TO_INSET_OFFSET;
-       if (status() == Inlined) {
+
+       if (decoration() == Minimalistic)  {
                InsetText::draw(pi, xx, y);
        } else {
                Dimension dimc = dimensionCollapsed();
@@ -215,16 +237,30 @@ void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
 
                pi.pain.buttonText(xx, top + dimc.asc, label, layout_.labelfont, mouse_hover_);
 
-               if (status() == Open) {
-                       int textx, texty;
-                       if (openinlined_) {
-                               textx = xx + dimc.width();
-                               texty = top + textdim_.asc;
-                       } else {
-                               textx = xx;
-                               texty = top + dimc.height() + textdim_.asc;
-                       }
+               int textx, texty;
+               switch (geometry()) {
+               case LeftButton:
+                       textx = xx + dimc.width();
+                       texty = top + textdim_.asc;
+                       InsetText::draw(pi, textx, texty);
+                       break;
+               case TopButton:
+                       textx = xx;
+                       texty = top + dimc.height() + textdim_.asc;
                        InsetText::draw(pi, textx, texty);
+                       break;
+               case ButtonOnly:
+                       break;
+               case NoButton:
+                       textx = xx;
+                       texty = top + textdim_.asc;
+                       InsetText::draw(pi, textx, texty);
+                       break;
+               case SubLabel:
+               case Corners:
+                       // FIXME add handling of SubLabel, Corners
+                       // still in CharStyle
+                       break;
                }
        }
        setPosCache(pi, x, y);
@@ -234,30 +270,49 @@ void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
 void InsetCollapsable::drawSelection(PainterInfo & pi, int x, int y) const
 {
        x += TEXT_TO_INSET_OFFSET;
-       if (status() == Open) {
-               if (openinlined_)
-                       x += dimensionCollapsed().wid;
-               else
-                       y += dimensionCollapsed().des + textdim_.asc;
-       }
-       if (status() != Collapsed)
+       switch (geometry()) {
+       case LeftButton:
+               x += dimensionCollapsed().wid;
                InsetText::drawSelection(pi, x, y);
+               break;
+       case TopButton:
+               y += dimensionCollapsed().des + textdim_.asc;
+               InsetText::drawSelection(pi, x, y);
+               break;
+       case ButtonOnly:
+               break;
+       case NoButton:
+       case SubLabel:
+       case Corners:
+               InsetText::drawSelection(pi, x, y);
+               break;
+       }
 }
 
 
 void InsetCollapsable::cursorPos(BufferView const & bv,
                CursorSlice const & sl, bool boundary, int & x, int & y) const
 {
-       BOOST_ASSERT(status() != Collapsed);
+       BOOST_ASSERT(geometry() != ButtonOnly);
 
        InsetText::cursorPos(bv, sl, boundary, x, y);
 
-       if (status() == Open) {
-               if (openinlined_)
-                       x += dimensionCollapsed().wid;
-               else
-                       y += dimensionCollapsed().height() - ascent()
-                               + TEXT_TO_INSET_OFFSET + textdim_.asc;
+       switch (geometry()) {
+       case LeftButton:
+               x += dimensionCollapsed().wid;
+               break;
+       case TopButton:
+               y += dimensionCollapsed().height() - ascent()
+                       + TEXT_TO_INSET_OFFSET + textdim_.asc;
+               break;
+       case NoButton:
+       case SubLabel:
+       case Corners:
+               // Do nothing
+               break;
+       case ButtonOnly:
+               // Cannot get here
+               break;
        }
        x += TEXT_TO_INSET_OFFSET;
 }
@@ -265,13 +320,13 @@ void InsetCollapsable::cursorPos(BufferView const & bv,
 
 Inset::EDITABLE InsetCollapsable::editable() const
 {
-       return status() != Collapsed ? HIGHLY_EDITABLE : IS_EDITABLE;
+       return geometry() != ButtonOnly? HIGHLY_EDITABLE : IS_EDITABLE;
 }
 
 
 bool InsetCollapsable::descendable() const
 {
-       return status() != Collapsed;
+       return geometry() != ButtonOnly;
 }
 
 
@@ -313,7 +368,9 @@ void InsetCollapsable::edit(Cursor & cur, bool left)
 Inset * InsetCollapsable::editXY(Cursor & cur, int x, int y)
 {
        //lyxerr << "InsetCollapsable: edit xy" << endl;
-       if (status() == Collapsed || (button_dim.contains(x, y) && status() != Inlined))
+       if (geometry() == ButtonOnly
+        || (button_dim.contains(x, y) 
+         && decoration() != Minimalistic))
                return this;
        cur.push(*this);
        return InsetText::editXY(cur, x, y);
@@ -327,7 +384,9 @@ void InsetCollapsable::doDispatch(Cursor & cur, FuncRequest & cmd)
 
        switch (cmd.action) {
        case LFUN_MOUSE_PRESS:
-               if (cmd.button() == mouse_button::button1 && hitButton(cmd) && status() != Inlined) {
+               if (cmd.button() == mouse_button::button1 
+                && hitButton(cmd) 
+                && decoration() != Minimalistic) {
                        // reset selection if necessary (see bug 3060)
                        if (cur.selection())
                                cur.bv().cursor().clearSelection();
@@ -336,9 +395,10 @@ void InsetCollapsable::doDispatch(Cursor & cur, FuncRequest & cmd)
                        cur.dispatched();
                        break;
                }
-               if (status() == Inlined)
+               if (decoration() == Minimalistic)
                        InsetText::doDispatch(cur, cmd);
-               else if (status() == Open && !hitButton(cmd))
+               else if (geometry() != ButtonOnly 
+                    && !hitButton(cmd))
                        InsetText::doDispatch(cur, cmd);
                else
                        cur.undispatched();
@@ -347,9 +407,10 @@ void InsetCollapsable::doDispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_MOUSE_MOTION:
        case LFUN_MOUSE_DOUBLE:
        case LFUN_MOUSE_TRIPLE:
-               if (status_ == Inlined)
+               if (decoration() == Minimalistic)
                        InsetText::doDispatch(cur, cmd);
-               else if (status() && !hitButton(cmd))
+               else if (geometry() != ButtonOnly
+                    && !hitButton(cmd))
                        InsetText::doDispatch(cur, cmd);
                else
                        cur.undispatched();
@@ -362,7 +423,7 @@ void InsetCollapsable::doDispatch(Cursor & cur, FuncRequest & cmd)
                        break;
                }
 
-               if (status() == Inlined) {
+               if (decoration() == Minimalistic) {
                        // The mouse click has to be within the inset!
                        InsetText::doDispatch(cur, cmd);
                        break;
@@ -377,7 +438,7 @@ void InsetCollapsable::doDispatch(Cursor & cur, FuncRequest & cmd)
                        // toggle the inset visual state.
                        cur.dispatched();
                        cur.updateFlags(Update::Force | Update::FitCursor);
-                       if (status() == Collapsed) {
+                       if (geometry() == ButtonOnly) {
                                setStatus(cur, Open);
                                edit(cur, true);
                        }
@@ -389,7 +450,8 @@ void InsetCollapsable::doDispatch(Cursor & cur, FuncRequest & cmd)
                }
 
                // The mouse click is within the opened inset.
-               if (status() == Open)
+               if (geometry() == TopButton
+                || geometry() == LeftButton)
                        InsetText::doDispatch(cur, cmd);
                break;
 
index 2a31b1453fe4828a8bd404f1d54344046fb38471..742a4acb2e22f47f4c8b7622db6e7aa5489131ac 100644 (file)
@@ -42,7 +42,7 @@ public:
        ///
        static int const TEXT_TO_BOTTOM_OFFSET = 2;
        ///
-       InsetCollapsable(BufferParams const &, CollapseStatus status = Open);
+       InsetCollapsable(BufferParams const &, CollapseStatus status = Inset::Open);
        ///
        InsetCollapsable(InsetCollapsable const & rhs);
        ///
@@ -77,11 +77,51 @@ public:
        ///
        void setLabelFont(Font const & f);
        ///
-       bool isOpen() const { return status_ == Open || status_ == Inlined; }
+       bool isOpen() const { return geometry() != ButtonOnly; }
        ///
-       bool inlined() const { return status_ == Inlined; }
+       bool inlined() const { return decoration() == Minimalistic|| decoration() == Conglomerate; }
        ///
        CollapseStatus status() const;
+       /** Of the old CollapseStatus we only keep the values  
+        *  Open and Collapsed.
+        * We define a list of possible inset decoration
+        * styles, and a list of possible (concrete, visual)
+        * inset geometries. Relationships between them
+        * (geometries in body of table):
+        *
+        *               \       CollapseStatus:
+        *   Decoration:  \ Open                Collapsed
+        *   -------------+-------------------------------
+        *   Classic      | *) TopButton, <--x) ButtonOnly
+        *                | LeftButton
+        *   Minimalistic | NoButton            NoButton
+        *   Conglomerate | SubLabel            Corners
+        *   ---------------------------------------------
+        *   *) toggled by openinlined_
+        *   x) toggled by autoOpen_
+        */
+
+       ///
+       enum Decoration {
+               Classic,
+               Minimalistic,
+               Conglomerate
+       };
+       /// Default looks
+       virtual Decoration decoration() const { return Classic;  }
+       ///
+       enum Geometry {
+               TopButton,
+               ButtonOnly,
+               NoButton,
+               LeftButton,
+               SubLabel,
+               Corners
+       };
+       /// Returns the geometry based on CollapseStatus
+       /// (status_), autoOpen_ and openinlined_, and of
+       /// course decoration().
+       Geometry geometry() const;
        ///
        bool allowSpellCheck() const { return true; }
        ///
@@ -103,8 +143,6 @@ protected:
        ///
        Inset * editXY(Cursor & cur, int x, int y);
        ///
-       void setInlined() { status_ = Inlined; }
-       ///
        docstring floatName(std::string const & type, BufferParams const &) const;
 
 protected: