diff options
Diffstat (limited to 'bitbake/lib')
-rwxr-xr-x | bitbake/lib/bb/ui/crumbs/builddetailspage.py | 6 | ||||
-rw-r--r-- | bitbake/lib/bb/ui/crumbs/hobwidget.py | 499 | ||||
-rwxr-xr-x | bitbake/lib/bb/ui/crumbs/packageselectionpage.py | 3 | ||||
-rwxr-xr-x | bitbake/lib/bb/ui/crumbs/recipeselectionpage.py | 5 |
4 files changed, 119 insertions, 394 deletions
diff --git a/bitbake/lib/bb/ui/crumbs/builddetailspage.py b/bitbake/lib/bb/ui/crumbs/builddetailspage.py index 51e6a4a6d2..c2d5abc1d4 100755 --- a/bitbake/lib/bb/ui/crumbs/builddetailspage.py +++ b/bitbake/lib/bb/ui/crumbs/builddetailspage.py | |||
@@ -144,7 +144,7 @@ class BuildDetailsPage (HobPage): | |||
144 | self.scrolled_view_config = gtk.ScrolledWindow () | 144 | self.scrolled_view_config = gtk.ScrolledWindow () |
145 | self.scrolled_view_config.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS) | 145 | self.scrolled_view_config.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS) |
146 | self.scrolled_view_config.add(self.config_tv) | 146 | self.scrolled_view_config.add(self.config_tv) |
147 | self.notebook.append_page(self.scrolled_view_config, gtk.Label("Build configuration")) | 147 | self.notebook.append_page(self.scrolled_view_config, "Build configuration") |
148 | 148 | ||
149 | self.failure_tv = BuildFailureTreeView() | 149 | self.failure_tv = BuildFailureTreeView() |
150 | self.failure_model = self.builder.handler.build.model.failure_model() | 150 | self.failure_model = self.builder.handler.build.model.failure_model() |
@@ -152,14 +152,14 @@ class BuildDetailsPage (HobPage): | |||
152 | self.scrolled_view_failure = gtk.ScrolledWindow () | 152 | self.scrolled_view_failure = gtk.ScrolledWindow () |
153 | self.scrolled_view_failure.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS) | 153 | self.scrolled_view_failure.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS) |
154 | self.scrolled_view_failure.add(self.failure_tv) | 154 | self.scrolled_view_failure.add(self.failure_tv) |
155 | self.notebook.append_page(self.scrolled_view_failure, gtk.Label("Issues")) | 155 | self.notebook.append_page(self.scrolled_view_failure, "Issues") |
156 | 156 | ||
157 | self.build_tv = RunningBuildTreeView(readonly=True, hob=True) | 157 | self.build_tv = RunningBuildTreeView(readonly=True, hob=True) |
158 | self.build_tv.set_model(self.builder.handler.build.model) | 158 | self.build_tv.set_model(self.builder.handler.build.model) |
159 | self.scrolled_view_build = gtk.ScrolledWindow () | 159 | self.scrolled_view_build = gtk.ScrolledWindow () |
160 | self.scrolled_view_build.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS) | 160 | self.scrolled_view_build.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS) |
161 | self.scrolled_view_build.add(self.build_tv) | 161 | self.scrolled_view_build.add(self.build_tv) |
162 | self.notebook.append_page(self.scrolled_view_build, gtk.Label("Log")) | 162 | self.notebook.append_page(self.scrolled_view_build, "Log") |
163 | 163 | ||
164 | self.builder.handler.build.model.connect_after("row-changed", self.scroll_to_present_row, self.scrolled_view_build.get_vadjustment(), self.build_tv) | 164 | self.builder.handler.build.model.connect_after("row-changed", self.scroll_to_present_row, self.scrolled_view_build.get_vadjustment(), self.build_tv) |
165 | 165 | ||
diff --git a/bitbake/lib/bb/ui/crumbs/hobwidget.py b/bitbake/lib/bb/ui/crumbs/hobwidget.py index 39428270a8..0419d27db1 100644 --- a/bitbake/lib/bb/ui/crumbs/hobwidget.py +++ b/bitbake/lib/bb/ui/crumbs/hobwidget.py | |||
@@ -23,6 +23,7 @@ import os | |||
23 | import os.path | 23 | import os.path |
24 | import sys | 24 | import sys |
25 | import pango, pangocairo | 25 | import pango, pangocairo |
26 | import cairo | ||
26 | import math | 27 | import math |
27 | 28 | ||
28 | from bb.ui.crumbs.hobcolor import HobColors | 29 | from bb.ui.crumbs.hobcolor import HobColors |
@@ -396,363 +397,130 @@ class HobInfoButton(gtk.EventBox): | |||
396 | def mouse_out_cb(self, widget, event): | 397 | def mouse_out_cb(self, widget, event): |
397 | self.image.set_from_file(hic.ICON_INFO_DISPLAY_FILE) | 398 | self.image.set_from_file(hic.ICON_INFO_DISPLAY_FILE) |
398 | 399 | ||
399 | class HobTabBar(gtk.DrawingArea): | 400 | class HobIndicator(gtk.DrawingArea): |
400 | __gsignals__ = { | 401 | def __init__(self, count): |
401 | "blank-area-changed" : (gobject.SIGNAL_RUN_LAST, | ||
402 | gobject.TYPE_NONE, | ||
403 | (gobject.TYPE_INT, | ||
404 | gobject.TYPE_INT, | ||
405 | gobject.TYPE_INT, | ||
406 | gobject.TYPE_INT,)), | ||
407 | |||
408 | "tab-switched" : (gobject.SIGNAL_RUN_LAST, | ||
409 | gobject.TYPE_NONE, | ||
410 | (gobject.TYPE_INT,)), | ||
411 | } | ||
412 | |||
413 | def __init__(self): | ||
414 | gtk.DrawingArea.__init__(self) | 402 | gtk.DrawingArea.__init__(self) |
415 | self.children = [] | ||
416 | |||
417 | self.tab_width = 140 | ||
418 | self.tab_height = 52 | ||
419 | self.tab_x = 10 | ||
420 | self.tab_y = 0 | ||
421 | |||
422 | self.width = 500 | ||
423 | self.height = 53 | ||
424 | self.tab_w_ratio = 140 * 1.0/500 | ||
425 | self.tab_h_ratio = 52 * 1.0/53 | ||
426 | self.set_size_request(self.width, self.height) | ||
427 | |||
428 | self.current_child = None | ||
429 | self.font = self.get_style().font_desc | ||
430 | self.font.set_size(pango.SCALE * 13) | ||
431 | self.update_children_text_layout_and_bg_color() | ||
432 | |||
433 | self.blank_rectangle = None | ||
434 | self.tab_pressed = False | ||
435 | |||
436 | self.set_property('can-focus', True) | ||
437 | self.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.POINTER_MOTION_MASK | | ||
438 | gtk.gdk.BUTTON1_MOTION_MASK | gtk.gdk.BUTTON_PRESS_MASK | | ||
439 | gtk.gdk.BUTTON_RELEASE_MASK) | ||
440 | |||
441 | self.connect("expose-event", self.on_draw) | ||
442 | self.connect("button-press-event", self.button_pressed_cb) | ||
443 | self.connect("button-release-event", self.button_released_cb) | ||
444 | self.connect("query-tooltip", self.query_tooltip_cb) | ||
445 | self.show_all() | ||
446 | |||
447 | def button_released_cb(self, widget, event): | ||
448 | self.tab_pressed = False | ||
449 | self.queue_draw() | ||
450 | |||
451 | def button_pressed_cb(self, widget, event): | ||
452 | if event.type == gtk.gdk._2BUTTON_PRESS: | ||
453 | return | ||
454 | |||
455 | result = False | ||
456 | if self.is_focus() or event.type == gtk.gdk.BUTTON_PRESS: | ||
457 | x, y = event.get_coords() | ||
458 | # check which tab be clicked | ||
459 | for child in self.children: | ||
460 | if (child["x"] < x) and (x < child["x"] + self.tab_width) \ | ||
461 | and (child["y"] < y) and (y < child["y"] + self.tab_height): | ||
462 | self.current_child = child | ||
463 | result = True | ||
464 | self.grab_focus() | ||
465 | break | ||
466 | |||
467 | # check the blank area is focus in or not | ||
468 | if (self.blank_rectangle) and (self.blank_rectangle.x > 0) and (self.blank_rectangle.y > 0): | ||
469 | if (self.blank_rectangle.x < x) and (x < self.blank_rectangle.x + self.blank_rectangle.width) \ | ||
470 | and (self.blank_rectangle.y < y) and (y < self.blank_rectangle.y + self.blank_rectangle.height): | ||
471 | self.grab_focus() | ||
472 | |||
473 | if result == True: | ||
474 | page = self.current_child["toggled_page"] | ||
475 | self.emit("tab-switched", page) | ||
476 | self.tab_pressed = True | ||
477 | self.queue_draw() | ||
478 | |||
479 | def update_children_size(self): | ||
480 | # calculate the size of tabs | ||
481 | self.tab_width = int(self.width * self.tab_w_ratio) | ||
482 | self.tab_height = int(self.height * self.tab_h_ratio) | ||
483 | for i, child in enumerate(self.children): | ||
484 | child["x"] = self.tab_x + i * self.tab_width | ||
485 | child["y"] = self.tab_y | ||
486 | |||
487 | if self.blank_rectangle: | ||
488 | self.resize_blank_rectangle() | ||
489 | |||
490 | def resize_blank_rectangle(self): | ||
491 | width = self.width - self.tab_width * len(self.children) - self.tab_x | ||
492 | x = self.tab_x + self.tab_width * len(self.children) | ||
493 | hpadding = vpadding = 5 | ||
494 | self.blank_rectangle = self.set_blank_size(x + hpadding, self.tab_y + vpadding, | ||
495 | width - 2 * hpadding, self.tab_height - 2 * vpadding) | ||
496 | |||
497 | def update_children_text_layout_and_bg_color(self): | ||
498 | style = self.get_style().copy() | ||
499 | color = style.base[gtk.STATE_NORMAL] | ||
500 | for child in self.children: | ||
501 | pangolayout = self.create_pango_layout(child["title"]) | ||
502 | pangolayout.set_font_description(self.font) | ||
503 | child["title_layout"] = pangolayout | ||
504 | child["r"] = color.red | ||
505 | child["g"] = color.green | ||
506 | child["b"] = color.blue | ||
507 | |||
508 | def append_tab_child(self, title, page, tooltip=""): | ||
509 | num = len(self.children) + 1 | ||
510 | self.tab_width = self.tab_width * len(self.children) / num | ||
511 | |||
512 | i = 0 | ||
513 | for i, child in enumerate(self.children): | ||
514 | child["x"] = self.tab_x + i * self.tab_width | ||
515 | i += 1 | ||
516 | |||
517 | x = self.tab_x + i * self.tab_width | ||
518 | y = self.tab_y | ||
519 | pangolayout = self.create_pango_layout(title) | ||
520 | pangolayout.set_font_description(self.font) | ||
521 | color = self.style.base[gtk.STATE_NORMAL] | ||
522 | new_one = { | ||
523 | "x" : x, | ||
524 | "y" : y, | ||
525 | "r" : color.red, | ||
526 | "g" : color.green, | ||
527 | "b" : color.blue, | ||
528 | "title_layout" : pangolayout, | ||
529 | "toggled_page" : page, | ||
530 | "title" : title, | ||
531 | "indicator_show" : False, | ||
532 | "indicator_number" : 0, | ||
533 | "tooltip_markup" : tooltip, | ||
534 | } | ||
535 | self.children.append(new_one) | ||
536 | if tooltip and (not self.props.has_tooltip): | ||
537 | self.props.has_tooltip = True | ||
538 | # set the default current child | ||
539 | if not self.current_child: | ||
540 | self.current_child = new_one | ||
541 | |||
542 | def on_draw(self, widget, event): | ||
543 | cr = widget.window.cairo_create() | ||
544 | |||
545 | self.width = self.allocation.width | ||
546 | self.height = self.allocation.height | ||
547 | |||
548 | self.update_children_size() | ||
549 | |||
550 | self.draw_background(cr) | ||
551 | self.draw_toggled_tab(cr) | ||
552 | |||
553 | for child in self.children: | ||
554 | if child["indicator_show"] == True: | ||
555 | self.draw_indicator(cr, child) | ||
556 | |||
557 | self.draw_tab_text(cr) | ||
558 | |||
559 | def draw_background(self, cr): | ||
560 | style = self.get_style() | ||
561 | |||
562 | if self.is_focus(): | ||
563 | cr.set_source_color(style.base[gtk.STATE_SELECTED]) | ||
564 | else: | ||
565 | cr.set_source_color(style.base[gtk.STATE_NORMAL]) | ||
566 | |||
567 | y = 6 | ||
568 | h = self.height - 6 - 1 | ||
569 | gap = 1 | ||
570 | |||
571 | w = self.children[0]["x"] | ||
572 | cr.set_source_color(gtk.gdk.color_parse(HobColors.GRAY)) | ||
573 | cr.rectangle(0, y, w - gap, h) # start rectangle | ||
574 | cr.fill() | ||
575 | |||
576 | cr.set_source_color(style.base[gtk.STATE_NORMAL]) | ||
577 | cr.rectangle(w - gap, y, w, h) #first gap | ||
578 | cr.fill() | ||
579 | 403 | ||
580 | w = self.tab_width | 404 | # We want to composite the transparent indicator onto the parent |
581 | for child in self.children: | 405 | # HBox |
582 | x = child["x"] | 406 | screen = self.get_screen() |
583 | cr.set_source_color(gtk.gdk.color_parse(HobColors.GRAY)) | 407 | rgba = screen.get_rgba_colormap() |
584 | cr.rectangle(x, y, w - gap, h) # tab rectangle | 408 | self.set_colormap(rgba) |
585 | cr.fill() | 409 | self.set_app_paintable(True) |
586 | cr.set_source_color(style.base[gtk.STATE_NORMAL]) | 410 | self.set_size_request(38,38) |
587 | cr.rectangle(x + w - gap, y, w, h) # gap | 411 | # We need to pass through button clicks |
588 | cr.fill() | 412 | self.add_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK) |
589 | 413 | ||
590 | cr.set_source_color(gtk.gdk.color_parse(HobColors.GRAY)) | 414 | self.connect('expose-event', self.expose) |
591 | cr.rectangle(x + w, y, self.width - x - w, h) # last rectangle | 415 | self.connect_after('realize', self.composite) |
592 | cr.fill() | 416 | |
593 | 417 | self.count = count | |
594 | def draw_tab_text(self, cr): | 418 | self.color = HobColors.GRAY |
595 | style = self.get_style() | 419 | |
596 | 420 | def composite(self, widget): | |
597 | for child in self.children: | 421 | # This property must be set after the widget has been realised |
598 | pangolayout = child["title_layout"] | 422 | self.window.set_composited(True) |
599 | if pangolayout: | 423 | |
600 | fontw, fonth = pangolayout.get_pixel_size() | 424 | def expose(self, widget, event): |
601 | # center pos | 425 | # Transparent background |
602 | off_x = (self.tab_width - fontw) / 2 | 426 | ctx = widget.window.cairo_create() |
603 | off_y = (self.tab_height - fonth) / 2 | 427 | ctx.set_operator(cairo.OPERATOR_CLEAR) |
604 | x = child["x"] + off_x | 428 | region = gtk.gdk.region_rectangle(event.area) |
605 | y = child["y"] + off_y | 429 | |
606 | if not child == self.current_child: | 430 | ctx.region(region) |
607 | self.window.draw_layout(self.style.fg_gc[gtk.STATE_NORMAL], int(x), int(y), pangolayout, gtk.gdk.Color(HobColors.WHITE)) | 431 | ctx.fill() |
608 | else: | 432 | |
609 | self.window.draw_layout(self.style.fg_gc[gtk.STATE_NORMAL], int(x), int(y), pangolayout) | 433 | if self.count and self.count > 0: |
610 | 434 | w = self.allocation.width | |
611 | def draw_toggled_tab(self, cr): | 435 | h = self.allocation.height |
612 | if not self.current_child: | 436 | |
613 | return | 437 | ctx.set_operator(cairo.OPERATOR_OVER) |
614 | x = self.current_child["x"] | 438 | ctx.set_source_color(gtk.gdk.color_parse(self.color)) |
615 | y = self.current_child["y"] | 439 | ctx.translate(w/2, h/2) |
616 | width = self.tab_width | 440 | ctx.arc(1, 1, min(w,h)/2 - 2, 0, 2*math.pi) |
617 | height = self.tab_height | 441 | ctx.fill_preserve() |
618 | style = self.get_style() | 442 | |
619 | color = style.base[gtk.STATE_NORMAL] | 443 | layout = self.create_pango_layout(str(self.count)) |
620 | 444 | textw, texth = layout.get_pixel_size() | |
621 | r = height / 10 | 445 | x = (w/2)-(textw/2) + 1 |
622 | if self.tab_pressed == True: | 446 | y = (h/2) - (texth/2) + 1 |
623 | for xoff, yoff, c1, c2 in [(1, 0, HobColors.SLIGHT_DARK, HobColors.DARK), (2, 0, HobColors.GRAY, HobColors.LIGHT_GRAY)]: | 447 | ctx.move_to(x, y) |
624 | cr.set_source_color(gtk.gdk.color_parse(c1)) | 448 | self.window.draw_layout(self.style.fg_gc[gtk.STATE_NORMAL], int(x), int(y), layout) |
625 | cr.move_to(x + xoff, y + height + yoff) | 449 | |
626 | cr.line_to(x + xoff, r + yoff) | 450 | def set_count(self, count): |
627 | cr.arc(x + r + xoff, y + r + yoff, r, math.pi, 1.5*math.pi) | 451 | self.count = count |
628 | cr.move_to(x + r + xoff, y + yoff) | 452 | |
629 | cr.line_to(x + width - r + xoff, y + yoff) | 453 | def set_active(self, active): |
630 | cr.arc(x + width - r + xoff, y + r + yoff, r, 1.5*math.pi, 2*math.pi) | 454 | if active: |
631 | cr.stroke() | 455 | self.color = HobColors.DEEP_RED |
632 | cr.set_source_color(gtk.gdk.color_parse(c2)) | ||
633 | cr.move_to(x + width + xoff, r + yoff) | ||
634 | cr.line_to(x + width + xoff, y + height + yoff) | ||
635 | cr.line_to(x + xoff, y + height + yoff) | ||
636 | cr.stroke() | ||
637 | x = x + 2 | ||
638 | y = y + 2 | ||
639 | cr.set_source_rgba(color.red, color.green, color.blue, 1) | ||
640 | cr.move_to(x + r, y) | ||
641 | cr.line_to(x + width - r , y) | ||
642 | cr.arc(x + width - r, y + r, r, 1.5*math.pi, 2*math.pi) | ||
643 | cr.move_to(x + width, r) | ||
644 | cr.line_to(x + width, y + height) | ||
645 | cr.line_to(x, y + height) | ||
646 | cr.line_to(x, r) | ||
647 | cr.arc(x + r, y + r, r, math.pi, 1.5*math.pi) | ||
648 | cr.fill() | ||
649 | |||
650 | def draw_indicator(self, cr, child): | ||
651 | text = ("%d" % child["indicator_number"]) | ||
652 | layout = self.create_pango_layout(text) | ||
653 | layout.set_font_description(self.font) | ||
654 | textw, texth = layout.get_pixel_size() | ||
655 | # draw the back round area | ||
656 | tab_x = child["x"] | ||
657 | tab_y = child["y"] | ||
658 | dest_w = int(32 * self.tab_w_ratio) | ||
659 | dest_h = int(32 * self.tab_h_ratio) | ||
660 | if dest_h < self.tab_height: | ||
661 | dest_w = dest_h | ||
662 | # x position is offset(tab_width*3/4 - icon_width/2) + start_pos(tab_x) | ||
663 | x = tab_x + self.tab_width * 3/4 - dest_w/2 | ||
664 | y = tab_y + self.tab_height/2 - dest_h/2 | ||
665 | |||
666 | r = min(dest_w, dest_h)/2 | ||
667 | if not child == self.current_child: | ||
668 | color = cr.set_source_color(gtk.gdk.color_parse(HobColors.DEEP_RED)) | ||
669 | else: | ||
670 | color = cr.set_source_color(gtk.gdk.color_parse(HobColors.GRAY)) | ||
671 | # check round back area can contain the text or not | ||
672 | back_round_can_contain_width = float(2 * r * 0.707) | ||
673 | if float(textw) > back_round_can_contain_width: | ||
674 | xoff = (textw - int(back_round_can_contain_width)) / 2 | ||
675 | cr.move_to(x + r - xoff, y + r + r) | ||
676 | cr.arc((x + r - xoff), (y + r), r, 0.5*math.pi, 1.5*math.pi) | ||
677 | cr.fill() # left half round | ||
678 | cr.rectangle((x + r - xoff), y, 2 * xoff, 2 * r) | ||
679 | cr.fill() # center rectangle | ||
680 | cr.arc((x + r + xoff), (y + r), r, 1.5*math.pi, 0.5*math.pi) | ||
681 | cr.fill() # right half round | ||
682 | else: | 456 | else: |
683 | cr.arc((x + r), (y + r), r, 0, 2*math.pi) | 457 | self.color = HobColors.GRAY |
684 | cr.fill() | 458 | |
685 | # draw the number text | 459 | class HobTabLabel(gtk.HBox): |
686 | x = x + (dest_w/2)-(textw/2) | 460 | def __init__(self, text, count=0): |
687 | y = y + (dest_h/2) - (texth/2) | 461 | gtk.HBox.__init__(self, False, 0) |
688 | cr.move_to(x, y) | 462 | self.indicator = HobIndicator(count) |
689 | self.window.draw_layout(self.style.fg_gc[gtk.STATE_NORMAL], int(x), int(y), layout, gtk.gdk.Color(HobColors.WHITE)) | 463 | self.indicator.show() |
690 | 464 | self.pack_end(self.indicator, False, False) | |
691 | def show_indicator_icon(self, child, number): | 465 | self.lbl = gtk.Label(text) |
692 | child["indicator_show"] = True | 466 | self.lbl.set_alignment(0.0, 0.5) |
693 | child["indicator_number"] = number | 467 | self.lbl.show() |
694 | self.queue_draw() | 468 | self.pack_end(self.lbl, True, True, 6) |
695 | 469 | self.connect_after('expose-event', self.expose_event) | |
696 | def hide_indicator_icon(self, child): | 470 | |
697 | child["indicator_show"] = False | 471 | def expose_event(self, widget, event): |
698 | self.queue_draw() | 472 | # Composite the child indicator onto the Box |
699 | 473 | child = self.indicator | |
700 | def set_blank_size(self, x, y, w, h): | 474 | ctx = widget.window.cairo_create() |
701 | if not self.blank_rectangle or self.blank_rectangle.x != x or self.blank_rectangle.width != w: | 475 | |
702 | self.emit("blank-area-changed", x, y, w, h) | 476 | ctx.set_source_pixmap(child.window, child.allocation.x, child.allocation.y) |
703 | 477 | ||
704 | return gtk.gdk.Rectangle(x, y, w, h) | 478 | region = gtk.gdk.region_rectangle(child.allocation) |
705 | 479 | r = gtk.gdk.region_rectangle(event.area) | |
706 | def query_tooltip_cb(self, widget, x, y, keyboardtip, tooltip): | 480 | region.intersect(r) |
707 | if keyboardtip or (not tooltip): | 481 | ctx.region(region) |
708 | return False | 482 | ctx.clip() |
709 | # check which tab be clicked | 483 | |
710 | for child in self.children: | 484 | ctx.paint() |
711 | if (child["x"] < x) and (x < child["x"] + self.tab_width) \ | ||
712 | and (child["y"] < y) and (y < child["y"] + self.tab_height): | ||
713 | tooltip.set_markup(child["tooltip_markup"]) | ||
714 | return True | ||
715 | 485 | ||
716 | return False | 486 | return False |
717 | 487 | ||
718 | class HobNotebook(gtk.VBox): | 488 | def set_count(self, count): |
489 | self.indicator.set_count(count) | ||
719 | 490 | ||
720 | def __init__(self): | 491 | def set_active(self, active=True): |
721 | gtk.VBox.__init__(self, False, 0) | 492 | self.indicator.set_active(active) |
722 | 493 | ||
723 | self.notebook = gtk.Notebook() | 494 | class HobNotebook(gtk.Notebook): |
724 | self.notebook.set_property('homogeneous', True) | 495 | def __init__(self): |
725 | self.notebook.set_property('show-tabs', False) | 496 | gtk.Notebook.__init__(self) |
497 | self.set_property('homogeneous', True) | ||
726 | 498 | ||
727 | self.tabbar = HobTabBar() | 499 | self.pages = [] |
728 | self.tabbar.connect("tab-switched", self.tab_switched_cb) | ||
729 | self.notebook.connect("page-added", self.page_added_cb) | ||
730 | self.notebook.connect("page-removed", self.page_removed_cb) | ||
731 | 500 | ||
732 | self.search = None | 501 | self.search = None |
733 | self.search_name = "" | 502 | self.search_name = "" |
734 | 503 | ||
735 | self.tb = gtk.Table(1, 100, False) | 504 | self.connect("switch-page", self.page_changed_cb) |
736 | self.hbox= gtk.HBox(False, 0) | ||
737 | self.hbox.pack_start(self.tabbar, True, True) | ||
738 | self.tb.attach(self.hbox, 0, 100, 0, 1) | ||
739 | |||
740 | self.pack_start(self.tb, False, False) | ||
741 | self.pack_start(self.notebook) | ||
742 | 505 | ||
743 | self.show_all() | 506 | self.show_all() |
744 | 507 | ||
745 | def append_page(self, child, tab_label): | 508 | def page_changed_cb(self, nb, page, page_num): |
746 | self.notebook.set_current_page(self.notebook.append_page(child, tab_label)) | 509 | for p, lbl in enumerate(self.pages): |
747 | 510 | if p == page_num: | |
748 | def set_entry(self, name="Search:"): | 511 | lbl.set_active() |
749 | for child in self.tb.get_children(): | 512 | else: |
750 | if child: | 513 | lbl.set_active(False) |
751 | self.tb.remove(child) | ||
752 | 514 | ||
753 | hbox_entry = gtk.HBox(False, 0) | 515 | def append_page(self, child, tab_label, tab_tooltip=None): |
754 | hbox_entry.show() | 516 | label = HobTabLabel(tab_label) |
517 | if tab_tooltip: | ||
518 | label.set_tooltip_text(tab_tooltip) | ||
519 | label.set_active(False) | ||
520 | self.pages.append(label) | ||
521 | gtk.Notebook.append_page(self, child, label) | ||
755 | 522 | ||
523 | def set_entry(self, name="Search:"): | ||
756 | self.search = gtk.Entry() | 524 | self.search = gtk.Entry() |
757 | self.search_name = name | 525 | self.search_name = name |
758 | style = self.search.get_style() | 526 | style = self.search.get_style() |
@@ -763,59 +531,20 @@ class HobNotebook(gtk.VBox): | |||
763 | self.search.set_icon_from_stock(gtk.ENTRY_ICON_SECONDARY, gtk.STOCK_CLEAR) | 531 | self.search.set_icon_from_stock(gtk.ENTRY_ICON_SECONDARY, gtk.STOCK_CLEAR) |
764 | self.search.connect("icon-release", self.set_search_entry_clear_cb) | 532 | self.search.connect("icon-release", self.set_search_entry_clear_cb) |
765 | self.search.show() | 533 | self.search.show() |
766 | self.align = gtk.Alignment(xalign=1.0, yalign=0.7) | ||
767 | self.align.add(self.search) | ||
768 | self.align.show() | ||
769 | hbox_entry.pack_end(self.align, False, False) | ||
770 | self.tabbar.resize_blank_rectangle() | ||
771 | 534 | ||
772 | self.tb.attach(hbox_entry, 75, 100, 0, 1, xpadding=5) | ||
773 | self.tb.attach(self.hbox, 0, 100, 0, 1) | ||
774 | |||
775 | self.tabbar.connect("blank-area-changed", self.blank_area_resize_cb) | ||
776 | self.search.connect("focus-in-event", self.set_search_entry_editable_cb) | 535 | self.search.connect("focus-in-event", self.set_search_entry_editable_cb) |
777 | self.search.connect("focus-out-event", self.set_search_entry_reset_cb) | 536 | self.search.connect("focus-out-event", self.set_search_entry_reset_cb) |
778 | 537 | self.set_action_widget(self.search, gtk.PACK_END) | |
779 | self.tb.show() | ||
780 | 538 | ||
781 | def show_indicator_icon(self, title, number): | 539 | def show_indicator_icon(self, title, number): |
782 | for child in self.tabbar.children: | 540 | for child in self.pages: |
783 | if child["toggled_page"] == -1: | 541 | if child.lbl.get_label() == title: |
784 | continue | 542 | child.set_count(number) |
785 | if child["title"] == title: | ||
786 | self.tabbar.show_indicator_icon(child, number) | ||
787 | 543 | ||
788 | def hide_indicator_icon(self, title): | 544 | def hide_indicator_icon(self, title): |
789 | for child in self.tabbar.children: | 545 | for child in self.pages: |
790 | if child["toggled_page"] == -1: | 546 | if child.lbl.get_label() == title: |
791 | continue | 547 | child.set_count(0) |
792 | if child["title"] == title: | ||
793 | self.tabbar.hide_indicator_icon(child) | ||
794 | |||
795 | def tab_switched_cb(self, widget, page): | ||
796 | self.notebook.set_current_page(page) | ||
797 | |||
798 | def page_added_cb(self, notebook, notebook_child, page): | ||
799 | if not notebook: | ||
800 | return | ||
801 | title = notebook.get_tab_label_text(notebook_child) | ||
802 | label = notebook.get_tab_label(notebook_child) | ||
803 | tooltip_markup = label.get_tooltip_markup() | ||
804 | if not title: | ||
805 | return | ||
806 | for child in self.tabbar.children: | ||
807 | if child["title"] == title: | ||
808 | child["toggled_page"] = page | ||
809 | return | ||
810 | self.tabbar.append_tab_child(title, page, tooltip_markup) | ||
811 | |||
812 | def page_removed_cb(self, notebook, notebook_child, page, title=""): | ||
813 | for child in self.tabbar.children: | ||
814 | if child["title"] == title: | ||
815 | child["toggled_page"] = -1 | ||
816 | |||
817 | def blank_area_resize_cb(self, widget, request_x, request_y, request_width, request_height): | ||
818 | self.search.set_size_request(request_width, request_height) | ||
819 | 548 | ||
820 | def set_search_entry_editable_cb(self, search, event): | 549 | def set_search_entry_editable_cb(self, search, event): |
821 | search.set_editable(True) | 550 | search.set_editable(True) |
diff --git a/bitbake/lib/bb/ui/crumbs/packageselectionpage.py b/bitbake/lib/bb/ui/crumbs/packageselectionpage.py index 238e2f9771..de9bb73ea4 100755 --- a/bitbake/lib/bb/ui/crumbs/packageselectionpage.py +++ b/bitbake/lib/bb/ui/crumbs/packageselectionpage.py | |||
@@ -129,8 +129,7 @@ class PackageSelectionPage (HobPage): | |||
129 | if page['name'] == "Included": | 129 | if page['name'] == "Included": |
130 | tab.connect("button-release-event", self.button_click_cb) | 130 | tab.connect("button-release-event", self.button_click_cb) |
131 | tab.connect("cell-fadeinout-stopped", self.after_fadeout_checkin_include) | 131 | tab.connect("cell-fadeinout-stopped", self.after_fadeout_checkin_include) |
132 | label = gtk.Label(page['name']) | 132 | self.ins.append_page(tab, page['name']) |
133 | self.ins.append_page(tab, label) | ||
134 | self.tables.append(tab) | 133 | self.tables.append(tab) |
135 | 134 | ||
136 | self.ins.set_entry("Search packages:") | 135 | self.ins.set_entry("Search packages:") |
diff --git a/bitbake/lib/bb/ui/crumbs/recipeselectionpage.py b/bitbake/lib/bb/ui/crumbs/recipeselectionpage.py index 6bc9c168af..7336da91c5 100755 --- a/bitbake/lib/bb/ui/crumbs/recipeselectionpage.py +++ b/bitbake/lib/bb/ui/crumbs/recipeselectionpage.py | |||
@@ -153,10 +153,7 @@ class RecipeSelectionPage (HobPage): | |||
153 | if page['name'] == "Included": | 153 | if page['name'] == "Included": |
154 | tab.connect("button-release-event", self.button_click_cb) | 154 | tab.connect("button-release-event", self.button_click_cb) |
155 | tab.connect("cell-fadeinout-stopped", self.after_fadeout_checkin_include) | 155 | tab.connect("cell-fadeinout-stopped", self.after_fadeout_checkin_include) |
156 | label = gtk.Label(page['name']) | 156 | self.ins.append_page(tab, page['name'], page['tooltip']) |
157 | label.set_selectable(False) | ||
158 | label.set_tooltip_text(page['tooltip']) | ||
159 | self.ins.append_page(tab, label) | ||
160 | self.tables.append(tab) | 157 | self.tables.append(tab) |
161 | 158 | ||
162 | self.ins.set_entry("Search recipes:") | 159 | self.ins.set_entry("Search recipes:") |