1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-26 09:35:28 +00:00

Merge branch 'buttons'

This commit is contained in:
Marc Zinnschlag 2014-11-28 09:16:47 +01:00
commit dadc089ddb
15 changed files with 299 additions and 38 deletions

View File

@ -73,6 +73,7 @@ opencs_units_noqt (view/world
opencs_units (view/widget
scenetoolbar scenetool scenetoolmode pushbutton scenetooltoggle scenetoolrun modebutton
scenetooltoggle2
)
opencs_units (view/render

View File

@ -8,10 +8,10 @@ namespace CSVRender
{
// elements that are part of the actual scene
Element_Reference = 0x1,
Element_Terrain = 0x2,
Element_Pathgrid = 0x2,
Element_Water = 0x4,
Element_Pathgrid = 0x8,
Element_Fog = 0x10,
Element_Fog = 0x8,
Element_Terrain = 0x10,
// control elements
Element_CellMarker = 0x10000,

View File

@ -8,9 +8,13 @@
#include "worldspacewidget.hpp"
#include "cell.hpp"
namespace CSVWidget
{
class SceneToolToggle;
}
namespace CSVRender
{
class TextOverlay;
class OverlayMask;

View File

@ -15,6 +15,7 @@
#include "../../model/world/tablemimedata.hpp"
#include "../widget/scenetooltoggle.hpp"
#include "../widget/scenetooltoggle2.hpp"
#include "elements.hpp"
@ -32,14 +33,6 @@ void CSVRender::UnpagedWorldspaceWidget::update()
flagAsModified();
}
void CSVRender::UnpagedWorldspaceWidget::addVisibilitySelectorButtons (
CSVWidget::SceneToolToggle *tool)
{
WorldspaceWidget::addVisibilitySelectorButtons (tool);
tool->addButton (":armor.png", Element_Fog, ":armor.png", "Fog");
}
CSVRender::UnpagedWorldspaceWidget::UnpagedWorldspaceWidget (const std::string& cellId, CSMDoc::Document& document, QWidget* parent)
: WorldspaceWidget (document, parent), mCellId (cellId)
{

View File

@ -32,10 +32,6 @@ namespace CSVRender
void update();
protected:
virtual void addVisibilitySelectorButtons (CSVWidget::SceneToolToggle *tool);
public:
UnpagedWorldspaceWidget (const std::string& cellId, CSMDoc::Document& document,

View File

@ -13,7 +13,7 @@
#include "../../model/world/idtable.hpp"
#include "../widget/scenetoolmode.hpp"
#include "../widget/scenetooltoggle.hpp"
#include "../widget/scenetooltoggle2.hpp"
#include "../widget/scenetoolrun.hpp"
#include "../world/physicsmanager.hpp"
@ -127,10 +127,10 @@ CSVWidget::SceneToolMode *CSVRender::WorldspaceWidget::makeNavigationSelector (
return tool;
}
CSVWidget::SceneToolToggle *CSVRender::WorldspaceWidget::makeSceneVisibilitySelector (CSVWidget::SceneToolbar *parent)
CSVWidget::SceneToolToggle2 *CSVRender::WorldspaceWidget::makeSceneVisibilitySelector (CSVWidget::SceneToolbar *parent)
{
mSceneElements= new CSVWidget::SceneToolToggle (parent,
"Scene Element Visibility", ":placeholder");
mSceneElements = new CSVWidget::SceneToolToggle2 (parent,
"Scene Element Visibility", ":scenetoolbar/scene-view-c", ":scenetoolbar/scene-view-");
addVisibilitySelectorButtons (mSceneElements);
@ -172,7 +172,7 @@ CSVWidget::SceneToolRun *CSVRender::WorldspaceWidget::makeRunTool (
std::sort (profiles.begin(), profiles.end());
mRun = new CSVWidget::SceneToolRun (parent, "Run OpenMW from the current camera position",
":placeholder", ":placeholder", profiles);
":scenetoolbar/play", profiles);
connect (mRun, SIGNAL (runRequest (const std::string&)),
this, SLOT (runRequest (const std::string&)));
@ -260,12 +260,13 @@ unsigned int CSVRender::WorldspaceWidget::getInteractionMask() const
}
void CSVRender::WorldspaceWidget::addVisibilitySelectorButtons (
CSVWidget::SceneToolToggle *tool)
CSVWidget::SceneToolToggle2 *tool)
{
tool->addButton (":placeholder", Element_Reference, ":placeholder", "References");
tool->addButton (":placeholder", Element_Terrain, ":placeholder", "Terrain");
tool->addButton (":placeholder", Element_Water, ":placeholder", "Water");
tool->addButton (":placeholder", Element_Pathgrid, ":placeholder", "Pathgrid");
tool->addButton (Element_Reference, "References");
tool->addButton (Element_Terrain, "Terrain");
tool->addButton (Element_Water, "Water");
tool->addButton (Element_Pathgrid, "Pathgrid");
tool->addButton (Element_Fog, "Fog");
}
void CSVRender::WorldspaceWidget::addEditModeSelectorButtons (CSVWidget::SceneToolMode *tool)

View File

@ -18,7 +18,7 @@ namespace CSMWorld
namespace CSVWidget
{
class SceneToolMode;
class SceneToolToggle;
class SceneToolToggle2;
class SceneToolbar;
class SceneToolRun;
}
@ -37,7 +37,7 @@ namespace CSVRender
CSVRender::Navigation1st m1st;
CSVRender::NavigationFree mFree;
CSVRender::NavigationOrbit mOrbit;
CSVWidget::SceneToolToggle *mSceneElements;
CSVWidget::SceneToolToggle2 *mSceneElements;
CSVWidget::SceneToolRun *mRun;
CSMDoc::Document& mDocument;
CSVWorld::PhysicsSystem *mPhysics;
@ -71,7 +71,7 @@ namespace CSVRender
/// \attention The created tool is not added to the toolbar (via addTool). Doing
/// that is the responsibility of the calling function.
CSVWidget::SceneToolToggle *makeSceneVisibilitySelector (
CSVWidget::SceneToolToggle2 *makeSceneVisibilitySelector (
CSVWidget::SceneToolbar *parent);
/// \attention The created tool is not added to the toolbar (via addTool). Doing
@ -107,7 +107,7 @@ namespace CSVRender
protected:
virtual void addVisibilitySelectorButtons (CSVWidget::SceneToolToggle *tool);
virtual void addVisibilitySelectorButtons (CSVWidget::SceneToolToggle2 *tool);
virtual void addEditModeSelectorButtons (CSVWidget::SceneToolMode *tool);

View File

@ -72,6 +72,11 @@ CSVWidget::PushButton::PushButton (const QIcon& icon, Type type, const QString&
QWidget *parent)
: QPushButton (icon, "", parent), mKeepOpen (false), mType (type), mToolTip (tooltip)
{
if (type==Type_Mode || type==Type_Toggle)
{
setCheckable (true);
connect (this, SIGNAL (toggled (bool)), this, SLOT (checkedStateChanged (bool)));
}
setCheckable (type==Type_Mode || type==Type_Toggle);
setExtendedToolTip();
}
@ -96,4 +101,9 @@ QString CSVWidget::PushButton::getBaseToolTip() const
CSVWidget::PushButton::Type CSVWidget::PushButton::getType() const
{
return mType;
}
void CSVWidget::PushButton::checkedStateChanged (bool checked)
{
setExtendedToolTip();
}

View File

@ -53,6 +53,10 @@ namespace CSVWidget
QString getBaseToolTip() const;
Type getType() const;
private slots:
void checkedStateChanged (bool checked);
};
}

View File

@ -26,7 +26,7 @@ void CSVWidget::SceneToolRun::adjustToolTips()
void CSVWidget::SceneToolRun::updateIcon()
{
setIcon (QIcon (mSelected==mProfiles.end() ? mIconDisabled : mIcon));
setDisabled (mSelected==mProfiles.end());
}
void CSVWidget::SceneToolRun::updatePanel()
@ -46,11 +46,11 @@ void CSVWidget::SceneToolRun::updatePanel()
}
CSVWidget::SceneToolRun::SceneToolRun (SceneToolbar *parent, const QString& toolTip,
const QString& icon, const QString& iconDisabled, const std::vector<std::string>& profiles)
const QString& icon, const std::vector<std::string>& profiles)
: SceneTool (parent, Type_TopAction), mProfiles (profiles.begin(), profiles.end()),
mSelected (mProfiles.begin()), mToolTip (toolTip), mIcon (icon),
mIconDisabled (iconDisabled)
mSelected (mProfiles.begin()), mToolTip (toolTip)
{
setIcon (QIcon (icon));
updateIcon();
adjustToolTips();

View File

@ -19,8 +19,6 @@ namespace CSVWidget
std::set<std::string> mProfiles;
std::set<std::string>::iterator mSelected;
QString mToolTip;
QString mIcon;
QString mIconDisabled;
QFrame *mPanel;
QTableWidget *mTable;
@ -35,7 +33,7 @@ namespace CSVWidget
public:
SceneToolRun (SceneToolbar *parent, const QString& toolTip, const QString& icon,
const QString& iconDisabled, const std::vector<std::string>& profiles);
const std::vector<std::string>& profiles);
virtual void showPanel (const QPoint& position);

View File

@ -0,0 +1,139 @@
#include "scenetooltoggle2.hpp"
#include <stdexcept>
#include <sstream>
#include <QHBoxLayout>
#include <QFrame>
#include <QIcon>
#include <QPainter>
#include "scenetoolbar.hpp"
#include "pushbutton.hpp"
void CSVWidget::SceneToolToggle2::adjustToolTip()
{
QString toolTip = mToolTip;
toolTip += "<p>Currently enabled: ";
bool first = true;
for (std::map<PushButton *, ButtonDesc>::const_iterator iter (mButtons.begin());
iter!=mButtons.end(); ++iter)
if (iter->first->isChecked())
{
if (!first)
toolTip += ", ";
else
first = false;
toolTip += iter->second.mName;
}
if (first)
toolTip += "none";
toolTip += "<p>(left click to alter selection)";
setToolTip (toolTip);
}
void CSVWidget::SceneToolToggle2::adjustIcon()
{
std::ostringstream stream;
stream << mCompositeIcon << getSelection();
setIcon (QIcon (QString::fromUtf8 (stream.str().c_str())));
}
CSVWidget::SceneToolToggle2::SceneToolToggle2 (SceneToolbar *parent, const QString& toolTip,
const std::string& compositeIcon, const std::string& singleIcon)
: SceneTool (parent), mCompositeIcon (compositeIcon), mSingleIcon (singleIcon),
mButtonSize (parent->getButtonSize()), mIconSize (parent->getIconSize()), mToolTip (toolTip),
mFirst (0)
{
mPanel = new QFrame (this, Qt::Popup);
mLayout = new QHBoxLayout (mPanel);
mLayout->setContentsMargins (QMargins (0, 0, 0, 0));
mPanel->setLayout (mLayout);
}
void CSVWidget::SceneToolToggle2::showPanel (const QPoint& position)
{
mPanel->move (position);
mPanel->show();
if (mFirst)
mFirst->setFocus (Qt::OtherFocusReason);
}
void CSVWidget::SceneToolToggle2::addButton (unsigned int id,
const QString& name, const QString& tooltip)
{
std::ostringstream stream;
stream << mSingleIcon << id;
PushButton *button = new PushButton (QIcon (QPixmap (stream.str().c_str())),
PushButton::Type_Toggle, tooltip.isEmpty() ? name: tooltip, mPanel);
button->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed));
button->setIconSize (QSize (mIconSize, mIconSize));
button->setFixedSize (mButtonSize, mButtonSize);
mLayout->addWidget (button);
ButtonDesc desc;
desc.mId = id;
desc.mName = name;
desc.mIndex = mButtons.size();
mButtons.insert (std::make_pair (button, desc));
connect (button, SIGNAL (clicked()), this, SLOT (selected()));
if (mButtons.size()==1)
mFirst = button;
}
unsigned int CSVWidget::SceneToolToggle2::getSelection() const
{
unsigned int selection = 0;
for (std::map<PushButton *, ButtonDesc>::const_iterator iter (mButtons.begin());
iter!=mButtons.end(); ++iter)
if (iter->first->isChecked())
selection |= iter->second.mId;
return selection;
}
void CSVWidget::SceneToolToggle2::setSelection (unsigned int selection)
{
for (std::map<PushButton *, ButtonDesc>::iterator iter (mButtons.begin());
iter!=mButtons.end(); ++iter)
iter->first->setChecked (selection & iter->second.mId);
adjustToolTip();
adjustIcon();
}
void CSVWidget::SceneToolToggle2::selected()
{
std::map<PushButton *, ButtonDesc>::const_iterator iter =
mButtons.find (dynamic_cast<PushButton *> (sender()));
if (iter!=mButtons.end())
{
if (!iter->first->hasKeepOpen())
mPanel->hide();
adjustToolTip();
adjustIcon();
emit selectionChanged();
}
}

