LINUX.ORG.RU

Lisp & McCLIM


0

0

Может кто подскажет: как реализовать ф-цию Open File. Т.е. выбор файла через гуй и получение его пути.

anonymous

Подробнее, пожалуйста. Что означает фраза "выбор файла через гуй"? Тебе выкатывается список файлов и ты там выбираешь? За примером можешь посмотреть приложение listener. clim-listener.asd есть в основном каталоге с исходниками McCLIM, а сами исходники Listener лежат в mcclim/Apps. Делаешь линк на clim-listener.asd, где у тебя все systems лежат, а потом после загрузки mcclim делаешь (require 'clim-listener).

Вот еще в этой совсем небольшой обзорной статье есть примерчик file-browser:

http://clemens.endorphin.org/a-guided-tour-of-CLIM-2006.pdf

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

> Тебе выкатывается список файлов и ты там выбираешь?

Да.

> Вот еще в этой совсем небольшой обзорной статье есть примерчик file-browser:

Вот я по этому примеру и делал. Только не сразу въехал, несколько специфичен этот CLIM. Несколько вопросо осталось:

1. Почему в menu-bar'e, чтоб исполнилась команда, надо 2 раза кликнуть на её имени. Объявляется так: (define-...-command (lala :name "CMD" :menu t)) ? 2. Как врубить прокрутку скролла колёсиком ?

anonymous
()
Ответ на: комментарий от anonymous

>2. Как врубить прокрутку скролла колёсиком ?

а в иксах оно у тебя настроено? тоесть в других приложениях крутится?

cvv ★★★★★
()
Ответ на: комментарий от anonymous

>Вот я по этому примеру и делал. Только не сразу въехал, несколько специфичен этот CLIM.

*Весьма* специфичен. И этим (мне) весьма интересен. Интересен такими высокоуровневыми вещами, как presentations, output recording, commands и пр. Но надо помнить, что именно McCLIM еще далеко не оптимизирован, и еще далеко не все мелочи реализованы. Это просто надо иметь в виду. Насчет специфичности я тут не раз предупреждал. На самом деле, наиболее близкий по концепции (высокоуровневости) к CLIM из широко известных -- это Tk, но и с ним различия слишком велики.

>1. Почему в menu-bar'e, чтоб исполнилась команда, надо 2 раза кликнуть на её имени.

У меня с одного клика команда выполняется. Давай свой примерчик простого (define-application-pane...) с одной командой и пунктом меню. Я проверю у себя.

Zubok ★★★★★
()
Ответ на: комментарий от anonymous

>2. Как врубить прокрутку скролла колёсиком ?

В самом viewport'е колесико работает, а на скролбарах -- нет. Не реализовано. Ну я так глянул исходники McCLIM. Должно быть несложно реализовать.

Zubok ★★★★★
()
Ответ на: комментарий от anonymous

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

Zubok ★★★★★
()
Ответ на: комментарий от cvv

> а в иксах оно у тебя настроено? тоесть в других приложениях крутится?

Я вас умоляю :)

anonymous
()
Ответ на: комментарий от Zubok

(define-application-frame mc-test () () (:panes (app :application :height 150 :width 400) (intr :interactor) ) (:layouts (default (vertically () app intr)) ))

(define-mc-test-command (com-quit :name "Quit" :menu t) ( ) ( frame-exit *application-frame*))

(defun mc-test () (run-frame-top-level (make-application-frame 'mc-test))) (mc-test)

Пока на менюхе не кликнешь, она даж не выделяется.

Пользую clim-gtkairo

anonymous
()
Ответ на: комментарий от anonymous

Да уж, забыл...

(define-application-frame mc-test ()
  ()
  (:panes
    (app :application :height 150 :width 400)
    (intr :interactor)
   )
   (:layouts
     (default (vertically () app intr))
     ))

(define-mc-test-command (com-quit :name "Quit" :menu t) ( )
  ( frame-exit *application-frame*))

(defun mc-test ()
  (run-frame-top-level (make-application-frame 'mc-test)))

(mc-test)

anonymous
()
Ответ на: комментарий от anonymous

>Пользую clim-gtkairo

А вот и ответ. Не надо пока использовать McCLIM/gtkairo. Глючный бэкенд очень. Я бы даже альфой не назвал. То есть пользовать его можно, но только надо иметь в виду, что там далеко не все в порядке.

P.S. В McCLIM/CLX все нормально твой пример отрабатывает. Делай все пока с CLX. А когда придет время, то легким движением сменишь бэкенд. :)

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

> И этим (мне) весьма интересен.

Мне тоже. Но пока тяжелова-то даётся, есть вопросы, поэтому хотелось бы с тобой связаться как-то... мой мыл vLx0F на янексе ру. Спасибо.

anonymous
()
Ответ на: комментарий от Zubok

Ну да. С CLX нормально, тока подтормаживает почему-то больше. А OpenGL не пробовал ?

> то легким движением сменишь бэкенд

Вот это как раз богатое решение. А как там у них вообще дела движутся ? Скорость разработки и т.п. ? :)

anonymous
()
Ответ на: комментарий от anonymous

>Хм... А уменя в CLX скролл работает...

На скроллбаре прямо или внутри viewport? На скроллбаре не работает. Вернее, работает, если указатель находтся ты вне изображения ползунка. И при этом еще вызываются функции постраничного скроллинга. А это совсем не то поведение.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

> На скроллбаре прямо или внутри viewport?

Внутри.

> Вернее, работает, если указатель находтся ты вне изображения ползунка.

Точно.

anonymous
()
Ответ на: комментарий от anonymous

Нет, я имею в виду, если указатель внутри scroll-bar и внутри thumb (ползунка). Вот у тебя работать и не должно, когда мышка на thumb находится. А когда вне thumb, то поворот колесика обрабатывается, как нажатие кнопки, а не как колесико.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

> Нет, я имею в виду, если указатель внутри scroll-bar и внутри thumb (ползунка).

Я о том же :)

> как нажатие кнопки, а не как колесико.

А-а-а... понял.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.