[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)
{
}