View File

@ -0,0 +1,76 @@
#ifndef CSV_WIDGET_SCENETOOL_TOGGLE2_H
#define CSV_WIDGET_SCENETOOL_TOGGLE2_H
#include "scenetool.hpp"
#include <map>
class QHBoxLayout;
class QRect;
namespace CSVWidget
{
class SceneToolbar;
class PushButton;
///< \brief Multi-Toggle tool
///
/// Top level button is using predefined icons instead building a composite icon.
class SceneToolToggle2 : public SceneTool
{
Q_OBJECT
struct ButtonDesc
{
unsigned int mId;
QString mName;
int mIndex;
};
std::string mCompositeIcon;
std::string mSingleIcon;
QWidget *mPanel;
QHBoxLayout *mLayout;
std::map<PushButton *, ButtonDesc> mButtons; // widget, id
int mButtonSize;
int mIconSize;
QString mToolTip;
PushButton *mFirst;
void adjustToolTip();
void adjustIcon();
public:
/// The top level icon is compositeIcon + sum of bitpatterns for active buttons (in
/// decimal)
///
/// The icon for individual toggle buttons is signleIcon + bitmask for button (in
/// decimal)
SceneToolToggle2 (SceneToolbar *parent, const QString& toolTip,
const std::string& compositeIcon, const std::string& singleIcon);
virtual void showPanel (const QPoint& position);
/// \attention After the last button has been added, setSelection must be called at
/// least once to finalise the layout.
void addButton (unsigned int id,
const QString& name, const QString& tooltip = "");
unsigned int getSelection() const;
/// \param or'ed button IDs. IDs that do not exist will be ignored.
void setSelection (unsigned int selection);
signals:
void selectionChanged();
private slots:
void selected();
};
}
#endif

