AniControls::AniControls() : ButtonSet(5) { SkinTheme* theme = static_cast<SkinTheme*>(this->theme()); addItem(theme->parts.aniFirst()); addItem(theme->parts.aniPrevious()); addItem(theme->parts.aniPlay()); addItem(theme->parts.aniNext()); addItem(theme->parts.aniLast()); ItemChange.connect(base::Bind(&AniControls::onClickButton, this)); setTriggerOnMouseUp(true); setTransparent(true); TooltipManager* tooltips = new TooltipManager; addChild(tooltips); for (int i=0; i<ACTIONS; ++i) tooltips->addTooltipFor(getItem(i), getTooltipFor(i), BOTTOM); getItem(ACTION_PLAY)->enableFlags(CTRL_RIGHT_CLICK); InitTheme.connect( [this]{ SkinTheme* theme = static_cast<SkinTheme*>(this->theme()); setBgColor(theme->colors.workspace()); }); }
StatusBar::StatusBar() : Widget(statusbar_type()) , m_timeout(0) , m_state(SHOW_TEXT) , m_color(app::Color::fromMask()) , m_docControls(new HBox) , m_doc(nullptr) , m_tipwindow(nullptr) , m_snapToGridWindow(nullptr) { m_instance = this; setDoubleBuffered(true); SkinTheme* theme = static_cast<SkinTheme*>(this->getTheme()); setBgColor(theme->colors.statusBarFace()); this->setFocusStop(true); // The extra pixel in left and right borders are necessary so // m_commandsBox and m_movePixelsBox do not overlap the upper-left // and upper-right pixels drawn in onPaint() event (see putpixels) setBorder(gfx::Border(1*guiscale(), 0, 1*guiscale(), 0)); m_docControls->setVisible(false); addChild(m_docControls); // Construct the commands box { Box* box1 = new Box(HORIZONTAL); Box* box4 = new Box(HORIZONTAL); m_frameLabel = new Label("Frame:"); m_currentFrame = new GotoFrameEntry(); m_newFrame = new Button("+"); m_newFrame->Click.connect(Bind<void>(&StatusBar::newFrame, this)); m_zoomEntry = new ZoomEntry; m_zoomEntry->ZoomChange.connect(&StatusBar::onChangeZoom, this); setup_mini_look(m_currentFrame); setup_mini_look(m_newFrame); box1->setBorder(gfx::Border(2, 1, 2, 2)*guiscale()); box4->addChild(m_currentFrame); box4->addChild(m_newFrame); box1->addChild(m_frameLabel); box1->addChild(box4); box1->addChild(m_zoomEntry); m_docControls->addChild(box1); } // Tooltips manager TooltipManager* tooltipManager = new TooltipManager(); addChild(tooltipManager); tooltipManager->addTooltipFor(m_currentFrame, "Current Frame", BOTTOM); tooltipManager->addTooltipFor(m_zoomEntry, "Zoom Level", BOTTOM); Preferences::instance().toolBox.activeTool.AfterChange.connect( Bind<void>(&StatusBar::onCurrentToolChange, this)); UIContext::instance()->addObserver(this); UIContext::instance()->documents().addObserver(this); }
StatusBar::StatusBar() : Widget(statusbar_type()) , m_color(app::Color::fromMask()) , m_hasDoc(false) { m_instance = this; setDoubleBuffered(true); SkinTheme* theme = static_cast<SkinTheme*>(this->getTheme()); setBgColor(theme->getColorById(kStatusBarFace)); this->setFocusStop(true); m_timeout = 0; m_state = SHOW_TEXT; m_tipwindow = NULL; // The extra pixel in left and right borders are necessary so // m_commandsBox and m_movePixelsBox do not overlap the upper-left // and upper-right pixels drawn in onPaint() event (see putpixels) setBorder(gfx::Border(1*guiscale(), 0, 1*guiscale(), 0)); // Construct the commands box { Box* box1 = new Box(JI_HORIZONTAL); Box* box4 = new Box(JI_HORIZONTAL); m_frameLabel = new Label("Frame:"); m_currentFrame = new GotoFrameEntry(); m_newFrame = new Button("+"); m_newFrame->Click.connect(Bind<void>(&StatusBar::newFrame, this)); m_slider = new Slider(0, 255, 255); setup_mini_look(m_currentFrame); setup_mini_look(m_newFrame); setup_mini_look(m_slider); m_slider->Change.connect(Bind<void>(&StatusBar::onCelOpacityChange, this)); m_slider->setMinSize(gfx::Size(ui::display_w()/5, 0)); box1->setBorder(gfx::Border(2, 1, 2, 2)*guiscale()); box4->addChild(m_currentFrame); box4->addChild(m_newFrame); box1->addChild(m_frameLabel); box1->addChild(box4); box1->addChild(m_slider); m_commandsBox = box1; addChild(m_commandsBox); m_commandsBox->setVisible(false); } // Tooltips manager TooltipManager* tooltipManager = new TooltipManager(); addChild(tooltipManager); tooltipManager->addTooltipFor(m_currentFrame, "Current Frame", JI_BOTTOM); tooltipManager->addTooltipFor(m_slider, "Cel Opacity", JI_BOTTOM); Preferences::instance().toolBox.activeTool.AfterChange.connect( Bind<void>(&StatusBar::onCurrentToolChange, this)); UIContext::instance()->addObserver(this); }
void SpritePropertiesCommand::onExecute(Context* context) { std::string imgtype_text; ColorButton* color_button = nullptr; // List of available color profiles std::vector<os::ColorSpacePtr> colorSpaces; os::instance()->listColorSpaces(colorSpaces); // Load the window widget app::gen::SpriteProperties window; int selectedColorProfile = -1; auto updateButtons = [&] { bool enabled = (selectedColorProfile != window.colorProfile()->getSelectedItemIndex()); window.assignColorProfile()->setEnabled(enabled); window.convertColorProfile()->setEnabled(enabled); window.ok()->setEnabled(!enabled); }; // Get sprite properties and fill frame fields { const ContextReader reader(context); const Doc* document(reader.document()); const Sprite* sprite(reader.sprite()); // Update widgets values switch (sprite->pixelFormat()) { case IMAGE_RGB: imgtype_text = "RGB"; break; case IMAGE_GRAYSCALE: imgtype_text = "Grayscale"; break; case IMAGE_INDEXED: imgtype_text = fmt::format("Indexed ({0} colors)", sprite->palette(0)->size()); break; default: ASSERT(false); imgtype_text = "Unknown"; break; } // Filename window.name()->setText(document->filename()); // Color mode window.type()->setText(imgtype_text.c_str()); // Sprite size (width and height) window.size()->setTextf( "%dx%d (%s)", sprite->width(), sprite->height(), base::get_pretty_memory_size(sprite->getMemSize()).c_str()); // How many frames window.frames()->setTextf("%d", (int)sprite->totalFrames()); if (sprite->pixelFormat() == IMAGE_INDEXED) { color_button = new ColorButton(app::Color::fromIndex(sprite->transparentColor()), IMAGE_INDEXED, ColorButtonOptions()); window.transparentColorPlaceholder()->addChild(color_button); // TODO add a way to get or create an existent TooltipManager TooltipManager* tooltipManager = new TooltipManager; window.addChild(tooltipManager); tooltipManager->addTooltipFor( color_button, Strings::sprite_properties_transparent_color_tooltip(), LEFT); } else { window.transparentColorPlaceholder()->addChild(new Label("(only for indexed images)")); } // Pixel ratio window.pixelRatio()->setValue( base::convert_to<std::string>(sprite->pixelRatio())); // Color profile selectedColorProfile = -1; int i = 0; for (auto& cs : colorSpaces) { if (cs->gfxColorSpace()->nearlyEqual(*sprite->colorSpace())) { selectedColorProfile = i; break; } ++i; } if (selectedColorProfile < 0) { colorSpaces.push_back(os::instance()->createColorSpace(sprite->colorSpace())); selectedColorProfile = colorSpaces.size()-1; } for (auto& cs : colorSpaces) window.colorProfile()->addItem(cs->gfxColorSpace()->name()); window.colorProfile()->setSelectedItemIndex(selectedColorProfile); window.assignColorProfile()->setEnabled(false); window.convertColorProfile()->setEnabled(false); window.colorProfile()->Change.connect(updateButtons); window.assignColorProfile()->Click.connect( [&](Event&){ selectedColorProfile = window.colorProfile()->getSelectedItemIndex(); ContextWriter writer(context); Sprite* sprite(writer.sprite()); Tx tx(writer.context(), "Assign Color Profile"); tx(new cmd::AssignColorProfile( sprite, colorSpaces[selectedColorProfile]->gfxColorSpace())); tx.commit(); updateButtons(); }); window.convertColorProfile()->Click.connect( [&](Event&){ selectedColorProfile = window.colorProfile()->getSelectedItemIndex(); ContextWriter writer(context); Sprite* sprite(writer.sprite()); Tx tx(writer.context(), "Convert Color Profile"); tx(new cmd::ConvertColorProfile( sprite, colorSpaces[selectedColorProfile]->gfxColorSpace())); tx.commit(); updateButtons(); }); } window.remapWindow(); window.centerWindow(); load_window_pos(&window, "SpriteProperties"); window.setVisible(true); window.openWindowInForeground(); if (window.closer() == window.ok()) { ContextWriter writer(context); Sprite* sprite(writer.sprite()); color_t index = (color_button ? color_button->getColor().getIndex(): sprite->transparentColor()); PixelRatio pixelRatio = base::convert_to<PixelRatio>(window.pixelRatio()->getValue()); if (index != sprite->transparentColor() || pixelRatio != sprite->pixelRatio()) { Tx tx(writer.context(), "Change Sprite Properties"); DocApi api = writer.document()->getApi(tx); if (index != sprite->transparentColor()) api.setSpriteTransparentColor(sprite, index); if (pixelRatio != sprite->pixelRatio()) tx(new cmd::SetPixelRatio(sprite, pixelRatio)); tx.commit(); update_screen_for_document(writer.document()); } } save_window_pos(&window, "SpriteProperties"); }