[Aptitude-devel] r3108 - in branches/aptitude-0.3/aptitude: . src/vscreen

Daniel Burrows dburrows@costa.debian.org
Wed, 27 Apr 2005 01:06:29 +0000


Author: dburrows
Date: Wed Apr 27 01:06:26 2005
New Revision: 3108

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/vscreen/vs_button.cc
   branches/aptitude-0.3/aptitude/src/vscreen/vs_button.h
   branches/aptitude-0.3/aptitude/src/vscreen/vs_togglebutton.cc
   branches/aptitude-0.3/aptitude/src/vscreen/vs_togglebutton.h
Log:
Support fragment-based labels.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Wed Apr 27 01:06:26 2005
@@ -1,5 +1,9 @@
 2005-04-26  Daniel Burrows  <dburrows@debian.org>
 
+	* src/vscreen/vs_button.cc, src/vscreen/vs_button.h, src/vscreen/vs_togglebutton.cc, src/vscreen/vs_togglebutton.h:
+
+	  Add basic support for using fragments as button labels.
+
 	* src/vscreen/fragment_contents.h:
 
 	  Make size() const.

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vs_button.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vs_button.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vs_button.cc	Wed Apr 27 01:06:26 2005
@@ -2,19 +2,32 @@
 
 #include "vs_button.h"
 
+#include "fragment.h"
 #include "vscreen.h"
 
 #include "config/keybindings.h"
 
 #include <sigc++/functors/mem_fun.h>
 
-vs_button::vs_button(std::string _label)
+vs_button::vs_button(fragment *_label)
   :label(_label)
 {
   focussed.connect(sigc::mem_fun(*this, &vs_button::accept_focus));
   unfocussed.connect(sigc::mem_fun(*this, &vs_button::lose_focus));
 }
 
+vs_button::vs_button(const std::string &_label)
+  :label(text_fragment(_label))
+{
+  focussed.connect(sigc::mem_fun(*this, &vs_button::accept_focus));
+  unfocussed.connect(sigc::mem_fun(*this, &vs_button::lose_focus));
+}
+
+vs_button::~vs_button()
+{
+  delete label;
+}
+
 bool vs_button::focus_me()
 {
   return true;
@@ -42,17 +55,57 @@
 
 void vs_button::paint()
 {
+  size_t labelw=getmaxx()>=4?getmaxx()-4:0;
+  fragment_contents lines=label->layout(labelw, labelw);
+
+  // FIXME: should use cascading text styles for this:
   if(get_isfocussed())
     {
       bkgdset(get_bg()^A_REVERSE);
       attrset(get_bg()^A_REVERSE);
     }
 
-  std::string out="[ "+label+" ]";
-
-  // FIXME: do this Better[tm]..maybe even make this a container holding
-  // a label like in GTK+??
-  mvaddnstr(0, 0, out.c_str(), out.size());
+  // TODO: create a "bracebox" fragment that places left&right braces
+  // automatically.
+  for(size_t i=0; i<lines.size(); ++i)
+    {
+      std::string out;
+      if(lines.size() == 1)
+	out+="[ ";
+      else
+	{
+	  if(i==0)
+	    out+=ACS_ULCORNER;
+	  else if(i+1==lines.size())
+	    out+=ACS_LLCORNER;
+	  else
+	    out+=ACS_VLINE;
+
+	  out+=" ";
+	}
+
+      chstring s=lines[i];
+      for(chstring::iterator j=s.begin(); j!=s.end(); ++i)
+	out+=(*j)&A_CHARTEXT;
+
+      if(lines.size() == 1)
+	out+=" ]";
+      else
+	{
+	  out+=" ";
+
+	  if(i==0)
+	    out+=ACS_URCORNER;
+	  else if(i+1==lines.size())
+	    out+=ACS_LRCORNER;
+	  else
+	    out+=ACS_VLINE;
+	}
+
+      // FIXME: do this Better[tm]..maybe even make this a container holding
+      // a label like in GTK+??
+      mvaddnstr(0, 0, out.c_str(), out.size());
+    }
 }
 
 void vs_button::dispatch_mouse(short id, int x, int y, int z, mmask_t bmask)
@@ -77,10 +130,12 @@
 
 int vs_button::width_request()
 {
-  return label.size()+4;
+  return label->max_width(0, 0)+4;
 }
 
 int vs_button::height_request(int width)
 {
-  return 1;
+  size_t label_width=(width>=4)?width-4:0;
+
+  return label->layout(label_width, label_width).size();
 }

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vs_button.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vs_button.h	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vs_button.h	Wed Apr 27 01:06:26 2005
@@ -12,17 +12,34 @@
 
 #include <string>
 
+class fragment;
+
+/** This class represents a push-button. */
 class vs_button:public vscreen_widget
 {
-  std::string label;
+  fragment *label;
 
   void accept_focus();
   void lose_focus();
 
 protected:
   bool handle_char(chtype ch);
+  fragment *get_label() const {return label;}
 public:
-  vs_button(std::string _label);
+  /** Instantiate a vs_button.
+   *
+   *  \param _label the new label of this button; the button is
+   *  responsible for deleting it.
+   */
+  vs_button(fragment *_label);
+
+  /** Instantiate a vs_button.
+   *
+   *  \param _label the new label of this button; it will be placed
+   *  inside a simple text_fragment.
+   */
+  vs_button(const std::string &_label);
+  ~vs_button();
 
   void paint();
 
@@ -34,8 +51,7 @@
   int height_request(int width);
   void dispatch_mouse(short id, int x, int y, int z, mmask_t bmask);
 
-  std::string get_label() {return label;}
-  void set_label(std::string _label) {label=_label;}
+  void set_label(const fragment *_label);
 
   // Signals:
 

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vs_togglebutton.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vs_togglebutton.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vs_togglebutton.cc	Wed Apr 27 01:06:26 2005
@@ -3,29 +3,62 @@
 #include "vscreen.h"
 #include "vs_togglebutton.h"
 
-void vs_togglebutton::paint()
+#include "fragment.h"
+
+vs_togglebutton::vs_togglebutton(char _bracketl, char _mark, char _bracketr,
+				 fragment *_label, bool _checked)
+:vs_button(_label), checked(_checked),
+ bracketl(_bracketl), mark(_mark), bracketr(_bracketr)
 {
-  mvaddch(0, 0, bracketl);
+}
 
-  if(get_isfocussed())
-    {
-      bkgdset(get_bg()^A_REVERSE);
-      attrset(get_bg()^A_REVERSE);
-    }
+vs_togglebutton::vs_togglebutton(char _bracketl, char _mark, char _bracketr,
+				 const std::string &_label, bool _checked)
+:vs_button(_label), checked(_checked),
+ bracketl(_bracketl), mark(_mark), bracketr(_bracketr)
+{
+}
+
+void vs_togglebutton::paint_check()
+{
+  mvaddch(0, 0, bracketl);
 
   if(checked)
     addch(mark);
   else
     addch(' ');
+}
+
+void vs_togglebutton::paint()
+{
+  const size_t labelw=getmaxx()>=4?getmaxx()-4:0;
+  const fragment_contents lines=get_label()->layout(labelw, labelw);
+  const size_t checkheight=lines.size()/2;
 
-  if(get_isfocussed())
+  for(size_t i=0; i<lines.size(); ++i)
     {
-      bkgdset(get_bg());
-      attrset(get_bg());
-    }
+      if(get_isfocussed())
+	{
+	  bkgdset(get_bg()^A_REVERSE);
+	  attrset(get_bg()^A_REVERSE);
+	}
+
+      if(i==checkheight)
+	paint_check();
+      else
+	{
+	  for(int j=0; j<4; ++j)
+	    mvaddch(i, j, ' ');
+	}
+
+      if(get_isfocussed())
+	{
+	  bkgdset(get_bg());
+	  attrset(get_bg());
+	}
 
-  std::string out=bracketr+std::string(" ")+get_label();
-  addnstr(out.c_str(), out.size());
+      addstr(lines[i]);
+    }
 }
 
 void vs_togglebutton::do_toggle()

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vs_togglebutton.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vs_togglebutton.h	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vs_togglebutton.h	Wed Apr 27 01:06:26 2005
@@ -15,6 +15,8 @@
   bool checked;
   char bracketl, mark, bracketr;
 
+  void paint_check();
+
 protected:
   void silent_set_checked(bool _checked);
   // to be used mainly to avoid emitting signals (eg, if you're trying to
@@ -22,11 +24,10 @@
 
 public:
   vs_togglebutton(char _bracketl, char _mark, char _bracketr,
-		  std::string _label, bool _checked=false)
-    :vs_button(_label), checked(_checked),
-     bracketl(_bracketl), mark(_mark), bracketr(_bracketr)
-  {
-  }
+		  fragment *_label, bool _checked=false);
+
+  vs_togglebutton(char _bracketl, char _mark, char _bracketr,
+		  const std::string &_label, bool _checked=false);
 
   void paint();
 
