kopia lustrzana https://github.com/jamescoxon/dl-fldigi
Change FText menu handling
* Reorder menu enums and menu callback switch statements * Move context menu handling to separate functions * Show Serial, X1, X2 and X3 menu items only when the contest fields are displayed * Unclutter the RX text context menu by hiding the various Call...RST(r) menu items by default; add a toggle button to show them * Fix Transmit/Abort menu item kludgepull/2/head
rodzic
a9459df7b9
commit
f524c3fc65
|
@ -115,19 +115,18 @@ public:
|
|||
|
||||
protected:
|
||||
enum { RX_MENU_QRZ_THIS, RX_MENU_CALL, RX_MENU_NAME, RX_MENU_QTH,
|
||||
RX_MENU_STATE, RX_MENU_PROVINCE,
|
||||
RX_MENU_COUNTRY, RX_MENU_LOC, RX_MENU_RST_IN,
|
||||
RX_MENU_SERIAL, RX_MENU_X1, RX_MENU_X2, RX_MENU_X3,
|
||||
RX_MENU_DIV, RX_MENU_COPY,
|
||||
RX_MENU_CLEAR, RX_MENU_SELECT_ALL,
|
||||
RX_MENU_STATE, RX_MENU_PROVINCE,RX_MENU_COUNTRY, RX_MENU_LOC,
|
||||
RX_MENU_RST_IN, RX_MENU_SERIAL, RX_MENU_X1, RX_MENU_X2, RX_MENU_X3,
|
||||
RX_MENU_DIV, RX_MENU_COPY, RX_MENU_CLEAR, RX_MENU_SELECT_ALL,
|
||||
#if 0 //#ifndef NDEBUG
|
||||
RX_MENU_READ,
|
||||
#endif
|
||||
RX_MENU_SAVE, RX_MENU_WRAP };
|
||||
RX_MENU_SAVE, RX_MENU_QUICK_ENTRY, RX_MENU_WRAP };
|
||||
|
||||
void handle_clickable(int x, int y);
|
||||
void handle_qsy(int start, int end);
|
||||
void handle_qso_data(int start, int end);
|
||||
void handle_context_menu(void);
|
||||
virtual void menu_cb(int val);
|
||||
static void changed_cb(int pos, int nins, int ndel, int nsty,
|
||||
const char *dtext, void *arg);
|
||||
|
@ -166,8 +165,8 @@ public:
|
|||
int nextChar(void);
|
||||
|
||||
protected:
|
||||
enum { TX_MENU_TX, TX_MENU_RX, TX_MENU_MFSK16_IMG, TX_MENU_CLEAR,
|
||||
TX_MENU_CUT, TX_MENU_COPY, TX_MENU_PASTE, TX_MENU_READ,
|
||||
enum { TX_MENU_TX, TX_MENU_ABORT, TX_MENU_RX, TX_MENU_MFSK16_IMG,
|
||||
TX_MENU_CLEAR, TX_MENU_CUT, TX_MENU_COPY, TX_MENU_PASTE, TX_MENU_READ,
|
||||
TX_MENU_WRAP
|
||||
};
|
||||
int handle_key(int key);
|
||||
|
@ -175,6 +174,7 @@ protected:
|
|||
int handle_key_ascii(int key);
|
||||
int handle_dnd_drag(void);
|
||||
int handle_dnd_drop(void);
|
||||
void handle_context_menu(void);
|
||||
virtual void menu_cb(int val);
|
||||
static void changed_cb(int pos, int nins, int ndel, int nsty,
|
||||
const char *dtext, void *arg);
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
#include "dxcc.h"
|
||||
#include "locator.h"
|
||||
#include "logsupport.h"
|
||||
#include "status.h"
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
|
@ -394,7 +395,7 @@ void FTextBase::reset_styles(int set)
|
|||
#endif
|
||||
|
||||
Fl_Menu_Item FTextView::view_menu[] = {
|
||||
{ make_icon_label(LOOKUP_SYMBOL "&Look up call", net_icon), 0, 0, 0, 0, _FL_MULTI_LABEL },
|
||||
{ make_icon_label(LOOKUP_SYMBOL "&Look up call", net_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL },
|
||||
{ make_icon_label(ENTER_SYMBOL "&Call", enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL },
|
||||
{ make_icon_label(ENTER_SYMBOL "&Name", enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL },
|
||||
{ make_icon_label(ENTER_SYMBOL "QT&H", enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL },
|
||||
|
@ -415,6 +416,7 @@ Fl_Menu_Item FTextView::view_menu[] = {
|
|||
{ "(debug) &Append file...", 0, 0, 0, FL_MENU_DIVIDER, FL_NORMAL_LABEL },
|
||||
#endif
|
||||
{ make_icon_label("Save &as...", save_as_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL },
|
||||
{ "Quick entry", 0, 0, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL },
|
||||
{ "Word &wrap", 0, 0, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL },
|
||||
{ 0 }
|
||||
};
|
||||
|
@ -442,10 +444,12 @@ FTextView::FTextView(int x, int y, int w, int h, const char *l)
|
|||
// disable some keybindings that are not allowed in FTextView buffers
|
||||
change_keybindings();
|
||||
|
||||
if (!view_init)
|
||||
if (!view_init) {
|
||||
for (int i = 0; i < view_menu->size() - 1; i++)
|
||||
if (view_menu[i].labeltype() == _FL_MULTI_LABEL)
|
||||
set_icon_label(&view_menu[i]);
|
||||
view_menu[RX_MENU_QUICK_ENTRY].clear();
|
||||
}
|
||||
view_init = true;
|
||||
}
|
||||
|
||||
|
@ -484,24 +488,11 @@ int FTextView::handle(int event)
|
|||
handle_qso_data(Fl::event_x() - x(), Fl::event_y() - y());
|
||||
return 1;
|
||||
case FL_RIGHT_MOUSE:
|
||||
break;
|
||||
handle_context_menu();
|
||||
return 1;
|
||||
default:
|
||||
goto out;
|
||||
}
|
||||
|
||||
// mouse-3 handling: enable/disable menu items and display popup
|
||||
set_active(&view_menu[RX_MENU_COPY], tbuf->selected());
|
||||
set_active(&view_menu[RX_MENU_CLEAR], tbuf->length());
|
||||
set_active(&view_menu[RX_MENU_SELECT_ALL], tbuf->length());
|
||||
set_active(&view_menu[RX_MENU_SAVE], tbuf->length());
|
||||
if (wrap)
|
||||
view_menu[RX_MENU_WRAP].flags |= FL_MENU_VALUE;
|
||||
else
|
||||
view_menu[RX_MENU_WRAP].flags &= ~FL_MENU_VALUE;
|
||||
|
||||
context_menu = progdefaults.QRZ ? view_menu : view_menu + 1;
|
||||
show_context_menu();
|
||||
return 1;
|
||||
break;
|
||||
case FL_DRAG:
|
||||
if (Fl::event_button() != FL_LEFT_MOUSE)
|
||||
|
@ -696,15 +687,43 @@ void FTextView::handle_qso_data(int start, int end)
|
|||
free(s);
|
||||
}
|
||||
|
||||
void FTextView::handle_context_menu(void)
|
||||
{
|
||||
// toggle visibility of quick entry items
|
||||
bool v;
|
||||
v = view_menu[RX_MENU_QUICK_ENTRY].value();
|
||||
for (size_t i = RX_MENU_CALL; i <= RX_MENU_RST_IN; i++)
|
||||
v ? view_menu[i].show() : view_menu[i].hide();
|
||||
|
||||
set_active(&view_menu[RX_MENU_COPY], tbuf->selected());
|
||||
set_active(&view_menu[RX_MENU_CLEAR], tbuf->length());
|
||||
set_active(&view_menu[RX_MENU_SELECT_ALL], tbuf->length());
|
||||
set_active(&view_menu[RX_MENU_SAVE], tbuf->length());
|
||||
if (wrap)
|
||||
view_menu[RX_MENU_WRAP].set();
|
||||
else
|
||||
view_menu[RX_MENU_WRAP].clear();
|
||||
|
||||
// toggle visibility of contest items
|
||||
for (size_t i = RX_MENU_SERIAL; i <= RX_MENU_X3; i++)
|
||||
if (progStatus.contest)
|
||||
view_menu[i].show();
|
||||
else
|
||||
view_menu[i].hide();
|
||||
|
||||
if (progdefaults.QRZ != QRZNONE)
|
||||
view_menu[RX_MENU_QRZ_THIS].show();
|
||||
else
|
||||
view_menu[RX_MENU_QRZ_THIS].hide();
|
||||
show_context_menu();
|
||||
}
|
||||
|
||||
/// The context menu handler
|
||||
///
|
||||
/// @param val
|
||||
///
|
||||
void FTextView::menu_cb(int val)
|
||||
{
|
||||
if (progdefaults.QRZ == 0)
|
||||
++val;
|
||||
|
||||
Fl_Input* input = 0;
|
||||
switch (val) {
|
||||
case RX_MENU_QRZ_THIS:
|
||||
|
@ -727,19 +746,19 @@ void FTextView::menu_cb(int val)
|
|||
case RX_MENU_PROVINCE:
|
||||
input = inpVEprov;
|
||||
break;
|
||||
case RX_MENU_SERIAL:
|
||||
input = inpSerNo;
|
||||
case RX_MENU_COUNTRY:
|
||||
input = inpCountry;
|
||||
break;
|
||||
case RX_MENU_LOC:
|
||||
input = inpLoc;
|
||||
break;
|
||||
case RX_MENU_COUNTRY:
|
||||
input = inpCountry;
|
||||
break;
|
||||
|
||||
case RX_MENU_RST_IN:
|
||||
input = inpRstIn;
|
||||
break;
|
||||
|
||||
case RX_MENU_SERIAL:
|
||||
input = inpSerNo;
|
||||
break;
|
||||
case RX_MENU_X1:
|
||||
input = inpXchg1;
|
||||
break;
|
||||
|
@ -780,8 +799,12 @@ void FTextView::menu_cb(int val)
|
|||
saveFile();
|
||||
break;
|
||||
|
||||
case RX_MENU_QUICK_ENTRY:
|
||||
view_menu[val].flags ^= FL_MENU_VALUE;
|
||||
break;
|
||||
|
||||
case RX_MENU_WRAP:
|
||||
view_menu[RX_MENU_WRAP].flags ^= FL_MENU_VALUE;
|
||||
view_menu[val].flags ^= FL_MENU_VALUE;
|
||||
wrap_mode((wrap = !wrap), wrap_col);
|
||||
show_insert_position();
|
||||
break;
|
||||
|
@ -912,7 +935,8 @@ void FTextView::dxcc_tooltip(void* obj)
|
|||
|
||||
|
||||
Fl_Menu_Item FTextEdit::edit_menu[] = {
|
||||
{ "txabort" },
|
||||
{ make_icon_label("&Transmit", tx_icon), 0, 0, 0, 0, _FL_MULTI_LABEL },
|
||||
{ make_icon_label("&Abort", process_stop_icon), 0, 0, 0, 0, _FL_MULTI_LABEL },
|
||||
{ make_icon_label("&Receive", rx_icon), 0, 0, 0, 0, _FL_MULTI_LABEL },
|
||||
{ make_icon_label("Send &image...", image_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL },
|
||||
{ make_icon_label("C&lear", edit_clear_icon), 0, 0, 0, 0, _FL_MULTI_LABEL },
|
||||
|
@ -923,11 +947,6 @@ Fl_Menu_Item FTextEdit::edit_menu[] = {
|
|||
{ "Word &wrap", 0, 0, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL } ,
|
||||
{ 0 }
|
||||
};
|
||||
Fl_Menu_Item edit_txabort[] = {
|
||||
{ make_icon_label("&Transmit", tx_icon), 0, 0, 0, 0, _FL_MULTI_LABEL },
|
||||
{ make_icon_label("&Abort", process_stop_icon), 0, 0, 0, 0, _FL_MULTI_LABEL },
|
||||
{ 0 }
|
||||
};
|
||||
static bool edit_init = false;
|
||||
|
||||
// needed by our static kf functions, which may restrict editing depending on
|
||||
|
@ -953,9 +972,6 @@ FTextEdit::FTextEdit(int x, int y, int w, int h, const char *l)
|
|||
for (int i = 0; i < edit_menu->size() - 1; i++)
|
||||
if (edit_menu[i].labeltype() == _FL_MULTI_LABEL)
|
||||
set_icon_label(&edit_menu[i]);
|
||||
for (int i = 0; i < edit_txabort->size() - 1; i++)
|
||||
if (edit_txabort[i].labeltype() == _FL_MULTI_LABEL)
|
||||
set_icon_label(&edit_txabort[i]);
|
||||
}
|
||||
edit_init = true;
|
||||
}
|
||||
|
@ -995,40 +1011,18 @@ int FTextEdit::handle(int event)
|
|||
case FL_PUSH:
|
||||
{
|
||||
int eb = Fl::event_button();
|
||||
if (eb == FL_RIGHT_MOUSE)
|
||||
break;
|
||||
if (eb == FL_RIGHT_MOUSE) {
|
||||
handle_context_menu();
|
||||
return 1;
|
||||
}
|
||||
else if (eb == FL_MIDDLE_MOUSE && xy_to_position(Fl::event_x(), Fl::event_y(), CHARACTER_POS) < txpos)
|
||||
return 1; // ignore mouse2 text pastes inside the transmitted text
|
||||
}
|
||||
default:
|
||||
return FTextBase::handle(event);
|
||||
break;
|
||||
}
|
||||
|
||||
// handle a right click
|
||||
if (trx_state == STATE_RX)
|
||||
memcpy(&edit_menu[TX_MENU_TX], &edit_txabort[0], sizeof(edit_menu[TX_MENU_TX]));
|
||||
else
|
||||
memcpy(&edit_menu[TX_MENU_TX], &edit_txabort[1], sizeof(edit_menu[TX_MENU_TX]));
|
||||
set_active(&edit_menu[TX_MENU_TX], wf->xmtrcv->active());
|
||||
|
||||
set_active(&edit_menu[TX_MENU_RX], trx_state != STATE_RX);
|
||||
|
||||
bool modify_text_ok = insert_position() >= txpos;
|
||||
bool selected = tbuf->selected();
|
||||
set_active(&edit_menu[TX_MENU_MFSK16_IMG], active_modem->get_cap() & modem::CAP_IMG);
|
||||
set_active(&edit_menu[TX_MENU_CLEAR], tbuf->length());
|
||||
set_active(&edit_menu[TX_MENU_CUT], selected && modify_text_ok);
|
||||
set_active(&edit_menu[TX_MENU_COPY], selected);
|
||||
set_active(&edit_menu[TX_MENU_PASTE], modify_text_ok);
|
||||
set_active(&edit_menu[TX_MENU_READ], modify_text_ok);
|
||||
|
||||
if (wrap)
|
||||
edit_menu[TX_MENU_WRAP].flags |= FL_MENU_VALUE;
|
||||
else
|
||||
edit_menu[TX_MENU_WRAP].flags &= ~FL_MENU_VALUE;
|
||||
|
||||
show_context_menu();
|
||||
return 1;
|
||||
return FTextBase::handle(event);
|
||||
}
|
||||
|
||||
/// @see FTextView::add
|
||||
|
@ -1128,8 +1122,8 @@ int FTextEdit::handle_key(int key)
|
|||
{
|
||||
static time_t t[2] = { 0, 0 };
|
||||
static unsigned char i = 0;
|
||||
if (t[i] == time(&t[!i])) { // two presses in a second: reset modem
|
||||
abort_tx();
|
||||
if (t[i] == time(&t[!i])) { // two presses in a second: abort transmission
|
||||
menu_cb(TX_MENU_ABORT);
|
||||
t[i = !i] = 0;
|
||||
return 1;
|
||||
}
|
||||
|
@ -1354,6 +1348,43 @@ int FTextEdit::handle_dnd_drop(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
/// Handles mouse-3 clicks by displaying the context menu
|
||||
///
|
||||
/// @param val
|
||||
///
|
||||
void FTextEdit::handle_context_menu(void)
|
||||
{
|
||||
// adjust Abort/Transmit/Receive menu items
|
||||
switch (trx_state) {
|
||||
case STATE_TX: case STATE_TUNE:
|
||||
edit_menu[TX_MENU_TX].hide();
|
||||
edit_menu[TX_MENU_ABORT].show();
|
||||
set_active(&edit_menu[TX_MENU_RX], true);
|
||||
break;
|
||||
default:
|
||||
edit_menu[TX_MENU_TX].show();
|
||||
edit_menu[TX_MENU_ABORT].hide();
|
||||
set_active(&edit_menu[TX_MENU_RX], false);
|
||||
break;
|
||||
}
|
||||
|
||||
bool modify_text_ok = insert_position() >= txpos;
|
||||
bool selected = tbuf->selected();
|
||||
set_active(&edit_menu[TX_MENU_MFSK16_IMG], active_modem->get_cap() & modem::CAP_IMG);
|
||||
set_active(&edit_menu[TX_MENU_CLEAR], tbuf->length());
|
||||
set_active(&edit_menu[TX_MENU_CUT], selected && modify_text_ok);
|
||||
set_active(&edit_menu[TX_MENU_COPY], selected);
|
||||
set_active(&edit_menu[TX_MENU_PASTE], modify_text_ok);
|
||||
set_active(&edit_menu[TX_MENU_READ], modify_text_ok);
|
||||
|
||||
if (wrap)
|
||||
edit_menu[TX_MENU_WRAP].set();
|
||||
else
|
||||
edit_menu[TX_MENU_WRAP].clear();
|
||||
|
||||
show_context_menu();
|
||||
}
|
||||
|
||||
/// The context menu handler
|
||||
///
|
||||
/// @param val
|
||||
|
@ -1362,16 +1393,14 @@ void FTextEdit::menu_cb(int val)
|
|||
{
|
||||
switch (val) {
|
||||
case TX_MENU_TX:
|
||||
if (trx_state == STATE_RX) {
|
||||
active_modem->set_stopflag(false);
|
||||
start_tx();
|
||||
}
|
||||
else {
|
||||
active_modem->set_stopflag(false);
|
||||
start_tx();
|
||||
break;
|
||||
case TX_MENU_ABORT:
|
||||
#ifndef NDEBUG
|
||||
put_status("Don't panic!", 1.0);
|
||||
put_status("Don't panic!", 1.0);
|
||||
#endif
|
||||
abort_tx();
|
||||
}
|
||||
abort_tx();
|
||||
break;
|
||||
case TX_MENU_RX:
|
||||
if (trx_state == STATE_TX) {
|
||||
|
@ -1587,9 +1616,9 @@ int FTextLog::handle(int event)
|
|||
set_active(&log_menu[LOG_MENU_CLEAR], tbuf->length());
|
||||
set_active(&log_menu[LOG_MENU_COPY], tbuf->selected());
|
||||
if (wrap)
|
||||
log_menu[LOG_MENU_WRAP].flags |= FL_MENU_VALUE;
|
||||
log_menu[LOG_MENU_WRAP].set();
|
||||
else
|
||||
log_menu[LOG_MENU_WRAP].flags &= ~FL_MENU_VALUE;
|
||||
log_menu[LOG_MENU_WRAP].clear();
|
||||
|
||||
show_context_menu();
|
||||
return 1;
|
||||
|
|
Ładowanie…
Reference in New Issue