mirror of https://github.com/bsnes-emu/bsnes.git
123 lines
3.4 KiB
C++
123 lines
3.4 KiB
C++
namespace phoenix {
|
|
|
|
static void TabFrame_change(GtkNotebook* notebook, GtkWidget* page, unsigned selection, TabFrame* self) {
|
|
self->state.selection = selection;
|
|
self->p.synchronizeLayout();
|
|
if(!self->p.locked && self->onChange) self->onChange();
|
|
}
|
|
|
|
void pTabFrame::append(string text, const image& image) {
|
|
unsigned selection = tabFrame.state.text.size() - 1;
|
|
|
|
Tab tab;
|
|
tab.child = gtk_fixed_new();
|
|
tab.container = gtk_hbox_new(false, 0);
|
|
tab.image = gtk_image_new();
|
|
tab.title = gtk_label_new(text);
|
|
tabs.append(tab);
|
|
|
|
gtk_widget_show(tab.child);
|
|
gtk_widget_show(tab.container);
|
|
gtk_widget_show(tab.image);
|
|
gtk_widget_show(tab.title);
|
|
gtk_box_pack_start(GTK_BOX(tab.container), tab.image, false, false, 0);
|
|
gtk_box_pack_start(GTK_BOX(tab.container), tab.title, false, false, 2);
|
|
|
|
gtk_notebook_append_page(GTK_NOTEBOOK(gtkWidget), tab.child, tab.container);
|
|
setFont(widget.state.font);
|
|
if(!image.empty()) setImage(selection, image);
|
|
}
|
|
|
|
GtkWidget* pTabFrame::container(Widget& widget) {
|
|
Layout* widgetLayout = GetParentWidgetLayout(&widget);
|
|
unsigned selection = 0;
|
|
for(auto& layout : tabFrame.state.layout) {
|
|
if(layout == widgetLayout) return tabs[selection].child;
|
|
selection++;
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
Position pTabFrame::displacement() {
|
|
return {6, 31};
|
|
}
|
|
|
|
void pTabFrame::remove(unsigned selection) {
|
|
tabs.remove(selection);
|
|
gtk_notebook_remove_page(GTK_NOTEBOOK(gtkWidget), selection);
|
|
}
|
|
|
|
void pTabFrame::setEnabled(bool enabled) {
|
|
for(auto& layout : tabFrame.state.layout) {
|
|
if(layout) layout->setEnabled(layout->enabled());
|
|
}
|
|
pWidget::setEnabled(enabled);
|
|
}
|
|
|
|
void pTabFrame::setGeometry(Geometry geometry) {
|
|
pWidget::setGeometry(geometry);
|
|
geometry.x += 1, geometry.width -= 5;
|
|
geometry.y += 26, geometry.height -= 31;
|
|
for(auto& layout : tabFrame.state.layout) {
|
|
if(layout) layout->setGeometry(geometry);
|
|
}
|
|
synchronizeLayout();
|
|
}
|
|
|
|
void pTabFrame::setImage(unsigned selection, const image& image) {
|
|
nall::image copy = image;
|
|
unsigned size = pFont::size(widget.state.font, " ").height;
|
|
copy.scale(size, size);
|
|
GdkPixbuf* pixbuf = CreatePixbuf(copy);
|
|
gtk_image_set_from_pixbuf(GTK_IMAGE(tabs[selection].image), pixbuf);
|
|
}
|
|
|
|
void pTabFrame::setSelection(unsigned selection) {
|
|
locked = true;
|
|
gtk_notebook_set_current_page(GTK_NOTEBOOK(gtkWidget), selection);
|
|
locked = false;
|
|
}
|
|
|
|
void pTabFrame::setText(unsigned selection, string text) {
|
|
gtk_label_set_text(GTK_LABEL(tabs[selection].title), text);
|
|
}
|
|
|
|
void pTabFrame::setVisible(bool visible) {
|
|
for(auto& layout : tabFrame.state.layout) {
|
|
if(layout) layout->setVisible(layout->visible());
|
|
}
|
|
pWidget::setVisible(visible);
|
|
}
|
|
|
|
void pTabFrame::constructor() {
|
|
gtkWidget = gtk_notebook_new();
|
|
gtk_notebook_set_show_border(GTK_NOTEBOOK(gtkWidget), false);
|
|
gtk_notebook_set_tab_pos(GTK_NOTEBOOK(gtkWidget), GTK_POS_TOP);
|
|
g_signal_connect(G_OBJECT(gtkWidget), "switch-page", G_CALLBACK(TabFrame_change), (gpointer)&tabFrame);
|
|
|
|
setSelection(tabFrame.state.selection);
|
|
}
|
|
|
|
void pTabFrame::destructor() {
|
|
gtk_widget_destroy(gtkWidget);
|
|
}
|
|
|
|
void pTabFrame::orphan() {
|
|
destructor();
|
|
constructor();
|
|
}
|
|
|
|
void pTabFrame::setFont(string font) {
|
|
for(auto& tab : tabs) pFont::setFont(tab.title, font);
|
|
}
|
|
|
|
void pTabFrame::synchronizeLayout() {
|
|
unsigned selection = 0;
|
|
for(auto& layout : tabFrame.state.layout) {
|
|
if(layout) layout->setVisible(selection == tabFrame.state.selection);
|
|
selection++;
|
|
}
|
|
}
|
|
|
|
}
|