@@ -46,14 +47,27 @@
 class vs_checkbutton:public vs_togglebutton
 {
 public:
-  vs_checkbutton(std::string _label, bool _checked=false)
+  vs_checkbutton(fragment *_label, bool _checked=false)
+    :vs_togglebutton('[', 'X', ']', _label, _checked)
+  {
+    pressed.connect(sigc::mem_fun(*this, &vs_togglebutton::do_toggle));
+  }
+
+  vs_checkbutton(const std::string &_label, bool _checked=false)
     :vs_togglebutton('[', 'X', ']', _label, _checked)
   {
     pressed.connect(sigc::mem_fun(*this, &vs_togglebutton::do_toggle));
   }
 
   vs_checkbutton(char bracketr, char mark, char bracketl,
-		 std::string _label, bool _checked=false)
+		 fragment *_label, bool _checked=false)
+    :vs_togglebutton(bracketr, mark, bracketl, _label, _checked)
+  {
+    pressed.connect(sigc::mem_fun(*this, &vs_togglebutton::do_toggle));
+  }
+
+  vs_checkbutton(char bracketr, char mark, char bracketl,
+		 const std::string &_label, bool _checked=false)
     :vs_togglebutton(bracketr, mark, bracketl, _label, _checked)
   {
     pressed.connect(sigc::mem_fun(*this, &vs_togglebutton::do_toggle));
@@ -63,7 +77,12 @@
 class vs_radiobutton:public vs_togglebutton
 {
 public:
-  vs_radiobutton(std::string _label, bool _checked=false)
+  vs_radiobutton(fragment *_label, bool _checked=false)
+    :vs_togglebutton('(', '*', ')', _label, _checked)
+  {
+  }
+
+  vs_radiobutton(const std::string &_label, bool _checked=false)
     :vs_togglebutton('(', '*', ')', _label, _checked)
   {
   }