LINUX.ORG.RU

Как переименовать title in McCLIM

 


0

1

Как переименовать title

(in-package :common-lisp-user)
(defpackage "WORD"
(:use :clim :clim-lisp)
(:export "WORD-MAIN"))
(in-package :word)
(define-application-frame word		;name
    ()					;superclasses
  ()					;slots
  ;; options
  (:panes				;panes option
   (title				;pane name 
    :title)	;pane type, такое, :title "bla bla", не пролезит
   (document				;pane name
    :application))			;pane type
  (:layouts				;layouts option
   (default				;layout name
       (vertically ()			;layout macros
	 (1/8 title)
	 (7/8 document)))))
(defun word-main ()
(run-frame-top-level (make-application-frame 'word :height 300 :width 300)))

Здесь написано много http://bauhh.dyndns.org:8000/clim-spec/28-2.html#_1488. Но как переименовать title нет.

Ну анонимусы, давайте!

А зачем тебе :title? Это рудимент от тех оконных систем, где не было title. Сегодня тебе нигде это особо не пригодится.

;pane type, такое, :title «bla bla», не пролезит

Не пролезит, потому что :title - это pane, а не строка. Тогда тебе надо в свойство :display-string твоего title pane указать нужную строку.

[...]
(:panes (title :title :​display-string "My Program")
[...]
Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)

Можно еще :display-function использовать. :display-string - это статический текст.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

А зачем тебе :title?

Показался самым простым вариантом, как-то понять (:panes (name . body), точнее, саму body, откуда её брать. Судя по твоему ответу, там логика. Но это :title, а как быть с другими CLIM stream panes. Напиши уже mcclim cheat sheet, а я его куплю у тебя.

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

[...]
(:panes (title :title :​display-string «My Program»)
[...]

выдало

Invalid initialization argument: :​DISPLAY-STRING in call for class #<STANDARD-CLASS CLIM-CLX::CLX-934-TITLE-PANE>. [Condition of type SB-PCL::INITARG-ERROR]

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

Должно было работать. Для класса title-pane этот аргумент есть. Найди в McCLIM в Core/clim-core/panes/stream-panes.lisp, как реализован TITLE-PANE. Ищи типа «defclass title-pane». Что там? Откуда у тебя исходники? Они сильно старые?

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok
[...]
(:panes (title :title :​display-string "My Program")
[...]

The value of the :panes option is a list, each entry of which is of the form (name . body). name is a symbol that names the pane, and body specifies how to create the pane. body is either a list containing a single element that is itself a list, or a list consisting of a symbol followed by zero or more keyword-value pairs.

А что не работает? У тебя всё верно, насколько я вижу.

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

Откуда у тебя исходники?

(ql:quickload «mcclim»)

пару недель назад.

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

А что не работает? У тебя всё верно, насколько я вижу.

У меня сейчас нет сетапа с McCLIM. Я даже не пробовал, но это все описано у Franz (я сейчас проверил специально), прямо пример дан. Но вот я глянул актуальные исходники McCLIM [1], а там откуда-то появляется еще аргумент :title-string, которого нет в спецификации вообще. У тебя что в исходниках? Попробуй :title-string вместо :display-string. Ну и проверь у себя в исходниках, там вообще что реализовано?

[1] https://github.com/McCLIM/McCLIM/blob/f1d14d87ab4599dc5ff8abaa4c74d50b8897487...

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

;;; Implementation of the 29.4 CLIM Stream Panes.

(defclass title-pane (clim-stream-pane)
  ((title :initarg :title-string
          :initarg :display-string
          :accessor title-string))
  (:default-initargs :display-time t
                     :title-string "Default Title"
                     :text-style (make-text-style :serif :bold :very-large)
                     :display-function 'display-title))

(defmethod display-title (frame (pane title-pane))
  (declare (ignore frame))
  (let* ((title-string (title-string pane))
         (a (text-style-ascent (pane-text-style pane) pane))
         (tw (text-size pane title-string)))
    (with-bounding-rectangle* (x1 y1 x2 y2) (sheet-region pane)
      (declare (ignore y2))
      (multiple-value-bind (tx ty)
          (values (- (/ (- x2 x1) 2) (/ tw 2))
                  (+ y1 2 a))
        (draw-text* pane title-string tx ty)))))
saufesma
() автор топика
Ответ на: комментарий от saufesma

odd number of &KEY arguments [Condition of type SB-INT:SIMPLE-PROGRAM-ERROR]

Покажи всю строчку, чтобы было понятно, что ты пытаешься ему подсунуть.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok
 (:panes				;panes option
   (title				;pane name 
    :​title-string "My Program")

такая конструкция просто не может работать т.к.

(defclass title-pane (clim-stream-pane)
  ((title :initarg :title-string
          :initarg :display-string
          :accessor title-string))
  (:default-initargs :display-time t 
;;;;^^^^^^^^^^^^^^
                     :title-string "Default Title"
                  ;;; ^^^^^^^^^^^^^^
                     :text-style (make-text-style :serif :bold :very-large)
                     :display-function 'display-title))
saufesma
() автор топика
Ответ на: комментарий от saufesma

А :title куда дел? Он по этому ключу title-pane создает. Пробуй так:

(:panes				;panes option
   (title				;pane name 
    :title
    :​title-string "My Program")
Zubok ★★★★★
()
Ответ на: комментарий от saufesma
(defclass my-super-puper-class ()
  ((title :initarg :title
          :accessor title-of))
  (:default-initargs :title "Troll"))

(defparameter *troll*
  (make-instance 'my-super-puper-class))

(defparameter *trollface*
  (make-instance 'my-super-puper-class
                 :title "Problems officer?"))
CL-USER> (title-of *troll*)

"Troll"
CL-USER> (title-of *trollface*)
"Problems officer?"
CL-USER> 
ados ★★★★★
()
Ответ на: комментарий от saufesma

Это первое, что я пробовал.

Ну и что он тебе говорит на это? А ту ошибку, что ты привел, на какую строчку говорит? Вот с :title должно быть. что говорит на это?

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

Отыгрался? Я не хотел тебя обидеть, извини.

saufesma
() автор топика
Ответ на: комментарий от Zubok
    [...]
    (:panes (title :title :​display-string «My Program»)
    [...]

выдало

Invalid initialization argument: :​DISPLAY-STRING in call for class #<STANDARD-CLASS CLIM-CLX::CLX-934-TITLE-PANE>. [Condition of type SB-PCL::INITARG-ERROR]

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

Что ты имеешь в виду этой ссылкой для меня осталось загадкой. А разбираться с исходниками mcclim, ну оно интересно конечно, да ладно. Тему mcclim я закрываю, для себя.

 (:panes				;panes option
   (title				;pane name 
	  :title
	  :​title-string "My Program")		


Invalid initialization argument:
  :​TITLE-STRING
in call for class #<STANDARD-CLASS CLIM-CLX::CLX-934-TITLE-PANE>.
   [Condition of type SB-PCL::INITARG-ERROR]
saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 1)
Ответ на: комментарий от saufesma

Вот это должно по идее работать. Вот даже пример на LispWorks [1] (ссылка, чтобы увидеть пример) есть, но он для CLIM именно их реализации. В спеках про display-string вообще речи нет. Только про display-function сказано. Скорее всего, эта функциональность недоспецифицирована и поэтому реализации отличаются. McCLIM же просто пытается повторить то, что сделано в других реализациях.

[1] http://www.lispworks.com/documentation/lw44/CLIM/html/climguide-143.htm

Выдержка:

(define-application-frame cad-demo () () 
  (:menu-bar nil)
  (:panes 
   (title :title :display-string "Mini-CAD") <<<<<<<<<
   (menu :command-menu) 
   (design-area :application) 
   (documentation :pointer-documentation))
  (:layouts 

[...]
Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от saufesma

Попробуй вместо :title создать pane самостоятельно. Примерно так:

(:panes
   (title (make-pane 'title-pane :display-string "My Program"))

И так на всякий случай

(:panes
   (title (make-pane 'title-pane :title-string "My Program"))
Zubok ★★★★★
()
Ответ на: комментарий от Zubok

У меня с :title-string работает, но у меня mcclim-20200610-git. С той версии у проекта очень много коммитов. О символе :display-string система вообще не знает.

ados ★★★★★
()
Последнее исправление: ados (всего исправлений: 1)
Ответ на: комментарий от ados

Мой mcclim-20201016-git. И он не работает. Ты замечаешь как вы меня с Zubok прессуете. Как установить mcclim-20200610-git?

saufesma
() автор топика
Ответ на: комментарий от ados

У меня с :title-string работает, но у меня mcclim-20200610-git. С той версии у проекта очень много коммитов.

А какой именно из вариантов? с :title или с ручным созданием make-pane? А с :display-string вообще не работает? Странно, что у него вообще ругается, что initialization argument неправильный, хотя вроде видно, что экземпляр класса #<STANDARD-CLASS CLIM-CLX::CLX-934-TITLE-PANE>. Вполне может быть, что баг какой-то.

О символе :display-string система вообще не знает.

UPD. Да, в общем-то можно глянуть как раз в тот файл, что выше в исходниках. Как именно реализован класс title-pane

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 3)
Ответ на: комментарий от saufesma

А разбираться с исходниками mcclim, ну оно интересно конечно, да ладно.

Можно поиграться и поразбирать примеры в Examples/ или Apps/ в дереве исходников. Почитать их, попробовать запускать, изменять. Писать что-то своё на базе похожего примера.

Ты же взял виджет с древней костыльной историей

Это рудимент от тех оконных систем, где не было title. Сегодня тебе нигде это особо не пригодится.

В Examples/ и Apps/ вообще нигде он не используется как у тебя, что закономерно.

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

можно глянуть как раз в тот файл, что выше в исходниках.

А на гитхабе на master сейчас целая директория вместо этого файла.

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

Переустановил, с той же версией получилось, mcclim-20201016-git.

Вообще, если очень хочется разобраться, то надо разбираться. Дело в том, что CLIM очень часто недоспецифирован. То есть некоторые важные вопросы просто отсутствуют и не ясно, как их реализовывать. Поэтому часто просто либо старые обсуждения смотреть, как это должно работать. Либо же смотреть, как реализовано было в коммерческих реализациях LispWorks и Franz. Про :display-string вообще в спецификации речи не идет. А в примерах он есть.

Я бегло посмотрел, что успел. По идее должно работать так. Если указываешь ключ :title в :panes, то создается title-pane, а дальше идут следом аргументы, которые можно инициализировать, а можно и не трогать. Если ты указываешь :title без аргументов, то упоминания в сети говорят, что реализации CLIM отображали не «Default Title», как это в исходнике McCLIM я вижу, а pretty name фрейма приложения (см. аргумент :pretty-name). При этом должен работать аргумент :display-string (а не :title-string), если нужно указать title вручную. Можно поменять и всю функцию отображения при помощи специфицированного параметра :display-function. В McCLIM как-то не совсем ясно сделали.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 4)
Ответ на: комментарий от saufesma

Хотя что занятно. Спецификация CLIM2 у Franz вообще молчком про опции. Вот Franz (у меня локально pdf, копирую оттуда):

:title

Title panes are used for displaying the title of the application. The default title is a prettified version of the name of the application frame. This will be handle by the window manager, so you need not include a title pane. See the class title-pane.

[...]

title-pane [Class]

The pane class that is used to implement a title pane (the :title type above). The default display function for panes of this type is display-title. For title-pane, the default for :display-time is t and the default for :scroll-bars is nil.

То есть мы видим, что они говорят, что опцию особо указывать не надо, так как оконный менеджер это в заголовках сам напишет в соответствии с prettified version (очевидно, что это :pretty-name у application-frame). и, вобщем-то, все. В описании класса ни опций, никаких там :display-string. То есть, я полагаю, Franz особо и не использовало эту вещь.

А вот в спецификация CLIM2 на LispWorks как раз-таки говорит кое-что (копирую из локального pdf):

:display-string [Option]

Summary: For title-panes only, you can use this option instead of :display-function to specify a constant string to be displayed in the title-pane.

title-pane [Leaf Pane]

Summary: The pane class that implements a title pane. The default display function for panes of this type is display-title. If the title to be displayed will not change, it can be supplied using the option :display-string described in Section 10.3.1, “Extended Stream Pane Options”. If neither :display-function or :display-string is supplied, the title will be taken from frame-pretty-name (see Section 9.9.1, “Finding Frame Managers”). The default for :display-time is t and for :scroll-bars is nil.

Вот тут побольше. Рассказано про :display-string, поподробнее указано, откуда берется название в заголовок, если ничего не указано (frame-pretty-name).

Общее у двух описаний только то, что они упоминают :display-function как способ полностью поменять поведение title-pane. Но то только LW рассказывает про опцию :display-string, которая позволяет поменять просто строчку без написания новой :display-function. Ну и умолчательное значение известно откуда берется.

А вот в McCLIM по умолчанию почему «Default Title» и маячит :title-string.

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

А нифига! И Franz про нее говорит. Сразу не нашел просто.

:display-string string (for :title panes only) The string to display. The default is the frame's pretty-name.

В общем. в McCLIM какая-то чуть другая реализация. Вообще, это повод для репорта.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от ados

Ну так файл stream-panes.lisp на месте же. Там и определен класс title-pane

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

Я вас всех уважаю, но ну его нафиг.

(ql:quickload McCLIM-master/mcclim.asd)

не работает. Опять танцы с бубнами, на несколько дней, потом некогда, и ....

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 1)
Ответ на: комментарий от Zubok

А вот в спецификация CLIM2 на LispWorks

А может какая-нибудь лицензия на LispWorks CAPI всё таки лучше чем McCLIM?

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

Вообще, если очень хочется разобраться, то надо разбираться.

Иногда не могу понять на что тут все живут. Например ты, на тему lisp, mcclim как угодно, о чём угодно. А вот потрогать изделия, тобою сделанных, на оных инструментах, где можно? Я никого не троллю, просто давно напрашивающийся вопрос. А то получается, талант зря пропадает

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.