// Aseprite
// Copyright (C) 2019-2020  Igara Studio S.A.
// Copyright (C) 2017  David Capello
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.

#ifndef APP_UI_SLICE_WINDOW_H_INCLUDED
#define APP_UI_SLICE_WINDOW_H_INCLUDED
#pragma once

#include "app/ui/user_data_view.h"
#include "doc/anidir.h"
#include "doc/frame.h"
#include "doc/selected_objects.h"
#include "doc/user_data.h"

#include "slice_properties.xml.h"

namespace doc {
class Slice;
class Sprite;
} // namespace doc

namespace app {

class SliceWindow : protected app::gen::SliceProperties {
public:
  enum Mods {
    kNone = 0x0000,
    kName = 0x0001,
    kBoundsX = 0x0002,
    kBoundsY = 0x0004,
    kBoundsW = 0x0008,
    kBoundsH = 0x0010,
    kCenterX = 0x0020,
    kCenterY = 0x0040,
    kCenterW = 0x0080,
    kCenterH = 0x0100,
    kPivotX = 0x0200,
    kPivotY = 0x0400,
    kUserData = 0x0800,
    kAll = 0xffff,
  };

  SliceWindow(const doc::Sprite* sprite,
              const doc::SelectedObjects& slices,
              const doc::frame_t frame);

  bool show();

  std::string nameValue() const;
  gfx::Rect boundsValue() const;
  gfx::Rect centerValue() const;
  gfx::Point pivotValue() const;
  const doc::UserData& userDataValue() const { return m_userDataView.userData(); }

  Mods modifiedFields() const { return m_mods; }

private:
  void onCenterChange();
  void onPivotChange();
  void onToggleUserData();
  void onModifyField(ui::Entry* entry, const Mods mods);
  void onPossibleColorChange();

  // Flags used to know what specific entry/checkbox was modified
  // when we edit multiple-slices in the same property dialog. In
  // this way we know what field modify of each slice in
  // SlicePropertiesCommand::onExecute().
  Mods m_mods;
  UserDataView m_userDataView;
};

} // namespace app

#endif
