Commit aa9de1c3 authored by twanvl's avatar twanvl

Removed the need for a separate multiple choice thumbnail request. This does...

Removed the need for a separate multiple choice thumbnail request. This does no longer rely on any evil unsafe casts.
parent 0f59be31
...@@ -29,38 +29,40 @@ class ChoiceThumbnailRequest : public ThumbnailRequest { ...@@ -29,38 +29,40 @@ class ChoiceThumbnailRequest : public ThumbnailRequest {
private: private:
StyleSheetP stylesheet; StyleSheetP stylesheet;
int id; int id;
inline ChoiceStyle& style() { return *static_cast<ChoiceStyle*>(viewer().getStyle().get()); }
inline ValueViewer& viewer() { return *static_cast<ValueViewer*>(owner); }
}; };
ChoiceThumbnailRequest::ChoiceThumbnailRequest(ValueViewer* cve, int id, bool from_disk) ChoiceThumbnailRequest::ChoiceThumbnailRequest(ValueViewer* viewer, int id, bool from_disk)
: ThumbnailRequest( : ThumbnailRequest(
reinterpret_cast<void *> (cve), static_cast<void*>(viewer),
cve->viewer.stylesheet->name() + _("/") + cve->getField()->name + _("/") << id, viewer->viewer.stylesheet->name() + _("/") + viewer->getField()->name + _("/") << id,
from_disk ? cve->viewer.stylesheet->lastModified() from_disk ? viewer->viewer.stylesheet->lastModified()
: wxDateTime::Now() : wxDateTime::Now()
) )
, stylesheet(cve->viewer.stylesheet) , stylesheet(viewer->viewer.stylesheet)
, id(id) , id(id)
{ {
ChoiceValueEditor* e = dynamic_cast<ChoiceValueEditor*> (cve); assert(dynamic_pointer_cast<ChoiceStyle>(viewer->getStyle())); // only works on choice styles
if (!e) ChoiceStyle& s = style();
throw InternalError(_("Non-editor passed to ChoiceThumbnailRequest")); String name = cannocial_name_form(s.field().choices->choiceName(id));
String name = cannocial_name_form(e->field().choices->choiceName(id)); ScriptableImage img = s.choice_images[name];
ScriptableImage img = e->style().choice_images[name];
isThreadSafe = img.threadSafe(); isThreadSafe = img.threadSafe();
} }
Image ChoiceThumbnailRequest::generate() { Image ChoiceThumbnailRequest::generate() {
ChoiceValueEditor* cve = reinterpret_cast<ChoiceValueEditor*> (owner); ChoiceStyle& s = style();
String name = cannocial_name_form(cve->field().choices->choiceName(id)); String name = cannocial_name_form(s.field().choices->choiceName(id));
ScriptableImage& img = cve->style().choice_images[name]; ScriptableImage& img = s.choice_images[name];
return img.isReady() return img.isReady()
? img.generate(GeneratedImage::Options(16,16, stylesheet.get(), &cve->getSet(), ASPECT_BORDER, true), false) ? img.generate(GeneratedImage::Options(16,16, stylesheet.get(), viewer().viewer.getSet().get(), ASPECT_BORDER, true), false)
: wxImage(); : wxImage();
} }
void ChoiceThumbnailRequest::store(const Image& img) { void ChoiceThumbnailRequest::store(const Image& img) {
ChoiceValueEditor* cve = reinterpret_cast<ChoiceValueEditor*> (owner); ChoiceStyle& s = style();
wxImageList* il = cve->style().thumbnails; wxImageList* il = s.thumbnails;
while (id > il->GetImageCount()) { while (id > il->GetImageCount()) {
il->Add(wxBitmap(16,16),*wxBLACK); il->Add(wxBitmap(16,16),*wxBLACK);
} }
...@@ -91,7 +93,7 @@ void ChoiceThumbnailRequest::store(const Image& img) { ...@@ -91,7 +93,7 @@ void ChoiceThumbnailRequest::store(const Image& img) {
} else { } else {
il->Replace(id, img); il->Replace(id, img);
} }
cve->style().thumbnails_status[id] = THUMB_OK; s.thumbnails_status[id] = THUMB_OK;
} }
} }
...@@ -201,7 +203,7 @@ void DropDownChoiceListBase::generateThumbnailImages() { ...@@ -201,7 +203,7 @@ void DropDownChoiceListBase::generateThumbnailImages() {
ThumbnailStatus status = style().thumbnails_status[i]; ThumbnailStatus status = style().thumbnails_status[i];
if (i >= image_count || status != THUMB_OK) { if (i >= image_count || status != THUMB_OK) {
// request this thumbnail // request this thumbnail
thumbnail_thread.request( createThumbnailRequest(&cve, i, status == THUMB_NOT_MADE)); thumbnail_thread.request( new_intrusive3<ChoiceThumbnailRequest>(&cve, i, status == THUMB_NOT_MADE) );
} }
} }
} }
...@@ -270,10 +272,6 @@ DropDownList* DropDownChoiceList::createSubMenu(ChoiceField::ChoiceP group) cons ...@@ -270,10 +272,6 @@ DropDownList* DropDownChoiceList::createSubMenu(ChoiceField::ChoiceP group) cons
return new DropDownChoiceList(const_cast<DropDownChoiceList*>(this), true, cve, group); return new DropDownChoiceList(const_cast<DropDownChoiceList*>(this), true, cve, group);
} }
ThumbnailRequestP DropDownChoiceList::createThumbnailRequest(ValueViewer * e, int index, bool from_disk) const {
return new_intrusive3<ChoiceThumbnailRequest>(e, index, from_disk);
}
// ----------------------------------------------------------------------------- : ChoiceValueEditor // ----------------------------------------------------------------------------- : ChoiceValueEditor
IMPLEMENT_VALUE_EDITOR(Choice) IMPLEMENT_VALUE_EDITOR(Choice)
......
...@@ -60,7 +60,6 @@ class DropDownChoiceListBase : public DropDownList { ...@@ -60,7 +60,6 @@ class DropDownChoiceListBase : public DropDownList {
protected: protected:
virtual DropDownList* createSubMenu(ChoiceField::ChoiceP group) const = 0; virtual DropDownList* createSubMenu(ChoiceField::ChoiceP group) const = 0;
virtual ThumbnailRequestP createThumbnailRequest(ValueViewer * e, int index, bool from_disk) const = 0;
private: private:
DECLARE_EVENT_TABLE(); DECLARE_EVENT_TABLE();
...@@ -100,7 +99,6 @@ class DropDownChoiceList : public DropDownChoiceListBase { ...@@ -100,7 +99,6 @@ class DropDownChoiceList : public DropDownChoiceListBase {
virtual bool select(size_t item); virtual bool select(size_t item);
virtual size_t selection() const; virtual size_t selection() const;
virtual DropDownList* createSubMenu(ChoiceField::ChoiceP group) const; virtual DropDownList* createSubMenu(ChoiceField::ChoiceP group) const;
virtual ThumbnailRequestP createThumbnailRequest(ValueViewer * e, int index, bool from_disk) const;
}; };
// ----------------------------------------------------------------------------- : EOF // ----------------------------------------------------------------------------- : EOF
......
...@@ -10,87 +10,6 @@ ...@@ -10,87 +10,6 @@
#include <gui/thumbnail_thread.hpp> #include <gui/thumbnail_thread.hpp>
#include <gui/util.hpp> #include <gui/util.hpp>
#include <data/action/value.hpp> #include <data/action/value.hpp>
#include <data/stylesheet.hpp>
#include <wx/imaglist.h>
// ----------------------------------------------------------------------------- : ChoiceThumbnailRequest
class MultipleChoiceThumbnailRequest : public ThumbnailRequest {
public:
MultipleChoiceThumbnailRequest(ValueViewer* cve, int id, bool from_disk);
virtual Image generate();
virtual void store(const Image&);
bool isThreadSafe;
virtual bool threadSafe() const {return isThreadSafe;}
private:
StyleSheetP stylesheet;
int id;
};
MultipleChoiceThumbnailRequest::MultipleChoiceThumbnailRequest(ValueViewer* cve, int id, bool from_disk)
: ThumbnailRequest(
reinterpret_cast<void *> (cve),
cve->viewer.stylesheet->name() + _("/") + cve->getField()->name + _("/") << id,
from_disk ? cve->viewer.stylesheet->lastModified()
: wxDateTime::Now()
)
, stylesheet(cve->viewer.stylesheet)
, id(id)
{
MultipleChoiceValueEditor* e = dynamic_cast<MultipleChoiceValueEditor*> (cve);
if (!e)
throw InternalError(_("Non-editor passed to MultipleChoiceThumbnailRequest"));
String name = cannocial_name_form(e->field().choices->choiceName(id));
ScriptableImage img = e->style().choice_images[name];
isThreadSafe = img.threadSafe();
}
Image MultipleChoiceThumbnailRequest::generate() {
MultipleChoiceValueEditor* cve = reinterpret_cast<MultipleChoiceValueEditor*> (owner);
String name = cannocial_name_form(cve->field().choices->choiceName(id));
ScriptableImage& img = cve->style().choice_images[name];
return img.isReady()
? img.generate(GeneratedImage::Options(16,16, stylesheet.get(), &cve->getSet(), ASPECT_BORDER, true), false)
: wxImage();
}
void MultipleChoiceThumbnailRequest::store(const Image& img) {
MultipleChoiceValueEditor* cve = reinterpret_cast<MultipleChoiceValueEditor*> (owner);
wxImageList* il = cve->style().thumbnails;
while (id > il->GetImageCount()) {
il->Add(wxBitmap(16,16),*wxBLACK);
}
if (img.Ok()) {
#ifdef __WXMSW__
// for some reason windows doesn't like completely transparent images if they do not have a mask
// HACK:
if (img.HasAlpha() && img.GetWidth() == 16 && img.GetHeight() == 16) {
// is the image empty?
bool empty = true;
int* b = (int*)img.GetAlpha();
int* e = b + 16*16/sizeof(int);
while (b != e) {
if (*b++) {
empty = false;
break;
}
}
// if so, use a mask instead
if (empty) {
const_cast<Image&>(img).ConvertAlphaToMask();
}
}
// Hack ends here
#endif
if (id == il->GetImageCount()) {
il->Add(img);
} else {
il->Replace(id, img);
}
cve->style().thumbnails_status[id] = THUMB_OK;
}
}
// ----------------------------------------------------------------------------- : DropDownMultipleChoiceList // ----------------------------------------------------------------------------- : DropDownMultipleChoiceList
...@@ -104,7 +23,6 @@ class DropDownMultipleChoiceList : public DropDownChoiceListBase { ...@@ -104,7 +23,6 @@ class DropDownMultipleChoiceList : public DropDownChoiceListBase {
virtual bool select(size_t item); virtual bool select(size_t item);
virtual size_t selection() const; virtual size_t selection() const;
virtual DropDownList* createSubMenu(ChoiceField::ChoiceP group) const; virtual DropDownList* createSubMenu(ChoiceField::ChoiceP group) const;
virtual ThumbnailRequestP createThumbnailRequest(ValueViewer * e, int index, bool from_disk) const;
virtual void drawIcon(DC& dc, int x, int y, size_t item, bool selected) const; virtual void drawIcon(DC& dc, int x, int y, size_t item, bool selected) const;
virtual void onMotion(wxMouseEvent&); virtual void onMotion(wxMouseEvent&);
...@@ -174,10 +92,6 @@ DropDownList* DropDownMultipleChoiceList::createSubMenu(ChoiceField::ChoiceP gro ...@@ -174,10 +92,6 @@ DropDownList* DropDownMultipleChoiceList::createSubMenu(ChoiceField::ChoiceP gro
return new DropDownMultipleChoiceList(const_cast<DropDownMultipleChoiceList*>(this), true, cve, group); return new DropDownMultipleChoiceList(const_cast<DropDownMultipleChoiceList*>(this), true, cve, group);
} }
ThumbnailRequestP DropDownMultipleChoiceList::createThumbnailRequest(ValueViewer * e, int index, bool from_disk) const {
return new_intrusive3<MultipleChoiceThumbnailRequest>(e, index, from_disk);
}
void DropDownMultipleChoiceList::onMotion(wxMouseEvent& ev) { void DropDownMultipleChoiceList::onMotion(wxMouseEvent& ev) {
if (kept_open) { if (kept_open) {
wxSize cs = GetClientSize(); wxSize cs = GetClientSize();
......
...@@ -34,7 +34,6 @@ class MultipleChoiceValueEditor : public MultipleChoiceValueViewer, public Value ...@@ -34,7 +34,6 @@ class MultipleChoiceValueEditor : public MultipleChoiceValueViewer, public Value
DropDownListP drop_down; DropDownListP drop_down;
vector<int> active; ///< Which choices are active? (note: vector<bool> is evil) vector<int> active; ///< Which choices are active? (note: vector<bool> is evil)
friend class DropDownMultipleChoiceList; friend class DropDownMultipleChoiceList;
friend class MultipleChoiceThumbnailRequest;
/// Initialize the drop down list /// Initialize the drop down list
DropDownList& initDropDown(); DropDownList& initDropDown();
/// Toggle a choice or on or off /// Toggle a choice or on or off
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment