Фотошоп стиль GUI дизайн - PullRequest
1 голос
/ 27 ноября 2009

В таком инструменте, как Photoshop, есть выбор инструментов, на которые вы можете нажать (например, перо, кисть и т. Д.). После того, как вы нажмете на инструмент, вы сможете использовать этот инструмент для рисования, стирания и т. Д. В зависимости от того, какой инструмент выбран.

Мне интересно, как это лучше всего реализовать в ОО-дизайне. Я мог думать только о наличии GUIManager, который всегда знает, какой инструмент выбран, а затем, когда Canvas (область рисования) обнаруживает щелчок мыши или перетаскивание мыши, он спрашивает GUIManager, какой инструмент выбран, и применяет поведение этого инструмента.

Кто-нибудь описывает возможное решение в деталях на уровне класса (или в любой детали, если у вас нет времени).

Ответы [ 3 ]

1 голос
/ 27 ноября 2009

Я не уверен, что принципы ОО действительно играют в этом роль, за исключением того, что все графические элементы, вероятно, являются производными от общих базовых классов в выбранном вами графическом интерфейсе.

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

Хотя, если у вас есть мотивация написать программу дважды с использованием разных стилей, может быть интересно увидеть результаты. На данный момент ранжирование различных стилей программирования является открытым вопросом без реальных ответов, хотя мы считаем, что ОО-стили важны в том смысле, что мы еще не полностью определили их количество.

1 голос
/ 27 ноября 2009

Одна идея для этого будет иметь класс инструмента. Просто набросать это в C ++ - как псевдокод:

class Tool
{
public:
    // Keep a pointer to the "document", i.e. some representation of the
    // image you are editing
    Tool(Document *pDoc);

    // Process mouse events -- this need to be overridden to execute
    // the appropriate behaviour depending on the concrete type of tool
    virtual void OnMouseEvent(const MouseEvent &e) = 0;

    // and so on
};

Затем вы наследуете от этого абстрактного класса инструментов, чтобы предоставить конкретные инструменты, необходимые вашему приложению. Когда выбран определенный инструмент, вы создаете экземпляр соответствующего объекта инструмента и запоминаете его где-нибудь. Окно перенаправляет события мыши в активный в данный момент объект инструмента, который затем выполняет действия, соответствующие выбранному инструменту.

Это реализация шаблона состояния, на который ссылается Йоханнес.

1 голос
/ 27 ноября 2009

Взгляните на State State , который имеет именно ваш пример.

Однако на самом деле это не вопрос графического интерфейса, а скорее объектно-ориентированный подход к моделированию этой проблемы. Графический интерфейс на самом деле не играет в этом.

...