Hi;
In another app I am writing, I BELIEVE gadgets used to come out stacked vertically. After an upgrade (to current git), I think they come out "diagonally," in that the x & y of successive gadgets increase (presumbly by the dimensions of its preceding gadget). Please find attached the simplest test program I could cons up that displays the behavior, along with a screenshot that shows the behavior.
What is the idiomatic/best way to get them to stack vertically? I messed about (again, mostly unsuccessfully, or I wouldn't be pestering you all) with various approaches, but every time I find myself with a complex solution, it turns out there is indeed a Better, Simpler Way.
Thanks,
-jm
Hello John,
question is obviously not dumb. Some cognitive problem arises from the disparity, that McCLIM provides both sheets and gadgets. If you want to lay out buttons vertically, you may either put terpri after each make-pane, or put each button in your layout (the latter is more elegant imho):
-- cut --
(in-package :clim-user)
(defun make-gadget (item) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button"))))
(define-application-frame test-gadgets () () (:panes) (:layouts (default (vertically () (make-gadget "one") (make-gadget "two") (make-gadget "three") (make-gadget "four")))))
(run-frame-top-level (make-application-frame 'test-gadgets))
-- cut --
Best regards,
Daniel
On 11.11.2017 21:07, John Morrison wrote:
Hi;
In another app I am writing, I BELIEVE gadgets used to come out stacked vertically. After an upgrade (to current git), I think they come out "diagonally," in that the x & y of successive gadgets increase (presumbly by the dimensions of its preceding gadget). Please find attached the simplest test program I could cons up that displays the behavior, along with a screenshot that shows the behavior.
What is the idiomatic/best way to get them to stack vertically? I messed about (again, mostly unsuccessfully, or I wouldn't be pestering you all) with various approaches, but every time I find myself with a complex solution, it turns out there is indeed a Better, Simpler Way.
Thanks,
-jm
Hi Daniel (and Lucien, who replied privately):
(1) thanks for the "not dumb" comment.
Sorry additionally for not being clear. The app is intended for the buttons (will eventually be checkboxes, but buttons were simpler for purposes of isolating the behavior) to be dynamic (unknown at layout time as things to be checked will come and go during program execution).
So while I did have some joy with making :list-panes with :items in the definition of the application frame (and it was prettier than what I sent), I had less joy changing those items programmatically.
When I put a "terpri" in as in the slightly revised test program as the other alternative, I get a blank line between the gadgets, which (given I am going to have a lot of items) would cause the user excess scrolling due to the whitespace between boxes.
-jm
On Sat, Nov 11, 2017 at 3:24 PM, Daniel Kochmański daniel@turtleware.eu wrote:
Hello John,
question is obviously not dumb. Some cognitive problem arises from the disparity, that McCLIM provides both sheets and gadgets. If you want to lay out buttons vertically, you may either put terpri after each make-pane, or put each button in your layout (the latter is more elegant imho):
-- cut --
(in-package :clim-user)
(defun make-gadget (item) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button"))))
(define-application-frame test-gadgets () () (:panes) (:layouts (default (vertically () (make-gadget "one") (make-gadget "two") (make-gadget "three") (make-gadget "four")))))
(run-frame-top-level (make-application-frame 'test-gadgets))
-- cut --
Best regards,
Daniel
On 11.11.2017 21:07, John Morrison wrote:
Hi;
In another app I am writing, I BELIEVE gadgets used to come out stacked vertically. After an upgrade (to current git), I think they come out "diagonally," in that the x & y of successive gadgets increase (presumbly by the dimensions of its preceding gadget). Please find attached the simplest test program I could cons up that displays the behavior, along with a screenshot that shows the behavior.
What is the idiomatic/best way to get them to stack vertically? I messed about (again, mostly unsuccessfully, or I wouldn't be pestering you all) with various approaches, but every time I find myself with a complex solution, it turns out there is indeed a Better, Simpler Way.
Thanks,
-jm
ugh - should attach what I said I attached
On Sat, Nov 11, 2017 at 3:48 PM, John Morrison jm@symbolic-simulation.com wrote:
Hi Daniel (and Lucien, who replied privately):
(1) thanks for the "not dumb" comment.
Sorry additionally for not being clear. The app is intended for the buttons (will eventually be checkboxes, but buttons were simpler for purposes of isolating the behavior) to be dynamic (unknown at layout time as things to be checked will come and go during program execution).
So while I did have some joy with making :list-panes with :items in the definition of the application frame (and it was prettier than what I sent), I had less joy changing those items programmatically.
When I put a "terpri" in as in the slightly revised test program as the other alternative, I get a blank line between the gadgets, which (given I am going to have a lot of items) would cause the user excess scrolling due to the whitespace between boxes.
-jm
On Sat, Nov 11, 2017 at 3:24 PM, Daniel Kochmański daniel@turtleware.eu wrote:
Hello John,
question is obviously not dumb. Some cognitive problem arises from the disparity, that McCLIM provides both sheets and gadgets. If you want to lay out buttons vertically, you may either put terpri after each make-pane, or put each button in your layout (the latter is more elegant imho):
-- cut --
(in-package :clim-user)
(defun make-gadget (item) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button"))))
(define-application-frame test-gadgets () () (:panes) (:layouts (default (vertically () (make-gadget "one") (make-gadget "two") (make-gadget "three") (make-gadget "four")))))
(run-frame-top-level (make-application-frame 'test-gadgets))
-- cut --
Best regards,
Daniel
On 11.11.2017 21:07, John Morrison wrote:
Hi;
In another app I am writing, I BELIEVE gadgets used to come out stacked vertically. After an upgrade (to current git), I think they come out "diagonally," in that the x & y of successive gadgets increase (presumbly by the dimensions of its preceding gadget). Please find attached the simplest test program I could cons up that displays the behavior, along with a screenshot that shows the behavior.
What is the idiomatic/best way to get them to stack vertically? I messed about (again, mostly unsuccessfully, or I wouldn't be pestering you all) with various approaches, but every time I find myself with a complex solution, it turns out there is indeed a Better, Simpler Way.
Thanks,
-jm
Alright. Fact that we start by diagonal lines looks like a bug (though I'm not 100% sure) – could you please fill out the bug report? If you know commit when it worked as you expected, that would be helpful too.
As of your problem at hand – macro vertically (and all the others) isn't limited only to layouts section, you may use it in display-gadget function too. If you need something, what will compose list in such macro, it is a matter of writing macro doing just that, like
(defmacro vertically* (options body-list) `(vertically ,options ,@body-list))
-- cut here --
(in-package :clim-user)
(define-application-frame test-gadgets () () (:panes (output :application :display-time :command-loop :display-function 'display-gadgets) (outputs :application :display-time :command-loop :display-function 'display-gadgets2)) (:layouts (default (horizontally () output outputs))))
(defmethod display-gadgets ((frame test-gadgets) stream) (dolist (item '("one" "two" "three" "four")) (with-output-as-gadget (stream) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button"))))))
(defun make-gadget (item) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button"))))
(defmethod display-gadgets2 ((frame test-gadgets) stream) (with-output-as-gadget (stream) (vertically () (make-gadget "one") (make-gadget "two") (make-gadget "three"))))
(run-frame-top-level (make-application-frame 'test-gadgets))
-- cut here --
hope this is helpful.
Regards,
Daniel
On 11.11.2017 21:49, John Morrison wrote:
ugh - should attach what I said I attached
On Sat, Nov 11, 2017 at 3:48 PM, John Morrison <jm@symbolic-simulation.com mailto:jm@symbolic-simulation.com> wrote:
Hi Daniel (and Lucien, who replied privately): (1) thanks for the "not dumb" comment. Sorry additionally for not being clear. The app is intended for the buttons (will eventually be checkboxes, but buttons were simpler for purposes of isolating the behavior) to be dynamic (unknown at layout time as things to be checked will come and go during program execution). So while I did have some joy with making :list-panes with :items in the definition of the application frame (and it was prettier than what I sent), I had less joy changing those items programmatically. When I put a "terpri" in as in the slightly revised test program as the other alternative, I get a blank line between the gadgets, which (given I am going to have a lot of items) would cause the user excess scrolling due to the whitespace between boxes. -jm On Sat, Nov 11, 2017 at 3:24 PM, Daniel Kochmański <daniel@turtleware.eu <mailto:daniel@turtleware.eu>> wrote: Hello John, question is obviously not dumb. Some cognitive problem arises from the disparity, that McCLIM provides both sheets and gadgets. If you want to lay out buttons vertically, you may either put terpri after each make-pane, or put each button in your layout (the latter is more elegant imho): -- cut -- (in-package :clim-user) (defun make-gadget (item) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button")))) (define-application-frame test-gadgets () () (:panes) (:layouts (default (vertically () (make-gadget "one") (make-gadget "two") (make-gadget "three") (make-gadget "four"))))) (run-frame-top-level (make-application-frame 'test-gadgets)) -- cut -- Best regards, Daniel On 11.11.2017 21:07, John Morrison wrote: Hi; In another app I am writing, I BELIEVE gadgets used to come out stacked vertically. After an upgrade (to current git), I think they come out "diagonally," in that the x & y of successive gadgets increase (presumbly by the dimensions of its preceding gadget). Please find attached the simplest test program I could cons up that displays the behavior, along with a screenshot that shows the behavior. What is the idiomatic/best way to get them to stack vertically? I messed about (again, mostly unsuccessfully, or I wouldn't be pestering you all) with various approaches, but every time I find myself with a complex solution, it turns out there is indeed a Better, Simpler Way. Thanks, -jm
Hey, thanks. I will get on the task of trying to find out exactly which commit changed the behavior I remember. This will, however, take me a bit to wrap my brain around checking out particular git commit versions, as I am pretty much a git lightweight.
Thanks again!
-jm
On Sat, Nov 11, 2017 at 4:06 PM, Daniel Kochmański daniel@turtleware.eu wrote:
Alright. Fact that we start by diagonal lines looks like a bug (though I'm not 100% sure) – could you please fill out the bug report? If you know commit when it worked as you expected, that would be helpful too.
As of your problem at hand – macro vertically (and all the others) isn't limited only to layouts section, you may use it in display-gadget function too. If you need something, what will compose list in such macro, it is a matter of writing macro doing just that, like
(defmacro vertically* (options body-list) `(vertically ,options ,@body-list))
-- cut here --
(in-package :clim-user)
(define-application-frame test-gadgets () () (:panes (output :application :display-time :command-loop :display-function 'display-gadgets) (outputs :application :display-time :command-loop :display-function 'display-gadgets2)) (:layouts (default (horizontally () output outputs))))
(defmethod display-gadgets ((frame test-gadgets) stream) (dolist (item '("one" "two" "three" "four")) (with-output-as-gadget (stream) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button"))))))
(defun make-gadget (item) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button"))))
(defmethod display-gadgets2 ((frame test-gadgets) stream) (with-output-as-gadget (stream) (vertically () (make-gadget "one") (make-gadget "two") (make-gadget "three"))))
(run-frame-top-level (make-application-frame 'test-gadgets))
-- cut here --
hope this is helpful.
Regards,
Daniel
On 11.11.2017 21:49, John Morrison wrote:
ugh - should attach what I said I attached
On Sat, Nov 11, 2017 at 3:48 PM, John Morrison <jm@symbolic-simulation.com
wrote:
Hi Daniel (and Lucien, who replied privately):
(1) thanks for the "not dumb" comment.
Sorry additionally for not being clear. The app is intended for the buttons (will eventually be checkboxes, but buttons were simpler for purposes of isolating the behavior) to be dynamic (unknown at layout time as things to be checked will come and go during program execution).
So while I did have some joy with making :list-panes with :items in the definition of the application frame (and it was prettier than what I sent), I had less joy changing those items programmatically.
When I put a "terpri" in as in the slightly revised test program as the other alternative, I get a blank line between the gadgets, which (given I am going to have a lot of items) would cause the user excess scrolling due to the whitespace between boxes.
-jm
On Sat, Nov 11, 2017 at 3:24 PM, Daniel Kochmański daniel@turtleware.eu wrote:
Hello John,
question is obviously not dumb. Some cognitive problem arises from the disparity, that McCLIM provides both sheets and gadgets. If you want to lay out buttons vertically, you may either put terpri after each make-pane, or put each button in your layout (the latter is more elegant imho):
-- cut --
(in-package :clim-user)
(defun make-gadget (item) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button"))))
(define-application-frame test-gadgets () () (:panes) (:layouts (default (vertically () (make-gadget "one") (make-gadget "two") (make-gadget "three") (make-gadget "four")))))
(run-frame-top-level (make-application-frame 'test-gadgets))
-- cut --
Best regards,
Daniel
On 11.11.2017 21:07, John Morrison wrote:
Hi;
In another app I am writing, I BELIEVE gadgets used to come out stacked vertically. After an upgrade (to current git), I think they come out "diagonally," in that the x & y of successive gadgets increase (presumbly by the dimensions of its preceding gadget). Please find attached the simplest test program I could cons up that displays the behavior, along with a screenshot that shows the behavior.
What is the idiomatic/best way to get them to stack vertically? I messed about (again, mostly unsuccessfully, or I wouldn't be pestering you all) with various approaches, but every time I find myself with a complex solution, it turns out there is indeed a Better, Simpler Way.
Thanks,
-jm
The behavior seems to be there for a long time and is not a bug but deliberately coded. This is made for consistency with all macros which support :move-cursor key parameter (like `surrounding-output-with-border'):
If the boolean /move-cursor/ is true (the default), then the text cursor will be moved so that it immediately follows the lower right corner of the bordered output.
So if wrapping things in `vertically' solves the issue we are all set.
Best regards, Daniel
On 11.11.2017 22:40, John Morrison wrote:
Hey, thanks. I will get on the task of trying to find out exactly which commit changed the behavior I remember. This will, however, take me a bit to wrap my brain around checking out particular git commit versions, as I am pretty much a git lightweight.
Thanks again!
-jm
On Sat, Nov 11, 2017 at 4:06 PM, Daniel Kochmański <daniel@turtleware.eu mailto:daniel@turtleware.eu> wrote:
Alright. Fact that we start by diagonal lines looks like a bug (though I'm not 100% sure) – could you please fill out the bug report? If you know commit when it worked as you expected, that would be helpful too. As of your problem at hand – macro vertically (and all the others) isn't limited only to layouts section, you may use it in display-gadget function too. If you need something, what will compose list in such macro, it is a matter of writing macro doing just that, like (defmacro vertically* (options body-list) `(vertically ,options ,@body-list)) -- cut here -- (in-package :clim-user) (define-application-frame test-gadgets () () (:panes (output :application :display-time :command-loop :display-function 'display-gadgets) (outputs :application :display-time :command-loop :display-function 'display-gadgets2)) (:layouts (default (horizontally () output outputs)))) (defmethod display-gadgets ((frame test-gadgets) stream) (dolist (item '("one" "two" "three" "four")) (with-output-as-gadget (stream) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button")))))) (defun make-gadget (item) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button")))) (defmethod display-gadgets2 ((frame test-gadgets) stream) (with-output-as-gadget (stream) (vertically () (make-gadget "one") (make-gadget "two") (make-gadget "three")))) (run-frame-top-level (make-application-frame 'test-gadgets)) -- cut here -- hope this is helpful. Regards, Daniel On 11.11.2017 21:49, John Morrison wrote:
ugh - should attach what I said I attached On Sat, Nov 11, 2017 at 3:48 PM, John Morrison <jm@symbolic-simulation.com <mailto:jm@symbolic-simulation.com>> wrote: Hi Daniel (and Lucien, who replied privately): (1) thanks for the "not dumb" comment. Sorry additionally for not being clear. The app is intended for the buttons (will eventually be checkboxes, but buttons were simpler for purposes of isolating the behavior) to be dynamic (unknown at layout time as things to be checked will come and go during program execution). So while I did have some joy with making :list-panes with :items in the definition of the application frame (and it was prettier than what I sent), I had less joy changing those items programmatically. When I put a "terpri" in as in the slightly revised test program as the other alternative, I get a blank line between the gadgets, which (given I am going to have a lot of items) would cause the user excess scrolling due to the whitespace between boxes. -jm On Sat, Nov 11, 2017 at 3:24 PM, Daniel Kochmański <daniel@turtleware.eu <mailto:daniel@turtleware.eu>> wrote: Hello John, question is obviously not dumb. Some cognitive problem arises from the disparity, that McCLIM provides both sheets and gadgets. If you want to lay out buttons vertically, you may either put terpri after each make-pane, or put each button in your layout (the latter is more elegant imho): -- cut -- (in-package :clim-user) (defun make-gadget (item) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button")))) (define-application-frame test-gadgets () () (:panes) (:layouts (default (vertically () (make-gadget "one") (make-gadget "two") (make-gadget "three") (make-gadget "four"))))) (run-frame-top-level (make-application-frame 'test-gadgets)) -- cut -- Best regards, Daniel On 11.11.2017 21:07, John Morrison wrote: Hi; In another app I am writing, I BELIEVE gadgets used to come out stacked vertically. After an upgrade (to current git), I think they come out "diagonally," in that the x & y of successive gadgets increase (presumbly by the dimensions of its preceding gadget). Please find attached the simplest test program I could cons up that displays the behavior, along with a screenshot that shows the behavior. What is the idiomatic/best way to get them to stack vertically? I messed about (again, mostly unsuccessfully, or I wouldn't be pestering you all) with various approaches, but every time I find myself with a complex solution, it turns out there is indeed a Better, Simpler Way. Thanks, -jm
Hi;
So I think I misrepresented this (both to you and myself).
Vintage commit abba473 respects the following, regardless of whether it is The Right Thing for me to ask of McCLIM:
(with-output-as-gadget (stream :x 0) ....
And the gadgets come out stacked vertically
The next commit, e04adb3, AFAICT doesn't accept that:
While evaluating the form starting at line 28, column 0 of #P"/home/jm/tmp69/test-gadgets-v04.lisp":
debugger invoked on a SB-INT:SIMPLE-PROGRAM-ERROR in thread #<THREAD "main thread" RUNNING {10029568C3}>: keyword argument not a symbol: #<CLOSURE (FLET CLIM-INTERNALS::GADGET-OUTPUT-RECORD-CONSTRUCTOR :IN DISPLAY-GADGETS) {155549A4D62B}>.
If I recall correctly, I did it because of this http://bauhh.dyndns.org:8000/clim-spec/30-5.html#_1866 bit of the CLIM spec...
Current vintage seems to accept the request without complaining, but does not honor it.
That took an embarrassingly long time to track down.
-jm
On Sun, Nov 12, 2017 at 3:13 PM, Daniel Kochmański daniel@turtleware.eu wrote:
The behavior seems to be there for a long time and is not a bug but deliberately coded. This is made for consistency with all macros which support :move-cursor key parameter (like `surrounding-output-with- border'):
If the boolean *move-cursor* is true (the default), then the text cursor will be moved so that it immediately follows the lower right corner of the bordered output.
So if wrapping things in `vertically' solves the issue we are all set.
Best regards, Daniel
On 11.11.2017 22:40, John Morrison wrote:
Hey, thanks. I will get on the task of trying to find out exactly which commit changed the behavior I remember. This will, however, take me a bit to wrap my brain around checking out particular git commit versions, as I am pretty much a git lightweight.
Thanks again!
-jm
On Sat, Nov 11, 2017 at 4:06 PM, Daniel Kochmański daniel@turtleware.eu wrote:
Alright. Fact that we start by diagonal lines looks like a bug (though I'm not 100% sure) – could you please fill out the bug report? If you know commit when it worked as you expected, that would be helpful too.
As of your problem at hand – macro vertically (and all the others) isn't limited only to layouts section, you may use it in display-gadget function too. If you need something, what will compose list in such macro, it is a matter of writing macro doing just that, like
(defmacro vertically* (options body-list) `(vertically ,options ,@body-list))
-- cut here --
(in-package :clim-user)
(define-application-frame test-gadgets () () (:panes (output :application :display-time :command-loop :display-function 'display-gadgets) (outputs :application :display-time :command-loop :display-function 'display-gadgets2)) (:layouts (default (horizontally () output outputs))))
(defmethod display-gadgets ((frame test-gadgets) stream) (dolist (item '("one" "two" "three" "four")) (with-output-as-gadget (stream) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button"))))))
(defun make-gadget (item) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button"))))
(defmethod display-gadgets2 ((frame test-gadgets) stream) (with-output-as-gadget (stream) (vertically () (make-gadget "one") (make-gadget "two") (make-gadget "three"))))
(run-frame-top-level (make-application-frame 'test-gadgets))
-- cut here --
hope this is helpful.
Regards,
Daniel
On 11.11.2017 21:49, John Morrison wrote:
ugh - should attach what I said I attached
On Sat, Nov 11, 2017 at 3:48 PM, John Morrison < jm@symbolic-simulation.com> wrote:
Hi Daniel (and Lucien, who replied privately):
(1) thanks for the "not dumb" comment.
Sorry additionally for not being clear. The app is intended for the buttons (will eventually be checkboxes, but buttons were simpler for purposes of isolating the behavior) to be dynamic (unknown at layout time as things to be checked will come and go during program execution).
So while I did have some joy with making :list-panes with :items in the definition of the application frame (and it was prettier than what I sent), I had less joy changing those items programmatically.
When I put a "terpri" in as in the slightly revised test program as the other alternative, I get a blank line between the gadgets, which (given I am going to have a lot of items) would cause the user excess scrolling due to the whitespace between boxes.
-jm
On Sat, Nov 11, 2017 at 3:24 PM, Daniel Kochmański <daniel@turtleware.eu
wrote:
Hello John,
question is obviously not dumb. Some cognitive problem arises from the disparity, that McCLIM provides both sheets and gadgets. If you want to lay out buttons vertically, you may either put terpri after each make-pane, or put each button in your layout (the latter is more elegant imho):
-- cut --
(in-package :clim-user)
(defun make-gadget (item) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button"))))
(define-application-frame test-gadgets () () (:panes) (:layouts (default (vertically () (make-gadget "one") (make-gadget "two") (make-gadget "three") (make-gadget "four")))))
(run-frame-top-level (make-application-frame 'test-gadgets))
-- cut --
Best regards,
Daniel
On 11.11.2017 21:07, John Morrison wrote:
Hi;
In another app I am writing, I BELIEVE gadgets used to come out stacked vertically. After an upgrade (to current git), I think they come out "diagonally," in that the x & y of successive gadgets increase (presumbly by the dimensions of its preceding gadget). Please find attached the simplest test program I could cons up that displays the behavior, along with a screenshot that shows the behavior.
What is the idiomatic/best way to get them to stack vertically? I messed about (again, mostly unsuccessfully, or I wouldn't be pestering you all) with various approaches, but every time I find myself with a complex solution, it turns out there is indeed a Better, Simpler Way.
Thanks,
-jm
OK, thank you. That was a missing piece I needed. Fix was pushed to master branch a second ago.
Best regards,
Daniel
On 12.11.2017 21:26, John Morrison wrote:
Hi;
So I think I misrepresented this (both to you and myself).
Vintage commit abba473 respects the following, regardless of whether it is The Right Thing for me to ask of McCLIM:
(with-output-as-gadget (stream :x 0) ....
And the gadgets come out stacked vertically
The next commit, e04adb3, AFAICT doesn't accept that:
While evaluating the form starting at line 28, column 0 of #P"/home/jm/tmp69/test-gadgets-v04.lisp": debugger invoked on a SB-INT:SIMPLE-PROGRAM-ERROR in thread #<THREAD "main thread" RUNNING {10029568C3}>: keyword argument not a symbol: #<CLOSURE (FLET CLIM-INTERNALS::GADGET-OUTPUT-RECORD-CONSTRUCTOR :IN DISPLAY-GADGETS) {155549A4D62B}>.
If I recall correctly, I did it because of this http://bauhh.dyndns.org:8000/clim-spec/30-5.html#_1866 bit of the CLIM spec...
Current vintage seems to accept the request without complaining, but does not honor it.
That took an embarrassingly long time to track down.
-jm
On Sun, Nov 12, 2017 at 3:13 PM, Daniel Kochmański <daniel@turtleware.eu mailto:daniel@turtleware.eu> wrote:
The behavior seems to be there for a long time and is not a bug but deliberately coded. This is made for consistency with all macros which support :move-cursor key parameter (like `surrounding-output-with-border'): If the boolean /move-cursor/ is true (the default), then the text cursor will be moved so that it immediately follows the lower right corner of the bordered output. So if wrapping things in `vertically' solves the issue we are all set. Best regards, Daniel On 11.11.2017 22:40, John Morrison wrote:
Hey, thanks. I will get on the task of trying to find out exactly which commit changed the behavior I remember. This will, however, take me a bit to wrap my brain around checking out particular git commit versions, as I am pretty much a git lightweight. Thanks again! -jm On Sat, Nov 11, 2017 at 4:06 PM, Daniel Kochmański <daniel@turtleware.eu <mailto:daniel@turtleware.eu>> wrote: Alright. Fact that we start by diagonal lines looks like a bug (though I'm not 100% sure) – could you please fill out the bug report? If you know commit when it worked as you expected, that would be helpful too. As of your problem at hand – macro vertically (and all the others) isn't limited only to layouts section, you may use it in display-gadget function too. If you need something, what will compose list in such macro, it is a matter of writing macro doing just that, like (defmacro vertically* (options body-list) `(vertically ,options ,@body-list)) -- cut here -- (in-package :clim-user) (define-application-frame test-gadgets () () (:panes (output :application :display-time :command-loop :display-function 'display-gadgets) (outputs :application :display-time :command-loop :display-function 'display-gadgets2)) (:layouts (default (horizontally () output outputs)))) (defmethod display-gadgets ((frame test-gadgets) stream) (dolist (item '("one" "two" "three" "four")) (with-output-as-gadget (stream) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button")))))) (defun make-gadget (item) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button")))) (defmethod display-gadgets2 ((frame test-gadgets) stream) (with-output-as-gadget (stream) (vertically () (make-gadget "one") (make-gadget "two") (make-gadget "three")))) (run-frame-top-level (make-application-frame 'test-gadgets)) -- cut here -- hope this is helpful. Regards, Daniel On 11.11.2017 21:49, John Morrison wrote:
ugh - should attach what I said I attached On Sat, Nov 11, 2017 at 3:48 PM, John Morrison <jm@symbolic-simulation.com <mailto:jm@symbolic-simulation.com>> wrote: Hi Daniel (and Lucien, who replied privately): (1) thanks for the "not dumb" comment. Sorry additionally for not being clear. The app is intended for the buttons (will eventually be checkboxes, but buttons were simpler for purposes of isolating the behavior) to be dynamic (unknown at layout time as things to be checked will come and go during program execution). So while I did have some joy with making :list-panes with :items in the definition of the application frame (and it was prettier than what I sent), I had less joy changing those items programmatically. When I put a "terpri" in as in the slightly revised test program as the other alternative, I get a blank line between the gadgets, which (given I am going to have a lot of items) would cause the user excess scrolling due to the whitespace between boxes. -jm On Sat, Nov 11, 2017 at 3:24 PM, Daniel Kochmański <daniel@turtleware.eu <mailto:daniel@turtleware.eu>> wrote: Hello John, question is obviously not dumb. Some cognitive problem arises from the disparity, that McCLIM provides both sheets and gadgets. If you want to lay out buttons vertically, you may either put terpri after each make-pane, or put each button in your layout (the latter is more elegant imho): -- cut -- (in-package :clim-user) (defun make-gadget (item) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button")))) (define-application-frame test-gadgets () () (:panes) (:layouts (default (vertically () (make-gadget "one") (make-gadget "two") (make-gadget "three") (make-gadget "four"))))) (run-frame-top-level (make-application-frame 'test-gadgets)) -- cut -- Best regards, Daniel On 11.11.2017 21:07, John Morrison wrote: Hi; In another app I am writing, I BELIEVE gadgets used to come out stacked vertically. After an upgrade (to current git), I think they come out "diagonally," in that the x & y of successive gadgets increase (presumbly by the dimensions of its preceding gadget). Please find attached the simplest test program I could cons up that displays the behavior, along with a screenshot that shows the behavior. What is the idiomatic/best way to get them to stack vertically? I messed about (again, mostly unsuccessfully, or I wouldn't be pestering you all) with various approaches, but every time I find myself with a complex solution, it turns out there is indeed a Better, Simpler Way. Thanks, -jm
Hi Daniel;
Thanks! Holy cow, but that was fast. And sorry that took so long for me to track down...
-jm
On Sun, Nov 12, 2017 at 3:44 PM, Daniel Kochmański daniel@turtleware.eu wrote:
OK, thank you. That was a missing piece I needed. Fix was pushed to master branch a second ago.
Best regards,
Daniel
On 12.11.2017 21:26, John Morrison wrote:
Hi;
So I think I misrepresented this (both to you and myself).
Vintage commit abba473 respects the following, regardless of whether it is The Right Thing for me to ask of McCLIM:
(with-output-as-gadget (stream :x 0) ....
And the gadgets come out stacked vertically
The next commit, e04adb3, AFAICT doesn't accept that:
While evaluating the form starting at line 28, column 0 of #P"/home/jm/tmp69/test-gadgets-v04.lisp":
debugger invoked on a SB-INT:SIMPLE-PROGRAM-ERROR in thread #<THREAD "main thread" RUNNING {10029568C3}>: keyword argument not a symbol: #<CLOSURE (FLET CLIM-INTERNALS::GADGET-OUTPUT-RECORD-CONSTRUCTOR :IN DISPLAY-GADGETS) {155549A4D62B}>.
If I recall correctly, I did it because of this http://bauhh.dyndns.org:8000/clim-spec/30-5.html#_1866 bit of the CLIM spec...
Current vintage seems to accept the request without complaining, but does not honor it.
That took an embarrassingly long time to track down.
-jm
On Sun, Nov 12, 2017 at 3:13 PM, Daniel Kochmański daniel@turtleware.eu wrote:
The behavior seems to be there for a long time and is not a bug but deliberately coded. This is made for consistency with all macros which support :move-cursor key parameter (like `surrounding-output-with-borde r'):
If the boolean *move-cursor* is true (the default), then the text cursor will be moved so that it immediately follows the lower right corner of the bordered output.
So if wrapping things in `vertically' solves the issue we are all set.
Best regards, Daniel
On 11.11.2017 22:40, John Morrison wrote:
Hey, thanks. I will get on the task of trying to find out exactly which commit changed the behavior I remember. This will, however, take me a bit to wrap my brain around checking out particular git commit versions, as I am pretty much a git lightweight.
Thanks again!
-jm
On Sat, Nov 11, 2017 at 4:06 PM, Daniel Kochmański daniel@turtleware.eu wrote:
Alright. Fact that we start by diagonal lines looks like a bug (though I'm not 100% sure) – could you please fill out the bug report? If you know commit when it worked as you expected, that would be helpful too.
As of your problem at hand – macro vertically (and all the others) isn't limited only to layouts section, you may use it in display-gadget function too. If you need something, what will compose list in such macro, it is a matter of writing macro doing just that, like
(defmacro vertically* (options body-list) `(vertically ,options ,@body-list))
-- cut here --
(in-package :clim-user)
(define-application-frame test-gadgets () () (:panes (output :application :display-time :command-loop :display-function 'display-gadgets) (outputs :application :display-time :command-loop :display-function 'display-gadgets2)) (:layouts (default (horizontally () output outputs))))
(defmethod display-gadgets ((frame test-gadgets) stream) (dolist (item '("one" "two" "three" "four")) (with-output-as-gadget (stream) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button"))))))
(defun make-gadget (item) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button"))))
(defmethod display-gadgets2 ((frame test-gadgets) stream) (with-output-as-gadget (stream) (vertically () (make-gadget "one") (make-gadget "two") (make-gadget "three"))))
(run-frame-top-level (make-application-frame 'test-gadgets))
-- cut here --
hope this is helpful.
Regards,
Daniel
On 11.11.2017 21:49, John Morrison wrote:
ugh - should attach what I said I attached
On Sat, Nov 11, 2017 at 3:48 PM, John Morrison < jm@symbolic-simulation.com> wrote:
Hi Daniel (and Lucien, who replied privately):
(1) thanks for the "not dumb" comment.
Sorry additionally for not being clear. The app is intended for the buttons (will eventually be checkboxes, but buttons were simpler for purposes of isolating the behavior) to be dynamic (unknown at layout time as things to be checked will come and go during program execution).
So while I did have some joy with making :list-panes with :items in the definition of the application frame (and it was prettier than what I sent), I had less joy changing those items programmatically.
When I put a "terpri" in as in the slightly revised test program as the other alternative, I get a blank line between the gadgets, which (given I am going to have a lot of items) would cause the user excess scrolling due to the whitespace between boxes.
-jm
On Sat, Nov 11, 2017 at 3:24 PM, Daniel Kochmański < daniel@turtleware.eu> wrote:
Hello John,
question is obviously not dumb. Some cognitive problem arises from the disparity, that McCLIM provides both sheets and gadgets. If you want to lay out buttons vertically, you may either put terpri after each make-pane, or put each button in your layout (the latter is more elegant imho):
-- cut --
(in-package :clim-user)
(defun make-gadget (item) (make-pane 'push-button :label item :activate-callback (lambda (&rest args) (declare (ignore args)) (notify-user *application-frame* "You clicked a button"))))
(define-application-frame test-gadgets () () (:panes) (:layouts (default (vertically () (make-gadget "one") (make-gadget "two") (make-gadget "three") (make-gadget "four")))))
(run-frame-top-level (make-application-frame 'test-gadgets))
-- cut --
Best regards,
Daniel
On 11.11.2017 21:07, John Morrison wrote:
Hi;
In another app I am writing, I BELIEVE gadgets used to come out stacked vertically. After an upgrade (to current git), I think they come out "diagonally," in that the x & y of successive gadgets increase (presumbly by the dimensions of its preceding gadget). Please find attached the simplest test program I could cons up that displays the behavior, along with a screenshot that shows the behavior.
What is the idiomatic/best way to get them to stack vertically? I messed about (again, mostly unsuccessfully, or I wouldn't be pestering you all) with various approaches, but every time I find myself with a complex solution, it turns out there is indeed a Better, Simpler Way.
Thanks,
-jm