Ticket #3060: live update the panels size when editing layout.

Update the panel split display while adjusting the layout dialog,
because the user should not be expected to know what number of columns
or rows is reasonable without being able to see the effects. Cancel
reverts previous settings.

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
Avi Kelman 2013-08-24 16:00:25 -04:00 committed by Andrew Borodin
parent eb7388db20
commit a8101d8403

View File

@ -10,6 +10,7 @@
Miguel de Icaza, 1995 Miguel de Icaza, 1995
Andrew Borodin <aborodin@vmail.ru>, 2011, 2012, 2013 Andrew Borodin <aborodin@vmail.ru>, 2011, 2012, 2013
Slava Zanko <slavazanko@gmail.com>, 2013 Slava Zanko <slavazanko@gmail.com>, 2013
Avi Kelman <patcherton.fixesthings@gmail.com>, 2013
This file is part of the Midnight Commander. This file is part of the Midnight Commander.
@ -146,7 +147,6 @@ static panels_layout_t old_layout;
static int old_output_lines; static int old_output_lines;
/* Internal variables */ /* Internal variables */
panels_layout_t _panels_layout;
static int equal_split; static int equal_split;
static int _menubar_visible; static int _menubar_visible;
static int _output_lines; static int _output_lines;
@ -227,28 +227,27 @@ update_split (const WDialog * h)
{ {
/* Check split has to be done before testing if it changed, since /* Check split has to be done before testing if it changed, since
it can change due to calling check_split() as well */ it can change due to calling check_split() as well */
check_split (&_panels_layout); check_split (&panels_layout);
old_layout = _panels_layout;
if (_panels_layout.horizontal_split) if (panels_layout.horizontal_split)
check_options[0].widget->state = _panels_layout.horizontal_equal ? 1 : 0; check_options[0].widget->state = panels_layout.horizontal_equal ? 1 : 0;
else else
check_options[0].widget->state = _panels_layout.vertical_equal ? 1 : 0; check_options[0].widget->state = panels_layout.vertical_equal ? 1 : 0;
widget_redraw (WIDGET (check_options[0].widget)); widget_redraw (WIDGET (check_options[0].widget));
tty_setcolor (check_options[0].widget->state & C_BOOL ? DISABLED_COLOR : COLOR_NORMAL); tty_setcolor (check_options[0].widget->state & C_BOOL ? DISABLED_COLOR : COLOR_NORMAL);
widget_move (h, 6, 5); widget_move (h, 6, 5);
if (_panels_layout.horizontal_split) if (panels_layout.horizontal_split)
tty_printf ("%03d", _panels_layout.top_panel_size); tty_printf ("%03d", panels_layout.top_panel_size);
else else
tty_printf ("%03d", _panels_layout.left_panel_size); tty_printf ("%03d", panels_layout.left_panel_size);
widget_move (h, 6, 17); widget_move (h, 6, 17);
if (_panels_layout.horizontal_split) if (panels_layout.horizontal_split)
tty_printf ("%03d", height - _panels_layout.top_panel_size); tty_printf ("%03d", height - panels_layout.top_panel_size);
else else
tty_printf ("%03d", COLS - _panels_layout.left_panel_size); tty_printf ("%03d", COLS - panels_layout.left_panel_size);
widget_move (h, 6, 12); widget_move (h, 6, 12);
tty_print_char ('='); tty_print_char ('=');
@ -263,20 +262,22 @@ b_left_right_cback (WButton * button, int action)
if (button == bleft_widget) if (button == bleft_widget)
{ {
if (_panels_layout.horizontal_split) if (panels_layout.horizontal_split)
_panels_layout.top_panel_size++; panels_layout.top_panel_size++;
else else
_panels_layout.left_panel_size++; panels_layout.left_panel_size++;
} }
else else
{ {
if (_panels_layout.horizontal_split) if (panels_layout.horizontal_split)
_panels_layout.top_panel_size--; panels_layout.top_panel_size--;
else else
_panels_layout.left_panel_size--; panels_layout.left_panel_size--;
} }
update_split (WIDGET (button)->owner); update_split (WIDGET (button)->owner);
layout_change ();
do_refresh ();
return 0; return 0;
} }
@ -320,10 +321,6 @@ layout_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *
update everything */ update everything */
dlg_default_repaint (h); dlg_default_repaint (h);
old_layout.horizontal_split = -1;
old_layout.left_panel_size = -1;
old_layout.top_panel_size = -1;
old_output_lines = -1; old_output_lines = -1;
update_split (h); update_split (h);
@ -355,7 +352,7 @@ layout_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *
_output_lines = 0; _output_lines = 0;
height = LINES - _keybar_visible - (_command_prompt ? 1 : 0) - height = LINES - _keybar_visible - (_command_prompt ? 1 : 0) -
_menubar_visible - _output_lines - _message_visible; _menubar_visible - _output_lines - _message_visible;
minimum = MINHEIGHT * (1 + _panels_layout.horizontal_split); minimum = MINHEIGHT * (1 + panels_layout.horizontal_split);
if (height < minimum) if (height < minimum)
{ {
_output_lines -= minimum - height; _output_lines -= minimum - height;
@ -378,23 +375,27 @@ layout_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *
case MSG_ACTION: case MSG_ACTION:
if (sender == WIDGET (radio_widget)) if (sender == WIDGET (radio_widget))
{ {
if (_panels_layout.horizontal_split != radio_widget->sel) if (panels_layout.horizontal_split != radio_widget->sel)
{ {
_panels_layout.horizontal_split = radio_widget->sel; panels_layout.horizontal_split = radio_widget->sel;
if (_panels_layout.horizontal_split) if (panels_layout.horizontal_split)
{ {
if (_panels_layout.horizontal_equal) if (panels_layout.horizontal_equal)
_panels_layout.top_panel_size = height / 2; panels_layout.top_panel_size = height / 2;
} }
else else
{ {
if (_panels_layout.vertical_equal) if (panels_layout.vertical_equal)
_panels_layout.left_panel_size = COLS / 2; panels_layout.left_panel_size = COLS / 2;
} }
}
update_split (h); update_split (h);
layout_change ();
do_refresh ();
}
else
update_split (h);
return MSG_HANDLED; return MSG_HANDLED;
} }
@ -403,21 +404,23 @@ layout_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *
{ {
int eq; int eq;
if (_panels_layout.horizontal_split) if (panels_layout.horizontal_split)
{ {
_panels_layout.horizontal_equal = check_options[0].widget->state & C_BOOL; panels_layout.horizontal_equal = check_options[0].widget->state & C_BOOL;
eq = _panels_layout.horizontal_equal; eq = panels_layout.horizontal_equal;
} }
else else
{ {
_panels_layout.vertical_equal = check_options[0].widget->state & C_BOOL; panels_layout.vertical_equal = check_options[0].widget->state & C_BOOL;
eq = _panels_layout.vertical_equal; eq = panels_layout.vertical_equal;
} }
widget_disable (WIDGET (bleft_widget), eq); widget_disable (WIDGET (bleft_widget), eq);
widget_disable (WIDGET (bright_widget), eq); widget_disable (WIDGET (bright_widget), eq);
update_split (h); update_split (h);
layout_change ();
do_refresh ();
return MSG_HANDLED; return MSG_HANDLED;
} }
@ -454,18 +457,12 @@ init_layout (void)
output_lines_label = _("Output lines:"); output_lines_label = _("Output lines:");
/* save old params */ /* save old params */
_panels_layout = panels_layout;
_menubar_visible = menubar_visible; _menubar_visible = menubar_visible;
_command_prompt = command_prompt; _command_prompt = command_prompt;
_keybar_visible = mc_global.keybar_visible; _keybar_visible = mc_global.keybar_visible;
_message_visible = mc_global.message_visible; _message_visible = mc_global.message_visible;
_xterm_title = xterm_title; _xterm_title = xterm_title;
_free_space = free_space; _free_space = free_space;
old_layout.horizontal_split = -1;
old_layout.left_panel_size = -1;
old_layout.top_panel_size = -1;
old_output_lines = -1; old_output_lines = -1;
_output_lines = output_lines; _output_lines = output_lines;
@ -642,8 +639,9 @@ void
layout_box (void) layout_box (void)
{ {
WDialog *layout_dlg; WDialog *layout_dlg;
gboolean layout_do_change = FALSE;
old_layout = panels_layout;
old_output_lines = output_lines;
layout_dlg = init_layout (); layout_dlg = init_layout ();
if (dlg_run (layout_dlg) == B_ENTER) if (dlg_run (layout_dlg) == B_ENTER)
@ -653,25 +651,18 @@ layout_box (void)
for (i = 0; i < (size_t) LAYOUT_OPTIONS_COUNT; i++) for (i = 0; i < (size_t) LAYOUT_OPTIONS_COUNT; i++)
if (check_options[i].widget != NULL) if (check_options[i].widget != NULL)
*check_options[i].variable = check_options[i].widget->state & C_BOOL; *check_options[i].variable = check_options[i].widget->state & C_BOOL;
}
panels_layout.horizontal_split = radio_widget->sel; else
if (panels_layout.horizontal_split) {
{ /* restore layout */
panels_layout.horizontal_equal = *check_options[0].variable; panels_layout = old_layout;
panels_layout.top_panel_size = _panels_layout.top_panel_size; output_lines = old_output_lines;
} update_split (layout_dlg);
else
{
panels_layout.vertical_equal = *check_options[0].variable;
panels_layout.left_panel_size = _panels_layout.left_panel_size;
}
output_lines = _output_lines;
layout_do_change = TRUE;
} }
dlg_destroy (layout_dlg); dlg_destroy (layout_dlg);
if (layout_do_change) layout_change ();
layout_change (); do_refresh ();
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */