Add font browser filter

* Add font browser filter method to show only variable or fixed width
    fonts
  * Display simple progress dialog when caching font types
  * Create a global font browser and remove static variables from
    various callbacks
pull/2/head
Stelios Bounanos 2010-03-18 12:39:58 +00:00
rodzic bdcca8c39f
commit 5a1cf7dd84
7 zmienionych plików z 162 dodań i 92 usunięć

Wyświetl plik

@ -25,11 +25,10 @@ static void adjust_label(Fl_Widget* w) {
w->labelcolor(fl_contrast(w->labelcolor(), w->color()));
}
static void cbRxFontBrowser(Fl_Widget* w, void* arg) {
Font_Browser *fb= (Font_Browser*)w;
Fl_Font font = fb->fontNumber();
int size = fb->fontSize();
Fl_Color color = fb->fontColor();
static void cbRxFontBrowser(Fl_Widget*, void*) {
Fl_Font font = font_browser->fontNumber();
int size = font_browser->fontSize();
Fl_Color color = font_browser->fontColor();
RxText->textfont(font);
RxText->textsize(size);
@ -44,16 +43,15 @@ static void cbRxFontBrowser(Fl_Widget* w, void* arg) {
ReceiveText->setFontSize(size);
ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV);
fb->hide();
font_browser->hide();
progdefaults.changed = true;
}
static void cbTxFontBrowser(Fl_Widget* w, void* arg) {
Font_Browser *fb= (Font_Browser*)w;
Fl_Font font = fb->fontNumber();
int size = fb->fontSize();
Fl_Color color = fb->fontColor();
static void cbTxFontBrowser(Fl_Widget*, void*) {
Fl_Font font = font_browser->fontNumber();
int size = font_browser->fontSize();
Fl_Color color = font_browser->fontColor();
TxText->textfont(font);
TxText->textsize(size);
@ -68,21 +66,20 @@ static void cbTxFontBrowser(Fl_Widget* w, void* arg) {
TransmitText->setFontSize(size);
TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV);
fb->hide();
font_browser->hide();
progdefaults.changed = true;
}
void cbWaterfallFontBrowser(Font_Browser*, void* v) {
Font_Browser *ft= (Font_Browser*)v;
Fl_Font fnt = ft->fontNumber();
int size = ft->fontSize();
void cbWaterfallFontBrowser(Fl_Widget*, void*) {
Fl_Font fnt = font_browser->fontNumber();
int size = font_browser->fontSize();
progdefaults.WaterfallFontnbr = fnt;
progdefaults.WaterfallFontsize = size;
progdefaults.changed = true;
ft->hide();
font_browser->hide();
}
Fl_Double_Window *dlgColorFont=(Fl_Double_Window *)0;
@ -390,29 +387,23 @@ Fl_Input *TxText=(Fl_Input *)0;
Fl_Button *btnRxFont=(Fl_Button *)0;
static void cb_btnRxFont(Fl_Button*, void*) {
static Font_Browser* b = 0;
if (!b) {
b = new Font_Browser;
b->fontNumber(progdefaults.RxFontnbr);
b->fontSize(progdefaults.RxFontsize);
b->fontColor(progdefaults.RxFontcolor);
b->callback(cbRxFontBrowser);
}
b->show();
font_browser->fontNumber(progdefaults.RxFontnbr);
font_browser->fontSize(progdefaults.RxFontsize);
font_browser->fontColor(progdefaults.RxFontcolor);
font_browser->fontFilter(Font_Browser::ALL_TYPES);
font_browser->callback(cbRxFontBrowser);
font_browser->show();
}
Fl_Button *btnTxFont=(Fl_Button *)0;
static void cb_btnTxFont(Fl_Button*, void*) {
static Font_Browser* b = 0;
if (!b) {
b = new Font_Browser;
b->fontNumber(progdefaults.TxFontnbr);
b->fontSize(progdefaults.TxFontsize);
b->fontColor(progdefaults.TxFontcolor);
b->callback(cbTxFontBrowser);
}
b->show();
font_browser->fontNumber(progdefaults.TxFontnbr);
font_browser->fontSize(progdefaults.TxFontsize);
font_browser->fontColor(progdefaults.TxFontcolor);
font_browser->fontFilter(Font_Browser::ALL_TYPES);
font_browser->callback(cbTxFontBrowser);
font_browser->show();
}
Fl_Button *btnXMIT=(Fl_Button *)0;
@ -715,6 +706,7 @@ Fl_Box *sql1color=(Fl_Box *)0;
Fl_Box *sql2color=(Fl_Box *)0;
Fl_Double_Window* make_colorsfonts() {
font_browser = new Font_Browser;
{ dlgColorFont = new Fl_Double_Window(375, 220, _("Colors and Fonts"));
{ btnClrFntClose = new Fl_Button(296, 190, 75, 25, _("Close"));
btnClrFntClose->callback((Fl_Callback*)cb_btnClrFntClose);

Wyświetl plik

@ -41,12 +41,11 @@ Function {adjust_label(Fl_Widget* w)} {open private return_type void
code {w->labelcolor(fl_contrast(w->labelcolor(), w->color()));} {}
}
Function {cbRxFontBrowser(Fl_Widget* w, void* arg)} {open private return_type void
Function {cbRxFontBrowser(Fl_Widget*, void*)} {open private return_type void
} {
code {Font_Browser *fb= (Font_Browser*)w;
Fl_Font font = fb->fontNumber();
int size = fb->fontSize();
Fl_Color color = fb->fontColor();
code {Fl_Font font = font_browser->fontNumber();
int size = font_browser->fontSize();
Fl_Color color = font_browser->fontColor();
RxText->textfont(font);
RxText->textsize(size);
@ -61,17 +60,16 @@ Function {cbRxFontBrowser(Fl_Widget* w, void* arg)} {open private return_type vo
ReceiveText->setFontSize(size);
ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV);
fb->hide();
font_browser->hide();
progdefaults.changed = true;} {}
}
Function {cbTxFontBrowser(Fl_Widget* w, void* arg)} {open private return_type void
Function {cbTxFontBrowser(Fl_Widget*, void*)} {open private return_type void
} {
code {Font_Browser *fb= (Font_Browser*)w;
Fl_Font font = fb->fontNumber();
int size = fb->fontSize();
Fl_Color color = fb->fontColor();
code {Fl_Font font = font_browser->fontNumber();
int size = font_browser->fontSize();
Fl_Color color = font_browser->fontColor();
TxText->textfont(font);
TxText->textsize(size);
@ -86,29 +84,29 @@ Function {cbTxFontBrowser(Fl_Widget* w, void* arg)} {open private return_type vo
TransmitText->setFontSize(size);
TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV);
fb->hide();
font_browser->hide();
progdefaults.changed = true;} {}
}
Function {cbWaterfallFontBrowser(Font_Browser*, void* v)} {open return_type void
Function {cbWaterfallFontBrowser(Fl_Widget*, void*)} {open return_type void
} {
code {Font_Browser *ft= (Font_Browser*)v;
Fl_Font fnt = ft->fontNumber();
int size = ft->fontSize();
code {Fl_Font fnt = font_browser->fontNumber();
int size = font_browser->fontSize();
progdefaults.WaterfallFontnbr = fnt;
progdefaults.WaterfallFontsize = size;
progdefaults.changed = true;
ft->hide();} {}
font_browser->hide();} {}
}
Function {make_colorsfonts()} {open
} {
code {font_browser = new Font_Browser;} {}
Fl_Window dlgColorFont {
label {Colors and Fonts} open
xywh {496 117 375 220} type Double
label {Colors and Fonts} open selected
xywh {496 125 375 220} type Double
code0 {dlgColorFont->xclass(PACKAGE_TARNAME);} visible
} {
Fl_Button btnClrFntClose {
@ -120,7 +118,7 @@ Function {make_colorsfonts()} {open
xywh {0 5 375 185}
} {
Fl_Group {} {
label {Freq Disp} open selected
label {Freq Disp} open
xywh {5 30 365 150}
} {
Fl_Box FDdisplay {
@ -439,28 +437,22 @@ progdefaults.changed = true;}
}
Fl_Button btnRxFont {
label {Rx font}
callback {static Font_Browser* b = 0;
if (!b) {
b = new Font_Browser;
b->fontNumber(progdefaults.RxFontnbr);
b->fontSize(progdefaults.RxFontsize);
b->fontColor(progdefaults.RxFontcolor);
b->callback(cbRxFontBrowser);
}
b->show();}
callback {font_browser->fontNumber(progdefaults.RxFontnbr);
font_browser->fontSize(progdefaults.RxFontsize);
font_browser->fontColor(progdefaults.RxFontcolor);
font_browser->fontFilter(Font_Browser::ALL_TYPES);
font_browser->callback(cbRxFontBrowser);
font_browser->show();}
xywh {275 50 75 20}
}
Fl_Button btnTxFont {
label {Tx font}
callback {static Font_Browser* b = 0;
if (!b) {
b = new Font_Browser;
b->fontNumber(progdefaults.TxFontnbr);
b->fontSize(progdefaults.TxFontsize);
b->fontColor(progdefaults.TxFontcolor);
b->callback(cbTxFontBrowser);
}
b->show();}
callback {font_browser->fontNumber(progdefaults.TxFontnbr);
font_browser->fontSize(progdefaults.TxFontsize);
font_browser->fontColor(progdefaults.TxFontcolor);
font_browser->fontFilter(Font_Browser::ALL_TYPES);
font_browser->callback(cbTxFontBrowser);
font_browser->show();}
xywh {275 90 75 20}
}
Fl_Button btnXMIT {

Wyświetl plik

@ -598,14 +598,12 @@ progdefaults.changed = true;
Fl_Button *btnWaterfallFont=(Fl_Button *)0;
static void cb_btnWaterfallFont(Fl_Button*, void*) {
static Font_Browser *b = (Font_Browser *)0;
if (!b) {
b = new Font_Browser;
b->fontNumber(progdefaults.WaterfallFontnbr);
b->fontSize(progdefaults.WaterfallFontsize);
}
b->callback((Fl_Callback*)cbWaterfallFontBrowser, (void*)(b));
b->show();
font_browser->fontNumber(progdefaults.WaterfallFontnbr);
font_browser->fontSize(progdefaults.WaterfallFontsize);
font_browser->fontColor(FL_FOREGROUND_COLOR);
font_browser->fontFilter(Font_Browser::ALL_TYPES);
font_browser->callback((Fl_Callback*)cbWaterfallFontBrowser);
font_browser->show();
}
Fl_Check_Button *btnViewXmtSignal=(Fl_Check_Button *)0;

Wyświetl plik

@ -754,14 +754,12 @@ progdefaults.changed = true;}
}
Fl_Button btnWaterfallFont {
label {Font...}
callback {static Font_Browser *b = (Font_Browser *)0;
if (!b) {
b = new Font_Browser;
b->fontNumber(progdefaults.WaterfallFontnbr);
b->fontSize(progdefaults.WaterfallFontsize);
}
b->callback((Fl_Callback*)cbWaterfallFontBrowser, (void*)(b));
b->show();}
callback {font_browser->fontNumber(progdefaults.WaterfallFontnbr);
font_browser->fontSize(progdefaults.WaterfallFontsize);
font_browser->fontColor(FL_FOREGROUND_COLOR);
font_browser->fontFilter(Font_Browser::ALL_TYPES);
font_browser->callback((Fl_Callback*)cbWaterfallFontBrowser);
font_browser->show();}
tooltip {Select waterfall scale font} xywh {314 252 70 24}
}
}

Wyświetl plik

@ -40,6 +40,8 @@
using namespace std;
Font_Browser* font_browser;
// Font Color selected
void Font_Browser::ColorSelect()
@ -172,11 +174,12 @@ Font_Browser::Font_Browser(int x, int y, int w, int h, const char *lbl )
fontnbr = FL_HELVETICA;;
fontsize = FL_NORMAL_SIZE; // Font Size to be used
fontcolor = FL_FOREGROUND_COLOR;
filter = ALL_TYPES;
lst_Font->value(1);
FontNameSelect();
Fl::focus(lst_Font);
//! Fl::focus(lst_Font);
xclass(PACKAGE_NAME);
}
@ -232,6 +235,86 @@ bool Font_Browser::fixed_width(Fl_Font f)
return fl_width('X') == fl_width('i');
}
#include <vector>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Progress.H>
class Progress_Window : public Fl_Double_Window
{
public:
Progress_Window(float min = 0.0f, float max = 100.0f, const char* l = 0)
: Fl_Double_Window(200, 34), ps(5, 5, 190, 24, l)
{
end();
range(min, max);
ps.align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
ps.selection_color(FL_SELECTION_COLOR);
set_modal();
callback(nop);
if (l && *l) {
fl_font(FL_HELVETICA, FL_NORMAL_SIZE);
int s = (int)(fl_width(l) + fl_width('W'));
if (s > ps.w()) {
ps.size(s, ps.h());
size(ps.w() + 10, h());
}
}
position(Fl::event_x_root() - w() / 2, Fl::event_y_root() - h());
xclass(PACKAGE_TARNAME);
show();
}
void range(float min, float max) { ps.minimum(min); ps.maximum(max); }
void value(float val) { ps.value(val); }
static void nop(Fl_Widget*, void*) { }
private:
Fl_Progress ps;
};
void Font_Browser::fontFilter(filter_t filter)
{
if (this->filter == filter)
return;
int s = lst_Font->size();
static vector<bool> fixed;
if (fixed.empty()) {
Progress_Window pw(1, s, _("Reading fonts..."));
fixed.resize(s);
for (int i = 1; i < s; i++) {
fixed[i] = fixed_width((Fl_Font)(intptr_t)(lst_Font->data(i)));
pw.value(i);
Fl::check();
}
}
switch (this->filter = filter) {
case FIXED_WIDTH:
for (int i = 1; i < s; i++) {
if (fixed[i])
lst_Font->show(i);
else
lst_Font->hide(i);
}
break;
case VARIABLE_WIDTH:
for (int i = 1; i < s; i++) {
if (!fixed[i])
lst_Font->show(i);
else
lst_Font->hide(i);
}
break;
case ALL_TYPES:
for (int i = 1; i < s; i++)
lst_Font->show(i);
break;
}
lst_Font->topline(lst_Font->value());
}
//////////////////////////////////////////////////////////////////////

Wyświetl plik

@ -5,7 +5,7 @@
#include <FL/Fl.H>
#include "font_browser.h"
void selectColorsFonts();
void cbWaterfallFontBrowser(Font_Browser*, void* v);
void cbWaterfallFontBrowser(Fl_Widget*, void*);
#include <FL/Fl_Double_Window.H>
extern Fl_Double_Window *dlgColorFont;
#include <FL/Fl_Button.H>

Wyświetl plik

@ -51,11 +51,15 @@ public:
// Font browser widget
class Font_Browser : public Fl_Window
{
public:
enum filter_t { FIXED_WIDTH, VARIABLE_WIDTH, ALL_TYPES };
private:
int numfonts;
Fl_Font fontnbr;
int fontsize;
Fl_Color fontcolor;
Fl_Color fontcolor;
filter_t filter;
void *data_;
Fl_Browser *lst_Font;
@ -88,6 +92,9 @@ public:
void fontName(const char* n);
static bool fixed_width(Fl_Font f);
void fontFilter(filter_t filter);
};
extern Font_Browser* font_browser;
#endif