From a8101d84037887121e5f1c32759a014af6aeaa6d Mon Sep 17 00:00:00 2001 From: Avi Kelman Date: Sat, 24 Aug 2013 16:00:25 -0400 Subject: [PATCH 1/2] 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 --- src/filemanager/layout.c | 111 ++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 60 deletions(-) diff --git a/src/filemanager/layout.c b/src/filemanager/layout.c index 42e34b2db..993370171 100644 --- a/src/filemanager/layout.c +++ b/src/filemanager/layout.c @@ -10,6 +10,7 @@ Miguel de Icaza, 1995 Andrew Borodin , 2011, 2012, 2013 Slava Zanko , 2013 + Avi Kelman , 2013 This file is part of the Midnight Commander. @@ -146,7 +147,6 @@ static panels_layout_t old_layout; static int old_output_lines; /* Internal variables */ -panels_layout_t _panels_layout; static int equal_split; static int _menubar_visible; 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 it can change due to calling check_split() as well */ - check_split (&_panels_layout); - old_layout = _panels_layout; + check_split (&panels_layout); - if (_panels_layout.horizontal_split) - check_options[0].widget->state = _panels_layout.horizontal_equal ? 1 : 0; + if (panels_layout.horizontal_split) + check_options[0].widget->state = panels_layout.horizontal_equal ? 1 : 0; 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)); tty_setcolor (check_options[0].widget->state & C_BOOL ? DISABLED_COLOR : COLOR_NORMAL); widget_move (h, 6, 5); - if (_panels_layout.horizontal_split) - tty_printf ("%03d", _panels_layout.top_panel_size); + if (panels_layout.horizontal_split) + tty_printf ("%03d", panels_layout.top_panel_size); else - tty_printf ("%03d", _panels_layout.left_panel_size); + tty_printf ("%03d", panels_layout.left_panel_size); widget_move (h, 6, 17); - if (_panels_layout.horizontal_split) - tty_printf ("%03d", height - _panels_layout.top_panel_size); + if (panels_layout.horizontal_split) + tty_printf ("%03d", height - panels_layout.top_panel_size); else - tty_printf ("%03d", COLS - _panels_layout.left_panel_size); + tty_printf ("%03d", COLS - panels_layout.left_panel_size); widget_move (h, 6, 12); tty_print_char ('='); @@ -263,20 +262,22 @@ b_left_right_cback (WButton * button, int action) if (button == bleft_widget) { - if (_panels_layout.horizontal_split) - _panels_layout.top_panel_size++; + if (panels_layout.horizontal_split) + panels_layout.top_panel_size++; else - _panels_layout.left_panel_size++; + panels_layout.left_panel_size++; } else { - if (_panels_layout.horizontal_split) - _panels_layout.top_panel_size--; + if (panels_layout.horizontal_split) + panels_layout.top_panel_size--; else - _panels_layout.left_panel_size--; + panels_layout.left_panel_size--; } update_split (WIDGET (button)->owner); + layout_change (); + do_refresh (); return 0; } @@ -320,10 +321,6 @@ layout_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void * update everything */ 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; update_split (h); @@ -355,7 +352,7 @@ layout_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void * _output_lines = 0; height = LINES - _keybar_visible - (_command_prompt ? 1 : 0) - _menubar_visible - _output_lines - _message_visible; - minimum = MINHEIGHT * (1 + _panels_layout.horizontal_split); + minimum = MINHEIGHT * (1 + panels_layout.horizontal_split); if (height < minimum) { _output_lines -= minimum - height; @@ -378,23 +375,27 @@ layout_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void * case MSG_ACTION: 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) - _panels_layout.top_panel_size = height / 2; + if (panels_layout.horizontal_equal) + panels_layout.top_panel_size = height / 2; } else { - if (_panels_layout.vertical_equal) - _panels_layout.left_panel_size = COLS / 2; + if (panels_layout.vertical_equal) + panels_layout.left_panel_size = COLS / 2; } - } - update_split (h); + update_split (h); + layout_change (); + do_refresh (); + } + else + update_split (h); return MSG_HANDLED; } @@ -403,21 +404,23 @@ layout_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void * { int eq; - if (_panels_layout.horizontal_split) + if (panels_layout.horizontal_split) { - _panels_layout.horizontal_equal = check_options[0].widget->state & C_BOOL; - eq = _panels_layout.horizontal_equal; + panels_layout.horizontal_equal = check_options[0].widget->state & C_BOOL; + eq = panels_layout.horizontal_equal; } else { - _panels_layout.vertical_equal = check_options[0].widget->state & C_BOOL; - eq = _panels_layout.vertical_equal; + panels_layout.vertical_equal = check_options[0].widget->state & C_BOOL; + eq = panels_layout.vertical_equal; } widget_disable (WIDGET (bleft_widget), eq); widget_disable (WIDGET (bright_widget), eq); update_split (h); + layout_change (); + do_refresh (); return MSG_HANDLED; } @@ -454,18 +457,12 @@ init_layout (void) output_lines_label = _("Output lines:"); /* save old params */ - _panels_layout = panels_layout; _menubar_visible = menubar_visible; _command_prompt = command_prompt; _keybar_visible = mc_global.keybar_visible; _message_visible = mc_global.message_visible; _xterm_title = xterm_title; _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; _output_lines = output_lines; @@ -642,8 +639,9 @@ void layout_box (void) { WDialog *layout_dlg; - gboolean layout_do_change = FALSE; + old_layout = panels_layout; + old_output_lines = output_lines; layout_dlg = init_layout (); if (dlg_run (layout_dlg) == B_ENTER) @@ -653,25 +651,18 @@ layout_box (void) for (i = 0; i < (size_t) LAYOUT_OPTIONS_COUNT; i++) if (check_options[i].widget != NULL) *check_options[i].variable = check_options[i].widget->state & C_BOOL; - - panels_layout.horizontal_split = radio_widget->sel; - if (panels_layout.horizontal_split) - { - panels_layout.horizontal_equal = *check_options[0].variable; - panels_layout.top_panel_size = _panels_layout.top_panel_size; - } - 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; + } + else + { + /* restore layout */ + panels_layout = old_layout; + output_lines = old_output_lines; + update_split (layout_dlg); } dlg_destroy (layout_dlg); - if (layout_do_change) - layout_change (); + layout_change (); + do_refresh (); } /* --------------------------------------------------------------------------------------------- */ From e5466983961984336c7de1cb308e7a0bcd0f1e4b Mon Sep 17 00:00:00 2001 From: Avi Kelman Date: Sat, 24 Aug 2013 16:08:13 -0400 Subject: [PATCH 2/2] Make layout dialog left/right arrows more coherent. Alt+Shift+Left_arrow and Alt+Shift+Right_arrow directly influence the divider position, but the < and > layout dialog buttons have the reverse effect, which is unintuitive behavior. Reverse the direction of < and > influence so that clicking left moves the divider left, and clicking right moves the divider right. Signed-off-by: Andrew Borodin --- src/filemanager/layout.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/filemanager/layout.c b/src/filemanager/layout.c index 993370171..06c660e53 100644 --- a/src/filemanager/layout.c +++ b/src/filemanager/layout.c @@ -260,7 +260,7 @@ b_left_right_cback (WButton * button, int action) { (void) action; - if (button == bleft_widget) + if (button == bright_widget) { if (panels_layout.horizontal_split) panels_layout.top_panel_size++;