笔记本太大,图片sfgui

时间:2017-01-10 19:02:18

标签: c++ sfml

我试图找几次这样的答案,花了好几个小时,但我很困难,我知道这是一个非常基本的问题' - '但是,我仍然被卡住了。 / p>

所以,问题是,对于我与SFGUI的界面,我创建了一个笔记本,所以它工作正常,笔记本显示,它在正确的位置,...

但有一件事我不能靠自己做。我在每页添加一个图像,它仍然正常工作,我的图像正在加载,显示... 但是,当我运行整个事情时,我意识到了一些事情。如果图像很大,则占用的空间将超过100%。说实话,我只想要使用20%的空间。我尝试在笔记本和图像上使用许多内容,如SetRequisition。它仍然不起作用,它仍然太大。所以我不知道该去哪里,如何调整笔记本大小。

这是代码,对不起评论,我目前尝试过的东西,没有花时间评论它。我很快就会这样做,因为我的小脑子开始变得太多了; - ;

#include "Editor.h"

#include <string>

void Editor::Run() {
    sf::RenderWindow render_window(sf::VideoMode(800, 600), "Map Editor");
    m_window = sfg::Window::Create(sfg::Window::Style::NO_STYLE);

    Init();
    render_window.resetGLStates();

    while(render_window.isOpen()) {

        while (render_window.pollEvent(m_event)) {
            m_desktop.HandleEvent(m_event);

            if (m_event.type == sf::Event::Closed) {
                render_window.close();
            }
        }

        m_desktop.Update(m_clock.restart().asSeconds());

        render_window.clear(sf::Color::White);
        m_sfgui.Display(render_window);
        render_window.display();
    }
}

void Editor::Init() {
    InitBoxes();

    CreateButton(&Editor::CreateFile, "res/newFile.png");
    CreateButton(&Editor::OpenFile, "res/openFile.png");

    auto updateTileButton = sfg::Button::Create("Update Tiles");
    updateTileButton->GetSignal(sfg::Button::OnLeftClick).Connect( std::bind(&Editor::UpdateTilesets, this) );
    m_tilesBox->Pack(updateTileButton, false, false);

    m_mapPreview = sfg::Canvas::Create();

    UpdateTilesets();
    m_tilesBox->Pack(m_tilesList, false, false);

    m_editBox->Pack(m_tilesBox, false, false);
    m_editBox->Pack(m_mapPreview, false, false);

    m_generalBox->Pack(m_toolsBox);
    m_generalBox->Pack(m_editBox, false, false);

    m_window->Add(m_generalBox);
    m_desktop.Add(m_window);
}

void Editor::InitBoxes() {
    m_generalBox = sfg::Box::Create(sfg::Box::Orientation::VERTICAL, 15.f);
    m_toolsBox = sfg::Box::Create(sfg::Box::Orientation::HORIZONTAL, 10.f);
    m_editBox = sfg::Box::Create(sfg::Box::Orientation::HORIZONTAL);
    m_tilesBox = sfg::Box::Create(sfg::Box::Orientation::VERTICAL);
}

void Editor::UpdateTilesets() {
    m_tilesList = sfg::Notebook::Create();
    m_tilesList->SetScrollable(true);

    int i = 0;
    while (true) {
        sf::Image tileset;
        if (!tileset.loadFromFile("res/tileset" + std::to_string(i) + ".png")) {
            return;
        }
        m_tilesList->AppendPage(sfg::Image::Create(tileset), sfg::Label::Create("Tile "+std::to_string(i)));
        i++;
    }
}

bool Editor::CreateFile() {
    /** @return false if an error occurred, true otherwise. */

    return true;
}

bool Editor::OpenFile() {
    /** @return false if an error occurred, true otherwise. */

    return true;
}

和Editor.h

#ifndef EDITOR_H
#define EDITOR_H

#include <SFGUI/SFGUI.hpp>
#include <SFGUI/Widgets.hpp>

#include <SFML/Graphics.hpp>


class Editor {
    public:
        template<typename Func>
        void CreateButton(Func&& func, std::string imagePath) {
            auto button = sfg::Button::Create();
            sf::Image newFileImage; newFileImage.loadFromFile(imagePath);
            button->SetImage(sfg::Image::Create(newFileImage));

            button->GetSignal(sfg::Button::OnLeftClick).Connect( std::bind(func, this) );
            m_toolsBox->Pack(button, false, true);
        }

        /** @brief Starts the program, initializes Window. */
        void Run();

        /** @brief Initializes widgets, sets the interface. */
        void Init();

        /** @brief Initializes boxes. */
        void InitBoxes();


        /** @brief Updates and loads the tilesets available. */
        void UpdateTilesets();

        /** @brief Creates a new map. */
        bool CreateFile();

        /** @brief Opens an existing map. */
        bool OpenFile();

    protected:
        sfg::Box::Ptr m_generalBox;
        sfg::Box::Ptr m_toolsBox;
        sfg::Box::Ptr m_editBox;
        sfg::Box::Ptr m_tilesBox;
        sfg::Notebook::Ptr m_tilesList;
        sfg::Canvas::Ptr m_mapPreview;
        sfg::Window::Ptr m_window;
        sfg::Desktop m_desktop;

    private:
        sfg::SFGUI m_sfgui;
        sf::Event m_event;
        sf::Clock m_clock;
};

#endif // EDITOR_H
编辑:在对SFGUI论坛进行一些研究之后,我发现即使使用SetRequisition也无法在SFGUI设置的最小值下设置大小。所以我明白除非我的图像更小,否则无法调整笔记本的大小,对吧?

嗯,我想这样做的唯一方法是只显示图像的一部分,并使用Notebook页面中的滚动条更改该部分,这是正确的方法吗?

0 个答案:

没有答案