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
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