diff options
| -rw-r--r-- | bitbake/lib/bb/ui/crumbs/hobcolor.py | 1 | ||||
| -rw-r--r-- | bitbake/lib/bb/ui/crumbs/hobwidget.py | 468 | ||||
| -rwxr-xr-x | bitbake/lib/bb/ui/crumbs/packageselectionpage.py | 17 | ||||
| -rwxr-xr-x | bitbake/lib/bb/ui/crumbs/recipeselectionpage.py | 19 |
4 files changed, 394 insertions, 111 deletions
diff --git a/bitbake/lib/bb/ui/crumbs/hobcolor.py b/bitbake/lib/bb/ui/crumbs/hobcolor.py index 9d67d5c496..402f022128 100644 --- a/bitbake/lib/bb/ui/crumbs/hobcolor.py +++ b/bitbake/lib/bb/ui/crumbs/hobcolor.py | |||
| @@ -28,6 +28,7 @@ class HobColors: | |||
| 28 | DARK = "#3c3b37" | 28 | DARK = "#3c3b37" |
| 29 | BLACK = "#000000" | 29 | BLACK = "#000000" |
| 30 | LIGHT_ORANGE = "#f7a787" | 30 | LIGHT_ORANGE = "#f7a787" |
| 31 | YELLOW = "#ffff00" | ||
| 31 | 32 | ||
| 32 | OK = WHITE | 33 | OK = WHITE |
| 33 | RUNNING = PALE_GREEN | 34 | RUNNING = PALE_GREEN |
diff --git a/bitbake/lib/bb/ui/crumbs/hobwidget.py b/bitbake/lib/bb/ui/crumbs/hobwidget.py index f4ff1dc881..8fa663c78a 100644 --- a/bitbake/lib/bb/ui/crumbs/hobwidget.py +++ b/bitbake/lib/bb/ui/crumbs/hobwidget.py | |||
| @@ -17,11 +17,14 @@ | |||
| 17 | # You should have received a copy of the GNU General Public License along | 17 | # You should have received a copy of the GNU General Public License along |
| 18 | # with this program; if not, write to the Free Software Foundation, Inc., | 18 | # with this program; if not, write to the Free Software Foundation, Inc., |
| 19 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | 19 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| 20 | |||
| 21 | import gtk | 20 | import gtk |
| 22 | import gobject | 21 | import gobject |
| 23 | import os | 22 | import os |
| 24 | import os.path | 23 | import os.path |
| 24 | import sys | ||
| 25 | import pango, pangocairo | ||
| 26 | import math | ||
| 27 | |||
| 25 | from bb.ui.crumbs.hobcolor import HobColors | 28 | from bb.ui.crumbs.hobcolor import HobColors |
| 26 | from bb.ui.crumbs.persistenttooltip import PersistentTooltip | 29 | from bb.ui.crumbs.persistenttooltip import PersistentTooltip |
| 27 | 30 | ||
| @@ -168,90 +171,6 @@ class HobViewTable (gtk.VBox): | |||
| 168 | if not view_column.get_title() in self.toggle_columns: | 171 | if not view_column.get_title() in self.toggle_columns: |
| 169 | self.emit("row-activated", tree.get_model(), path) | 172 | self.emit("row-activated", tree.get_model(), path) |
| 170 | 173 | ||
| 171 | class HobViewBar (gtk.EventBox): | ||
| 172 | """ | ||
| 173 | A EventBox with the specified gray background color is associated with a notebook. | ||
| 174 | And the toolbar to simulate the tabs. | ||
| 175 | """ | ||
| 176 | |||
| 177 | def __init__(self, notebook): | ||
| 178 | if not notebook: | ||
| 179 | return | ||
| 180 | self.notebook = notebook | ||
| 181 | |||
| 182 | # setup an event box | ||
| 183 | gtk.EventBox.__init__(self) | ||
| 184 | self.set_border_width(2) | ||
| 185 | style = self.get_style().copy() | ||
| 186 | style.bg[gtk.STATE_NORMAL] = self.get_colormap().alloc_color (HobColors.GRAY, False, False) | ||
| 187 | self.set_style(style) | ||
| 188 | |||
| 189 | hbox = gtk.HBox() | ||
| 190 | self.add(hbox) | ||
| 191 | |||
| 192 | # setup a tool bar in the event box | ||
| 193 | self.toolbar = gtk.Toolbar() | ||
| 194 | self.toolbar.set_orientation(gtk.ORIENTATION_HORIZONTAL) | ||
| 195 | self.toolbar.set_style(gtk.TOOLBAR_TEXT) | ||
| 196 | self.toolbar.set_border_width(5) | ||
| 197 | |||
| 198 | self.toolbuttons = [] | ||
| 199 | for index in range(self.notebook.get_n_pages()): | ||
| 200 | child = self.notebook.get_nth_page(index) | ||
| 201 | label = self.notebook.get_tab_label_text(child) | ||
| 202 | tip_text = 'switch to ' + label + ' page' | ||
| 203 | toolbutton = self.toolbar.append_element(gtk.TOOLBAR_CHILD_RADIOBUTTON, None, | ||
| 204 | label, tip_text, "Private text", None, | ||
| 205 | self.toolbutton_cb, index) | ||
| 206 | toolbutton.set_size_request(200, 100) | ||
| 207 | self.toolbuttons.append(toolbutton) | ||
| 208 | |||
| 209 | # set the default current page | ||
| 210 | self.modify_toolbuttons_bg(0) | ||
| 211 | self.notebook.set_current_page(0) | ||
| 212 | |||
| 213 | self.toolbar.append_space() | ||
| 214 | |||
| 215 | # add the tool bar into the event box | ||
| 216 | hbox.pack_start(self.toolbar, expand=False, fill=False) | ||
| 217 | |||
| 218 | self.search = gtk.Entry() | ||
| 219 | self.align = gtk.Alignment(xalign=0.5, yalign=0.5) | ||
| 220 | self.align.add(self.search) | ||
| 221 | hbox.pack_end(self.align, expand=False, fill=False) | ||
| 222 | |||
| 223 | self.label = gtk.Label(" Search: ") | ||
| 224 | self.label.set_alignment(0.5, 0.5) | ||
| 225 | hbox.pack_end(self.label, expand=False, fill=False) | ||
| 226 | |||
| 227 | def toolbutton_cb(self, widget, index): | ||
| 228 | if index >= self.notebook.get_n_pages(): | ||
| 229 | return | ||
| 230 | self.notebook.set_current_page(index) | ||
| 231 | self.modify_toolbuttons_bg(index) | ||
| 232 | |||
| 233 | def modify_toolbuttons_bg(self, index): | ||
| 234 | if index >= len(self.toolbuttons): | ||
| 235 | return | ||
| 236 | for i in range(0, len(self.toolbuttons)): | ||
| 237 | toolbutton = self.toolbuttons[i] | ||
| 238 | if i == index: | ||
| 239 | self.modify_toolbutton_bg(toolbutton, True) | ||
| 240 | else: | ||
| 241 | self.modify_toolbutton_bg(toolbutton) | ||
| 242 | |||
| 243 | def modify_toolbutton_bg(self, toolbutton, active=False): | ||
| 244 | if active: | ||
| 245 | toolbutton.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(HobColors.WHITE)) | ||
| 246 | toolbutton.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.Color(HobColors.WHITE)) | ||
| 247 | toolbutton.modify_bg(gtk.STATE_SELECTED, gtk.gdk.Color(HobColors.WHITE)) | ||
| 248 | toolbutton.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(HobColors.WHITE)) | ||
| 249 | else: | ||
| 250 | toolbutton.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(HobColors.GRAY)) | ||
| 251 | toolbutton.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.Color(HobColors.GRAY)) | ||
| 252 | toolbutton.modify_bg(gtk.STATE_SELECTED, gtk.gdk.Color(HobColors.GRAY)) | ||
| 253 | toolbutton.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(HobColors.GRAY)) | ||
| 254 | |||
| 255 | class HobXpmLabelButtonBox(gtk.EventBox): | 174 | class HobXpmLabelButtonBox(gtk.EventBox): |
| 256 | """ label: name of buttonbox | 175 | """ label: name of buttonbox |
| 257 | description: the simple description | 176 | description: the simple description |
| @@ -360,3 +279,382 @@ class HobInfoButton(gtk.EventBox): | |||
| 360 | """ | 279 | """ |
| 361 | def mouse_out_cb(self, widget, event): | 280 | def mouse_out_cb(self, widget, event): |
| 362 | self.image.set_from_file(hic.ICON_INFO_DISPLAY_FILE) | 281 | self.image.set_from_file(hic.ICON_INFO_DISPLAY_FILE) |
| 282 | |||
| 283 | class HobTabBar(gtk.DrawingArea): | ||
| 284 | __gsignals__ = { | ||
| 285 | "blank-area-changed" : (gobject.SIGNAL_RUN_LAST, | ||
| 286 | gobject.TYPE_NONE, | ||
| 287 | (gobject.TYPE_INT, | ||
| 288 | gobject.TYPE_INT, | ||
| 289 | gobject.TYPE_INT, | ||
| 290 | gobject.TYPE_INT,)), | ||
| 291 | |||
| 292 | "tab-switched" : (gobject.SIGNAL_RUN_LAST, | ||
| 293 | gobject.TYPE_NONE, | ||
| 294 | (gobject.TYPE_INT,)), | ||
| 295 | } | ||
| 296 | |||
| 297 | def __init__(self): | ||
| 298 | gtk.DrawingArea.__init__(self) | ||
| 299 | self.children = [] | ||
| 300 | |||
| 301 | self.tab_width = 140 | ||
| 302 | self.tab_height = 52 | ||
| 303 | self.tab_x = 10 | ||
| 304 | self.tab_y = 0 | ||
| 305 | |||
| 306 | self.width = 500 | ||
| 307 | self.height = 53 | ||
| 308 | self.tab_w_ratio = 140 * 1.0/500 | ||
| 309 | self.tab_h_ratio = 52 * 1.0/53 | ||
| 310 | self.set_size_request(self.width, self.height) | ||
| 311 | |||
| 312 | self.current_child = 0 | ||
| 313 | self.font = self.get_style().font_desc | ||
| 314 | self.font.set_size(pango.SCALE * 13) | ||
| 315 | self.update_children_text_layout_and_bg_color() | ||
| 316 | |||
| 317 | self.blank_rectangle = None | ||
| 318 | self.tab_pressed = False | ||
| 319 | |||
| 320 | self.set_property('can-focus', True) | ||
| 321 | self.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.POINTER_MOTION_MASK | | ||
| 322 | gtk.gdk.BUTTON1_MOTION_MASK | gtk.gdk.BUTTON_PRESS_MASK | | ||
| 323 | gtk.gdk.BUTTON_RELEASE_MASK) | ||
| 324 | |||
| 325 | self.connect("expose-event", self.on_draw) | ||
| 326 | self.connect("button-press-event", self.button_pressed_cb) | ||
| 327 | self.connect("button-release-event", self.button_released_cb) | ||
| 328 | self.show_all() | ||
| 329 | |||
| 330 | def button_released_cb(self, widget, event): | ||
| 331 | self.tab_pressed = False | ||
| 332 | self.queue_draw() | ||
| 333 | |||
| 334 | def button_pressed_cb(self, widget, event): | ||
| 335 | if event.type == gtk.gdk._2BUTTON_PRESS: | ||
| 336 | return | ||
| 337 | |||
| 338 | result = False | ||
| 339 | if self.is_focus() or event.type == gtk.gdk.BUTTON_PRESS: | ||
| 340 | x, y = event.get_coords() | ||
| 341 | # check which tab be clicked | ||
| 342 | for i, child in enumerate(self.children): | ||
| 343 | if (child["x"] < x) and (x < child["x"] + self.tab_width) \ | ||
| 344 | and (child["y"] < y) and (y < child["y"] + self.tab_height): | ||
| 345 | self.current_child = i | ||
| 346 | result = True | ||
| 347 | break | ||
| 348 | |||
| 349 | # check the blank area is focus in or not | ||
| 350 | if (self.blank_rectangle) and (self.blank_rectangle.x > 0) and (self.blank_rectangle.y > 0): | ||
| 351 | if (self.blank_rectangle.x < x) and (x < self.blank_rectangle.x + self.blank_rectangle.width) \ | ||
| 352 | and (self.blank_rectangle.y < y) and (y < self.blank_rectangle.y + self.blank_rectangle.height): | ||
| 353 | self.grab_focus() | ||
| 354 | |||
| 355 | if result == True: | ||
| 356 | page = self.children[self.current_child]["toggled_page"] | ||
| 357 | self.emit("tab-switched", page) | ||
| 358 | self.tab_pressed = True | ||
| 359 | self.queue_draw() | ||
| 360 | |||
| 361 | def update_children_size(self): | ||
| 362 | # calculate the size of tabs | ||
| 363 | self.tab_width = int(self.width * self.tab_w_ratio) | ||
| 364 | self.tab_height = int(self.height * self.tab_h_ratio) | ||
| 365 | for i, child in enumerate(self.children): | ||
| 366 | child["x"] = self.tab_x + i * self.tab_width | ||
| 367 | child["y"] = self.tab_y | ||
| 368 | |||
| 369 | if self.blank_rectangle != None: | ||
| 370 | self.resize_blank_rectangle() | ||
| 371 | |||
| 372 | def resize_blank_rectangle(self): | ||
| 373 | width = self.width - self.tab_width * len(self.children) - self.tab_x | ||
| 374 | x = self.tab_x + self.tab_width * len(self.children) | ||
| 375 | hpadding = vpadding = 5 | ||
| 376 | self.blank_rectangle = self.set_blank_size(x + hpadding, self.tab_y + vpadding, | ||
| 377 | width - 2 * hpadding, self.tab_height - 2 * vpadding) | ||
| 378 | |||
| 379 | def update_children_text_layout_and_bg_color(self): | ||
| 380 | style = self.get_style().copy() | ||
| 381 | color = style.base[gtk.STATE_NORMAL] | ||
| 382 | for child in self.children: | ||
| 383 | pangolayout = self.create_pango_layout(child["title"]) | ||
| 384 | pangolayout.set_font_description(self.font) | ||
| 385 | child["title_layout"] = pangolayout | ||
| 386 | child[i]["r"] = color.red | ||
| 387 | child[i]["g"] = color.green | ||
| 388 | child[i]["b"] = color.blue | ||
| 389 | |||
| 390 | def append_tab_child(self, title, page): | ||
| 391 | num = len(self.children) + 1 | ||
| 392 | self.tab_width = self.tab_width * len(self.children) / num | ||
| 393 | |||
| 394 | i = 0 | ||
| 395 | for child in self.children: | ||
| 396 | child["x"] = self.tab_x + i * self.tab_width | ||
| 397 | i += 1 | ||
| 398 | |||
| 399 | x = self.tab_x + i * self.tab_width | ||
| 400 | y = self.tab_y | ||
| 401 | pangolayout = self.create_pango_layout(title) | ||
| 402 | pangolayout.set_font_description(self.font) | ||
| 403 | color = self.style.base[gtk.STATE_NORMAL] | ||
| 404 | new_one = { | ||
| 405 | "x" : x, | ||
| 406 | "y" : y, | ||
| 407 | "r" : color.red, | ||
| 408 | "g" : color.green, | ||
| 409 | "b" : color.blue, | ||
| 410 | "title_layout" : pangolayout, | ||
| 411 | "toggled_page" : page, | ||
| 412 | "title" : title, | ||
| 413 | "indicator_show" : False, | ||
| 414 | "indicator_number" : 0, | ||
| 415 | } | ||
| 416 | self.children.append(new_one) | ||
| 417 | |||
| 418 | def on_draw(self, widget, event): | ||
| 419 | cr = widget.window.cairo_create() | ||
| 420 | |||
| 421 | self.width = self.allocation.width | ||
| 422 | self.height = self.allocation.height | ||
| 423 | |||
| 424 | self.update_children_size() | ||
| 425 | |||
| 426 | self.draw_background(cr) | ||
| 427 | self.draw_toggled_tab(cr) | ||
| 428 | self.draw_tab_text(cr) | ||
| 429 | |||
| 430 | for i, child in enumerate(self.children): | ||
| 431 | if child["indicator_show"] == True: | ||
| 432 | self.draw_indicator(cr, i) | ||
| 433 | |||
| 434 | def draw_background(self, cr): | ||
| 435 | style = self.get_style() | ||
| 436 | |||
| 437 | if self.is_focus(): | ||
| 438 | cr.set_source_color(style.base[gtk.STATE_SELECTED]) | ||
| 439 | else: | ||
| 440 | cr.set_source_color(style.base[gtk.STATE_NORMAL]) | ||
| 441 | |||
| 442 | y = 6 | ||
| 443 | h = self.height - 6 - 1 | ||
| 444 | gap = 1 | ||
| 445 | |||
| 446 | w = self.children[0]["x"] | ||
| 447 | cr.set_source_color(gtk.gdk.color_parse(HobColors.GRAY)) | ||
| 448 | cr.rectangle(0, y, w - gap, h) # start rectangle | ||
| 449 | cr.fill() | ||
| 450 | |||
| 451 | cr.set_source_color(style.base[gtk.STATE_NORMAL]) | ||
| 452 | cr.rectangle(w - gap, y, w, h) #first gap | ||
| 453 | cr.fill() | ||
| 454 | |||
| 455 | w = self.tab_width | ||
| 456 | for child in self.children: | ||
| 457 | x = child["x"] | ||
| 458 | cr.set_source_color(gtk.gdk.color_parse(HobColors.GRAY)) | ||
| 459 | cr.rectangle(x, y, w - gap, h) # tab rectangle | ||
| 460 | cr.fill() | ||
| 461 | cr.set_source_color(style.base[gtk.STATE_NORMAL]) | ||
| 462 | cr.rectangle(x + w - gap, y, w, h) # gap | ||
| 463 | cr.fill() | ||
| 464 | |||
| 465 | cr.set_source_color(gtk.gdk.color_parse(HobColors.GRAY)) | ||
| 466 | cr.rectangle(x + w, y, self.width - x - w, h) # last rectangle | ||
| 467 | cr.fill() | ||
| 468 | |||
| 469 | def draw_tab_text(self, cr): | ||
| 470 | style = self.get_style() | ||
| 471 | |||
| 472 | for child in self.children: | ||
| 473 | pangolayout = child["title_layout"] | ||
| 474 | if pangolayout: | ||
| 475 | fontw, fonth = pangolayout.get_pixel_size() | ||
| 476 | # center pos | ||
| 477 | off_x = (self.tab_width - fontw) / 2 | ||
| 478 | off_y = (self.tab_height - fonth) / 2 | ||
| 479 | x = child[i]["x"] + off_x | ||
| 480 | y = child[i]["y"] + off_y | ||
| 481 | self.window.draw_layout(self.style.fg_gc[gtk.STATE_NORMAL], int(x), int(y), pangolayout) | ||
| 482 | |||
| 483 | def draw_toggled_tab(self, cr): | ||
| 484 | i = self.current_child | ||
| 485 | x = self.children[i]["x"] | ||
| 486 | y = self.children[i]["y"] | ||
| 487 | width = self.tab_width | ||
| 488 | height = self.tab_height | ||
| 489 | style = self.get_style() | ||
| 490 | color = style.base[gtk.STATE_NORMAL] | ||
| 491 | |||
| 492 | r = height / 10 | ||
| 493 | if self.tab_pressed == True: | ||
| 494 | for xoff, yoff in [(1, 0), (2, 0)]: | ||
| 495 | cr.set_source_color(gtk.gdk.color_parse(HobColors.PALE_GREEN)) | ||
| 496 | cr.move_to(x + r + xoff, y + yoff) | ||
| 497 | cr.line_to(x + width - r + xoff, y + yoff) | ||
| 498 | cr.arc(x + width - r+ xoff, y + r + yoff, r, 1.5*math.pi, 2*math.pi) | ||
| 499 | cr.move_to(x + width + xoff, r + yoff) | ||
| 500 | cr.line_to(x + width + xoff, y + height + yoff) | ||
| 501 | cr.line_to(x + xoff, y + height + yoff) | ||
| 502 | cr.line_to(x + xoff, r + yoff) | ||
| 503 | cr.arc(x + r + xoff, y + r + yoff, r, math.pi, 1.5*math.pi) | ||
| 504 | cr.stroke() | ||
| 505 | x = x + 2 | ||
| 506 | y = y + 2 | ||
| 507 | cr.set_source_rgba(color.red, color.green, color.blue, 1) | ||
| 508 | cr.move_to(x + r, y) | ||
| 509 | cr.line_to(x + width - r , y) | ||
| 510 | cr.arc(x + width - r, y + r, r, 1.5*math.pi, 2*math.pi) | ||
| 511 | cr.move_to(x + width, r) | ||
| 512 | cr.line_to(x + width, y + height) | ||
| 513 | cr.line_to(x, y + height) | ||
| 514 | cr.line_to(x, r) | ||
| 515 | cr.arc(x + r, y + r, r, math.pi, 1.5*math.pi) | ||
| 516 | cr.fill() | ||
| 517 | |||
| 518 | def draw_indicator(self, cr, i): | ||
| 519 | style = self.get_style() | ||
| 520 | tab_x = self.children[i]["x"] | ||
| 521 | tab_y = self.children[i]["y"] | ||
| 522 | number = self.children[i]["indicator_number"] | ||
| 523 | dest_w = int(32 * self.tab_w_ratio) | ||
| 524 | dest_h = int(32 * self.tab_h_ratio) | ||
| 525 | if dest_h < self.tab_height: | ||
| 526 | dest_w = dest_h | ||
| 527 | |||
| 528 | # x position is offset(tab_width*3/4 - icon_width/2) + start_pos(tab_x) | ||
| 529 | x = tab_x + self.tab_width * 3/4 - dest_w/2 | ||
| 530 | y = tab_y + self.tab_height/2 - dest_h/2 | ||
| 531 | cr.move_to(tab_x, tab_y) | ||
| 532 | r = min(dest_w, dest_h)/2 | ||
| 533 | color = cr.set_source_color(gtk.gdk.color_parse(HobColors.ORANGE)) | ||
| 534 | cr.arc(x + r, y + r, r, 0, 2*math.pi) | ||
| 535 | cr.fill() | ||
| 536 | |||
| 537 | text = ("%d" % number) | ||
| 538 | layout = self.create_pango_layout(text) | ||
| 539 | layout.set_font_description(self.font) | ||
| 540 | textw, texth = layout.get_pixel_size() | ||
| 541 | x = x + (dest_w/2)-(textw/2) | ||
| 542 | y = y + (dest_h/2) - (texth/2) | ||
| 543 | cr.move_to(x, y) | ||
| 544 | self.window.draw_layout(self.style.fg_gc[gtk.STATE_NORMAL], int(x), int(y), layout) | ||
| 545 | |||
| 546 | def show_indicator_icon(self, i, number): | ||
| 547 | self.children[i]["indicator_show"] = True | ||
| 548 | self.children[i]["indicator_number"] = number | ||
| 549 | self.queue_draw() | ||
| 550 | |||
| 551 | def hide_indicator_icon(self, i): | ||
| 552 | self.children[i]["indicator_show"] = False | ||
| 553 | self.queue_draw() | ||
| 554 | |||
| 555 | def set_blank_size(self, x, y, w, h): | ||
| 556 | if self.blank_rectangle == None or self.blank_rectangle.x != x or self.blank_rectangle.width != w: | ||
| 557 | self.emit("blank-area-changed", x, y, w, h) | ||
| 558 | |||
| 559 | return gtk.gdk.Rectangle(x, y, w, h) | ||
| 560 | |||
| 561 | class HobNotebook(gtk.VBox): | ||
| 562 | |||
| 563 | def __init__(self): | ||
| 564 | gtk.VBox.__init__(self, False, 0) | ||
| 565 | |||
| 566 | self.notebook = gtk.Notebook() | ||
| 567 | self.notebook.set_property('homogeneous', True) | ||
| 568 | self.notebook.set_property('show-tabs', False) | ||
| 569 | |||
| 570 | self.tabbar = HobTabBar() | ||
| 571 | self.tabbar.connect("tab-switched", self.tab_switched_cb) | ||
| 572 | self.notebook.connect("page-added", self.page_added_cb) | ||
| 573 | self.notebook.connect("page-removed", self.page_removed_cb) | ||
| 574 | |||
| 575 | self.search = None | ||
| 576 | self.search_name = "" | ||
| 577 | |||
| 578 | self.tb = gtk.Table(1, 100, False) | ||
| 579 | self.hbox= gtk.HBox(False, 0) | ||
| 580 | self.hbox.pack_start(self.tabbar, True, True) | ||
| 581 | self.tb.attach(self.hbox, 0, 100, 0, 1) | ||
| 582 | |||
| 583 | self.pack_start(self.tb, False, False) | ||
| 584 | self.pack_start(self.notebook) | ||
| 585 | |||
| 586 | self.show_all() | ||
| 587 | |||
| 588 | def append_page(self, child, tab_label): | ||
| 589 | self.notebook.set_current_page(self.notebook.append_page(child, tab_label)) | ||
| 590 | |||
| 591 | def set_entry(self, name="Search:"): | ||
| 592 | for child in self.tb.get_children(): | ||
| 593 | if child: | ||
| 594 | self.tb.remove(child) | ||
| 595 | |||
| 596 | hbox_entry = gtk.HBox(False, 0) | ||
| 597 | hbox_entry.show() | ||
| 598 | |||
| 599 | self.search = gtk.Entry() | ||
| 600 | self.search_name = name | ||
| 601 | style = self.search.get_style() | ||
| 602 | style.text[gtk.STATE_NORMAL] = self.get_colormap().alloc_color(HobColors.GRAY, False, False) | ||
| 603 | self.search.set_style(style) | ||
| 604 | self.search.set_text(name) | ||
| 605 | self.search.set_editable(False) | ||
| 606 | self.search.show() | ||
| 607 | self.align = gtk.Alignment(xalign=1.0, yalign=0.7) | ||
| 608 | self.align.add(self.search) | ||
| 609 | self.align.show() | ||
| 610 | hbox_entry.pack_end(self.align, False, False) | ||
| 611 | self.tabbar.resize_blank_rectangle() | ||
| 612 | |||
| 613 | self.tb.attach(hbox_entry, 75, 100, 0, 1, xpadding=5) | ||
| 614 | self.tb.attach(self.hbox, 0, 100, 0, 1) | ||
| 615 | |||
| 616 | self.tabbar.connect("blank-area-changed", self.blank_area_resize_cb) | ||
| 617 | self.search.connect("focus-in-event", self.set_search_entry_editable_cb) | ||
| 618 | self.search.connect("focus-out-event", self.set_search_entry_reset_cb) | ||
| 619 | |||
| 620 | self.tb.show() | ||
| 621 | |||
| 622 | def tab_switched_cb(self, widget, page): | ||
| 623 | self.notebook.set_current_page(page) | ||
| 624 | |||
| 625 | def page_added_cb(self, notebook, notebook_child, page): | ||
| 626 | if not notebook: | ||
| 627 | return | ||
| 628 | title = notebook.get_tab_label_text(notebook_child) | ||
| 629 | if title == None: | ||
| 630 | return | ||
| 631 | for child in self.tabbar.children: | ||
| 632 | if child["title"] == title: | ||
| 633 | child["toggled_page"] = page | ||
| 634 | return | ||
| 635 | self.tabbar.append_tab_child(title, page) | ||
| 636 | |||
| 637 | def page_removed_cb(self, notebook, notebook_child, page, title=""): | ||
| 638 | for child in self.tabbar.children: | ||
| 639 | if child["title"] == title: | ||
| 640 | child["toggled_page"] = -1 | ||
| 641 | |||
| 642 | def blank_area_resize_cb(self, widget, request_x, request_y, request_width, request_height): | ||
| 643 | self.search.set_size_request(request_width, request_height) | ||
| 644 | widget.modify_bg(gtk.STATE_SELECTED, gtk.gdk.color_parse(HobColors.YELLOW)) | ||
| 645 | |||
| 646 | def set_search_entry_editable_cb(self, widget, event): | ||
| 647 | if self.search: | ||
| 648 | self.search.set_editable(True) | ||
| 649 | self.search.set_text("") | ||
| 650 | style = self.search.get_style() | ||
| 651 | style.text[gtk.STATE_NORMAL] = self.get_colormap().alloc_color(HobColors.BLACK, False, False) | ||
| 652 | self.search.set_style(style) | ||
| 653 | |||
| 654 | def set_search_entry_reset_cb(self, widget, event): | ||
| 655 | if self.search: | ||
| 656 | style = self.search.get_style() | ||
| 657 | style.text[gtk.STATE_NORMAL] = self.get_colormap().alloc_color(HobColors.GRAY, False, False) | ||
| 658 | self.search.set_style(style) | ||
| 659 | self.search.set_text(self.search_name) | ||
| 660 | self.search.set_editable(False) | ||
diff --git a/bitbake/lib/bb/ui/crumbs/packageselectionpage.py b/bitbake/lib/bb/ui/crumbs/packageselectionpage.py index 1c335ac733..3cd1c5e725 100755 --- a/bitbake/lib/bb/ui/crumbs/packageselectionpage.py +++ b/bitbake/lib/bb/ui/crumbs/packageselectionpage.py | |||
| @@ -23,7 +23,7 @@ | |||
| 23 | import gtk | 23 | import gtk |
| 24 | import glib | 24 | import glib |
| 25 | from bb.ui.crumbs.hobcolor import HobColors | 25 | from bb.ui.crumbs.hobcolor import HobColors |
| 26 | from bb.ui.crumbs.hobwidget import HobViewBar, HobViewTable | 26 | from bb.ui.crumbs.hobwidget import HobViewTable, HobNotebook |
| 27 | from bb.ui.crumbs.hoblistmodel import PackageListModel | 27 | from bb.ui.crumbs.hoblistmodel import PackageListModel |
| 28 | from bb.ui.crumbs.hobpages import HobPage | 28 | from bb.ui.crumbs.hobpages import HobPage |
| 29 | 29 | ||
| @@ -102,11 +102,7 @@ class PackageSelectionPage (HobPage): | |||
| 102 | self.pack_start(self.group_align, expand=True, fill=True) | 102 | self.pack_start(self.group_align, expand=True, fill=True) |
| 103 | 103 | ||
| 104 | # set visiable members | 104 | # set visiable members |
| 105 | self.grid = gtk.Table(10, 1, True) | 105 | self.ins = HobNotebook() |
| 106 | self.grid.set_col_spacings(3) | ||
| 107 | |||
| 108 | self.ins = gtk.Notebook() | ||
| 109 | self.ins.set_show_tabs(False) | ||
| 110 | self.tables = [] # we need to modify table when the dialog is shown | 106 | self.tables = [] # we need to modify table when the dialog is shown |
| 111 | # append the tab | 107 | # append the tab |
| 112 | for i in range(len(self.pages)): | 108 | for i in range(len(self.pages)): |
| @@ -122,16 +118,13 @@ class PackageSelectionPage (HobPage): | |||
| 122 | self.ins.append_page(tab, label) | 118 | self.ins.append_page(tab, label) |
| 123 | self.tables.append(tab) | 119 | self.tables.append(tab) |
| 124 | 120 | ||
| 125 | self.grid.attach(self.ins, 0, 1, 1, 10, gtk.FILL | gtk.EXPAND, gtk.FILL | gtk.EXPAND, 1, 1) | 121 | self.ins.set_entry("Search packages:") |
| 126 | # a black bar associated with the notebook | ||
| 127 | self.topbar = HobViewBar(self.ins) | ||
| 128 | self.grid.attach(self.topbar, 0, 1, 0, 1, gtk.FILL | gtk.EXPAND, gtk.FILL | gtk.EXPAND, 1, 1) | ||
| 129 | # set the search entry for each table | 122 | # set the search entry for each table |
| 130 | for tab in self.tables: | 123 | for tab in self.tables: |
| 131 | tab.set_search_entry(0, self.topbar.search) | 124 | tab.set_search_entry(0, self.ins.search) |
| 132 | 125 | ||
| 133 | # add all into the dialog | 126 | # add all into the dialog |
| 134 | self.box_group_area.add(self.grid) | 127 | self.box_group_area.pack_start(self.ins, expand=True, fill=True) |
| 135 | 128 | ||
| 136 | button_box = gtk.HBox(False, 6) | 129 | button_box = gtk.HBox(False, 6) |
| 137 | self.box_group_area.pack_start(button_box, expand=False, fill=False) | 130 | self.box_group_area.pack_start(button_box, expand=False, fill=False) |
diff --git a/bitbake/lib/bb/ui/crumbs/recipeselectionpage.py b/bitbake/lib/bb/ui/crumbs/recipeselectionpage.py index d615ef1897..db873b611a 100755 --- a/bitbake/lib/bb/ui/crumbs/recipeselectionpage.py +++ b/bitbake/lib/bb/ui/crumbs/recipeselectionpage.py | |||
| @@ -23,7 +23,7 @@ | |||
| 23 | import gtk | 23 | import gtk |
| 24 | import glib | 24 | import glib |
| 25 | from bb.ui.crumbs.hobcolor import HobColors | 25 | from bb.ui.crumbs.hobcolor import HobColors |
| 26 | from bb.ui.crumbs.hobwidget import HobViewBar, HobViewTable | 26 | from bb.ui.crumbs.hobwidget import HobViewTable, HobNotebook |
| 27 | from bb.ui.crumbs.hoblistmodel import RecipeListModel | 27 | from bb.ui.crumbs.hoblistmodel import RecipeListModel |
| 28 | from bb.ui.crumbs.hobpages import HobPage | 28 | from bb.ui.crumbs.hobpages import HobPage |
| 29 | 29 | ||
| @@ -124,13 +124,7 @@ class RecipeSelectionPage (HobPage): | |||
| 124 | self.pack_start(self.group_align, expand=True, fill=True) | 124 | self.pack_start(self.group_align, expand=True, fill=True) |
| 125 | 125 | ||
| 126 | # set visiable members | 126 | # set visiable members |
| 127 | self.grid = gtk.Table(10, 1, True) | 127 | self.ins = HobNotebook() |
| 128 | self.grid.set_col_spacings(3) | ||
| 129 | |||
| 130 | # draw the left part of the window | ||
| 131 | # a notebook | ||
| 132 | self.ins = gtk.Notebook() | ||
| 133 | self.ins.set_show_tabs(False) | ||
| 134 | self.tables = [] # we need modify table when the dialog is shown | 128 | self.tables = [] # we need modify table when the dialog is shown |
| 135 | # append the tabs in order | 129 | # append the tabs in order |
| 136 | for i in range(len(self.pages)): | 130 | for i in range(len(self.pages)): |
| @@ -146,16 +140,13 @@ class RecipeSelectionPage (HobPage): | |||
| 146 | self.ins.append_page(tab, label) | 140 | self.ins.append_page(tab, label) |
| 147 | self.tables.append(tab) | 141 | self.tables.append(tab) |
| 148 | 142 | ||
| 149 | self.grid.attach(self.ins, 0, 1, 1, 10, gtk.FILL | gtk.EXPAND, gtk.FILL | gtk.EXPAND) | 143 | self.ins.set_entry("Search recipes:") |
| 150 | # a black bar associated with the notebook | ||
| 151 | self.topbar = HobViewBar(self.ins) | ||
| 152 | self.grid.attach(self.topbar, 0, 1, 0, 1, gtk.FILL | gtk.EXPAND, gtk.FILL | gtk.EXPAND) | ||
| 153 | # set the search entry for each table | 144 | # set the search entry for each table |
| 154 | for tab in self.tables: | 145 | for tab in self.tables: |
| 155 | tab.set_search_entry(0, self.topbar.search) | 146 | tab.set_search_entry(0, self.ins.search) |
| 156 | 147 | ||
| 157 | # add all into the window | 148 | # add all into the window |
| 158 | self.box_group_area.add(self.grid) | 149 | self.box_group_area.pack_start(self.ins, expand=True, fill=True) |
| 159 | 150 | ||
| 160 | button_box = gtk.HBox(False, 6) | 151 | button_box = gtk.HBox(False, 6) |
| 161 | self.box_group_area.pack_end(button_box, expand=False, fill=False) | 152 | self.box_group_area.pack_end(button_box, expand=False, fill=False) |
