Подробнее, пожалуйста. Что означает фраза "выбор файла через гуй"? Тебе выкатывается список файлов и ты там выбираешь? За примером можешь посмотреть приложение listener. clim-listener.asd есть в основном каталоге с исходниками McCLIM, а сами исходники Listener лежат в mcclim/Apps. Делаешь линк на clim-listener.asd, где у тебя все systems лежат, а потом после загрузки mcclim делаешь (require 'clim-listener).
Вот еще в этой совсем небольшой обзорной статье есть примерчик file-browser:
> Тебе выкатывается список файлов и ты там выбираешь?
Да.
> Вот еще в этой совсем небольшой обзорной статье есть примерчик file-browser:
Вот я по этому примеру и делал. Только не сразу въехал, несколько специфичен этот CLIM. Несколько вопросо осталось:
1. Почему в menu-bar'e, чтоб исполнилась команда, надо 2 раза кликнуть на её имени. Объявляется так: (define-...-command (lala :name "CMD" :menu t)) ? 2. Как врубить прокрутку скролла колёсиком ?
>Вот я по этому примеру и делал. Только не сразу въехал, несколько специфичен этот CLIM.
*Весьма* специфичен. И этим (мне) весьма интересен. Интересен такими высокоуровневыми вещами, как presentations, output recording, commands и пр. Но надо помнить, что именно McCLIM еще далеко не оптимизирован, и еще далеко не все мелочи реализованы. Это просто надо иметь в виду. Насчет специфичности я тут не раз предупреждал. На самом деле, наиболее близкий по концепции (высокоуровневости) к CLIM из широко известных -- это Tk, но и с ним различия слишком велики.
>1. Почему в menu-bar'e, чтоб исполнилась команда, надо 2 раза кликнуть на её имени.
У меня с одного клика команда выполняется. Давай свой примерчик простого (define-application-pane...) с одной командой и пунктом меню. Я проверю у себя.
>2. Как врубить прокрутку скролла колёсиком ?
Вот я тут патчик сейчас написал. Не шлю diff, потому что у меня CVS.
Могут файлы у нас с тобой отличаться. В файле gadgets.lisp замени
одноименный метод на этот и жми в SLIME на нем C-c C-e. По идее,
скроллинг колесиком должен заработать и для горизонтального, и для
вертикального. Только пока я в CVS высылать это не буду, так как надо
подумать насчет гранулярности скроллинга колесиком. Поэтому имей в
виду это при обновлении из CVS.
(defmethod handle-event ((sb scroll-bar-pane) (event pointer-button-press-event))
(let ((button (pointer-event-button event)))
(cond
((eq button +pointer-wheel-up+)
(scroll-up-line-callback sb (gadget-client sb) (gadget-id sb))
(setf event-state :up-armed)
(scroll-bar/update-display sb))
((eq button +pointer-wheel-down+)
(scroll-down-line-callback sb (gadget-client sb) (gadget-id sb))
(setf event-state :dn-armed)
(scroll-bar/update-display sb))
(t
(multiple-value-bind (x y) (transform-position
(scroll-bar-transformation sb)
(pointer-event-x event) (pointer-event-y event))
(with-slots (event-state drag-dy) sb
(cond ((region-contains-position-p (scroll-bar-up-region sb) x y)
(scroll-up-line-callback sb (gadget-client sb) (gadget-id sb))
(setf event-state :up-armed)
(scroll-bar/update-display sb))
((region-contains-position-p (scroll-bar-down-region sb) x y)
(scroll-down-line-callback sb (gadget-client sb) (gadget-id sb))
(setf event-state :dn-armed)
(scroll-bar/update-display sb))
;;
((region-contains-position-p (scroll-bar-thumb-region sb) x y)
(setf event-state :dragging
drag-dy (- y (bounding-rectangle-min-y (scroll-bar-thumb-region sb)))))
;;
((region-contains-position-p (scroll-bar-thumb-bed-region sb) x y)
(if (< y (bounding-rectangle-min-y (scroll-bar-thumb-region sb)))
(scroll-up-page-callback sb (gadget-client sb) (gadget-id sb))
(scroll-down-page-callback sb (gadget-client sb) (gadget-id sb))))
(t
nil))))))))
А вот и ответ. Не надо пока использовать McCLIM/gtkairo. Глючный бэкенд очень. Я бы даже альфой не назвал. То есть пользовать его можно, но только надо иметь в виду, что там далеко не все в порядке.
P.S. В McCLIM/CLX все нормально твой пример отрабатывает. Делай все пока с CLX. А когда придет время, то легким движением сменишь бэкенд. :)
На скроллбаре прямо или внутри viewport? На скроллбаре не работает. Вернее, работает, если указатель находтся ты вне изображения ползунка. И при этом еще вызываются функции постраничного скроллинга. А это совсем не то поведение.
Нет, я имею в виду, если указатель внутри scroll-bar и внутри thumb (ползунка). Вот у тебя работать и не должно, когда мышка на thumb находится. А когда вне thumb, то поворот колесика обрабатывается, как нажатие кнопки, а не как колесико.