mirror of https://github.com/bsnes-emu/bsnes.git
162 lines
4.8 KiB
C++
Executable File
162 lines
4.8 KiB
C++
Executable File
#if defined(Hiro_Widget)
|
|
|
|
namespace hiro {
|
|
|
|
static auto Widget_drop(GtkWidget* widget, GdkDragContext* context, int x, int y,
|
|
GtkSelectionData* data, uint type, uint timestamp, pWidget* p) -> void {
|
|
if(!p->state().droppable) return;
|
|
auto paths = DropPaths(data);
|
|
if(!paths) return;
|
|
p->self().doDrop(paths);
|
|
}
|
|
|
|
static auto Widget_mouseEnter(GtkWidget* widget, GdkEventButton* event, pWidget* p) -> int {
|
|
if(auto cursor = p->gdkMouseCursor) {
|
|
if(auto window = gtk_widget_get_parent_window(widget)) {
|
|
gdk_window_set_cursor(window, cursor);
|
|
}
|
|
}
|
|
p->self().doMouseEnter();
|
|
return true;
|
|
}
|
|
|
|
static auto Widget_mouseLeave(GtkWidget* widget, GdkEventButton* event, pWidget* p) -> int {
|
|
if(auto cursor = p->gdkMouseCursor) {
|
|
if(auto window = gtk_widget_get_parent_window(widget)) {
|
|
gdk_window_set_cursor(window, nullptr);
|
|
}
|
|
}
|
|
p->self().doMouseLeave();
|
|
return true;
|
|
}
|
|
|
|
static auto Widget_mouseMove(GtkWidget* widget, GdkEventButton* event, pWidget* p) -> signed {
|
|
p->self().doMouseMove({(signed)event->x, (signed)event->y});
|
|
return true;
|
|
}
|
|
|
|
static auto Widget_mousePress(GtkWidget* widget, GdkEventButton* event, pWidget* p) -> signed {
|
|
switch(event->button) {
|
|
case 1: p->self().doMousePress(Mouse::Button::Left); break;
|
|
case 2: p->self().doMousePress(Mouse::Button::Middle); break;
|
|
case 3: p->self().doMousePress(Mouse::Button::Right); break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
static auto Widget_mouseRelease(GtkWidget* widget, GdkEventButton* event, pWidget* p) -> signed {
|
|
switch(event->button) {
|
|
case 1: p->self().doMouseRelease(Mouse::Button::Left); break;
|
|
case 2: p->self().doMouseRelease(Mouse::Button::Middle); break;
|
|
case 3: p->self().doMouseRelease(Mouse::Button::Right); break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
auto pWidget::construct() -> void {
|
|
if(!gtkWidget) return;
|
|
if(auto window = self().parentWindow(true)) {
|
|
if(window->self()) window->self()->_append(self());
|
|
setDroppable(self().droppable());
|
|
setEnabled(self().enabled(true));
|
|
setFocusable(self().focusable());
|
|
setFont(self().font(true));
|
|
setMouseCursor(self().mouseCursor());
|
|
setToolTip(self().toolTip());
|
|
setVisible(self().visible(true));
|
|
}
|
|
}
|
|
|
|
auto pWidget::destruct() -> void {
|
|
}
|
|
|
|
auto pWidget::container(mWidget& widget) -> GtkWidget* {
|
|
return nullptr;
|
|
}
|
|
|
|
auto pWidget::focused() const -> bool {
|
|
if(!gtkWidget) return false;
|
|
return gtk_widget_has_focus(gtkWidget);
|
|
}
|
|
|
|
auto pWidget::setDroppable(bool droppable) -> void {
|
|
if(!gtkWidget) return;
|
|
if(droppable) {
|
|
gtk_drag_dest_set(gtkWidget, GTK_DEST_DEFAULT_ALL, nullptr, 0, GDK_ACTION_COPY);
|
|
gtk_drag_dest_add_uri_targets(gtkWidget);
|
|
}
|
|
}
|
|
|
|
auto pWidget::setEnabled(bool enabled) -> void {
|
|
if(!gtkWidget) return;
|
|
gtk_widget_set_sensitive(gtkWidget, enabled);
|
|
}
|
|
|
|
auto pWidget::setFocusable(bool focusable) -> void {
|
|
//virtual overload: only configurable for Canvas and Viewport
|
|
}
|
|
|
|
auto pWidget::setFocused() -> void {
|
|
if(!gtkWidget) return;
|
|
gtk_widget_grab_focus(gtkWidget);
|
|
}
|
|
|
|
auto pWidget::setFont(const Font& font) -> void {
|
|
if(!gtkWidget) return;
|
|
return pFont::setFont(gtkWidget, font);
|
|
}
|
|
|
|
auto pWidget::setGeometry(Geometry geometry) -> void {
|
|
if(!gtkWidget) return;
|
|
if(gtkParent) gtk_fixed_move(GTK_FIXED(gtkParent), gtkWidget, geometry.x(), geometry.y());
|
|
if(geometry.width() < 1) geometry.setWidth (1);
|
|
if(geometry.height() < 1) geometry.setHeight(1);
|
|
gtk_widget_set_size_request(gtkWidget, geometry.width(), geometry.height());
|
|
if(0 && gtk_widget_get_realized(gtkWidget)) {
|
|
static bool locked = false;
|
|
if(!locked) {
|
|
locked = true;
|
|
auto time = chrono::millisecond();
|
|
while(chrono::millisecond() - time < 20) {
|
|
GtkAllocation allocation;
|
|
gtk_widget_get_allocation(gtkWidget, &allocation);
|
|
if(allocation.width == geometry.width() && allocation.height == geometry.height()) break;
|
|
gtk_main_iteration_do(false);
|
|
}
|
|
locked = false;
|
|
}
|
|
}
|
|
pSizable::setGeometry(geometry);
|
|
}
|
|
|
|
auto pWidget::setMouseCursor(const MouseCursor& mouseCursor) -> void {
|
|
//TODO: this should be freed, yet this code seems to break the cursor assignment completely ...
|
|
//if(gdkMouseCursor) {
|
|
// gdk_cursor_unref(gdkMouseCursor);
|
|
// gdkMouseCursor = nullptr;
|
|
//}
|
|
|
|
if(mouseCursor) {
|
|
string name;
|
|
if(mouseCursor == MouseCursor::Hand) name = "hand1";
|
|
if(mouseCursor == MouseCursor::HorizontalResize) name = "sb_h_double_arrow";
|
|
if(mouseCursor == MouseCursor::VerticalResize) name = "sb_v_double_arrow";
|
|
if(name) {
|
|
gdkMouseCursor = gdk_cursor_new_from_name(gdk_display_get_default(), name);
|
|
}
|
|
}
|
|
}
|
|
|
|
auto pWidget::setToolTip(const string& toolTip) -> void {
|
|
gtk_widget_set_tooltip_text(gtkWidget, toolTip);
|
|
}
|
|
|
|
auto pWidget::setVisible(bool visible) -> void {
|
|
if(!gtkWidget) return;
|
|
gtk_widget_set_visible(gtkWidget, visible);
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|