Skip to content

Commit

Permalink
Widgets|libappfw: DirectoryListDialog can have multiple groups
Browse files Browse the repository at this point in the history
  • Loading branch information
skyjake committed Mar 9, 2017
1 parent 4edcef6 commit b418318
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 24 deletions.
15 changes: 13 additions & 2 deletions doomsday/sdk/libappfw/include/de/dialogs/directorylistdialog.h
Expand Up @@ -21,6 +21,7 @@

#include "../MessageDialog"
#include "../DirectoryArrayWidget"
#include <de/Id>

namespace de {

Expand All @@ -29,20 +30,30 @@ namespace de {
*/
class LIBAPPFW_PUBLIC DirectoryListDialog : public MessageDialog
{
Q_OBJECT

public:
DirectoryListDialog(String const &name = String());

Id addGroup(String const &title, String const &description);

/**
* Sets the list elements.
* @param elements Array of text strings, or a single TextValue.
*/
void setValue(Value const &elements);
void setValue(Id const &group, Value const &elements);

/**
* Returns the contents of the directory list.
* Array of text strings, or a single TextValue.
*/
Value const &value() const;
Value const &value(Id const &group) const;

signals:
void arrayChanged();

protected:
void prepare() override;

private:
DENG2_PRIVATE(d)
Expand Down
Expand Up @@ -62,6 +62,9 @@ class LIBAPPFW_PUBLIC VariableArrayWidget : public GuiWidget

ui::Item *makeItem(Value const &value);

signals:
void arrayChanged();

protected:
virtual String labelForElement(Value const &value) const;

Expand Down
83 changes: 67 additions & 16 deletions doomsday/sdk/libappfw/src/dialogs/directorylistdialog.cpp
Expand Up @@ -25,42 +25,93 @@ namespace de {

DENG2_PIMPL(DirectoryListDialog)
{
Variable array;
DirectoryArrayWidget *list;
struct Group
{
LabelWidget *title;
LabelWidget *description;
Variable array;
DirectoryArrayWidget *list;
};
QHash<Id::Type, Group *> groups;

Impl(Public *i) : Base(i)
{}

~Impl()
{
qDeleteAll(groups);
}

Id addGroup(String const &title, String const &description)
{
array.set(new ArrayValue);
list = new DirectoryArrayWidget(array);
list->margins().setZero();
self().add(list->detachAddButton(self().area().rule().width()));
list->addButton().hide();
Id groupId;
std::unique_ptr<Group> group(new Group);

self().area().add(group->title = new LabelWidget);
group->title->setText(title);
group->title->setMaximumTextWidth(self().area().rule().width() -
self().margins().width());
group->title->setTextLineAlignment(ui::AlignLeft);
group->title->setAlignment(ui::AlignLeft);
group->title->setFont("separator.label");
group->title->setTextColor("accent");
group->title->margins().setTop("gap");

self().area().add(group->description = new LabelWidget);
group->description->setText(description);
group->description->setMaximumTextWidth(self().area().rule().width() -
self().margins().width());
group->description->setTextLineAlignment(ui::AlignLeft);
group->description->setAlignment(ui::AlignLeft);
group->description->margins().setBottom(ConstantRule::zero());

group->array.set(new ArrayValue);
group->list = new DirectoryArrayWidget(group->array);
group->list->margins().setZero();
//self().add(group->list->detachAddButton(self().area().rule().width()));
//group->list->addButton().hide();
self().area().add(group->list);

QObject::connect(group->list, SIGNAL(arrayChanged()),
thisPublic, SIGNAL(arrayChanged()));

groups.insert(groupId, group.release());
return groupId;
}
};

DirectoryListDialog::DirectoryListDialog(String const &name)
: MessageDialog(name)
, d(new Impl(this))
{
area().add(d->list);

buttons() << new DialogButtonItem(Default | Accept)
<< new DialogButtonItem(Reject)
<< new DialogButtonItem(Action, style().images().image("create"),
<< new DialogButtonItem(Reject);
/*<< new DialogButtonItem(Action, style().images().image("create"),
tr("Add Folder"),
new SignalAction(&d->list->addButton(), SLOT(trigger())));
new SignalAction(&d->list->addButton(), SLOT(trigger())));*/
}

Id DirectoryListDialog::addGroup(String const &title, String const &description)
{
return d->addGroup(title, description);
}

void DirectoryListDialog::prepare()
{
MessageDialog::prepare();
updateLayout();
}

void DirectoryListDialog::setValue(Value const &elements)
void DirectoryListDialog::setValue(Id const &id, Value const &elements)
{
d->array.set(elements);
DENG2_ASSERT(d->groups.contains(id));
d->groups[id]->array.set(elements);
}

Value const &DirectoryListDialog::value() const
Value const &DirectoryListDialog::value(Id const &id) const
{
return d->array.value();
DENG2_ASSERT(d->groups.contains(id));
return d->groups[id]->array.value();
}

} // namespace de
4 changes: 1 addition & 3 deletions doomsday/sdk/libappfw/src/widgets/directoryarraywidget.cpp
Expand Up @@ -27,9 +27,7 @@
namespace de {

DENG2_PIMPL_NOREF(DirectoryArrayWidget)
{

};
{};

DirectoryArrayWidget::DirectoryArrayWidget(Variable &variable, String const &name)
: VariableArrayWidget(variable, name)
Expand Down
10 changes: 7 additions & 3 deletions doomsday/sdk/libappfw/src/widgets/variablearraywidget.cpp
Expand Up @@ -174,16 +174,19 @@ VariableArrayWidget::VariableArrayWidget(Variable &variable, String const &name)
.setLeftTop(margins().left() + rule().left(),
margins().top() + rule().top());

d->addButton->setFont("small");
d->addButton->setStyleImage("create", d->addButton->fontId());
d->addButton->setTextAlignment(ui::AlignRight);
d->addButton->setSizePolicy(ui::Fixed, ui::Expand);
d->addButton->setSizePolicy(ui::Expand, ui::Expand);

AutoRef<Rule> totalWidth(OperatorRule::maximum(d->menu->rule().width(),
d->deleteButton->rule().width() +
d->addButton->contentWidth()));

d->addButton->rule()
.setInput(Rule::Width, totalWidth)
.setLeftTop(d->menu->rule().left(), d->menu->rule().bottom());
//.setInput(Rule::Width, totalWidth)
.setLeftTop(d->deleteButton->rule().width() + d->menu->rule().left(),
d->menu->rule().bottom());

d->deleteButton->rule().setInput(Rule::Left, d->menu->rule().left());
d->deleteButton->setActionFn([this] ()
Expand Down Expand Up @@ -250,6 +253,7 @@ void VariableArrayWidget::updateFromVariable()
void VariableArrayWidget::setVariableFromWidget()
{
d->setVariableFromWidget();
emit arrayChanged();
}

} // namespace de

0 comments on commit b418318

Please sign in to comment.