kopia lustrzana https://github.com/jamescoxon/dl-fldigi
Add RX text scrollbar hints
* Add an Fl_Scrollbar subclass that can remember scroll values and draw them on the slider background * Mark the scrollbar position when entering a clickable frequency marker or logging a QSOpull/2/head
rodzic
5c82c352c3
commit
ccaaa1eb03
|
@ -1737,6 +1737,7 @@ void qsoSave_cb(Fl_Widget *b, void *)
|
|||
submit_log();
|
||||
if (progdefaults.ClearOnSave)
|
||||
clearQSO();
|
||||
ReceiveText->mark(FTextBase::XMIT);
|
||||
restoreFocus();
|
||||
}
|
||||
|
||||
|
@ -4779,6 +4780,7 @@ void note_qrg(bool no_dup, const char* prefix, const char* suffix, trx_mode mode
|
|||
if (prefix && *prefix)
|
||||
ReceiveText->add(prefix);
|
||||
ReceiveText->add(buf, FTextBase::QSY);
|
||||
ReceiveText->mark();
|
||||
if (suffix && *suffix)
|
||||
ReceiveText->add(suffix);
|
||||
}
|
||||
|
|
|
@ -16,6 +16,8 @@ public:
|
|||
|
||||
void set_quick_entry(bool b);
|
||||
bool get_quick_entry(void) { return quick_entry; }
|
||||
void mark(FTextBase::TEXT_ATTR attr = CLICK_START);
|
||||
void clear(void);
|
||||
|
||||
void setFont(Fl_Font f, int attr = NATTR);
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ public:
|
|||
|
||||
virtual int handle(int event);
|
||||
virtual void handle_context_menu(void) { }
|
||||
void clear(void) { tbuf->text(""); sbuf->text(""); }
|
||||
virtual void clear(void) { tbuf->text(""); sbuf->text(""); }
|
||||
|
||||
void set_word_wrap(bool b);
|
||||
bool get_word_wrap(void) { return wrap; }
|
||||
|
|
|
@ -69,6 +69,29 @@
|
|||
|
||||
using namespace std;
|
||||
|
||||
|
||||
// Fl_Scrollbar wrapper to draw marks on the slider background.
|
||||
// Currently only implemented for a vertical scrollbar.
|
||||
class MVScrollbar : public Fl_Scrollbar
|
||||
{
|
||||
struct mark_t {
|
||||
double pos;
|
||||
Fl_Color color;
|
||||
mark_t(double pos_, Fl_Color color_) : pos(pos_), color(color_) { }
|
||||
};
|
||||
|
||||
public:
|
||||
MVScrollbar(int X, int Y, int W, int H, const char* l = 0)
|
||||
: Fl_Scrollbar(X, Y, W, H, l) { }
|
||||
|
||||
void draw(void);
|
||||
void mark(Fl_Color c) { marks.push_back(mark_t(maximum() - 1.0, c)); }
|
||||
void clear(void) { marks.clear(); }
|
||||
|
||||
private:
|
||||
vector<mark_t> marks;
|
||||
};
|
||||
|
||||
static void show_font_warning(FTextBase* w);
|
||||
|
||||
Fl_Menu_Item FTextRX::menu[] = {
|
||||
|
@ -111,6 +134,14 @@ FTextRX::FTextRX(int x, int y, int w, int h, const char *l)
|
|||
context_menu = menu;
|
||||
init_context_menu();
|
||||
menu[RX_MENU_QUICK_ENTRY].clear();
|
||||
|
||||
// Replace the scrollbar widget
|
||||
MVScrollbar* mvsb = new MVScrollbar(mVScrollBar->x(), mVScrollBar->y(),
|
||||
mVScrollBar->w(), mVScrollBar->h(), NULL);
|
||||
mvsb->callback(mVScrollBar->callback(), mVScrollBar->user_data());
|
||||
remove(mVScrollBar);
|
||||
delete mVScrollBar;
|
||||
Fl_Group::add(mVScrollBar = mvsb);
|
||||
}
|
||||
|
||||
FTextRX::~FTextRX()
|
||||
|
@ -210,6 +241,19 @@ void FTextRX::set_quick_entry(bool b)
|
|||
menu[RX_MENU_QUICK_ENTRY].clear();
|
||||
}
|
||||
|
||||
void FTextRX::mark(FTextBase::TEXT_ATTR attr)
|
||||
{
|
||||
if (attr == NATTR)
|
||||
attr = CLICK_START;
|
||||
static_cast<MVScrollbar*>(mVScrollBar)->mark(styles[attr].color);
|
||||
}
|
||||
|
||||
void FTextRX::clear(void)
|
||||
{
|
||||
FTextBase::clear();
|
||||
static_cast<MVScrollbar*>(mVScrollBar)->clear();
|
||||
}
|
||||
|
||||
void FTextRX::setFont(Fl_Font f, int attr)
|
||||
{
|
||||
FTextBase::setFont(f, attr);
|
||||
|
@ -1050,3 +1094,45 @@ static void show_font_warning(FTextBase* w)
|
|||
*warn = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
void MVScrollbar::draw(void)
|
||||
{
|
||||
Fl_Scrollbar::draw();
|
||||
|
||||
if (marks.empty())
|
||||
return;
|
||||
|
||||
assert((type() & FL_HOR_SLIDER) == 0);
|
||||
|
||||
// Calculate the slider knob position and height. For a vertical scrollbar,
|
||||
// the scroll buttons' height is the scrollbar width and the minimum knob
|
||||
// height is half that.
|
||||
int H = h() - Fl::box_dh(box()) - 2 * w(); // internal height (minus buttons)
|
||||
int slider_h = (int)(slider_size() * H + 0.5);
|
||||
int min_h = (w() - Fl::box_dw(box())) / 2 + 1;
|
||||
if (slider_h < min_h)
|
||||
slider_h = min_h;
|
||||
double val = (Fl_Slider::value() - minimum()) / (maximum() - minimum());
|
||||
int slider_y = (int)(val * (H - slider_h) + 0.5) + w(); // relative to y()
|
||||
// This would draw a green rectangle around the slider knob:
|
||||
// fl_color(FL_GREEN);
|
||||
// fl_rect(x(), y() + slider_y, w() - Fl::box_dw(box()), slider_h);
|
||||
|
||||
int x1 = x() + Fl::box_dx(box()), x2 = x1 + w() - Fl::box_dw(box()) - 1, ypos;
|
||||
// Convert stored scrollbar values to vertical positions and draw
|
||||
// lines inside the widget if they don't overlap with the knob area.
|
||||
for (vector<mark_t>::const_iterator i = marks.begin(); i != marks.end(); ++i) {
|
||||
ypos = w() + H * i->pos / maximum();
|
||||
// Don't draw over slider knob
|
||||
if ((ypos > slider_y && ypos < slider_y + slider_h) ||
|
||||
(ypos < slider_y + slider_h && ypos > slider_y))
|
||||
continue;
|
||||
ypos += y();
|
||||
fl_color(i->color);
|
||||
fl_line(x1, ypos, x2, ypos);
|
||||
}
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue