Russian Qt Forum
Ноябрь 22, 2024, 15:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Клонирование  (Прочитано 4828 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Сентябрь 05, 2016, 10:47 »

Добрый день

Есть объекты в виде иерархии/дерева. Каждый объект имеет много всякого добра, напр "геометрию", "материал" (цвета, текстуры и.т.п.). И вот поставлена задача создания "клонов". Юзер выбирает нод в дереве и жмет бубочку "Clone". Копируется только нод, без child'ов (вот он - клон), но его child'ы как бы все равно существуют и в окнах отображаются, просто в дереве их нет. Смысл в том что клонированный child своих данных имеет очень мало, в основном юзает данные "оригинала".  Клон (родительский нод) помнит все оригиналы и умеет их рисовать. Можно подходить и проще - объект "хранит только изменения", а остальные данные - использует тело др объекта.

И тут возникает проблема - child'ам клона может потребоваться больше своих данных. Напр оригинал имеет один материал (синий), а юзер хочет назначить другой (красный). Каким образом юзер это может сделать? Ведь child'ов клона в иерархии нет - и данных для них нет. И окно где можно задать цвет никак не вызвать. Как же должно быть организовано UI в таком случае?

Подкиньте идеек

Спасибо
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #1 : Сентябрь 05, 2016, 11:05 »

Могу предложить способ организации данных, в котором каждый из элементов дерева всегда хранит только изменения (например, map< key, variant >). Элемент предоставляет собственные данные, если у него они есть, или обращаемся к верхнему в иерархии элементу, если данных нет; до тех пор, пока не получим данные или не закончится дерево.

Тогда клонирование означает формирование промежуточного элемента дерева сразу после клонируемого.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #2 : Сентябрь 05, 2016, 12:32 »

в момент изменения создавать копию и изменять
clone = node
clone.some_param = green

Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Сентябрь 05, 2016, 13:00 »

А в чем проблема показывать чилдов клона в иерархии?
Ведь они же физически существуют.
А их отсутствие будет только путать юзара, он начнет биться в истерике и писать баг-репорты.
Добавим чилдов, покажем их параметры как "наследованные" (например, "серым" цветом или еще как).
Если юзер тыкнул на параметр и поменял его - то вместо "серого" параметр должен стать активным.
Кактотаг.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Сентябрь 05, 2016, 14:30 »

в момент изменения создавать копию и изменять
clone = node
А в чем проблема показывать чилдов клона в иерархии?
Ведь они же физически существуют.
Нет. Чайлд клона = это не объект (точнее не тот полноценный объект что добавляется в дерево). Это просто данные ("изменения", "огрызки") которые хранит клон для каждого чайлда.

А их отсутствие будет только путать юзара, он начнет биться в истерике и писать баг-репорты.
То моя забота как его успокоить  Улыбающийся

Могу предложить способ организации данных, в котором каждый из элементов дерева всегда хранит только изменения (например, map< key, variant >). Элемент предоставляет собственные данные, если у него они есть, или обращаемся к верхнему в иерархии элементу, если данных нет; до тех пор, пока не получим данные или не закончится дерево.
Такой необходимости нет, каждый child клона знает свой "оригинал", который может меняться на лету. Изменили оригинал - изменились чвйлды всех клонов. С этим вроде "решаемо" (хотя тоже хлопот хватает). Но вот что делать с UI? Как юзверь должен менять то чего.. нет? 
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #5 : Сентябрь 05, 2016, 14:39 »

Изменили оригинал - изменились чвйлды всех клонов. С этим вроде "решаемо" (хотя тоже хлопот хватает). Но вот что делать с UI? Как юзверь должен менять то чего.. нет? 

Это понятно. Но посколько "оригиналы" известны - то чайлд клона мог бы в гуе их отображать как "наследованные" (т.е. со значениями оригиналов, но в др. стиле, серенькими там). А как только юзер ткнул мышом на параметр и поменял - он перестает быть "наследованным" и отображается как нормальный параметр.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Сентябрь 06, 2016, 08:37 »

Это понятно. Но посколько "оригиналы" известны - то чайлд клона мог бы в гуе их отображать как "наследованные" (т.е. со значениями оригиналов, но в др. стиле, серенькими там).
Если нод в дереве - немедленно получаю (или огребаю) "вытекающие". Напр юзер имеет право отлинковать его от парента или прилинковать к другому - но для чайлдов клона это работать не будет. Или даже просто "удалить" - нет такой операции для чайлда. Получается что с "серенькими" почти ничего нельзя делать - ну и нафиг тогда они нужны? 

А как только юзер ткнул мышом на параметр и поменял - он перестает быть "наследованным" и отображается как нормальный параметр.
Я понял идею, но параметр может быть глубоко "закопан" в иерархии
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #7 : Сентябрь 06, 2016, 10:57 »

Тогда так:
- в списке параметров чайлдов показывать только изменённые параменты (их можно изменять или удалять непосредственно).
- последним пунктом списка сделать "Добавить..", который будет вызывать диалог с иерархией всех параметров "родителя" (если их дофига, то со строкой поиска/фильтра). Здесь можно будет выбрать параметры, которые должны отличаться от оригинала. По "ок" они добавляются в список выше.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.