X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=libs%2Fuilib%2Fuilib.cpp;h=e4fb3d321351e25f3c429ed19c6e19c427f4eed9;hb=ae556acad3c7afe9fe35ba94deb6e1d88c146ad4;hp=824af8cef43a7530754664e9739df4c70739fb92;hpb=f7ec4500c417377b467509679011d64a047f17d7;p=xonotic%2Fnetradiant.git diff --git a/libs/uilib/uilib.cpp b/libs/uilib/uilib.cpp index 824af8ce..e4fb3d32 100644 --- a/libs/uilib/uilib.cpp +++ b/libs/uilib/uilib.cpp @@ -11,10 +11,17 @@ namespace ui { - void init(int argc, char *argv[]) + bool init(int *argc, char **argv[], char const *parameter_string, char const **error) { gtk_disable_setlocale(); - gtk_init(&argc, &argv); + static GOptionEntry entries[] = {{}}; + char const *translation_domain = NULL; + GError *gerror = NULL; + bool ret = gtk_init_with_args(argc, argv, parameter_string, entries, translation_domain, &gerror) != 0; + if (!ret) { + *error = gerror->message; + } + return ret; } void main() @@ -29,7 +36,7 @@ namespace ui { } } - Widget root; + Widget root{ui::null}; #define IMPL(T, F) template<> _IMPL(T, F) #define _IMPL(T, F) struct verify { using self = T; static self test(self it) { return self(F(it)); } } @@ -39,50 +46,53 @@ namespace ui { template _IMPL(T,); -#define this (verify::test(*static_cast(this))) + template + using pointer_remove_const = std::add_pointer< + typename std::remove_const< + typename std::remove_pointer::type + >::type + >; + +#define this (verify::test(*static_cast(const_cast::type>(this)))) IMPL(Editable, GTK_EDITABLE); void IEditable::editable(bool value) { - gtk_editable_set_editable(GTK_EDITABLE(this), value); + gtk_editable_set_editable(this, value); } + IMPL(TreeModel, GTK_TREE_MODEL); + IMPL(Widget, GTK_WIDGET); - Widget::Widget() : Widget(nullptr) + Widget::Widget(ui::New_t) : Widget(nullptr) {} - alert_response IWidget::alert(std::string text, std::string title, alert_type type, alert_icon icon) + Window IWidget::window() { - auto ret = gtk_MessageBox(this, text.c_str(), - title.c_str(), - type == alert_type::OK ? eMB_OK : - type == alert_type::OKCANCEL ? eMB_OKCANCEL : - type == alert_type::YESNO ? eMB_YESNO : - type == alert_type::YESNOCANCEL ? eMB_YESNOCANCEL : - type == alert_type::NOYES ? eMB_NOYES : - eMB_OK, - icon == alert_icon::Default ? eMB_ICONDEFAULT : - icon == alert_icon::Error ? eMB_ICONERROR : - icon == alert_icon::Warning ? eMB_ICONWARNING : - icon == alert_icon::Question ? eMB_ICONQUESTION : - icon == alert_icon::Asterisk ? eMB_ICONASTERISK : - eMB_ICONDEFAULT - ); - return - ret == eIDOK ? alert_response::OK : - ret == eIDCANCEL ? alert_response::CANCEL : - ret == eIDYES ? alert_response::YES : - ret == eIDNO ? alert_response::NO : - alert_response::OK; + return Window::from(gtk_widget_get_toplevel(this)); } const char * IWidget::file_dialog(bool open, const char *title, const char *path, const char *pattern, bool want_load, bool want_import, bool want_save) { - return ::file_dialog(this, open, title, path, pattern, want_load, want_import, want_save); + return ::file_dialog(this.window(), open, title, path, pattern, want_load, want_import, want_save); + } + + bool IWidget::visible() + { + return gtk_widget_get_visible(this) != 0; + } + + void IWidget::visible(bool shown) + { + if (shown) { + this.show(); + } else { + this.hide(); + } } void IWidget::show() @@ -90,6 +100,28 @@ namespace ui { gtk_widget_show(this); } + void IWidget::hide() + { + gtk_widget_hide(this); + } + + Dimensions IWidget::dimensions() + { + GtkAllocation allocation; + gtk_widget_get_allocation(this, &allocation); + return Dimensions{allocation.width, allocation.height}; + } + + void IWidget::dimensions(int width, int height) + { + gtk_widget_set_size_request(this, width, height); + } + + void IWidget::destroy() + { + gtk_widget_destroy(this); + } + IMPL(Container, GTK_CONTAINER); void IContainer::add(Widget widget) @@ -113,6 +145,31 @@ namespace ui { ))) {} + alert_response IWindow::alert(std::string text, std::string title, alert_type type, alert_icon icon) + { + auto ret = gtk_MessageBox(this, text.c_str(), + title.c_str(), + type == alert_type::OK ? eMB_OK : + type == alert_type::OKCANCEL ? eMB_OKCANCEL : + type == alert_type::YESNO ? eMB_YESNO : + type == alert_type::YESNOCANCEL ? eMB_YESNOCANCEL : + type == alert_type::NOYES ? eMB_NOYES : + eMB_OK, + icon == alert_icon::Default ? eMB_ICONDEFAULT : + icon == alert_icon::Error ? eMB_ICONERROR : + icon == alert_icon::Warning ? eMB_ICONWARNING : + icon == alert_icon::Question ? eMB_ICONQUESTION : + icon == alert_icon::Asterisk ? eMB_ICONASTERISK : + eMB_ICONDEFAULT + ); + return + ret == eIDOK ? alert_response::OK : + ret == eIDCANCEL ? alert_response::CANCEL : + ret == eIDYES ? alert_response::YES : + ret == eIDNO ? alert_response::NO : + alert_response::OK; + } + Window IWindow::create_dialog_window(const char *title, void func(), void *data, int default_w, int default_h) { return Window(::create_dialog_window(this, title, func, data, default_w, default_h)); @@ -163,7 +220,7 @@ namespace ui { IMPL(Button, GTK_BUTTON); - Button::Button() : Button(GTK_BUTTON(gtk_button_new())) + Button::Button(ui::New_t) : Button(GTK_BUTTON(gtk_button_new())) {} Button::Button(const char *label) : Button(GTK_BUTTON(gtk_button_new_with_label(label))) @@ -171,19 +228,27 @@ namespace ui { IMPL(ToggleButton, GTK_TOGGLE_BUTTON); - bool IToggleButton::active() + bool IToggleButton::active() const { - return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(this)) != 0; + return gtk_toggle_button_get_active(this) != 0; + } + + void IToggleButton::active(bool value) + { + gtk_toggle_button_set_active(this, value); } IMPL(CheckButton, GTK_CHECK_BUTTON); + CheckButton::CheckButton(ui::New_t) : CheckButton(GTK_CHECK_BUTTON(gtk_check_button_new())) + {} + CheckButton::CheckButton(const char *label) : CheckButton(GTK_CHECK_BUTTON(gtk_check_button_new_with_label(label))) {} IMPL(MenuItem, GTK_MENU_ITEM); - MenuItem::MenuItem() : MenuItem(GTK_MENU_ITEM(gtk_menu_item_new())) + MenuItem::MenuItem(ui::New_t) : MenuItem(GTK_MENU_ITEM(gtk_menu_item_new())) {} MenuItem::MenuItem(const char *label, bool mnemonic) : MenuItem( @@ -192,19 +257,36 @@ namespace ui { IMPL(TearoffMenuItem, GTK_TEAROFF_MENU_ITEM); - TearoffMenuItem::TearoffMenuItem() : TearoffMenuItem(GTK_TEAROFF_MENU_ITEM(gtk_tearoff_menu_item_new())) + TearoffMenuItem::TearoffMenuItem(ui::New_t) : TearoffMenuItem(GTK_TEAROFF_MENU_ITEM(gtk_tearoff_menu_item_new())) {} IMPL(ComboBoxText, GTK_COMBO_BOX_TEXT); - ComboBoxText::ComboBoxText() : ComboBoxText(GTK_COMBO_BOX_TEXT(gtk_combo_box_text_new())) + ComboBoxText::ComboBoxText(ui::New_t) : ComboBoxText(GTK_COMBO_BOX_TEXT(gtk_combo_box_text_new())) {} IMPL(ScrolledWindow, GTK_SCROLLED_WINDOW); - ScrolledWindow::ScrolledWindow() : ScrolledWindow(GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(nullptr, nullptr))) + ScrolledWindow::ScrolledWindow(ui::New_t) : ScrolledWindow(GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(nullptr, nullptr))) {} + void IScrolledWindow::overflow(Policy x, Policy y) + { + gtk_scrolled_window_set_policy(this, static_cast(x), static_cast(y)); + } + + IMPL(Box, GTK_BOX); + + void IBox::pack_start(ui::Widget child, bool expand, bool fill, unsigned int padding) + { + gtk_box_pack_start(this, child, expand, fill, padding); + } + + void IBox::pack_end(ui::Widget child, bool expand, bool fill, unsigned int padding) + { + gtk_box_pack_end(this, child, expand, fill, padding); + } + IMPL(VBox, GTK_VBOX); VBox::VBox(bool homogenous, int spacing) : VBox(GTK_VBOX(gtk_vbox_new(homogenous, spacing))) @@ -217,17 +299,17 @@ namespace ui { IMPL(HPaned, GTK_HPANED); - HPaned::HPaned() : HPaned(GTK_HPANED(gtk_hpaned_new())) + HPaned::HPaned(ui::New_t) : HPaned(GTK_HPANED(gtk_hpaned_new())) {} IMPL(VPaned, GTK_VPANED); - VPaned::VPaned() : VPaned(GTK_VPANED(gtk_vpaned_new())) + VPaned::VPaned(ui::New_t) : VPaned(GTK_VPANED(gtk_vpaned_new())) {} IMPL(Menu, GTK_MENU); - Menu::Menu() : Menu(GTK_MENU(gtk_menu_new())) + Menu::Menu(ui::New_t) : Menu(GTK_MENU(gtk_menu_new())) {} IMPL(Table, GTK_TABLE); @@ -237,12 +319,26 @@ namespace ui { ) {} + void ITable::attach(Widget child, TableAttach attach, TableAttachOptions options, TablePadding padding) { + gtk_table_attach(this, child, + attach.left, attach.right, attach.top, attach.bottom, + static_cast(options.x), static_cast(options.y), + padding.x, padding.y + ); + } + IMPL(TextView, GTK_TEXT_VIEW); - TextView::TextView() : TextView(GTK_TEXT_VIEW(gtk_text_view_new())) + TextView::TextView(ui::New_t) : TextView(GTK_TEXT_VIEW(gtk_text_view_new())) {} - TreeView::TreeView() : TreeView(GTK_TREE_VIEW(gtk_tree_view_new())) + void ITextView::text(char const *str) + { + GtkTextBuffer *buffer = gtk_text_view_get_buffer(this); + gtk_text_buffer_set_text(buffer, str, -1); + } + + TreeView::TreeView(ui::New_t) : TreeView(GTK_TREE_VIEW(gtk_tree_view_new())) {} TreeView::TreeView(TreeModel model) : TreeView(GTK_TREE_VIEW(gtk_tree_view_new_with_model(model))) @@ -253,21 +349,36 @@ namespace ui { Label::Label(const char *label) : Label(GTK_LABEL(gtk_label_new(label))) {} + void ILabel::text(char const *str) + { + gtk_label_set_text(this, str); + } + IMPL(Image, GTK_IMAGE); - Image::Image() : Image(GTK_IMAGE(gtk_image_new())) + Image::Image(ui::New_t) : Image(GTK_IMAGE(gtk_image_new())) {} IMPL(Entry, GTK_ENTRY); - Entry::Entry() : Entry(GTK_ENTRY(gtk_entry_new())) + Entry::Entry(ui::New_t) : Entry(GTK_ENTRY(gtk_entry_new())) {} - Entry::Entry(std::size_t max_length) : Entry() + Entry::Entry(std::size_t max_length) : Entry(ui::New) { gtk_entry_set_max_length(this, static_cast(max_length)); } + char const *IEntry::text() + { + return gtk_entry_get_text(this); + } + + void IEntry::text(char const *str) + { + return gtk_entry_set_text(this, str); + } + IMPL(SpinButton, GTK_SPIN_BUTTON); SpinButton::SpinButton(Adjustment adjustment, double climb_rate, std::size_t digits) : SpinButton( @@ -294,7 +405,7 @@ namespace ui { IMPL(CellRendererText, GTK_CELL_RENDERER_TEXT); - CellRendererText::CellRendererText() : CellRendererText(GTK_CELL_RENDERER_TEXT(gtk_cell_renderer_text_new())) + CellRendererText::CellRendererText(ui::New_t) : CellRendererText(GTK_CELL_RENDERER_TEXT(gtk_cell_renderer_text_new())) {} IMPL(TreeViewColumn, GTK_TREE_VIEW_COLUMN); @@ -306,11 +417,11 @@ namespace ui { for (auto &it : attributes) { gtk_tree_view_column_add_attribute(this, renderer, it.attribute, it.column); } - }; + } IMPL(AccelGroup, GTK_ACCEL_GROUP); - AccelGroup::AccelGroup() : AccelGroup(GTK_ACCEL_GROUP(gtk_accel_group_new())) + AccelGroup::AccelGroup(ui::New_t) : AccelGroup(GTK_ACCEL_GROUP(gtk_accel_group_new())) {} IMPL(ListStore, GTK_LIST_STORE); @@ -320,9 +431,16 @@ namespace ui { gtk_list_store_clear(this); } + void IListStore::append() + { + gtk_list_store_append(this, nullptr); + } + + IMPL(TreeStore, GTK_TREE_STORE); + // IMPL(TreePath, GTK_TREE_PATH); - TreePath::TreePath() : TreePath(gtk_tree_path_new()) + TreePath::TreePath(ui::New_t) : TreePath(gtk_tree_path_new()) {} TreePath::TreePath(const char *path) : TreePath(gtk_tree_path_new_from_string(path)) @@ -338,6 +456,6 @@ namespace ui { #if GTK_TARGET == 2 return this.connect("expose_event", pFunction, data); #endif - }; + } }