View File

@ -20,6 +20,7 @@
#include "../widget/scenetoolbar.hpp"
#include "../widget/scenetoolmode.hpp"
#include "../widget/scenetooltoggle.hpp"
#include "../widget/scenetooltoggle2.hpp"
#include "../widget/scenetoolrun.hpp"
#include "tablebottombox.hpp"
@ -109,7 +110,7 @@ CSVWidget::SceneToolbar* CSVWorld::SceneSubView::makeToolbar (CSVRender::Worldsp
CSVWidget::SceneToolMode *lightingTool = widget->makeLightingSelector (toolbar);
toolbar->addTool (lightingTool);
CSVWidget::SceneToolToggle *sceneVisibilityTool =
CSVWidget::SceneToolToggle2 *sceneVisibilityTool =
widget->makeSceneVisibilitySelector (toolbar);
toolbar->addTool (sceneVisibilityTool);

View File

@ -79,5 +79,43 @@
<file alias="1st-person">eyeballdude.png</file>
<file alias="free-camera">flying eye.png</file>
<file alias="orbiting-camera">orbit2.png</file>
<file alias="play">scene-play.png</file>
<file alias="scene-view-1">scene-view-references.png</file>
<file alias="scene-view-16">scene-view-terrain.png</file>
<file alias="scene-view-4">scene-view-water.png</file>
<file alias="scene-view-2">scene-view-pathgrid.png</file>
<file alias="scene-view-8">scene-view-fog.png</file>
<file alias="scene-view-c0">scene-view-status-0.png</file>
<file alias="scene-view-c1">scene-view-status-1.png</file>
<file alias="scene-view-c2">scene-view-status-2.png</file>
<file alias="scene-view-c3">scene-view-status-3.png</file>
<file alias="scene-view-c4">scene-view-status-4.png</file>
<file alias="scene-view-c5">scene-view-status-5.png</file>
<file alias="scene-view-c6">scene-view-status-6.png</file>
<file alias="scene-view-c7">scene-view-status-7.png</file>
<file alias="scene-view-c8">scene-view-status-8.png</file>
<file alias="scene-view-c9">scene-view-status-9.png</file>
<file alias="scene-view-c10">scene-view-status-10.png</file>
<file alias="scene-view-c11">scene-view-status-11.png</file>
<file alias="scene-view-c12">scene-view-status-12.png</file>
<file alias="scene-view-c13">scene-view-status-13.png</file>
<file alias="scene-view-c14">scene-view-status-14.png</file>
<file alias="scene-view-c15">scene-view-status-15.png</file>
<file alias="scene-view-c16">scene-view-status-16.png</file>
<file alias="scene-view-c17">scene-view-status-17.png</file>
<file alias="scene-view-c18">scene-view-status-18.png</file>
<file alias="scene-view-c19">scene-view-status-19.png</file>
<file alias="scene-view-c20">scene-view-status-20.png</file>
<file alias="scene-view-c21">scene-view-status-21.png</file>
<file alias="scene-view-c22">scene-view-status-22.png</file>
<file alias="scene-view-c23">scene-view-status-23.png</file>
<file alias="scene-view-c24">scene-view-status-24.png</file>
<file alias="scene-view-c25">scene-view-status-25.png</file>
<file alias="scene-view-c26">scene-view-status-26.png</file>
<file alias="scene-view-c27">scene-view-status-27.png</file>
<file alias="scene-view-c28">scene-view-status-28.png</file>
<file alias="scene-view-c29">scene-view-status-29.png</file>
<file alias="scene-view-c30">scene-view-status-30.png</file>
<file alias="scene-view-c31">scene-view-status-31.png</file>
</qresource>
</RCC>